New covers. 2.4
authorRadek Czajka <rczajka@rczajka.pl>
Fri, 6 May 2022 11:51:02 +0000 (13:51 +0200)
committerRadek Czajka <rczajka@rczajka.pl>
Fri, 6 May 2022 11:59:06 +0000 (13:59 +0200)
25 files changed:
CHANGELOG.md
setup.py
src/librarian/cover.py
src/librarian/covers/__init__.py [new file with mode: 0644]
src/librarian/covers/marquise.py [new file with mode: 0644]
src/librarian/covers/utils/__init__.py [new file with mode: 0644]
src/librarian/covers/utils/color.py [new file with mode: 0644]
src/librarian/covers/utils/textbox.py [new file with mode: 0644]
src/librarian/covers/widgets/__init__.py [new file with mode: 0644]
src/librarian/covers/widgets/author.py [new file with mode: 0644]
src/librarian/covers/widgets/background.py [new file with mode: 0644]
src/librarian/covers/widgets/base.py [new file with mode: 0644]
src/librarian/covers/widgets/image.py [new file with mode: 0644]
src/librarian/covers/widgets/marquise.py [new file with mode: 0644]
src/librarian/covers/widgets/title.py [new file with mode: 0644]
src/librarian/fonts/SourceSans3VF-Roman.ttf [new file with mode: 0644]
src/librarian/res/cover/label_WLpolecaja.png [new file with mode: 0644]
src/librarian/res/cover/label_WLpolecaja.svg [new file with mode: 0644]
src/librarian/res/cover/label_WLpolecaja.szary.png [new file with mode: 0644]
src/librarian/res/cover/label_WLpolecaja.szary.svg [new file with mode: 0644]
src/librarian/res/cover/logo_WL.png [new file with mode: 0644]
src/librarian/res/cover/logo_WL.svg [new file with mode: 0644]
src/librarian/res/cover/logo_WL_invert.png [new file with mode: 0644]
src/librarian/res/factory-cover.svg [new file with mode: 0644]
src/librarian/res/factory.jpg [new file with mode: 0644]

index e953fb4..13da76c 100644 (file)
@@ -2,6 +2,12 @@
 
 This document records all notable changes to Librarian.
 
+## 2.4 (2022-05-06)
+
+### Added
+- New 'marquise' cover style.
+- 'Factory' cover style with a QR code.
+
 
 ## 2.3.5 (2022-04-07)
 
