From e0bfa3c4163e247cf2a88a59abd183a2c65b7aed Mon Sep 17 00:00:00 2001 From: Sander Land Date: Wed, 27 May 2020 23:08:12 +0200 Subject: [PATCH] icons, timers, menus, player setup --- LICENSE | 6 +- katrain/__main__.py | 41 +++- katrain/core/constants.py | 7 + katrain/core/game.py | 6 +- katrain/core/utils.py | 12 +- katrain/gui.kv | 213 ++++++++++++------ katrain/gui/controlspanel.py | 39 +--- katrain/gui/kivyutils.py | 116 +++++++--- .../i18n/locales/en/LC_MESSAGES/katrain.mo | Bin 3795 -> 4201 bytes .../i18n/locales/en/LC_MESSAGES/katrain.po | 31 +++ .../i18n/locales/ko/LC_MESSAGES/katrain.mo | Bin 3860 -> 4307 bytes .../i18n/locales/ko/LC_MESSAGES/katrain.po | 44 ++++ .../i18n/locales/nl/LC_MESSAGES/katrain.mo | Bin 3795 -> 4242 bytes .../i18n/locales/nl/LC_MESSAGES/katrain.po | 44 ++++ katrain/img/back_-_parentpng.png | Bin 0 -> 2976 bytes katrain/img/flaticon/ai.png | Bin 0 -> 5232 bytes katrain/img/flaticon/cogwheel.png | Bin 23456 -> 6831 bytes katrain/img/flaticon/floppy-disk.png | Bin 0 -> 3841 bytes katrain/img/flaticon/folder.png | Bin 0 -> 2510 bytes katrain/img/flaticon/graduate.png | Bin 0 -> 4879 bytes katrain/img/flaticon/newgame - Copy.png | Bin 0 -> 5761 bytes katrain/img/flaticon/newgame.png | Bin 5761 -> 4984 bytes katrain/img/flaticon/route.png | Bin 16746 -> 0 bytes katrain/img/flaticon/settings.png | Bin 12881 -> 5819 bytes katrain/img/forward_-_child.png | Bin 0 -> 3614 bytes katrain/img/hamburger.png | Bin 2309 -> 1763 bytes 26 files changed, 411 insertions(+), 148 deletions(-) create mode 100644 katrain/core/constants.py create mode 100644 katrain/img/back_-_parentpng.png create mode 100644 katrain/img/flaticon/ai.png create mode 100644 katrain/img/flaticon/floppy-disk.png create mode 100644 katrain/img/flaticon/folder.png create mode 100644 katrain/img/flaticon/graduate.png create mode 100644 katrain/img/flaticon/newgame - Copy.png delete mode 100644 katrain/img/flaticon/route.png create mode 100644 katrain/img/forward_-_child.png diff --git a/LICENSE b/LICENSE index ba01b65..538b16c 100644 --- a/LICENSE +++ b/LICENSE @@ -4,10 +4,8 @@ This repository includes: For on related licenses for these binaries and libraries see https://github.com/lightvector/KataGo 2. Icons from www.flaticon.com, used with permission with the following attributions: -- New game/Load game/Config/Config clock icons: made by Freepik from www.flaticon.com -- Flag icons: made by Freepik from www.flaticon.com -- Save icon, Pause Icon: made by Pixel perfect from www.flaticon.com -- Next/Previous icons: made by/derived from ones made by RoundIcons from www.flaticon.com +- New game/Save game/Load game/Configure icons/Flag icons: made by or derived from work by Freepik from www.flaticon.com +- Next/Previous icons: derived from work by RoundIcons from www.flaticon.com 3. The True Type Font DIGITAL-7 version 1.02 by Sizenko Alexander, which is free for non-commercial use. diff --git a/katrain/__main__.py b/katrain/__main__.py index 70d82aa..ada642b 100644 --- a/katrain/__main__.py +++ b/katrain/__main__.py @@ -22,7 +22,7 @@ from kivy.storage.jsonstore import JsonStore from kivy.uix.popup import Popup from kivy.uix.screenmanager import Screen from kivymd.app import MDApp - +from katrain.core.constants import * from katrain.core.ai import ai_move from katrain.core.utils import ( DEFAULT_LANGUAGE, @@ -36,6 +36,8 @@ from katrain.core.utils import ( MODE_PLAY, switch_lang, ) +from katrain.gui.popups import ConfigTeacherPopup, ConfigTimerPopup +from katrain.gui.ai_settings import ConfigAIPopupContents from katrain.core.engine import KataGoEngine from katrain.core.game import Game, IllegalMoveException, KaTrainSGF from katrain.core.sgf_parser import Move, ParseError @@ -60,9 +62,14 @@ class KaTrainGui(Screen): self.debug_level = 0 self.engine = None self.game = None + self.new_game_popup = None self.fileselect_popup = None self.config_popup = None + self.ai_settings_popup = None + self.teacher_settings_popup = None + self.timer_settings_popup = None + self.logger = lambda message, level=OUTPUT_INFO: self.log(message, level) self.config_file = self._load_config() @@ -114,9 +121,14 @@ class KaTrainGui(Screen): except KeyError: self.log(f"Missing configuration option {setting}", OUTPUT_ERROR) + @property def play_analyze_mode(self): return self.play_mode.play_analyze_mode + @property + def ai_strategies(self): + return list(self.config("ai").keys()) + def start(self): if self.engine: return @@ -262,6 +274,7 @@ class KaTrainGui(Screen): self.fileselect_popup.open() def _do_new_game_popup(self): + self.controls.timer.paused = True if not self.new_game_popup: self.new_game_popup = Popup(title="New Game", size_hint=(0.5, 0.6)).__self__ popup_contents = NewGamePopup(self, self.new_game_popup, {k: v[0] for k, v in self.game.root.properties.items() if len(v) == 1}) @@ -269,12 +282,34 @@ class KaTrainGui(Screen): self.new_game_popup.open() def _do_config_popup(self): + self.controls.timer.paused = True if not self.config_popup: self.config_popup = Popup(title=f"Edit Settings - {self.config_file}", size_hint=(0.9, 0.9)).__self__ popup_contents = ConfigPopup(self, self.config_popup, dict(self._config), ignore_cats=("trainer", "ai")) self.config_popup.add_widget(popup_contents) self.config_popup.open() + def _do_ai_popup(self): + self.controls.timer.paused = True + if not self.ai_settings_popup: # persist state of popup etc + self.ai_settings_popup = Popup(title="Edit AI Settings", size_hint=(0.7, 0.8)).__self__ + self.ai_settings_popup.add_widget(ConfigAIPopupContents(self, self.ai_settings_popup)) + self.ai_settings_popup.open() + + def _do_teacher_popup(self): + self.controls.timer.paused = True + if not self.teacher_settings_popup: + self.teacher_settings_popup = Popup(title="Edit Teacher Settings", size_hint=(0.7, 0.8)).__self__ + self.teacher_settings_popup.add_widget(ConfigTeacherPopup(self, self.teacher_settings_popup)) + self.teacher_settings_popup.open() + + def _do_timer_popup(self): + self.controls.timer.paused = True + if not self.timer_settings_popup: + self.timer_settings_popup = Popup(title="Edit Timer Settings", size_hint=(0.4, 0.4)).__self__ + self.timer_settings_popup.add_widget(ConfigTimerPopup(self, self.timer_settings_popup)) + self.timer_settings_popup.open() + def _do_output_sgf(self): for pl in Move.PLAYERS: if not self.game.root.get_property(f"P{pl}"): @@ -329,6 +364,10 @@ class KaTrainGui(Screen): "p": ("play", None), "right": ("switch-branch", 1), "left": ("switch-branch", -1), + "f5": ("timer-popup",), + "f6": ("teacher-popup",), + "f7": ("ai-popup",), + "f8": ("config-popup",), } def _on_keyboard_down(self, _keyboard, keycode, _text, modifiers): diff --git a/katrain/core/constants.py b/katrain/core/constants.py new file mode 100644 index 0000000..f55fdf2 --- /dev/null +++ b/katrain/core/constants.py @@ -0,0 +1,7 @@ +PLAYER_HUMAN, PLAYER_AI = "player:human", "player:ai" +PLAYER_TYPES = [PLAYER_HUMAN, PLAYER_AI] + +PLAYING_NORMAL, PLAYING_TEACHING = "game:normal", "game:teach" +GAME_TYPES = [PLAYING_NORMAL, PLAYING_TEACHING] + +AI_DEFAULT = "default" diff --git a/katrain/core/game.py b/katrain/core/game.py index 4f6d4aa..33ff723 100644 --- a/katrain/core/game.py +++ b/katrain/core/game.py @@ -9,6 +9,7 @@ from katrain.core.utils import var_to_grid, OUTPUT_INFO, OUTPUT_DEBUG, i18n from katrain.core.engine import KataGoEngine from katrain.core.game_node import GameNode from katrain.core.sgf_parser import SGF, Move +from katrain.core.constants import * class IllegalMoveException(Exception): @@ -19,11 +20,6 @@ class KaTrainSGF(SGF): _NODE_CLASS = GameNode -PLAYER_HUMAN, PLAYER_AI = "Player", "AI" -PLAYING_NORMAL, PLAYING_TEACHING = "Normal game", "Teaching game" -AI_DEFAULT = "default" - - class Player: def __init__(self, player="B", player_type=PLAYER_HUMAN, player_subtype=PLAYING_NORMAL, periods_used=0): self.player = player diff --git a/katrain/core/utils.py b/katrain/core/utils.py index 187608d..95d3884 100644 --- a/katrain/core/utils.py +++ b/katrain/core/utils.py @@ -57,8 +57,6 @@ def find_package_resource(path): return path # absolute path - - class Lang(Observable): observers = [] callbacks = [] @@ -69,8 +67,8 @@ class Lang(Observable): self.switch_lang(lang) def _(self, text): - if text=='': - return '' # just for font change + if text == "": + return "" # just for font change return self.ugettext(text) def fbind(self, name, func, *args): @@ -90,9 +88,8 @@ class Lang(Observable): else: return super(Lang, self).funbind(name, func, *args) - def add_callback(self,callback_fn: Callable): + def add_callback(self, callback_fn: Callable): self.callbacks.append(callback_fn) - print("ADDING CB") def switch_lang(self, lang): # get the right locales directory, and instantiate a gettext @@ -113,9 +110,8 @@ class Lang(Observable): for cb in self.callbacks: try: cb(self) - print("CALLING CB") except Exception as e: - print(f"Failed callback on language change: {e}",file=sys.stderr) + print(f"Failed callback on language change: {e}", file=sys.stderr) DEFAULT_LANGUAGE = "en" diff --git a/katrain/gui.kv b/katrain/gui.kv index 38295e6..1bc2ec9 100644 --- a/katrain/gui.kv +++ b/katrain/gui.kv @@ -9,6 +9,7 @@ #:set GRAPH_DOT_COLOR [0.85, 0.3, 0.3,1] #-- NEW +#:import PLAYER_TYPES __main__.PLAYER_TYPES #:import RED __main__.RED #:import WHITE __main__.WHITE @@ -124,8 +125,7 @@ : background_radius: self.height/3.5 - -: +: background_color: BOX_BACKGROUND_COLOR : @@ -140,14 +140,35 @@ mipmap: True +: + background_color: BACKGROUND_COLOR + background_normal: '' + lang_change_tracking: i18n._('') # for font + color: WHITE + canvas.after: + Color: + rgba: LIGHTGREY + Line + points: self.pos[0],self.pos[1],self.pos[0]+self.width,self.pos[1] + width: 1 + +: + text: self.values[0] if self.values else '' + font_size: self.height * 0.5 + sync_height_frac: 1.0 + background_color: [*[c*255/88 for c in BACKGROUND_COLOR[:3]], 1] # compensate for texture + option_cls: 'StyledSpinnerOption' + + + # -- old widgets : color: WHITE - font_size: self.size[1] * 0.45 - radius: (self.size[1]/7,) + font_size: self.height * 0.45 + radius: (self.height/7,) button_color: BUTTON_COLOR button_color_down: [0.105, 0.14, 0.155, 1] button_color_highlight: [(a+b)/2 for a,b in zip(self.button_color,self.button_color_down)] @@ -157,27 +178,10 @@ Color: rgba: self.button_color if root.state=='normal' else self.button_color_down RoundedRectangle: - size: self.size[0],self.size[1] + size: self.size[0],self.height pos: (self.pos[0],self.pos[1]) radius: root.radius -: - background_color: BUTTON_COLOR - background_normal: '' - color: WHITE - canvas.after: - Color: - rgba: WHITE - Line - points: self.pos[0],self.pos[1],self.pos[0]+self.width,self.pos[1] - width: 1 - -: - text: self.values[0] if self.values else '' - font_size: self.size[1] * 0.33 - sync_height_frac: 0.7 - background_color: [*[c*255/88 for c in BUTTON_COLOR[:3]], 1] # compensate for texture - option_cls: 'StyledSpinnerOption' : max_lines: 1 @@ -185,19 +189,19 @@ : : - padding: 3, 0.27*self.size[1] - font_size: 0.4*self.size[1] + padding: 3, 0.27*self.height + font_size: 0.4*self.height : - font_size: 0.5*self.size[1] - padding: 7, 0.2*self.size[1] + font_size: 0.5*self.height + padding: 7, 0.2*self.height : - font_size: 0.5*self.size[1] - padding: 7, 0.2*self.size[1] + font_size: 0.5*self.height + padding: 7, 0.2*self.height - font_size: 0.2*self.size[1] + font_size: 0.2*self.height : color: BLACK @@ -211,7 +215,7 @@ button_color_down: ICON_BUTTON_COLOR_DOWN icon_margin: 0.15 * self.size[0] icon: '' - icon_size: min(self.size[0]-2*self.icon_margin,self.size[1]-2*self.icon_margin) + icon_size: min(self.size[0]-2*self.icon_margin,self.height-2*self.icon_margin) Image: size: (root.icon_size or 0,root.icon_size or 0) # square pos: [root.pos[i] + (root.size[i] - root.icon_size)/2 for i in [0,1]] if root.icon_size else [0,0] @@ -228,10 +232,10 @@ : # popups color: TEXT_COLOR - font_size: 0.45*self.size[1]/self.num_lines + font_size: 0.45*self.height/self.num_lines : - font_size: self.size[1]/10 + font_size: self.height/10 halign: 'center' valign: 'middle' multiline: True @@ -249,7 +253,7 @@ id: image pos: (root.pos[0] + (root.width - root.min_size)/2,root.pos[1] + (root.height - root.min_size)/2) size: (root.min_size,root.min_size) - source: 'img/white.png' if root.player=='White' else 'img/black.png' + source: 'img/white.png' if root.player=='W' else 'img/black.png' mipmap: True Label: id: lbl @@ -257,7 +261,7 @@ text_size: None, root.min_size bold: True valign: 'center' - color: BLACK if root.player=='White' else WHITE + color: BLACK if root.player=='W' else WHITE pos: (image.x, image.y) size: image.size font_size: root.min_size * 1.2 / (1 + 1 * len(self.text)) @@ -271,7 +275,7 @@ : size_hint: 0.06, 0.4 - icon_size: [min(self.size[0],self.size[1]),min(self.size[0],self.size[1])] + icon_size: [min(self.size[0],self.height),min(self.size[0],self.height)] pos_hint: {'center_y': 0.5} : @@ -308,13 +312,13 @@ size_hint: 5/8, 1 pos_hint: {'center_x': 0.5-3/16} id: black_circle - player: 'Black' + player: 'B' text: '' CircleWithText: size_hint: 5/8, 1 pos_hint: {'center_x': 0.5+3/16} id: white_circle - player: 'White' + player: 'W' text: '' NavIconButton: icon: 'img/flaticon/next.png' @@ -326,7 +330,7 @@ icon: 'img/flaticon/next999.png' on_press: root.katrain('redo',999) NavIconButton: - icon: 'img/flaticon/route.png' + icon: 'img/forward_-_child.png' on_press: root.katrain('switch-branch',1) ClickableLabel: pos_hint: {'center_x': 0.85,'center_y':0.5} @@ -349,13 +353,13 @@ : icon: 'img/hamburger.png' width: self.height - icon_size: [self.height * 0.8, self.height * 0.8] + icon_size: [self.height * 0.6, self.height * 0.6] # ---------- components of right pane ------- : captures: 0 - player: 'Black' + player: 'B' player_type: 'Player' player_subtype: 'Normal game' background_color: BOX_BACKGROUND_COLOR if self.active else BACKGROUND_COLOR @@ -420,23 +424,38 @@ color: GREEN markup: True multiline: False - font_name: 'fonts/digital-7.ttf' + font_name: 'fonts/digital-7 (mono).ttf' -: - state: (30,5,1) +: spacing: CP_SPACING padding: CP_PADDING * 4, CP_PADDING * 2 paused: True MDBoxLayout: size_hint: 0.7,1 - TimerLabel: + MDFloatLayout: + canvas.before: + Color: + rgba: GREEN + Line: + rectangle: (*self.pos,*self.size) + width: 1 size_hint: 0.4,1 - id: timer - text_size: self.size - halign: 'right' - valign: 'middle' - font_size: 0.85*self.size[1] - text: f"{root.state[0]//60}:{int(root.state[0] % 60):02d}" + TimerLabel: + color: BACKGROUND_COLOR + text: '8:88' + text_size: self.size + font_size: 0.85*self.height + pos_hint: {'right':1,'center_y':0.5} + halign: 'right' + valign: 'middle' + TimerLabel: + id: timer + text: "{:01d}:{:02d}".format(int(root.state[0])//60,int(root.state[0] % 60) ) + text_size: self.size + font_size: 0.85*self.height + pos_hint: {'right':1,'center_y':0.5} + halign: 'right' + valign: 'middle' TimerLabel: size_hint: 0.05,1 text: "x" @@ -552,7 +571,7 @@ size_hint: 0.6,1 id: desc text: root.label if not root.hidden else '' - font_size: self.size[1] * 0.7 + font_size: self.height * 0.7 font_name: root.font_name text_size: self.size valign: 'middle' @@ -658,10 +677,10 @@ height: root.player_box_height PlayerInfo: id: B_player - player: 'Black' + player: 'B' PlayerInfo: id: W_player - player: 'White' + player: 'W' BoxLayout: size_hint_y: None height: root.timer_box_height @@ -867,22 +886,54 @@ size_hint: 1,None -: +: orientation: 'horizontal' - CircleWithText: - text: root.player[0] - player: root.player - Label: - text: 'type' - Label: - text: 'subtype' + spacing: CP_SPACING + padding: 0, CP_PADDING + player_type: player_type + player_subtype: player_subtype + player_subtype_label: player_subtype_label + MDBoxLayout: + size_hint: 0.25, 1 + CircleWithText: + size_hint: 0.8, 0.8 + pos_hint: {'center_x':0.5,'center_y':0.5} + text: root.player[0] + player: root.player + MDBoxLayout: + size_hint: 0.5, 1 + orientation: 'vertical' + spacing: CP_SPACING + Label: + text: i18n._('player:type') + font_size: self.height * 0.5 + StyledSpinner: + id: player_type + value_refs: PLAYER_TYPES + on_text: root.setup_options(*args) + MDBoxLayout: + size_hint: 0.5, 1 + orientation: 'vertical' + spacing: CP_SPACING + Label: + text: 'Player Type' + id: player_subtype_label + font_size: self.height * 0.5 + StyledSpinner: + id: player_subtype + value_refs: [] + on_text: root.set_player() : orientation: 'vertical' + size_hint_y: None + spacing: 3*CP_SPACING + padding: CP_PADDING + height: (self.parent.item_height or 50) * 5 PlayerSetup: - player: 'Black' + player: 'B' PlayerSetup: - player: 'White' + player: 'W' : katrain: app.gui @@ -892,6 +943,8 @@ MenuLabel: text: i18n._('menu:playersetup') PlayerSetupBlock: + MenuLabel: + size_hint: 1,1 MenuLabel: MDBoxLayout: orientation: 'vertical' @@ -906,17 +959,33 @@ height: root.item_height MainMenuItem: text: i18n._('menu:save') - icon: 'img/flaticon/savegame.png' + icon: 'img/flaticon/floppy-disk.png' shortcut: 'Ctrl-S' on_action: root.katrain("analyze-sgf-popup") MainMenuItem: text: i18n._('menu:load') - icon: 'img/flaticon/loadgame.png' + icon: 'img/flaticon/folder.png' shortcut: 'Ctrl-L' on_action: root.katrain("analyze-sgf-popup") + MainMenuItem: + text: i18n._('menu:clocksettings') + icon: 'img/flaticon/cogwheel.png' + shortcut: 'F5' + on_action: root.katrain('timer-popup') + MainMenuItem: + text: i18n._('menu:teachsettings') + icon: 'img/flaticon/graduate.png' + shortcut: 'F6' + on_action: root.katrain('teacher-popup') + MainMenuItem: + text: i18n._('menu:aisettings') + icon: 'img/flaticon/ai.png' + shortcut: 'F7' + on_action: root.katrain('ai-popup') MainMenuItem: text: i18n._('menu:settings') icon: 'img/flaticon/settings.png' + shortcut: 'F8' on_action: root.katrain('config-popup') MenuLabel: text: i18n._('menu:lang') @@ -949,6 +1018,8 @@ allow_no_selection: False : + play: play + analyze: analyze OutlineBox: outline_color: WHITE size_hint: 0.7,0.7 @@ -1072,8 +1143,8 @@ text: "Size" LabelledTextInput: text: '19' - font_size: 0.5*self.size[1] - padding: 7, 0.2*self.size[1] + font_size: 0.5*self.height + padding: 7, 0.2*self.height input_property: 'SZ' BoxLayout: spacing: 1 @@ -1125,21 +1196,21 @@ color: WHITE id: restart ScaledLightLabel: - font_size: 0.35*self.size[1] + font_size: 0.35*self.height text: 'avoids replaying\nidentical games' LightHelpLabel: text: "Use x:y (e.g. 19:9) to play on a non-square board." size_hint: 1,2 text_size: self.width-6, None - font_size: self.size[1]/6 + font_size: self.height/6 id: info LightHelpLabel: text: "Note that handicaps above 9 are not supported on non-square boards." - font_size: self.size[1]/6 + font_size: self.height/6 text_size: self.width-6, None id: info StyledButton: halign: 'center' text: 'Start\nGame' - font_size: 0.3 * self.size[1] + font_size: 0.3 * self.height on_left_press: if not self.last_touch or self.last_touch.button=="left": root.new_game() diff --git a/katrain/gui/controlspanel.py b/katrain/gui/controlspanel.py index 4dbb780..9ca2af0 100644 --- a/katrain/gui/controlspanel.py +++ b/katrain/gui/controlspanel.py @@ -7,9 +7,7 @@ from kivy.uix.popup import Popup from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.floatlayout import MDFloatLayout -from katrain.core.utils import MODE_PLAY, MODE_ANALYZE -from katrain.gui.popups import ConfigTeacherPopup, ConfigTimerPopup -from katrain.gui.ai_settings import ConfigAIPopupContents +from katrain.core.utils import MODE_PLAY, MODE_ANALYZE, i18n class PlayAnalyzeSelect(MDFloatLayout): @@ -18,13 +16,13 @@ class PlayAnalyzeSelect(MDFloatLayout): @property def play_analyze_mode(self): - return MODE_PLAY if self.play_mode.play.status == "down" else MODE_ANALYZE + return MODE_PLAY if self.play.active else MODE_ANALYZE def switch_mode(self): # TODO: load settings if self.play_analyze_mode == MODE_PLAY: - self.play.trigger_action(duration=0) - else: self.analyze.trigger_action(duration=0) + else: + self.play.trigger_action(duration=0) class ControlsPanel(BoxLayout): @@ -35,15 +33,14 @@ class ControlsPanel(BoxLayout): super(ControlsPanel, self).__init__(**kwargs) self.status_msg = None self.status_node = None - self.ai_settings_popup = None - self.teacher_settings_popup = None self.active_comment_node = None - self.timer_settings_popup = None self.last_timer_update = (None, 0) Clock.schedule_interval(self.update_timer, 0.07) - def check_hide_show(self, *_args): - pass + def update_players(self, *_args): + for player, info in self.katrain.game.players.items(): + self.players[player].player_type = i18n._(info.player_type) + self.players[player].player_subtype = i18n._(info.player_subtype) def set_status(self, msg, at_node=None): self.status_msg = msg @@ -62,7 +59,6 @@ class ControlsPanel(BoxLayout): self.status.text = "" self.status_node = None - both_players_are_robots = all(p.ai for p in game.players.values()) last_player_was_ai_playing_human = game.last_player.ai and game.next_player.human self.active_comment_node = current_node @@ -92,18 +88,6 @@ class ControlsPanel(BoxLayout): self.note.text = current_node.note self.info.text = info - def configure_ais(self): - if not self.ai_settings_popup: # persist state of popup etc - self.ai_settings_popup = Popup(title="Edit AI Settings", size_hint=(0.7, 0.8)).__self__ - self.ai_settings_popup.add_widget(ConfigAIPopupContents(self.katrain, self.ai_settings_popup, self.katrain.config("ai"))) - self.ai_settings_popup.open() - - def configure_teacher(self): - if not self.teacher_settings_popup: - self.teacher_settings_popup = Popup(title="Edit Teacher Settings", size_hint=(0.7, 0.8)).__self__ - self.teacher_settings_popup.add_widget(ConfigTeacherPopup(self.katrain, self.teacher_settings_popup)) - self.teacher_settings_popup.open() - def update_timer(self, _dt): current_node = self.katrain and self.katrain.game and self.katrain.game.current_node if current_node: @@ -127,10 +111,3 @@ class ControlsPanel(BoxLayout): time_remaining = byo_len - current_node.time_used periods_rem = byo_num - player.periods_used self.timer.state = (time_remaining, periods_rem, ai) - - def configure_timer(self): - self.pause.state = "down" - if not self.timer_settings_popup: - self.timer_settings_popup = Popup(title="Edit Timer Settings", size_hint=(0.4, 0.4)).__self__ - self.timer_settings_popup.add_widget(ConfigTimerPopup(self.katrain, self.timer_settings_popup)) - self.timer_settings_popup.open() diff --git a/katrain/gui/kivyutils.py b/katrain/gui/kivyutils.py index 023651c..a78b6ca 100644 --- a/katrain/gui/kivyutils.py +++ b/katrain/gui/kivyutils.py @@ -13,7 +13,7 @@ from kivy.uix.filechooser import FileChooserLayout, FileChooserListLayout from kivy.uix.gridlayout import GridLayout from kivy.uix.label import Label from kivy.uix.scrollview import ScrollView -from kivy.uix.spinner import Spinner +from kivy.uix.spinner import Spinner, SpinnerOption from kivy.uix.textinput import TextInput from kivy.uix.widget import Widget @@ -25,6 +25,8 @@ from kivymd.uix.boxlayout import MDBoxLayout from kivymd.uix.button import BasePressedButton, BaseFlatButton from kivymd.uix.navigationdrawer import MDNavigationDrawer from kivy.core.text import Label as CoreLabel + +from katrain.core.constants import GAME_TYPES from katrain.core.utils import i18n # @@ -97,6 +99,10 @@ class ToggleButtonMixin(ToggleButtonBehavior): inactive_background_color = ListProperty([0.5, 0.5, 0.5, 1]) active_background_color = ListProperty([1, 1, 1, 1]) + @property + def active(self): + return self.state == "down" + class SizedToggleButton(ToggleButtonMixin, SizedButton): pass @@ -156,24 +162,101 @@ class MyNavigationDrawer(MDNavigationDrawer): # in PR - closes NavDrawer on any class CircleWithText(Widget): text = StringProperty("0") - player = OptionProperty("Black", options=["Black", "White"]) + player = OptionProperty("B", options=["B", "W"]) min_size = NumericProperty(50) +class BGMDBoxLayout(MDBoxLayout, BackgroundMixin): + pass + + # -- new gui elements + +class StyledSpinner(Spinner): + sync_height_frac = NumericProperty(1.0) + value_refs = ListProperty() + font_name = StringProperty(DEFAULT_FONT) + + def __init__(self, **kwargs): + super().__init__(**kwargs) + self.bind(size=self.update_dropdown_props, pos=self.update_dropdown_props, value_refs=self.i18n_values) + self.i18n_values() + + @property + def selected(self): + try: + selected = self.values.index(self.text) + return selected, self.value_refs[selected], self.values[selected] + except (ValueError, IndexError): + return 0, "", "" + + def i18n_values(self, *_args): + if self.value_refs: + selected = self.selected[0] + self.values = [i18n._(ref) for ref in self.value_refs] + print(self.selected, self.values, self.value_refs) + self.text = self.values[selected] + self.font_name = i18n.font_name + self.update_dropdown_props() + + def update_dropdown_props(self, *largs): + if not self.sync_height_frac: + return + dp = self._dropdown + if not dp: + return + container = dp.container + if not container: + return + h = self.height + fsz = self.font_size + for item in container.children[:]: + item.height = h * self.sync_height_frac + item.font_size = fsz + item.font_name = self.font_name + + class PlayerSetup(MDBoxLayout): - player = OptionProperty("Black", options=["Black", "White"]) + player = OptionProperty("B", options=["B", "W"]) + + def __init__(self, **kwargs): + super().__init__(**kwargs) + Clock.schedule_once(self.setup_options, 0) + + def setup_options(self, *_args): + self.player_subtype.clear_widgets() + if self.player_type.selected[0] == 0: # human + self.player_subtype_label.text = i18n._("gametype") + self.player_subtype.value_refs = GAME_TYPES + else: + self.player_subtype_label.text = i18n._("aistrategy") + self.player_subtype.value_refs = MDApp.get_running_app().gui.ai_strategies # TODO: + self.player_subtype.text = self.player_subtype.values[0] + self.set_player() + + def set_player(self): + katrain = MDApp.get_running_app().gui + game = katrain and katrain.game + if game: + game.players[self.player].player_type = self.player_type.selected[1] + game.players[self.player].player_subtype = self.player_subtype.selected[1] + katrain.controls.update_players() + katrain.update_state() class PlayerInfo(MDBoxLayout, BackgroundMixin): captures = NumericProperty(0) - player = OptionProperty("Black", options=["Black", "White"]) + player = OptionProperty("B", options=["B", "W"]) player_type = StringProperty("Player") player_subtype = StringProperty("") active = BooleanProperty(True) +class Timer(BGMDBoxLayout): + state = ListProperty([30, 5, 1]) + + class AnalysisToggle(MDBoxLayout): text = StringProperty("") default_active = BooleanProperty(False) @@ -398,29 +481,6 @@ class StyledToggleButton(StyledButton, ToggleButtonBehavior, ToolTipBehavior): self.state = "normal" if self.state == "down" else "down" -class StyledSpinner(Spinner): - sync_height_frac = NumericProperty(1.0) - - def __init__(self, **kwargs): - super().__init__(**kwargs) - self.bind(size=self._update_dropdown_size_frac, pos=self._update_dropdown_size_frac) - - def _update_dropdown_size_frac(self, *largs): - if not self.sync_height_frac: - return - dp = self._dropdown - if not dp: - return - container = dp.container - if not container: - return - h = self.height - fsz = self.font_size - for item in container.children[:]: - item.height = h * self.sync_height_frac - item.font_size = fsz - - class ToggleButtonContainer(GridLayout): __events__ = ("on_selection",) @@ -544,7 +604,7 @@ class LabelledIntInput(LabelledTextInput): def draw_text(pos, text, font_name=None, **kw): - label = CoreLabel(text=text, bold=True, font_name=font_name or i18n.font, **kw) # + label = CoreLabel(text=text, bold=True, font_name=font_name or i18n.font_name, **kw) # label.refresh() Rectangle(texture=label.texture, pos=(pos[0] - label.texture.size[0] / 2, pos[1] - label.texture.size[1] / 2), size=label.texture.size) diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/en/LC_MESSAGES/katrain.mo index 0b2bff289874559e1b1c537021ca1d09f748f163..010e4e96a46149d0ace86e6934e94356b1402aea 100644 GIT binary patch delta 1425 zcmY+@Pe@cz6vy#v>XbVEY04~1vqCfS4{ahXqU^6wW++i+!6*+Mof*w}k`gop2CbWd zh@hf&wJ9mG1WBreK?J%ef+#4YD5^z^{t$hC&pSop%;%nW?>*xNNz9@_b*s0Lo5)=i_<{jk@w=q9d& z1q{?#DPKxZh3a^njkll@?M5XyfI9jv3}YO1QXf(8$Zu@I0+Q{)ZY;<9Sd4FxB_=hK z^VhTUQ*9-#!fM=$wRjTstVZqiCs;xJ6Bl7QUCqNf)Y0$5G7RGYCh$7?InFV>ix+W# zyJpJd=WzZyfn`*oDN~Khu?F>wT9H~NjO;Z>u@Hw)M|ugh?-uHgMv)iYJhJhGjVDnj z^cL)uYfuF?+4*`KH=!D9wbw(aM-)Sy$Pnt~ynt%# zCh8Y{2l-)`wh;!rsAde+z++V5DdgY0=1YaYpb~sXZTyY8lQgO+&PA=uN3AQyZMY(D z_+IMyl#Ec!?F+h2$KY^ddR9tZM=;{lMtk}q!Laeht`ltU^oH(WuVW%kw7)hOiaD+u zigv_i;`VS)dw23uqQ$p=ySL2Sn!Id!gRxj;Tfgh}L@Qlqz%{+$;Gok-vgD|f zUn9RCfg-c#RsY>c^9Au1eCJlMnK%f|>aYcC@gT;r8&h}+(|F#;N8D?eG%MO|8rt9< z*5FgzjB~gF7chfMs11Li5~_-s)nf*g_#RAP4t3yJ)P94g`4MXUb<}xxFwOZk;{#26dXJk?^LL{T>_k0Ub-}k-)H7YA(Tl5i8guO4 zhEv#tuaK{O=1--r;4X}DdIx4v@6Q0L#M9pY2-}H2;Z_XEauYV8Ds~`A{ddwhPRBS# z_yjBX67O=22iQmbbn~CcUiKGTF+r!Ebvv@e4kJUB!)@4ys$_&(cLQ~iTgYo>r~m)} diff --git a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po index fdae16e..9c9cb3e 100644 --- a/katrain/i18n/locales/en/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/en/LC_MESSAGES/katrain.po @@ -22,12 +22,43 @@ msgstr "Load Game" msgid "menu:settings" msgstr "General Settings" +msgid "menu:clocksettings" +msgstr "Timer Settings" + +msgid "menu:teachsettings" +msgstr "Teaching Game Settings" + +msgid "menu:aisettings" +msgstr "AI Settings" + msgid "menu:lang" msgstr "Language" msgid "menu:support" msgstr "Support or Contribute" +#. player options in the setup and on the right +msgid "player:type" +msgstr "Player" + +msgid "player:human" +msgstr "Human" + +msgid "player:ai" +msgstr "AI" + +msgid "aistrategy" +msgstr "AI Strategy" + +msgid "gametype" +msgstr "Game Type" + +msgid "game:normal" +msgstr "Normal Game" + +msgid "game:teach" +msgstr "Teaching Game" + #. buttons at the top - should all include a line break msgid "analysis:nextmoves" msgstr "" diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.mo index bf733fed9974c56a3a97d42370f01da7fbda8ace..032bb26d0f7d8ddd35bfbfeceb5a2ceda5000773 100644 GIT binary patch delta 1482 zcmZwGU1-g59LMqBVLNPRHfClR4i}!XR#Y^@H}?neY}aa9Onak zi+by?PU8F-Gqt=CI)ODvaVCWGaTn^{=t4bN59&&;pbEZ?I?_SZy4R?a8Ah((d_~Rw zX$_D}4^n~JuR2X*I*nDRLblrh$C^MT?y}>@kzA%1b#i@n{FaUHqBb0`{ZCK@Jx86) zFsgv>r~=bd8P!jIrgb)IAc(4PA*!$%8`oR6B0p`j7x~4R{m8ADX4Lv5YW-oqAP*ZB1F z+rn=xP-OO|=D+J{E)j3S&+ZTGAPz#aChWuv?!!0^UaJOtZf&`h&~RNb{7%${`%#q|#0eZh9q>IC^iEf3oW$RF0tZ=r z2j0VWTt>cD=1--rU^j;B-iJM?`!kBF$ei~-!ye)?ZpH?()PCDh6+4ii{#`Uq(J_V7 zSi&kU;{wOf?Hr?iI(ZdY%hnNW#YWV-?n9mEAga_us6@w5m7GS+n?Y4%9x0-gRDVr) zPKR7Vo!}$#wN?IF@fWHBac+zzZrnkydPIOL64 zK6YPHhN^57NW2pSK>b-F#T=$~^rC;Ob*< diff --git a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po index 8edc4ee..99a620b 100644 --- a/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/ko/LC_MESSAGES/katrain.po @@ -227,3 +227,47 @@ msgstr "Support or Contribute" #. TODO msgid "wait-before-equalize" msgstr "Wait for initial analysis to complete before requesting a refinement." + +#. TODO +msgid "game:teaching" +msgstr "Teaching Game" + +#. TODO +msgid "aistrategy" +msgstr "AI Strategy" + +#. TODO +msgid "game:normal" +msgstr "Normal Game" + +#. TODO +msgid "player:human" +msgstr "AI" + +#. TODO +msgid "player:type" +msgstr "Player" + +#. TODO +msgid "gametype" +msgstr "Game Type" + +#. TODO +msgid "player:ai" +msgstr "AI" + +#. TODO +msgid "game:teach" +msgstr "Teaching Game" + +#. TODO +msgid "menu:clocksettings" +msgstr "Timer Settings" + +#. TODO +msgid "menu:teachsettings" +msgstr "Teaching Game Settings" + +#. TODO +msgid "menu:aisettings" +msgstr "AI Settings" diff --git a/katrain/i18n/locales/nl/LC_MESSAGES/katrain.mo b/katrain/i18n/locales/nl/LC_MESSAGES/katrain.mo index b762a7b0bf5a4b8620d8291ae8c14b6f72ea0b63..58dd77109108142eb5b383f7dc39b015e0660765 100644 GIT binary patch delta 1478 zcmZwGOGs2v9LMovKFW8QiH7AQkrfWMC=d%t(#(EPz6n4KE6a1{tnY|2}x{{((J~lyv3+>yHR-#U>^IMV>DD@ zs~rf(2aLIlT5!wukD(Gzq6&M8>+lt-;Mb@^7i|0sGl>g04y`Li72-#&+mE^IZ)$1i z1e#G#&~Cke+Gr4Uv_rQ4J}S|;9iK$4e}CoZO%B5c5o*oL}-KHPyfupgh`WAt;J&+#ojz`NO; zKVxPu*>wU3k>bp8EX5YoyD^CDX@*f(GK!mV9OFliS~r7wp!dj&Z{}^hVB_zo6Iw#$ zOOKIV1>{?Os6xuERj9;A?D$D!t!YJV6td$NZF~h);5FMnin^*tsFRsQy{yxijImi7 z`pM5(KO--$`GP9sE2_X{cY(!HNc7g+! zI>YV0sp;h5r1Z|H7jZndePAk(nwb=6cS3GexH}SZf+pVfT&Jz$uO=(wkvGuenvfgr zt#Ue}uIJGoU5VR*-ECcou94GeEr;XN;)xR7rpJj!{pWf;uRHAb+5ogp`} c8jj3lpDFt%$?A{^I8j#W6NpzjQjs(98yFbWpa1{> delta 1018 zcmYMzPe{{o7{~GF$L2Oy+sxGdkjXk|iK`v*5)=hlVn{_updFkcMWmCqz@Qk>rOP53 z_RntFLFv?P{UJ!`;vp*PP$UtEg5jaUOBdgtcp!1UzR&mf{XXC4`|RhP^vCAXe0_Mr z_}Ry28=s$nBD0sF|88LTig+`=bCC#q9NFpmSM3(jFl-|067r*IXI zV-MMP;zQhyv&gUg;E!6pjBOa>^gWnGy+4Df7Ek*840aHI!7Ui2%8i&tb*wW^|63Ux zV`3aH;WRGeYnE^$XT>pX{5NA@~bq3jD`%$g##;w?g>f{(|-wo77%E)VE zch!GQO!~wWsx{N7gfCF7e2ZH50hQ>h#|x+fSA702s^vAbK{sqd{UdcCk1UJIcK}s* z&mjg%+>fg0Eb^Y&c~k+T9$!JNE1}li#4ao+s~5uegK8pD8&u9kPuGp*3Wdzj^L diff --git a/katrain/i18n/locales/nl/LC_MESSAGES/katrain.po b/katrain/i18n/locales/nl/LC_MESSAGES/katrain.po index 3bc9f57..88bda5b 100644 --- a/katrain/i18n/locales/nl/LC_MESSAGES/katrain.po +++ b/katrain/i18n/locales/nl/LC_MESSAGES/katrain.po @@ -259,3 +259,47 @@ msgstr "Support or Contribute" #. TODO msgid "wait-before-equalize" msgstr "Wait for initial analysis to complete before requesting a refinement." + +#. TODO +msgid "game:teaching" +msgstr "Teaching Game" + +#. TODO +msgid "aistrategy" +msgstr "AI Strategy" + +#. TODO +msgid "game:normal" +msgstr "Normal Game" + +#. TODO +msgid "player:human" +msgstr "AI" + +#. TODO +msgid "player:type" +msgstr "Player" + +#. TODO +msgid "gametype" +msgstr "Game Type" + +#. TODO +msgid "player:ai" +msgstr "AI" + +#. TODO +msgid "game:teach" +msgstr "Teaching Game" + +#. TODO +msgid "menu:clocksettings" +msgstr "Timer Settings" + +#. TODO +msgid "menu:teachsettings" +msgstr "Teaching Game Settings" + +#. TODO +msgid "menu:aisettings" +msgstr "AI Settings" diff --git a/katrain/img/back_-_parentpng.png b/katrain/img/back_-_parentpng.png new file mode 100644 index 0000000000000000000000000000000000000000..2f7f697f8eabdd7862c2a1dabd5991a33cd9de9b GIT binary patch literal 2976 zcmX9=eLPk7AOD==#JQS>gB~{Ix*;XGsgzb6?RwfqmL^u(?SU+m>Zknj^ero{kk?`{ zOSgV)GnEWAwAN{wELZd-R;2N&HLH}Ar}%x&>5u#ReBa;C`~CiWzMpf?gC;1@*U0ca zLjW-H_fxF^pm9lAv-%izx7}A@kj43h?EqM3B>t%MJx8_yOkClw@>-ej?URlR`IdLA z>mQ82aGX;22eV7QN zngM>L&km+HW{oi9O`ld}Mg)Zfk$E#Ui^Df&^!x;bft5%EK(Ia0c2y_9YZ zRsoJtsI4#tJh9*OMzIp9nilv&aLD07*WSe5ZK(q(U%a8=)ZgKEtUCjTnj`wr>5O|$ zJnXDWl+>?wP88K`&2yv{M*f^H){vVN;h)0>dhCbJP{U_EpkaB1)Oqfi+j?RzFMj?^ zl=JQ(GEwf>cw8#(+GHrfyFKq}QJ%N;rMZYpu5?K0;d}2$@Xl=s)-ILAQFR+6uhnbu z((sA7V{n!tWuQ}!?nKb!<`Yu(FcY8T=({&Szp7k_yTLFcYhrZzbfbo!Jw?hvh3yRi^a zGzs)7y}b~}5o=i3=_3UhV( zdrq(U^}@@$zqt%P;-2rgZ*x)CbvCFlKuCzUVZ5vjU3m zE(QIRSW`cLMhGq{gL+rXQ%5I3;!nopb;UbmPrLd81Bqr-?sZOB5Shjs=IF`$r5Qw< zQ&nXdz*c(6DUNTwse$NK4lu2CM;8sKk;6{sjKI3d{e23=&4L+wIQFL7Q4KM zU4HkIvDPg>Ul3yAJZWO4fz3B`Qk#NBj$VoXO-hN^sNRgi+jtEgeFGBY;IYn)&9bE( zk3jXM7}IKBCaB{3Rj{GZsI1wLd=qLAq@a|0+Pii$aF(O;>N$K6qzTSBdXCvpAPRh# zATvsNs9heH&1x-ZwQZ$WSFnPZu_PaB*qBp2*9_%U<)x8R5VbEJPm0eUqfQ5i(y(&h z958dWWPaNQg=S!h&8fualjU4-;f{-WmS3LJz;;{Mx!#R^Vn+1{hH^dUYx<`_SWJ>- zB&%w^r3LgAvuc+da1}Y*tc0};zh9?+%vnK}vgG4Jqh+gAu-Y67(QIc1oU;Q%JaMck z74y5HmS3Plv#y9%>VyLrhP;Rg0wGyJ@~kKeU5x2J4;PUNnhOY1PD!nLpoB{Q5 zj1Ul+7UXb+%Cg1xRE+7>>2$R(C^OsTdA>}a870_ZdNL7|JK%B&reSZHK_6h=<{Q$e&+xVS{YP%BQ)Szj42Sz6)P{7c>PGQ3~xeRQRiSYg8Q4kQbGL>Tsm4 z&maTXL8gLk#iU~n8yW}@WXF|fAtzL!_Q0O6tAr&;{Yyh0qwA-p)J;^B+S2tniIv_= z)^vc99JYEn3hlW*S5%x;39+as)sS9P+%~70v5#-$bTLkQ{s&AF&Lt|7O+ZD96(@p~ zy;2Bil)`5xrLgvZ7_^sIQ@l9WS1?$0(9cQS>oRv%5dh+}`5;gL3vXFb_`$d~C|cxH z|F51+Sac+C=r+${DwTR~v<|;UA38bG#rH-(01#X!sD#R*RP+y>)6G`z?l(bdZ-bKF(kbP4 zyJnIpTgPyS>hO0}LdRR`{TxpD&qKUmaHGwZ_PH-o`Nft#!U-ww7oElyBuQ3}?XyVO z!f`xmc{al-Mv!z2WNYv!) z408J|HPuDMehf8?ol>cxK}Y(l&e3N4G&%J1G;qD~`pTW~U4zc;A7y5Y>)GsI U))J=s0OtbW?;WTrTc+Ooe{m&5cK`qY literal 0 HcmV?d00001 diff --git a/katrain/img/flaticon/ai.png b/katrain/img/flaticon/ai.png new file mode 100644 index 0000000000000000000000000000000000000000..3d832db6d374b97e79a393a4320493722c495e2c GIT binary patch literal 5232 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 P*#qO_XADXS_Ba0rg@?+w literal 23456 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 Nu4kfKqHP!X{{XN`W6A&k diff --git a/katrain/img/flaticon/floppy-disk.png b/katrain/img/flaticon/floppy-disk.png new file mode 100644 index 0000000000000000000000000000000000000000..841b76db5345fc0d03881be9571d7162a3309619 GIT binary patch literal 3841 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 literal 0 HcmV?d00001 diff --git a/katrain/img/flaticon/folder.png b/katrain/img/flaticon/folder.png new file mode 100644 index 0000000000000000000000000000000000000000..bb9f45d0a087d0cca29b37f971a7a6d80613cb0a GIT binary patch literal 2510 zcmeHJ{ZCs}7=G^QX?xqPtRFx~=|(9Z4zi`F6Hu9!QdT+{0xnb(wPbFCut^;%5X^QN zhOqdt#rXrs#%5yJqNM2zaf`v_0y86VG8T-GxEIgtZ2!#YZ`IAGuHWA1nn;@V7a0ezWX6vjl#c5?5kGV6Jkaxk zu#cni+fNr?-M{Kc3W^%yuw92a4@y%3dlBT(43wrIQp}OY(DR^yn>iMCk#ukjL^847 zh^XF#z7oK71X50}8Wrh?Fk0FQ`R`&?>rWz@F7C358wgE%PLB$LYx5v%7Jz()#|ASH z)(be1%A`0E^VV@!WQ^nWK{{eP2FbZE4z?~x^+rK1(*fcmw>7HC#);#T?|i>I@!SO+ zss{VlJe%~7+`>_HxwAHM!J-Sq3-Et(;MTf_46%Ytk%vaEJQ|E8xu={{h~GI7c-eub zw;?5Vz7`kGk(QoA9tF0gy-=Q<_DlCMy!7QJV}cK|VQ+7%TuSzyi9dkD9M=Xv6oY!? znPE(25YYI*OlF`S<1W#Hpm*3IZ!!+it`oKP=oHDTl*np3BHH4Xb+~Clv>?4udP>n` ziwPSU_K)>{EPXB%tCHQ2*CfUZy{*P%1T<8L5Xb6pmxeW_BhXQMS%o?avPPEOlO}h2 z(Dwx7tnm>0OOs`IL#;zX&C|S7Gjx#S(oU;*?JY^92;s9vkm-)3E}nr064oeZiyDJQjci#m!>lDP2*f!3^v~le)))Gze{Mv6S%@uGl(I}*{y6? usly5%R^~$a;QgQOhkNm7LzwbcoAVY_VwxxXZe`nm;>1^2;t9C}2mb{jKeK=U literal 0 HcmV?d00001 diff --git a/katrain/img/flaticon/graduate.png b/katrain/img/flaticon/graduate.png new file mode 100644 index 0000000000000000000000000000000000000000..4b896b696eb7c383b0c937bb2a1c07ac0dd9c986 GIT binary patch literal 4879 zcmc&&c~p}}*Pkqg1R}c_0ZCXzi4bHJkOUC{0|wMqHcP@5SA-%Iih)ECkSO3%5ETPx z6sZL??kGeM!OA8gh}A+}3IRlruoy`44fOlYdB4*?-hbYn_c>7+v?14h26p3;q@Aj>p%UVCs=Y-`?0T4oRpVYrzXt<&c|fE8(l3A%|Mj< zANKU9vR)9qw|Z)&+AN43rk)Yr3xH<&#QHU&LdEKO@S%)le6*ae)MtTrFD_{YT^6Pv zCxQ4~o3R$NopoLWZjikhIv`QfXMz_WJgaFTxh>tVg<+~6S5dhktz!_l?{_*na~qXz zEbye0Ny!%0X?TDq9YNKm^mH-{OkFJM_b*Tw)`JJ$s7GpKc~Ax-`NCzMO0aA#7BxmV zj{G5LE(M2*JNGBoiYyO7BW4ONbAJ-{9j1Wro#+seG*t&P=r{f%SJ>`Q58hfPhg3^b zGAT5bob#RJwBOC~0YBAWHlz!*(1?n_j?+v@f*Fges%yI|Shj(L&;P03d~etEH_>jNhLl6rsJY!-2(S8EUKks(D|59 zV;YAt^eVMIE!3#e!4Q1oue;KTQ!DV*PKz32$!P?JCeuds=$#-LC66L@)zx5#q{c=p zE_)@xC_>_CR1fk3%-%#vJk#pI9ZP&IY}-)}LUVX^L315hB=LGJ`xptTo)&IhyNph} z>qQuBjCNv5Q0>~7p@c_X!7}l88N9P$yNwInDQ77GS$wkiol33+_QL@3)D0=mGJ|(M zEX1V1U9*^ypT$>g>r}a+jfqHDiwKs{9O`Lq)@E2bad15$`;oa{%s6TX4w+tO5Ae=2{v80pT)afm%=A< zy?RI;Lr(i7sIhg$^|Y^jWZhaik-P32JSsZPv%npAmuq9TC@shw5c8`c zW=q<8Jt{a6g-7nHWkDSNMh35=?~+i17IUJ3c6UDl7U{85qy*LBn?a#`GN_g! znBNhc=ZL$d36Q21u9uMvKLKMHP3daHo%}qG}Xn(AqH(n~*%a^oA7CpZqzK zSEz`g6T!P=bG+N6Q_vjH?6LFcA60fhor9xCczMG;d)$K+Apgbv1}Z0I`j?+2a4)zn zmFpJI{Am-U00He(Px1Es)LjZ23 z`+QBF4CB#a8~`2pFgpBOK}paA_V1|}H1L;CqM3iJ1fc8AL0Ne1kMlHg`TsU0Dx`HY zs{lCzfO2-t+|oWY_lPC{iE{~GZ7MO`mshr`&+OwY24)GbX9b(X6*FH(_w=cO^l^It zzTBI-nm!y0UTI?hsWO$GK719#SzrOpu$`)J}+7-PYQsPS|`L&_lv&^#wpI;%{YumA}|S30QgQ>h2y>ty-# zT5&NPW@M0T_WLs^D1E*zZHli}(L{p_k>hy-Tn!662xCi#&sYpIJa`){n{b{XWgtq_ z=u}LhWSu1hE4Sx<2&F}WZu*1AfQ z1qiL3RSjNxW>}Cani-BSZG@daljX0&VomEoT%M5nWKH_T;$Qf&n+TwdEVr#}?e$@Q z>eRxN7}L{_rA}-EBp8;5Zb+MwV`5c7#tJNLxt@|x)#8ibZp%P4H+2% zgJqE;Yp2m*lO~4g4%GuE{6UE!3*<&h^5P#G>Htf+CO4j}u+2RmiUg}+K%YkiPxyk8 z~qsX!-<HurqRV#6*4H1$7V-RK;(y4VF$zNw12CjKez6l9%1f!+$bxE=^p+;=^E11wdP8i{LA)izws5-j$PaFm9~|| z4vB;3Y}d4w_pURNgxPx{r&S$yUyOE24XDXJ1ogTFigq(_eJx`0E3`tw#E8 z-o#^pEWOszk3IuszS_yRm=_(HNg@?&&(&$$idI3d+yFB9AyaktcEz;BPEkDeg0xd}+^xfQO2v9z zYpQ>p>&Y$P?!dTJ3IN7k*SIeb*gh z89iW6ef4r#y7(-uAhR#$^<1x4)uL(l%w^SrUiSPv_8^y?OSc*#HIqa9@4lByW^H2x zdoCqBzlnyt!74V>K4zNWLB+7oSFs1*Uxq`h9t)q9UuE}3@BG@`bRh;rd* z*Ya{2SXM(N&9PPY~Ny3k?CJDOX|&W*~Tp0Zc{cj zG~$|bz&djmGV|BOKo$JM!S>;@sezGM*ofJQ#I$e%vlcr@p3as{eHf|XLu3pxvo)bi z-RS!lS?xz(XNf-BcHV>DxPBS^uub=!v4UIYyL3LzTsqDDW1_ZPurb@W{h`h7_SV|p zdt-Y-2p>p&KIS0T_UuY4+ChXc8eL4|uNaCO-jw%P=azR&&!$TWwvV+bZzA|EgB359 zUibRM?@iQ^gyAdE`1@{U>JL{**Bb?woFdy4B6@34%tBX;XCfTCy5{-P=(t^9CmgQtFjlM34cMkyuE1d zFmx>?5rCaO03HF*|BT?%-|$qXO>(odQb7QquMI$nF@l84>*C^DD%}1u>a*bn#>DR8 z_ga5-F2fmQH}Cz`8~6-%v8h!yh|8|6mjvB~W+vc+^f%cO(xJYdDp)c57;m7-3qD;4 z^3Oa$#jH8}y$(3}f-A@^B=>rgn>=$1V>V}P@gj(+h(OJ-VFa^wXJc&k^p0xU&> zL%_ak-?#ubFQ@CEOKL0mNodwJz_)%>%iO5&F zz}&$bqj-RKu!8}UisgfM@2_Slg2GXVpt(FPm_hLSi{ARdmw{MyLz-6@UC>goc#&^160t0JCL#Kqf!&Z7 z?_@5Gwm~n=Fqr-Lxx*!f|WS%`Rm=ZML>TX z4Y&vHACyrI#&yLye{=FVO%k|zU=|@3Jxtf^_CL8G~Jaxp_Jo&_Z4+3Cs_5Uk2f^+WrG9u71N&rF?mzte-d442#a6r*xUp zE6O7)<`3SmI34hDrC3X#fZhV4qcjlStCdHnNKkU@g~G3%_B~ zNH~(ydXp+B#anW2MfSW+gV>) z21CJCtp3{~{=e1uC!@(f7pMM<%+6x?he=nP~a$`t*j|K~3^9b_wMT@2;CTXb(c!fk$*ZVX|+|87i@eF>jg2Egl3 zy{V^l-FIwU<@$Bxx(=D6Jp%yd` z0ASyR^Jgyu0A+oJ0xk~LW%+j32I~R|x@=+yia$zxV=dS{49pDxD2v~_<+_Kp<_mZv^V-6! zJm4LFe3+gmRXcKl!Rc}~W%+mr@O!b&rdF3S&tAh8z}6;>zp#}nB^}5)b}LT0PuIQvkrZ%bF&}#=>b3_I{;iq0nk7E z_ip-sb?G2U)#_76Ic_V=%IkV+>rS~zV%;5AT2nFeVj=(BBNAAl`(JkXkIO$s|0U)t zG{hLT2Tx)_0@E(}Kc?tk3*H}F4G)p>Uk+t<52dCA&piw5*F?|OdJI7T{!b+QYuo%4 zPycz!&rGM!Chi>)VhV!18w#`EVE^t)nz<71I98nh^7&~YX40XGv_p(naWG94th*U( z^%09Rep18#N2W!|EEs`~`+qBW$2Ub75N8Pb?A{ChV6~gFz>)OE2_Mh=-DPMI5@!bb z5;@q&D0ciI-%mBv-HF$j4;=U8@iZ==Yu_30A!4IS0(aWEGH^9|$%apNHP}(N%pC`D zKMV>>wH{9Vrn{)TYj85`l=JnHmDSugP5E0-<5RX8-iIkPZ}wtv<)=&lK@JqIEH@T(y^FfNHxm*OJhYf~4Z#7wOjI2)5$HRiT{68c(GP(D* zMPPk;Crw*>PZdp3>I*xA+F8^K9F$U*n${|bQY}m0@i9D~mR5zC2M*uK)~zk-%s%&f zauq7Wx!k(f>jz(^6S0)P6tG#L@nzpi=Pj6+fm<3CSFY_@=*Ws=liGTpR>1^*ni@H7)DsLxYOIOm3oSWf`G^I#>Xmc~%MMTiBEUPo#zuO= zWp;U_fFDBFHv{?G`bJz&3d}Z?Civwi)EPsLh%uZ#Q1CQu10&T9pQq zF88X%J=*>=1-#mqlrz?5+()&>gQ|xv#Dwptdey49k7{Cl{y>a->O=4K7bb~y>V{J* zgd1zjuoe&HX?QT=dhQ?DeYSsujb1f*aD=MS!QYLDw#wMiot2h6XZN-#skte=1W>9& zWKe0l3(PQk6JJlPo}qw}>G&vhys6!$;#aFpzjW&$G^*!Yt;b3|8@>2UyVvtwjf9MD zf-Q+}T7)@HO48n5y|Fg9&g0^U73#N=Ps*5G7j(aV-sF>pP_<<;6*);~tSi`1L(7l< z33T@q)@!p@Uz3UV%4Ra0PHx?56sIboxqLlVff{D~)AICHnA4=WSaCd4f{Rfq6|8KL zBTRb}t)=^_k*GV{2e!`?8V~byKG@@V?``W!VWoepo|JwBKdqyqi8ueLn}9I$@m*5q z>47brbG(z+4mqe!@cpIe4!n6JJZi1$y%Y@z032(3H%;Wlex44g`zebridyy)Rn_7M z%;}C%s4a0W8+D*qg_8!!^t9()#q7E4T|fGfQgF*Lqs{1dRQo>B-sXXzn$v*Et$?ea z9d`%kKP!P{9LsMVyC>a8*~k5o>TCL}gyr5z(JyQj<)M)?^zDd+6$15kjtsq!gp#Si8FTQrHBQZmjh*z{|Mm?xglxqQxDK-e zer`aI&e3Y03{{#vCg8`o+OcGgj~2m}=J|WfQM&&q@7Ae<-AgfqoRgTcIlI;xi-KBp zRoe29W+O}2{?uj_p&($B6Huo4z}#6|j+GyZFtd$KpBkbD1%rKBz;g$v5sIMX4DE=T zI2hZUR}7$|N$B1DX|j+v7ab*$`MUD{w0|yc+p#_JP!eppOd{+EnDI6TYw?$Bc2Mn+ zLLX2YSCEjp8f_3}!_yPd9pu91h73i5jy7{hW*5nsCSNKe17;>?L8iWe!-{A}^Dhv6 z*E{ez?aWFaD0!911oPKuj}>P7x)b2U+0y3)qc7P4xLfvcSif3bGP(nF zR=ojzR(i#aAF5o##yTQuYyAthaY>KWa-&=jjwO?+r2Vv?ebAyErr9NlpN!cogtIs2 zn=)cH0z{N!pb1_NfF+HT*M4R86_cTkmxmn!n1%^k1y9(0vGAG7sNp@Js)8m7+A?xV zlOy}*gn^)093_pzed!wT3@^Bp#f}f(wB0v4m>NA%BU0oLF!T;UT;Kxw#f9d?JfuN~IarWDk zg)uC*+-JJmv8dNuwM|R6h~nZJTZ|5mBTW-SwJyPS1ABZ*Gs~y|$^6k8B)Pz85=^a*yGMrAK%kiiA(=S?G*)xTpDh&?!CSE7`Mmu* zhg2*HA8a97D>IBV#G@}wsK+R*rlX47bfFxw>)M&3P+W{z0ISw4N zmQ$Q(nusF5FzSWTol7TU&!mt~A-nlTp{c)XL^>DnFZ_m+ zXJx~rjMl3;b{j+z3ykBXeAg9Rs_y8$Rm|?E%=u6jMwWbnb=TW4Fd~&Jh{KmwJ21{i z&P?WZ=%UJZzYHjWC(T&FEV9hHkxW57e9CMIE3+C%|CIOkT?D=yc+q@2?L>&oskq_x z$&8J544>ItW!>Tozk_gVoU!l0hBOngo1AQk70rsU?`^pd)b ztgzbM!fEm~6%rOo*0hgn?sXS`!qKSMyyXM)cdt-yym>vA9=tlhN!BSQ9g5$%O5KMr zGUYazig1PNP6Ts=<4&X z5W3Q;?6(J=w3NAJ5lM#^K9x$P)kcaT@PXW*L^SJRxK49ltQIP!zvqy?YP;~ee`&N}Lt!nMWubUXJ ztrSXAeoB2N-_x=?Y9iXDJuTxPw(BL^DXd?c=QWz73j!)4dITuNS>DvjfD`Q%DL4nW z2hX?Fj=Atc$rP>ZTSNz0N_~3HoatCu%m`aY4wppM1D~_kmA|~sPl>7KFYdRM91WRP z96PV#HwWXn{$8vcr$m3Lac0-5eLP`kA0A!nZ4|--u@ZVFg@)z`K*#jXt%;85x_jrR zA-oDh_2R~%Jbsh#EvkQ18?gIG>2C()6nE?Kq2=TEQ;l={^IUITXGvJulmmom(!Cl45O1D`8)g@!nY5K;Fv%Uo9cF7k^p zst&vpaW7w&gI#o8V4iuq*KJidA$fd$NBwi6Z78a{p)gyAG}Wc_%bjP-Z6d!hy&qq%bX3I_8RHYR zw~KH*s3wKU$todGFSVTQK zGbQ_oKj2xG4o&%fk;xme+A+8XE$~?&FUGr!&*Kn77!4{kzeY8@pfi-31^> z4A+bs4qH`HGX!Ul48nR}g$)b)WuG@kQ<|5)6h%H<6Wg{qasOlc0^yxjL~6omU~@wR z?2PpwTB%bFkpdtM(fX02F;PHYqfL6s<6y~Q_Js2c0=hKO<^c43_Ih*Rnjrb2se#fX zS%P)Xnsf4flxiefX_oF+KYeU2XM-Xkep(Sda+kvY?i$+P%*cDX_T07B!B1P`HNNxb zv~s^ENiA1Nz|%{J9<9|mi_MGuUt_&4(uO)7j69XuEg}Z7{vOrnn+dO%H~&UmEeahT zkUM(Y3HgPfq!Z>L-btRwg3Q6C`x;vr0|4cZ_H4m- zab@8kbEi-MK&$IobnzMJ(?#MaD7$)~~k}_X6F+|`kB*P?yXS}fPT&S;Zv@+jMYBoDq z7L9n%4{RPXr9XcI;q!dkXT2T=1gyq7sc4?yrK(T?_YeJr;rH!Ln8q1r2ilP?HJV0neC3a#?k>4f;?h4iF7qQqxmkg7 z^kQe*GWXw}gFy~KXy!{Lr^GYC!;ipwuEKcrFXFAh2VzI_f0DDc?j8~dIw}|T%GwGV znWl@TSGBg)7t8fTq9Ek>{Sjk|%oH3d?yD@0*={+U)2X)j@J!`{8Y`sxhCnhS$`4y1 zF_Lg&KvQXOJ5^ls*D@s{pp%WmV9Lp6&B?JN5lZe_TQxg~0ZmI+sY{%lU#m;=65F-M z*4{@uG@3Pc`n^kid$4^83E9Hlx*dhSDO8I2csV5rjdC-5k8wK=_ZUxq-g}=Ckp0CC zYLLKCYul$Y$fToKYGnY?J6bu}aNvBR_FKc{E5$g=zc0ce+ttOQA3*tL%YWrk{Z}>< z>#8kJwnx{j2CSz*Y1KsLaa@_EE;=~veANNI*>S1(86Y<%U2Y~mNQ?83zqv;Q8dIGR#e;WuEjQf2! zL8alq+C7Ki9sx^nM^56x1jYz|uMrv7A?gE-AJ_Y*!gN}_LXj`f;~$HbR))Q+xs!qU zXt9oJ8iexmOCUDafwzjI?n^Jce({I$T`-bG)vCH}qxpzr*l=;zL%o~$4WQb)+m9WN zD1|o)>Ay~vFKx!`q9-canNAdX%Xu=B|oSWk0 z%2IQ%BQEFSoobxN)-63>wZ=PTgO=H97b|7l&osQL=S7@y#ZQ>RxD)n~_@nHx;GUNh z>WZgMqdNVw8;^am6auoO1F5OY6U>DBy-`L!Zn>M(EGeeitx(WDw2Uu`oVv((#8_EcN}$^r9%$DdluZ-WwFJdQA+bAe>kq*F zvMy7|2T@CCl)+A4&sV?PuryJ}!nAm!g?~)znE6~)y*1pU>X#X5uj>)#a2#6Os)=@- zP5bNQ4(Qf~sF?L1MeZ)jULJ#gbX2mXrRe7iR}N;F-}Sj{T`I-tHw2mvZuQ699&D)` zZk{?jzYttpBH9Ki`i$G(0n#1VeJ+0W)99>&t9UZfj-Aj?tA^ z!AFcui_`?ykBC-J-t|gW`)p8e#u0`f8n|& z%O^QcQWvIQC@MGGCcPbkwCa{_{Slf~?G^cKbI$#dsOjM5+%lDQ_L_H=PSM=m)n~$$ zBRwKxu3^YitIjT60j%l0ON7Zg`3;bT*6%@4rtxu-l!OJnjHBnpRK6Z zRvx~3=_e)~eT>q1J5{(`jB}C5O4o|eXq;IWDQqADB1~UAHplaLNc!bUBEZ9!?|FtR zaMRRstkDKU2fUITi6M|Pt6jKNRY8wB>6dJnBK_CR!~uE!Y__%G_%|DZlg>+2<=8`* zl~Zs5qlSrA;tw}1KxS(RT)iD23oiw;Q_@7?)q z9W6ZmJQ$${&nxsiIZYSD%4kHKN@41Uu%oY?dOii8DG_157Cf!`yYtJlq*ucYRo4eN zL{n&k`!pe4l3NRL-@#Wh5B4eb6uYXfeF+g}Oa0RN%A7pOkvgzmv9X4;@r2>+)i)!@ zw7=)4eCH75vIbMj?iHMY7=O52;3ErCr)opZa`NDrDsTr*NPM2)q{ibwKy*$4=G6=v zk@@}ycMpjPgY&a&EL8bF-Rb1muKM8 zzw@5I`Op9Ph#q*fkNs(VVCp&n)8Sn@;TV3ivB>?xXhxCFa6uopy>$*|o2>d2j+f33 z_vG6%toq+N((+lq&(D=(v6ue#$R^?-J0kyD(-T^41!8bynp^BQsbb!sIyMW78)_P- zZ;10X;K6%nzB|h-?AHx!XmOO#qy@JjXRp?>uwo?WCl}5+fQKYPg{2SOFj}?@`fczG z>;lUk;~IQtRlxTB7HzTz1UB}pzpiiy3UO>ws|ZQSTp?ARM4g5*LyxDpLhKu>h6r}u z0?A%>k#8X`?`S`hl;_i|ZDY?rFr1bcfNAThXH-)digy3M0pK6|iEFPh@5YD8%>Lzs^T$6jq- z5xCaLB4<-dVn<8_=E=kz7%eqTsM11vTW*n0Ar+j_3~+nMsms#w)}avbc^;{e(O!~> zYRq@DKMwXzo{DvPsSDy}w$oFi7%vILc@c}d`AJ)iFDb;k%AHr6l<9+ou+u`OdCZIc zt>ssr570a-(T(<`bdHa`DspY!+Ro{dj1>$ut?mIgAoYAbLd*Mcg4BTXmUYT@N9dQ4 zY?c<3KHKluVuqj%32seUyN38W5=%CVp-$74l~ptDQ|Z@62@}4Y>!_#;KJ9@ovR7da z!w{{c5^FRnY_>{v=FYr7knpR^E-Mn(UJV9|EqQ%*uVI<+|0Q80|2W}PR zYWC(#X5Fo(s;GG=>$HAxk#6aBZdw<#Tm_5Q5gMy#@W&STt_%^XYclNTm!7nZlh>oJ zV|VK73G;2t>1|SWYs`^wOT4J<8?j9_l123Lm{!xmtdE1sR~(JD+hdbxsN9)2+Q3pO zIQm(Ju=ctrqwd)Iv0E!<1{uQ0M(+uO^*YC;$Mca_BOwc+?NB@WD$vP!+!6WOW36-U z4iT4D!`eRW4{DP)(h{oB6jGQp4QTRwne@i)C>X z%WLgfRJ(R=FbI38KWN13Cr0CrtP6C~mJ(1VBk&_oigx|=#%S)Ke2_2ftAp6b%_>8qU2q4_>1a+$(MGjc^HB=XXjHKgedw0hq&L$O+ayge458dwQy;l-2(>ud1JoZtOlex?7ilfEUMrQB!J^FjD zgYv0l?Um%2Ct-T67aw0d)D0$RcO%mOGNWi$A`ekY7UFk-V!nsT}Qx) z_^~&1T0V5Vq6DOl+X#Hy&MH<4UvK!P_^nPVsxK%&70AmDyT+-N;1ZpzUR;NB`O_y; z&TiiYg?256WG~a`3hrm|45|%j4VDC3 z(=(g1{P8rRC&1KL39bw*s;=3XSnur0&@2HGOPA4TN3gZicdD%1F~}8q(N3sK*3R5) zkoi(SzOZUoeV4OcD-|XUi!<_i_O5m&N?k*NALyGildfh+)fE=aDLf6T?h$zn*Zrjy zU(2ae=%S9y@f4+DyQl};S2ylhiA2H5%}&Q_#NDJBNqev8M4QHG&>_g`GmP+1UjApB z)*PYMi{bIwXS|sh<{`VO;H7R^)HUPhYQ6kGed`w|`d_vN46vsEBFyL`0?i52Hk zO)wIr6#4;vCbX-kj+`iS*(l9Qr{V!ZcPB4$4l7si>|A7+Q=p_%plq z>@v>gQaPjD&ACz68p_THq%~woc!?)m_l-wBZ;LO|DOGJBen@eNe7V1Ov`|r0IVreWB>pF literal 5761 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 diff --git a/katrain/img/flaticon/settings.png b/katrain/img/flaticon/settings.png index 3d45e9a1e140d6477073e69b92d289ccdc7b81d3..0dc8f111742002ab0184b4a50f127613580edb4e 100644 GIT binary patch literal 5819 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�)Wt(vZ8{v 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 E09=2Am;e9( diff --git a/katrain/img/forward_-_child.png b/katrain/img/forward_-_child.png new file mode 100644 index 0000000000000000000000000000000000000000..0ad86384ac879ada7d900555f6ead2b11735682c GIT binary patch literal 3614 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 zk69--umdK II;Vst0J?}&5&!@I literal 2309 zcmd6n|4$Ql7{{Nxmfk7QmZ5wtyB6L2mMV#Y;3`}d2Z&{gE;2E!txk<1RLNLzVoxhA z%uF3(_60LB(W&zbu!(5G((CG`G91RQ6&)U%16f>l6Vytvx6e7)5B>qeOD>=1$@6(G z&pprUc~>pW$p{@CGa3Lwvoh0j0dQpEK+4e3Z@o5v4y+_MV-B4BS=Eai>1w?}574+P zc+eDt{85(7cS-={9`VJ_7av&(Kz@;xu3us;`15vl(I4~}+RZ<9_2`R;7~^E>3VWj{$&9g$Iwp*>r9=e%Y%%Mn(s*|^_+ z*6vpD9oyLyVq=9{(Ga2GFX|s83}QFNbf3H zdE0Qp|9s)HsbG5N%)SUHjZ5k)%}RQqyzpZ#f!c^I^ew`;2(kXw)KI@l$z)HiHH+?i zm!dfcxV&DQSxl`FGFr3%b9;Mj7YJ63L&sW=O$mEQSTk8J=s^{Rf%bY=8p(vmL)`)0 zAc0x7l8~2Q?o;4KC$jc*32x1D4GuTVKHEm+2TC03FL7x-^s8zq6zp)j+TEK!i2`eZ zOjs|!?<8@?W%5c!4qM%~o|cD(ziP{Z*=e&1yR{0-ns<#}iEf(SLOJ`vPH|0@Tg&C$ za#aM5Bi%^7fEEPB~Si^mRmFw1=uY@G6FLm0gOt7-!#cg`N7tXRv*1K)_;C9i`8Ii9>&)+pyS3oD-|%^} zjy+Jm)uiBCr0#On6-mez=4QO?amr_JL=8f{f!tT3UW%-BVfcR4Ik|^28sa(o+%rf7 z^J)=+tC4^@Hc3fl9Ma3|6h!MvpJc|{NI(lwC7 zI{6=y!!^WpC;nDGy%;mzG)*u5bmh>Z4a<0Pubr&fUf#q2|kgb2Ee>Bu^wEBonHD`RZ2@#IP{9oEsOgLo$-a zm{w6#BN3%d*F|1Sk(C%7pj6+FMU-kC!USRip#i=lBv2y1hs^=5DQeKKYKyGGn4b6e ryWPx|N;UXm9kWM{O}1~-hkixp_>T|8tXP^M){!+YC;j9c