From 1a1750d5a6e2337dd613e061518ce6c3dd216ca8 Mon Sep 17 00:00:00 2001 From: tzdwindows 7 <3076584115@qq.com> Date: Fri, 15 Aug 2025 18:59:39 +0800 Subject: [PATCH] =?UTF-8?q?feat(theme):=20=E5=8A=A8=E6=80=81=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E9=80=82=E9=85=8D=E5=8F=8A=20UI=20=E7=BB=84=E4=BB=B6?= =?UTF-8?q?=E6=A0=B7=E5=BC=8F=E4=BC=98=E5=8C=96-=20=E6=96=B0=E5=A2=9E=20up?= =?UTF-8?q?dateTheme=20=E6=96=B9=E6=B3=95=E4=BB=A5=E6=94=AF=E6=8C=81?= =?UTF-8?q?=E5=8A=A8=E6=80=81=E4=B8=BB=E9=A2=98=E6=9B=B4=E6=96=B0=20-=20?= =?UTF-8?q?=E4=BC=98=E5=8C=96=20MainWindow=20=E4=B8=AD=E7=9A=84=E7=BB=84?= =?UTF-8?q?=E4=BB=B6=E6=A0=B7=E5=BC=8F=EF=BC=8C=E5=8C=85=E6=8B=AC=E6=8C=89?= =?UTF-8?q?=E9=92=AE=E3=80=81=E6=BB=9A=E5=8A=A8=E6=9D=A1=E7=AD=89=20-=20?= =?UTF-8?q?=E8=B0=83=E6=95=B4=E4=BE=A7=E8=BE=B9=E6=A0=8F=E6=A0=B7=E5=BC=8F?= =?UTF-8?q?=EF=BC=8C=E5=A2=9E=E5=8A=A0=E9=80=89=E4=B8=AD=E7=8A=B6=E6=80=81?= =?UTF-8?q?=E5=92=8C=E6=82=AC=E5=81=9C=E6=95=88=E6=9E=9C=20-=20=E4=BC=98?= =?UTF-8?q?=E5=8C=96=E5=8D=A1=E7=89=87=E8=83=8C=E6=99=AF=E5=92=8C=E8=BE=B9?= =?UTF-8?q?=E6=A1=86=E9=A2=9C=E8=89=B2=EF=BC=8C=E9=80=82=E5=BA=94=E4=B8=8D?= =?UTF-8?q?=E5=90=8C=E4=B8=BB=E9=A2=98=20-=20=E4=BF=AE=E5=A4=8D=E9=83=A8?= =?UTF-8?q?=E5=88=86=E7=BB=84=E4=BB=B6=E5=9C=A8=E6=B7=B1=E8=89=B2=E4=B8=BB?= =?UTF-8?q?=E9=A2=98=E4=B8=8B=E7=9A=84=E6=98=BE=E7=A4=BA=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../innovators/box/AxisInnovatorsBox.java | 2 + .../innovators/box/window/MainWindow.java | 386 ++++++++++++++---- .../innovators/box/window/WindowsJDialog.java | 7 + src/main/resources/icons/ai/ai.png | Bin 12651 -> 4390 bytes src/main/resources/icons/debug/debug.png | Bin 7001 -> 2998 bytes src/main/resources/icons/logo.png | Bin 11291 -> 148957 bytes .../icons/programming/programming.png | Bin 8245 -> 3092 bytes 7 files changed, 309 insertions(+), 86 deletions(-) diff --git a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java index 7441383..33467b6 100644 --- a/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java +++ b/src/main/java/com/axis/innovators/box/AxisInnovatorsBox.java @@ -889,10 +889,12 @@ public class AxisInnovatorsBox { for (WindowsJDialog windowsJDialog : windowsJDialogList) { windowsJDialog.getContentPane().removeAll(); windowsJDialog.initUI(); + windowsJDialog.updateTheme(); windowsJDialog.revalidate(); windowsJDialog.repaint(); } ex.initUI(); + ex.updateTheme(); ex.revalidate(); RegistrationSettingsItem.overloading(); isWindow = true; diff --git a/src/main/java/com/axis/innovators/box/window/MainWindow.java b/src/main/java/com/axis/innovators/box/window/MainWindow.java index 9f33c61..d13ccc0 100644 --- a/src/main/java/com/axis/innovators/box/window/MainWindow.java +++ b/src/main/java/com/axis/innovators/box/window/MainWindow.java @@ -10,6 +10,7 @@ import org.apache.logging.log4j.Logger; import javax.swing.*; import javax.swing.Timer; +import javax.swing.border.Border; import javax.swing.event.DocumentEvent; import javax.swing.event.DocumentListener; import javax.swing.plaf.FontUIResource; @@ -60,20 +61,20 @@ public class MainWindow extends JFrame { private WindowsJDialog dialog; // 侧边栏颜色(比面板背景稍暗) - private static final Color SIDEBAR_COLOR = Optional.ofNullable(UIManager.getColor("Panel.background")) + private static Color SIDEBAR_COLOR = Optional.ofNullable(UIManager.getColor("Panel.background")) .orElse(new Color(0x3C3F41)); // 卡片背景(深色模式适配,比侧边栏稍亮) - private static final Color CARD_BG = Optional.ofNullable(UIManager.getColor("control")) + private static Color CARD_BG = Optional.ofNullable(UIManager.getColor("control")) .map(bg -> ThemeColors.brighten(bg, 0.1f)) .orElse(new Color(0x4A4D50)); // 卡片边框(使用系统边框色或稍亮颜色) - private static final Color CARD_BORDER = Optional.ofNullable(UIManager.getColor("controlHighlight")) + private static Color CARD_BORDER = Optional.ofNullable(UIManager.getColor("controlHighlight")) .orElse(new Color(0x5C5F61)); // 文本颜色(直接使用系统主题的文本颜色) - private static final Color TEXT_COLOR = Optional.ofNullable(UIManager.getColor("textText")) + private static Color TEXT_COLOR = Optional.ofNullable(UIManager.getColor("textText")) .orElse(new Color(0xE0E0E0)); public MainWindow() { @@ -99,6 +100,8 @@ public class MainWindow extends JFrame { UIManager.put("TextArea.font", fontRes); UIManager.put("TabbedPane.font", fontRes); UIManager.put("TitledBorder.font", fontRes); + UIManager.put("ScrollPane.border", BorderFactory.createEmptyBorder()); + UIManager.put("Panel.border", BorderFactory.createEmptyBorder()); // 图标 setIconImage(LoadIcon.loadIcon("logo.png", 32).getImage()); @@ -122,6 +125,8 @@ public class MainWindow extends JFrame { } } }); + + setLocationRelativeTo(null); } /** @@ -135,13 +140,26 @@ public class MainWindow extends JFrame { * 初始化并显示 UI */ public void initUI() { + categoryScrollPanes.clear(); + categoryToolPanels.clear(); + sideButtons.clear(); + cardScales.clear(); + cardElevations.clear(); + currentCategoryId = null; + + // 清除现有UI组件 + if (layeredPane != null) { + layeredPane.removeAll(); + } + getContentPane().removeAll(); + setTitle(LanguageManager.getLoadedLanguages().getText("mainWindow.title")); setDefaultCloseOperation(DISPOSE_ON_CLOSE); setSize(1200, 800); - setLocationRelativeTo(null); // 主容器 JPanel mainPanel = new JPanel(new BorderLayout()); + mainPanel.setBorder(BorderFactory.createEmptyBorder()); mainPanel.setOpaque(true); Color panelBg = UIManager.getColor("Panel.background"); if (panelBg == null) panelBg = new Color(245, 246, 248); @@ -221,6 +239,87 @@ public class MainWindow extends JFrame { // 更新 UI 字体样式(确保生效) SwingUtilities.updateComponentTreeUI(this); + + } + + /** + * 更新主题 + */ + public void updateTheme() { + // 1. 更新UI管理器默认值 + Font defaultFont = selectFont(new String[]{"Microsoft YaHei", "微软雅黑", "PingFang SC", "SimHei", "宋体", "新宋体", "SansSerif"}, 14); + FontUIResource fontRes = new FontUIResource(defaultFont); + UIManager.put("Label.font", fontRes); + UIManager.put("Button.font", fontRes); + UIManager.put("TextField.font", fontRes); + UIManager.put("TextArea.font", fontRes); + UIManager.put("TabbedPane.font", fontRes); + UIManager.put("TitledBorder.font", fontRes); + + // 2. 强制更新所有UI组件 + SwingUtilities.updateComponentTreeUI(this); + + // 3. 手动更新关键组件 + + // 更新搜索框 + if (searchField != null) { + searchField.defaultBorderColor = UIManager.getColor("TextField.borderColor"); + if (searchField.defaultBorderColor == null) { + searchField.defaultBorderColor = new Color(180, 180, 180); + } + searchField.repaint(); + } + + // 4. 特殊处理卡片颜色 + for (JComponent card : cardScales.keySet()) { + card.repaint(); + } + + // 5. 更新分类滚动面板 + for (JScrollPane scrollPane : categoryScrollPanes.values()) { + scrollPane.getVerticalScrollBar().setUI(new CustomScrollBarUI()); + scrollPane.repaint(); + } + + // 6. 更新主面板背景 + Component content = getContentPane(); + if (content instanceof JComponent) { + JComponent contentPane = (JComponent) content; + Color panelBg = UIManager.getColor("Panel.background"); + if (panelBg == null) panelBg = new Color(245, 246, 248); + contentPane.setBackground(panelBg); + contentPane.repaint(); + } + + // 7. 更新所有按钮状态 + for (JButton btn : sideButtons.values()) { + btn.setForeground(Optional.ofNullable(UIManager.getColor("textText")) + .orElse(new Color(0xE0E0E0))); + btn.repaint(); + } + + // 8. 更新当前分类显示 + if (currentCategoryId != null) { + JScrollPane currentPane = categoryScrollPanes.get(currentCategoryId); + if (currentPane != null) { + cardsLayout.show(cardsPanel, currentCategoryId); + currentPane.repaint(); + } + } + + if (sideBar != null) { + sideBar.setBackground(getSidebarColor()); + sideBar.repaint(); + } + + // 9. 确保窗口正确重绘 + revalidate(); + repaint(); + } + + private Color getSidebarColor() { + return Optional.ofNullable(UIManager.getColor("Panel.background")) + .orElse(new Color(0x3C3F41)); } private void syncLayeredBounds() { @@ -363,6 +462,14 @@ public class MainWindow extends JFrame { }); } + public void updateThemeColors() { + defaultBorderColor = UIManager.getColor("TextField.borderColor"); + if (defaultBorderColor == null) { + defaultBorderColor = new Color(180, 180, 180); + } + repaint(); + } + @Override protected void paintComponent(Graphics g) { super.paintComponent(g); @@ -433,19 +540,21 @@ public class MainWindow extends JFrame { sidebar.setOpaque(true); sidebar.setBackground(SIDEBAR_COLOR); sidebar.setPreferredSize(new Dimension(220, getHeight())); - sidebar.setBorder(BorderFactory.createEmptyBorder(8, 8, 8, 8)); + sidebar.setBorder(null); // top: logo + app name JPanel top = new JPanel(new BorderLayout()); top.setOpaque(false); - JLabel logo = new JLabel(LoadIcon.loadIcon("logo.png", 36)); - logo.setBorder(BorderFactory.createEmptyBorder(8, 6, 8, 6)); - JLabel appName = new JLabel(LanguageManager.getLoadedLanguages().getText("mainWindow.title.2")); - appName.setFont(new Font(selectFont("Segoe UI", "Microsoft YaHei", "SansSerif", 15).getName(), Font.BOLD, 15)); - appName.setForeground(Color.WHITE); - appName.setBorder(BorderFactory.createEmptyBorder(8, 6, 8, 6)); - top.add(logo, BorderLayout.WEST); - top.add(appName, BorderLayout.CENTER); + + JPanel centerPanel = new JPanel(); + centerPanel.setLayout(new BoxLayout(centerPanel, BoxLayout.Y_AXIS)); + centerPanel.setOpaque(false); + + JLabel logo = new JLabel(LoadIcon.loadIcon("logo.png", 60)); + logo.setBorder(BorderFactory.createEmptyBorder(10, 6, 10 + 10, 6)); + logo.setAlignmentX(Component.CENTER_ALIGNMENT); + centerPanel.add(logo); + top.add(centerPanel, BorderLayout.CENTER); sidebar.add(top, BorderLayout.NORTH); // list of categories @@ -468,7 +577,7 @@ public class MainWindow extends JFrame { listScroll.setHorizontalScrollBarPolicy(ScrollPaneConstants.HORIZONTAL_SCROLLBAR_NEVER); listScroll.setVerticalScrollBarPolicy(ScrollPaneConstants.VERTICAL_SCROLLBAR_AS_NEEDED); listScroll.getVerticalScrollBar().setUI(new CustomScrollBarUI()); - listScroll.setBackground(new Color(0,0,0,0)); + listScroll.setBackground(new Color(0, 0, 0, 0)); sidebar.add(listScroll, BorderLayout.CENTER); @@ -478,59 +587,148 @@ public class MainWindow extends JFrame { bottom.setLayout(new BoxLayout(bottom, BoxLayout.Y_AXIS)); bottom.setBorder(BorderFactory.createEmptyBorder(6, 6, 6, 6)); - //JButton settingsButton = new JButton("设置"); - //styleSideSmallButton(settingsButton); - //settingsButton.addActionListener(e -> showSettings()); - //settingsButton.setBackground(SIDEBAR_COLOR); - //bottom.add(settingsButton); - //bottom.add(Box.createVerticalStrut(8)); -// - //JButton aboutButton = new JButton("关于"); - //styleSideSmallButton(aboutButton); - //aboutButton.addActionListener(e -> JOptionPane.showMessageDialog(this, "作者: tzdwindows7")); - //bottom.add(aboutButton); - sidebar.add(bottom, BorderLayout.SOUTH); return sidebar; } private JButton createSideButton(ToolCategory category) { + // 竖杠距离按钮左侧位置 + final int BAR_X = 8; + // 竖杠宽度 + final int BAR_WIDTH = 5; + // 竖杠到图标的空隙 + final int GAP_BAR_TO_ICON = 12; + final Color SELECT_FILL = new Color(0, 120, 215, 20); + Color HOVER_FILL;// 悬停颜色 + if (isDarkTheme()) { + HOVER_FILL = new Color(0x535360); + } else { + HOVER_FILL = new Color(0xD0E0F6); + } + JButton button = new JButton(category.getName()); + button.setMaximumSize(new Dimension(Integer.MAX_VALUE, 44)); button.setHorizontalAlignment(SwingConstants.LEFT); - // icon 使用白色版本如果可用(你可以自己准备深色侧栏专用图标) - ImageIcon ic = category.getIconImage() != null ? category.getIconImage() : LoadIcon.loadIcon(category.getIcon(), 18); - button.setIcon(ic); - button.setIconTextGap(12); - button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); - button.setForeground(TEXT_COLOR); - button.setBackground(TEXT_COLOR); - button.setOpaque(false); - button.setBorder(BorderFactory.createEmptyBorder(8, 12, 8, 12)); - button.setFocusPainted(false); - button.setFont(new Font(selectFont("Segoe UI", "Microsoft YaHei", "SansSerif", 13).getName(), Font.PLAIN, 13)); - button.addActionListener(e -> { - // 切换分类时清空搜索并触发动画切换 - searchField.setText(""); - switchCategory(category.getId().toString(), false); - }); + // 原始图标 + ImageIcon rawIcon = category.getIconImage() != null + ? category.getIconImage() + : LoadIcon.loadIcon(category.getIcon(), 18); + int rawIconWidth = (rawIcon != null) ? rawIcon.getIconWidth() : 18; + final int ICON_PADDING_LEFT = BAR_X + BAR_WIDTH + GAP_BAR_TO_ICON; // 左侧为图标预留的偏移 - // hover 效果(浅背景) - button.addMouseListener(new MouseAdapter() { - @Override public void mouseEntered(MouseEvent e) { - if (!Objects.equals(currentCategoryId, category.getId().toString())) { - button.setOpaque(true); - button.setBackground(new Color(0x4A4D50)); // 深灰微亮 + // 包装一个带左侧内边距的 Icon,使图标整体右移 + Icon paddedIcon = new Icon() { + @Override + public void paintIcon(Component c, Graphics g, int x, int y) { + if (rawIcon != null) { + int dy = (getIconHeight() - rawIcon.getIconHeight()) / 2; + rawIcon.paintIcon(c, g, x + ICON_PADDING_LEFT, y + dy); } } - @Override public void mouseExited(MouseEvent e) { - if (!Objects.equals(currentCategoryId, category.getId().toString())) { - button.setOpaque(false); - button.setBackground(new Color(0,0,0,0)); + + @Override + public int getIconWidth() { + return ICON_PADDING_LEFT + rawIconWidth; + } + + @Override + public int getIconHeight() { + return (rawIcon != null) ? rawIcon.getIconHeight() : 18; + } + }; + + button.setIcon(paddedIcon); + button.setHorizontalTextPosition(SwingConstants.RIGHT); + button.setIconTextGap(16); + button.setCursor(Cursor.getPredefinedCursor(Cursor.HAND_CURSOR)); + + // 自定义 Border:只在当前被选中时绘制左侧竖杠 + Border indicatorBorder = new Border() { + @Override + public void paintBorder(Component c, Graphics g, int x, int y, int width, int height) { + if (Objects.equals(currentCategoryId, category.getId().toString())) { + Graphics2D g2 = (Graphics2D) g.create(); + try { + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + g2.setColor(new Color(0x0162F1)); + g2.fillRect(BAR_X, y, BAR_WIDTH, height); + } finally { + g2.dispose(); + } } } + + @Override + public Insets getBorderInsets(Component c) { + return new Insets(0, 0, 0, 0); + } + + @Override + public boolean isBorderOpaque() { + return false; + } + }; + + // 将自定义竖杠 Border 和 内边距 EmptyBorder 组合 + button.setBorder(BorderFactory.createCompoundBorder( + indicatorBorder, + BorderFactory.createEmptyBorder(8, 8, 8, 20) + )); + + // 样式 + button.setForeground(TEXT_COLOR); + // 初始设为不填充,由 updateSelection 决定是否填充背景 + button.setOpaque(false); + button.setContentAreaFilled(true); // 允许根据 opaque/background 填充(mouse/selected 状态会切换 opaque) + button.setFocusPainted(false); + button.setFont(new Font( + selectFont("Segoe UI", "Microsoft YaHei", "SansSerif", 13).getName(), + Font.PLAIN, 13 + )); + + // helper: 更新选中/未选中时的外观(填充透明浅蓝或透明) + Runnable updateSelection = () -> { + boolean selected = Objects.equals(currentCategoryId, category.getId().toString()); + if (selected) { + button.setOpaque(true); + button.setBackground(SELECT_FILL); + } else { + button.setOpaque(false); + // 为避免残留,仍设置透明背景(透明颜色) + button.setBackground(new Color(0, 0, 0, 0)); + } + button.repaint(); + }; + + // 初始状态 + updateSelection.run(); + + // 点击 + button.addActionListener(e -> { + searchField.setText(""); + switchCategory(category.getId().toString(), false); + // 更新自己(外部如果也改变 currentCategoryId,外部应确保调用所有按钮的 repaint) + updateSelection.run(); + }); + + // 悬停:仅在未选中时显示 hover 填充;离开时恢复选中/未选中外观 + button.addMouseListener(new MouseAdapter() { + @Override + public void mouseEntered(MouseEvent e) { + if (!Objects.equals(currentCategoryId, category.getId().toString())) { + button.setOpaque(true); + button.setBackground(HOVER_FILL); + button.repaint(); + } + } + @Override + public void mouseExited(MouseEvent e) { + // 恢复到选中/未选中状态 + updateSelection.run(); + } }); return button; @@ -570,39 +768,37 @@ public class MainWindow extends JFrame { @Override protected void paintComponent(Graphics g) { Graphics2D g2 = (Graphics2D) g.create(); - int w = getWidth(), h = getHeight(); - g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); + try { + int w = getWidth(), h = getHeight(); + g2.setRenderingHint(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON); - // 轻微阴影 - g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, 0.06f)); - g2.setColor(Color.BLACK); - for (int i = 0; i < 3; i++) { - g2.fill(new RoundRectangle2D.Float(i, i, w - i*2, h - i*2, 12, 12)); + // 动态获取当前主题颜色 + Color cardBg = getCardBg(); + Color cardBorder = getCardBorder(); + Color shadowColor = isDarkTheme() ? new Color(30, 30, 30) : Color.BLACK; + + // 1. 绘制阴影(根据主题调整透明度) + g2.setComposite(AlphaComposite.getInstance(AlphaComposite.SRC_OVER, isDarkTheme() ? 0.12f : 0.06f)); + g2.setColor(shadowColor); + for (int i = 0; i < 3; i++) { + g2.fill(new RoundRectangle2D.Float(i, i, w - i*2, h - i*2, 12, 12)); + } + + // 2. 绘制卡片背景(动态适应主题) + g2.setComposite(AlphaComposite.SrcOver); + g2.setColor(cardBg); + g2.fill(new RoundRectangle2D.Float(0, 0, w, h, 12, 12)); + + // 3. 绘制边框(优化为单次绘制) + g2.setColor(cardBorder); + g2.setStroke(new BasicStroke(1f)); + g2.draw(new RoundRectangle2D.Float(0.5f, 0.5f, w - 1, h - 1, 12, 12)); + + // 4. 绘制内容(通过super.paintComponent) + super.paintComponent(g); + } finally { + g2.dispose(); } - - // 卡片背景:使用浅灰而非突兀白色,跟 FlatLightLaf 保持协调 - g2.setComposite(AlphaComposite.SrcOver); - Color bg = new Color(250, 250, 250); - g2.setColor(bg); - g2.fill(new RoundRectangle2D.Float(0, 0, w, h, 12, 12)); - - // 修改卡片背景和边框颜色 - g2.setColor(CARD_BG); - g2.fill(new RoundRectangle2D.Float(0, 0, w, h, 12, 12)); - - // 边框 - g2.setColor(CARD_BORDER); - g2.setStroke(new BasicStroke(1f)); - g2.draw(new RoundRectangle2D.Float(0.5f, 0.5f, w - 1, h - 1, 12, 12)); - - // 边框 - g2.setColor(CARD_BORDER); - g2.setStroke(new BasicStroke(1f)); - g2.draw(new RoundRectangle2D.Float(0.5f, 0.5f, w - 1, h - 1, 12, 12)); - - g2.dispose(); - - super.paintComponent(g); } @Override public boolean isOpaque() { return false; } @@ -681,6 +877,21 @@ public class MainWindow extends JFrame { return card; } + private boolean isDarkTheme() { + return AxisInnovatorsBox.getMain().getRegistrationTopic().isDarkMode(); + } + + private Color getCardBg() { + return Optional.ofNullable(UIManager.getColor("control")) + .map(bg -> ThemeColors.brighten(bg, 0.1f)) + .orElse(new Color(0x4A4D50)); + } + + private Color getCardBorder() { + return Optional.ofNullable(UIManager.getColor("controlHighlight")) + .orElse(new Color(0x5C5F61)); + } + private String createToolTipHTML(ToolItem tool) { return "
" + "3ZE1?}s_!z?lUyq*dhT!e zFFyPF`Wkim-?)CHpk^onnJoz&?pSDRj}FI?@qOd0@S@%eRZ*CTxDX%5ENdmnZaYK1rh&H6bV4g-Ul8e18A18=J4`2dFq*za~xmCQG%CM?%ori!0bY3q&75sZK z%uc}6EsXySyJR;KEn%eodc=`WZsJCgU$Dk=Q ZiRac~^vj-rP*z~f=je5mVMyz6vi0Ifk1{&+S^eD5 zuw0VIO65yF-x`$hy;P%IoF5!Q(|6d-&4c*LMo0l^(kuQah3P?uHVku*OJ@!|jf*K~ zja!}NH0rqiVp$*UO&_FVH J(jWx9vQT2MxlK-_8P z+uPd40IKjDud;;YIC9j(ko-@7zsdxJA1Im+&l2z1PCHEdKq6?X#aZhqieqJBlU8IN z*^Ke5h4(%0KD+@Tm{%o@n5!L@oERBtYgG+NI*iz{*Dt1vEucHDHwPNZ{)2J$f$v`R zUj3UpJ(iztIu2xDM3WY0zpPC0=pgnvp8EBLYh>q~MB^vG@*|lw6%J?FzJzjUdf%vO zN#TSCoZT&yD=d63`Z{;SJ%j#jmJc%LF>blbO__~!f@@&Dd?TatKPuIoV;x-hP5&FZ z@1O$E{0g$z1vOI(#IBKm1ng!jFS2g_iGrwJLlNR`&d#-ndZw=z37#w**jUK>+25Yb zE*?3HQt;?6wQ `bNUJmZwm&X}Lm$x|XuUC9
o{V=R* z#`aTc90EZ-UG-a>`~AU@7Kn7k&%_Ub-yPIP?Z2@&pa$1B^=^HTev|V N{Ehf{-|N6$>U|q5 zj*OA&R8nu-Hmj9*W%iZ^vL6}$VaQLsBrBX@^OB=s3bzo{oWyuvA#YN*%Mh%yG4;F; zSs6M? AvD|{M{l`XGkbLT zVz%0_ojsO9x*@Mu`;ZoMucx1b5l-)ue^tl1E2NjnM&LFrX@iDFLiL{)0NYA@rEKjD zpxO8g0nK*Q77B{_{;0w3p|$x$3B|DJh@Nd(x8HLnbMg}yzHvjZC&M5k=`UaWN3R)# z(RTBlLaeBt!Q8X=eCAa@s;M(Rqa_k+Xlib5&fOMcND79X6?)mUX(kQ&y6SbgYaF*! zw{v!|@#!^ll@qAntwE>ZK(r0n7#5uE0<>hZ*8aRp;W>^*j9KN9WM(z4NYY1uv?OJr zGa%f2qFz;6u_HXOm6|4D8kjwMv{!^;B8q{8n6vrSsWK8r$a1>mkU^Dm3fQ0O;^yDO zD}eIe5>+7j Fv|T@c;Ckjkxgg7chsh4di?OB@ERlcR&03zM?i9 z84hT?^X2mF(13UB;dg}}QiuPmV4C$1wY;dYzv9FTk*)7i<1UuYM&|NHf_{K}IFW(Z zw%bKrf$npPj;W+U6xDP`;*6h862)!Z |0nzMwW3^Gu)lgLw&5{(O_njm#(42srJVTHlF6_v+7&-wo zJNvG58Kf!N0=tyPUaec^kFbFXiWb0!Lx7tN7yM z?R=*`Sy7mrY0BeqM+Q+2P!t__*}fceJ@baF^K|cl#fuh4$?#fWDBo!nUvgkjwq!NB z^VF^=f;q2wOQb9iyeDT{$9c4Xi3v )RBPJ=@58uIrFt39g89f(~% z#Yn8VV8Irv#-6{gc5~#VJo(}-vz|2X* rkEx zEC01|{yV4Au_CwO0zr$b;?$fhsvDMXmrt!wZuX%#G~rr)?nG^-eA7)p?k&wy)>PyR zlm*p^oX9!+3U6{)VqjzwzNBFO6J(ge!Xg=sF=R)x^90Ss2qyqr%E}6Ya?7GBxUt&* zndTOV^|lkg9gY2YZ@ByU h$+77*1EmuKN>j55 zyeb+T?r5?%)}6aL<=H*nq-I_kE$cKKU~lj5xzO+j#zZ~PMXRW{VbsF&;lC$V3sZfS zX4N~)cVdm)AKAmCuv~2MLe{BfY@fV}NhiO<-xML*ta&J-Dr #`b{ySE5jUR{kl2<1346wGQ&-3WJ!ZY`x-1OT9WotTNZ{;2I#T27D9 MRVM$ZD$oa-yhy(6sJQ|NN>qV&EiDf=t|c%dmX@y>FTnJ?&lZfU4snrB^;gYg?! z+Z+~+B{CD$Y&L*b3~nwi28H-RRyIY-RBj_W&cX5m5TCllF9^4YMJbpLNcwE@Y?7?G zRmw|1_oQ$q1Yv&$Ciy1-4tea=5g@QZ;m)9;^~TmIrmZe5qou^yVKB<11{0aadMYnl zpBIB%b-`X2ujvlpo%(0Hc@lnq-wL=gCC3Ci%*v07Jo64Nah3b9ui`~SJf6vGF1;-5 zJSj(ADq)gmL`Yl~{bjWH!-x{$HZTx9rII1=$<6vL^e}xmQ<0RMEh?H2D!l(u1edQs zKLL|~4e@UCm0Qf$=UZksh7q|8qX0*p2mbOj_JuzqCOTvxSJVyi*@A#9Bg@p8;=1$m zW^5LkNE}W#$e#EMq`D!1b z5P`NbbnDO`--Vr1tMMcZnvdtdng0WfMeD)54xIC5g)t=EO)l!%?_3F?r4Qeg+3mgJ zYR2zxE?)Wh`sTAE#6z>tVWzj$?CN#o(<$>(i5r8+7VDoJI_Sov-bS6mUMI_d@uN|| zYK*p`z5SK M_6x0WiB!(xbEWP~!99 zNBZyb*H wqqzqTsLXuPbDgD={r_lzLe#2{jE0c9ftI}FCx(fWt$A6I zh*UJj!4P}XT?R&(vP(54aBy-`DFy`>htV-bUP}H`!zk4Z%CDY$f|M9iko8*y#+5Bt z1MU&I+0&x0WPC*5jGXb@c`oePcOKMx)GFr)Eag9nh}*WzDc;wq!3iuo$F2fQIGEvD zG7C)s D`08T_Di7L*N&z5e5L6AB;Vqv!xsct zQ3C5QSOG8$$+Ia*UX;qe>e!R$tK;k!rpvQjhmSi_2QB?>0z#w8LRX3ywvT55i}%65 zG7Wgt1G~s9Pb7cyRR%yBd3ZMywg&6l0D7ZWylA;wzzg&n^#)#l${=IJBa-_tlI8sD zWJGx~^VJxv^rrK1t3kYh04r21A++V|Tf`F+`d>KCb{#X0Ku<2&d3VzOXyqg(RX7cS zqVLqGgK>6t@gikAB0*#5EgnhPiP &z`ycY@{1Cx~`8Wg86<|Rc9E^rZttp91T zX;6{}q%joDmTD|p5Wf+_Md(14ahlxjj*TR5(eb^b!&3g|mhvB*wJCjKt3$|)n@(c1 zvz5(1D)D()!ExYyAX67YvZBEzEA~8^7eb?ZZp!6>yrWu?0Mj2Xlq$?SQ0(S;$V@%I ztwinc3nwOF`UeI+76K!3RCXC598+{E0sn!GpMLA^wW|e7-a2U$C;q`eN#6jgo1=4D z4H1K1=bXJz*Lz@Kahdl+$NUfT1z%#GIY!gYs^4jVEwCvvmV?2Qgoa-t)k (Rf*OQ-tHj&$$zTuYVs6Tk7t``>ai z! K}yp%WXJ;*ZK@Q+kl&TWzc5jdGX zeL#){DWEX{HH)$#+PkzOP2(~Bjw6A3!X 3Q1 z)? f+i+1V)y+y0P#iDkJeYs4rsV^AEjN`}<~;Sj)OIK1@zj f3a8;MQd=mBiXttJjW<&$d!bi3qr1O=?$$cBr74mY zl`Y6Qay!u7jh0-YQhI7T8ZbEq9V`|?{% vb+)1FTbo{}D!Z XYx~=lIiUD;N)xs!=4u zr9KWcdVEX;%rZ@|3Iv@adU+%PJX$k0(y}x! NsR0N5g2+_A8MgE*I=w?{ z9*zSJnp-fdC5J>tl+lLIvokw<4uX&4R^2YSZxW*|_YXewAz5!ayH+7xEAz1D>_Hy_ z;kXZl&1ZLj@w0R R$aU$=b9CMw8t|XZZGy;jWfq#D3V!f#Z0w~nd*Fd#N zD<_Ano1MFz83oY}qfxUBZ&3onVqfp79E5jeiQ=#FDYCvIa=~Np; zze0pC0$ymo&fs;Hd05M!^@*{zGQ)#PPVbxJShxU&gAo%!=FNNEf{Zxa9HydPDVBFl zTOy@l3{Qdt_>?5EQoGb{w&Qx|yQY?w{FG^!{j#PTNsPjSRVwAlAMVjf=&WE vFt3|=Quus{G&<{H~q4I1wNQ1kqcg5qDvacD24bSheW zdnZ6 h#GP`Qm_IxI!fUYDOqLxc|dVnal~@6j-fv z40-w|fc}aN`&bSW_=UgtI|_-fmEoJ>nt6$L=O>(8+@)=1gFlTa6+@mhI^2!I+>gnL zQ8%W5ggFA7rO`0N{~L_4K7+@Y0GIOP6J%URQn})%axF1lr}fbCvNDn^z@gmY`zC|y z7?>S)vV>gcD&H=d=+5#2YGN3No2>*?GKn#itMPY~F(|qwJc_3KIvY>Sf4;7g34crR z!CobNK=pM6tuLougLPLzLPAbBWN42kcMS6RL%PRwcX#)9F_phFo#DaOmHw%pf0Hou z-+-JO1(>sHkC>4D_U+Kumb^WcK2JgL8q))jF(n4%9$^`(dVGukXZm@P#)I3ps>vxU zQ>gFl(oFmRSS*GJ`UXRalJlC;ERdl^bgvCkM17{rDL`iLiqv~XKP$)yUsR8%D;VfN zuujXgE4r_3^?8IsImUC}n?iTrt5hF7qr>WvQ`c<}M=N$gdsG3oiz24hqaI(6GD XO`JTn(G-7vca@c-~KB8LJZplt!QR z3&KA%tIMEDn?4WzHH*}Y0+hVPCx>$bIE%H4<*x60cq7+r$YrARWm&tu(lqSM|Gvn! zvHijWQN=DfNT~U_^;xphxJp}AL#rm$m5ZOAT$*q+%2lQ*%$P1nv53gH5oImjU^z;? z9YY>@Dxmy!0XTfAF)!MVY5uchuYK4vOJ^5+N2#bh@MPsLA#mL4oGRUTM^dS;C8PaQ W=h(|t?12BCKvR-agH_9zg!~_WgZ8%o diff --git a/src/main/resources/icons/debug/debug.png b/src/main/resources/icons/debug/debug.png index f7f530fe83d36077e6db06bb07692e2375ae4414..9ae24798ad06678a048f6eca63dad297b0a30d1c 100644 GIT binary patch literal 2998 zcmd5+cU05a68?n}0)(a#KrqD6A&3N75J3VYB%w$VNHBtcNhpG}4U4c!Xc9zv6R=P% zK#;B=(v?tmMLL2jRip`M6h(P)|9$7Yzu!IQ-kCFZX3or+Z@xtPGk7tP!y*6xh!F`` zN1o*Tx)3n$Ws|G!@&qW<5pNDu4JoVufM^gAYvvU0zJ5n6W!eyGIiJ~JGTEqhDYDi- zYa&3^R<-uC1M-nUJD;eN3-*Sc-B0VBgHco_v}K^({4xiS3%>&bii|kzYI1;NUn~@W z=wrYsG$2-?UmkCp0Rr-<#lkyeFt9+LHT27XQh|kjT2-qZ`a*i=UV}InUutHWqOXY{ zsprsk51-uCOaAfa>D;DoN3@q%%)KWl(U&Y2-v_T(c*ZNDv@9PcfX5u)NKg>VuxFzB zL&V(`q5JfV;|v*kVQ!08s&Y84mLQ9%#vd>mJ6=py7C~G%MyhP=zuu%t8} SSvVZ(q|yQvd5T}kL97X0&@(@RR^1;eq|Skbz m&(*H*Ut9~3rds S1>HxAAJ*aAZOE$d8-rL!SnD93AF=ZTb&) ZXj+zR!`=_g|L|ehyHmqfo;z%FFPfMiM39qEv^U zo<4%OUXv{d1Et-EQX7R}zM9ExLUxzZ7P#$5U^pvUZY>&@Z?zEiF$ %DrT)Jx0Mp!GO!Z2C!Qr~b$*o~{K0Y27;j_0gpc&c>KdDQT@-8bOH z^bIIe{jpCOr^ovYD9vi#=*ruckov#^;>~7vuC1HJqu4IEj@dhhuTL&<6#nuea;JOO zI_A}~gQ!tt2fm)>WX{v^mq_VC>Z}(LAo@w596@+`Ea4x5zXaS%Ag# A{R%jU+IGime zxfaYyT{R;w5H}n_F(xUmgF$hj=?hGcRMpefoVrhCx)83<1OBAFf-V%(Lqb@Qyr7$` z0d&BPjH)?3=jnhzBw@E5`DFzv0pb4rIvV$L>4XttqAN}URa>Tif~Td3qeA)vsF>;m z4Mno@FUwtV)PZrtM2V>4u+DSw-Kh|cHjMio+p~W0zWYriANq3~19$O9b)HOV5OcuT zRp_6u+d($F?(e*#78#T4n_n`)ua8;10`kI&XWMI{?SZe&sD3TUayiOd-M8(#jFlaD z@rP@0dCTuPx9oY1NG!S(KE0+J&&TSLj{2vaa3M}gnAf(}OD)+~g-@5&GjN>%y2(W3 z5N%a?SF?masr6GD;eym5K^`EHZmAN1NhGQpLU_vpdlqznu T70hyh6f3x^BLtk}Qq7IF-@5v)P|# z-VBuB-hhf5d%Wwyz6@E^^w-J6bI&x(Qz~n+w{j=oZx_{TS|jqTwomuYcF#=Cj!J6> zGH*@I&y9DA!AmhfP!zH@Dtic(=8~*jx0pkzS+t&)h|F=~5)-r}~~#WaN+U%>hoX zAD!Rtvqhs%qV5jij6vuTcsf)4qV%*^;8#Id9s8DA(o>K? ~`*je~#(j5oVrjG3S*GXi&jYUWy8e?$!#-pQP(wKX z1b>u!Xx}^FVC MASb+2yW{* 2)Wro^W zMfY}1H?7(Ja2b4D6p8okmtMt$HsS-0&b0ZGb~0&9``pPi*orV~7>;iwF {I{3GADP}zmIt%JK%QxT8XHqlr@hqwEBa;X&3D& zg$7F1b#}pbD=3mhkx678NeGPU5oM~hz4##9Tc!2-p3RLcLBxc`Swp?gb7RO5-Y9Jt z+DW5q+z5{`TnBB&)2)*Tpbq$J=?1h%F3f>1#w2SI?R{YbRV;v&RtOXw62>Q 9eFsa%*^T8TJ0R^jlqKJ$Fqn_m$rRTIlMx^tc!+ALdh;ta47G5zNJn!3>poUR4 z5P8yMf18|KKsw!Ylz)1&_D|BDU(JVTT)dgpnf%AD2Ff`Wz3rxQ_S*HDn0&jDyo>0< z0f4DqN4&6tE;KaLAv(y#1-LXHNRm(MgZp77=r7ohoRmnD7Ge+>(V4Cr>oC>DCy7XO zCHY#i>l36A{td%fluFD9x02l70IU(eEa);e2uCNBK9<0Ak~Q9Oz0P xzzok9dpUQEADFvrC7bpD3a}nbdZ7M?!=3~ fP^AV5JCq5K{`@IkQPBObOaIU8bPEg(mN_e zDM5Nuz)(Vc5dtF8Zr<;^|G@qIp0&=IwPwwny=P|6?B{tV{-&`mD-$0R006A|dT29h z`Q_i2fsXpEw5lqg7N9^gT`i!B$iD^v7dZ6Mn&u%6TluWd1TdMs+gk^_yBIxA7)X;H z@nlfz#pJkO95hYrGF*(Q_oZ||*HESmt@YD!jH$l`Rz2v@?2+q%*jwwabDXAjppW{y z&40VaV8PlnV{oQVN^;qER`!3CZeAc>85r1DFI%sQe7DZe#{cG@%Ce~O?H^U^Wu7!y zd0^v59$cuB 2$JUg`L{s;>1+#wCUt;dh4{q~N#OcgXu+Rt z(Hq4h#Hc`G;Xq@by?q{}>)wHkV|#dHv011TtPKVj12{|qM%@VA0O|C>hlrBH^@a=O zACy~7r+{F>&>dDOu@pL-a-8QCL$n4M=QmWKcBFc8auTIrZamq1ABJ|Bl<)bC?n;bb z%?EBytg6J9!+=IXK)qWz>U#X6{!s_2|6$29D^}Ic-H8o;^QS{DfluUFbQ0_L-Cd{X z082}W%%Mhny7`ASiZY7xs$ISJv~(bu*aiSZS{yA?mEnuiSiJN_LBV$K(Kkj>*Gy50 ze}ZsDtIJ%H*Z~1vUgalvbrwLz_$R`Eqk4UR`q86D b-;{)@_^bHJX`T4hJ+Xv#H!oVBvMflEkza*FTl3zp&*vQD z@pos({Q1@crl$;asym@xzs9Sj`Qh?GK8}v_RYF2S^O!CnReu`ju>I%HpGBK2s@B3L zL2}6o?b|Y#E>$Ka-YnN?qq(~`2S9SMO5>jQ9}H0 lV# zho|8cGW(YeCM#_Z9v5%r*V|}9_t=M ean4)6>>a%5M>b zKh9GIm|})mf;+2ueIMV+qlgJf)pCu_7)1yI{Dx>}?*xc@E@)vA->AUyS@I5Z1{iG) z0PWW%nw}7ErcE6QMaFh1$7&TNi7XF+I}hSlvFKL&-!C(iLM)`SOi*2lpw1oO%KXbl zTglA6kC++O0UlMiP5Pq^pJ3$*T3m)}3Is`4w9gz?(iPum5 f}cY#g??p*wk3Sl-FKOjgL!gxYDMNsW&T9|nDlrlp^YIQT&_ebDoa zAq~#Zjz(|$kiE+~W?8 XX)tl6{&g vC3{4JCVqXuTbuC6XE^2zEi#gD!8N@T~e&0Ev?2!6tGqgm N|Md;I(~U3~oNBm8{GO7`8kg2|6X#RgeKhg$dHL3Gdu&nTn!QLWUD^S*G8%kL^B zS?_IL7D`!seIdEW }Z2o;$Gg5>?fTRX3rQ?LTkq&!Cg6J80j o)+HXg=7j6F4D%}oKQ}?&)ip)d zpEt^#A!_otJb`o$71@sUz)kdcTu8}vAqJH>T^JvFSG7wfHXc1Mte*S1H(QY|5t~9( z^F!r8Pu$V`y-%+3B}WRQY+7s;!JTqH`j$ZYetz4aK{v`JRv%c4gQY*Q+d#+bR-H{m zCOK4t7BHzxUk(T@qy}re>&`&BxDv3SNo?X7Euz6+@r@5pWwiJZ_gMD#Y4sL^ mvA59S4bU&fok1q @WhF_nR -Fvnl8+2 zv^_M^W^=7n`CM4RgOE0dGi`P$b_gP`Zf+uh@hDP1uYW~WKtFt5qv}4 &_%huHgnFUc-!1 v=oReaDVM%&zsFAbsniHD=yl3py>w`v<=zFxI
zNOE21mHr_~Z8#I|oFFaGhnkQ_Jl*Rj#O5_@jvx?hZEw=&uJYe>(sX||kq ztTtmBLDQ^!{CE7K)%|e~NpiSfHnBlU#>LQXtES~fTi^0-e^9=EH7}bhDuG5HN;6(9 z&sRpSc(<6Bn7YKNaM&INK_tlBE;h!8+~bMsxUu!p)m@d}1`uaLR?7F2zP!Jo5)&Ai zpAggP!|S5*d!j8aP z*qX0vqWw|`tGON#oV09}xGA>y?ISXRuvaI;L9fZ*tE<4rT5WDKMIBlyUzlldmNSG% z-DMd)x=$CrvEc{P{ d=iJt(tSR=xCsj}7 z#edyvvU3owX}Ezkc7fetNA@Tv^(jm(Z}ZS5>7@8)CP7FmNCA1ckEfo +#mbp;T<+zX`CUhtJ0S%AaBLYW3k*~ zv`!*J|F3y$i?Y5nq!J&y!mcc5-&kJyZ(t{KdpE;5`*)e7 zVIp|wdH*uRsGY{ptpB@UwFovvR;1m_Un`xd<+}ZA+@F-i4T^826s`gU?D*fHV!B19 zil2Ff=?(mBX{}+MnHu?EwlsfN9vA6orJEv>3qUsTMG-)W=dqj4^w)7;B2@wKQ*mCw z5>nr2Xo4#X2)DbB@mYuaR&mc4^Ya`vkD+q@B1lg?HbthwGXhWDFc vz@1c5ZpfsXtJYM$AL%-*VaFvVI{P5r%5->bB$Z*r3-=iYk5}?Qcjc>OV-eGK08XuStZL z-Z8klgwRv@VP@ULfDq12gj4&l@^EXKeJyrdLf~^E%_gWdUzZX1M7SBG2a{$VP|DlH zKzLL5td3d}(8NGO;Ky+OFl45kr;c>=+ci 6Vopf{~1LE3kI~slAtemHbaL>Q` z)-6;MS^sZ>I#Hzvy-KX=<&?z?01n`OjF-J1eONeQ>2|9npzyYVR6b0bweU8F 0SLx*_L>|jDx54550s93$|No-(cs!<4KhsF z==Ic_O)Sg0ad?TdIZEqGhj(YM@;&3J`TPeB;O9raJk+6z+BH9mb+u)~zx@?;k7(jo zVq=T4p`<*SRqi|5{&!<694>PM&|la6&VngV>v30lh#;KIjPMz=*CJ3|{v-il09p$J zPyOV@vuM)Z0i7*d>GL4xuqaNNv<+qQwkhpWF7STlH=94Kt4dIU0q!$D(ZZ1avoXNd zNRCt0+SCSt&y7KHwD?HV>)FPCAih+m_b<2l`*#3DFfkA)sI730PiQ=Vt2Dcmq&Q29 zt^`S}aS{*txah5?&fjJukk# v6F#tRI&MC!FIu(q)=dp{^B2wrK- zJGB;(F&B;AT&N3{!PZRMwK{!{)0KlN-iQ4F>rpc~$*m?kMEka<<|yy_eBw2SbGZ*F z?50o*%%sFx0ZVODXTy4ZsQm8hGIQ~jV2W`?+#?EHh7PAzoTDNxj}YXD` C zJc`Gq7wF7Sc<4)uE8&V@pllLj+~00Klcpv}T3E*`(nZ)jU);~h|7{%&50QlZs33?U zs@OjN>M##qeeZKbxT$+-D}2ne?)9P)_GDipF)-4o<-_iA7&j (~5ilp8%L*h8DN4OaIFkl1F(FheG381rVSLFwGXMU!4h$727sQA7 z@x )UP5GvEv zPC!(V^A5!SeslKafIAARN?u=_I}Vl-Av9o2_v(TVcmIYd0#qbpi(fsDNv3Al!dI)> ziA_eh)^k9Wg$EbHfj91FsD!%VOfVxni+%Wsc@UCtKt &pcdpdxJfI7!Lj-P W77MI?X5_8d2;7Vbjx^smPlK(#)q$k?44923$D((glGX=*v`wJ&pM?u45?Q~?j zR_+?aG~JgD2x_(^VMgrW7V*%l;^qT0;j650uc4SLJzdI~isGJ85c2mN11)a|x_8IH z>tc-xFVra2GFqy<0H^>X8KPtGt62#hs87c%#KZf1$L{xszvA3&=4jE^l~_JIdT=>> z%(lSQu3T~s``FJlLxT=7;lz}ihrf8gb%z>fq$~OBm1nlfWbBVKZvlAww&N50*-ItV zS4wMJx}9-_Rm!u_67YwB R8W@wtOZ%D9yYu zVX}OW8`zwpl9_0uT!pQhd#}g8tDw*u(eTC?e9Gvzk>$KVfs9C2i?so-D4SdkMG#6K zgZwWrE&FrD$xE2(cVP;il#lmp&Iqi6TpfS7S-aiEKn;mXDlsWT)%#wpV^6av#}4xH z^M{*xE8pZ21X33A=1V@Nen>Qiphxv@zS`)dK7zT5esfiqKe*9j!6Sd`Eapz7kKxWd zaZW}xzNO#q^HD9$r{bR!vo9X%Oa>5##ujv2m~%ledbf#n_v#QDJVCEwl$@i&NTqYe zNW%6ibZkX+u!6RT3lqr-(0i^vexgL~-&OxKt%(ask{wp0cVEqQ3?N!4zV&?DGbUX@ zM_p11el g4HJ4DM z1DMU~{yEh7mlcnko}T*fg%<}5GvaC$gcDMmC4M}fX8)C~9JsRSMJZmyLJ;V^h% rW5KQ!#vtK>h$JG+>jU^V#eA#5=ASGdh z03j?UOfk9~y&H53EM&c)a6RK^NS1WpLzIo_QXoF$QP9R41s+d@T(t`d-hUj8PT5<; z<*3spgF*X~0v$+nLwP&w#6wI@IB(!B25Jb(fB;$UVRlSU`^-^iG%a&<%XYhM-lL(* zTwG}riMIaNDy$gCo-)DI(Avx(J;{V{ewfU}u&UI>1{v!QOUYD5?%}zo{JI )L;Q zhY>s;bCaWGvzn?SLA<|X<;EK&Sm1=+q-skD?jOk=dE03T9ykxpM=A84Te60p^F}Jy z{E6Po8!gaCG&)=u8!m;t+qYEKkD$sZqaV0^okgcZbV`1}B@pl #G`SiDiE^HhaX z<)CbG=mDe?k*$e*dJs%(TK}pYPa3N^PnX8Bz+;(#U!|CGu07n|wUe1 SW-|)vKJsDT~8yg>+s$F+gE<58B%2^H0 ztCLdN9BjS`Vg7vc_=AM#EWjAOa23H`$a}LHE>wIa7T4v83W#%Y?$EH2$V{>Bh&(wf z;%8AE^ad5#RJMPjT=#EFsZw0@aIF?(_X1Tjq>xucfM1k}x;Lf1H@;p-D<~*9xjxiV zTBqe|FmKBmFNILs=Ki9kByy&8dLAYtz{mIZ!+@G`D2N)0s`0B@K#1#1;lt0t6I#v! za9W%T$qJU07tvuZkxw=KcfR%l+8Rt{VGieeces1nHDsP!-1ph_o +#}7H4^bw@Huj}51afJp?*8*n=$r@s4;?~<1~|X&X%!b)5!1zoVmhy! zp2X{4YZ=bgbP?t^@0w*Fc~wa%WMrz#$~)6kza*sKpvJ8xloOF~VY9rlpCgFh09%?R zZCehn2B)z-c4_{IsGpFuA1?LcwE3r(PcMMJC~@I^xS@@unk4)y7j*O<)Kn>0>dY)A zEV1H(1+S%h?^JtZorr=${mfHUWE04lj}3qx> -7@KJ*{aVCiMmuUZa-4eSx7xV zyC 8Z5mkj`aZ9}b5K>Y}iLAY7HtAV6)Z>5bq@6!y;Tyj?CzjClvo56d zXFiku3T_G18zM@TMUU-E&DnDWCGD>f_OCsM?tEJN{pLObnGH@C K>}zcvc7H6N9mI#s2026cIaJQ`x?JQxT3sp$ocWq_&&uYhQC{ky z1ft!KB;?hAN@s*W|F~l}U*G;jOkMpj4q^Z3*(HT@4+|cAGH(ITjK8{ti1$Z%$GSMv zH>Bi53IJ@rlRNgi2PLo_H7B0AvXMDsT$dP?=en?qNm2u*tPbgIej)SG-EYA>Fd4?r zzZ?Nv(6d`XdP!_xqeA+Es>0xQvff|2%cIjz1Rt(Oss?X13c|Y0-iW%`erqMw%x1B& zu-N&Mv>FiF&MeTLDPG`S@+*)FOG^Cy)_+0XUJY 4VJtR}QkYZq z*h!BHKRSBR7m}#pW%eQvNecwBn5%FoiA?6o1~>8;0`TB(>wo@MfjroojyZtuSL!`> zZ;2569LjC+A>ll650GXkM20v@8Uj=&m8mX+dzW-*G;azcV3$%sfdA8cn83Ao(O{_G zdHNRWSXBlSp1pav8RT*$Jv=v1I)%gCNJr(l?1bL}AFt%X3#|z1=^eD=B)C(DMTb9~ z5KModzyy%W5XNXlDy9i$v&v-Alp9c Sd-Y2x%~r$b3N# z?M)SU#?+%8d>8;g=M`arFRXKP%3f$(X9i3VBp37^0Ndvn&QI3SzOH3mXow<(&Yd<3 z6$PW%l$X-l`j>aNum1iPL6x<8eZDuEvfw|7g1#LeQtm3|4#v(l_&J(OXLVmIB!z4S zfH)8d7Bw0OLSs~jZp}2mc;*cu;0kB&j*uy5{E*B8^ayJ_Ih1~UW1l`K;k7{8MBvJ3 z4)HdpNWkjmGvD1}-t;yla_Yv|5Cb&@e#fA7#j#@_Uy0o|9k`~st4cgnZ=UsLg33Cz zS-<+g#zwo7;9dqwm!Ybl<3EChaJ7Op6JV5M0+Xte8GeFMgemQ+LGg%W#&;u;@(fv& zXPu1+fA7;JRWSV%?{mRcr_a*zJ}P$*A9MBqu+064GwR)l6tJ28a(6N{DJgGOyxf9u zX5)k5YrtjG7D!tyz6i62Vum|%*hj_SmAaK`poKRRw&c>89Whw`dCc&T;kA)NsRD5O zb`%XvL+*2Z0Ua!2U@!6JA};BH(SJEZ6BxjPakv$Af9>0C4)3_%9oZ$<+{DQ$q~eWr zx@^1#@GWUki=lIB`wvg5F0ZHY!mY3NWd7v*R*8e48wf;4UFzl0+S`AEl866qHNT>M YMsp|i@wnzv@5%suj4`@O>vr`204Q?jo&W#< diff --git a/src/main/resources/icons/logo.png b/src/main/resources/icons/logo.png index 15d6b5dfbf9dfae7e785b68b783d3bb6373732f1..9674d6f9fd1c75907d365d335422ea51038a7240 100644 GIT binary patch literal 148957 zcmeFacT`i&-Uhl66;T1PP^2j;ibxTqL$FW;1q78|q6jEeqzMFwuL>wlMS6(>DoRzl zw5SNu3`*}PCG-|rsCOm_zUO?mto!F(-(|0L4&k_G_ROz6&+nNX&g09Ps!ZGWZ$}V> zN$rA?4uY_}g#X#L75p#bKE0d34>~6u)pJPt5AGrG%Vwu@YFD>`3$yK}Klq*T&IJP} z1QC&h|DogFp{|Y~2M{%-vsdrMj((=21GiwGu4asHgOAv_HY~7Vfej06SYX2f8y48G zz=j1jEU;mL4GU~oV8a3%7WiLn0c`67dME}U2iBTZE??WYHY~7Vfej06SYX2f8y48G zz=j1jEU;mL4GU~oV8a3%7WiLb0fAAn#`?Pe{|_6w&ceJI>H^qhGp@7$5BF{S(}o2$ zEU;mL4GU~oV8a3%7TB=Bh6Oe(uwj7>3v5_m!vg<1EbvG{dKc6JkZB*g&Hp>Lw6Ti~ z3v5_m!vY%?*s#Ec1vV_OVSx<`Y*=8!0vi_Cu)zO+ERf@~IqUz$y8!=p2H7_^PLz6n zs+eVgv{&$Uu~^YnNyBFs@pA|1cAj{OFOZJBAELIp>5w17+(Z9UY*(sgLEpy+<9|BX z#2zXPzIl)>7p=hY-CBhXbH|&5^+n@0UzIb=GT*lO-np6PR^x0Ii~PHmJxtI6p2 z`|(8#miKPib&^F&%J9l;8Usa;*!Zsv3;ch?0@!_3>0H#c;O!cSO`acJ>zTvn9(>~S z;q3PJkLYc@^=Bf%U~tJ>Sbe#4;o7ovyvj`jheLEdlGb~Cc6A5p^>SS_C8{gQ2TXj+ z_`~3y+a>u?cJVcJ%EEI95BSt0yY^;P1w&5p+1uamQ-tf!v#DQJX}I@p#F7r7fALIv z#9L`xH7!G_Oz7E^dc!@L=zD_Jqs`G8N=lZ(+Px>l #@t=7Pstj%3KE$02Sw9Pn%4t-WJx!b>V zaT+()thcIG)|zKMV8c2)dtxf>`#>01hSzIydt2Gs<6}OB1u9Nyfq{-*GUDFC{3V>6 zrEC(W!I*TuXh*gqCDC)rrGfsUhe*}_9&Axoi;2jYqv9o1IwjI6wQIoxtrb&MQoP?- zNCD|FTfn~S^fnDbLpU`GtV*wvyYvW}>f>wmfs6C}!xyzr9Xezix&@J(C`#z-XQ@`K z9X )FXRXmkxhUAdJu*cNOKZ2Nkjl#eksA1xyG6hrF#O zY?u9}7-su}!6w1egs2Y7G7V_HI544F8}Z2={Hd7}>5@_IR=dyn@IPe6TgJ)Du;98M zC(k7yNTz~y$yIS5MR0#1yc0Qt)1RRSKO r!SC*l znb~Vjyu&If&0hP@DPCse!Pd&WQ#D|D^P42Oba_VN(}$sEuV<+A`As_m%z0f2;k?b9 ztgpSLe*DR!ECxJc+e`R}nyLj&6^yyj{P(gs0phE-19nd{KC}ioS93S-@YNY B|`%d~a zV!GZqOl~c-znIZ4!GEZPm9u;3lOT8=;>C|;20z4XmPccr738IP-fT*6x$LssVa{kF z?|z~&T={sp_%Ww$QR2iigMB{5 &cBtJdC;=-#=uf``gD z?>U*OS;Y(ow)l&~Bd%pB10*)P3G!Ns%!HtnN8fX<;4$}!h?J)D=`I1Y5hHElS2 b*_2oJ#y zibG}7FkKyw4I_5qCUkl{_N_cc1q-$apXWU!;)yYF>M)gy$Q-OEpj4e!2#Hod*34?% zwd@*$c>NMoMlR2#b>6Whc$OOH@ZL=`N-Z^R4nLbExeY9NQa(i={6Iu+eW*wZSrTe} zS={o3DKV#3V9niOT$V_ZDfKD-^P$G(n%TnU{GV@rsAefzJ<}*A@Krbkj~K?wnVop` zV=2Iiq3~v !0^EXiG|VSjyZ|9j!k*%9L<2|Blzs%)(d zOUsVS%iSY=@?or}uAQ_Z?2r(znhEF)P)!TXAd(evUiL(0*A9&pLghg*rdNE)AREVE z#b5}XbT6y@?c{W1w1`;2JG)#j%aaml#d}1&%DJhxVDMJdkC@X_f4HkP%-^|h7Jb$I zreccRVO6|9dQ$Lf2s1p&Ju(_QvSXn3UDs(s;jMZ*nb$;tE021I+B!wQ@EnIl(eM-( zbV8kOxj_)-=`$_ M+7S<1NU`wKq2R?BglbF#Pd8=+rs!nhXTL{ROCFa!Fk?v$v1TOv#-aL^=jR@#iTG zjdHVRp6GC9+QeoRxET?uQ_A<+4aS`@lDq(e0YP}OjOkLc@Fm0hH7vWXfr@8iaur1= z)Mg*btenFSa~z_4mlx^$Xh{8loPW+5sy7czc_|gr$O~lxF<4SM)nOD?=02`bkAx*ZQ4WOv>+_si<*>+c+~p zwfc#g@=J(s)f;q+0Vk_=OifYfY@-{ QN> zkCCpm`6F8qFYQF&Is+B}P{$uKi=93?du-%$VU(lP`{KiR8FLlHHHbFU;57Ax=Fe>- zpXkn*-Mn-j+NIa+&(iE{ddz0LFQ&94-ep zMX5pU$jn-#*XnMzfYDQSQtXO5Fv+3Bmu!|9JBVK45quIwMZ+9N(Hg7{KGK6EZ!t zPyse%UF DFr$n|fNFFvfWK@{A={3u95Ip$KblBUG%%S}nQkHOuKCz_k38u=03K45*|1o0R-$1&4qHW?68z=c0Ug=XW|ZO%*x{%J?H zvp$HB7%hT#!fshS8vuIp%;?c5cd3M~J0J6cHX~TN4{Wfo+&LoT2WQYzyK)r#W?&~y z(rn6d>+O5IOZH4Rpd3{mbM}^91u_@_!Sv?BFo=89Ej8g7 7qgkwQcsax;#J(#a*|e$5I)g32V%KdErnIxhy*H=+N=Ip&Cv{M_NOuYcz|ctg+WN zT8{M~Tx9dF>+sM1MXJ(53c2;RN#M}LO@(_}AVPShA?N9;{w}ATqHqx02d* aNuPvEJ>aQrHfYpH;{FPzSZ-IZe2Ew>_A+jPf8*wZ K`rq}x)mySg|_F+f{k{F55;;N<&?0=GG z|0KvOf`TOtZoNBLKF!Ff?0%d>Du;Z!KCbOGm4qD^LFW?CTZDha&Gy7gVB1?H9 zl6gadpOnuTvgQZszKxh{T&(%2kVh8Of5cwfL&>tp>H#~%@O}D0gk3y1`tIZ_aIetm z_Z1p43u5BIfKZ-s;0U0vi?)G5h?l4JD;CX6XrZ7&d!(*l|1&U_AY)slzl{gIPh~b= zu$Se~pUjar$c(z>wq2VB25(njME-MdYw86qPZKF*Ft+vyA{yzO1`J_uBZ;wZ+k|E| zzl-Nqup2an6}9FNl}|>1`;g4t>?R|7&oSH@;m5>>RuSI_gFP!dr^A34V5RIO|M?S8 z(lTWw{v_;Pe78#$pP=&AOb;cc2ksF{@_`EXV2=Fpc;okyuO{~AYAaD4P0G|&o-Sg`=4VE{5uKN0h z8_=Jf?a91S{pj7)riOB#EY+ys^UN8L)1}%WpX?d&<;B_|069s}Z`6xgsKDpW6bb(6 zOm{<+4kHi83vC7a`0x<^={t8tC^!OmMEKu;^Qg8wM*0&Y5LTxOR)` D|)B!CYSddJQYTsi7fD57-+h5Taf^_J3p{H1Mt)G-jGz50NUQ1aG zwV vwr@OZNAC<+ygx89g63?0AJ4tltK72MCh->_@AZK0RDtelX=( z_#9jDHakgnI>fg8`O0u$ 5(zJUvBQ7QdL0Wd&Y%A0# z-4AByk)_7`&d6G21mUW;>|S*TK-n7t*qZAXU|y{XzHjdRB#X*3VD_gH6s!1NTz7_k zhT)-)%GToM`*UM;&+)~9UAEgedtkK5MJk2zSDJ3^Gp2c2{~wwicPevc%#nvjNsUBQ z`9Eec^Tzlel>v%3hNg=->oYBQCHv28<7v@MtnYoped#MPM|oj+xg%=3 z5$W>qGwBI|5EX1D{9CBSG;bSy|F?NQNsHy{McN^{^#WK4k3?Px@T(HHN;VS?w G0@@3i|VTqnH45h-L`3pUUNsx-a};f2N-huKTme zY<;+iBihLHsQ3?-7{IcAg4$G9{BsBf9Jk8Im;S|{J6rj^Zd7am6S;gjNwEWdnr2$W z 8GDN)YzJ}{DLwhKrkQrKX;Wb$=(}n+z zJ?l3xP;IDt4hI_OlwGo!?um;o3-UL%gb^}UwK8QEpWww~Pf_>%m>PfhADKVd^~0~W z4@)!T>4>iCKa&T={fIL +Ce_ne0r7}A4f>B<#!eHGf{3uN`|m|HJ~r2GagxqI z!<1Ec9i>!Kq>jM?Q_H^P7}g-%t?B)>dr#YM^C$c$=*Y=mHNjkr(>=$2j-lz+)wf}U z5n#m>d(R(a8>Z$Z=0W<@sQJ@kBhdi^IZihzQ`$ahgz6H4MctbFWKV~%vJSoBi_ts8 zuV>65aflxT{A|HC9Pzih1IIOf0m9Lp#g2;zvVsnV%mI1HzU~L~ZO~t#=Tqh9!Ptj& z_Zthh;VOPtJ@_MDXVVi+iCF}xrsbP{l`a0}>(_>KEytI@D6FBM{M&;wR}MP&%&ELR z1*Dv-lHKynw%Fg%afMDyl+e-lr8z*y^5X938(Xkp1t(d4eLQg|$UoUnLk1{8`Ej89 zR( qa|Fs;4L+k3ZAO1LZGd7b|P;<)7Rw!n 5Sz+eg_LC3741|6}Vul?}XB zT?ir`fUZqJ+4iZAX)`kSO@5W#45q$5Sx6~0Sf1C>GKlS4i7l-nkLoHw`M;s!@@CpS z^`wnZ*$$+=lKU`RS!N8?oLC-<#XU%F{eF6G_JcFBOs{aDGU{=~X?`WT)cz)I`z?XA z=nfo!OT%{FoZAD(0<3u^p-1;4K#@7-?#tb>V%-#U(;>^>rQcF@jlu!IO^Y-n9C%+3 z@;~mo#>11K;~M~5FR|y6X{JNOa4wYD@}E!*UK93e6AyC6&$<;)_#XMNj%Af!Wmaxv z?f#hw(1&LDg*uf*+x-D`8ow` cQglqR+89 zBZ%a@pp#emc;Vfk0Of&5og5WR@LMljMUac%0~8JQ-*=x3P7O&6Upn%q^jmlNMPZ*~ znPVc42#MbWlgA>huAFs4&~A}7fL0(#6O9S9Adj~rXoI|MP9m1v+KK_T<6*@M2Fud{ zs#AQV2slHn$QNR(IEL4*RB-cmP?e%+6F8JYLWuxJHOc*Y^|t6O9X7sF-%7-ZI|`?g zHea1jKA=uI*0nk(+B8>>UELq&Z9 _9MyE%b^eVtuucJom86nB{nKqPZ z1RbkIs@xMukB)Mx_Vp$^mY$ySj{TN+Pv{XSf HmWzZYyvXB_q^C9>@(*+@E@o3Y9B2;jo=j#`KQ?_QH5?kkjTnAdtK4R3jQkS_y z2wqpLf|91^4^rv|{!By6TIG*ZJlhc4n84(e3sz130h8`dr8nJoS*#Ji5XCM-+$@r1 z!c_<#$9118R=&rBygUV>LjsybY%j=G_yLjpTJDWt$FklBt+?}|O7*PWIYcLXb~|jx zeLWB~e5s$5uiQ^+-)+1JY0+$gdq6n0<|V>3%-_dVPKUfCmZW1$tG`MwE%z>5_x|aU zh-C&yDDaykADG;E6==+eq|zGY^h1&wP4>#K0m&Tv;Hb26;$wl{N3ucD$F*Z!9vb~l z90`zj1uK5qhReGFX;iM?svP)%w;Ofq1V7=0m598G3K=LC7vWR7&HF7z5W{?aMn%Co z{s-k@@RlCK<1b+V<0VsGkFWuvq-Dpm7pUGL_cBiRuN+%a49R;)xc(GEt07=hMsZh~ zIP@KSg6WY#MW<#sLuMm&t>~E7f+z&-XOT-z2V#h=w~o4epw&_c82*w56RbdVOSz(+ z;$S%Wu6dyYK}=4$QHrEd?M^;8m)xypp_Jt349L#1>BjpNtYm5H4p9SMAX3mv%2Mha zdl(_&hlc~Y PjoZ_(lyKRmYR#eS`l9@)x&O27;E=*xBsP!J}< z{Qaf^L{X3PN`-+PPQS0OBIYsTGCVuNd|eSdcGRQ7s=1j`kvRCXOyP2baz?Jn1Cn3Q zHf$bpX!tE_t=2_JmOrDUklrx|pAX~VbPCX%>QN5~i5dVxPtggIfD M-zqjhi7 z_5(f}r 3I9X?3OaKp}cWR0G?E+y6J$v;ps^8>h zg$ZS0jPlP~QH7Npl!uY)4Y^^2yw5*YZ@_f}YliF4QP>`c8NdC#{)^J$;}IuVu7aS0 zbS>DAa7g6+OCg%FgUmdnQUHKw487lF-(gI9SAYli0QV(d{7t&Wit5fi?54>p$McaA z=%DgaX)@l})yu)pZU@NWJC7V27NtK%T}3JWN3A!0NFa&v8~PIR950!PdV#&L4|dr3 z*>NkvWv1dN&&3 yBAsfet%j3zgACW#u zoyFFZXy4xaluhD=#91&Cwx0$8Snswujk5v!t0owcGg?6~i5*J=s~NOWz)=vjC|t(K zsBAgcchQp`sk?H1D3-Z@9zvErwM_<}>K-{Nd9&qoh-wt^fqD+?cK_2=vb=A^+IM&^ zO1V6!vIzLxlI^JE#jV{f#K~6%oHC^gp0f))C**5#j`B87hUe|G%WmIq%~S9Z+@Gpj z4|GM!g*{7Q37`_LHm JUj>rLgQ_wILgt>^*42|>m#9miR9 z2ysqSh?XoUEv$!gco>0Tx5VLHSLumh?`OXG>9g1eA4F)M_yj8nQXG0+^zuaOw#`W9 zBY?vGxbPD!e^Lm1-`X=6!K!P4ta(eOtUc_rr%Ho3`Bw4{Bs0-@#)GiN4+dk||LP$l zk}%iZGj5U&m_E_^qX9xC2{e Kc;bCiALRHV{%wnOBkCW^B$jmE-099O4nP9modI@?cIMa%G2mrp+@6rk0 zY^@zao>N)U?Q7Cqpgf b4W2Jxv5ea`^`&||Fqlu(mKKq z4%L62oX|pE&X-fs8U_gvbI-eIljR>0M5oRn$oU(Z?QJSJcOSU?8gofl;?N>o8jIC0 z!sm}7bxzcr4AbE)&+-DcdoMNo6EG ?vtFea1hN~HSeR2gJN(-i1?f2`8s^Q z_w|a_UxuP3gv-nMYEFtpC2R*(=Zt8da}aE3uufEt9wG6})dwKa^ZzrC3j{X1E5?Y^ z3nLKU6Mga-fL1&6<)&R-yfvJFlg1%m>WR-0=CL5)cW|mU5cp#}kHj!c-6g3l4@!hV zJf9r_0z@vi5zEap@iP9Y3V@bBs%(3y& `V$iMe zFh}x%_-}{66fe7yRoOwA+JoZL* e)9qy z6Y|mz3S|Xm(bL{9R&W(Y@1|vT{-o+yCJzZloH`tyi-o%8vIx3)Xd+WNl@&VDn0B jvb!O+1JSZ@IE zmoGtf#|p_w9Ix4XOxLif{rOV5jyfM7aMxo)0qUcTsnsL$S^ycGI7T`EA#~w(<-plk zuT{sQl`+vz_IvB@{~QA1Au2FAZyPRgJAl&}e+dxB2=?L}rQRTCN?-V2?ZMjVoNohX zB3MTyRB#Q&lRB8)4kd3W=7U|*mpe&JU!@WBE@zJx{wP)e!$NTT9^X0_;ZIA6pw1(< zoLmbCHit`f;H`G`icXB*)aZ=%ve-40-$5vky~c2``n`AS{_;)i2T LlL|kmB_uH5@Ebr^!_oO0yn-lvH&{7?tlo z2sVK~@;A22Ya@Ot1zr6o(C&BIb|m$iG(Vqe(2@oBgz7$&-)B(Ft*R&8nR>%h8vJ8@ z>xz}YN#M`V*8>`owWCD~?IF6K!R3ED3@1$$D9Jwh-hsl$IHGATrgA%b6Y{b=CcSFD z@rf-Pf j$;W6T;8!Lx58vi65mCty!XMD` k(-ja)VO>%Ae6ALiH}Iy zgov4>dj$ql-Nm=-B?LNK!=wT2+iFhi(g<=T>q3>Xx=dOcioot3=J1UurZ!SZ92 Rj91Y4>UayIJ@2uA&;L z{;|4%O ` zA 0Ic{~6s-}y!2spBnP$cwQdkxa#K7VOX4#j3?% zNhSK4DACTl)8xicV+`}2oOq0B@S-34k5?1K0V06}GJEn))o|MZI4EW_rJn+36b?u- zPI{4LIGlAAII3x&&*@5y-?cw5is7Ylo+=nzXgu6m7l0trr@@Z;vvU{a*G_v !30ny?zDJ zPKIoZK`~3DEOgL=(BOeDtASN%#uvaj!0x{0!EkUhyts1ECn}EE_W>G| +nmn;L&t5N>3FM6o0v4PyU!1F^f^T)*H#jR738dlm2%g1 z _o7|xfj|-vR!oxD#0*Uo_Dcv9?MV9uW&)9%5)7R!nM4EkLQ-@|#) zz-##8^Zg-kAh;%XeR>7F4j2euTOD8k*h2lo{rtjKISp211;qfu^#qhZ!F-yGDv1By z5_S)cYGG?$h9m5$ez_xLKfM(}JERKWh}q%twS`e&xz~&W2%J}K3{=H=&x3^?WuO3M z-a%TAfc^R*kWlYscF`+5MM@Opm-fg)kw1au%P^fWi;b<6H^ftLWh!ifr@`2E>+xam zj0QHff(t{MHq9#vW;Le$eIFLM-`w&hqflCVaC}LP5866+*3%(a#ePEot_VJjk>VEn zlzela`C+)b7QO09Vp@EoE{@pQ?_MJ4;Ags54C^j8J{&R8OEQgJ3pO)ay_G^5Oz&6# zTKimx&0#s>e@({0s-@Q%l#C!3KE`5JWh>ogwY|Ul6e&oNxdnzt<{BA737$^rC%r9t zRdqwTtIKgms?V%^X5Wfre*XNuGhc-gmiO-E!mvca5uwPPVVaM^W>MxrBgc)EJKfsEgapVmqm3Qf`75i6v@5y ztdBn}u2DpbWbYaudSe>+etG(y0=XzBJ}yN1R)*K`Z=;H#BZB>3yNLrC%@YXz7}* zDqyLv)UXxfwR`qL^?b&r7C|X>dfQ6=+w6j!w?Xh0?8be)St}Y+xY!?35RdUDeoc#+ zI?3=h)o1bh)0yz>n2^#jI)JC?&){@o{GHI)z;6;#x^zfKxeLZy7r1(HzzPIpLy=t> zv7n;QX-~$y?u6gC>;?81dIS_C2rx*XKLz)CnmV4cAo!jxEtJFT?UKmis!DSh%*|sd z=_27%?!QD)X1IYTPv@J8`D6($;F(8)ePD3fU!)d88~g88Cn!Gmo$>}!B*AHRz~Vm~ z?rpUE;zgqOO4)E+?0}|z QPD}ll!NZKrmS;I`Z(HGWp|#^c-~8
9ZGAXu6dmh~xFRL6=) z&h;l;e=-nJVX`t^(cecxO_42~PoUyYuh3prnPj8{JQ&E40sg(|hjql;g6KG+5{5bS zv;(Yr@u7sM-0-A}>RcWN;lqIU{9VqAQa>UK$;!V(bUu|fMibqSqWmfsKY8T@60!mb z6PIi+>BgL8Z--b1u1T4{55g(yi2S+>9VEMC0IIeGE%@#>WN_J^B*z|3kyD}~4R{uj znp1%78taAadxlz|L3%ggv=7y%0LNb9ozg2C+(oHMP!oV3oojLGvMYJ$(vBLC0fi6p1`}dj%xQ{YcVm+Rp-_rQeiI23 ztkn1$aflNa1K)3%WT1_z{OdP-neg*z+1uTX>8RSmaf-iZ`$*hJz=OsF)eIlAAEPaj zRs_LsUkx-+4&9B^G*)8;xM`<}^0TuU!O?C-Q9~2n3TrG#RaN)nC_l#bSWMS1bAR^? zH!9u$TpjkM2%UKElfnQB(jcnJqzMy%nXkuy;Lke5jst$gMB8BC+-}z?$|624{~aHK z^)&h~+Ecr*{NobT1M+!@n*VV(_$VI>Jg@VqK6?47=(IY->tI5)_S#v@CQ5YzcjRiV zBMXbU47sQ=t8JJBJ?Bu>{)&CePBf+Vj{JO teIk!lcIISN|9Iw zcu i86HZwIG?w8YfgT`k|-kx zjGW*Ch~@K{*b`}+2i};JJiX5j%!Phvd u{$EBj5WzJ? z_Ts;LR*WUBbrcL>Z?1vXR=NJyrDzu6=dRCmG;JV^wgL*}QBD-zj`qD``wzSm7?zL9 zy1_>`P+seWkK)XV-33v8j{!?3Xs@v(EL)%@&r N{!2j%)eW=bL~dNt_44UgVDB@wBnv$xgdjZyrZJRwEWt_1d*)! z7Z#4C$vm{$Vd&fW)G++iPTlsbtviu>mzk4cHALG|n+up k4odbcxxxFKDGpKfhP|rA;cR_sp41$fqVd}<&cfYq~(Cujav&AxCN{Mv*CW7 z!~0g^2CIGB1G|J5qu*rd5P{D*K C3qPeg@XX&w4-bpE5`~BD=*;zb1^jXiWarZxI3*+!3}x96%_?qzw|jB z6m6b!H)#U0I#TeazpFkP?Y1rm(hbd9{?0nsICxKjYHrhREa9#SCb z!wEbHT2Ef;N4kt6jNSYlv`BgKb`(LMfoU_OIg+?|e%0LdUvKe+x;9ME`#a0rY;JcW zPv(Kl{8Iqx7YOChRx0%ZzGl@=dSUjf$^h`Ucc2fX IFP}A7Nv_U& zt@H@0h~V=3c9B9*L0NRErV! >fb9el1Vurv&hYav#x9W%haBzrz0A5@Tv# zwC@dEH%JH+l`jGDQh&VZ6HK39D``#g>)!Hq?`Ra&o075py0>>^gxx-WHLrX68u#4F zm7IwY08ik;a;?WYK%UpHlV0Smc3PcyP6?V>gW(ubtUU1F-r9ESX?Gc&=O1}u_Ix=y zplNn4g;3A%bFsuAz4Ud`=vXO?d2pc))4Giw^o#7Efr-%H-2lVuqZj2VEj38GB=YNp zSf0pRm=f1^q;$D5WByWg`HmjSXav7X#iBq18@1M6uFN&`mpwfQ){jK~8f1Zq$CyE% zwpN4w8sdurSzfi8l<|sv^U_O!Az#xnoQ;GaOA%^`8R Xk{s <3?*l@jZzlA0*AV;7RNuj}m^g}+p zz!EL9nXCUr_~0}FT;7CrWk69(95IPXa8nlK6?#c*uLR*kz~!g8{v0|%gRKcRuoUEE zEgsVXz29|+U+N$pje52)=DQXPXA@SGsl!@!&^ih9_6{r)BA+z-K~ *MKO5MN&wyJ760J@A6QUF{RR+BJS09=cs5y0T~ zJfoMpn(p&4gBq$mV(Vanr#q&W5|C7)IX{@~I&0wVwRBvI;s-!|0L)0d!i(e_P80Dl z`2?2=FMJ6#Oz{tHYnOo2#%$$J;}O{&y6m&c!=v(AtAJq&Mw^x3V1d8VTjV5WV&Fmq z!PLT20ogS&d6|l~ljsf(21M>7R2}X@)uC}z{-`n}UGbQ%ODL-Z+nEPH =QvwWkP7)sj}JE;wUv%@ZKYTO)`^xp-s6e5lTHkT>^I}LmH6X zl(=;IQ{;JVKT||)z0(+#qgFx$S%UTZZBFA`@{KvjQfJR%;^RBt>c7xfTK;FVJw0cH zS64XP3eb(k^?0c!ZINo8BL5HhO$?I$F<^&|o9AyB* -T4z3?( znK7L~k=@#Wn)WM^bd|bqVDXA|64$~Gs-$3dBT(98 S`|X` zK_)EG-Duzyozm*A3CO$}(5;wGS_v`VJ};Z(Q+@E5noYG|*?C$) uS$`LRBJy+v7j_S8sRb{7i{7q WHy?64b=tv&^HsYu)teko8EH-XP78{Zn2M^(YLKD`fxv#CQWy6+wcNy<_I%$$ zku8BQ<*9T#E#EOt>w_0y#@XM9tL6M@Ca_tjWbN^zAt2P0VW@eN&7a3l74$mVTTdO| z%Kfl?vWnNscS!Aj zF-*DRDv8J*boVxRJAy~nn-=*Okn#q&>RvHR`tgHA1vY@F0Tix`=gUcYk(86PZ;95Z z@m{61pe xNfd9CI?i|6C9S6r-+( 5d@gVr(e98;hXSCuCsEPqP0t%x-AV>&0z|aN& zVfaxD3n!*%suE4!1MF5P1xn{{Py}cIe$c)xqCsy{Ml9}PM2ECaP=i1$)}AUw1G@5* zBG|xV3`>Mq@1;f0F^at5`?K=Mq@V<^!?fD#A$!)UYgKcu@alB~1@ zzuc_H6(6{NEbe^oH!12+jvs${#GT7f2+fX#)pQY%7!>4sfC|A#eXeD NxbV_0A;M;@OMl+q1B(Sg)!h3-YSBL3@!~Ci(e=aRt%jAuXomvuPU}#mUZWa!o9V z;zaTzKu6V3Z#d2Wx4EockROsEbEAjVb)FDy0OfPZtl(wvu%jIE`cdP<&Gn_$yS<@( z2(}B_KCQbM=&rN`MMYw|<{!N9uX88l;+1l8JC*|g(D%^sjOHZJ7w1B h;Ahn1wa9vRLueu=} yDNEWjaLPfF}Fgbs@vj3sgLlmAjm{qw|4;-&Za@u;f=~1)`B{Q15Xt23xq! z*6S+x1)<72X6XYDyQs}5;K{BHYY+VC@`c;C@A>&0C~$BTxFVDP&8G>#Tk~9XLy6=H zA4NhQB-HLk-vE~rYD4F~{N}q^sCiGF(J3atH^GHvII_;iML;4J102Kk1MP4cYMV1> zF}$^6MmNs?qqqx7Ti}|+(}; 8Z;7@o-J_qTz}E1mBv)O8<7^% z1l1fUELUiH3I6=utm)1IaEz`C!2k-W@3L^zA`CS&($m%gMtoYfKY `=dN0&A39eES7wO<~BJzD*5 z_kz_f3?>k)-%+!X?-FP>d5t4N6SiOr->IqV7>-ijm;+}&+XSfa{8;-6f=>dW`X4k0 zh;b9A$VE!hjCHC7Q*6LxPC+mNdqijv_(#PIL5ouq^8Y$ygd$lb@lNO@{kUy0_;w>b zQWrup03)%5RGGiyaSVnItENvqV*IaDEtonh1ix5SM>ssyWbNu7aJv1Hh4==HN8C^k5SAlT^& zWetD9%?6 eaF(YI*$4G3AAsvRb2`-qw%3RDnyT$1r>v5 z8^V*uZtJmlno d1j%RQj+`;%cihJ)I z<=>9<91wnf_gOfFj6zLVqEvp|J4F#-Yg6yu?@TKlGw<|H-U((}vBTK4&Tc|F{vkp8 zuUk<}d^~z9mI2~9s2-<5Pk98WKhb8qZnM>(K@VBzU|O;LsDZbCvFy0}QwDfT-XT2* zu0c$MTDw%rnd*^A?EjS_j_E7`hu1R0%_pDmkvZDS#L6y){;YbhEUK1rK4UAA&tCBZ z&J-9x6-XR!2fWe)TEhqGIb~t%e=FoGxeJ1Vs%qn`xB$}vOCye8_6LzKX4CV84>==f zp8`n;BKYrA>vBX)-va1`-+Kbeud}JS VT>iO6;Q*fxYCr5_dfw#{6;(I!FKX^GQr$3~Ta$EvH zI^}Os>G@oQ!^AJ={YNheSx4HCZtHHYUt-oZd_Cud)yR_<@6OV6^&Uy%`_xV&(wE9@ zLGz+$xhC=--T?Tc`t(+;NTA 1#wM_xpuPv#D)>d?bR>lV*&^lw3MnV>@fNB;qf z{Ca@+-K2^Q!)6C%$1OvhKK%A4kROhiU~EzrmOYMpc&=HDRI?+lcqx6jdFBT~&)`q) zZBov3c$_|^A_G~Nsylg6oLZoYVV06%=L$AL CoELq`W}YJY3@tt}<^+dJDr;Z6scC|)S}#LAa}Tu; zw@h%lP-UPIPaLkTUItQy!0oPJa7t4R6!MJp%YoZ^GcN#-E8jWRHY+n%Uf^17eQps~ zQqRo3S!_#i3e0xw$^mNOp7ZBAO=k~|n41MdG;Q=i^`=SJcICu0EzIhN%6z<78FAFm zU~F1(UsS}rLpBX~8P< He=x#a=)GrEYVW_AniCH zP}@fBiThoA=Zh1++C~~&b*=tIdr~zl$vaQ_d09=%6gsbHB=lv8>fT+^YcKaX*1tIa z!|Z;%p_*eR +wJe$MTtOg$;o=LC6`_^nK*9sQ?46jwK zEmW_?tQoGF4_eUCw}2kdpV0b`qUS#P4Es#aKTfV=FmYEUeyJNg8npQ7(z({DzM`me zv2*I&efn!QON1k2vp+94-P@Kv3ys(jO(nIt9ZxsO$2ReX`Iumq21}WXcOhs3JOKMH zW|&JPc! jO)e!jg z)l1JdBOah#^&W}56WY6rgJnvlF#AL4MBd0+@!_@H1+9=(nKjUc;KQZaDDN6@gswBa z%*vo# !KE`jY_~*>snYV5@1Lo=KR!P0LN-p5ZOp{9>sey z_W*;u^O}js)AJU+4b%mAVHs(s%Hl4NPU2S=4xk{Sealwk*a7CwZR?(In+*W?n`g`g zZG<+aB3oeK+f)$zx=mB=a_WF=p3ivp-8N_;) rbS0?i?|H(v6TFEsPjhUg5^M3QjRz0bJI_=B1_Q-b<@s1aC0$ z3uT1Lx|)V$vVg^dGlQWeO}u6#=7&hy+ (WXT2XOH0p}c3&a;mCh zYAVuJ4+n~&v@}r6xEb%ZFmwI718YL%;z*$$rfVgpl8Aq){zs gRjbhR*9-5 z;p15^1%_1IEX1Jb(9;7EDGNnBvoSY?Y H)Tdd=q^s;myQ_g#Qc%J&lDU?9R4Dtg$y2qQg@A1l@ zKm;-R0AJC16|t!!VlcojGa9_=uu!yY3L*)A)`=SeCDIW>Ymv?Cp*}O&1L!{Us1yk3 zhL7=5KW(PnPm;MgaN)d5ltT=}mDbz=w;YVZFf%A&ex#>uuLVVKH30O0@WK+-WtvmL z9QV!$py=? z4>NggcjpML=P$Xn12xzl48W zyOMLlVNB2q_W)R-g{8y-Z=dfAV-l~hK71y~blj;vlnYSG7IUBp06#T(xc2>Vl9W;1 z|KrBsmO#Cf4;gK~jl|66`5nMlXydK %ol+U#Cy{$23{5!eDY~0!dwe2 zmY0|f{OAc_Oxxv|GfHaSt+;f;$yy&&%he%uk|9+s?EQ1(Ev@Rf4uRKwfG9y&Fb<+0 zz5nTgY~CwdjXkvPMT}c-6 U>HBV(+xbmBQ-8` z*W+TJRNE$emr(@~C>LFO05ta}mKOCdJpqTpe_m4l1PS^QwOr@v0NoZ;5EjW^Qj)4_ zeQq)TT)f>4X^4@FF-o`$Cs2paD5jI4;r@y{@ XbJdz(1i=*I5r% r>x@sI@D09}-zG zJU6uLVkWq7#BR2=As^sd25akX>M?b>22KA)>MDvsr%uNYK#-((ja{wv8_|*z7ooP< z4?slMTGKVm>L89Jx(1K}r1~1JxUkZWi?MynV)&o kP)Qlk{9>$m&M=)pZvSGxj7D?e$E7RA6mD%7v!1Z!F6OG;>dD3<$(e0PP zcS@YIa~Q--+*2*Gey!jJs6+s vQzA~eC% zQS}Gw?aGl=$97F^*P=Sw+Ru3Hr(g^6=H}bStcU>dG=^9C`j>@WB@g{~p)$Z9RCx8t zq`Pv};V1Z>hzQ2i8IDYi^t?e?VJP)oc<^!<*L4mg@`VV7cWHoB80T#@^y*@y>~E4^ z^^n3H(`=Tw(B9IFnMa4zNHUrB (T{>l1iwgCc13 zWyg0MJ`p}i?tOiMRr}W#l%n4QrF9#lWlmER0&q9C3;6l~KloBaS6dsseoj&Jiq$wP z%3%%sp&QC((NCyf_>6qz;tY=cC(&Th30E|U@5FfQZlN-4e-@T$t>yn2ASs%HKShFO zV)MEI+a~-u>euAN&ZoT7rbl|TQGSHDyI*P;ai`v7ukE#{JPk_cVm=<;i}wEeZEBbH zk`nL@EsvY@54SHo891*W7%M?5eVO`NIn*T~$YqUYOnl5VQc&frX=22edNgyJa^Z^k zf-#9EP1e6%{}Pz~+xh`g$5D Q1frn117iRMXWNeyMY){0j>Nx) 4CrZ z(@{olxD!ilOIB`C$s73gUGEW}?on68LkVJ-^f1;p=d*~)1`8MtudhUd^`tVO{ha}i z-Cs5#mN#N>Ql;%?tObw#zx<<|7AVGKcWbWb|6uFO U0F)ef+C`X-j$^o z3Mpi1Ls_OpCD{ozm{z1n*|Lomsdv`O7BN{;wn+*h$~GkHh#Bkeb?%+%{r-F(zx$8g z@5kJG&pqdLUa#l#`FfpmBrTMu#I7)NyQ9YhNi#AOel6+#uP9hyQ{1_$aldi_R!KLQ zF8G=`(d9;-H8+{jXm@=;(Qop1|5)(jY++d4qh EYUnz-WW0y7q;m1q8y+?|ZJW ^yBOBOar z$=@J&oe?N&6C!%UKKP~Uu}gCo-7)s GCxtzi)-xnorm zW_x4aZBBCX(v^EMYtJ>>1W&!Xf9Q2@s|s!Acb{K-nE=m5SNvITXMUrvmsP+~-`;uu z_^y+rmqwo-e4BtyIBz)CJ&@xtW=EQN!r`Jn-HZRAZbKKfC5r=2cd5*0*Cn+zd#+s= z2--#ySX=5_XmiNN_Y*~d=hOf8mR2TiQF3}y%!GaFl%!#U&Avw2#fEN1Umt$v{cz(S z=g-RY(SQ}vdMvf(qSw21(O@o8tmy7dpS&6TZw&b2^>1S&ld6~xII-(Ga`KJL&E9>1 zNw&y!btp`aVCdJcv8@MA@xJ_sHqXT?X #=~g zHLE= iU^%7H@ARbB#aSJvC;f4OB5rg=MZ8C+m5DH_RIOQ6|=U$pE^V`^=VuQ1nb(mY=uN zm`{>N)%{<)Pgm?P_3v^M*X8-Rkq3m2>poLo2kGhbL(qcdHyBcLZy(o(rXJf^8E+33 zc>MoZ;P}@Cpe9Lm7cpye6!tA!AuV{>bb;2EC+*XuKEJ}5H&RY=|G(Q{{&i}z)&DBG zR;IY{f!isorv})~Es0Y}-L}#hP9#5GXrUe?R?k&N2`+?f9AcqC7q2mb3Mx-nh>&yn zf3WgYSg!=Y!n0wbDlKIwp)ZY6Bs%D{VZdCBjABKQs@_}~NBFR}R~`q*E`()jHz$oJ z>a%BVOK3v3QbTh{XkL*Eh|p2+3U?9a1%17j*p~a&RK`+&AC7U#)Jqri?*fnOd6t+M z (?!5Yu<}w@kfgcE{<_2-+Ety420}A`aYGfo{!c*L0l##VjNJBhcI`T{&*7z& z0~^LBr!zPdmLzv7VK&4@Z17z10d1D|#>F&)