index 957652f..7bb2477 100755 (executable)
--- a/setup.py
+++ b/setup.py
@@ -22,7 +22,7 @@ def whole_tree(prefix, path):
 
 setup(
     name='librarian',
-    version='2.3.5',
+    version='2.4',
     description='Converter from WolneLektury.pl XML-based language to XHTML, TXT and other formats',
     author="Marek Stępniowski",
     author_email='marek@stepniowski.com',
@@ -44,6 +44,7 @@ setup(
         'ebooklib',
         'aeneas',
         'mutagen',
+        'qrcode',
     ],
     entry_points = {
         "console_scripts": [
index dfb0b76..b60ec34 100644 (file)
@@ -152,10 +152,14 @@ class Cover(object):
         }
 
     def __init__(self, book_info, format=None, width=None, height=None, cover_logo=None):
+        self.book_info = book_info
         self.authors = [auth.readable() for auth in book_info.authors]
         self.title = book_info.title
         if format is not None:
             self.format = format
+        self.set_size(width, height)
+
+    def set_size(self, width, height):
         if width and height:
             self.height = int(round(height * self.width / width))
         scale = max(float(width or 0) / self.width,
@@ -167,7 +171,7 @@ class Cover(object):
 
     def pretty_authors(self):
         """Allows for decorating authors' names."""
-        return [self.authors]
+        return self.authors
 
     def pretty_title(self):
         """Allows for decorating title."""
@@ -315,6 +319,8 @@ class WLCover(Cover):
                  bleed=0, cover_logo=None):
         super(WLCover, self).__init__(book_info, format=format, width=width,
                                       height=height)
+
+        self.slug = book_info.url.slug
         # Set box position.
         self.box_position = book_info.cover_box_position or \
             self.kind_box_position.get(book_info.kind, self.box_position)
@@ -336,10 +342,20 @@ class WLCover(Cover):
         if book_info.cover_url:
             url = book_info.cover_url
             bg_src = None
-            if bg_src is None:
-                bg_src = URLOpener().open(url)
-            self.background_img = BytesIO(bg_src.read())
-            bg_src.close()
+            while True:
+                try:
+                    if bg_src is None:
+                        import requests
+                        bg_src = requests.get(url, timeout=5)
+                    self.background_img = BytesIO(bg_src.content)
+                    bg_src.close()
+                except Exception as e:
+                    bg_src = None
+                    print(e)
+                    import time
+                    time.sleep(1)
+                else:
+                    break
 
     def get_variable_color(self, book_info):
         return self.epoch_colors.get(book_info.epoch, None)
@@ -354,7 +370,7 @@ class WLCover(Cover):
         metr = Metric(self, self.scale)
 
         # Write author name.
-        box = TextBox(metr.title_box_width, metr.height,
+        box = TextBox(metr.title_box_width - 2 * self.bleed, metr.height,
                       padding_y=metr.box_padding_y,
                       padding_x=metr.box_padding_x,
                       bar_width=metr.box_bar_width,
@@ -399,7 +415,7 @@ class WLCover(Cover):
             box_top = (metr.height - box_img.size[1]) // 2
 
         box_left = metr.bar_width + (
-            metr.width - metr.bar_width - box_img.size[0]
+            metr.width - metr.bar_width - box_img.size[0] - self.bleed
         ) // 2
 
         # Draw the white box.
@@ -528,6 +544,8 @@ class LogoWLCover(WLCover):
     logos_right = True
     gradient_logo_centering = False
 
+    qrcode = None
+
 
     def __init__(self, book_info, *args, cover_logo=None, **kwargs):
         super(LogoWLCover, self).__init__(book_info, *args, **kwargs)
@@ -546,7 +564,7 @@ class LogoWLCover(WLCover):
 
     @property
     def has_gradient_logos(self):
-        return self.gradient_logos or self.additional_cover_logos or self.end_cover_logos or self.annotation
+        return self.gradient_logos or self.additional_cover_logos or self.end_cover_logos or self.annotation or self.qrcode is not None
 
     def add_gradient_logos(self, img, metr):
         gradient = Image.new(
@@ -583,7 +601,7 @@ class LogoWLCover(WLCover):
         logo_top = int(
             metr.height
             - metr.gradient_height / 2
-            - metr.gradient_logo_height / 2 - metr.bleed / 2
+            - metr.gradient_logo_height / 2 - metr.bleed
         )
 
         logos = [
@@ -593,19 +611,23 @@ class LogoWLCover(WLCover):
 
         logos = self.additional_cover_logos + logos + self.end_cover_logos
 
-        if self.logos_right:
-            logos.reverse()
-
         logos = [
             Image.open(logo_bytes).convert('RGBA')
             for logo_bytes in logos
         ]
 
+        if self.qrcode is not None:
+            import qrcode
+            logos.append(qrcode.make(f'https://wolnelektury.pl/katalog/lektura/{self.slug}/?{self.qrcode}'))
+
+        if self.logos_right:
+            logos.reverse()
+
         # See if logos fit into the gradient. If not, scale down accordingly.
         space_for_logos = (
             metr.width
             - metr.bar_width
-            - 2 * metr.gradient_logo_margin_right
+            - 2 * metr.gradient_logo_margin_right + self.bleed
         )
         widths = [
             min(
@@ -933,6 +955,39 @@ class BNCover(LogoWLCover):
 #    annotation = 'Zadanie „Udostępnienie publikacji w formatach cyfrowych” w ramach Narodowego Programu Rozwoju Czytelnictwa. Dofinansowano ze środków Ministra Kultury, Dziedzictwa Narodowego i Sportu.'
 
 
+class FactoryCover(LogoWLCover):
+    gradient_logos = [
+        'res/factory.jpg',
+        'res/wl-logo-white.png',
+    ]
+    qrcode = 'pk_campaign=factory22'
+    format = 'PNG'
+
+    def __init__(self, *args, **kwargs):
+        kwargs.setdefault('bleed', 10)
+        return super().__init__(*args, **kwargs)
+
+    def ext(self):
+        return 'pdf'
+
+    def output_file(self, *args, **kwargs):
+        imgfile = super().output_file(*args, **kwargs)
+        import subprocess
+        import tempfile
+        with tempfile.TemporaryDirectory(prefix='factory-', dir='.') as d:
+            import os
+            import shutil
+            with open(d + '/cover.png', 'wb') as f:
+                f.write(imgfile.get_bytes())
+            shutil.copy(get_resource('res/factory-cover.svg'), d)
+            subprocess.call(['inkscape', f'--export-filename={d}/cover.pdf', d + '/factory-cover.svg'])
+            with open(d + '/cover.pdf', 'rb') as f:
+                return OutputFile.from_bytes(f.read())
+
+
+
+from librarian.covers.marquise import MarquiseCover, LabelMarquiseCover
+
 COVER_CLASSES = {
     'default': LogoWLCover,
     'kmlu': KMLUCover,
@@ -942,6 +997,9 @@ COVER_CLASSES = {
     'legimi': LegimiCover,
     'legimi-corner': LegimiCornerCover,
     'legimi-audiobook': LegimiAudiobookCover,
+    'factory': FactoryCover,
+    'm': MarquiseCover,
+    'm-label': LabelMarquiseCover,
 }
 
 
diff --git a/src/librarian/covers/__init__.py b/src/librarian/covers/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/librarian/covers/marquise.py b/src/librarian/covers/marquise.py
new file mode 100644 (file)
index 0000000..283a2be
--- /dev/null
@@ -0,0 +1,172 @@
+import PIL.Image
+from librarian.cover import Cover, Metric
+from .utils.color import algo_contrast_or_hue, luminance, is_very_bright
+from .utils.textbox import DoesNotFit
+from .widgets.author import AuthorBox
+from .widgets.background import Background
+from .widgets.image import WLLogo, Label
+from .widgets.marquise import Marquise
+from .widgets.title import TitleBox
+
+
+class MarquiseCover(Cover):
+    additional_logos = []
+    square_variant = False
+
+    width = 2100
+    height = 2970
+    margin = 100
+    logo_h = 177
+    title_box_top = 262
+
+    color_schemes = [
+        {
+            'rgb': (0xc3, 0x27, 0x21),
+            'text': '#000',
+        },
+        {
+            'rgb': (0xa0, 0xbf, 0x38),
+            'text': '#000',
+        },
+        {
+            'rgb': (0xed, 0xc0, 0x16),
+            'text': '#000',
+        },
+        {
+            'rgb': (0x47, 0x66, 0x75),
+            'text': '#fff',
+        }
+    ]
+    for c in color_schemes:
+        c['luminance'] = luminance(c['rgb'])
+        cim = PIL.Image.new('RGB', (1, 1))
+        cim.putpixel((0, 0), c['rgb'])
+        cim.convert('HSV')
+        c['hsv'] = cim.getpixel((0, 0))
+
+    
+    def set_size(self, final_width, final_height):
+        if final_width is None:
+            self.m = Metric(self, 1)
+        else:
+            if final_width > self.width:
+                self.m = Metric(self, final_width / self.width)
+            else:
+                self.m = Metric(self, 1)
+                self.scale_after = final_width / self.width
+            
+        if final_height is not None:
+            self.height = round(final_height / self.m._scale)
+
+        self.square_variant = self.height / self.width < 250 / 210
+
+        marquise_square_small = int(self.width / 2) - 300
+        marquise_square_big = int(self.width / 2) - 100
+        marquise_a4_small = 2970 - self.width
+        marquise_a4_big = marquise_a4_small + 100
+        
+        self.marquise_small = int(round(marquise_square_small + (marquise_a4_small - marquise_square_small) * (self.height - self.width) / (2970 - 2100)))
+        self.marquise_big = int(round(marquise_square_big + (marquise_a4_big - marquise_square_big) * (self.height - self.width) / (2970 - 2100)))
+        self.marquise_xl = self.marquise_big + 200
+
+        if self.marquise_small > self.marquise_big:
+            self.marquise_small = self.marquise_big
+
+    def set_color_scheme_from(self, img):
+        self.color_scheme = algo_contrast_or_hue(img, self.color_schemes)
+        self.is_very_bright = is_very_bright(img)
+
+    def image(self):
+        img = PIL.Image.new('RGB', (self.m.width, self.m.height), self.background_color)
+        
+        bg = Background(self)
+
+        if self.square_variant:
+            layout_options = [
+                (self.m.marquise_small, 1),
+                (self.m.marquise_big, 2),
+                (self.m.marquise_big, 3),
+                (self.m.marquise_big, None),
+            ]
+        else:
+            layout_options = [
+                (self.m.marquise_small, 2),
+                (self.m.marquise_small, 1),
+                (self.m.marquise_big, 3),
+                (self.m.marquise_xl, 4),
+                (self.m.marquise_xl, None),
+            ]
+
+        for marquise_h, lines in layout_options:
+            title_box_height = marquise_h - self.m.title_box_top - self.m.margin
+            try:
+                title_box = TitleBox(
+                    self,
+                    self.m.width - 2 * self.m.margin,
+                    title_box_height,
+                    lines,
+                    force=lines is None
+                )
+            except DoesNotFit:
+                continue
+            else:
+                break
+
+        self.marquise_height = marquise_h
+        marquise = Marquise(self, marquise_h)
+
+        bg.apply(
+            img,
+            0, marquise.edge_top,
+            self.m.width, self.m.height - marquise.edge_top
+        )
+        self.set_color_scheme_from(
+            img.crop((
+                0, marquise.edge_top,
+                self.m.width, marquise.edge_top + (
+                    self.m.height - marquise.edge_top
+                ) / 4
+            ))
+        )
+
+        marquise.apply(
+            img, 0, 0, self.m.width
+        )
+        title_box.apply(
+            img,
+            marquise.title_box_position[0],
+            marquise.title_box_position[1],
+        )
+
+        AuthorBox(self, self.m.width - self.m.margin).apply(
+            img, 0, self.m.margin
+        )
+        WLLogo(self).apply(img, self.m.margin, self.m.margin, None, self.m.logo_h)
+
+                              
+        for logo in self.additional_logos:
+            LogoSticker(self, logo).apply(img, 0, 0)
+
+
+        return img
+
+
+    
+class LabelMarquiseCover(MarquiseCover):
+    label_left = 95
+    label_top = 105
+    label_w = 710
+    label_h = 710
+    
+    def image(self):
+        img = super().image()
+
+        Label(self).apply(
+            img,
+            self.m.label_left,
+            self.marquise_height - self.m.label_top,
+            self.m.label_w,
+            self.m.label_h
+        )
+
+        return img
diff --git a/src/librarian/covers/utils/__init__.py b/src/librarian/covers/utils/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/librarian/covers/utils/color.py b/src/librarian/covers/utils/color.py
new file mode 100644 (file)
index 0000000..afcf38e
--- /dev/null
@@ -0,0 +1,39 @@
+def luminance(rgb):
+    rgb = [
+        c / 255 
+        for c in rgb
+    ]
+    rgb = [
+        c / 12.92 if c < .03928 else ((c + .055) / 1.055) ** 2.4
+        for c in rgb
+    ]
+    return .2126 * rgb[0] + .7152 * rgb[1] + .0722 * rgb[2]
+
+
+def cdist(a, b):
+    d = abs(a-b)
+    if d > 128:
+        d = 256 - d
+    return d
+
+
+def algo_contrast_or_hue(img, colors):
+    rgb = img.convert('RGB').resize((1, 1)).getpixel((0, 0))
+    lumi = luminance(rgb)
+
+    if lumi > .9:
+        return colors[3]
+    elif lumi < .1:
+        return colors[2]
+
+    hue = img.convert('HSV').resize((1, 1)).getpixel((0, 0))[0]
+    return max(
+        colors[:3],
+        key=lambda c: cdist(hue, c['hsv'][0]) ** 2 + (lumi - c['luminance']) ** 2
+    )
+
+
+def is_very_bright(img):
+    rgb = img.convert('RGB').getpixel((0, 0))
+    lumi = luminance(rgb)
+    return lumi > .95
diff --git a/src/librarian/covers/utils/textbox.py b/src/librarian/covers/utils/textbox.py
new file mode 100644 (file)
index 0000000..a5097ed
--- /dev/null
@@ -0,0 +1,114 @@
+import PIL.Image
+import PIL.ImageDraw
+
+
+def split_words(text):
+    words = []
+    conj = False
+    for word in text.split():
+        if conj:
+            words[-1] += ' ' + word
+        else:
+            words.append(word)
+        conj = len(word.lstrip('(').lstrip('[')) == 1
+    return words
+
+
+
+def text_with_tracking(draw, tracking, pos, text, fill=None, font=None):
+    x, y = pos
+    for c in text:
+        width = font.getsize(c)[0]
+        draw.text((x, y), c, fill=fill, font=font)
+        x += width + tracking
+
+
+class DoesNotFit(Exception):
+    pass
+
+
+class TextBox:
+    def __init__(self, width, height, texts,
+                 font, lines, leading, tracking,
+                 align_h, align_v):
+        self.width = width
+        self.height = height
+        self.texts = texts
+        self.font = font
+        self.lines = lines
+        self.leading = leading
+        self.tracking = tracking
+        self.align_h = align_h
+        self.align_v = align_v
+
+        self.margin_top = self.font.getbbox('l')[1]
+
+        self.glue = self.get_length(' ')
+        
+        groups = [
+            (self.get_length(word), word)
+            for word in self.texts
+        ]
+
+        self.grouping = self.find_grouping(groups, self.lines, self.glue)
+        if self.grouping is None:
+            raise DoesNotFit()
+
+    def get_length(self, text):
+        return self.font.getlength(text) + self.tracking * len(text)
+        
+    def as_pil_image(self, color):
+        img = PIL.Image.new('RGBA', (self.width, self.height + 2 * self.margin_top))
+        draw = PIL.ImageDraw.ImageDraw(img)
+
+        font_letter_height = self.font.getmetrics()[0] - self.margin_top
+
+        y = self.align_v * (self.height - ((self.lines - 1) * self.leading + font_letter_height))
+        for group in self.grouping:
+            x = (self.width - group[0] + self.tracking) * self.align_h
+            self.align_h *  - group[0] / 2
+            for s, w in group[1]:
+                text_with_tracking(
+                    draw, self.tracking, (x, y),
+                    w, fill=color, font=self.font
+                )
+                x += s + self.glue
+            y += self.leading
+
+        return img
+
+    def find_grouping(self, groups, ngroups, glue):
+        best = None
+        best_var = None
+
+        mean = sum(g[0] for g in groups) + (len(groups) - ngroups) * glue
+        if mean > self.width * ngroups:
+            return None
+
+        for grouping in self.all_groupings(groups, ngroups, glue):
+            if max(g[0] for g in grouping) > self.width:
+                continue
+            var = sum((g[0] - mean) ** 2 for g in grouping)
+            if best is None or best_var > var:
+                best, best_var = grouping, var
+
+        return best
+
+    def all_groupings(self, groups, ngroups, glue):
+        if len(groups) == 1:
+            if ngroups == 1:
+                yield [(groups[0][0], groups)]
+            return
+        next_groups = groups[1:]
+        for grouping in self.all_groupings(next_groups, ngroups, glue):
+            yield [
+                (
+                    groups[0][0] + glue + grouping[0][0],
+                    [groups[0]] + grouping[0][1]
+                )
+            ] + grouping[1:]
+        if ngroups > 1:
+            for grouping in self.all_groupings(next_groups, ngroups - 1, glue):
+                yield [
+                    (groups[0][0], [groups[0]])
+                ] + grouping
diff --git a/src/librarian/covers/widgets/__init__.py b/src/librarian/covers/widgets/__init__.py
new file mode 100644 (file)
index 0000000..e69de29
diff --git a/src/librarian/covers/widgets/author.py b/src/librarian/covers/widgets/author.py
new file mode 100644 (file)
index 0000000..786204c
--- /dev/null
@@ -0,0 +1,107 @@
+import PIL.ImageFont
+from librarian import get_resource
+from librarian.cover import Metric
+from ..utils.textbox import TextBox, split_words
+from .base import Widget
+
+
+class AuthorBox(Widget):
+    font_size = 75
+    leading = 92
+
+    def __init__(self, cover, width):
+        self.width = width
+        self.m = Metric(self, cover.m._scale)
+        super().__init__(cover)
+
+    def setup(self):
+        author_font = PIL.ImageFont.truetype(
+            get_resource('fonts/SourceSans3VF-Roman.ttf'),
+            self.m.font_size,
+            layout_engine=PIL.ImageFont.LAYOUT_BASIC
+        )
+        author_font.set_variation_by_axes([600])
+
+        translator_font = PIL.ImageFont.truetype(
+            get_resource('fonts/SourceSans3VF-Roman.ttf'),
+            self.m.font_size,
+            layout_engine=PIL.ImageFont.LAYOUT_BASIC
+        )
+        translator_font.set_variation_by_axes([400])
+
+        authors = [a.readable() for a in self.cover.book_info.authors]
+        translators = [a.readable() for a in self.cover.book_info.translators]
+        if authors and translators:
+            author_str = ', '.join(authors)
+            translator_str = '(tłum. ' + ', '.join(translators) + ')'
+            # just print
+            parts = [author_str, translator_str]
+
+            self.textboxes = [
+                TextBox(
+                    self.width,
+                    self.m.leading * 2,
+                    [author_str],
+                    author_font,
+                    1,
+                    self.m.leading,
+                    0,
+                    1, 0
+                ),
+                TextBox(
+                    self.width,
+                    self.m.leading * 2,
+                    [translator_str],
+                    translator_font,
+                    1,
+                    self.m.leading,
+                    0,
+                    1, 0
+                )
+            ]
+
+        else:
+            assert authors
+            if len(authors) == 2:
+                parts = authors
+            elif len(authors) > 2:
+                parts = [author + ',' for author in authors[:-1]] + [authors[-1]]
+            else:
+                parts = split_words(authors[0])
+
+            try:
+                self.textboxes = [
+                    TextBox(
+                        self.width,
+                        self.m.leading * 2,
+                        parts,
+                        author_font,
+                        2,
+                        self.m.leading,
+                        0,
+                        1, 0
+                    )
+                ]
+            except:
+                self.textboxes = [
+                    TextBox(
+                        self.width,
+                        self.m.leading * 2,
+                        parts,
+                        author_font,
+                        1,
+                        self.m.leading,
+                        0,
+                        1, 0
+                    )
+                ]
+        self.margin_top = self.textboxes[0].margin_top
+
+    def build(self, w, h):
+        img = PIL.Image.new('RGBA', (self.width, self.m.leading * 2))
+        offset = 0
+        for i, tb in enumerate(self.textboxes):
+            sub_img = tb.as_pil_image(self.cover.color_scheme['text'])
+            img.paste(sub_img, (0, self.m.leading * i), sub_img)
+        
+        return img
diff --git a/src/librarian/covers/widgets/background.py b/src/librarian/covers/widgets/background.py
new file mode 100644 (file)
index 0000000..a6c7205
--- /dev/null
@@ -0,0 +1,45 @@
+import io
+from urllib.request import urlopen
+import PIL.Image
+from .base import Widget
+
+
+class Background(Widget):
+    transparency = False
+
+    def setup(self):
+        if self.cover.book_info.cover_url:
+            while True:
+                try:
+                    data = io.BytesIO(urlopen(self.cover.book_info.cover_url, timeout=3).read())
+                except:
+                    time.sleep(2)
+                else:
+                    break
+                
+            img = PIL.Image.open(data)
+
+            # crop top square.
+            if img.size[1] > img.size[0]:
+                img = img.crop((0, 0, img.size[0], img.size[0]))
+            else:
+                left = round((img.size[0] - img.size[1])/2)
+                img = img.crop((
+                    left,
+                    0,
+                    left + img.size[1],
+                    img.size[1]
+                ))
+            self.img = img
+
+    def build(self, w, h):
+        kwadrat = round(max(w, h))
+        img = self.img
+        img = self.img.resize((kwadrat, kwadrat))
+        img = img.crop((
+            int((img.size[0] - w) / 2),
+            0,
+            w + int((img.size[0] - w) / 2),
+            h))
+        
+        return img
diff --git a/src/librarian/covers/widgets/base.py b/src/librarian/covers/widgets/base.py
new file mode 100644 (file)
index 0000000..15e4462
--- /dev/null
@@ -0,0 +1,21 @@
+class Widget:
+    transparency = True
+    margin_top = 0
+
+    def __init__(self, cover):
+        self.cover = cover
+        self.setup()
+
+    def setup(self):
+        pass
+        
+    def build(self, w, h):
+        raise NotImplementedError()
+
+    def apply(self, img, x, y, w=None, h=None):
+        my_img = self.build(w, h)
+        img.paste(
+            my_img,
+            (round(x), round(y - self.margin_top)),
+            my_img if self.transparency else None
+        )
diff --git a/src/librarian/covers/widgets/image.py b/src/librarian/covers/widgets/image.py
new file mode 100644 (file)
index 0000000..39879d4
--- /dev/null
@@ -0,0 +1,29 @@
+import PIL.Image
+from librarian import get_resource
+from .base import Widget
+
+
+class ImageWidget(Widget):
+    def build(self, w, h):
+        img = PIL.Image.open(self.image_path)
+        img = img.resize((round(img.size[0] / img.size[1] * h), h))
+        return img
+    
+    
+class WLLogo(ImageWidget):
+    @property
+    def image_path(self):
+        if self.cover.color_scheme['text'] == '#fff':
+            return get_resource('res/cover/logo_WL_invert.png')
+        else:
+            return get_resource('res/cover/logo_WL.png')
+
+
+class Label(ImageWidget):
+    @property
+    def image_path(self):
+        if self.cover.is_very_bright:
+            return get_resource('res/cover/label_WLpolecaja.szary.png')
+        else:
+            return get_resource('res/cover/label_WLpolecaja.png')
+
diff --git a/src/librarian/covers/widgets/marquise.py b/src/librarian/covers/widgets/marquise.py
new file mode 100644 (file)
index 0000000..81ccf5e
--- /dev/null
@@ -0,0 +1,45 @@
+import PIL.Image
+from .base import Widget
+
+
+class Marquise(Widget):
+    segments = 4
+
+    def __init__(self, cover, edge_top):
+        self.edge_top = edge_top
+        super().__init__(cover)
+
+    def setup(self):
+        self.slope_w = self.cover.m.width / self.segments / 2
+        self.segment_h = self.cover.m.margin
+        self.title_box_position = (
+            self.cover.m.margin,
+            self.cover.m.title_box_top
+        )
+
+    def get_points(self, w):
+        tip_y = self.edge_top + self.segment_h
+        points = [
+            (0, 0),
+            (w, 0),
+            (w, tip_y),
+        ]
+        for i in range(self.segments - 1, 0, -1):
+            points.extend([
+                ((2 * i + 1) * self.slope_w, self.edge_top),
+                (2 * i * self.slope_w, tip_y)
+            ])
+        points.extend([
+            (self.slope_w, self.edge_top),
+            (0, tip_y)
+        ])
+        return points
+
+    def build(self, w, h):
+        img = PIL.Image.new('RGBA', (
+            round(w), round(self.edge_top + self.segment_h)
+        ))
+        draw = PIL.ImageDraw.ImageDraw(img)
+        draw.polygon(
+            self.get_points(w), fill=self.cover.color_scheme['rgb'])
+        return img
diff --git a/src/librarian/covers/widgets/title.py b/src/librarian/covers/widgets/title.py
new file mode 100644 (file)
index 0000000..a5c6522
--- /dev/null
@@ -0,0 +1,59 @@
+import PIL.ImageFont
+from librarian import get_resource
+from librarian.cover import Metric
+from ..utils.textbox import TextBox, split_words
+from .base import Widget
+
+
+class TitleBox(Widget):
+    font_size = 159 # 45pt
+    leading = 176  # 50pt
+    tracking = 2.385
+
+    def __init__(self, cover, width, height, lines, force=False):
+        self.width = width
+        self.height = height
+        self.lines = lines
+        self.force = force
+        self.m = Metric(self, cover.m._scale)
+        super().__init__(cover)
+
+    def setup(self):
+        m = self.m
+        while True:
+            try:
+                self.build_box()
+            except:
+                if self.force:
+                    self.m = Metric(self, self.m._scale * .99)
+                    print('lower to', self.m.font_size)
+                else:
+                    raise
+            else:
+                break
+
+    def build_box(self):
+        title_font = PIL.ImageFont.truetype(
+            get_resource('fonts/SourceSans3VF-Roman.ttf'),
+            self.m.font_size,
+            layout_engine=PIL.ImageFont.LAYOUT_BASIC
+        )
+        title_font.set_variation_by_axes([800])
+
+        lines = self.lines or (int(self.height * (176/200) / self.m.leading) - 0)
+        
+        self.tb = TextBox(
+            self.width,
+            self.height,
+            split_words(self.cover.title),
+            title_font,
+            lines,
+            self.m.leading,
+            self.m.tracking,
+            .5, .5
+        )
+        self.margin_top = self.tb.margin_top
+            
+    def build(self, w, h):
+        return self.tb.as_pil_image(self.cover.color_scheme['text'])
+
diff --git a/src/librarian/fonts/SourceSans3VF-Roman.ttf b/src/librarian/fonts/SourceSans3VF-Roman.ttf
new file mode 100644 (file)
index 0000000..093d01d
Binary files /dev/null and b/src/librarian/fonts/SourceSans3VF-Roman.ttf differ
diff --git a/src/librarian/res/cover/label_WLpolecaja.png b/src/librarian/res/cover/label_WLpolecaja.png
new file mode 100644 (file)
index 0000000..fd6231c
Binary files /dev/null and b/src/librarian/res/cover/label_WLpolecaja.png differ
diff --git a/src/librarian/res/cover/label_WLpolecaja.svg b/src/librarian/res/cover/label_WLpolecaja.svg
new file mode 100644 (file)
index 0000000..0f9f9dd
--- /dev/null
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 201.1 201.1" style="enable-background:new 0 0 201.1 201.1;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+       .st1{fill:#232322;}
+       .st2{fill:#EDC01B;}
+       .st3{fill:#A1BF39;}
+       .st4{fill:#C21E1E;}
+       .st5{fill:#496776;}
+</style>
+<g>
+       <path class="st0" d="M200.6,73.7c-2.2-8.3-13.6-13-18-20.6c-4.2-7.3-2.6-19.6-8.9-25.9c-6.3-6.3-18.5-4.6-25.9-8.9
+               c-7.6-4.4-12.3-15.8-20.6-18C126.3,0.1,125.1,0,124,0c-7.6,0-16,5.7-23.5,5.7C93,5.7,84.6,0,77,0c-1.1,0-2.2,0.1-3.3,0.4
+               c-8.3,2.2-13,13.6-20.6,18c-7.3,4.2-19.6,2.6-25.9,8.9c-6.3,6.3-4.6,18.5-8.9,25.9C14,60.7,2.6,65.4,0.4,73.7
+               c-2.2,8.4,5.3,18.2,5.3,26.8c0,8.6-7.5,18.4-5.3,26.8c2.2,8.3,13.6,13,18,20.6c4.2,7.3,2.6,19.6,8.9,25.9
+               c6.3,6.3,18.5,4.6,25.9,8.9c7.6,4.4,12.3,15.8,20.6,18c1.1,0.3,2.2,0.4,3.3,0.4c7.6,0,16-5.7,23.5-5.7c7.5,0,15.9,5.7,23.5,5.7
+               c1.1,0,2.2-0.1,3.3-0.4c8.3-2.2,13-13.6,20.6-18c7.3-4.2,19.6-2.6,25.9-8.9c6.3-6.3,4.6-18.5,8.9-25.9c4.4-7.6,15.8-12.3,18-20.6
+               c2.2-8.4-5.3-18.2-5.3-26.8S202.9,82.1,200.6,73.7z"/>
+       <g>
+               <path class="st1" d="M118.8,166.9l-4,1.1l3.5,12.6l2.2-0.6l-1.3-4.6l1.8-0.5c2.7-0.7,4.4-2.6,3.7-5.4
+                       C123.9,166.6,121.6,166.2,118.8,166.9z M120.4,173.2l-1.6,0.4l-1.2-4.4l1.6-0.4c1.9-0.5,3-0.2,3.4,1.3
+                       C123,171.7,122.3,172.7,120.4,173.2z"/>
+               <path class="st1" d="M129.6,162.7c-3.1,1.4-4.2,4.7-2.4,8.5c1.8,3.8,5,5.2,8.1,3.7c3.1-1.4,4.1-4.8,2.3-8.6
+                       C135.9,162.5,132.7,161.3,129.6,162.7z M134.5,173.2c-1.9,0.9-3.9-0.3-5.1-2.9c-1.2-2.7-0.8-4.8,1.1-5.7c1.9-0.9,3.8,0.2,5.1,2.8
+                       C136.8,170,136.4,172.3,134.5,173.2z"/>
+               <polygon class="st1" points="144.6,167.3 138.4,158.1 136.5,159.4 143.8,170.2 150.2,165.9 149.1,164.3            "/>
+               <polygon class="st1" points="153.3,160.7 150.7,157.9 154.1,154.7 152.8,153.3 149.4,156.4 147.1,153.9 151.2,150.2 149.9,148.8 
+                       144.1,154.1 152.9,163.7 158.8,158.3 157.5,156.9                 "/>
+               <path class="st1" d="M164.2,147.3c0.2,1.1,0,2.1-0.7,3c-1.4,1.7-3.7,1.6-6-0.2c-2.3-1.9-2.7-4.2-1.4-5.8c0.6-0.8,1.5-1.1,2.4-1.2
+                       l-0.4-1.9c-1.2,0.1-2.6,0.6-3.7,1.9c-2.1,2.6-1.8,6.2,1.5,9c3.4,2.7,6.9,2.2,8.9-0.3c1.1-1.3,1.4-2.8,1.1-4.4L164.2,147.3z"/>
+               <path class="st1" d="M172.9,139.3l1.2-2.1l-13.4-3l-1.4,2.3l9.1,10.3l1.2-2l-2.5-2.7l2.2-3.8L172.9,139.3z M165.8,140.8l-1.1-1.2
+                       c-1-1.1-2.1-2.1-3.1-3.2l0-0.1c1.4,0.4,2.9,0.8,4.3,1.2l1.6,0.4L165.8,140.8z"/>
+               <path class="st1" d="M173.9,126.9l-8.3-3.4l-0.9,2.1l8.1,3.3c1.7,0.7,2.1,1.5,1.6,2.7c-0.3,0.7-1,1.2-2.1,1.4l0.5,1.9
+                       c1.7-0.2,2.8-1.1,3.5-2.8C177.5,129.7,176.1,127.8,173.9,126.9z"/>
+               <path class="st1" d="M185.2,115.5l-1.3,0.3c0.1,0.3,0.2,0.5,0.1,0.9c-0.1,0.4-0.5,0.8-1,0.6c-0.8-0.2-1.5-1.1-1.5-2.1l-13.7,1
+                       l-0.7,2.6l11.6,7.3l0.6-2.3l-3.2-1.9l1.1-4.3l3.7-0.1l0.1-0.6c0.2,0.8,0.9,1.9,2.1,2.1c1.1,0.3,2-0.5,2.3-1.6
+                       C185.5,116.8,185.4,116,185.2,115.5z M174.4,120.9l-1.4-0.8c-1.2-0.7-2.6-1.5-3.9-2.2l0-0.1c1.5,0,3,0,4.5-0.1l1.7-0.1
+                       L174.4,120.9z"/>
+       </g>
+       <g>
+               <g>
+                       <g>
+                               <path class="st2" d="M58.4,101.6c-0.8,1.2-1.3,2.6-2,3.8c-0.9,1.6-1.5,3.3-2.2,4.9c-0.6,1.4-2.2,5.1,0.4,5.7
+                                       c1.8,0.4,3.1-2.2,3.8-3.4c0.8-1.3,1.5-2.7,2.2-4.1c0.7-1.2,1.1-3,2.2-3.9c0.8-0.7-0.2-1.9-1-1.3c-1.3,1.1-1.8,3-2.5,4.5
+                                       c-0.9,2-2,4-3.3,5.8c-0.2,0.3-0.4,0.5-0.7,0.7c-0.8,0.7-0.7-1-0.6-1.4c0.4-1.3,1-2.6,1.5-3.8c0.6-1.4,1.2-2.6,2-3.9
+                                       c0.6-1.1,1-2.3,1.7-3.3c0.2-0.3,0.2-0.6,0-0.9C58.8,99.5,58,97.7,57,96c-1-1.7-2.2-3.3-3.1-5c-0.3-0.5-1-0.6-1.3-0.1
+                                       c-0.7,1-1.2,2.1-1.9,3.1c-0.6,0.9-1.2,1.9-1.7,2.9c-0.6,1.1-1.1,2.2-1.6,3.4c-0.3,0.7-0.5,2-1.1,2.5c-0.2,0.2-0.4,0.6-0.2,0.8
+                                       c1,1.6,1.6,3.4,2.4,5.2c0.8,1.7,1.5,3.6,2.6,5.1c0.4,0.5,1.3,0,0.9-0.6l0,0c-1.8-3.1-2.7-6.7-4.5-9.9l0,0
+                                       c0.3-0.4,0.4-0.8,0.6-1.3c0.4-1.1,0.9-2.2,1.5-3.3c0.6-1.2,1.3-2.4,2-3.5c0.5-0.8,1-1.7,1.5-2.5l0,0c0.7,1.2,1.5,2.4,2.3,3.5
+                                       C56.5,98,57.3,99.9,58.4,101.6L58.4,101.6z"/>
+                       </g>
+                       <g>
+                               <path class="st3" d="M38.3,123c-0.4-0.3-0.8-0.4-1.3-0.6c-1.1-0.4-2.2-0.9-3.3-1.5c-1.2-0.6-2.4-1.3-3.5-2
+                                       c-0.8-0.5-1.7-1-2.5-1.5c0,0,0,0,0,0c1.2-0.7,2.4-1.5,3.5-2.3c1.7-1.1,3.5-1.9,5.2-3c0,0,2.6,1.3,3.9,2c1.6,0.9,3.3,1.5,4.9,2.2
+                                       c1.4,0.6,5.1,2.2,5.7-0.4c0.4-1.8-2.2-3.1-3.4-3.8c-1.3-0.8-2.7-1.5-4.1-2.2c-1.2-0.7-3-1.1-3.9-2.2c-0.7-0.8-1.9,0.2-1.3,1
+                                       c1.1,1.3,3,1.8,4.5,2.5c2,0.9,4,2,5.8,3.3c0.3,0.2,0.5,0.4,0.7,0.7c0.7,0.8-1,0.7-1.4,0.6c-1.3-0.4-2.6-1-3.8-1.5
+                                       c-1.4-0.6-2.6-1.2-3.9-2c-1.1-0.6-2.3-1-3.3-1.7c-0.3-0.2-0.6-0.2-0.9,0c-1.6,1.1-3.4,1.9-5.1,2.9c-1.7,1-3.3,2.2-5,3.1
+                                       c-0.5,0.3-0.6,1-0.1,1.3c1,0.7,2.1,1.2,3.1,1.9c0.9,0.6,1.9,1.2,2.9,1.7c1.1,0.6,2.2,1.1,3.4,1.6c0.7,0.3,2,0.5,2.5,1.1
+                                       c0.2,0.2,0.6,0.4,0.8,0.2c1.6-1,3.4-1.6,5.2-2.4c1.7-0.8,3.6-1.5,5.1-2.6c0.5-0.4,0-1.3-0.6-0.9l0,0
+                                       C45,120.3,41.5,121.3,38.3,123L38.3,123z"/>
+                       </g>
+                       <g>
+                               <path class="st4" d="M57.9,132.3c-0.3,0.4-0.4,0.8-0.6,1.3c-0.4,1.1-0.9,2.2-1.5,3.3c-0.6,1.2-1.3,2.4-2,3.5
+                                       c-0.5,0.8-1,1.7-1.5,2.5l0,0c-0.7-1.2-1.5-2.4-2.3-3.5c-1.1-1.7-1.9-3.5-2.9-5.2c0,0,0,0,0-0.1l0,0c0.8-1.2,1.3-2.6,2-3.9
+                                       c0.9-1.6,1.5-3.3,2.2-4.9c0.6-1.4,2.2-5.1-0.4-5.7c-1.8-0.4-3.1,2.2-3.8,3.4c-0.8,1.3-1.5,2.7-2.2,4.1c-0.7,1.2-1.1,3-2.2,3.9
+                                       c-0.8,0.7,0.2,1.9,1,1.3c1.3-1.1,1.8-3,2.5-4.5c0.9-2,2-4,3.3-5.8c0.2-0.3,0.4-0.5,0.7-0.7c0.8-0.7,0.7,1,0.6,1.4
+                                       c-0.4,1.3-1,2.6-1.5,3.8c-0.6,1.4-1.2,2.6-2,3.9c-0.6,1.1-1,2.3-1.7,3.3c-0.2,0.3-0.2,0.6,0,0.9c1.1,1.6,1.9,3.4,2.9,5.1
+                                       c1,1.7,2.2,3.3,3.1,5c0.3,0.5,1,0.6,1.3,0.1c0.7-1,1.2-2.1,1.9-3.1c0.6-0.9,1.2-1.9,1.7-2.9c0.6-1.1,1.1-2.2,1.6-3.4
+                                       c0.3-0.7,0.5-2,1.1-2.5c0.2-0.2,0.4-0.6,0.2-0.8c-1-1.6-1.6-3.4-2.4-5.2c-0.8-1.7-1.5-3.6-2.6-5.1c-0.4-0.5-1.3,0-0.9,0.6l0,0
+                                       C55.2,125.6,56.2,129.1,57.9,132.3L57.9,132.3z"/>
+                       </g>
+                       <g>
+                               <path class="st5" d="M67.2,112.7c0.4,0.3,0.8,0.4,1.3,0.6c1.1,0.4,2.2,0.9,3.3,1.5c1.2,0.6,2.4,1.3,3.5,2c0.8,0.5,1.7,1,2.5,1.5
+                                       l0,0c-1.2,0.7-2.4,1.5-3.6,2.3c-1.7,1.1-3.5,1.9-5.2,2.9l0,0c-1.2-0.8-2.6-1.3-3.8-2c-1.6-0.9-3.3-1.5-4.9-2.2
+                                       c-1.4-0.6-5.1-2.2-5.7,0.4c-0.4,1.7,2.2,3.1,3.4,3.8c1.3,0.8,2.7,1.5,4.1,2.2c1.2,0.7,3,1.1,3.9,2.2c0.7,0.8,1.9-0.2,1.3-1
+                                       c-1.1-1.3-3-1.8-4.5-2.5c-2-0.9-4-2-5.8-3.3c-0.3-0.2-0.5-0.4-0.7-0.7c-0.7-0.8,1-0.7,1.4-0.6c1.3,0.4,2.6,1,3.8,1.5
+                                       c1.4,0.6,2.6,1.2,3.9,2c1.1,0.6,2.3,1,3.3,1.7c0.3,0.2,0.6,0.2,0.9,0c1.6-1.1,3.4-1.9,5.1-2.9c1.7-1,3.3-2.2,5-3.1
+                                       c0.5-0.3,0.6-1,0.1-1.3c-1-0.7-2.1-1.2-3.1-1.9c-0.9-0.6-1.9-1.2-2.9-1.7c-1.1-0.6-2.2-1.1-3.4-1.6c-0.7-0.3-2-0.5-2.5-1.1
+                                       c-0.2-0.2-0.6-0.4-0.8-0.2c-1.6,1-3.4,1.6-5.2,2.4c-1.7,0.8-3.6,1.5-5.1,2.6c-0.5,0.4,0,1.3,0.6,0.9l0,0
+                                       C60.5,115.4,64,114.4,67.2,112.7L67.2,112.7z"/>
+                       </g>
+               </g>
+               <g>
+                       <path class="st3" d="M85.2,104.3c3,2,5.9,4.2,8.8,6.5c1.4,1.2,2.8,2.4,4.2,3.6c1.1,1,2.4,2.9,3.9,3.1c0.8,0.1,1.3-0.7,1.2-1.4
+                               c-0.2-1.4-1.9-2.4-2.9-3.3c-1.5-1.3-3-2.6-4.5-3.8c-3-2.4-6-4.7-9.2-6.7C85.3,101.3,83.9,103.4,85.2,104.3L85.2,104.3z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M132.5,82.8c0.5,0.1,0.9,0.2,1.4,0.2c1.7,0.1,2.3-2.4,0.6-2.9c-1.7-0.6-3.1-1.1-4.6-2.1
+                               c-1.7-1.1-3.1,1.2-1.7,2.5c1.3,1.2,1.6,2.1,0.9,3.8c-1,2.7-2.9,0.9-4.2-0.3c-0.3-0.3-0.9-0.1-1.1,0.3l0,0
+                               c-0.5,1.4,0.9,2.8,2.1,3.4c1.6,0.8,3.3,0.5,4.6-0.8C131.4,86.1,132.3,84.3,132.5,82.8L132.5,82.8z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M134.5,75.4c-0.6-0.2-1.1-0.4-1.7-0.4c-0.9,0-1.3,1-0.6,1.6l0,0c1.2,0.9,2.7,1.7,4,2.5
+                               c1.3,0.8,2.6-0.7,1.7-1.9c-0.8-1.2-0.8-2.2-0.3-3.6c0.5-1.3,1.9-2.1,1.8-3.5c-0.1-0.6-0.6-0.9-1.1-1c-1.9-0.3-3.1,2.9-3.5,4.3
+                               C134.6,74.1,134.5,74.7,134.5,75.4L134.5,75.4z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M148.5,67c1.9,1.9,3,4.5,2.9,7.4c-0.1,1.8-0.7,3.4-1.7,4.9c-1.1,1.6-2.8,2.6-4.1,4.1c-0.9,1.1,0.5,2.5,1.7,2
+                               c2-0.8,3.9-3,5-4.7c1.3-1.9,1.9-4.2,2-6.5c0.1-5.1-3-9.5-7.5-11.7c-1.1-0.5-2.3,0.9-1.7,1.9c0.8,1.3,1.1,4.4-1,4.8
+                               c-1.2,0.3-2.7-1.4-3.5-2.1c-0.9-0.7-2.1,0.6-1.3,1.5l0,0c1.4,1.6,3.7,3.9,6.1,2.8C147.4,70.5,148.3,68.8,148.5,67L148.5,67z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M59,128.1c2.5,2.6,5.1,5,7.6,7.5c2.6,2.5,5,5.1,7.6,7.5c1.3,1.3,3.5-0.4,2.2-1.9c-2.3-2.6-5.1-4.8-7.6-7.2
+                               c-2.8-2.5-5.6-5-8.5-7.4C59.5,126,58.3,127.3,59,128.1L59,128.1z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M75.9,134.3c-0.9-0.5-1.8-1.1-2.6-1.5c-0.8-0.4-1.2,0.7-0.8,1.2l0,0c1.3,2,3.6,3.9,5.5,5.3
+                               c1.4,1,3-0.9,2-2.2c-0.6-0.8-0.8-1.8-0.9-2.8c-0.1-0.5-0.1-2.1,0.4-2.4c0.5-0.3,2.5,1.8,2.9,2.1c1.4,1.2,3,2.5,5,2.2
+                               c1.4-0.2,1.5-1.8,0.6-2.7c-0.9-0.8-2.2-1.3-3.2-2.1c-1-0.8-1.9-1.5-3-2.1c-1.4-0.8-3.3-1-4.4,0.3
+                               C76.2,130.8,75.8,132.6,75.9,134.3L75.9,134.3z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M55.9,160.2c1.3,0.6,2.7,0.7,3.8-0.7c2.3-2.9,0.1-7.2-1.3-9.9c-1-1.9-4.1-0.4-3,1.4c1.1,1.8,2.2,3.7,2.1,5.8
+                               c0,0.9,0,0.8-0.8,0.4c-0.8-0.3-1.5-1-2.1-1.5c-1-0.9-2.4,0.3-2.2,1.4c0.1,0.7,1.7,4.5,0.8,4.7c-0.9,0.2-2.1-0.8-2.8-1.3
+                               c-0.8-0.5-1.5-1.1-2.4-1.6c-0.6-0.3-1.4,0.4-0.9,0.9l0,0c1.7,1.7,4.1,5.1,6.9,4.3C56.1,163.6,56.2,162,55.9,160.2L55.9,160.2z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M148.5,40c-0.7-0.5,0,0.2,0.2,0.4c0.3,0.3,0.5,0.6,0.8,0.8c0.7,0.8,1.5,1.5,2.3,2.2c1.9,1.8,3.9,3.6,6.1,5.2
+                               c1.7,1.2,3.7,2.6,5.9,2.6c2.2,0,3.9-1.9,3.4-4.1c-0.2-0.7-1.2-1.1-1.7-0.4c-0.8,1.3-0.8,2.3-2.3,1.9c-2-0.5-3.8-1.9-5.4-3.1
+                               c-1.8-1.4-3.5-2.9-5.2-4.4c-0.6-0.6-1.3-1.2-1.9-1.7c-0.3-0.2-0.5-0.4-0.8-0.6c-0.2-0.1-1.1-0.4-0.8-0.3
+                               C148.4,38.4,147.9,39.5,148.5,40L148.5,40z"/>
+               </g>
+               <path class="st5" d="M153.7,63.8c-0.3,0.3-0.7,0.6-1.1,0.6c-0.2,0-0.4,0-0.6-0.2c0,0-0.1-0.1-0.1-0.2c-0.5-0.4-0.5-1.9,0.8-2.1
+                       C154.1,61.8,153.9,63.5,153.7,63.8z"/>
+               <g>
+                       <path class="st5" d="M69.7,142.8c-1.9-2.7-5.8-2.4-7.5,0.3c-0.2,0.3-0.3,0.6-0.2,0.9c-1.5,1.5-2.3,3.8-1.5,5.8
+                               c1.3,3.2,5.2,2.5,7.5,0.9C70.3,149,71.4,145.3,69.7,142.8z M66.4,148.2c-0.9,0.9-3.3,1.9-3.8,0.1c-0.3-1.1,0-2.2,0.6-3.2
+                               c0.2,0,0.4,0,0.6-0.1c1-0.3,2.2-1.6,3.2-0.6C68,145.5,67.2,147.3,66.4,148.2z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M96.4,115.8c-0.5-1.7-3-0.7-2.8,0.9c0.4,2.9,0.2,5.7-1.9,8c-0.7,0.7-1.7,1.4-2.7,1.7l0,0
+                               c0.2-0.3,0.4-0.5,0.5-0.8c1.1-1.9,1.6-4,0.8-6.1c-0.6-1.7-2.6-2.3-4.1-1.8c-2,0.7-3.1,2.7-3.4,4.8c-0.6,4.8,3.5,8,7.9,6.3
+                               C95.6,126.9,97.9,120.5,96.4,115.8z M86.7,126L86.7,126c-0.4-0.3-0.7-0.6-0.9-1.2c-0.5-1.2-0.3-2.8,0.4-3.9
+                               c0.4-0.5,1.4-1.2,1.8-0.4C88.7,121.8,87.9,124.6,86.7,126z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M110,102.5c-0.4,2.2-1.8,4.3-3.7,5.4c-1.2,0.7-2.6,0.9-3.8,0.5l0,0c2.5-1.5,4.2-5.1,2.4-7.6
+                               c-2.4-3.3-6.3,0.1-7,3c-0.5,2,0,4.1,1.3,5.8c1.4,1.7,3.6,2.1,5.7,1.9c4.2-0.3,7.9-4.7,8-8.8C113,100.8,110.3,100.6,110,102.5z
+                                M101.1,107.3L101.1,107.3c-0.3-0.3-0.4-0.7-0.6-1.2c-0.3-1.1,0-2.3,0.6-3.2c0.3-0.5,1.1-1.2,1.7-0.8
+                               C104.6,103.3,102.4,106.3,101.1,107.3z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M121.1,94.7c-1.7,0.3-3.4,0.2-5.1,0.2c-0.4-1.2-0.8-2.4-1.1-3.7c-0.5-1.7-3.2-1.3-2.8,0.5
+                               c0.5,2.1,1.2,4,1.8,6l0,0c-1.6-1-3.2-2.2-4.7-3.3c-2.1-1.6-4.2-3.4-6.7-4.3c-0.7-0.2-1.1,0.7-0.6,1.1c2.1,1.8,4.3,3.4,6.4,5.3
+                               c2.2,1.9,4.4,3.8,7,5.1c1,0.5,1.9-0.6,1.8-1.5c-0.1-1.2-0.4-2.8-0.5-3.1c0,0,0-0.1,0-0.1l0,0c0,0,3.1,0.4,4.7,0.4
+                               C123.1,97.3,122.9,94.4,121.1,94.7z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M117.7,86.8c0.3,0.3,0.6,0.6,0.9,0.9c1.2,1.2,2.5,2.5,3.8,3.7c1.3,1.3,2.6,2.9,4.2,3.8
+                               c1.4,0.8,2.8-0.7,1.9-2c-0.9-1.3-2.5-2.4-3.7-3.5c-1.3-1.2-2.6-2.4-3.9-3.5c-0.5-0.5-1-0.9-1.5-1.4l0,0c1-1.1,2.1-2.1,3.2-3.1
+                               c1.1-1.1-0.5-3-1.6-1.9c-1.1,1.1-2.2,2.3-3.3,3.5l0,0c-1.6-1.5-3.2-3-4.8-4.5c-1-0.9-2.6,0.3-1.6,1.4l0,0
+                               c1.6,1.7,3.3,3.4,4.9,5.1l0,0c-0.7,1-1.3,2.1-1.2,3.2c0,0.8,1,1.3,1.5,0.6l0,0C116.8,88.2,117.2,87.5,117.7,86.8L117.7,86.8z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M154.1,58c0.1-0.1,0.2-0.3,0.2-0.5l0,0c0-0.9,0.1-1.7,0.4-2.6c0.2-0.6,0.5-0.9,0.9-1.2
+                               c0.2-0.1-0.1,0.1,0.2-0.1c0.1,0,0.4-0.1,0.1-0.1c0.1,0,0.2-0.1,0.4-0.1c0.2,0-0.2,0,0.2,0c0.1,0,0.3,0,0.4,0
+                               c-0.3-0.1,0.1,0,0.1,0c0.1,0,0.2,0.1,0.4,0.1c0.4,0.2-0.1-0.1,0.1,0.1c0.2,0.1,0.4,0.3,0.6,0.5c0.2,0.2-0.2-0.2,0.1,0.1
+                               c0.1,0.1,0.2,0.2,0.3,0.3c0.1,0.1,0.3,0.4,0.1,0.1c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2-0.1-0.3,0,0.1c0,0.1,0,0.2,0.1,0.4
+                               c0-0.4,0,0,0,0.1c0,0.3,0.1-0.3,0,0.1c0,0.1-0.2,0.5,0,0.1c-0.1,0.1-0.2,0.2-0.2,0.4c-0.2,0.2,0.3-0.2-0.1,0.1
+                               c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.4-0.9,0.9-0.9,1.6c0,0.7,0.3,1.1,0.9,1.4c1.3,0.6,2.5-0.6,3.1-1.6c0.5-0.9,0.7-1.8,0.6-2.8
+                               c-0.2-1.7-1.5-3-3-3.7c-1.4-0.7-3.2-0.6-4.5,0.3c-1.7,1.2-1.8,3.8-1.6,5.7l0,0c0,0,0,0-0.1,0c-0.4-0.1-1,0.1-1,0.1
+                               c-0.5,0-0.9,0.7-0.4,1l0,0c-0.1-0.2,0-0.2,0,0c0.1,0.2,0.3,0.4,0.5,0.5c0.5,0.3,1.1,0.7,1.6,1.1c1.3,0.9,2.6,1.9,3.8,3
+                               c1.3,1.1,2.5,2.3,3.7,3.5c0.7,0.7,2.4,2.1,3,0.5c0.5-1.3-1-2.2-1.8-3c-1.2-1.1-2.5-2.3-3.8-3.3c-1.2-1-2.5-2-3.9-2.7
+                               C154.3,58.1,154.2,58,154.1,58z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/src/librarian/res/cover/label_WLpolecaja.szary.png b/src/librarian/res/cover/label_WLpolecaja.szary.png
new file mode 100644 (file)
index 0000000..3b7c9cf
Binary files /dev/null and b/src/librarian/res/cover/label_WLpolecaja.szary.png differ
diff --git a/src/librarian/res/cover/label_WLpolecaja.szary.svg b/src/librarian/res/cover/label_WLpolecaja.szary.svg
new file mode 100644 (file)
index 0000000..30555e0
--- /dev/null
@@ -0,0 +1,170 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 201.1 201.1" style="enable-background:new 0 0 201.1 201.1;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#e6e6e6;}
+       .st1{fill:#232322;}
+       .st2{fill:#EDC01B;}
+       .st3{fill:#A1BF39;}
+       .st4{fill:#C21E1E;}
+       .st5{fill:#496776;}
+</style>
+<g>
+       <path class="st0" d="M200.6,73.7c-2.2-8.3-13.6-13-18-20.6c-4.2-7.3-2.6-19.6-8.9-25.9c-6.3-6.3-18.5-4.6-25.9-8.9
+               c-7.6-4.4-12.3-15.8-20.6-18C126.3,0.1,125.1,0,124,0c-7.6,0-16,5.7-23.5,5.7C93,5.7,84.6,0,77,0c-1.1,0-2.2,0.1-3.3,0.4
+               c-8.3,2.2-13,13.6-20.6,18c-7.3,4.2-19.6,2.6-25.9,8.9c-6.3,6.3-4.6,18.5-8.9,25.9C14,60.7,2.6,65.4,0.4,73.7
+               c-2.2,8.4,5.3,18.2,5.3,26.8c0,8.6-7.5,18.4-5.3,26.8c2.2,8.3,13.6,13,18,20.6c4.2,7.3,2.6,19.6,8.9,25.9
+               c6.3,6.3,18.5,4.6,25.9,8.9c7.6,4.4,12.3,15.8,20.6,18c1.1,0.3,2.2,0.4,3.3,0.4c7.6,0,16-5.7,23.5-5.7c7.5,0,15.9,5.7,23.5,5.7
+               c1.1,0,2.2-0.1,3.3-0.4c8.3-2.2,13-13.6,20.6-18c7.3-4.2,19.6-2.6,25.9-8.9c6.3-6.3,4.6-18.5,8.9-25.9c4.4-7.6,15.8-12.3,18-20.6
+               c2.2-8.4-5.3-18.2-5.3-26.8S202.9,82.1,200.6,73.7z"/>
+       <g>
+               <path class="st1" d="M118.8,166.9l-4,1.1l3.5,12.6l2.2-0.6l-1.3-4.6l1.8-0.5c2.7-0.7,4.4-2.6,3.7-5.4
+                       C123.9,166.6,121.6,166.2,118.8,166.9z M120.4,173.2l-1.6,0.4l-1.2-4.4l1.6-0.4c1.9-0.5,3-0.2,3.4,1.3
+                       C123,171.7,122.3,172.7,120.4,173.2z"/>
+               <path class="st1" d="M129.6,162.7c-3.1,1.4-4.2,4.7-2.4,8.5c1.8,3.8,5,5.2,8.1,3.7c3.1-1.4,4.1-4.8,2.3-8.6
+                       C135.9,162.5,132.7,161.3,129.6,162.7z M134.5,173.2c-1.9,0.9-3.9-0.3-5.1-2.9c-1.2-2.7-0.8-4.8,1.1-5.7c1.9-0.9,3.8,0.2,5.1,2.8
+                       C136.8,170,136.4,172.3,134.5,173.2z"/>
+               <polygon class="st1" points="144.6,167.3 138.4,158.1 136.5,159.4 143.8,170.2 150.2,165.9 149.1,164.3            "/>
+               <polygon class="st1" points="153.3,160.7 150.7,157.9 154.1,154.7 152.8,153.3 149.4,156.4 147.1,153.9 151.2,150.2 149.9,148.8 
+                       144.1,154.1 152.9,163.7 158.8,158.3 157.5,156.9                 "/>
+               <path class="st1" d="M164.2,147.3c0.2,1.1,0,2.1-0.7,3c-1.4,1.7-3.7,1.6-6-0.2c-2.3-1.9-2.7-4.2-1.4-5.8c0.6-0.8,1.5-1.1,2.4-1.2
+                       l-0.4-1.9c-1.2,0.1-2.6,0.6-3.7,1.9c-2.1,2.6-1.8,6.2,1.5,9c3.4,2.7,6.9,2.2,8.9-0.3c1.1-1.3,1.4-2.8,1.1-4.4L164.2,147.3z"/>
+               <path class="st1" d="M172.9,139.3l1.2-2.1l-13.4-3l-1.4,2.3l9.1,10.3l1.2-2l-2.5-2.7l2.2-3.8L172.9,139.3z M165.8,140.8l-1.1-1.2
+                       c-1-1.1-2.1-2.1-3.1-3.2l0-0.1c1.4,0.4,2.9,0.8,4.3,1.2l1.6,0.4L165.8,140.8z"/>
+               <path class="st1" d="M173.9,126.9l-8.3-3.4l-0.9,2.1l8.1,3.3c1.7,0.7,2.1,1.5,1.6,2.7c-0.3,0.7-1,1.2-2.1,1.4l0.5,1.9
+                       c1.7-0.2,2.8-1.1,3.5-2.8C177.5,129.7,176.1,127.8,173.9,126.9z"/>
+               <path class="st1" d="M185.2,115.5l-1.3,0.3c0.1,0.3,0.2,0.5,0.1,0.9c-0.1,0.4-0.5,0.8-1,0.6c-0.8-0.2-1.5-1.1-1.5-2.1l-13.7,1
+                       l-0.7,2.6l11.6,7.3l0.6-2.3l-3.2-1.9l1.1-4.3l3.7-0.1l0.1-0.6c0.2,0.8,0.9,1.9,2.1,2.1c1.1,0.3,2-0.5,2.3-1.6
+                       C185.5,116.8,185.4,116,185.2,115.5z M174.4,120.9l-1.4-0.8c-1.2-0.7-2.6-1.5-3.9-2.2l0-0.1c1.5,0,3,0,4.5-0.1l1.7-0.1
+                       L174.4,120.9z"/>
+       </g>
+       <g>
+               <g>
+                       <g>
+                               <path class="st2" d="M58.4,101.6c-0.8,1.2-1.3,2.6-2,3.8c-0.9,1.6-1.5,3.3-2.2,4.9c-0.6,1.4-2.2,5.1,0.4,5.7
+                                       c1.8,0.4,3.1-2.2,3.8-3.4c0.8-1.3,1.5-2.7,2.2-4.1c0.7-1.2,1.1-3,2.2-3.9c0.8-0.7-0.2-1.9-1-1.3c-1.3,1.1-1.8,3-2.5,4.5
+                                       c-0.9,2-2,4-3.3,5.8c-0.2,0.3-0.4,0.5-0.7,0.7c-0.8,0.7-0.7-1-0.6-1.4c0.4-1.3,1-2.6,1.5-3.8c0.6-1.4,1.2-2.6,2-3.9
+                                       c0.6-1.1,1-2.3,1.7-3.3c0.2-0.3,0.2-0.6,0-0.9C58.8,99.5,58,97.7,57,96c-1-1.7-2.2-3.3-3.1-5c-0.3-0.5-1-0.6-1.3-0.1
+                                       c-0.7,1-1.2,2.1-1.9,3.1c-0.6,0.9-1.2,1.9-1.7,2.9c-0.6,1.1-1.1,2.2-1.6,3.4c-0.3,0.7-0.5,2-1.1,2.5c-0.2,0.2-0.4,0.6-0.2,0.8
+                                       c1,1.6,1.6,3.4,2.4,5.2c0.8,1.7,1.5,3.6,2.6,5.1c0.4,0.5,1.3,0,0.9-0.6l0,0c-1.8-3.1-2.7-6.7-4.5-9.9l0,0
+                                       c0.3-0.4,0.4-0.8,0.6-1.3c0.4-1.1,0.9-2.2,1.5-3.3c0.6-1.2,1.3-2.4,2-3.5c0.5-0.8,1-1.7,1.5-2.5l0,0c0.7,1.2,1.5,2.4,2.3,3.5
+                                       C56.5,98,57.3,99.9,58.4,101.6L58.4,101.6z"/>
+                       </g>
+                       <g>
+                               <path class="st3" d="M38.3,123c-0.4-0.3-0.8-0.4-1.3-0.6c-1.1-0.4-2.2-0.9-3.3-1.5c-1.2-0.6-2.4-1.3-3.5-2
+                                       c-0.8-0.5-1.7-1-2.5-1.5c0,0,0,0,0,0c1.2-0.7,2.4-1.5,3.5-2.3c1.7-1.1,3.5-1.9,5.2-3c0,0,2.6,1.3,3.9,2c1.6,0.9,3.3,1.5,4.9,2.2
+                                       c1.4,0.6,5.1,2.2,5.7-0.4c0.4-1.8-2.2-3.1-3.4-3.8c-1.3-0.8-2.7-1.5-4.1-2.2c-1.2-0.7-3-1.1-3.9-2.2c-0.7-0.8-1.9,0.2-1.3,1
+                                       c1.1,1.3,3,1.8,4.5,2.5c2,0.9,4,2,5.8,3.3c0.3,0.2,0.5,0.4,0.7,0.7c0.7,0.8-1,0.7-1.4,0.6c-1.3-0.4-2.6-1-3.8-1.5
+                                       c-1.4-0.6-2.6-1.2-3.9-2c-1.1-0.6-2.3-1-3.3-1.7c-0.3-0.2-0.6-0.2-0.9,0c-1.6,1.1-3.4,1.9-5.1,2.9c-1.7,1-3.3,2.2-5,3.1
+                                       c-0.5,0.3-0.6,1-0.1,1.3c1,0.7,2.1,1.2,3.1,1.9c0.9,0.6,1.9,1.2,2.9,1.7c1.1,0.6,2.2,1.1,3.4,1.6c0.7,0.3,2,0.5,2.5,1.1
+                                       c0.2,0.2,0.6,0.4,0.8,0.2c1.6-1,3.4-1.6,5.2-2.4c1.7-0.8,3.6-1.5,5.1-2.6c0.5-0.4,0-1.3-0.6-0.9l0,0
+                                       C45,120.3,41.5,121.3,38.3,123L38.3,123z"/>
+                       </g>
+                       <g>
+                               <path class="st4" d="M57.9,132.3c-0.3,0.4-0.4,0.8-0.6,1.3c-0.4,1.1-0.9,2.2-1.5,3.3c-0.6,1.2-1.3,2.4-2,3.5
+                                       c-0.5,0.8-1,1.7-1.5,2.5l0,0c-0.7-1.2-1.5-2.4-2.3-3.5c-1.1-1.7-1.9-3.5-2.9-5.2c0,0,0,0,0-0.1l0,0c0.8-1.2,1.3-2.6,2-3.9
+                                       c0.9-1.6,1.5-3.3,2.2-4.9c0.6-1.4,2.2-5.1-0.4-5.7c-1.8-0.4-3.1,2.2-3.8,3.4c-0.8,1.3-1.5,2.7-2.2,4.1c-0.7,1.2-1.1,3-2.2,3.9
+                                       c-0.8,0.7,0.2,1.9,1,1.3c1.3-1.1,1.8-3,2.5-4.5c0.9-2,2-4,3.3-5.8c0.2-0.3,0.4-0.5,0.7-0.7c0.8-0.7,0.7,1,0.6,1.4
+                                       c-0.4,1.3-1,2.6-1.5,3.8c-0.6,1.4-1.2,2.6-2,3.9c-0.6,1.1-1,2.3-1.7,3.3c-0.2,0.3-0.2,0.6,0,0.9c1.1,1.6,1.9,3.4,2.9,5.1
+                                       c1,1.7,2.2,3.3,3.1,5c0.3,0.5,1,0.6,1.3,0.1c0.7-1,1.2-2.1,1.9-3.1c0.6-0.9,1.2-1.9,1.7-2.9c0.6-1.1,1.1-2.2,1.6-3.4
+                                       c0.3-0.7,0.5-2,1.1-2.5c0.2-0.2,0.4-0.6,0.2-0.8c-1-1.6-1.6-3.4-2.4-5.2c-0.8-1.7-1.5-3.6-2.6-5.1c-0.4-0.5-1.3,0-0.9,0.6l0,0
+                                       C55.2,125.6,56.2,129.1,57.9,132.3L57.9,132.3z"/>
+                       </g>
+                       <g>
+                               <path class="st5" d="M67.2,112.7c0.4,0.3,0.8,0.4,1.3,0.6c1.1,0.4,2.2,0.9,3.3,1.5c1.2,0.6,2.4,1.3,3.5,2c0.8,0.5,1.7,1,2.5,1.5
+                                       l0,0c-1.2,0.7-2.4,1.5-3.6,2.3c-1.7,1.1-3.5,1.9-5.2,2.9l0,0c-1.2-0.8-2.6-1.3-3.8-2c-1.6-0.9-3.3-1.5-4.9-2.2
+                                       c-1.4-0.6-5.1-2.2-5.7,0.4c-0.4,1.7,2.2,3.1,3.4,3.8c1.3,0.8,2.7,1.5,4.1,2.2c1.2,0.7,3,1.1,3.9,2.2c0.7,0.8,1.9-0.2,1.3-1
+                                       c-1.1-1.3-3-1.8-4.5-2.5c-2-0.9-4-2-5.8-3.3c-0.3-0.2-0.5-0.4-0.7-0.7c-0.7-0.8,1-0.7,1.4-0.6c1.3,0.4,2.6,1,3.8,1.5
+                                       c1.4,0.6,2.6,1.2,3.9,2c1.1,0.6,2.3,1,3.3,1.7c0.3,0.2,0.6,0.2,0.9,0c1.6-1.1,3.4-1.9,5.1-2.9c1.7-1,3.3-2.2,5-3.1
+                                       c0.5-0.3,0.6-1,0.1-1.3c-1-0.7-2.1-1.2-3.1-1.9c-0.9-0.6-1.9-1.2-2.9-1.7c-1.1-0.6-2.2-1.1-3.4-1.6c-0.7-0.3-2-0.5-2.5-1.1
+                                       c-0.2-0.2-0.6-0.4-0.8-0.2c-1.6,1-3.4,1.6-5.2,2.4c-1.7,0.8-3.6,1.5-5.1,2.6c-0.5,0.4,0,1.3,0.6,0.9l0,0
+                                       C60.5,115.4,64,114.4,67.2,112.7L67.2,112.7z"/>
+                       </g>
+               </g>
+               <g>
+                       <path class="st3" d="M85.2,104.3c3,2,5.9,4.2,8.8,6.5c1.4,1.2,2.8,2.4,4.2,3.6c1.1,1,2.4,2.9,3.9,3.1c0.8,0.1,1.3-0.7,1.2-1.4
+                               c-0.2-1.4-1.9-2.4-2.9-3.3c-1.5-1.3-3-2.6-4.5-3.8c-3-2.4-6-4.7-9.2-6.7C85.3,101.3,83.9,103.4,85.2,104.3L85.2,104.3z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M132.5,82.8c0.5,0.1,0.9,0.2,1.4,0.2c1.7,0.1,2.3-2.4,0.6-2.9c-1.7-0.6-3.1-1.1-4.6-2.1
+                               c-1.7-1.1-3.1,1.2-1.7,2.5c1.3,1.2,1.6,2.1,0.9,3.8c-1,2.7-2.9,0.9-4.2-0.3c-0.3-0.3-0.9-0.1-1.1,0.3l0,0
+                               c-0.5,1.4,0.9,2.8,2.1,3.4c1.6,0.8,3.3,0.5,4.6-0.8C131.4,86.1,132.3,84.3,132.5,82.8L132.5,82.8z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M134.5,75.4c-0.6-0.2-1.1-0.4-1.7-0.4c-0.9,0-1.3,1-0.6,1.6l0,0c1.2,0.9,2.7,1.7,4,2.5
+                               c1.3,0.8,2.6-0.7,1.7-1.9c-0.8-1.2-0.8-2.2-0.3-3.6c0.5-1.3,1.9-2.1,1.8-3.5c-0.1-0.6-0.6-0.9-1.1-1c-1.9-0.3-3.1,2.9-3.5,4.3
+                               C134.6,74.1,134.5,74.7,134.5,75.4L134.5,75.4z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M148.5,67c1.9,1.9,3,4.5,2.9,7.4c-0.1,1.8-0.7,3.4-1.7,4.9c-1.1,1.6-2.8,2.6-4.1,4.1c-0.9,1.1,0.5,2.5,1.7,2
+                               c2-0.8,3.9-3,5-4.7c1.3-1.9,1.9-4.2,2-6.5c0.1-5.1-3-9.5-7.5-11.7c-1.1-0.5-2.3,0.9-1.7,1.9c0.8,1.3,1.1,4.4-1,4.8
+                               c-1.2,0.3-2.7-1.4-3.5-2.1c-0.9-0.7-2.1,0.6-1.3,1.5l0,0c1.4,1.6,3.7,3.9,6.1,2.8C147.4,70.5,148.3,68.8,148.5,67L148.5,67z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M59,128.1c2.5,2.6,5.1,5,7.6,7.5c2.6,2.5,5,5.1,7.6,7.5c1.3,1.3,3.5-0.4,2.2-1.9c-2.3-2.6-5.1-4.8-7.6-7.2
+                               c-2.8-2.5-5.6-5-8.5-7.4C59.5,126,58.3,127.3,59,128.1L59,128.1z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M75.9,134.3c-0.9-0.5-1.8-1.1-2.6-1.5c-0.8-0.4-1.2,0.7-0.8,1.2l0,0c1.3,2,3.6,3.9,5.5,5.3
+                               c1.4,1,3-0.9,2-2.2c-0.6-0.8-0.8-1.8-0.9-2.8c-0.1-0.5-0.1-2.1,0.4-2.4c0.5-0.3,2.5,1.8,2.9,2.1c1.4,1.2,3,2.5,5,2.2
+                               c1.4-0.2,1.5-1.8,0.6-2.7c-0.9-0.8-2.2-1.3-3.2-2.1c-1-0.8-1.9-1.5-3-2.1c-1.4-0.8-3.3-1-4.4,0.3
+                               C76.2,130.8,75.8,132.6,75.9,134.3L75.9,134.3z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M55.9,160.2c1.3,0.6,2.7,0.7,3.8-0.7c2.3-2.9,0.1-7.2-1.3-9.9c-1-1.9-4.1-0.4-3,1.4c1.1,1.8,2.2,3.7,2.1,5.8
+                               c0,0.9,0,0.8-0.8,0.4c-0.8-0.3-1.5-1-2.1-1.5c-1-0.9-2.4,0.3-2.2,1.4c0.1,0.7,1.7,4.5,0.8,4.7c-0.9,0.2-2.1-0.8-2.8-1.3
+                               c-0.8-0.5-1.5-1.1-2.4-1.6c-0.6-0.3-1.4,0.4-0.9,0.9l0,0c1.7,1.7,4.1,5.1,6.9,4.3C56.1,163.6,56.2,162,55.9,160.2L55.9,160.2z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M148.5,40c-0.7-0.5,0,0.2,0.2,0.4c0.3,0.3,0.5,0.6,0.8,0.8c0.7,0.8,1.5,1.5,2.3,2.2c1.9,1.8,3.9,3.6,6.1,5.2
+                               c1.7,1.2,3.7,2.6,5.9,2.6c2.2,0,3.9-1.9,3.4-4.1c-0.2-0.7-1.2-1.1-1.7-0.4c-0.8,1.3-0.8,2.3-2.3,1.9c-2-0.5-3.8-1.9-5.4-3.1
+                               c-1.8-1.4-3.5-2.9-5.2-4.4c-0.6-0.6-1.3-1.2-1.9-1.7c-0.3-0.2-0.5-0.4-0.8-0.6c-0.2-0.1-1.1-0.4-0.8-0.3
+                               C148.4,38.4,147.9,39.5,148.5,40L148.5,40z"/>
+               </g>
+               <path class="st5" d="M153.7,63.8c-0.3,0.3-0.7,0.6-1.1,0.6c-0.2,0-0.4,0-0.6-0.2c0,0-0.1-0.1-0.1-0.2c-0.5-0.4-0.5-1.9,0.8-2.1
+                       C154.1,61.8,153.9,63.5,153.7,63.8z"/>
+               <g>
+                       <path class="st5" d="M69.7,142.8c-1.9-2.7-5.8-2.4-7.5,0.3c-0.2,0.3-0.3,0.6-0.2,0.9c-1.5,1.5-2.3,3.8-1.5,5.8
+                               c1.3,3.2,5.2,2.5,7.5,0.9C70.3,149,71.4,145.3,69.7,142.8z M66.4,148.2c-0.9,0.9-3.3,1.9-3.8,0.1c-0.3-1.1,0-2.2,0.6-3.2
+                               c0.2,0,0.4,0,0.6-0.1c1-0.3,2.2-1.6,3.2-0.6C68,145.5,67.2,147.3,66.4,148.2z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M96.4,115.8c-0.5-1.7-3-0.7-2.8,0.9c0.4,2.9,0.2,5.7-1.9,8c-0.7,0.7-1.7,1.4-2.7,1.7l0,0
+                               c0.2-0.3,0.4-0.5,0.5-0.8c1.1-1.9,1.6-4,0.8-6.1c-0.6-1.7-2.6-2.3-4.1-1.8c-2,0.7-3.1,2.7-3.4,4.8c-0.6,4.8,3.5,8,7.9,6.3
+                               C95.6,126.9,97.9,120.5,96.4,115.8z M86.7,126L86.7,126c-0.4-0.3-0.7-0.6-0.9-1.2c-0.5-1.2-0.3-2.8,0.4-3.9
+                               c0.4-0.5,1.4-1.2,1.8-0.4C88.7,121.8,87.9,124.6,86.7,126z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M110,102.5c-0.4,2.2-1.8,4.3-3.7,5.4c-1.2,0.7-2.6,0.9-3.8,0.5l0,0c2.5-1.5,4.2-5.1,2.4-7.6
+                               c-2.4-3.3-6.3,0.1-7,3c-0.5,2,0,4.1,1.3,5.8c1.4,1.7,3.6,2.1,5.7,1.9c4.2-0.3,7.9-4.7,8-8.8C113,100.8,110.3,100.6,110,102.5z
+                                M101.1,107.3L101.1,107.3c-0.3-0.3-0.4-0.7-0.6-1.2c-0.3-1.1,0-2.3,0.6-3.2c0.3-0.5,1.1-1.2,1.7-0.8
+                               C104.6,103.3,102.4,106.3,101.1,107.3z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M121.1,94.7c-1.7,0.3-3.4,0.2-5.1,0.2c-0.4-1.2-0.8-2.4-1.1-3.7c-0.5-1.7-3.2-1.3-2.8,0.5
+                               c0.5,2.1,1.2,4,1.8,6l0,0c-1.6-1-3.2-2.2-4.7-3.3c-2.1-1.6-4.2-3.4-6.7-4.3c-0.7-0.2-1.1,0.7-0.6,1.1c2.1,1.8,4.3,3.4,6.4,5.3
+                               c2.2,1.9,4.4,3.8,7,5.1c1,0.5,1.9-0.6,1.8-1.5c-0.1-1.2-0.4-2.8-0.5-3.1c0,0,0-0.1,0-0.1l0,0c0,0,3.1,0.4,4.7,0.4
+                               C123.1,97.3,122.9,94.4,121.1,94.7z"/>
+               </g>
+               <g>
+                       <path class="st3" d="M117.7,86.8c0.3,0.3,0.6,0.6,0.9,0.9c1.2,1.2,2.5,2.5,3.8,3.7c1.3,1.3,2.6,2.9,4.2,3.8
+                               c1.4,0.8,2.8-0.7,1.9-2c-0.9-1.3-2.5-2.4-3.7-3.5c-1.3-1.2-2.6-2.4-3.9-3.5c-0.5-0.5-1-0.9-1.5-1.4l0,0c1-1.1,2.1-2.1,3.2-3.1
+                               c1.1-1.1-0.5-3-1.6-1.9c-1.1,1.1-2.2,2.3-3.3,3.5l0,0c-1.6-1.5-3.2-3-4.8-4.5c-1-0.9-2.6,0.3-1.6,1.4l0,0
+                               c1.6,1.7,3.3,3.4,4.9,5.1l0,0c-0.7,1-1.3,2.1-1.2,3.2c0,0.8,1,1.3,1.5,0.6l0,0C116.8,88.2,117.2,87.5,117.7,86.8L117.7,86.8z"/>
+               </g>
+               <g>
+                       <path class="st5" d="M154.1,58c0.1-0.1,0.2-0.3,0.2-0.5l0,0c0-0.9,0.1-1.7,0.4-2.6c0.2-0.6,0.5-0.9,0.9-1.2
+                               c0.2-0.1-0.1,0.1,0.2-0.1c0.1,0,0.4-0.1,0.1-0.1c0.1,0,0.2-0.1,0.4-0.1c0.2,0-0.2,0,0.2,0c0.1,0,0.3,0,0.4,0
+                               c-0.3-0.1,0.1,0,0.1,0c0.1,0,0.2,0.1,0.4,0.1c0.4,0.2-0.1-0.1,0.1,0.1c0.2,0.1,0.4,0.3,0.6,0.5c0.2,0.2-0.2-0.2,0.1,0.1
+                               c0.1,0.1,0.2,0.2,0.3,0.3c0.1,0.1,0.3,0.4,0.1,0.1c0.1,0.1,0.1,0.2,0.2,0.3c0.1,0.2-0.1-0.3,0,0.1c0,0.1,0,0.2,0.1,0.4
+                               c0-0.4,0,0,0,0.1c0,0.3,0.1-0.3,0,0.1c0,0.1-0.2,0.5,0,0.1c-0.1,0.1-0.2,0.2-0.2,0.4c-0.2,0.2,0.3-0.2-0.1,0.1
+                               c-0.1,0.1-0.3,0.2-0.4,0.3c-0.5,0.4-0.9,0.9-0.9,1.6c0,0.7,0.3,1.1,0.9,1.4c1.3,0.6,2.5-0.6,3.1-1.6c0.5-0.9,0.7-1.8,0.6-2.8
+                               c-0.2-1.7-1.5-3-3-3.7c-1.4-0.7-3.2-0.6-4.5,0.3c-1.7,1.2-1.8,3.8-1.6,5.7l0,0c0,0,0,0-0.1,0c-0.4-0.1-1,0.1-1,0.1
+                               c-0.5,0-0.9,0.7-0.4,1l0,0c-0.1-0.2,0-0.2,0,0c0.1,0.2,0.3,0.4,0.5,0.5c0.5,0.3,1.1,0.7,1.6,1.1c1.3,0.9,2.6,1.9,3.8,3
+                               c1.3,1.1,2.5,2.3,3.7,3.5c0.7,0.7,2.4,2.1,3,0.5c0.5-1.3-1-2.2-1.8-3c-1.2-1.1-2.5-2.3-3.8-3.3c-1.2-1-2.5-2-3.9-2.7
+                               C154.3,58.1,154.2,58,154.1,58z"/>
+               </g>
+       </g>
+</g>
+</svg>
diff --git a/src/librarian/res/cover/logo_WL.png b/src/librarian/res/cover/logo_WL.png
new file mode 100644 (file)
index 0000000..4229cac
Binary files /dev/null and b/src/librarian/res/cover/logo_WL.png differ
diff --git a/src/librarian/res/cover/logo_WL.svg b/src/librarian/res/cover/logo_WL.svg
new file mode 100644 (file)
index 0000000..ac91c2f
--- /dev/null
@@ -0,0 +1,144 @@
+<?xml version="1.0" encoding="utf-8"?>
+<!-- Generator: Adobe Illustrator 24.3.0, SVG Export Plug-In . SVG Version: 6.00 Build 0)  -->
+<svg version="1.0" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink" x="0px" y="0px"
+        viewBox="0 0 128.7 50.2" style="enable-background:new 0 0 128.7 50.2;" xml:space="preserve">
+<style type="text/css">
+       .st0{fill:#FFFFFF;}
+       .st1{fill:#232322;}
+       .st2{fill:#EDC01B;}
+       .st3{fill:#A1BF39;}
+       .st4{fill:#C21E1E;}
+       .st5{fill:#496776;}
+</style>
+<g>
+       <g>
+               <g>
+                       <path class="st1" d="M38.5,9.6c-1.1,0.2-2.1,0.7-3.2,1c-1.4,0.4-2.7,0.9-4,1.5c-1.1,0.4-4.1,1.6-2.9,3.4c0.8,1.2,2.9,0.5,4,0.3
+                               c1.2-0.3,2.3-0.7,3.5-1c1-0.3,2.3-1.1,3.4-0.9c0.8,0.1,0.9-1.2,0.1-1.3c-1.3-0.1-2.7,0.6-3.9,1.1c-1.6,0.6-3.3,1.1-5,1.4
+                               c-0.2,0-0.5,0-0.7,0c-0.8,0,0.2-0.9,0.4-1.1c0.9-0.5,2-0.9,2.9-1.2c1.1-0.4,2.1-0.8,3.2-1.1c0.9-0.3,1.8-0.7,2.8-0.9
+                               c0.3,0,0.4-0.3,0.5-0.5c0.3-1.5,0.9-2.9,1.2-4.4c0.4-1.5,0.6-3,1.1-4.5c0.1-0.4-0.2-0.9-0.7-0.8c-0.9,0.1-1.8,0.5-2.8,0.7
+                               c-0.9,0.2-1.7,0.4-2.5,0.6c-0.9,0.3-1.8,0.6-2.7,1c-0.6,0.2-1.4,0.8-2,0.8c-0.2,0-0.5,0.1-0.6,0.4c-0.4,1.4-1,2.8-1.5,4.2
+                               c-0.5,1.3-1.2,2.8-1.4,4.2c-0.1,0.5,0.7,0.7,0.9,0.2l0,0c0.8-2.7,2.2-5.2,3-7.9l0,0c0.4-0.1,0.7-0.2,1-0.4c0.9-0.4,1.8-0.7,2.6-1
+                               c1-0.4,2-0.6,3-0.8c0.7-0.2,1.5-0.4,2.2-0.6l0,0C40.2,3,40,4,39.8,5.1C39.5,6.6,38.9,8.1,38.5,9.6L38.5,9.6z"/>
+               </g>
+               <g>
+                       <path class="st1" d="M15.6,10.4c-0.1-0.4-0.2-0.7-0.4-1c-0.4-0.9-0.7-1.8-1-2.6c-0.4-1-0.6-2-0.8-3c-0.2-0.7-0.4-1.5-0.5-2.2
+                               c0,0,0,0,0,0c1.1,0.3,2.1,0.5,3.2,0.7c1.5,0.3,3,0.9,4.5,1.3c0,0,0.7,2.1,1,3.2c0.4,1.4,0.9,2.7,1.5,4c0.4,1.1,1.6,4.1,3.4,2.9
+                               c1.2-0.8,0.5-2.9,0.3-4c-0.3-1.2-0.7-2.3-1-3.5c-0.3-1-1.1-2.3-0.9-3.4c0.1-0.8-1.2-0.9-1.3-0.1c-0.1,1.3,0.6,2.7,1.1,3.9
+                               c0.6,1.6,1.1,3.3,1.4,5c0,0.2,0,0.5,0,0.7c0,0.8-0.9-0.2-1.1-0.4c-0.5-0.9-0.9-2-1.2-2.9c-0.4-1.1-0.8-2.1-1.1-3.2
+                               c-0.3-0.9-0.7-1.8-0.9-2.8c0-0.3-0.3-0.4-0.5-0.5c-1.5-0.3-2.9-0.9-4.4-1.2c-1.5-0.4-3-0.6-4.5-1.1c-0.4-0.1-0.9,0.2-0.8,0.7
+                               c0.1,0.9,0.5,1.9,0.7,2.8c0.2,0.9,0.4,1.7,0.6,2.5c0.3,0.9,0.6,1.8,1,2.7c0.2,0.6,0.8,1.4,0.8,2c0,0.2,0.1,0.5,0.4,0.6
+                               c1.4,0.4,2.8,1,4.2,1.5c1.3,0.5,2.8,1.2,4.2,1.4c0.5,0.1,0.7-0.7,0.2-0.9l0,0C20.8,12.6,18.3,11.2,15.6,10.4L15.6,10.4z"/>
+               </g>
+               <g>
+                       <path class="st1" d="M21.3,26.3c-0.4,0.1-0.7,0.2-1,0.4c-0.9,0.4-1.8,0.7-2.6,1c-1,0.4-2,0.6-3,0.8c-0.7,0.2-1.5,0.4-2.2,0.5l0,0
+                               c0.3-1.1,0.5-2.1,0.7-3.2c0.3-1.5,0.9-3,1.2-4.5c0,0,0,0,0,0l0,0c1.1-0.2,2.1-0.7,3.2-1c1.4-0.4,2.7-1,4-1.5
+                               c1.1-0.4,4.1-1.6,2.9-3.4c-0.8-1.2-2.9-0.5-4-0.3c-1.2,0.3-2.3,0.7-3.5,1c-1,0.3-2.3,1.1-3.4,0.9c-0.8-0.1-0.9,1.2-0.1,1.3
+                               c1.3,0.1,2.7-0.6,3.9-1.1c1.6-0.6,3.3-1.1,5-1.4c0.2,0,0.5,0,0.7,0c0.8,0-0.2,0.9-0.4,1.1c-0.9,0.5-2,0.9-2.9,1.2
+                               c-1.1,0.4-2.1,0.8-3.2,1.1c-0.9,0.3-1.8,0.7-2.8,0.9c-0.3,0-0.4,0.3-0.5,0.5c-0.3,1.5-0.9,2.9-1.2,4.4c-0.4,1.5-0.6,3-1.1,4.5
+                               c-0.1,0.4,0.2,0.9,0.7,0.8c0.9-0.1,1.8-0.5,2.8-0.7c0.9-0.2,1.7-0.4,2.5-0.6c0.9-0.3,1.8-0.6,2.7-1c0.6-0.2,1.4-0.8,2-0.8
+                               c0.2,0,0.5-0.1,0.6-0.4c0.4-1.4,1-2.8,1.5-4.2c0.5-1.3,1.2-2.8,1.4-4.2c0.1-0.5-0.7-0.7-0.9-0.2l0,0
+                               C23.5,21.1,22.1,23.6,21.3,26.3L21.3,26.3z"/>
+               </g>
+               <g>
+                       <path class="st1" d="M37.3,20.6c0.1,0.4,0.2,0.7,0.4,1c0.4,0.9,0.7,1.8,1,2.6c0.4,1,0.6,2,0.8,3c0.2,0.7,0.4,1.5,0.6,2.2l0,0
+                               c-1.1-0.3-2.2-0.5-3.2-0.7c-1.5-0.3-3-0.9-4.5-1.3l0,0c-0.2-1.1-0.7-2.1-1-3.2c-0.4-1.4-0.9-2.7-1.5-4c-0.4-1.1-1.6-4.1-3.4-2.9
+                               c-1.2,0.8-0.5,2.9-0.3,4c0.3,1.2,0.7,2.3,1,3.5c0.3,1,1.1,2.3,0.9,3.4c-0.1,0.8,1.2,0.9,1.3,0.1c0.1-1.3-0.6-2.7-1.1-3.9
+                               c-0.6-1.6-1.1-3.3-1.4-5c0-0.2,0-0.5,0-0.7c0-0.8,0.9,0.2,1.1,0.4c0.5,0.9,0.9,2,1.2,2.9c0.4,1.1,0.8,2.1,1.1,3.2
+                               c0.3,0.9,0.7,1.8,0.9,2.8c0,0.3,0.3,0.4,0.5,0.5c1.5,0.3,2.9,0.9,4.4,1.2c1.5,0.4,3,0.6,4.5,1.1c0.4,0.1,0.9-0.2,0.8-0.7
+                               c-0.1-0.9-0.5-1.8-0.7-2.8c-0.2-0.9-0.4-1.7-0.6-2.5c-0.3-0.9-0.6-1.8-1-2.7c-0.2-0.6-0.8-1.4-0.8-2c0-0.2-0.1-0.5-0.4-0.6
+                               c-1.4-0.4-2.8-1-4.2-1.5c-1.3-0.5-2.8-1.2-4.2-1.4c-0.5-0.1-0.7,0.7-0.2,0.9l0,0C32.1,18.4,34.6,19.8,37.3,20.6L37.3,20.6z"/>
+               </g>
+       </g>
+       <g>
+               <path class="st1" d="M51.9,25.9c0.6,2.8,1,5.6,1.2,8.4c0.1,1.4,0.3,2.8,0.3,4.3c0.1,1.2-0.3,2.9,0.5,3.9c0.4,0.5,1.1,0.4,1.4-0.1
+                       c0.7-0.9,0.3-2.4,0.2-3.4c-0.1-1.5-0.2-3.1-0.4-4.6c-0.3-3-0.8-5.9-1.4-8.8C53.5,24.3,51.6,24.7,51.9,25.9L51.9,25.9z"/>
+       </g>
+       <g>
+               <path class="st1" d="M89.8,40.1c0.2,0.3,0.4,0.6,0.6,0.9c0.9,1,2.6-0.1,2-1.3c-0.7-1.3-1.1-2.3-1.4-3.7c-0.3-1.5-2.4-1.1-2.3,0.4
+                       c0.1,1.4-0.3,2-1.6,2.6c-2,0.9-2.1-1.1-2.2-2.5c0-0.4-0.5-0.6-0.8-0.4l0,0c-1,0.5-1.1,2-0.7,3c0.4,1.4,1.5,2,2.9,2.1
+                       C87.4,41.4,88.9,40.9,89.8,40.1L89.8,40.1z"/>
+       </g>
+       <g>
+               <path class="st1" d="M95,37.2c-0.2-0.4-0.4-0.8-0.7-1.2c-0.5-0.5-1.3-0.2-1.2,0.6l0,0c0.2,1.2,0.5,2.4,0.8,3.6
+                       c0.2,1.1,1.8,1,2-0.1c0.2-1.1,0.8-1.7,1.8-2.1c1-0.4,2.2-0.1,2.9-1c0.3-0.3,0.2-0.8-0.1-1.1c-0.9-1.2-3.3-0.1-4.3,0.4
+                       C95.7,36.5,95.3,36.8,95,37.2L95,37.2z"/>
+       </g>
+       <g>
+               <path class="st1" d="M107.3,40.2c0,2.1-0.8,4.1-2.5,5.7c-1,1-2.3,1.5-3.7,1.8c-1.5,0.3-3-0.1-4.5,0c-1.1,0.1-1.1,1.7-0.2,2.1
+                       c1.5,0.7,3.8,0.5,5.4,0.2c1.8-0.3,3.4-1.3,4.7-2.5c2.9-2.7,3.6-6.9,2.4-10.6c-0.3-0.9-1.8-0.8-2,0.1c-0.3,1.2-1.8,3-3.2,2.1
+                       c-0.8-0.5-0.7-2.3-0.8-3.1c-0.1-0.9-1.5-0.8-1.5,0.1l0,0c-0.1,1.7-0.1,4.2,1.8,4.9C104.8,41.6,106.2,41.1,107.3,40.2L107.3,40.2z"
+                       />
+       </g>
+       <g>
+               <path class="st1" d="M24.2,24.6c-0.1,2.8,0,5.5,0.1,8.3c0.1,2.8-0.1,5.6,0,8.3c0,1.4,2.2,1.7,2.3,0.2c0.1-2.7-0.1-5.5-0.3-8.2
+                       c-0.2-2.9-0.3-5.8-0.6-8.8C25.7,23.7,24.3,23.8,24.2,24.6L24.2,24.6z"/>
+       </g>
+       <g>
+               <path class="st1" d="M30.2,37.4c-0.2-0.8-0.4-1.5-0.6-2.3c-0.2-0.6-1-0.3-1.1,0.2l0,0c-0.4,1.8-0.1,4.1,0.1,5.9
+                       c0.2,1.3,2.2,1.2,2.3-0.1c0.1-0.8,0.6-1.5,1.1-2.1c0.2-0.3,1.1-1.2,1.6-1.1c0.4,0.1,0.4,2.4,0.4,2.7c0.1,1.5,0.3,3,1.5,3.9
+                       c0.9,0.6,1.8-0.2,1.8-1.1c0-1-0.5-1.9-0.6-2.9c-0.1-1-0.2-1.9-0.5-2.8c-0.4-1.2-1.3-2.3-2.6-2.3C32.3,35.5,31.1,36.3,30.2,37.4
+                       L30.2,37.4z"/>
+       </g>
+       <g>
+               <path class="st1" d="M4.8,40.6c0.4,1.1,1.1,1.9,2.4,1.7c2.8-0.3,4-3.9,4.7-6.2c0.5-1.6-2-2.5-2.4-0.9c-0.4,1.6-0.8,3.2-2,4.4
+                       C7,40.1,7,40,6.8,39.4c-0.2-0.6-0.3-1.3-0.3-2c-0.1-1-1.5-1.1-2-0.4c-0.3,0.4-1.5,3.4-2.2,3c-0.6-0.4-0.7-1.6-0.8-2.2
+                       c-0.2-0.7-0.2-1.5-0.4-2.2c-0.1-0.5-1-0.6-1,0l0,0c0,1.9-0.5,5.1,1.5,6.2C3,42.6,4,41.7,4.8,40.6L4.8,40.6z"/>
+       </g>
+       <g>
+               <path class="st1" d="M122.2,25.4c-0.1-0.6-0.1,0.1-0.1,0.4c0,0.3,0,0.6,0,0.9c0,0.8,0,1.7,0.1,2.5c0,2.1,0.2,4.2,0.5,6.2
+                       c0.3,1.6,0.6,3.5,1.8,4.7c1.2,1.2,3.2,1.1,4.1-0.4c0.3-0.5-0.1-1.3-0.7-1.1c-1.1,0.3-1.7,0.8-2.3-0.2c-0.8-1.4-1-3.1-1.3-4.7
+                       c-0.2-1.7-0.3-3.5-0.5-5.3c0-0.7-0.1-1.3-0.1-2c0-0.2-0.1-0.5-0.1-0.7c0-0.2-0.4-0.8-0.3-0.6C123.1,24.4,122.1,24.8,122.2,25.4
+                       L122.2,25.4z"/>
+       </g>
+       <path class="st1" d="M112,41.3c-0.3,0-0.7-0.1-0.9-0.3c-0.1-0.1-0.2-0.2-0.2-0.4c0-0.1,0-0.1,0-0.2c0-0.5,0.8-1.3,1.6-0.7
+               C113.3,40.5,112.2,41.3,112,41.3z"/>
+       <g>
+               <g>
+                       <path class="st1" d="M17.8,34.6c-0.3,0.1-0.5,0.2-0.6,0.4c-1.6,0-3.4,0.8-4.1,2.4c-1,2.4,1.5,4.2,3.6,4.6c2.3,0.4,4.9-1,5.4-3.4
+                               C22.5,36,20.2,34.1,17.8,34.6z M17.3,39.7c-1,0-2.9-0.8-2.2-2c0.4-0.7,1.3-1.2,2.1-1.4c0.1,0.1,0.2,0.2,0.4,0.3
+                               c0.7,0.4,2.1,0.3,2.1,1.4C19.6,39.2,18.2,39.7,17.3,39.7z"/>
+               </g>
+       </g>
+       <g>
+               <g>
+                       <path class="st1" d="M49.6,37.4c-1.3,1.8-3.1,3.3-5.4,3.4c-0.8,0-1.7-0.2-2.4-0.5l0,0c0.3,0,0.5-0.1,0.7-0.2
+                               c1.6-0.4,3-1.3,3.8-2.9c0.6-1.2-0.1-2.7-1.3-3.2c-1.5-0.7-3.2-0.2-4.5,0.8c-3,2.3-2.5,6.3,0.9,7.8c3.7,1.6,8.4-0.6,10.2-4
+                               C52.2,37.2,50.3,36.3,49.6,37.4z M40.7,38.7L40.7,38.7c-0.1-0.3,0-0.7,0.1-1.1c0.4-1,1.4-1.7,2.4-1.9c0.5-0.1,1.4,0.1,1.2,0.8
+                               C44.1,37.5,42.1,38.6,40.7,38.7z"/>
+               </g>
+       </g>
+       <g>
+               <g>
+                       <path class="st1" d="M66.5,38.6c-1.4,1-3.4,1.3-5,0.9c-1-0.3-1.9-0.9-2.4-1.8l0,0c2.2,0.5,5.1-0.5,5.5-2.9
+                               c0.5-3.2-3.5-3.5-5.5-2.2c-1.4,0.9-2.3,2.3-2.4,3.9c-0.2,1.7,0.8,3.1,2.1,4.2c2.5,2.1,7,1.8,9.3-0.4
+                               C69.1,39.3,67.7,37.8,66.5,38.6z M58.9,36.3c0.1-0.3,0.2-0.7,0.4-1c0.5-0.7,1.2-1.3,2.1-1.4c0.4-0.1,1.3,0,1.4,0.5
+                               C63.1,36.1,60.2,36.5,58.9,36.3L58.9,36.3z"/>
+               </g>
+       </g>
+       <g>
+               <g>
+                       <path class="st1" d="M76.9,40.4c-1.1-0.8-2-1.8-2.9-2.7c0.5-0.9,0.9-1.8,1.4-2.7c0.7-1.2-1-2.5-1.8-1.3c-0.9,1.4-1.5,2.9-2.3,4.3
+                               l0,0c-0.4-1.5-0.6-3-0.8-4.5c-0.3-2-0.4-4.2-1.3-6c-0.3-0.5-1-0.2-0.9,0.3c0.2,2.2,0.5,4.3,0.6,6.4c0.1,2.3,0.3,4.5,1,6.7
+                               c0.3,0.8,1.4,0.7,1.9,0.2c0.6-0.7,1.3-1.8,1.4-2c0,0,0,0,0,0l0,0c0,0,1.5,1.9,2.4,2.8C76.6,42.9,78.1,41.3,76.9,40.4z"/>
+               </g>
+       </g>
+       <g>
+               <path class="st1" d="M79.4,34.2c0,0.3,0,0.6,0,1c0,1.4,0,2.7,0,4.1c0,1.4-0.2,3,0.2,4.4c0.3,1.2,1.9,1.1,2.1-0.1
+                       c0.2-1.3,0-2.7-0.1-3.9c-0.1-1.4-0.1-2.7-0.2-4.1c0-0.5,0-1.1-0.1-1.6h0c1.1,0,2.3,0,3.5,0c1.2,0,1.4-1.9,0.2-1.9
+                       c-1.2,0-2.5,0-3.7,0.1l0,0c-0.1-1.7-0.1-3.4-0.2-5.2c0-1-1.6-1.3-1.7-0.2l0,0c-0.1,1.8-0.1,3.7-0.1,5.5l0,0
+                       c-0.9,0.2-1.9,0.5-2.4,1.1c-0.4,0.4-0.2,1.3,0.5,1.2l0,0C78.2,34.5,78.8,34.3,79.4,34.2L79.4,34.2z"/>
+       </g>
+       <g>
+               <path class="st1" d="M115.4,38.4c0.1,0,0.3,0,0.4-0.2l0,0c0.5-0.5,1-0.9,1.6-1.2c0.4-0.2,0.8-0.2,1.2-0.2c0.1,0-0.1,0,0.1,0
+                       c0,0,0.3,0.2,0.1,0c0.1,0,0.2,0.1,0.2,0.2c0.1,0.1-0.1-0.1,0.1,0.1c0.1,0.1,0.1,0.2,0.2,0.2c-0.2-0.2,0,0.1,0.1,0.1
+                       c0,0.1,0.1,0.2,0.1,0.3c0.1,0.3,0-0.1,0,0.1c0.1,0.2,0.1,0.4,0.1,0.6c0,0.2,0-0.2,0,0.1c0,0.1,0,0.2,0,0.3c0,0.1-0.1,0.4,0,0.1
+                       c0,0.1-0.1,0.2-0.1,0.3c-0.1,0.2,0.1-0.2,0,0.1c-0.1,0.1-0.1,0.2-0.2,0.2c0.2-0.3,0,0-0.1,0c-0.2,0.1,0.3-0.1,0,0
+                       c-0.1,0-0.4,0.1,0,0c-0.1,0-0.2,0-0.3,0.1c-0.2,0,0.3,0-0.1,0c-0.1,0-0.3,0-0.4,0c-0.5,0-1,0-1.4,0.4c-0.4,0.4-0.4,0.8-0.3,1.3
+                       c0.4,1,1.7,1.1,2.6,0.9c0.8-0.2,1.4-0.6,1.9-1.2c0.8-1,0.8-2.5,0.4-3.7c-0.4-1.2-1.4-2.1-2.6-2.3c-1.6-0.3-3.1,1.1-4,2.3l0,0
+                       c0,0,0,0,0,0c-0.2-0.2-0.6-0.5-0.6-0.5c-0.3-0.3-0.9-0.1-0.8,0.4l0,0c0.1-0.2,0.1-0.1,0,0c-0.1,0.2,0,0.4,0,0.5
+                       c0.1,0.5,0.2,1,0.3,1.5c0.2,1.2,0.3,2.5,0.4,3.8c0.1,1.3,0.1,2.6,0.1,4c0,0.8,0.2,2.5,1.4,1.9c1-0.4,0.7-1.8,0.7-2.6
+                       c-0.1-1.3-0.1-2.6-0.3-3.9c-0.1-1.2-0.3-2.4-0.7-3.6C115.4,38.5,115.4,38.4,115.4,38.4z"/>
+       </g>
+</g>
+</svg>
diff --git a/src/librarian/res/cover/logo_WL_invert.png b/src/librarian/res/cover/logo_WL_invert.png
new file mode 100644 (file)
index 0000000..cc33408
Binary files /dev/null and b/src/librarian/res/cover/logo_WL_invert.png differ
diff --git a/src/librarian/res/factory-cover.svg b/src/librarian/res/factory-cover.svg
new file mode 100644 (file)
index 0000000..aa9bc3f
--- /dev/null
@@ -0,0 +1,52 @@
+<?xml version="1.0" encoding="UTF-8" standalone="no"?>
+<!-- Created with Inkscape (http://www.inkscape.org/) -->
+
+<svg
+   version="1.1"
+   id="svg900"
+   width="297mm"
+   height="420mm"
+   viewBox="0 0 1122.5197 1587.4016"
+   inkscape:version="1.1.1 (eb90963e84, 2021-10-02)"
+   xmlns:inkscape="http://www.inkscape.org/namespaces/inkscape"
+   xmlns:sodipodi="http://sodipodi.sourceforge.net/DTD/sodipodi-0.dtd"
+   xmlns:xlink="http://www.w3.org/1999/xlink"
+   xmlns="http://www.w3.org/2000/svg"
+   xmlns:svg="http://www.w3.org/2000/svg">
+  <defs
+     id="defs904" />
+  <sodipodi:namedview
+     id="namedview902"
+     pagecolor="#ffffff"
+     bordercolor="#666666"
+     borderopacity="1.0"
+     inkscape:pageshadow="2"
+     inkscape:pageopacity="0.0"
+     inkscape:pagecheckerboard="0"
+     showgrid="false"
+     units="mm"
+     inkscape:zoom="0.41876209"
+     inkscape:cx="540.87991"
+     inkscape:cy="916.98846"
+     inkscape:window-width="1920"
+     inkscape:window-height="1011"
+     inkscape:window-x="0"
+     inkscape:window-y="32"
+     inkscape:window-maximized="1"
+     inkscape:current-layer="g906"
+     inkscape:document-units="mm" />
+  <g
+     inkscape:groupmode="layer"
+     inkscape:label="Image"
+     id="g906">
+    <image
+       width="1198.1102"
+       height="1662.9921"
+       preserveAspectRatio="none"
+       xlink:href="cover.png"
+       id="image2186"
+       x="-37.795277"
+       y="-37.795277"
+       style="opacity:1" />
+  </g>
+</svg>
diff --git a/src/librarian/res/factory.jpg b/src/librarian/res/factory.jpg
new file mode 100644 (file)
index 0000000..5843dde
Binary files /dev/null and b/src/librarian/res/factory.jpg differ