From 7fa360992a862fbe4daacf11a847199715c8be85 Mon Sep 17 00:00:00 2001 From: Samuel T Date: Tue, 9 Nov 2021 17:47:07 -0800 Subject: [PATCH 1/8] Livesplit integration (#60) * Added LiveSplit Integration Single Source of truth for version number * Fixed freeze on close by using killable QThreads and an os.kill signal Also added the icon to the build command Co-authored-by: KaDiWa4 --- requirements.txt | 2 +- res/about.ui | 2 +- src/AutoSplit.py | 257 ++++++++++++++++++++++++++++--------------- src/about.py | 3 +- src/menu_bar.py | 11 +- src/settings_file.py | 7 +- 6 files changed, 183 insertions(+), 99 deletions(-) diff --git a/requirements.txt b/requirements.txt index b9c87383..249bcf65 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ # # Usage: pip install -r requirements.txt # -# Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F src\AutoSplit.py +# Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F --icon=src\icon.ico src\AutoSplit.py # # You can find other wheels here: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4 # If you use 32-bit installation of Python, use the the 2nd URL instead. diff --git a/res/about.ui b/res/about.ui index d247f2c3..f6fe56a6 100644 --- a/res/about.ui +++ b/res/about.ui @@ -65,7 +65,7 @@ - Version: 1.2.0 + Version: diff --git a/src/AutoSplit.py b/src/AutoSplit.py index daed4516..16a10401 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -1,5 +1,7 @@ from PyQt4 import QtGui, QtCore, QtTest +from menu_bar import about, VERSION, viewHelp import sys +import signal import os import win32gui import cv2 @@ -7,16 +9,17 @@ import ctypes.wintypes import ctypes import keyboard -import glob +import threading import numpy as np import design -import about import compare import capture_windows import split_parser + class AutoSplit(QtGui.QMainWindow, design.Ui_MainWindow): + # Importing the functions inside of the class will make them methods of the class from hotkeys import beforeSettingHotkey, afterSettingHotkey, setSplitHotkey, setResetHotkey, setSkipSplitHotkey, setUndoSplitHotkey, setPauseHotkey from error_messages import (splitImageDirectoryError, splitImageDirectoryNotFoundError, imageTypeError, regionError, regionSizeError, splitHotkeyError, customThresholdError, customPauseError, alphaChannelError, alignRegionImageTypeError, alignmentNotMatchedError, @@ -24,7 +27,6 @@ class AutoSplit(QtGui.QMainWindow, design.Ui_MainWindow): invalidSettingsError, oldVersionSettingsFileError, noSettingsFileOnOpenError, tooManySettingsFilesOnOpenError) from settings_file import saveSettings, saveSettingsAs, loadSettings, haveSettingsChanged, getSaveSettingsValues from screen_region import selectRegion, selectWindow, alignRegion - from menu_bar import about, viewHelp myappid = u'mycompany.myproduct.subproduct.version' ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) @@ -42,9 +44,12 @@ def __init__(self, parent=None): super(AutoSplit, self).__init__(parent) self.setupUi(self) + # Parse command line args + self.is_auto_controlled = ('--auto-controlled' in sys.argv) + # close all processes when closing window - self.actionView_Help.triggered.connect(self.viewHelp) - self.actionAbout.triggered.connect(self.about) + self.actionView_Help.triggered.connect(viewHelp) + self.actionAbout.triggered.connect(lambda: about(self)) self.actionSave_Settings.triggered.connect(self.saveSettings) self.actionSave_Settings_As.triggered.connect(self.saveSettingsAs) self.actionLoad_Settings.triggered.connect(self.loadSettings) @@ -54,6 +59,57 @@ def __init__(self, parent=None): self.skipsplitButton.setEnabled(False) self.resetButton.setEnabled(False) + if self.is_auto_controlled: + self.setsplithotkeyButton.setEnabled(False) + self.setresethotkeyButton.setEnabled(False) + self.setskipsplithotkeyButton.setEnabled(False) + self.setundosplithotkeyButton.setEnabled(False) + self.setpausehotkeyButton.setEnabled(False) + self.startautosplitterButton.setEnabled(False) + self.splitLineEdit.setEnabled(False) + self.resetLineEdit.setEnabled(False) + self.skipsplitLineEdit.setEnabled(False) + self.undosplitLineEdit.setEnabled(False) + self.pausehotkeyLineEdit.setEnabled(False) + + # Send version and process ID to stdout + print(f"{VERSION}\n{os.getpid()}", flush=True) + + class Worker(QtCore.QObject): + autosplit = None + + def __init__(self, autosplit): + self.autosplit = autosplit + super().__init__() + + def run(self): + while True: + line = input() + # TODO: "AutoSplit Integration" needs to call this and wait instead of outright killing the app. + # TODO: See if we can also get LiveSplit to wait on Exit in "AutoSplit Integration" + # For now this can only used in a Development environment + if line == 'kill': + self.autosplit.closeEvent() + break + elif line == 'start': + self.autosplit.startAutoSplitter() + elif line == 'split' or line == 'skip': + self.autosplit.startSkipSplit() + elif line == 'undo': + self.autosplit.startUndoSplit() + elif line == 'reset': + self.autosplit.startReset() + # TODO: Not yet implemented in AutoSplit Integration + # elif line == 'pause': + # self.startPause() + + # Use and Start the thread that checks for updates from LiveSplit + self.update_auto_control = QtCore.QThread() + worker = Worker(self) + worker.moveToThread(self.update_auto_control) + self.update_auto_control.started.connect(worker.run) + self.update_auto_control.start() + # resize to these width and height so that FPS performance increases self.RESIZE_WIDTH = 320 self.RESIZE_HEIGHT = 240 @@ -118,6 +174,7 @@ def __init__(self, parent=None): self.live_image_function_on_open = True # FUNCTIONS + #TODO add checkbox for going back to image 1 when resetting. def browse(self): # User selects the file with the split images in it. @@ -283,7 +340,7 @@ def checkFPS(self): # undo split button and hotkey connect to here def undoSplit(self): - if self.undosplitButton.isEnabled() == False: + if self.undosplitButton.isEnabled() == False and self.is_auto_controlled == False: return if self.loop_number != 1 and self.groupDummySplitsCheckBox.isChecked() == False: @@ -306,7 +363,7 @@ def undoSplit(self): # skip split button and hotkey connect to here def skipSplit(self): - if self.skipsplitButton.isEnabled() == False: + if self.skipsplitButton.isEnabled() == False and self.is_auto_controlled == False: return if self.loop_number < self.split_image_loop_amount[self.split_image_number] and self.groupDummySplitsCheckBox.isChecked() == False: @@ -335,10 +392,10 @@ def reset(self): # functions for the hotkeys to return to the main thread from signals and start their corresponding functions def startAutoSplitter(self): # if the auto splitter is already running or the button is disabled, don't emit the signal to start it. - if self.startautosplitterButton.text() == 'Running..' or self.startautosplitterButton.isEnabled() == False: + if self.startautosplitterButton.text() == 'Running..' or \ + (self.startautosplitterButton.isEnabled() == False and self.is_auto_controlled == False): return - else: - self.startAutoSplitterSignal.emit() + self.startAutoSplitterSignal.emit() def startReset(self): self.resetSignal.emit() @@ -402,7 +459,7 @@ def autoSplitter(self): return #error out if there is a {p} flag but no pause hotkey set. - if self.pausehotkeyLineEdit.text() == '' and split_parser.flags_from_filename(image) & 0x08 == 0x08: + if self.pausehotkeyLineEdit.text() == '' and split_parser.flags_from_filename(image) & 0x08 == 0x08 and self.is_auto_controlled == False: self.guiChangesOnReset() self.pauseHotkeyError() return @@ -421,7 +478,7 @@ def autoSplitter(self): self.customThresholdError(image) return - if self.splitLineEdit.text() == '': + if self.splitLineEdit.text() == '' and self.is_auto_controlled == False: self.guiChangesOnReset() self.splitHotkeyError() return @@ -444,7 +501,7 @@ def autoSplitter(self): return # If there is no reset hotkey set but a reset image is present, throw an error. - if self.resetLineEdit.text() == '' and self.reset_image is not None: + if self.resetLineEdit.text() == '' and self.reset_image is not None and self.is_auto_controlled == False: self.guiChangesOnReset() self.resetHotkeyError() return @@ -530,7 +587,10 @@ def autoSplitter(self): reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: - keyboard.send(str(self.resetLineEdit.text())) + if self.is_auto_controlled: + print("reset", flush = True) + else: + keyboard.send(str(self.resetLineEdit.text())) self.reset() # loop goes into here if start auto splitter text is "Start Auto Splitter" @@ -566,17 +626,18 @@ def autoSplitter(self): else: self.highestsimilarityLabel.setText(' ') - # if its the last split image and last loop number, disable the skip split button - if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): - self.skipsplitButton.setEnabled(False) - else: - self.skipsplitButton.setEnabled(True) + if self.is_auto_controlled == False: + # if its the last split image and last loop number, disable the skip split button + if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): + self.skipsplitButton.setEnabled(False) + else: + self.skipsplitButton.setEnabled(True) - # if its the first split image and first loop, disable the undo split button - if self.split_image_number == 0 and self.loop_number == 1: - self.undosplitButton.setEnabled(False) - else: - self.undosplitButton.setEnabled(True) + # if its the first split image and first loop, disable the undo split button + if self.split_image_number == 0 and self.loop_number == 1: + self.undosplitButton.setEnabled(False) + else: + self.undosplitButton.setEnabled(True) # if the b flag is set, let similarity go above threshold first, then split on similarity below threshold. # if no b flag, just split when similarity goes above threshold. @@ -637,7 +698,10 @@ def autoSplitter(self): reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: - keyboard.send(str(self.resetLineEdit.text())) + if self.is_auto_controlled: + print("reset", flush = True) + else: + keyboard.send(str(self.resetLineEdit.text())) self.reset() continue @@ -647,9 +711,15 @@ def autoSplitter(self): # if {p} flag hit pause key, otherwise hit split hotkey if (self.flags & 0x08 == 0x08): - keyboard.send(str(self.pausehotkeyLineEdit.text())) + if self.is_auto_controlled: + print("pause", flush = True) + else: + keyboard.send(str(self.pausehotkeyLineEdit.text())) else: - keyboard.send(str(self.splitLineEdit.text())) + if self.is_auto_controlled: + print("split", flush = True) + else: + keyboard.send(str(self.splitLineEdit.text())) # increase loop number if needed, set to 1 if it was the last loop. if self.loop_number < self.split_image_loop_amount[self.split_image_number]: @@ -678,17 +748,18 @@ def autoSplitter(self): self.currentSplitImage.setAlignment(QtCore.Qt.AlignCenter) self.imageloopLabel.setText('Image Loop #: -') - # if its the last split image and last loop number, disable the skip split button - if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): - self.skipsplitButton.setEnabled(False) - else: - self.skipsplitButton.setEnabled(True) + if self.is_auto_controlled == False: + # if its the last split image and last loop number, disable the skip split button + if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): + self.skipsplitButton.setEnabled(False) + else: + self.skipsplitButton.setEnabled(True) - # if its the first split image and first loop, disable the undo split button - if self.split_image_number == 0 and self.loop_number == 1: - self.undosplitButton.setEnabled(False) - else: - self.undosplitButton.setEnabled(True) + # if its the first split image and first loop, disable the undo split button + if self.split_image_number == 0 and self.loop_number == 1: + self.undosplitButton.setEnabled(False) + else: + self.undosplitButton.setEnabled(True) QtGui.QApplication.processEvents() @@ -733,18 +804,21 @@ def autoSplitter(self): def guiChangesOnStart(self): self.startautosplitterButton.setText('Running..') self.browseButton.setEnabled(False) - self.startautosplitterButton.setEnabled(False) - self.resetButton.setEnabled(True) - self.undosplitButton.setEnabled(True) - self.skipsplitButton.setEnabled(True) - self.setsplithotkeyButton.setEnabled(False) - self.setresethotkeyButton.setEnabled(False) - self.setskipsplithotkeyButton.setEnabled(False) - self.setundosplithotkeyButton.setEnabled(False) - self.setpausehotkeyButton.setEnabled(False) self.custompausetimesCheckBox.setEnabled(False) self.customthresholdsCheckBox.setEnabled(False) self.groupDummySplitsCheckBox.setEnabled(False) + + if self.is_auto_controlled == False: + self.startautosplitterButton.setEnabled(False) + self.resetButton.setEnabled(True) + self.undosplitButton.setEnabled(True) + self.skipsplitButton.setEnabled(True) + self.setsplithotkeyButton.setEnabled(False) + self.setresethotkeyButton.setEnabled(False) + self.setskipsplithotkeyButton.setEnabled(False) + self.setundosplithotkeyButton.setEnabled(False) + self.setpausehotkeyButton.setEnabled(False) + QtGui.QApplication.processEvents() def guiChangesOnReset(self): @@ -755,18 +829,21 @@ def guiChangesOnReset(self): self.livesimilarityLabel.setText(' ') self.highestsimilarityLabel.setText(' ') self.browseButton.setEnabled(True) - self.startautosplitterButton.setEnabled(True) - self.resetButton.setEnabled(False) - self.undosplitButton.setEnabled(False) - self.skipsplitButton.setEnabled(False) - self.setsplithotkeyButton.setEnabled(True) - self.setresethotkeyButton.setEnabled(True) - self.setskipsplithotkeyButton.setEnabled(True) - self.setundosplithotkeyButton.setEnabled(True) - self.setpausehotkeyButton.setEnabled(True) self.custompausetimesCheckBox.setEnabled(True) self.customthresholdsCheckBox.setEnabled(True) self.groupDummySplitsCheckBox.setEnabled(True) + + if self.is_auto_controlled == False: + self.startautosplitterButton.setEnabled(True) + self.resetButton.setEnabled(False) + self.undosplitButton.setEnabled(False) + self.skipsplitButton.setEnabled(False) + self.setsplithotkeyButton.setEnabled(True) + self.setresethotkeyButton.setEnabled(True) + self.setskipsplithotkeyButton.setEnabled(True) + self.setundosplithotkeyButton.setEnabled(True) + self.setpausehotkeyButton.setEnabled(True) + QtGui.QApplication.processEvents() def compareImage(self, image, mask, capture): @@ -920,41 +997,43 @@ def updateSplitImage(self): self.highest_similarity = 0.001 # exit safely when closing the window - def closeEvent(self, event): - if self.haveSettingsChanged(): - #give a different warning if there was never a settings file that was loaded successfully, and save as instead of save. - if self.last_successfully_loaded_settings_file_path == None: - msgBox = QtGui.QMessageBox - warning = msgBox.warning(self, "AutoSplit","Do you want to save changes made to settings file Untitled?", msgBox.Yes | msgBox.No | msgBox.Cancel) - if warning == msgBox.Yes: - self.saveSettingsAs() - sys.exit() - event.accept() - if warning == msgBox.No: - event.accept() - sys.exit() - pass - if warning == msgBox.Cancel: - event.ignore() - return - else: - msgBox = QtGui.QMessageBox - warning = msgBox.warning(self, "AutoSplit", "Do you want to save the changes made to the settings file " + os.path.basename(self.last_successfully_loaded_settings_file_path) + " ?", msgBox.Yes | msgBox.No | msgBox.Cancel) - if warning == msgBox.Yes: - self.saveSettings() - sys.exit() - event.accept() - if warning == msgBox.No: - event.accept() - sys.exit() - pass - if warning == msgBox.Cancel: - event.ignore() - return - else: - event.accept() + def closeEvent(self, event=None): + def exit(): + if event is not None: + event.accept() + if self.is_auto_controlled: + self.update_auto_control.terminate() + # stop main thread (which is probably blocked reading input) via an interrupt signal + # only available for windows in version 3.2 or higher + os.kill(os.getpid(), signal.SIGINT) sys.exit() + # Simulates LiveSplit quitting without asking. See "TODO" at update_auto_control Worker + # This also more gracefully exits LiveSplit + # Users can still manually save their settings + if event is None: + exit() + + if self.haveSettingsChanged(): + # give a different warning if there was never a settings file that was loaded successfully, and save as instead of save. + msgBox = QtGui.QMessageBox + settings_file_name = "Untitled" \ + if self.last_successfully_loaded_settings_file_path is None \ + else os.path.basename(self.last_successfully_loaded_settings_file_path) + warning_message = f"Do you want to save changes made to settings file {settings_file_name}?" + + warning = msgBox.warning(self, "AutoSplit", warning_message, msgBox.Yes | msgBox.No | msgBox.Cancel) + + if warning == msgBox.Yes: + # TODO: Don't close if user cancelled the save + self.saveSettingsAs() + exit() + if warning == msgBox.No: + exit() + if warning == msgBox.Cancel: + event.ignore() + else: + exit() def main(): @@ -967,4 +1046,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/src/about.py b/src/about.py index 93f90bfe..4dd6b430 100644 --- a/src/about.py +++ b/src/about.py @@ -59,7 +59,7 @@ def retranslateUi(self, aboutAutoSplitWidget): aboutAutoSplitWidget.setWindowTitle(_translate("aboutAutoSplitWidget", "About AutoSplit", None)) self.okButton.setText(_translate("aboutAutoSplitWidget", "OK", None)) self.createdbyLabel.setText(_translate("aboutAutoSplitWidget", "

Created by Toufool and Faschz

", None)) - self.versionLabel.setText(_translate("aboutAutoSplitWidget", "Version: 1.5.1", None)) + self.versionLabel.setText(_translate("aboutAutoSplitWidget", "Version: ", None)) self.donatetextLabel.setText(_translate("aboutAutoSplitWidget", "If you enjoy using this program, please\n" " consider donating. Thank you!", None)) self.donatebuttonLabel.setText(_translate("aboutAutoSplitWidget", "

", None)) @@ -75,4 +75,3 @@ def retranslateUi(self, aboutAutoSplitWidget): ui.setupUi(aboutAutoSplitWidget) aboutAutoSplitWidget.show() sys.exit(app.exec_()) - diff --git a/src/menu_bar.py b/src/menu_bar.py index 598f8435..9cd18e5b 100644 --- a/src/menu_bar.py +++ b/src/menu_bar.py @@ -2,6 +2,10 @@ from PyQt4 import QtGui import about +# AutoSplit Version number +VERSION = "1.5.0" + + # About Window class AboutWidget(QtGui.QWidget, about.Ui_aboutAutoSplitWidget): def __init__(self): @@ -9,11 +13,12 @@ def __init__(self): self.setupUi(self) self.createdbyLabel.setOpenExternalLinks(True) self.donatebuttonLabel.setOpenExternalLinks(True) + self.versionLabel.setText(f"Version: {VERSION}") self.show() -def viewHelp(self): - os.system("start \"\" https://github.com/Toufool/Auto-Split#tutorial") - return + +def viewHelp(): + os.system("start \"\" https://github.com/Toufool/Auto-Split/blob/master/README.md#tutorial") def about(self): diff --git a/src/settings_file.py b/src/settings_file.py index 6e7e270d..3304858c 100644 --- a/src/settings_file.py +++ b/src/settings_file.py @@ -197,9 +197,10 @@ def loadSettings(self): keyboard.remove_hotkey(self.split_hotkey) except AttributeError: pass - self.splitLineEdit.setText(str(self.split_key)) - self.split_hotkey = keyboard.add_hotkey(str(self.split_key), self.startAutoSplitter) - self.old_split_key = self.split_key + if self.is_auto_controlled == False: + self.splitLineEdit.setText(str(self.split_key)) + self.split_hotkey = keyboard.add_hotkey(str(self.split_key), self.startAutoSplitter) + self.old_split_key = self.split_key # pass if the key is an empty string (hotkey was never set) except ValueError: pass From b2e93d7ad7bf19ed323d4ab07c3452bcc1912c12 Mon Sep 17 00:00:00 2001 From: Austin <37423484+Toufool@users.noreply.github.com> Date: Tue, 9 Nov 2021 21:00:41 -0500 Subject: [PATCH 2/8] Revert "Livesplit integration (#60)" (#76) This reverts commit 7fa360992a862fbe4daacf11a847199715c8be85. --- requirements.txt | 2 +- res/about.ui | 2 +- src/AutoSplit.py | 257 +++++++++++++++---------------------------- src/about.py | 3 +- src/menu_bar.py | 11 +- src/settings_file.py | 7 +- 6 files changed, 99 insertions(+), 183 deletions(-) diff --git a/requirements.txt b/requirements.txt index 249bcf65..b9c87383 100644 --- a/requirements.txt +++ b/requirements.txt @@ -4,7 +4,7 @@ # # Usage: pip install -r requirements.txt # -# Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F --icon=src\icon.ico src\AutoSplit.py +# Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F src\AutoSplit.py # # You can find other wheels here: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4 # If you use 32-bit installation of Python, use the the 2nd URL instead. diff --git a/res/about.ui b/res/about.ui index f6fe56a6..d247f2c3 100644 --- a/res/about.ui +++ b/res/about.ui @@ -65,7 +65,7 @@ - Version: + Version: 1.2.0
diff --git a/src/AutoSplit.py b/src/AutoSplit.py index 16a10401..daed4516 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -1,7 +1,5 @@ from PyQt4 import QtGui, QtCore, QtTest -from menu_bar import about, VERSION, viewHelp import sys -import signal import os import win32gui import cv2 @@ -9,17 +7,16 @@ import ctypes.wintypes import ctypes import keyboard -import threading +import glob import numpy as np import design +import about import compare import capture_windows import split_parser - class AutoSplit(QtGui.QMainWindow, design.Ui_MainWindow): - # Importing the functions inside of the class will make them methods of the class from hotkeys import beforeSettingHotkey, afterSettingHotkey, setSplitHotkey, setResetHotkey, setSkipSplitHotkey, setUndoSplitHotkey, setPauseHotkey from error_messages import (splitImageDirectoryError, splitImageDirectoryNotFoundError, imageTypeError, regionError, regionSizeError, splitHotkeyError, customThresholdError, customPauseError, alphaChannelError, alignRegionImageTypeError, alignmentNotMatchedError, @@ -27,6 +24,7 @@ class AutoSplit(QtGui.QMainWindow, design.Ui_MainWindow): invalidSettingsError, oldVersionSettingsFileError, noSettingsFileOnOpenError, tooManySettingsFilesOnOpenError) from settings_file import saveSettings, saveSettingsAs, loadSettings, haveSettingsChanged, getSaveSettingsValues from screen_region import selectRegion, selectWindow, alignRegion + from menu_bar import about, viewHelp myappid = u'mycompany.myproduct.subproduct.version' ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) @@ -44,12 +42,9 @@ def __init__(self, parent=None): super(AutoSplit, self).__init__(parent) self.setupUi(self) - # Parse command line args - self.is_auto_controlled = ('--auto-controlled' in sys.argv) - # close all processes when closing window - self.actionView_Help.triggered.connect(viewHelp) - self.actionAbout.triggered.connect(lambda: about(self)) + self.actionView_Help.triggered.connect(self.viewHelp) + self.actionAbout.triggered.connect(self.about) self.actionSave_Settings.triggered.connect(self.saveSettings) self.actionSave_Settings_As.triggered.connect(self.saveSettingsAs) self.actionLoad_Settings.triggered.connect(self.loadSettings) @@ -59,57 +54,6 @@ def __init__(self, parent=None): self.skipsplitButton.setEnabled(False) self.resetButton.setEnabled(False) - if self.is_auto_controlled: - self.setsplithotkeyButton.setEnabled(False) - self.setresethotkeyButton.setEnabled(False) - self.setskipsplithotkeyButton.setEnabled(False) - self.setundosplithotkeyButton.setEnabled(False) - self.setpausehotkeyButton.setEnabled(False) - self.startautosplitterButton.setEnabled(False) - self.splitLineEdit.setEnabled(False) - self.resetLineEdit.setEnabled(False) - self.skipsplitLineEdit.setEnabled(False) - self.undosplitLineEdit.setEnabled(False) - self.pausehotkeyLineEdit.setEnabled(False) - - # Send version and process ID to stdout - print(f"{VERSION}\n{os.getpid()}", flush=True) - - class Worker(QtCore.QObject): - autosplit = None - - def __init__(self, autosplit): - self.autosplit = autosplit - super().__init__() - - def run(self): - while True: - line = input() - # TODO: "AutoSplit Integration" needs to call this and wait instead of outright killing the app. - # TODO: See if we can also get LiveSplit to wait on Exit in "AutoSplit Integration" - # For now this can only used in a Development environment - if line == 'kill': - self.autosplit.closeEvent() - break - elif line == 'start': - self.autosplit.startAutoSplitter() - elif line == 'split' or line == 'skip': - self.autosplit.startSkipSplit() - elif line == 'undo': - self.autosplit.startUndoSplit() - elif line == 'reset': - self.autosplit.startReset() - # TODO: Not yet implemented in AutoSplit Integration - # elif line == 'pause': - # self.startPause() - - # Use and Start the thread that checks for updates from LiveSplit - self.update_auto_control = QtCore.QThread() - worker = Worker(self) - worker.moveToThread(self.update_auto_control) - self.update_auto_control.started.connect(worker.run) - self.update_auto_control.start() - # resize to these width and height so that FPS performance increases self.RESIZE_WIDTH = 320 self.RESIZE_HEIGHT = 240 @@ -174,7 +118,6 @@ def run(self): self.live_image_function_on_open = True # FUNCTIONS - #TODO add checkbox for going back to image 1 when resetting. def browse(self): # User selects the file with the split images in it. @@ -340,7 +283,7 @@ def checkFPS(self): # undo split button and hotkey connect to here def undoSplit(self): - if self.undosplitButton.isEnabled() == False and self.is_auto_controlled == False: + if self.undosplitButton.isEnabled() == False: return if self.loop_number != 1 and self.groupDummySplitsCheckBox.isChecked() == False: @@ -363,7 +306,7 @@ def undoSplit(self): # skip split button and hotkey connect to here def skipSplit(self): - if self.skipsplitButton.isEnabled() == False and self.is_auto_controlled == False: + if self.skipsplitButton.isEnabled() == False: return if self.loop_number < self.split_image_loop_amount[self.split_image_number] and self.groupDummySplitsCheckBox.isChecked() == False: @@ -392,10 +335,10 @@ def reset(self): # functions for the hotkeys to return to the main thread from signals and start their corresponding functions def startAutoSplitter(self): # if the auto splitter is already running or the button is disabled, don't emit the signal to start it. - if self.startautosplitterButton.text() == 'Running..' or \ - (self.startautosplitterButton.isEnabled() == False and self.is_auto_controlled == False): + if self.startautosplitterButton.text() == 'Running..' or self.startautosplitterButton.isEnabled() == False: return - self.startAutoSplitterSignal.emit() + else: + self.startAutoSplitterSignal.emit() def startReset(self): self.resetSignal.emit() @@ -459,7 +402,7 @@ def autoSplitter(self): return #error out if there is a {p} flag but no pause hotkey set. - if self.pausehotkeyLineEdit.text() == '' and split_parser.flags_from_filename(image) & 0x08 == 0x08 and self.is_auto_controlled == False: + if self.pausehotkeyLineEdit.text() == '' and split_parser.flags_from_filename(image) & 0x08 == 0x08: self.guiChangesOnReset() self.pauseHotkeyError() return @@ -478,7 +421,7 @@ def autoSplitter(self): self.customThresholdError(image) return - if self.splitLineEdit.text() == '' and self.is_auto_controlled == False: + if self.splitLineEdit.text() == '': self.guiChangesOnReset() self.splitHotkeyError() return @@ -501,7 +444,7 @@ def autoSplitter(self): return # If there is no reset hotkey set but a reset image is present, throw an error. - if self.resetLineEdit.text() == '' and self.reset_image is not None and self.is_auto_controlled == False: + if self.resetLineEdit.text() == '' and self.reset_image is not None: self.guiChangesOnReset() self.resetHotkeyError() return @@ -587,10 +530,7 @@ def autoSplitter(self): reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: - if self.is_auto_controlled: - print("reset", flush = True) - else: - keyboard.send(str(self.resetLineEdit.text())) + keyboard.send(str(self.resetLineEdit.text())) self.reset() # loop goes into here if start auto splitter text is "Start Auto Splitter" @@ -626,18 +566,17 @@ def autoSplitter(self): else: self.highestsimilarityLabel.setText(' ') - if self.is_auto_controlled == False: - # if its the last split image and last loop number, disable the skip split button - if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): - self.skipsplitButton.setEnabled(False) - else: - self.skipsplitButton.setEnabled(True) + # if its the last split image and last loop number, disable the skip split button + if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): + self.skipsplitButton.setEnabled(False) + else: + self.skipsplitButton.setEnabled(True) - # if its the first split image and first loop, disable the undo split button - if self.split_image_number == 0 and self.loop_number == 1: - self.undosplitButton.setEnabled(False) - else: - self.undosplitButton.setEnabled(True) + # if its the first split image and first loop, disable the undo split button + if self.split_image_number == 0 and self.loop_number == 1: + self.undosplitButton.setEnabled(False) + else: + self.undosplitButton.setEnabled(True) # if the b flag is set, let similarity go above threshold first, then split on similarity below threshold. # if no b flag, just split when similarity goes above threshold. @@ -698,10 +637,7 @@ def autoSplitter(self): reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: - if self.is_auto_controlled: - print("reset", flush = True) - else: - keyboard.send(str(self.resetLineEdit.text())) + keyboard.send(str(self.resetLineEdit.text())) self.reset() continue @@ -711,15 +647,9 @@ def autoSplitter(self): # if {p} flag hit pause key, otherwise hit split hotkey if (self.flags & 0x08 == 0x08): - if self.is_auto_controlled: - print("pause", flush = True) - else: - keyboard.send(str(self.pausehotkeyLineEdit.text())) + keyboard.send(str(self.pausehotkeyLineEdit.text())) else: - if self.is_auto_controlled: - print("split", flush = True) - else: - keyboard.send(str(self.splitLineEdit.text())) + keyboard.send(str(self.splitLineEdit.text())) # increase loop number if needed, set to 1 if it was the last loop. if self.loop_number < self.split_image_loop_amount[self.split_image_number]: @@ -748,18 +678,17 @@ def autoSplitter(self): self.currentSplitImage.setAlignment(QtCore.Qt.AlignCenter) self.imageloopLabel.setText('Image Loop #: -') - if self.is_auto_controlled == False: - # if its the last split image and last loop number, disable the skip split button - if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): - self.skipsplitButton.setEnabled(False) - else: - self.skipsplitButton.setEnabled(True) + # if its the last split image and last loop number, disable the skip split button + if (self.split_image_number == self.number_of_split_images - 1 and self.loop_number == self.split_image_loop_amount[self.split_image_number]) or (self.groupDummySplitsCheckBox.isChecked() == True and self.dummy_splits_array[self.split_image_number:].count(False) <= 1): + self.skipsplitButton.setEnabled(False) + else: + self.skipsplitButton.setEnabled(True) - # if its the first split image and first loop, disable the undo split button - if self.split_image_number == 0 and self.loop_number == 1: - self.undosplitButton.setEnabled(False) - else: - self.undosplitButton.setEnabled(True) + # if its the first split image and first loop, disable the undo split button + if self.split_image_number == 0 and self.loop_number == 1: + self.undosplitButton.setEnabled(False) + else: + self.undosplitButton.setEnabled(True) QtGui.QApplication.processEvents() @@ -804,21 +733,18 @@ def autoSplitter(self): def guiChangesOnStart(self): self.startautosplitterButton.setText('Running..') self.browseButton.setEnabled(False) + self.startautosplitterButton.setEnabled(False) + self.resetButton.setEnabled(True) + self.undosplitButton.setEnabled(True) + self.skipsplitButton.setEnabled(True) + self.setsplithotkeyButton.setEnabled(False) + self.setresethotkeyButton.setEnabled(False) + self.setskipsplithotkeyButton.setEnabled(False) + self.setundosplithotkeyButton.setEnabled(False) + self.setpausehotkeyButton.setEnabled(False) self.custompausetimesCheckBox.setEnabled(False) self.customthresholdsCheckBox.setEnabled(False) self.groupDummySplitsCheckBox.setEnabled(False) - - if self.is_auto_controlled == False: - self.startautosplitterButton.setEnabled(False) - self.resetButton.setEnabled(True) - self.undosplitButton.setEnabled(True) - self.skipsplitButton.setEnabled(True) - self.setsplithotkeyButton.setEnabled(False) - self.setresethotkeyButton.setEnabled(False) - self.setskipsplithotkeyButton.setEnabled(False) - self.setundosplithotkeyButton.setEnabled(False) - self.setpausehotkeyButton.setEnabled(False) - QtGui.QApplication.processEvents() def guiChangesOnReset(self): @@ -829,21 +755,18 @@ def guiChangesOnReset(self): self.livesimilarityLabel.setText(' ') self.highestsimilarityLabel.setText(' ') self.browseButton.setEnabled(True) + self.startautosplitterButton.setEnabled(True) + self.resetButton.setEnabled(False) + self.undosplitButton.setEnabled(False) + self.skipsplitButton.setEnabled(False) + self.setsplithotkeyButton.setEnabled(True) + self.setresethotkeyButton.setEnabled(True) + self.setskipsplithotkeyButton.setEnabled(True) + self.setundosplithotkeyButton.setEnabled(True) + self.setpausehotkeyButton.setEnabled(True) self.custompausetimesCheckBox.setEnabled(True) self.customthresholdsCheckBox.setEnabled(True) self.groupDummySplitsCheckBox.setEnabled(True) - - if self.is_auto_controlled == False: - self.startautosplitterButton.setEnabled(True) - self.resetButton.setEnabled(False) - self.undosplitButton.setEnabled(False) - self.skipsplitButton.setEnabled(False) - self.setsplithotkeyButton.setEnabled(True) - self.setresethotkeyButton.setEnabled(True) - self.setskipsplithotkeyButton.setEnabled(True) - self.setundosplithotkeyButton.setEnabled(True) - self.setpausehotkeyButton.setEnabled(True) - QtGui.QApplication.processEvents() def compareImage(self, image, mask, capture): @@ -997,43 +920,41 @@ def updateSplitImage(self): self.highest_similarity = 0.001 # exit safely when closing the window - def closeEvent(self, event=None): - def exit(): - if event is not None: - event.accept() - if self.is_auto_controlled: - self.update_auto_control.terminate() - # stop main thread (which is probably blocked reading input) via an interrupt signal - # only available for windows in version 3.2 or higher - os.kill(os.getpid(), signal.SIGINT) - sys.exit() - - # Simulates LiveSplit quitting without asking. See "TODO" at update_auto_control Worker - # This also more gracefully exits LiveSplit - # Users can still manually save their settings - if event is None: - exit() - + def closeEvent(self, event): if self.haveSettingsChanged(): - # give a different warning if there was never a settings file that was loaded successfully, and save as instead of save. - msgBox = QtGui.QMessageBox - settings_file_name = "Untitled" \ - if self.last_successfully_loaded_settings_file_path is None \ - else os.path.basename(self.last_successfully_loaded_settings_file_path) - warning_message = f"Do you want to save changes made to settings file {settings_file_name}?" - - warning = msgBox.warning(self, "AutoSplit", warning_message, msgBox.Yes | msgBox.No | msgBox.Cancel) - - if warning == msgBox.Yes: - # TODO: Don't close if user cancelled the save - self.saveSettingsAs() - exit() - if warning == msgBox.No: - exit() - if warning == msgBox.Cancel: - event.ignore() + #give a different warning if there was never a settings file that was loaded successfully, and save as instead of save. + if self.last_successfully_loaded_settings_file_path == None: + msgBox = QtGui.QMessageBox + warning = msgBox.warning(self, "AutoSplit","Do you want to save changes made to settings file Untitled?", msgBox.Yes | msgBox.No | msgBox.Cancel) + if warning == msgBox.Yes: + self.saveSettingsAs() + sys.exit() + event.accept() + if warning == msgBox.No: + event.accept() + sys.exit() + pass + if warning == msgBox.Cancel: + event.ignore() + return + else: + msgBox = QtGui.QMessageBox + warning = msgBox.warning(self, "AutoSplit", "Do you want to save the changes made to the settings file " + os.path.basename(self.last_successfully_loaded_settings_file_path) + " ?", msgBox.Yes | msgBox.No | msgBox.Cancel) + if warning == msgBox.Yes: + self.saveSettings() + sys.exit() + event.accept() + if warning == msgBox.No: + event.accept() + sys.exit() + pass + if warning == msgBox.Cancel: + event.ignore() + return else: - exit() + event.accept() + sys.exit() + def main(): @@ -1046,4 +967,4 @@ def main(): if __name__ == '__main__': - main() + main() \ No newline at end of file diff --git a/src/about.py b/src/about.py index 4dd6b430..93f90bfe 100644 --- a/src/about.py +++ b/src/about.py @@ -59,7 +59,7 @@ def retranslateUi(self, aboutAutoSplitWidget): aboutAutoSplitWidget.setWindowTitle(_translate("aboutAutoSplitWidget", "About AutoSplit", None)) self.okButton.setText(_translate("aboutAutoSplitWidget", "OK", None)) self.createdbyLabel.setText(_translate("aboutAutoSplitWidget", "

Created by Toufool and Faschz

", None)) - self.versionLabel.setText(_translate("aboutAutoSplitWidget", "Version: ", None)) + self.versionLabel.setText(_translate("aboutAutoSplitWidget", "Version: 1.5.1", None)) self.donatetextLabel.setText(_translate("aboutAutoSplitWidget", "If you enjoy using this program, please\n" " consider donating. Thank you!", None)) self.donatebuttonLabel.setText(_translate("aboutAutoSplitWidget", "

", None)) @@ -75,3 +75,4 @@ def retranslateUi(self, aboutAutoSplitWidget): ui.setupUi(aboutAutoSplitWidget) aboutAutoSplitWidget.show() sys.exit(app.exec_()) + diff --git a/src/menu_bar.py b/src/menu_bar.py index 9cd18e5b..598f8435 100644 --- a/src/menu_bar.py +++ b/src/menu_bar.py @@ -2,10 +2,6 @@ from PyQt4 import QtGui import about -# AutoSplit Version number -VERSION = "1.5.0" - - # About Window class AboutWidget(QtGui.QWidget, about.Ui_aboutAutoSplitWidget): def __init__(self): @@ -13,12 +9,11 @@ def __init__(self): self.setupUi(self) self.createdbyLabel.setOpenExternalLinks(True) self.donatebuttonLabel.setOpenExternalLinks(True) - self.versionLabel.setText(f"Version: {VERSION}") self.show() - -def viewHelp(): - os.system("start \"\" https://github.com/Toufool/Auto-Split/blob/master/README.md#tutorial") +def viewHelp(self): + os.system("start \"\" https://github.com/Toufool/Auto-Split#tutorial") + return def about(self): diff --git a/src/settings_file.py b/src/settings_file.py index 3304858c..6e7e270d 100644 --- a/src/settings_file.py +++ b/src/settings_file.py @@ -197,10 +197,9 @@ def loadSettings(self): keyboard.remove_hotkey(self.split_hotkey) except AttributeError: pass - if self.is_auto_controlled == False: - self.splitLineEdit.setText(str(self.split_key)) - self.split_hotkey = keyboard.add_hotkey(str(self.split_key), self.startAutoSplitter) - self.old_split_key = self.split_key + self.splitLineEdit.setText(str(self.split_key)) + self.split_hotkey = keyboard.add_hotkey(str(self.split_key), self.startAutoSplitter) + self.old_split_key = self.split_key # pass if the key is an empty string (hotkey was never set) except ValueError: pass From 4d52774e4e3bd64fae46c1385052f8fefc925ee5 Mon Sep 17 00:00:00 2001 From: Samuel T Date: Tue, 9 Nov 2021 18:18:10 -0800 Subject: [PATCH 3/8] Fix numpad hotkey (#61) * Fixed numpad hotkeys - Differentiate between numpad and regular numbers - Differentiate between numpad actions and regular actions - Differentiate between numpad actions and numpad numbers - Differentiate dot, numpad dot (or decimal), and delete - Delete and numapd delete won't be cross-compatible if localized in non-english - Used hooks and simplified code * Fix loading settings with incomplete hotkey configuration * Added Build requirements * Actually send the right event for numpad keys using pyautogui Co-authored-by: KaDiWa4 --- .vscode/extensions.json | 10 +- .vscode/settings.json | 11 +- README.md | 3 + requirements.txt | 1 + src/AutoSplit.py | 17 ++- src/hotkeys.py | 309 ++++++++++++++++++++-------------------- src/settings_file.py | 119 +++++++--------- 7 files changed, 234 insertions(+), 236 deletions(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index 0254035d..ca9b77ca 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,8 +1,14 @@ { "recommendations": [ - "ms-pyright.pyright", + "ms-python.vscode-pylance", "ms-python.python", "sonarsource.sonarlint-vscode", - "davidanson.vscode-markdownlint" + "davidanson.vscode-markdownlint", + "shardulm94.trailing-spaces", + "eamodio.gitlens" + ], + "unwantedRecommendations": [ + "ms-pyright.pyright", + "esbenp.prettier-vscode" ] } diff --git a/.vscode/settings.json b/.vscode/settings.json index c9c340c1..977842be 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -26,13 +26,13 @@ 120, ] }, - "//1": "Keeping autoformat to false for now to keep minimal changes", + // Keeping autoformat to false for now to keep minimal changes "editor.formatOnSave": false, "editor.codeActionsOnSave": { "source.fixAll": false, }, "python.linting.pylintEnabled": false, - "//2": "Using flake8 as other linters are incomplete or have too many false positives last I tried", + // Using flake8 as other linters are incomplete or have too many false positives last I tried "python.linting.flake8Enabled": true, "python.linting.enabled": true, "python.linting.pycodestyleEnabled": false, @@ -43,6 +43,11 @@ "python.formatting.autopep8Args": [ "--max-line-length=120" ], - "python.pythonPath": "", "files.insertFinalNewline": true, + "trailing-spaces.deleteModifiedLinesOnly": true, + "trailing-spaces.includeEmptyLines": true, + "trailing-spaces.trimOnSave": true, + "trailing-spaces.syntaxIgnore": [ + "markdown" + ] } diff --git a/README.md b/README.md index 2c54f4dc..473df18d 100644 --- a/README.md +++ b/README.md @@ -13,6 +13,9 @@ This program compares split images to a capture region of any window (OBS, xspli ### Compatability - Windows 7, 10, and 11 +### Building +- Read [requirements.txt](/requirements.txt) for information on how to run/build the python code + ### Opening the program - Download the [latest version](https://github.com/austinryan/Auto-Split/releases) - Extract the file and open AutoSplit.exe. diff --git a/requirements.txt b/requirements.txt index b9c87383..dc467e0b 100644 --- a/requirements.txt +++ b/requirements.txt @@ -20,3 +20,4 @@ Pillow ImageHash pywin32 keyboard +pyautogui diff --git a/src/AutoSplit.py b/src/AutoSplit.py index daed4516..c4a1b45c 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -6,16 +6,15 @@ import time import ctypes.wintypes import ctypes -import keyboard -import glob import numpy as np +from hotkeys import send_hotkey import design -import about import compare import capture_windows import split_parser + class AutoSplit(QtGui.QMainWindow, design.Ui_MainWindow): from hotkeys import beforeSettingHotkey, afterSettingHotkey, setSplitHotkey, setResetHotkey, setSkipSplitHotkey, setUndoSplitHotkey, setPauseHotkey from error_messages import (splitImageDirectoryError, splitImageDirectoryNotFoundError, imageTypeError, regionError, regionSizeError, @@ -530,7 +529,7 @@ def autoSplitter(self): reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: - keyboard.send(str(self.resetLineEdit.text())) + send_hotkey(self.resetLineEdit.text()) self.reset() # loop goes into here if start auto splitter text is "Start Auto Splitter" @@ -637,7 +636,7 @@ def autoSplitter(self): reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: - keyboard.send(str(self.resetLineEdit.text())) + send_hotkey(self.resetLineEdit.text()) self.reset() continue @@ -647,9 +646,9 @@ def autoSplitter(self): # if {p} flag hit pause key, otherwise hit split hotkey if (self.flags & 0x08 == 0x08): - keyboard.send(str(self.pausehotkeyLineEdit.text())) + send_hotkey(self.pausehotkeyLineEdit.text()) else: - keyboard.send(str(self.splitLineEdit.text())) + send_hotkey(self.splitLineEdit.text()) # increase loop number if needed, set to 1 if it was the last loop. if self.loop_number < self.split_image_loop_amount[self.split_image_number]: @@ -721,7 +720,7 @@ def autoSplitter(self): reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: - keyboard.send(str(self.resetLineEdit.text())) + send_hotkey(self.resetLineEdit.text()) self.reset() continue @@ -967,4 +966,4 @@ def main(): if __name__ == '__main__': - main() \ No newline at end of file + main() diff --git a/src/hotkeys.py b/src/hotkeys.py index eca9a822..9465bdc8 100644 --- a/src/hotkeys.py +++ b/src/hotkeys.py @@ -1,5 +1,9 @@ import keyboard +import pyautogui import threading +# While not usually recommended, we don't manipulate the mouse, and we don't want the extra delay +pyautogui.FAILSAFE = False + # do all of these after you click "set hotkey" but before you type the hotkey. def beforeSettingHotkey(self): @@ -26,10 +30,88 @@ def afterSettingHotkey(self): self.setundosplithotkeyButton.setEnabled(True) self.setpausehotkeyButton.setEnabled(True) - return -#--------------------HOTKEYS-------------------------- -#Going to comment on one func, and others will be similar. +def is_digit(key): + try: + key_as_num = int(key) + return key_as_num >= 0 and key_as_num <= 9 + except Exception: + return False + + +# Supports sending the appropriate scan code for all the special cases +def send_hotkey(key_or_scan_code): + hotkey_type = type(key_or_scan_code) + + # Deal with regular inputs + if hotkey_type is int: + return keyboard.send(key_or_scan_code) + elif hotkey_type is not str: + raise TypeError(f'key_or_scan_code "{key_or_scan_code}" {hotkey_type} should be an int or str') + if (not (key_or_scan_code.startswith('num ') or key_or_scan_code == 'decimal')): + return keyboard.send(key_or_scan_code) + + # Deal with problematic keys. Even by sending specific scan code 'keyboard' still sends the defautl (wrong) key + # keyboard.send(keyboard.key_to_scan_codes(key_or_scan_code)[1]) + pyautogui.hotkey(key_or_scan_code.replace(' ', '')) + + +def __validate_keypad(expected_key, keyboard_event): + # Prevent "(keypad)delete", "(keypad)./decimal" and "del" from triggering each other + # as well as "." and "(keypad)./decimal" + if keyboard_event.scan_code == 83 or keyboard_event.scan_code == 52: + if expected_key == keyboard_event.name: + return True + else: + # TODO: "del" won't work with "(keypad)delete" if localized in non-english (ie: "suppr" in french) + return False + # Prevent "action keys" from triggering "keypad keys" + if is_digit(keyboard_event.name[-1]): + # Prevent "regular numbers" from activating "keypad numbers" + if expected_key.startswith("num "): + return keyboard_event.is_keypad + # Prevent "keypad numbers" from activating "regular numbers" + else: + return not keyboard_event.is_keypad + else: + # Prevent "keypad action keys" from triggering "regular numbers" and "keypad numbers" + # Still allow the same key that might be localized differently on keypad vs non-keypad + return not is_digit(expected_key[-1]) + + +# NOTE: This is a workaround very specific to numpads. +# Windows reports different physical keys with the same scan code. +# For example, "Home", "Num Home" and "Num 7" are all "71". +# See: https://github.com/boppreh/keyboard/issues/171#issuecomment-390437684 +# +# We're doing the check here instead of saving the key code because it'll +# cause issues with save files and the non-keypad shared keys are localized +# while the keypad ones aren't. +# +# Since we reuse the key string we set to send to LiveSplit, we can't use fake names like "num home". +# We're also trying to achieve the same hotkey behaviour as LiveSplit has. +def _hotkey_action(keyboard_event, key_name, action): + if keyboard_event.event_type == keyboard.KEY_DOWN and __validate_keypad(key_name, keyboard_event): + action() + + +def __get_key_name(keyboard_event): + return f"num {keyboard_event.name}" \ + if keyboard_event.is_keypad and is_digit(keyboard_event.name) \ + else keyboard_event.name + + +def __is_key_already_set(self, key_name): + return key_name == self.splitLineEdit.text() \ + or key_name == self.resetLineEdit.text() \ + or key_name == self.skipsplitLineEdit.text() \ + or key_name == self.undosplitLineEdit.text() \ + or key_name == self.pausehotkeyLineEdit.text() + + +# --------------------HOTKEYS-------------------------- +# TODO: Refactor to de-duplicate all this code, including settings_file.py +# Going to comment on one func, and others will be similar. def setSplitHotkey(self): self.setsplithotkeyButton.setText('Press a key..') @@ -38,48 +120,34 @@ def setSplitHotkey(self): # new thread points to callback. this thread is needed or GUI will freeze # while the program waits for user input on the hotkey - def callback(): + def callback(hotkey): # try to remove the previously set hotkey if there is one. try: - keyboard.remove_hotkey(self.split_hotkey) - except AttributeError: - pass - #this error was coming up when loading the program and - #the lineEdit area was empty (no hotkey set), then you - #set one, reload the setting once back to blank works, - #but if you click reload settings again, it errors - #we can just have it pass, but don't want to throw in - #generic exception here in case another one of these - #pops up somewhere. - except KeyError: + keyboard.unhook_key(hotkey) + # KeyError was coming up when loading the program and + # the lineEdit area was empty (no hotkey set), then you + # set one, reload the setting once back to blank works, + # but if you click reload settings again, it errors + # we can just have it pass, but don't want to throw in + # generic exception here in case another one of these + # pops up somewhere. + except (AttributeError, KeyError): pass # wait until user presses the hotkey, then keyboard module reads the input - self.split_key = keyboard.read_hotkey(False) - - # If the key the user presses is equal to itself or another hotkey already set, - # this causes issues. so here, it catches that, and will make no changes to the hotkey. + key_name = __get_key_name(keyboard.read_event(True)) try: - if self.split_key == self.splitLineEdit.text() \ - or self.split_key == self.resetLineEdit.text() \ - or self.split_key == self.skipsplitLineEdit.text() \ - or self.split_key == self.undosplitLineEdit.text() \ - or self.split_key == self.pausehotkeyLineEdit.text(): - self.split_hotkey = keyboard.add_hotkey(self.old_split_key, self.startAutoSplitter) - self.afterSettingHotkeySignal.emit() - return - except AttributeError: - self.afterSettingHotkeySignal.emit() - return + # If the key the user presses is equal to itself or another hotkey already set, + # this causes issues. so here, it catches that, and will make no changes to the hotkey. - # keyboard module allows you to hit multiple keys for a hotkey. they are joined - # together by +. If user hits two keys at the same time, make no changes to the - # hotkey. A try and except is needed if a hotkey hasn't been set yet. I'm not - # allowing for these multiple-key hotkeys because it can cause crashes, and - # not many people are going to really use or need this. - try: - if '+' in self.split_key: - self.split_hotkey = keyboard.add_hotkey(self.old_split_key, self.startAutoSplitter) + # or + + # keyboard module allows you to hit multiple keys for a hotkey. they are joined + # together by +. If user hits two keys at the same time, make no changes to the + # hotkey. A try and except is needed if a hotkey hasn't been set yet. I'm not + # allowing for these multiple-key hotkeys because it can cause crashes, and + # not many people are going to really use or need this. + if __is_key_already_set(self, key_name) or '+' in key_name: self.afterSettingHotkeySignal.emit() return except AttributeError: @@ -88,192 +156,131 @@ def callback(): # add the key as the hotkey, set the text into the LineEdit, set it as old_xxx_key, # then emite a signal to re-enable some buttons and change some text in GUI. - self.split_hotkey = keyboard.add_hotkey(self.split_key, self.startAutoSplitter) - self.splitLineEdit.setText(self.split_key) - self.old_split_key = self.split_key + + # We need to inspect the event to know if it comes from numpad because of _canonial_names. + # See: https://github.com/boppreh/keyboard/issues/161#issuecomment-386825737 + # The best way to achieve this is make our own hotkey handling on top of hook + # See: https://github.com/boppreh/keyboard/issues/216#issuecomment-431999553 + self.split_hotkey = keyboard.hook_key(key_name, lambda e: _hotkey_action(e, key_name, self.startAutoSplitter)) + self.splitLineEdit.setText(key_name) + self.split_key = key_name self.afterSettingHotkeySignal.emit() - return - t = threading.Thread(target=callback) + t = threading.Thread(target=callback, args=(self.split_hotkey,)) t.start() - return + def setResetHotkey(self): self.setresethotkeyButton.setText('Press a key..') self.beforeSettingHotkey() - def callback(): + def callback(hotkey): try: - keyboard.remove_hotkey(self.reset_hotkey) - except AttributeError: + keyboard.unhook_key(hotkey) + except (AttributeError, KeyError): pass - except KeyError: - pass - self.reset_key = keyboard.read_hotkey(False) - try: - if self.reset_key == self.splitLineEdit.text() \ - or self.reset_key == self.resetLineEdit.text() \ - or self.reset_key == self.skipsplitLineEdit.text() \ - or self.reset_key == self.undosplitLineEdit.text() \ - or self.reset_key == self.pausehotkeyLineEdit.text(): - self.reset_hotkey = keyboard.add_hotkey(self.old_reset_key, self.startReset) - self.afterSettingHotkeySignal.emit() - return - except AttributeError: - self.afterSettingHotkeySignal.emit() - return + + key_name = __get_key_name(keyboard.read_event(True)) + try: - if '+' in self.reset_key: - self.reset_hotkey = keyboard.add_hotkey(self.old_reset_key, self.startReset) + if __is_key_already_set(self, key_name) or '+' in key_name: self.afterSettingHotkeySignal.emit() return except AttributeError: self.afterSettingHotkeySignal.emit() return - self.reset_hotkey = keyboard.add_hotkey(self.reset_key, self.startReset) - self.resetLineEdit.setText(self.reset_key) - self.old_reset_key = self.reset_key + + self.reset_hotkey = keyboard.hook_key(key_name, lambda e: _hotkey_action(e, key_name, self.startReset)) + self.resetLineEdit.setText(key_name) + self.reset_key = key_name self.afterSettingHotkeySignal.emit() - return - t = threading.Thread(target=callback) + t = threading.Thread(target=callback, args=(self.reset_hotkey,)) t.start() - return + def setSkipSplitHotkey(self): self.setskipsplithotkeyButton.setText('Press a key..') self.beforeSettingHotkey() - def callback(): + def callback(hotkey): try: - keyboard.remove_hotkey(self.skip_split_hotkey) - except AttributeError: - pass - except KeyError: + keyboard.unhook_key(hotkey) + except (AttributeError, KeyError): pass - self.skip_split_key = keyboard.read_hotkey(False) + key_name = __get_key_name(keyboard.read_event(True)) try: - if self.skip_split_key == self.splitLineEdit.text() \ - or self.skip_split_key == self.resetLineEdit.text() \ - or self.skip_split_key == self.skipsplitLineEdit.text() \ - or self.skip_split_key == self.undosplitLineEdit.text() \ - or self.skip_split_key == self.pausehotkeyLineEdit.text(): - self.skip_split_hotkey = keyboard.add_hotkey(self.old_skip_split_key, self.startSkipSplit) + if __is_key_already_set(self, key_name) or '+' in key_name: self.afterSettingHotkeySignal.emit() return except AttributeError: self.afterSettingHotkeySignal.emit() return - try: - if '+' in self.skip_split_key: - self.skip_split_hotkey = keyboard.add_hotkey(self.old_skip_split_key, self.startSkipSplit) - self.afterSettingHotkeySignal.emit() - return - except AttributeError: - self.afterSettingHotkeySignal.emit() - return - - self.skip_split_hotkey = keyboard.add_hotkey(self.skip_split_key, self.startSkipSplit) - self.skipsplitLineEdit.setText(self.skip_split_key) - self.old_skip_split_key = self.skip_split_key + self.skip_split_hotkey = keyboard.hook_key(key_name, lambda e: _hotkey_action(e, key_name, self.startSkipSplit)) + self.skipsplitLineEdit.setText(key_name) + self.skip_split_key = key_name self.afterSettingHotkeySignal.emit() - return - t = threading.Thread(target=callback) + t = threading.Thread(target=callback, args=(self.skip_split_hotkey,)) t.start() - return + def setUndoSplitHotkey(self): self.setundosplithotkeyButton.setText('Press a key..') self.beforeSettingHotkey() - def callback(): + def callback(hotkey): try: - keyboard.remove_hotkey(self.undo_split_hotkey) - except AttributeError: - pass - except KeyError: + keyboard.unhook_key(hotkey) + except (AttributeError, KeyError): pass - self.undo_split_key = keyboard.read_hotkey(False) + key_name = __get_key_name(keyboard.read_event(True)) try: - if self.undo_split_key == self.splitLineEdit.text() \ - or self.undo_split_key == self.resetLineEdit.text() \ - or self.undo_split_key == self.skipsplitLineEdit.text() \ - or self.undo_split_key == self.undosplitLineEdit.text() \ - or self.undo_split_key == self.pausehotkeyLineEdit.text(): - self.undo_split_hotkey = keyboard.add_hotkey(self.old_undo_split_key, self.startUndoSplit) + if __is_key_already_set(self, key_name) or '+' in key_name: self.afterSettingHotkeySignal.emit() return except AttributeError: self.afterSettingHotkeySignal.emit() return - try: - if '+' in self.undo_split_key: - self.undo_split_hotkey = keyboard.add_hotkey(self.old_undo_split_key, self.startUndoSplit) - self.afterSettingHotkeySignal.emit() - return - except AttributeError: - self.afterSettingHotkeySignal.emit() - return - - self.undo_split_hotkey = keyboard.add_hotkey(self.undo_split_key, self.startUndoSplit) - self.undosplitLineEdit.setText(self.undo_split_key) - self.old_undo_split_key = self.undo_split_key + self.undo_split_hotkey = keyboard.hook_key(key_name, lambda e: _hotkey_action(e, key_name, self.startUndoSplit)) + self.undosplitLineEdit.setText(key_name) + self.undo_split_key = key_name self.afterSettingHotkeySignal.emit() - return - t = threading.Thread(target=callback) + t = threading.Thread(target=callback, args=(self.undo_split_hotkey,)) t.start() - return + def setPauseHotkey(self): self.setpausehotkeyButton.setText('Press a key..') self.beforeSettingHotkey() - def callback(): + def callback(hotkey): try: - keyboard.remove_hotkey(self.pause_hotkey) - except AttributeError: - pass - except KeyError: + keyboard.unhook_key(hotkey) + except (AttributeError, KeyError): pass - self.pause_key = keyboard.read_hotkey(False) - - try: - if self.pause_key == self.splitLineEdit.text() \ - or self.pause_key == self.resetLineEdit.text() \ - or self.pause_key == self.skipsplitLineEdit.text() \ - or self.pause_key == self.undosplitLineEdit.text() \ - or self.pause_key == self.pausehotkeyLineEdit.text(): - self.pause_hotkey = keyboard.add_hotkey(self.old_pause_key, self.startPause) - self.afterSettingHotkeySignal.emit() - return - except AttributeError: - self.afterSettingHotkeySignal.emit() - return + key_name = __get_key_name(keyboard.read_event(True)) try: - if '+' in self.pause_key: - self.pause_hotkey = keyboard.add_hotkey(self.old_pause_key, self.startPause) + if __is_key_already_set(self, key_name) or '+' in key_name: self.afterSettingHotkeySignal.emit() return except AttributeError: self.afterSettingHotkeySignal.emit() return - self.pause_hotkey = keyboard.add_hotkey(self.pause_key, self.startPause) - self.pausehotkeyLineEdit.setText(self.pause_key) - self.old_pause_key = self.pause_key + self.pause_hotkey = keyboard.hook_key(key_name, lambda e: _hotkey_action(e, key_name, self.startPause)) + self.pausehotkeyLineEdit.setText(key_name) + self.pause_key = key_name self.afterSettingHotkeySignal.emit() - return - t = threading.Thread(target=callback) + t = threading.Thread(target=callback, args=(self.pause_hotkey,)) t.start() - return \ No newline at end of file diff --git a/src/settings_file.py b/src/settings_file.py index 6e7e270d..9f352cb7 100644 --- a/src/settings_file.py +++ b/src/settings_file.py @@ -2,7 +2,10 @@ import win32gui import pickle import glob +import logging from PyQt4 import QtGui +from hotkeys import _hotkey_action + def getSaveSettingsValues(self): # get values to be able to save settings @@ -106,7 +109,14 @@ def saveSettingsAs(self): def loadSettings(self): - if self.load_settings_on_open == True: + # hotkeys need to be initialized to be passed as thread arguments in hotkeys.py + self.split_hotkey = "" + self.reset_hotkey = "" + self.skip_split_hotkey = "" + self.undo_split_hotkey = "" + self.pause_hotkey = "" + + if self.load_settings_on_open: self.settings_files = glob.glob("*.pkl") if len(self.settings_files) < 1: self.noSettingsFileOnOpenError() @@ -166,101 +176,68 @@ def loadSettings(self): self.hwnd = win32gui.FindWindow(None, self.hwnd_title) # set custom checkbox's accordingly - if self.custom_pause_times_setting == 1: - self.custompausetimesCheckBox.setChecked(True) - else: - self.custompausetimesCheckBox.setChecked(False) - - if self.custom_thresholds_setting == 1: - self.customthresholdsCheckBox.setChecked(True) - else: - self.customthresholdsCheckBox.setChecked(False) - - if self.group_dummy_splits_undo_skip_setting == 1: - self.groupDummySplitsCheckBox.setChecked(True) - else: - self.groupDummySplitsCheckBox.setChecked(False) - - if self.loop_setting == 1: - self.loopCheckBox.setChecked(True) - else: - self.loopCheckBox.setChecked(False) - - if self.auto_start_on_reset_setting == 1: - self.autostartonresetCheckBox.setChecked(True) - else: - self.autostartonresetCheckBox.setChecked(False) + self.custompausetimesCheckBox.setChecked(self.custom_pause_times_setting == 1) + self.customthresholdsCheckBox.setChecked(self.custom_thresholds_setting == 1) + self.groupDummySplitsCheckBox.setChecked(self.group_dummy_splits_undo_skip_setting == 1) + self.loopCheckBox.setChecked(self.loop_setting == 1) + self.autostartonresetCheckBox.setChecked(self.auto_start_on_reset_setting == 1) + # TODO: Reuse code from hotkeys rather than duplicating here # try to set hotkeys from when user last closed the window try: - try: - keyboard.remove_hotkey(self.split_hotkey) - except AttributeError: - pass + keyboard.unhook_key(self.split_hotkey) + except (AttributeError, KeyError): + pass + try: self.splitLineEdit.setText(str(self.split_key)) - self.split_hotkey = keyboard.add_hotkey(str(self.split_key), self.startAutoSplitter) - self.old_split_key = self.split_key + self.split_hotkey = keyboard.hook_key(str(self.split_key), lambda e: _hotkey_action(e, self.split_key, self.startAutoSplitter)) # pass if the key is an empty string (hotkey was never set) - except ValueError: - pass - except KeyError: + except (ValueError, KeyError): pass try: - try: - keyboard.remove_hotkey(self.reset_hotkey) - except AttributeError: - pass - self.resetLineEdit.setText(str(self.reset_key)) - self.reset_hotkey = keyboard.add_hotkey(str(self.reset_key), self.startReset) - self.old_reset_key = self.reset_key - except ValueError: + keyboard.unhook_key(self.reset_hotkey) + except (AttributeError, KeyError): pass - except KeyError: + try: + self.resetLineEdit.setText(self.reset_key) + self.reset_hotkey = keyboard.hook_key(self.reset_key, lambda e: _hotkey_action(e, self.reset_key, self.startReset)) + except (ValueError, KeyError): pass try: - try: - keyboard.remove_hotkey(self.skip_split_hotkey) - except AttributeError: - pass - self.skipsplitLineEdit.setText(str(self.skip_split_key)) - self.skip_split_hotkey = keyboard.add_hotkey(str(self.skip_split_key), self.startSkipSplit) - self.old_skip_split_key = self.skip_split_key - except ValueError: + keyboard.unhook_key(self.skip_split_hotkey) + except (AttributeError, KeyError): pass - except KeyError: + try: + self.skipsplitLineEdit.setText(self.skip_split_key) + self.skip_split_hotkey = keyboard.hook_key(self.skip_split_key, lambda e: _hotkey_action(e, self.skip_split_key, self.startSkipSplit)) + except (ValueError, KeyError): pass try: - try: - keyboard.remove_hotkey(self.undo_split_hotkey) - except AttributeError: - pass - self.undosplitLineEdit.setText(str(self.undo_split_key)) - self.undo_split_hotkey = keyboard.add_hotkey(str(self.undo_split_key), self.startUndoSplit) - self.old_undo_split_key = self.undo_split_key - except ValueError: + keyboard.unhook_key(self.undo_split_hotkey) + except (AttributeError, KeyError): pass - except KeyError: + try: + self.undosplitLineEdit.setText(self.undo_split_key) + self.undo_split_hotkey = keyboard.hook_key(self.undo_split_key, lambda e: _hotkey_action(e, self.undo_split_key, self.startUndoSplit)) + except (ValueError, KeyError): pass try: - try: - keyboard.remove_hotkey(self.pause_hotkey) - except AttributeError: - pass - self.pausehotkeyLineEdit.setText(str(self.pause_key)) - self.pause_hotkey = keyboard.add_hotkey(str(self.pause_key), self.startPause) - self.old_pause_key = self.pause_key - except ValueError: + keyboard.unhook_key(self.pause_hotkey) + except (AttributeError, KeyError): pass - except KeyError: + try: + self.pausehotkeyLineEdit.setText(self.pause_key) + self.pause_hotkey = keyboard.hook_key(self.pause_key, lambda e: _hotkey_action(e, self.pause_key, self.startPause)) + except (ValueError, KeyError): pass self.last_successfully_loaded_settings_file_path = self.load_settings_file_path self.checkLiveImage() except Exception: + logging.error(logging.traceback.format_exc()) self.invalidSettingsError() - pass From faf2bf38f189c1ce766bf4c33c5bb86f7bfe89be Mon Sep 17 00:00:00 2001 From: Samuel T Date: Tue, 9 Nov 2021 18:25:49 -0800 Subject: [PATCH 4/8] Parameter auto detected (#67) * Treeshold, pause and mask can be detected in file without app config Remove remaining of the check box Prevent default value to be override Author: Moliman * Autodetect parameters: - Get masked from transparency - Remove masked flag - Changed "custom" threshold and pause time to "default threshold and pause time * Added basic config files Including vscode IDE configs * Added Build requirements * Fix libraries version Co-authored-by: Moliman Co-authored-by: KaDiWa4 Co-authored-by: Austin <37423484+Toufool@users.noreply.github.com> --- requirements.txt | 14 +-- res/design.ui | 68 ++------------ src/AutoSplit.py | 203 +++++++++++++++-------------------------- src/AutoSplit.spec | 34 +++++++ src/capture_windows.py | 1 + src/compare.py | 31 ++++--- src/design.py | 32 ++----- src/error_messages.py | 37 +------- src/screen_region.py | 9 +- src/settings_file.py | 174 ++++++++++++++++++++++++----------- src/split_parser.py | 12 +-- 11 files changed, 278 insertions(+), 337 deletions(-) create mode 100644 src/AutoSplit.spec diff --git a/requirements.txt b/requirements.txt index dc467e0b..a6af9ffc 100644 --- a/requirements.txt +++ b/requirements.txt @@ -2,14 +2,16 @@ # # Python: CPython 3.7 (not 3.8 as there is no cp38 wheel for PyQt4) # -# Usage: pip install -r requirements.txt +# Usage: pip3.7 install -r requirements.txt # -# Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F src\AutoSplit.py +# If you're having issues with the libraries, you might want to first run: +# pip3.7 uninstall -r requirements.txt +# +# Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F --hidden-import sip --icon=src\icon.ico src\AutoSplit.py # # You can find other wheels here: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4 -# If you use 32-bit installation of Python, use the the 2nd URL instead. -https://download.lfd.uci.edu/pythonlibs/w4tscw6k/PyQt4-4.11.4-cp37-cp37m-win_amd64.whl -# https://download.lfd.uci.edu/pythonlibs/w4tscw6k/PyQt4-4.11.4-cp37-cp37m-win32.whl +https://download.lfd.uci.edu/pythonlibs/q4trcu4l/PyQt4-4.11.4-cp37-cp37m-win_amd64.whl +# https://download.lfd.uci.edu/pythonlibs/q4trcu4l/PyQt4-4.11.4-cp37-cp37m-win32.whl # # Comment this out if you don't want to create AutoSplit.exe: PyInstaller @@ -18,6 +20,6 @@ PyInstaller opencv-python Pillow ImageHash -pywin32 +pywin32==226 keyboard pyautogui diff --git a/res/design.ui b/res/design.ui index 72e473cf..8c54b027 100644 --- a/res/design.ui +++ b/res/design.ui @@ -141,11 +141,12 @@ 10 378 91 - 16 + 21 - Similarity threshold + Similarity threshold +Default value @@ -237,11 +238,12 @@ 10 420 111 - 16 + 21 - Pause time (seconds) + Pause time (seconds) +Default value @@ -748,7 +750,7 @@ 430 50 - 101 + 221 16 @@ -1029,56 +1031,6 @@ 10.000000000000000 - - - true - - - - 10 - 435 - 121 - 17 - - - - - - - Custom pause times - - - false - - - false - - - - - true - - - - 10 - 394 - 111 - 17 - - - - - - - Custom thresholds - - - false - - - false - - @@ -1113,7 +1065,7 @@ 252 443 - 230 + 240 17 @@ -1302,8 +1254,6 @@ yLabel comparisonmethodComboBox pauseDoubleSpinBox - custompausetimesCheckBox - customthresholdsCheckBox comparisonmethodLabel alignregionButton groupDummySplitsCheckBox @@ -1389,9 +1339,7 @@ comparisonmethodComboBox showlivesimilarityCheckBox showhighestsimilarityCheckBox - customthresholdsCheckBox similaritythresholdDoubleSpinBox - custompausetimesCheckBox pauseDoubleSpinBox splitLineEdit resetLineEdit diff --git a/src/AutoSplit.py b/src/AutoSplit.py index c4a1b45c..bd627b71 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -1,31 +1,34 @@ +#!/usr/bin/python3.7 +# -*- coding: utf-8 -*- + from PyQt4 import QtGui, QtCore, QtTest +from menu_bar import about, viewHelp +from win32 import win32gui import sys import os -import win32gui import cv2 import time import ctypes.wintypes import ctypes import numpy as np - from hotkeys import send_hotkey import design import compare import capture_windows import split_parser - -class AutoSplit(QtGui.QMainWindow, design.Ui_MainWindow): - from hotkeys import beforeSettingHotkey, afterSettingHotkey, setSplitHotkey, setResetHotkey, setSkipSplitHotkey, setUndoSplitHotkey, setPauseHotkey - from error_messages import (splitImageDirectoryError, splitImageDirectoryNotFoundError, imageTypeError, regionError, regionSizeError, - splitHotkeyError, customThresholdError, customPauseError, alphaChannelError, alignRegionImageTypeError, alignmentNotMatchedError, - multipleResetImagesError, noResetImageThresholdError, resetHotkeyError, pauseHotkeyError, dummySplitsError, settingsNotFoundError, - invalidSettingsError, oldVersionSettingsFileError, noSettingsFileOnOpenError, tooManySettingsFilesOnOpenError) - from settings_file import saveSettings, saveSettingsAs, loadSettings, haveSettingsChanged, getSaveSettingsValues - from screen_region import selectRegion, selectWindow, alignRegion - from menu_bar import about, viewHelp - - myappid = u'mycompany.myproduct.subproduct.version' +class AutoSplit(QtWidgets.QMainWindow, design.Ui_MainWindow): + from compare import checkIfImageHasTransparency + from error_messages import ( + splitImageDirectoryError, splitImageDirectoryNotFoundError, imageTypeError, regionError, regionSizeError, + splitHotkeyError, alignRegionImageTypeError, oldVersionSettingsFileError, noSettingsFileOnOpenError, + tooManySettingsFilesOnOpenError, invalidSettingsError, multipleResetImagesError, resetHotkeyError, + pauseHotkeyError, dummySplitsError, alignmentNotMatchedError) + from hotkeys import ( + beforeSettingHotkey, afterSettingHotkey, setSplitHotkey, setResetHotkey, setSkipSplitHotkey, setUndoSplitHotkey, + setPauseHotkey) + + myappid = u'Toufool.AutoSplit.v1.5.0' ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) # signals @@ -42,8 +45,8 @@ def __init__(self, parent=None): self.setupUi(self) # close all processes when closing window - self.actionView_Help.triggered.connect(self.viewHelp) - self.actionAbout.triggered.connect(self.about) + self.actionView_Help.triggered.connect(viewHelp) + self.actionAbout.triggered.connect(lambda : about(self)) self.actionSave_Settings.triggered.connect(self.saveSettings) self.actionSave_Settings_As.triggered.connect(self.saveSettingsAs) self.actionLoad_Settings.triggered.connect(self.loadSettings) @@ -90,7 +93,6 @@ def __init__(self, parent=None): self.resetSignal.connect(self.reset) self.skipSplitSignal.connect(self.skipSplit) self.undoSplitSignal.connect(self.undoSplit) - #self.pauseSignal.connect(self.pause) # live image checkbox self.liveimageCheckBox.clicked.connect(self.checkLiveImage) @@ -372,33 +374,19 @@ def autoSplitter(self): # Make sure that each of the images follows the guidelines for correct format # according to all of the settings selected by the user. for image in self.split_image_filenames: - - # Check to make sure the file is actually an image format that can be opened - # according to the mask flag - if split_parser.flags_from_filename(image) & 0x02 == 0x02: - source = cv2.imread(self.split_image_directory + image, cv2.IMREAD_UNCHANGED) - - if source is None: - # Opencv couldn't open this file as an image, this isn't a correct - # file format that is supported - self.guiChangesOnReset() - self.imageTypeError(image) - return - - if source.shape[2] != 4: - # Error, this file doesn't have an alpha channel even - # though the flag for masking was added - self.guiChangesOnReset() - self.alphaChannelError(image) - return - - else: - if cv2.imread(self.split_image_directory + image, cv2.IMREAD_COLOR) is None: + # Test for image without transparency + if cv2.imread(self.split_image_directory + image, cv2.IMREAD_COLOR) is None: + # Test for image with transparency + if cv2.imread(self.split_image_directory + image, cv2.IMREAD_UNCHANGED) is None: # Opencv couldn't open this file as an image, this isn't a correct # file format that is supported self.guiChangesOnReset() self.imageTypeError(image) return + else: + # TODO: Now that we know the image has transparency, error out if it is completely transparent + # Will fix https://github.com/Toufool/Auto-Split/issues/52 + pass #error out if there is a {p} flag but no pause hotkey set. if self.pausehotkeyLineEdit.text() == '' and split_parser.flags_from_filename(image) & 0x08 == 0x08: @@ -406,20 +394,6 @@ def autoSplitter(self): self.pauseHotkeyError() return - if self.custompausetimesCheckBox.isChecked() and split_parser.pause_from_filename(image) is None: - # Error, this file doesn't have a pause, but the checkbox was - # selected for unique pause times - self.guiChangesOnReset() - self.customPauseError(image) - return - - if self.customthresholdsCheckBox.isChecked() and split_parser.threshold_from_filename(image) is None: - # Error, this file doesn't have a threshold, but the checkbox - # was selected for unique thresholds - self.guiChangesOnReset() - self.customThresholdError(image) - return - if self.splitLineEdit.text() == '': self.guiChangesOnReset() self.splitHotkeyError() @@ -436,12 +410,6 @@ def autoSplitter(self): self.multipleResetImagesError() return - # if there is no custom threshold for the reset image, throw an error. - if self.reset_image is not None and self.reset_image_threshold is None: - self.guiChangesOnReset() - self.noResetImageThresholdError() - return - # If there is no reset hotkey set but a reset image is present, throw an error. if self.resetLineEdit.text() == '' and self.reset_image is not None: self.guiChangesOnReset() @@ -520,13 +488,9 @@ def autoSplitter(self): return # calculate similarity for reset image - reset_masked = None - capture = None + capture = self.getCaptureForComparison() if self.shouldCheckResetImage(): - reset_masked = (self.reset_mask is not None) - capture = self.getCaptureForComparison(reset_masked) - reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: send_hotkey(self.resetLineEdit.text()) @@ -541,10 +505,10 @@ def autoSplitter(self): self.guiChangesOnReset() return - # get capture again if needed - masked = (self.flags & 0x02 == 0x02) - if capture is None or masked != reset_masked: - capture = self.getCaptureForComparison(masked) + # TODO: Check is this actually still needed? + # get capture again if current and reset image have different mask flags + if self.imageHasTransparency != (self.reset_mask is not None): + capture = self.getCaptureForComparison() # calculate similarity for split image self.similarity = self.compareImage(self.split_image, self.mask, capture) @@ -577,18 +541,19 @@ def autoSplitter(self): else: self.undosplitButton.setEnabled(True) - # if the b flag is set, let similarity go above threshold first, then split on similarity below threshold. + # if the b flag is set, let similarity go above threshold first, + # then split on similarity below threshold. # if no b flag, just split when similarity goes above threshold. - if self.flags & 0x04 == 0x04 and self.split_below_threshold == False: - if self.waiting_for_split_delay == False and self.similarity >= self.similaritythresholdDoubleSpinBox.value(): - self.split_below_threshold = True - continue - elif self.flags & 0x04 == 0x04 and self.split_below_threshold == True: - if self.waiting_for_split_delay == False and self.similarity < self.similaritythresholdDoubleSpinBox.value(): - self.split_below_threshold = False - break - else: - if self.waiting_for_split_delay == False and self.similarity >= self.similaritythresholdDoubleSpinBox.value(): + if not self.waiting_for_split_delay: + if self.flags & 0x04 == 0x04 and not self.split_below_threshold: + if self.similarity >= self.similarity_threshold: + self.split_below_threshold = True + continue + elif self.flags & 0x04 == 0x04 and self.split_below_threshold: + if self.similarity < self.similarity_threshold: + self.split_below_threshold = False + break + elif self.similarity >= self.similarity_threshold: break # limit the number of time the comparison runs to reduce cpu usage @@ -600,9 +565,7 @@ def autoSplitter(self): # We need to make sure that this isn't a dummy split before sending # the key press. - if (self.flags & 0x01 == 0x01): - pass - else: + if not (self.flags & 0x01 == 0x01): # If it's a delayed split, check if the delay has passed # Otherwise calculate the split time for the key press if self.split_delay > 0 and self.waiting_for_split_delay == False: @@ -616,8 +579,8 @@ def autoSplitter(self): # check for reset while delayed and display a counter of the remaining split delay time delay_start_time = time.time() while time.time() - delay_start_time < (self.split_delay / 1000): - self.delay_time_left = str(round((self.split_delay / 1000) - (time.time() - delay_start_time), 1)) - self.currentSplitImage.setText('Delayed Split: ' + self.delay_time_left + ' sec remaining') + delay_time_left = round((self.split_delay / 1000) - (time.time() - delay_start_time), 1) + self.currentSplitImage.setText(f'Delayed Split: {delay_time_left} sec remaining') # check for reset if win32gui.GetWindowText(self.hwnd) == '': self.reset() @@ -630,9 +593,8 @@ def autoSplitter(self): return # calculate similarity for reset image - if self.shouldCheckResetImage() == True: - reset_masked = (self.reset_mask is not None) - capture = self.getCaptureForComparison(reset_masked) + if self.shouldCheckResetImage(): + capture = self.getCaptureForComparison() reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: @@ -694,9 +656,9 @@ def autoSplitter(self): # I have a pause loop here so that it can check if the user presses skip split, undo split, or reset here. # Also updates the current split image text, counting down the time until the next split image pause_start_time = time.time() - while time.time() - pause_start_time < self.pauseDoubleSpinBox.value(): - self.pause_time_left = str(round((self.pauseDoubleSpinBox.value()) - (time.time() - pause_start_time), 1)) - self.currentSplitImage.setText('None (Paused). ' + self.pause_time_left + ' sec remaining') + while time.time() - pause_start_time < self.pause: + pause_time_left = round(self.pause - (time.time() - pause_start_time), 1) + self.currentSplitImage.setText(f'None (Paused). {pause_time_left} sec remaining') # check for reset if win32gui.GetWindowText(self.hwnd) == '': @@ -714,9 +676,8 @@ def autoSplitter(self): break # calculate similarity for reset image - if self.shouldCheckResetImage() == True: - reset_masked = (self.reset_mask is not None) - capture = self.getCaptureForComparison(reset_masked) + if self.shouldCheckResetImage(): + capture = self.getCaptureForComparison() reset_similarity = self.compareImage(self.reset_image, self.reset_mask, capture) if reset_similarity >= self.reset_image_threshold: @@ -741,8 +702,6 @@ def guiChangesOnStart(self): self.setskipsplithotkeyButton.setEnabled(False) self.setundosplithotkeyButton.setEnabled(False) self.setpausehotkeyButton.setEnabled(False) - self.custompausetimesCheckBox.setEnabled(False) - self.customthresholdsCheckBox.setEnabled(False) self.groupDummySplitsCheckBox.setEnabled(False) QtGui.QApplication.processEvents() @@ -763,8 +722,6 @@ def guiChangesOnReset(self): self.setskipsplithotkeyButton.setEnabled(True) self.setundosplithotkeyButton.setEnabled(True) self.setpausehotkeyButton.setEnabled(True) - self.custompausetimesCheckBox.setEnabled(True) - self.customthresholdsCheckBox.setEnabled(True) self.groupDummySplitsCheckBox.setEnabled(True) QtGui.QApplication.processEvents() @@ -784,32 +741,20 @@ def compareImage(self, image, mask, capture): elif self.comparisonmethodComboBox.currentIndex() == 2: return compare.compare_phash_masked(image, capture, mask) - def getCaptureForComparison(self, masked): + def getCaptureForComparison(self): # grab screenshot of capture region capture = capture_windows.capture_region(self.hwnd, self.rect) - - # if flagged as a mask, capture with nearest neighbor interpolation. else don't so that - # threshold settings on versions below 1.2.0 aren't messed up - if (masked): - capture = cv2.resize(capture, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT), interpolation=cv2.INTER_NEAREST) - else: - capture = cv2.resize(capture, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT)) - + # Capture with nearest neighbor interpolation + capture = cv2.resize(capture, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT), interpolation=cv2.INTER_NEAREST) # convert to BGR - capture = cv2.cvtColor(capture, cv2.COLOR_BGRA2BGR) - - return capture + return cv2.cvtColor(capture, cv2.COLOR_BGRA2BGR) def shouldCheckResetImage(self): - if self.reset_image is not None and time.time() - self.run_start_time > self.reset_image_pause_time: - return True - - return False + return self.reset_image is not None and time.time() - self.run_start_time > self.reset_image_pause_time def findResetImage(self): self.reset_image = None self.reset_mask = None - self.reset_image_threshold = None reset_image_file = None for i, image in enumerate(self.split_image_filenames): @@ -824,16 +769,15 @@ def findResetImage(self): # create reset image and keep in memory path = self.split_image_directory + reset_image_file - flags = split_parser.flags_from_filename(reset_image_file) - - self.reset_image_threshold = split_parser.threshold_from_filename(reset_image_file) - self.reset_image_pause_time = split_parser.pause_from_filename(reset_image_file) - if self.reset_image_pause_time is None: - self.reset_image_pause_time = 0 + # Override values if they have been specified on the file + self.reset_image_pause_time = split_parser.pause_from_filename(reset_image_file) \ + or self.pauseDoubleSpinBox.value() + self.reset_image_threshold = split_parser.threshold_from_filename(reset_image_file) \ + or self.similaritythresholdDoubleSpinBox.value() # if theres a mask flag, create a mask - if (flags & 0x02 == 0x02): + if self.imageHasTransparency: # create mask based on resized, nearest neighbor interpolated split image self.reset_image = cv2.imread(path, cv2.IMREAD_UNCHANGED) self.reset_image = cv2.resize(self.reset_image, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT), @@ -858,10 +802,11 @@ def updateSplitImage(self): # get flags self.flags = split_parser.flags_from_filename(split_image_file) + self.imageHasTransparency = self.checkIfImageHasTransparency() # set current split image in UI # if flagged as mask, transform transparency into UI's gray BG color - if (self.flags & 0x02 == 0x02): + if (self.imageHasTransparency): self.split_image_display = cv2.imread(self.split_image_path, cv2.IMREAD_UNCHANGED) transparent_mask = self.split_image_display[:, :, 3] == 0 self.split_image_display[transparent_mask] = [240, 240, 240, 255] @@ -880,7 +825,7 @@ def updateSplitImage(self): self.currentsplitimagefileLabel.setText(split_image_file) # if theres a mask flag, create a mask - if (self.flags & 0x02 == 0x02): + if (self.imageHasTransparency): # create mask based on resized, nearest neighbor interpolated split image self.split_image = cv2.imread(self.split_image_path, cv2.IMREAD_UNCHANGED) @@ -899,12 +844,11 @@ def updateSplitImage(self): self.split_image = cv2.resize(split_image, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT)) self.mask = None - # If the unique parameters are selected, go ahead and set the spinboxes to those values - if self.custompausetimesCheckBox.isChecked(): - self.pauseDoubleSpinBox.setValue(split_parser.pause_from_filename(split_image_file)) - - if self.customthresholdsCheckBox.isChecked(): - self.similaritythresholdDoubleSpinBox.setValue(split_parser.threshold_from_filename(split_image_file)) + # Override values if they have been specified on the file + self.pause = split_parser.pause_from_filename(split_image_file) \ + or self.pauseDoubleSpinBox.value() + self.similarity_threshold = split_parser.threshold_from_filename(split_image_file) \ + or self.similaritythresholdDoubleSpinBox.value() # Get delay for split, if any self.split_delay = split_parser.delay_from_filename(split_image_file) @@ -955,7 +899,6 @@ def closeEvent(self, event): sys.exit() - def main(): app = QtGui.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon('icon.ico')) diff --git a/src/AutoSplit.spec b/src/AutoSplit.spec new file mode 100644 index 00000000..b05e3229 --- /dev/null +++ b/src/AutoSplit.spec @@ -0,0 +1,34 @@ +# -*- mode: python ; coding: utf-8 -*- + + +block_cipher = None + + +a = Analysis(['src\\AutoSplit.py'], + pathex=['E:\\Users\\Avasam\\Documents\\Git\\Auto-Split\\src'], + binaries=[], + datas=[], + hiddenimports=[], + hookspath=[], + runtime_hooks=[], + excludes=[], + win_no_prefer_redirects=False, + win_private_assemblies=False, + cipher=block_cipher, + noarchive=False) +pyz = PYZ(a.pure, a.zipped_data, + cipher=block_cipher) +exe = EXE(pyz, + a.scripts, + a.binaries, + a.zipfiles, + a.datas, + [], + name='AutoSplit', + debug=False, + bootloader_ignore_signals=False, + strip=False, + upx=True, + upx_exclude=[], + runtime_tmpdir=None, + console=False , icon='src\\icon.ico') diff --git a/src/capture_windows.py b/src/capture_windows.py index 7e3d928e..843e2522 100644 --- a/src/capture_windows.py +++ b/src/capture_windows.py @@ -1,3 +1,4 @@ + from ctypes import windll from ctypes.wintypes import LONG, RECT from win32 import win32gui diff --git a/src/compare.py b/src/compare.py index 72b62913..f2a02f52 100644 --- a/src/compare.py +++ b/src/compare.py @@ -1,7 +1,6 @@ from PIL import Image import imagehash - -import numpy +import numpy as np import cv2 def compare_histograms(source, capture): @@ -16,10 +15,10 @@ def compare_histograms(source, capture): source_hist = cv2.calcHist([source], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256]) capture_hist = cv2.calcHist([capture], [0, 1, 2], None, [8, 8, 8], [0, 256, 0, 256, 0, 256]) - + cv2.normalize(source_hist, source_hist) cv2.normalize(capture_hist, capture_hist) - + return 1 - cv2.compareHist(source_hist, capture_hist, cv2.HISTCMP_BHATTACHARYYA) def compare_histograms_masked(source, capture, mask): @@ -34,10 +33,10 @@ def compare_histograms_masked(source, capture, mask): """ source_hist = cv2.calcHist([source], [0, 1, 2], mask, [8, 8, 8], [0, 256, 0, 256, 0, 256]) capture_hist = cv2.calcHist([capture], [0, 1, 2], mask, [8, 8, 8], [0, 256, 0, 256, 0, 256]) - + cv2.normalize(source_hist, source_hist) cv2.normalize(capture_hist, capture_hist) - + return 1 - cv2.compareHist(source_hist, capture_hist, cv2.HISTCMP_BHATTACHARYYA) def compare_l2_norm(source, capture): @@ -51,10 +50,10 @@ def compare_l2_norm(source, capture): """ error = cv2.norm(source, capture, cv2.NORM_L2) - + # The L2 Error is summed across all pixels, so this normalizes max_error = (source.size ** 0.5) * 255 - + return 1 - (error/max_error) def compare_l2_norm_masked(source, capture, mask): @@ -71,7 +70,7 @@ def compare_l2_norm_masked(source, capture, mask): error = cv2.norm(source, capture, cv2.NORM_L2, mask) # The L2 Error is summed across all pixels, so this normalizes - max_error = (3 * numpy.count_nonzero(mask) * 255 * 255) ** 0.5 + max_error = (3 * np.count_nonzero(mask) * 255 * 255) ** 0.5 return 1 - (error / max_error) @@ -111,13 +110,13 @@ def compare_template_masked(source, capture, mask): result = cv2.matchTemplate(capture, source, cv2.TM_SQDIFF, None, mask) min_val, max_val, min_loc, max_loc = cv2.minMaxLoc(result) - return 1 - (min_val/numpy.count_nonzero(mask)) + return 1 - (min_val/np.count_nonzero(mask)) def compare_phash(source, capture): """ Compares the pHash of the two given images and returns the similarity between the two. - + @param source: Image of any given shape as a numpy array @param capture: Image of any given shape as a numpy array @return: The similarity between the hashes of the image as a number 0 to 1. @@ -135,7 +134,7 @@ def compare_phash_masked(source, capture, mask): """ Compares the pHash of the two given images and returns the similarity between the two. - + @param source: Image of any given shape as a numpy array @param capture: Image of any given shape as a numpy array @param mask: An image matching the dimensions of the source, but 1 channel grayscale @@ -149,7 +148,7 @@ def compare_phash_masked(source, capture, mask): # the same source = cv2.bitwise_and(source, source, mask=mask) capture = cv2.bitwise_and(capture, capture, mask=mask) - + source = Image.fromarray(source) capture = Image.fromarray(capture) @@ -157,3 +156,9 @@ def compare_phash_masked(source, capture, mask): capture_hash = imagehash.phash(capture) return 1 - ((source_hash - capture_hash)/64.0) + + +def checkIfImageHasTransparency(self): + source = cv2.imread(self.split_image_path, cv2.IMREAD_UNCHANGED) + # Check if there's a transparency channel (4th channel) and if at least one pixel is transparent (< 255) + return source.shape[2] == 4 and np.mean(source[:, :, 3]) != 255 diff --git a/src/design.py b/src/design.py index 1d74fd47..eba9c843 100644 --- a/src/design.py +++ b/src/design.py @@ -77,7 +77,7 @@ def setupUi(self, MainWindow): self.selectregionButton.setFocusPolicy(QtCore.Qt.NoFocus) self.selectregionButton.setObjectName(_fromUtf8("selectregionButton")) self.similaritythresholdLabel = QtGui.QLabel(self.centralwidget) - self.similaritythresholdLabel.setGeometry(QtCore.QRect(10, 378, 91, 16)) + self.similaritythresholdLabel.setGeometry(QtCore.QRect(10, 374, 91, 22)) self.similaritythresholdLabel.setObjectName(_fromUtf8("similaritythresholdLabel")) self.similaritythresholdDoubleSpinBox = QtGui.QDoubleSpinBox(self.centralwidget) self.similaritythresholdDoubleSpinBox.setGeometry(QtCore.QRect(160, 383, 64, 22)) @@ -102,7 +102,7 @@ def setupUi(self, MainWindow): self.skipsplitButton.setFocusPolicy(QtCore.Qt.NoFocus) self.skipsplitButton.setObjectName(_fromUtf8("skipsplitButton")) self.pauseLabel = QtGui.QLabel(self.centralwidget) - self.pauseLabel.setGeometry(QtCore.QRect(10, 420, 140, 16)) + self.pauseLabel.setGeometry(QtCore.QRect(10, 420, 111, 22)) self.pauseLabel.setObjectName(_fromUtf8("pauseLabel")) self.checkfpsButton = QtGui.QPushButton(self.centralwidget) self.checkfpsButton.setGeometry(QtCore.QRect(5, 225, 51, 21)) @@ -343,20 +343,6 @@ def setupUi(self, MainWindow): self.pauseDoubleSpinBox.setSingleStep(1.0) self.pauseDoubleSpinBox.setProperty("value", 10.0) self.pauseDoubleSpinBox.setObjectName(_fromUtf8("pauseDoubleSpinBox")) - self.custompausetimesCheckBox = QtGui.QCheckBox(self.centralwidget) - self.custompausetimesCheckBox.setEnabled(True) - self.custompausetimesCheckBox.setGeometry(QtCore.QRect(10, 435, 121, 17)) - self.custompausetimesCheckBox.setWhatsThis(_fromUtf8("")) - self.custompausetimesCheckBox.setChecked(False) - self.custompausetimesCheckBox.setTristate(False) - self.custompausetimesCheckBox.setObjectName(_fromUtf8("custompausetimesCheckBox")) - self.customthresholdsCheckBox = QtGui.QCheckBox(self.centralwidget) - self.customthresholdsCheckBox.setEnabled(True) - self.customthresholdsCheckBox.setGeometry(QtCore.QRect(10, 394, 111, 17)) - self.customthresholdsCheckBox.setWhatsThis(_fromUtf8("")) - self.customthresholdsCheckBox.setChecked(False) - self.customthresholdsCheckBox.setTristate(False) - self.customthresholdsCheckBox.setObjectName(_fromUtf8("customthresholdsCheckBox")) self.comparisonmethodLabel = QtGui.QLabel(self.centralwidget) self.comparisonmethodLabel.setGeometry(QtCore.QRect(10, 300, 101, 16)) self.comparisonmethodLabel.setObjectName(_fromUtf8("comparisonmethodLabel")) @@ -438,8 +424,6 @@ def setupUi(self, MainWindow): self.yLabel.raise_() self.comparisonmethodComboBox.raise_() self.pauseDoubleSpinBox.raise_() - self.custompausetimesCheckBox.raise_() - self.customthresholdsCheckBox.raise_() self.comparisonmethodLabel.raise_() self.alignregionButton.raise_() self.groupDummySplitsCheckBox.raise_() @@ -482,10 +466,8 @@ def setupUi(self, MainWindow): MainWindow.setTabOrder(self.liveimageCheckBox, self.comparisonmethodComboBox) MainWindow.setTabOrder(self.comparisonmethodComboBox, self.showlivesimilarityCheckBox) MainWindow.setTabOrder(self.showlivesimilarityCheckBox, self.showhighestsimilarityCheckBox) - MainWindow.setTabOrder(self.showhighestsimilarityCheckBox, self.customthresholdsCheckBox) - MainWindow.setTabOrder(self.customthresholdsCheckBox, self.similaritythresholdDoubleSpinBox) - MainWindow.setTabOrder(self.similaritythresholdDoubleSpinBox, self.custompausetimesCheckBox) - MainWindow.setTabOrder(self.custompausetimesCheckBox, self.pauseDoubleSpinBox) + MainWindow.setTabOrder(self.showhighestsimilarityCheckBox, self.similaritythresholdDoubleSpinBox) + MainWindow.setTabOrder(self.similaritythresholdDoubleSpinBox, self.pauseDoubleSpinBox) MainWindow.setTabOrder(self.pauseDoubleSpinBox, self.splitLineEdit) MainWindow.setTabOrder(self.splitLineEdit, self.resetLineEdit) MainWindow.setTabOrder(self.resetLineEdit, self.skipsplitLineEdit) @@ -504,12 +486,12 @@ def retranslateUi(self, MainWindow): self.loopCheckBox.setText(_translate("MainWindow", "Loop Split Images", None)) self.autostartonresetCheckBox.setText(_translate("MainWindow", "Auto Start On Reset", None)) self.selectregionButton.setText(_translate("MainWindow", "Select Region", None)) - self.similaritythresholdLabel.setText(_translate("MainWindow", "Similarity threshold", None)) + self.similaritythresholdLabel.setText(_translate("MainWindow", "Similarity threshold\nDefault value", None)) self.startautosplitterButton.setText(_translate("MainWindow", "Start Auto Splitter", None)) self.resetButton.setText(_translate("MainWindow", "Reset", None)) self.undosplitButton.setText(_translate("MainWindow", "Undo Split", None)) self.skipsplitButton.setText(_translate("MainWindow", "Skip Split", None)) - self.pauseLabel.setText(_translate("MainWindow", "Pause time after split (sec)", None)) + self.pauseLabel.setText(_translate("MainWindow", "Pause time (seconds)\nDefault value", None)) self.checkfpsButton.setText(_translate("MainWindow", "Max FPS", None)) self.fpsLabel.setText(_translate("MainWindow", "FPS", None)) self.showlivesimilarityCheckBox.setText(_translate("MainWindow", "Show live similarity", None)) @@ -536,8 +518,6 @@ def retranslateUi(self, MainWindow): self.comparisonmethodComboBox.setItemText(0, _translate("MainWindow", "L2 Norm", None)) self.comparisonmethodComboBox.setItemText(1, _translate("MainWindow", "Histograms", None)) self.comparisonmethodComboBox.setItemText(2, _translate("MainWindow", "pHash", None)) - self.custompausetimesCheckBox.setText(_translate("MainWindow", "Custom pause times", None)) - self.customthresholdsCheckBox.setText(_translate("MainWindow", "Custom thresholds", None)) self.comparisonmethodLabel.setText(_translate("MainWindow", "Comparison Method", None)) self.alignregionButton.setText(_translate("MainWindow", "Align Region", None)) self.groupDummySplitsCheckBox.setText(_translate("MainWindow", "Group dummy splits when undoing/skipping", None)) diff --git a/src/error_messages.py b/src/error_messages.py index 2f55c83f..f2a7fdd2 100644 --- a/src/error_messages.py +++ b/src/error_messages.py @@ -1,6 +1,7 @@ # Error messages from PyQt4 import QtGui + def splitImageDirectoryError(self): msgBox = QtGui.QMessageBox() msgBox.setWindowTitle('Error') @@ -48,27 +49,6 @@ def pauseHotkeyError(self): msgBox.setText("Your split image folder contains an image filename with a pause flag {p}, but no pause hotkey is set.") msgBox.exec_() -def customThresholdError(self, image): - msgBox = QtGui.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("\"" + image + "\" doesn't have a valid custom threshold.") - msgBox.exec_() - - -def customPauseError(self, image): - msgBox = QtGui.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("\"" + image + "\" doesn't have a valid custom pause time.") - msgBox.exec_() - - -def alphaChannelError(self, image): - msgBox = QtGui.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("\"" + image + "\" is marked with mask flag but it doesn't have transparency.") - msgBox.exec_() - - def alignRegionImageTypeError(self): msgBox = QtGui.QMessageBox() msgBox.setWindowTitle('Error') @@ -90,13 +70,6 @@ def multipleResetImagesError(self): msgBox.exec_() -def noResetImageThresholdError(self): - msgBox = QtGui.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Reset Image must have a custom threshold. Please set one and check that it is valid") - msgBox.exec_() - - def resetHotkeyError(self): msgBox = QtGui.QMessageBox() msgBox.setWindowTitle('Error') @@ -111,12 +84,6 @@ def dummySplitsError(self): "Group dummy splits when undoing/skipping cannot be checked if any split image has a loop parameter greater than 1") msgBox.exec_() -def settingsNotFoundError(self): - msgBox = QtGui.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("No settings file found. The settings file is saved when the program is closed.") - msgBox.exec_() - def oldVersionSettingsFileError(self): msgBox = QtGui.QMessageBox() msgBox.setWindowTitle('Error') @@ -139,4 +106,4 @@ def tooManySettingsFilesOnOpenError(self): msgBox = QtGui.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Too many settings files found. Only one can be loaded on open if placed in the same folder as AutoSplit.exe") - msgBox.exec_() \ No newline at end of file + msgBox.exec_() diff --git a/src/screen_region.py b/src/screen_region.py index 9c9d382a..6de9b2b6 100644 --- a/src/screen_region.py +++ b/src/screen_region.py @@ -1,13 +1,8 @@ from PyQt4 import QtGui, QtCore, QtTest -import ctypes -import ctypes.wintypes -import win32gui -import cv2 +from win32 import win32gui import capture_windows -from PyQt4 import QtGui, QtCore, QtTest import ctypes import ctypes.wintypes -import win32gui import cv2 import numpy as np @@ -291,4 +286,4 @@ def mouseReleaseEvent(self, event): self.bottom = max(self.begin.y(), self.end.y()) + self.SM_YVIRTUALSCREEN self.height = self.bottom - self.top - self.width = self.right - self.left \ No newline at end of file + self.width = self.right - self.left diff --git a/src/settings_file.py b/src/settings_file.py index 9f352cb7..ef8d3006 100644 --- a/src/settings_file.py +++ b/src/settings_file.py @@ -1,11 +1,8 @@ +from win32 import win32gui +from PyQt4 import QtGui import keyboard -import win32gui import pickle import glob -import logging -from PyQt4 import QtGui -from hotkeys import _hotkey_action - def getSaveSettingsValues(self): # get values to be able to save settings @@ -24,15 +21,8 @@ def getSaveSettingsValues(self): self.undo_split_key = str(self.undosplitLineEdit.text()) self.pause_key = str(self.pausehotkeyLineEdit.text()) - if self.custompausetimesCheckBox.isChecked(): - self.custom_pause_times_setting = 1 - else: - self.custom_pause_times_setting = 0 - - if self.customthresholdsCheckBox.isChecked(): - self.custom_thresholds_setting = 1 - else: - self.custom_thresholds_setting = 0 + self.custom_pause_times_setting = 0 + self.custom_thresholds_setting = 1 if self.groupDummySplitsCheckBox.isChecked(): self.group_dummy_splits_undo_skip_setting = 1 @@ -51,12 +41,27 @@ def getSaveSettingsValues(self): def haveSettingsChanged(self): self.getSaveSettingsValues() - self.current_save_settings = [self.split_image_directory, self.similarity_threshold, self.comparison_index, self.pause, - self.fps_limit, self.split_key, - self.reset_key, self.skip_split_key, self.undo_split_key, self.pause_key, self.x, self.y, self.width, self.height, - self.hwnd_title, - self.custom_pause_times_setting, self.custom_thresholds_setting, - self.group_dummy_splits_undo_skip_setting, self.loop_setting, self.auto_start_on_reset_setting] + self.current_save_settings = [ + self.split_image_directory, + self.similarity_threshold, + self.comparison_index, + self.pause, + self.fps_limit, + self.split_key, + self.reset_key, + self.skip_split_key, + self.undo_split_key, + self.pause_key, + self.x, + self.y, + self.width, + self.height, + self.hwnd_title, + self.custom_pause_times_setting, + self.custom_thresholds_setting, + self.group_dummy_splits_undo_skip_setting, + self.loop_setting, + self.auto_start_on_reset_setting] #one small caveat in this: if you load a settings file from an old version, but dont change settings, #the current save settings and last load settings will have different # of elements and it will ask @@ -71,14 +76,27 @@ def saveSettings(self): self.saveSettingsAs() else: self.getSaveSettingsValues() - self.last_saved_settings = [self.split_image_directory, self.similarity_threshold, self.comparison_index, - self.pause, - self.fps_limit, self.split_key, - self.reset_key, self.skip_split_key, self.undo_split_key, self.pause_key, self.x, - self.y, self.width, self.height, - self.hwnd_title, - self.custom_pause_times_setting, self.custom_thresholds_setting, - self.group_dummy_splits_undo_skip_setting, self.loop_setting, self.auto_start_on_reset_setting] + self.last_saved_settings = [ + self.split_image_directory, + self.similarity_threshold, + self.comparison_index, + self.pause, + self.fps_limit, + self.split_key, + self.reset_key, + self.skip_split_key, + self.undo_split_key, + self.pause_key, + self.x, + self.y, + self.width, + self.height, + self.hwnd_title, + self.custom_pause_times_setting, + self.custom_thresholds_setting, + self.group_dummy_splits_undo_skip_setting, + self.loop_setting, + self.auto_start_on_reset_setting] # save settings to a .pkl file with open(self.last_successfully_loaded_settings_file_path, 'wb') as f: pickle.dump(self.last_saved_settings, f) @@ -92,12 +110,27 @@ def saveSettingsAs(self): return self.getSaveSettingsValues() - self.last_saved_settings = [self.split_image_directory, self.similarity_threshold, self.comparison_index, self.pause, - self.fps_limit, self.split_key, - self.reset_key, self.skip_split_key, self.undo_split_key, self.pause_key, self.x, self.y, self.width, self.height, - self.hwnd_title, - self.custom_pause_times_setting, self.custom_thresholds_setting, - self.group_dummy_splits_undo_skip_setting, self.loop_setting, self.auto_start_on_reset_setting] + self.last_saved_settings = [ + self.split_image_directory, + self.similarity_threshold, + self.comparison_index, + self.pause, + self.fps_limit, + self.split_key, + self.reset_key, + self.skip_split_key, + self.undo_split_key, + self.pause_key, + self.x, + self.y, + self.width, + self.height, + self.hwnd_title, + self.custom_pause_times_setting, + self.custom_thresholds_setting, + self.group_dummy_splits_undo_skip_setting, + self.loop_setting, + self.auto_start_on_reset_setting] # save settings to a .pkl file with open(self.save_settings_file_path, 'wb') as f: @@ -142,21 +175,49 @@ def loadSettings(self): #v1.5 settings if self.settings_count == 20: with open(self.load_settings_file_path, 'rb') as f: - self.last_loaded_settings = [self.split_image_directory, self.similarity_threshold, self.comparison_index, self.pause, - self.fps_limit, self.split_key, - self.reset_key, self.skip_split_key, self.undo_split_key, self.pause_key, self.x, self.y, self.width, self.height, - self.hwnd_title, - self.custom_pause_times_setting, self.custom_thresholds_setting, - self.group_dummy_splits_undo_skip_setting, self.loop_setting, self.auto_start_on_reset_setting] = pickle.load(f) + self.last_loaded_settings = [ + self.split_image_directory, + self.similarity_threshold, + self.comparison_index, + self.pause, + self.fps_limit, + self.split_key, + self.reset_key, + self.skip_split_key, + self.undo_split_key, + self.pause_key, + self.x, + self.y, + self.width, + self.height, + self.hwnd_title, + self.custom_pause_times_setting, + self.custom_thresholds_setting, + self.group_dummy_splits_undo_skip_setting, + self.loop_setting, + self.auto_start_on_reset_setting] = pickle.load(f) #v1.3-1.4 settings. add a blank pause key. elif self.settings_count == 18: with open(self.load_settings_file_path, 'rb') as f: - self.last_loaded_settings = [self.split_image_directory, self.similarity_threshold, self.comparison_index, self.pause, - self.fps_limit, self.split_key, - self.reset_key, self.skip_split_key, self.undo_split_key, self.x, self.y, self.width, self.height, - self.hwnd_title, - self.custom_pause_times_setting, self.custom_thresholds_setting, - self.group_dummy_splits_undo_skip_setting, self.loop_setting] = pickle.load(f) + self.last_loaded_settings = [ + self.split_image_directory, + self.similarity_threshold, + self.comparison_index, + self.pause, + self.fps_limit, + self.split_key, + self.reset_key, + self.skip_split_key, + self.undo_split_key, + self.x, + self.y, + self.width, + self.height, + self.hwnd_title, + self.custom_pause_times_setting, + self.custom_thresholds_setting, + self.group_dummy_splits_undo_skip_setting, + self.loop_setting] = pickle.load(f) self.pause_key = '' self.auto_start_on_reset_setting = 0 elif self.settings_count < 18: @@ -174,13 +235,22 @@ def loadSettings(self): self.heightSpinBox.setValue(self.height) self.comparisonmethodComboBox.setCurrentIndex(self.comparison_index) self.hwnd = win32gui.FindWindow(None, self.hwnd_title) + + # set custom checkboxes accordingly + if self.group_dummy_splits_undo_skip_setting == 1: + self.groupDummySplitsCheckBox.setChecked(True) + else: + self.groupDummySplitsCheckBox.setChecked(False) - # set custom checkbox's accordingly - self.custompausetimesCheckBox.setChecked(self.custom_pause_times_setting == 1) - self.customthresholdsCheckBox.setChecked(self.custom_thresholds_setting == 1) - self.groupDummySplitsCheckBox.setChecked(self.group_dummy_splits_undo_skip_setting == 1) - self.loopCheckBox.setChecked(self.loop_setting == 1) - self.autostartonresetCheckBox.setChecked(self.auto_start_on_reset_setting == 1) + if self.loop_setting == 1: + self.loopCheckBox.setChecked(True) + else: + self.loopCheckBox.setChecked(False) + + if self.auto_start_on_reset_setting == 1: + self.autostartonresetCheckBox.setChecked(True) + else: + self.autostartonresetCheckBox.setChecked(False) # TODO: Reuse code from hotkeys rather than duplicating here # try to set hotkeys from when user last closed the window diff --git a/src/split_parser.py b/src/split_parser.py index 2b6d9bc1..74d9fe42 100644 --- a/src/split_parser.py +++ b/src/split_parser.py @@ -6,7 +6,7 @@ def threshold_from_filename(filename): @param filename: String containing the file's name @return: A valid threshold, if not then None """ - + # Check to make sure there is a valid floating point number between # parentheses of the filename try: @@ -97,7 +97,6 @@ def flags_from_filename(filename): """ List of flags: 'd' = dummy, do nothing when this split is found - 'm' = mask, use a mask when comparing this split 'b' = below threshold, after threshold is met, split when it goes below the threhsold. 'p' = pause, hit pause key when this split is found """ @@ -110,17 +109,14 @@ def flags_from_filename(filename): return 0 DUMMY_FLAG = 1 << 0 - MASK_FLAG = 1 << 1 BELOW_FLAG = 1 << 2 PAUSE_FLAG = 1 << 3 flags = 0x00 - + for c in flags_str: if c.upper() == 'D': flags |= DUMMY_FLAG - elif c.upper() == 'M': - flags |= MASK_FLAG elif c.upper() == 'B': flags |= BELOW_FLAG elif c.upper() == 'P': @@ -134,7 +130,7 @@ def flags_from_filename(filename): # For instance, we can't have a dummy split also pause if (flags & DUMMY_FLAG == DUMMY_FLAG) and (flags & PAUSE_FLAG == PAUSE_FLAG): return 0 - + return flags def is_reset_image(filename): @@ -144,4 +140,4 @@ def is_reset_image(filename): @param filename: String containing the file's name @return: True if its a reset image """ - return ('RESET' in filename.upper()) \ No newline at end of file + return ('RESET' in filename.upper()) From 187a7d932da05ea96612c6320cfcb0f742f0658f Mon Sep 17 00:00:00 2001 From: Avasam Date: Tue, 9 Nov 2021 21:55:55 -0500 Subject: [PATCH 5/8] Added install and build scripts --- .vscode/settings.json | 8 -------- README.md | 12 ++++-------- scripts/build.bat | 1 + scripts/compile_resources.bat | 6 ++++++ scripts/install.bat | 1 + requirements.txt => scripts/requirements.txt | 7 ++----- 6 files changed, 14 insertions(+), 21 deletions(-) create mode 100644 scripts/build.bat create mode 100644 scripts/compile_resources.bat create mode 100644 scripts/install.bat rename requirements.txt => scripts/requirements.txt (59%) diff --git a/.vscode/settings.json b/.vscode/settings.json index 977842be..3e2705c9 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -18,14 +18,6 @@ 120, ] }, - "[py]": { - "editor.tabSize": 4, - "editor.rulers": [ - 72, - 79, - 120, - ] - }, // Keeping autoformat to false for now to keep minimal changes "editor.formatOnSave": false, "editor.codeActionsOnSave": { diff --git a/README.md b/README.md index 473df18d..97dcf4d6 100644 --- a/README.md +++ b/README.md @@ -2,19 +2,17 @@ This program compares split images to a capture region of any window (OBS, xsplit, etc.) and automatically hits your split hotkey when there is a match. It can be used in tandem with any speedrun timer that accepts hotkeys (LiveSplit, wsplit, etc.). The purpose of this program is to remove the need to manually press your split hotkey and also increase the accuracy of your splits. -

- -

+![example](example1.5.0.gif) # TUTORIAL ## DOWNLOAD AND OPEN ### Compatability -- Windows 7, 10, and 11 +- Windows 7, 10, and 11. ### Building -- Read [requirements.txt](/requirements.txt) for information on how to run/build the python code +- Read [requirements.txt](/scripts/requirements.txt) for information on how to run/build the python code ### Opening the program - Download the [latest version](https://github.com/austinryan/Auto-Split/releases) @@ -90,9 +88,7 @@ This program compares split images to a capture region of any window (OBS, xspli ### How to Create a Masked Image The best way to create a masked image is to set your capture region as the entire game screen, take a screenshot, and use a program like [paint.net](https://www.getpaint.net/) to "erase" (make transparent) everything you don't want the program to compare. More on how to creating images with transparency using paint.net can be found in [this tutorial](https://www.youtube.com/watch?v=v53kkUYFVn8). The last thing you need to do is add {m} to the filename. For visualization, here is what the capture region compared to a masked split image looks like if you would want to split on "Shine Get!" text in Super Mario Sunshine: -

- -

+![mask_example](mask_example_image.PNG) ### Reset image You can have one (and only one) image with the keyword `reset` in its name. AutoSplit will press the reset button when it finds this image. This image will only be used for resets and it will not be tied to any split. You can set a probability and pause time for it. A custom threshold MUST be applied to this image. The pause time is the amount of seconds AutoSplit will wait before checking for the reset image once the run starts. Also the image can be masked, for example: `Reset_(0.95)_[10]_{m}.png`. diff --git a/scripts/build.bat b/scripts/build.bat new file mode 100644 index 00000000..4c727460 --- /dev/null +++ b/scripts/build.bat @@ -0,0 +1 @@ +pyinstaller -w -F --icon=src/icon.ico "%~p0/../src/AutoSplit.py" diff --git a/scripts/compile_resources.bat b/scripts/compile_resources.bat new file mode 100644 index 00000000..5c6670bc --- /dev/null +++ b/scripts/compile_resources.bat @@ -0,0 +1,6 @@ +cd "%~dp0.." +pyuic6 "./res/about.ui" -o "./src/about.py" +pyuic6 "./res/design.ui" -o "./src/design.py" +:: Doesn't work with current setup. Files might have to be moved around. +:: The Donate button file is also missing +pyside6-rcc "./res/resources.qrc" -o "./src/resources_rc.py" diff --git a/scripts/install.bat b/scripts/install.bat new file mode 100644 index 00000000..3e7a76b0 --- /dev/null +++ b/scripts/install.bat @@ -0,0 +1 @@ +pip3 install -r "%~p0/requirements.txt" diff --git a/requirements.txt b/scripts/requirements.txt similarity index 59% rename from requirements.txt rename to scripts/requirements.txt index a6af9ffc..416568eb 100644 --- a/requirements.txt +++ b/scripts/requirements.txt @@ -1,6 +1,6 @@ # Requirements file for AutoSplit # -# Python: CPython 3.7 (not 3.8 as there is no cp38 wheel for PyQt4) +# Python: CPython 3.7+ # # Usage: pip3.7 install -r requirements.txt # @@ -9,14 +9,11 @@ # # Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F --hidden-import sip --icon=src\icon.ico src\AutoSplit.py # -# You can find other wheels here: https://www.lfd.uci.edu/~gohlke/pythonlibs/#pyqt4 -https://download.lfd.uci.edu/pythonlibs/q4trcu4l/PyQt4-4.11.4-cp37-cp37m-win_amd64.whl -# https://download.lfd.uci.edu/pythonlibs/q4trcu4l/PyQt4-4.11.4-cp37-cp37m-win32.whl -# # Comment this out if you don't want to create AutoSplit.exe: PyInstaller # # Other dependencies: +PyQT5==5.9 opencv-python Pillow ImageHash From 505ddb0a21129c3491465b319da904618b6c1f5c Mon Sep 17 00:00:00 2001 From: Avasam Date: Tue, 9 Nov 2021 21:55:59 -0500 Subject: [PATCH 6/8] Migrated from PyQt4 to PyQt5 --- src/AutoSplit.py | 26 ++--- src/about.py | 28 +++--- src/capture_windows.py | 1 - src/design.py | 222 ++++++++++++++++++++--------------------- src/error_messages.py | 34 +++---- src/menu_bar.py | 4 +- src/resources_rc.py | 4 +- src/screen_region.py | 12 +-- src/settings_file.py | 7 +- 9 files changed, 169 insertions(+), 169 deletions(-) diff --git a/src/AutoSplit.py b/src/AutoSplit.py index bd627b71..0050adf1 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -1,7 +1,7 @@ #!/usr/bin/python3.7 # -*- coding: utf-8 -*- -from PyQt4 import QtGui, QtCore, QtTest +from PyQt5 import QtCore, QtGui, QtTest, QtWidgets from menu_bar import about, viewHelp from win32 import win32gui import sys @@ -11,6 +11,7 @@ import ctypes.wintypes import ctypes import numpy as np + from hotkeys import send_hotkey import design import compare @@ -27,8 +28,7 @@ class AutoSplit(QtWidgets.QMainWindow, design.Ui_MainWindow): from hotkeys import ( beforeSettingHotkey, afterSettingHotkey, setSplitHotkey, setResetHotkey, setSkipSplitHotkey, setUndoSplitHotkey, setPauseHotkey) - - myappid = u'Toufool.AutoSplit.v1.5.0' + myappid = u'Toufool.AutoSplit.v1.5.1' ctypes.windll.shell32.SetCurrentProcessExplicitAppUserModelID(myappid) # signals @@ -46,7 +46,7 @@ def __init__(self, parent=None): # close all processes when closing window self.actionView_Help.triggered.connect(viewHelp) - self.actionAbout.triggered.connect(lambda : about(self)) + self.actionAbout.triggered.connect(lambda: about(self)) self.actionSave_Settings.triggered.connect(self.saveSettings) self.actionSave_Settings_As.triggered.connect(self.saveSettingsAs) self.actionLoad_Settings.triggered.connect(self.loadSettings) @@ -123,7 +123,7 @@ def __init__(self, parent=None): def browse(self): # User selects the file with the split images in it. self.split_image_directory = str( - QtGui.QFileDialog.getExistingDirectory(self, "Select Split Image Directory")) + '\\' + QtWidgets.QFileDialog.getExistingDirectory(self, "Select Split Image Directory")) + '\\' # If the user doesn't select a folder, it defaults to \. Set it back to whats in the LineEdit, and return if self.split_image_directory == '\\': @@ -465,7 +465,7 @@ def autoSplitter(self): if self.waiting_for_split_delay == True: time_millis = int(round(time.time() * 1000)) if time_millis < self.split_time: - QtGui.QApplication.processEvents() + QtWidgets.QApplication.processEvents() continue self.updateSplitImage() @@ -559,7 +559,7 @@ def autoSplitter(self): # limit the number of time the comparison runs to reduce cpu usage fps_limit = self.fpslimitSpinBox.value() time.sleep((1 / fps_limit) - (time.time() - start) % (1 / fps_limit)) - QtGui.QApplication.processEvents() + QtWidgets.QApplication.processEvents() # comes here when threshold gets met @@ -651,7 +651,7 @@ def autoSplitter(self): else: self.undosplitButton.setEnabled(True) - QtGui.QApplication.processEvents() + QtWidgets.QApplication.processEvents() # I have a pause loop here so that it can check if the user presses skip split, undo split, or reset here. # Also updates the current split image text, counting down the time until the next split image @@ -703,7 +703,7 @@ def guiChangesOnStart(self): self.setundosplithotkeyButton.setEnabled(False) self.setpausehotkeyButton.setEnabled(False) self.groupDummySplitsCheckBox.setEnabled(False) - QtGui.QApplication.processEvents() + QtWidgets.QApplication.processEvents() def guiChangesOnReset(self): self.startautosplitterButton.setText('Start Auto Splitter') @@ -723,7 +723,7 @@ def guiChangesOnReset(self): self.setundosplithotkeyButton.setEnabled(True) self.setpausehotkeyButton.setEnabled(True) self.groupDummySplitsCheckBox.setEnabled(True) - QtGui.QApplication.processEvents() + QtWidgets.QApplication.processEvents() def compareImage(self, image, mask, capture): if mask is None: @@ -867,7 +867,7 @@ def closeEvent(self, event): if self.haveSettingsChanged(): #give a different warning if there was never a settings file that was loaded successfully, and save as instead of save. if self.last_successfully_loaded_settings_file_path == None: - msgBox = QtGui.QMessageBox + msgBox = QtWidgets.QMessageBox warning = msgBox.warning(self, "AutoSplit","Do you want to save changes made to settings file Untitled?", msgBox.Yes | msgBox.No | msgBox.Cancel) if warning == msgBox.Yes: self.saveSettingsAs() @@ -881,7 +881,7 @@ def closeEvent(self, event): event.ignore() return else: - msgBox = QtGui.QMessageBox + msgBox = QtWidgets.QMessageBox warning = msgBox.warning(self, "AutoSplit", "Do you want to save the changes made to the settings file " + os.path.basename(self.last_successfully_loaded_settings_file_path) + " ?", msgBox.Yes | msgBox.No | msgBox.Cancel) if warning == msgBox.Yes: self.saveSettings() @@ -900,7 +900,7 @@ def closeEvent(self, event): def main(): - app = QtGui.QApplication(sys.argv) + app = QtWidgets.QApplication(sys.argv) app.setWindowIcon(QtGui.QIcon('icon.ico')) w = AutoSplit() w.setWindowIcon(QtGui.QIcon('icon.ico')) diff --git a/src/about.py b/src/about.py index 93f90bfe..a34864b2 100644 --- a/src/about.py +++ b/src/about.py @@ -2,11 +2,11 @@ # Form implementation generated from reading ui file 'about.ui' # -# Created by: PyQt4 UI code generator 4.11.4 +# Created by: PyQt5 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui, QtWidgets try: _fromUtf8 = QtCore.QString.fromUtf8 @@ -15,12 +15,12 @@ def _fromUtf8(s): return s try: - _encoding = QtGui.QApplication.UnicodeUTF8 + _encoding = QtWidgets.QApplication.UnicodeUTF8 def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) + return QtWidgets.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) + return QtWidgets.QApplication.translate(context, text, disambig) class Ui_aboutAutoSplitWidget(object): def setupUi(self, aboutAutoSplitWidget): @@ -31,28 +31,28 @@ def setupUi(self, aboutAutoSplitWidget): icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/resources/icon.ico")), QtGui.QIcon.Normal, QtGui.QIcon.Off) aboutAutoSplitWidget.setWindowIcon(icon) - self.okButton = QtGui.QPushButton(aboutAutoSplitWidget) + self.okButton = QtWidgets.QPushButton(aboutAutoSplitWidget) self.okButton.setGeometry(QtCore.QRect(190, 220, 71, 21)) self.okButton.setObjectName(_fromUtf8("okButton")) - self.createdbyLabel = QtGui.QLabel(aboutAutoSplitWidget) + self.createdbyLabel = QtWidgets.QLabel(aboutAutoSplitWidget) self.createdbyLabel.setGeometry(QtCore.QRect(10, 44, 151, 16)) self.createdbyLabel.setObjectName(_fromUtf8("createdbyLabel")) - self.versionLabel = QtGui.QLabel(aboutAutoSplitWidget) + self.versionLabel = QtWidgets.QLabel(aboutAutoSplitWidget) self.versionLabel.setGeometry(QtCore.QRect(10, 21, 71, 16)) self.versionLabel.setObjectName(_fromUtf8("versionLabel")) - self.donatetextLabel = QtGui.QLabel(aboutAutoSplitWidget) + self.donatetextLabel = QtWidgets.QLabel(aboutAutoSplitWidget) self.donatetextLabel.setGeometry(QtCore.QRect(46, 95, 191, 41)) self.donatetextLabel.setObjectName(_fromUtf8("donatetextLabel")) - self.donatebuttonLabel = QtGui.QLabel(aboutAutoSplitWidget) + self.donatebuttonLabel = QtWidgets.QLabel(aboutAutoSplitWidget) self.donatebuttonLabel.setGeometry(QtCore.QRect(52, 127, 171, 91)) self.donatebuttonLabel.setAlignment(QtCore.Qt.AlignCenter) self.donatebuttonLabel.setObjectName(_fromUtf8("donatebuttonLabel")) - self.iconLabel = QtGui.QLabel(aboutAutoSplitWidget) + self.iconLabel = QtWidgets.QLabel(aboutAutoSplitWidget) self.iconLabel.setGeometry(QtCore.QRect(190, 17, 62, 71)) self.iconLabel.setObjectName(_fromUtf8("iconLabel")) self.retranslateUi(aboutAutoSplitWidget) - QtCore.QObject.connect(self.okButton, QtCore.SIGNAL(_fromUtf8("clicked()")), aboutAutoSplitWidget.close) + self.okButton.clicked.connect(aboutAutoSplitWidget.close) QtCore.QMetaObject.connectSlotsByName(aboutAutoSplitWidget) def retranslateUi(self, aboutAutoSplitWidget): @@ -69,8 +69,8 @@ def retranslateUi(self, aboutAutoSplitWidget): if __name__ == "__main__": import sys - app = QtGui.QApplication(sys.argv) - aboutAutoSplitWidget = QtGui.QWidget() + app = QtWidgets.QApplication(sys.argv) + aboutAutoSplitWidget = QtWidgets.QWidget() ui = Ui_aboutAutoSplitWidget() ui.setupUi(aboutAutoSplitWidget) aboutAutoSplitWidget.show() diff --git a/src/capture_windows.py b/src/capture_windows.py index 843e2522..7e3d928e 100644 --- a/src/capture_windows.py +++ b/src/capture_windows.py @@ -1,4 +1,3 @@ - from ctypes import windll from ctypes.wintypes import LONG, RECT from win32 import win32gui diff --git a/src/design.py b/src/design.py index eba9c843..353c5dfc 100644 --- a/src/design.py +++ b/src/design.py @@ -2,11 +2,11 @@ # Form implementation generated from reading ui file 'design.ui' # -# Created by: PyQt4 UI code generator 4.11.4 +# Created by: PyQt5 UI code generator 4.11.4 # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore, QtGui +from PyQt5 import QtCore, QtGui, QtWidgets try: _fromUtf8 = QtCore.QString.fromUtf8 @@ -15,18 +15,18 @@ def _fromUtf8(s): return s try: - _encoding = QtGui.QApplication.UnicodeUTF8 + _encoding = QtWidgets.QApplication.UnicodeUTF8 def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig, _encoding) + return QtWidgets.QApplication.translate(context, text, disambig, _encoding) except AttributeError: def _translate(context, text, disambig): - return QtGui.QApplication.translate(context, text, disambig) + return QtWidgets.QApplication.translate(context, text, disambig) class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName(_fromUtf8("MainWindow")) MainWindow.resize(612, 490) - sizePolicy = QtGui.QSizePolicy(QtGui.QSizePolicy.Fixed, QtGui.QSizePolicy.Fixed) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) @@ -38,262 +38,262 @@ def setupUi(self, MainWindow): MainWindow.setWindowIcon(icon) MainWindow.setWhatsThis(_fromUtf8("")) MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight) - self.centralwidget = QtGui.QWidget(MainWindow) + self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName(_fromUtf8("centralwidget")) - self.splitimagefolderLabel = QtGui.QLabel(self.centralwidget) + self.splitimagefolderLabel = QtWidgets.QLabel(self.centralwidget) self.splitimagefolderLabel.setGeometry(QtCore.QRect(90, 13, 91, 16)) self.splitimagefolderLabel.setObjectName(_fromUtf8("splitimagefolderLabel")) - self.splitimagefolderLineEdit = QtGui.QLineEdit(self.centralwidget) + self.splitimagefolderLineEdit = QtWidgets.QLineEdit(self.centralwidget) self.splitimagefolderLineEdit.setGeometry(QtCore.QRect(187, 11, 247, 20)) self.splitimagefolderLineEdit.setReadOnly(True) self.splitimagefolderLineEdit.setObjectName(_fromUtf8("splitimagefolderLineEdit")) - self.browseButton = QtGui.QPushButton(self.centralwidget) + self.browseButton = QtWidgets.QPushButton(self.centralwidget) self.browseButton.setGeometry(QtCore.QRect(443, 9, 75, 24)) self.browseButton.setFocusPolicy(QtCore.Qt.NoFocus) self.browseButton.setObjectName(_fromUtf8("browseButton")) - self.xLabel = QtGui.QLabel(self.centralwidget) + self.xLabel = QtWidgets.QLabel(self.centralwidget) self.xLabel.setGeometry(QtCore.QRect(25, 139, 7, 16)) self.xLabel.setObjectName(_fromUtf8("xLabel")) - self.liveimageCheckBox = QtGui.QCheckBox(self.centralwidget) + self.liveimageCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.liveimageCheckBox.setEnabled(True) self.liveimageCheckBox.setGeometry(QtCore.QRect(125, 253, 121, 17)) self.liveimageCheckBox.setChecked(True) self.liveimageCheckBox.setTristate(False) self.liveimageCheckBox.setObjectName(_fromUtf8("liveimageCheckBox")) - self.loopCheckBox = QtGui.QCheckBox(self.centralwidget) + self.loopCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.loopCheckBox.setEnabled(True) self.loopCheckBox.setGeometry(QtCore.QRect(500, 314, 121, 17)) self.loopCheckBox.setChecked(False) self.loopCheckBox.setTristate(False) self.loopCheckBox.setObjectName(_fromUtf8("loopCheckBox")) - self.autostartonresetCheckBox = QtGui.QCheckBox(self.centralwidget) + self.autostartonresetCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.autostartonresetCheckBox.setEnabled(True) self.autostartonresetCheckBox.setGeometry(QtCore.QRect(500, 344, 121, 17)) self.autostartonresetCheckBox.setChecked(False) self.autostartonresetCheckBox.setTristate(False) self.autostartonresetCheckBox.setObjectName(_fromUtf8("autostartonresetCheckBox")) - self.selectregionButton = QtGui.QPushButton(self.centralwidget) + self.selectregionButton = QtWidgets.QPushButton(self.centralwidget) self.selectregionButton.setGeometry(QtCore.QRect(5, 67, 101, 23)) self.selectregionButton.setFocusPolicy(QtCore.Qt.NoFocus) self.selectregionButton.setObjectName(_fromUtf8("selectregionButton")) - self.similaritythresholdLabel = QtGui.QLabel(self.centralwidget) - self.similaritythresholdLabel.setGeometry(QtCore.QRect(10, 374, 91, 22)) + self.similaritythresholdLabel = QtWidgets.QLabel(self.centralwidget) + self.similaritythresholdLabel.setGeometry(QtCore.QRect(10, 378, 91, 16)) self.similaritythresholdLabel.setObjectName(_fromUtf8("similaritythresholdLabel")) - self.similaritythresholdDoubleSpinBox = QtGui.QDoubleSpinBox(self.centralwidget) + self.similaritythresholdDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) self.similaritythresholdDoubleSpinBox.setGeometry(QtCore.QRect(160, 383, 64, 22)) self.similaritythresholdDoubleSpinBox.setMaximum(1.0) self.similaritythresholdDoubleSpinBox.setSingleStep(0.01) self.similaritythresholdDoubleSpinBox.setProperty("value", 0.9) self.similaritythresholdDoubleSpinBox.setObjectName(_fromUtf8("similaritythresholdDoubleSpinBox")) - self.startautosplitterButton = QtGui.QPushButton(self.centralwidget) + self.startautosplitterButton = QtWidgets.QPushButton(self.centralwidget) self.startautosplitterButton.setGeometry(QtCore.QRect(506, 425, 101, 31)) self.startautosplitterButton.setFocusPolicy(QtCore.Qt.NoFocus) self.startautosplitterButton.setObjectName(_fromUtf8("startautosplitterButton")) - self.resetButton = QtGui.QPushButton(self.centralwidget) + self.resetButton = QtWidgets.QPushButton(self.centralwidget) self.resetButton.setGeometry(QtCore.QRect(506, 385, 101, 31)) self.resetButton.setFocusPolicy(QtCore.Qt.NoFocus) self.resetButton.setObjectName(_fromUtf8("resetButton")) - self.undosplitButton = QtGui.QPushButton(self.centralwidget) + self.undosplitButton = QtWidgets.QPushButton(self.centralwidget) self.undosplitButton.setGeometry(QtCore.QRect(477, 251, 61, 21)) self.undosplitButton.setFocusPolicy(QtCore.Qt.NoFocus) self.undosplitButton.setObjectName(_fromUtf8("undosplitButton")) - self.skipsplitButton = QtGui.QPushButton(self.centralwidget) + self.skipsplitButton = QtWidgets.QPushButton(self.centralwidget) self.skipsplitButton.setGeometry(QtCore.QRect(541, 251, 61, 21)) self.skipsplitButton.setFocusPolicy(QtCore.Qt.NoFocus) self.skipsplitButton.setObjectName(_fromUtf8("skipsplitButton")) - self.pauseLabel = QtGui.QLabel(self.centralwidget) - self.pauseLabel.setGeometry(QtCore.QRect(10, 420, 111, 22)) + self.pauseLabel = QtWidgets.QLabel(self.centralwidget) + self.pauseLabel.setGeometry(QtCore.QRect(10, 420, 140, 16)) self.pauseLabel.setObjectName(_fromUtf8("pauseLabel")) - self.checkfpsButton = QtGui.QPushButton(self.centralwidget) + self.checkfpsButton = QtWidgets.QPushButton(self.centralwidget) self.checkfpsButton.setGeometry(QtCore.QRect(5, 225, 51, 21)) self.checkfpsButton.setFocusPolicy(QtCore.Qt.NoFocus) self.checkfpsButton.setObjectName(_fromUtf8("checkfpsButton")) - self.fpsLabel = QtGui.QLabel(self.centralwidget) + self.fpsLabel = QtWidgets.QLabel(self.centralwidget) self.fpsLabel.setGeometry(QtCore.QRect(87, 225, 20, 20)) self.fpsLabel.setObjectName(_fromUtf8("fpsLabel")) - self.showlivesimilarityCheckBox = QtGui.QCheckBox(self.centralwidget) + self.showlivesimilarityCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.showlivesimilarityCheckBox.setEnabled(True) self.showlivesimilarityCheckBox.setGeometry(QtCore.QRect(10, 330, 111, 17)) self.showlivesimilarityCheckBox.setChecked(True) self.showlivesimilarityCheckBox.setTristate(False) self.showlivesimilarityCheckBox.setObjectName(_fromUtf8("showlivesimilarityCheckBox")) - self.showhighestsimilarityCheckBox = QtGui.QCheckBox(self.centralwidget) + self.showhighestsimilarityCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.showhighestsimilarityCheckBox.setEnabled(True) self.showhighestsimilarityCheckBox.setGeometry(QtCore.QRect(10, 351, 131, 17)) self.showhighestsimilarityCheckBox.setChecked(True) self.showhighestsimilarityCheckBox.setTristate(False) self.showhighestsimilarityCheckBox.setObjectName(_fromUtf8("showhighestsimilarityCheckBox")) - self.livesimilarityLabel = QtGui.QLabel(self.centralwidget) + self.livesimilarityLabel = QtWidgets.QLabel(self.centralwidget) self.livesimilarityLabel.setGeometry(QtCore.QRect(160, 332, 46, 13)) self.livesimilarityLabel.setText(_fromUtf8("")) self.livesimilarityLabel.setObjectName(_fromUtf8("livesimilarityLabel")) - self.highestsimilarityLabel = QtGui.QLabel(self.centralwidget) + self.highestsimilarityLabel = QtWidgets.QLabel(self.centralwidget) self.highestsimilarityLabel.setGeometry(QtCore.QRect(160, 353, 46, 13)) self.highestsimilarityLabel.setText(_fromUtf8("")) self.highestsimilarityLabel.setObjectName(_fromUtf8("highestsimilarityLabel")) - self.splitLabel = QtGui.QLabel(self.centralwidget) + self.splitLabel = QtWidgets.QLabel(self.centralwidget) self.splitLabel.setGeometry(QtCore.QRect(249, 317, 61, 16)) self.splitLabel.setObjectName(_fromUtf8("splitLabel")) - self.resetLabel = QtGui.QLabel(self.centralwidget) + self.resetLabel = QtWidgets.QLabel(self.centralwidget) self.resetLabel.setGeometry(QtCore.QRect(249, 341, 61, 16)) self.resetLabel.setObjectName(_fromUtf8("resetLabel")) - self.skiptsplitLabel = QtGui.QLabel(self.centralwidget) + self.skiptsplitLabel = QtWidgets.QLabel(self.centralwidget) self.skiptsplitLabel.setGeometry(QtCore.QRect(249, 367, 50, 16)) self.skiptsplitLabel.setObjectName(_fromUtf8("skiptsplitLabel")) - self.undosplitLabel = QtGui.QLabel(self.centralwidget) + self.undosplitLabel = QtWidgets.QLabel(self.centralwidget) self.undosplitLabel.setGeometry(QtCore.QRect(249, 393, 61, 16)) self.undosplitLabel.setObjectName(_fromUtf8("undosplitLabel")) - self.pausehotkeyLabel = QtGui.QLabel(self.centralwidget) + self.pausehotkeyLabel = QtWidgets.QLabel(self.centralwidget) self.pausehotkeyLabel.setGeometry(QtCore.QRect(249, 418, 61, 16)) self.pausehotkeyLabel.setObjectName(_fromUtf8("undosplitLabel")) - self.splitLineEdit = QtGui.QLineEdit(self.centralwidget) + self.splitLineEdit = QtWidgets.QLineEdit(self.centralwidget) self.splitLineEdit.setGeometry(QtCore.QRect(316, 314, 81, 20)) self.splitLineEdit.setReadOnly(True) self.splitLineEdit.setObjectName(_fromUtf8("splitLineEdit")) - self.undosplitLineEdit = QtGui.QLineEdit(self.centralwidget) + self.undosplitLineEdit = QtWidgets.QLineEdit(self.centralwidget) self.undosplitLineEdit.setGeometry(QtCore.QRect(316, 391, 81, 20)) self.undosplitLineEdit.setFocusPolicy(QtCore.Qt.StrongFocus) self.undosplitLineEdit.setReadOnly(True) self.undosplitLineEdit.setObjectName(_fromUtf8("undosplitLineEdit")) - self.skipsplitLineEdit = QtGui.QLineEdit(self.centralwidget) + self.skipsplitLineEdit = QtWidgets.QLineEdit(self.centralwidget) self.skipsplitLineEdit.setGeometry(QtCore.QRect(316, 365, 81, 20)) self.skipsplitLineEdit.setReadOnly(True) self.skipsplitLineEdit.setObjectName(_fromUtf8("skipsplitLineEdit")) - self.resetLineEdit = QtGui.QLineEdit(self.centralwidget) + self.resetLineEdit = QtWidgets.QLineEdit(self.centralwidget) self.resetLineEdit.setGeometry(QtCore.QRect(316, 339, 81, 20)) self.resetLineEdit.setReadOnly(True) self.resetLineEdit.setObjectName(_fromUtf8("resetLineEdit")) - self.pausehotkeyLineEdit = QtGui.QLineEdit(self.centralwidget) + self.pausehotkeyLineEdit = QtWidgets.QLineEdit(self.centralwidget) self.pausehotkeyLineEdit.setGeometry(QtCore.QRect(316, 416, 81, 20)) self.pausehotkeyLineEdit.setReadOnly(True) self.pausehotkeyLineEdit.setObjectName(_fromUtf8("pausehotkeyLineEdit")) - self.setsplithotkeyButton = QtGui.QPushButton(self.centralwidget) + self.setsplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) self.setsplithotkeyButton.setGeometry(QtCore.QRect(409, 314, 71, 21)) self.setsplithotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) self.setsplithotkeyButton.setObjectName(_fromUtf8("setsplithotkeyButton")) - self.setresethotkeyButton = QtGui.QPushButton(self.centralwidget) + self.setresethotkeyButton = QtWidgets.QPushButton(self.centralwidget) self.setresethotkeyButton.setGeometry(QtCore.QRect(410, 339, 71, 21)) self.setresethotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) self.setresethotkeyButton.setObjectName(_fromUtf8("setresethotkeyButton")) - self.setskipsplithotkeyButton = QtGui.QPushButton(self.centralwidget) + self.setskipsplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) self.setskipsplithotkeyButton.setGeometry(QtCore.QRect(410, 365, 71, 21)) self.setskipsplithotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) self.setskipsplithotkeyButton.setObjectName(_fromUtf8("setskipsplithotkeyButton")) - self.setundosplithotkeyButton = QtGui.QPushButton(self.centralwidget) + self.setundosplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) self.setundosplithotkeyButton.setGeometry(QtCore.QRect(410, 391, 71, 21)) self.setundosplithotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) self.setundosplithotkeyButton.setObjectName(_fromUtf8("setundosplithotkeyButton")) - self.setpausehotkeyButton = QtGui.QPushButton(self.centralwidget) + self.setpausehotkeyButton = QtWidgets.QPushButton(self.centralwidget) self.setpausehotkeyButton.setGeometry(QtCore.QRect(410, 416, 71, 21)) self.setpausehotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) self.setpausehotkeyButton.setObjectName(_fromUtf8("setpausehotkeyButton")) - self.line_live_bottom = QtGui.QFrame(self.centralwidget) + self.line_live_bottom = QtWidgets.QFrame(self.centralwidget) self.line_live_bottom.setGeometry(QtCore.QRect(111, 247, 240, 2)) - self.line_live_bottom.setFrameShadow(QtGui.QFrame.Plain) + self.line_live_bottom.setFrameShadow(QtWidgets.QFrame.Plain) self.line_live_bottom.setLineWidth(1) - self.line_live_bottom.setFrameShape(QtGui.QFrame.HLine) + self.line_live_bottom.setFrameShape(QtWidgets.QFrame.HLine) self.line_live_bottom.setObjectName(_fromUtf8("line_live_bottom")) - self.line_live_top = QtGui.QFrame(self.centralwidget) + self.line_live_top = QtWidgets.QFrame(self.centralwidget) self.line_live_top.setGeometry(QtCore.QRect(111, 68, 240, 2)) - self.line_live_top.setFrameShadow(QtGui.QFrame.Plain) + self.line_live_top.setFrameShadow(QtWidgets.QFrame.Plain) self.line_live_top.setLineWidth(1) - self.line_live_top.setFrameShape(QtGui.QFrame.HLine) + self.line_live_top.setFrameShape(QtWidgets.QFrame.HLine) self.line_live_top.setObjectName(_fromUtf8("line_live_top")) - self.line_live_right = QtGui.QFrame(self.centralwidget) + self.line_live_right = QtWidgets.QFrame(self.centralwidget) self.line_live_right.setGeometry(QtCore.QRect(349, 69, 2, 180)) - self.line_live_right.setFrameShadow(QtGui.QFrame.Plain) + self.line_live_right.setFrameShadow(QtWidgets.QFrame.Plain) self.line_live_right.setLineWidth(1) - self.line_live_right.setFrameShape(QtGui.QFrame.VLine) + self.line_live_right.setFrameShape(QtWidgets.QFrame.VLine) self.line_live_right.setObjectName(_fromUtf8("line_live_right")) - self.line_left = QtGui.QFrame(self.centralwidget) + self.line_left = QtWidgets.QFrame(self.centralwidget) self.line_left.setGeometry(QtCore.QRect(234, 296, 2, 163)) - self.line_left.setFrameShadow(QtGui.QFrame.Plain) + self.line_left.setFrameShadow(QtWidgets.QFrame.Plain) self.line_left.setLineWidth(1) - self.line_left.setFrameShape(QtGui.QFrame.VLine) + self.line_left.setFrameShape(QtWidgets.QFrame.VLine) self.line_left.setObjectName(_fromUtf8("line_left")) - self.line_live_left = QtGui.QFrame(self.centralwidget) + self.line_live_left = QtWidgets.QFrame(self.centralwidget) self.line_live_left.setGeometry(QtCore.QRect(110, 69, 2, 180)) - self.line_live_left.setFrameShadow(QtGui.QFrame.Plain) + self.line_live_left.setFrameShadow(QtWidgets.QFrame.Plain) self.line_live_left.setLineWidth(1) - self.line_live_left.setFrameShape(QtGui.QFrame.VLine) + self.line_live_left.setFrameShape(QtWidgets.QFrame.VLine) self.line_live_left.setObjectName(_fromUtf8("line_live_left")) - self.line_split_left = QtGui.QFrame(self.centralwidget) + self.line_split_left = QtWidgets.QFrame(self.centralwidget) self.line_split_left.setGeometry(QtCore.QRect(360, 69, 2, 180)) - self.line_split_left.setFrameShadow(QtGui.QFrame.Plain) + self.line_split_left.setFrameShadow(QtWidgets.QFrame.Plain) self.line_split_left.setLineWidth(1) - self.line_split_left.setFrameShape(QtGui.QFrame.VLine) + self.line_split_left.setFrameShape(QtWidgets.QFrame.VLine) self.line_split_left.setObjectName(_fromUtf8("line_split_left")) - self.line_split_right = QtGui.QFrame(self.centralwidget) + self.line_split_right = QtWidgets.QFrame(self.centralwidget) self.line_split_right.setGeometry(QtCore.QRect(599, 69, 2, 180)) - self.line_split_right.setFrameShadow(QtGui.QFrame.Plain) + self.line_split_right.setFrameShadow(QtWidgets.QFrame.Plain) self.line_split_right.setLineWidth(1) - self.line_split_right.setFrameShape(QtGui.QFrame.VLine) + self.line_split_right.setFrameShape(QtWidgets.QFrame.VLine) self.line_split_right.setObjectName(_fromUtf8("line_split_right")) - self.line_split_top = QtGui.QFrame(self.centralwidget) + self.line_split_top = QtWidgets.QFrame(self.centralwidget) self.line_split_top.setGeometry(QtCore.QRect(361, 68, 240, 2)) - self.line_split_top.setFrameShadow(QtGui.QFrame.Plain) + self.line_split_top.setFrameShadow(QtWidgets.QFrame.Plain) self.line_split_top.setLineWidth(1) - self.line_split_top.setFrameShape(QtGui.QFrame.HLine) + self.line_split_top.setFrameShape(QtWidgets.QFrame.HLine) self.line_split_top.setObjectName(_fromUtf8("line_split_top")) - self.line_split_bottom = QtGui.QFrame(self.centralwidget) + self.line_split_bottom = QtWidgets.QFrame(self.centralwidget) self.line_split_bottom.setGeometry(QtCore.QRect(361, 247, 240, 2)) - self.line_split_bottom.setFrameShadow(QtGui.QFrame.Plain) + self.line_split_bottom.setFrameShadow(QtWidgets.QFrame.Plain) self.line_split_bottom.setLineWidth(1) - self.line_split_bottom.setFrameShape(QtGui.QFrame.HLine) + self.line_split_bottom.setFrameShape(QtWidgets.QFrame.HLine) self.line_split_bottom.setObjectName(_fromUtf8("line_split_bottom")) - self.timerglobalhotkeysLabel = QtGui.QLabel(self.centralwidget) + self.timerglobalhotkeysLabel = QtWidgets.QLabel(self.centralwidget) self.timerglobalhotkeysLabel.setGeometry(QtCore.QRect(313, 293, 101, 20)) self.timerglobalhotkeysLabel.setObjectName(_fromUtf8("timerglobalhotkeysLabel")) - self.line_right = QtGui.QFrame(self.centralwidget) + self.line_right = QtWidgets.QFrame(self.centralwidget) self.line_right.setGeometry(QtCore.QRect(489, 296, 2, 163)) - self.line_right.setFrameShadow(QtGui.QFrame.Plain) + self.line_right.setFrameShadow(QtWidgets.QFrame.Plain) self.line_right.setLineWidth(1) - self.line_right.setFrameShape(QtGui.QFrame.VLine) + self.line_right.setFrameShape(QtWidgets.QFrame.VLine) self.line_right.setObjectName(_fromUtf8("line_right")) - self.liveImage = QtGui.QLabel(self.centralwidget) + self.liveImage = QtWidgets.QLabel(self.centralwidget) self.liveImage.setGeometry(QtCore.QRect(111, 69, 240, 180)) self.liveImage.setText(_fromUtf8("")) self.liveImage.setObjectName(_fromUtf8("liveImage")) - self.currentSplitImage = QtGui.QLabel(self.centralwidget) + self.currentSplitImage = QtWidgets.QLabel(self.centralwidget) self.currentSplitImage.setGeometry(QtCore.QRect(361, 69, 240, 180)) self.currentSplitImage.setText(_fromUtf8("")) self.currentSplitImage.setObjectName(_fromUtf8("currentSplitImage")) - self.currentsplitimageLabel = QtGui.QLabel(self.centralwidget) + self.currentsplitimageLabel = QtWidgets.QLabel(self.centralwidget) self.currentsplitimageLabel.setAlignment(QtCore.Qt.AlignCenter) self.currentsplitimageLabel.setGeometry(QtCore.QRect(370, 50, 221, 20)) self.currentsplitimageLabel.setObjectName(_fromUtf8("currentsplitimageLabel")) - self.imageloopLabel = QtGui.QLabel(self.centralwidget) + self.imageloopLabel = QtWidgets.QLabel(self.centralwidget) self.imageloopLabel.setGeometry(QtCore.QRect(362, 251, 108, 20)) self.imageloopLabel.setObjectName(_fromUtf8("Image Loop #:")) - self.widthLabel = QtGui.QLabel(self.centralwidget) + self.widthLabel = QtWidgets.QLabel(self.centralwidget) self.widthLabel.setGeometry(QtCore.QRect(14, 177, 31, 16)) self.widthLabel.setObjectName(_fromUtf8("widthLabel")) - self.heightLabel = QtGui.QLabel(self.centralwidget) + self.heightLabel = QtWidgets.QLabel(self.centralwidget) self.heightLabel.setGeometry(QtCore.QRect(68, 177, 31, 16)) self.heightLabel.setObjectName(_fromUtf8("heightLabel")) - self.fpsvalueLabel = QtGui.QLabel(self.centralwidget) + self.fpsvalueLabel = QtWidgets.QLabel(self.centralwidget) self.fpsvalueLabel.setGeometry(QtCore.QRect(58, 225, 26, 20)) self.fpsvalueLabel.setText(_fromUtf8("")) self.fpsvalueLabel.setObjectName(_fromUtf8("fpsvalueLabel")) - self.widthSpinBox = QtGui.QSpinBox(self.centralwidget) + self.widthSpinBox = QtWidgets.QSpinBox(self.centralwidget) self.widthSpinBox.setGeometry(QtCore.QRect(6, 193, 44, 22)) self.widthSpinBox.setMinimum(1) self.widthSpinBox.setMaximum(10000) self.widthSpinBox.setProperty("value", 640) self.widthSpinBox.setObjectName(_fromUtf8("widthSpinBox")) - self.heightSpinBox = QtGui.QSpinBox(self.centralwidget) + self.heightSpinBox = QtWidgets.QSpinBox(self.centralwidget) self.heightSpinBox.setGeometry(QtCore.QRect(62, 193, 44, 22)) self.heightSpinBox.setMinimum(1) self.heightSpinBox.setMaximum(10000) self.heightSpinBox.setProperty("value", 480) self.heightSpinBox.setObjectName(_fromUtf8("heightSpinBox")) - self.captureregionLabel = QtGui.QLabel(self.centralwidget) + self.captureregionLabel = QtWidgets.QLabel(self.centralwidget) self.captureregionLabel.setGeometry(QtCore.QRect(192, 50, 81, 16)) self.captureregionLabel.setObjectName(_fromUtf8("captureregionLabel")) - self.fpslimitLabel = QtGui.QLabel(self.centralwidget) + self.fpslimitLabel = QtWidgets.QLabel(self.centralwidget) self.fpslimitLabel.setGeometry(QtCore.QRect(8, 251, 51, 16)) self.fpslimitLabel.setObjectName(_fromUtf8("fpslimitLabel")) - self.fpslimitSpinBox = QtGui.QDoubleSpinBox(self.centralwidget) + self.fpslimitSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) self.fpslimitSpinBox.setGeometry(QtCore.QRect(62, 248, 44, 22)) self.fpslimitSpinBox.setPrefix(_fromUtf8("")) self.fpslimitSpinBox.setDecimals(0) @@ -302,59 +302,59 @@ def setupUi(self, MainWindow): self.fpslimitSpinBox.setSingleStep(1.0) self.fpslimitSpinBox.setProperty("value", 60.0) self.fpslimitSpinBox.setObjectName(_fromUtf8("fpslimitSpinBox")) - self.currentsplitimagefileLabel = QtGui.QLabel(self.centralwidget) + self.currentsplitimagefileLabel = QtWidgets.QLabel(self.centralwidget) self.currentsplitimagefileLabel.setGeometry(QtCore.QRect(362, 271, 237, 20)) self.currentsplitimagefileLabel.setText(_fromUtf8("")) self.currentsplitimagefileLabel.setAlignment(QtCore.Qt.AlignCenter) self.currentsplitimagefileLabel.setObjectName(_fromUtf8("currentsplitimagefileLabel")) - self.takescreenshotButton = QtGui.QPushButton(self.centralwidget) + self.takescreenshotButton = QtWidgets.QPushButton(self.centralwidget) self.takescreenshotButton.setGeometry(QtCore.QRect(250, 251, 91, 21)) self.takescreenshotButton.setFocusPolicy(QtCore.Qt.NoFocus) self.takescreenshotButton.setObjectName(_fromUtf8("takescreenshotButton")) - self.xSpinBox = QtGui.QSpinBox(self.centralwidget) + self.xSpinBox = QtWidgets.QSpinBox(self.centralwidget) self.xSpinBox.setGeometry(QtCore.QRect(6, 154, 44, 22)) self.xSpinBox.setReadOnly(False) - self.xSpinBox.setButtonSymbols(QtGui.QAbstractSpinBox.UpDownArrows) + self.xSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.UpDownArrows) self.xSpinBox.setMinimum(0) self.xSpinBox.setMaximum(999999999) self.xSpinBox.setSingleStep(1) self.xSpinBox.setProperty("value", 0) self.xSpinBox.setObjectName(_fromUtf8("xSpinBox")) - self.ySpinBox = QtGui.QSpinBox(self.centralwidget) + self.ySpinBox = QtWidgets.QSpinBox(self.centralwidget) self.ySpinBox.setGeometry(QtCore.QRect(62, 154, 44, 22)) self.ySpinBox.setReadOnly(False) - self.ySpinBox.setButtonSymbols(QtGui.QAbstractSpinBox.UpDownArrows) + self.ySpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.UpDownArrows) self.ySpinBox.setMinimum(0) self.ySpinBox.setMaximum(999999999) self.ySpinBox.setProperty("value", 0) self.ySpinBox.setObjectName(_fromUtf8("ySpinBox")) - self.yLabel = QtGui.QLabel(self.centralwidget) + self.yLabel = QtWidgets.QLabel(self.centralwidget) self.yLabel.setGeometry(QtCore.QRect(81, 139, 7, 16)) self.yLabel.setObjectName(_fromUtf8("yLabel")) - self.comparisonmethodComboBox = QtGui.QComboBox(self.centralwidget) + self.comparisonmethodComboBox = QtWidgets.QComboBox(self.centralwidget) self.comparisonmethodComboBox.setGeometry(QtCore.QRect(143, 299, 81, 22)) self.comparisonmethodComboBox.setObjectName(_fromUtf8("comparisonmethodComboBox")) self.comparisonmethodComboBox.addItem(_fromUtf8("")) self.comparisonmethodComboBox.addItem(_fromUtf8("")) self.comparisonmethodComboBox.addItem(_fromUtf8("")) - self.pauseDoubleSpinBox = QtGui.QDoubleSpinBox(self.centralwidget) + self.pauseDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) self.pauseDoubleSpinBox.setGeometry(QtCore.QRect(160, 425, 64, 22)) self.pauseDoubleSpinBox.setMaximum(999999999.0) self.pauseDoubleSpinBox.setSingleStep(1.0) self.pauseDoubleSpinBox.setProperty("value", 10.0) self.pauseDoubleSpinBox.setObjectName(_fromUtf8("pauseDoubleSpinBox")) - self.comparisonmethodLabel = QtGui.QLabel(self.centralwidget) + self.comparisonmethodLabel = QtWidgets.QLabel(self.centralwidget) self.comparisonmethodLabel.setGeometry(QtCore.QRect(10, 300, 101, 16)) self.comparisonmethodLabel.setObjectName(_fromUtf8("comparisonmethodLabel")) - self.alignregionButton = QtGui.QPushButton(self.centralwidget) + self.alignregionButton = QtWidgets.QPushButton(self.centralwidget) self.alignregionButton.setGeometry(QtCore.QRect(5, 92, 101, 23)) self.alignregionButton.setFocusPolicy(QtCore.Qt.NoFocus) self.alignregionButton.setObjectName(_fromUtf8("alignregionButton")) - self.groupDummySplitsCheckBox = QtGui.QCheckBox(self.centralwidget) + self.groupDummySplitsCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.groupDummySplitsCheckBox.setGeometry(QtCore.QRect(252, 440, 230, 17)) self.groupDummySplitsCheckBox.setChecked(False) self.groupDummySplitsCheckBox.setObjectName(_fromUtf8("groupDummySplitsCheckBox")) - self.selectwindowButton = QtGui.QPushButton(self.centralwidget) + self.selectwindowButton = QtWidgets.QPushButton(self.centralwidget) self.selectwindowButton.setGeometry(QtCore.QRect(5, 117, 101, 23)) self.selectwindowButton.setFocusPolicy(QtCore.Qt.NoFocus) self.selectwindowButton.setObjectName(_fromUtf8("selectwindowButton")) @@ -429,23 +429,23 @@ def setupUi(self, MainWindow): self.groupDummySplitsCheckBox.raise_() self.selectwindowButton.raise_() MainWindow.setCentralWidget(self.centralwidget) - self.menuBar = QtGui.QMenuBar(MainWindow) + self.menuBar = QtWidgets.QMenuBar(MainWindow) self.menuBar.setGeometry(QtCore.QRect(0, 0, 612, 21)) self.menuBar.setObjectName(_fromUtf8("menuBar")) - self.menuFile = QtGui.QMenu(self.menuBar) + self.menuFile = QtWidgets.QMenu(self.menuBar) self.menuFile.setObjectName(_fromUtf8("menuFile")) - self.menuHelp = QtGui.QMenu(self.menuBar) + self.menuHelp = QtWidgets.QMenu(self.menuBar) self.menuHelp.setObjectName(_fromUtf8("menuHelp")) MainWindow.setMenuBar(self.menuBar) - self.actionView_Help = QtGui.QAction(MainWindow) + self.actionView_Help = QtWidgets.QAction(MainWindow) self.actionView_Help.setObjectName(_fromUtf8("actionView_Help")) - self.actionAbout = QtGui.QAction(MainWindow) + self.actionAbout = QtWidgets.QAction(MainWindow) self.actionAbout.setObjectName(_fromUtf8("actionAbout")) - self.actionSave_Settings = QtGui.QAction(MainWindow) + self.actionSave_Settings = QtWidgets.QAction(MainWindow) self.actionSave_Settings.setObjectName(_fromUtf8("actionSave_Settings")) - self.actionSave_Settings_As = QtGui.QAction(MainWindow) + self.actionSave_Settings_As = QtWidgets.QAction(MainWindow) self.actionSave_Settings_As.setObjectName(_fromUtf8("actionSave_Settings_As")) - self.actionLoad_Settings = QtGui.QAction(MainWindow) + self.actionLoad_Settings = QtWidgets.QAction(MainWindow) self.actionLoad_Settings.setObjectName(_fromUtf8("actionLoad_Settings")) self.menuHelp.addAction(self.actionView_Help) self.menuHelp.addAction(self.actionAbout) @@ -533,8 +533,8 @@ def retranslateUi(self, MainWindow): if __name__ == "__main__": import sys - app = QtGui.QApplication(sys.argv) - MainWindow = QtGui.QMainWindow() + app = QtWidgets.QApplication(sys.argv) + MainWindow = QtWidgets.QMainWindow() ui = Ui_MainWindow() ui.setupUi(MainWindow) MainWindow.show() diff --git a/src/error_messages.py b/src/error_messages.py index f2a7fdd2..4eb88bd4 100644 --- a/src/error_messages.py +++ b/src/error_messages.py @@ -1,22 +1,22 @@ # Error messages -from PyQt4 import QtGui +from PyQt5 import QtWidgets def splitImageDirectoryError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("No split image folder is selected.") msgBox.exec_() def splitImageDirectoryNotFoundError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("The Split Image Folder does not exist.") msgBox.exec_() def imageTypeError(self, image): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText( '"' + image + '" is not a valid image file or the full image file path contains a special character.') @@ -24,86 +24,86 @@ def imageTypeError(self, image): def regionError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("No region is selected or the Capture Region window is not open. Select a region or load settings while the Capture Region window is open.") msgBox.exec_() def regionSizeError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Width and height cannot be 0. Please select a larger region.") msgBox.exec_() def splitHotkeyError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("No split hotkey has been set.") msgBox.exec_() def pauseHotkeyError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Your split image folder contains an image filename with a pause flag {p}, but no pause hotkey is set.") msgBox.exec_() def alignRegionImageTypeError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("File not a valid image file") msgBox.exec_() def alignmentNotMatchedError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("No area in capture region matched reference image. Alignment failed.") msgBox.exec_() def multipleResetImagesError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Only one image with the keyword \"reset\" is allowed.") msgBox.exec_() def resetHotkeyError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Your split image folder contains a reset image, but no reset hotkey is set.") msgBox.exec_() def dummySplitsError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText( "Group dummy splits when undoing/skipping cannot be checked if any split image has a loop parameter greater than 1") msgBox.exec_() def oldVersionSettingsFileError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Old version settings file detected. This version allows settings files from v1.3 and above.") msgBox.exec_() def invalidSettingsError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Invalid settings file.") msgBox.exec_() def noSettingsFileOnOpenError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("No settings file found. One can be loaded on open if placed in the same folder as AutoSplit.exe") msgBox.exec_() def tooManySettingsFilesOnOpenError(self): - msgBox = QtGui.QMessageBox() + msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') msgBox.setText("Too many settings files found. Only one can be loaded on open if placed in the same folder as AutoSplit.exe") msgBox.exec_() diff --git a/src/menu_bar.py b/src/menu_bar.py index 598f8435..c65e7d5c 100644 --- a/src/menu_bar.py +++ b/src/menu_bar.py @@ -1,9 +1,9 @@ import os -from PyQt4 import QtGui +from PyQt5 import QtWidgets import about # About Window -class AboutWidget(QtGui.QWidget, about.Ui_aboutAutoSplitWidget): +class AboutWidget(QtWidgets.QWidget, about.Ui_aboutAutoSplitWidget): def __init__(self): super(AboutWidget, self).__init__() self.setupUi(self) diff --git a/src/resources_rc.py b/src/resources_rc.py index 0ded678b..2abb2a55 100644 --- a/src/resources_rc.py +++ b/src/resources_rc.py @@ -2,11 +2,11 @@ # Resource object code # -# Created by: The Resource Compiler for PyQt4 (Qt v4.8.7) +# Created by: The Resource Compiler for PyQt5 (Qt v4.8.7) # # WARNING! All changes made in this file will be lost! -from PyQt4 import QtCore +from PyQt5 import QtCore qt_resource_data = b"\ \x00\x00\x3b\x7f\ diff --git a/src/screen_region.py b/src/screen_region.py index 6de9b2b6..44d24af3 100644 --- a/src/screen_region.py +++ b/src/screen_region.py @@ -1,4 +1,4 @@ -from PyQt4 import QtGui, QtCore, QtTest +from PyQt5 import QtCore, QtGui, QtTest, QtWidgets from win32 import win32gui import capture_windows import ctypes @@ -124,7 +124,7 @@ def alignRegion(self): return # This is the image used for aligning the capture region # to the best fit for the user. - template_filename = str(QtGui.QFileDialog.getOpenFileName(self, "Select Reference Image", "", + template_filename = str(QtWidgets.QFileDialog.getOpenFileName(self, "Select Reference Image", "", "Image Files (*.png *.jpg *.jpeg *.jpe *.jp2 *.bmp *.tiff *.tif *.dib *.webp *.pbm *.pgm *.ppm *.sr *.ras)")) # return if the user presses cancel @@ -200,7 +200,7 @@ def alignRegion(self): # widget to select a window and obtain its bounds -class SelectWindowWidget(QtGui.QWidget): +class SelectWindowWidget(QtWidgets.QWidget): def __init__(self): super(SelectWindowWidget, self).__init__() user32 = ctypes.windll.user32 @@ -231,7 +231,7 @@ def mouseReleaseEvent(self, event): # Widget for dragging screen region # https://github.com/harupy/snipping-tool -class SelectRegionWidget(QtGui.QWidget): +class SelectRegionWidget(QtWidgets.QWidget): def __init__(self): super(SelectRegionWidget, self).__init__() user32 = ctypes.windll.user32 @@ -254,7 +254,7 @@ def __init__(self): self.begin = QtCore.QPoint() self.end = QtCore.QPoint() self.setWindowOpacity(0.5) - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) + QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) self.setWindowFlags(QtCore.Qt.FramelessWindowHint) self.show() @@ -274,7 +274,7 @@ def mouseMoveEvent(self, event): self.update() def mouseReleaseEvent(self, event): - QtGui.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) + QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) self.close() # The coordinates are pulled relative to the top left of the set geometry, diff --git a/src/settings_file.py b/src/settings_file.py index ef8d3006..e43575ab 100644 --- a/src/settings_file.py +++ b/src/settings_file.py @@ -1,9 +1,10 @@ from win32 import win32gui -from PyQt4 import QtGui +from PyQt5 import QtWidgets import keyboard import pickle import glob + def getSaveSettingsValues(self): # get values to be able to save settings self.x = self.xSpinBox.value() @@ -103,7 +104,7 @@ def saveSettings(self): def saveSettingsAs(self): # user picks save destination - self.save_settings_file_path = str(QtGui.QFileDialog.getSaveFileName(self, "Save Settings As", "", "PKL (*.pkl)")) + self.save_settings_file_path = str(QtWidgets.QFileDialog.getSaveFileName(self, "Save Settings As", "", "PKL (*.pkl)")) #if user cancels save destination window, don't save settings if self.save_settings_file_path == '': @@ -163,7 +164,7 @@ def loadSettings(self): self.load_settings_file_path = self.settings_files[0] else: - self.load_settings_file_path = str(QtGui.QFileDialog.getOpenFileName(self, "Load Settings", "", "PKL (*.pkl)")) + self.load_settings_file_path = str(QtWidgets.QFileDialog.getOpenFileName(self, "Load Settings", "", "PKL (*.pkl)")) # if self.load_settings_file_path == '': From 0025d13f2e2e325219877531d42cfc79cc5c6156 Mon Sep 17 00:00:00 2001 From: Avasam Date: Tue, 9 Nov 2021 22:36:56 -0500 Subject: [PATCH 7/8] Migrate to PyQt6 --- .vscode/settings.json | 6 +- README.md | 40 +- res/about.ui | 49 +- res/btn_donateCC_LG.png | Bin 0 -> 2701 bytes res/design.ui | 161 +- example1.5.0.gif => res/example1.5.0.gif | Bin icon.ico => res/icon.ico | Bin .../mask_example_image.PNG | Bin res/resources.qrc | 2 +- scripts/build.bat | 2 +- scripts/compile_resources.bat | 2 - scripts/designer.exe.lnk | Bin 0 -> 2237 bytes src/AutoSplit.py | 123 +- src/about.py | 85 +- src/compare.py | 4 +- src/design.py | 560 +- src/error_messages.py | 126 +- src/icon.ico | Bin 33490 -> 0 bytes src/menu_bar.py | 7 +- src/resources_rc.py | 4819 +++++++---------- src/screen_region.py | 65 +- src/settings_file.py | 23 +- 22 files changed, 2625 insertions(+), 3449 deletions(-) create mode 100644 res/btn_donateCC_LG.png rename example1.5.0.gif => res/example1.5.0.gif (100%) rename icon.ico => res/icon.ico (100%) rename mask_example_image.PNG => res/mask_example_image.PNG (100%) create mode 100644 scripts/designer.exe.lnk delete mode 100644 src/icon.ico diff --git a/.vscode/settings.json b/.vscode/settings.json index 3e2705c9..5cbde4f7 100644 --- a/.vscode/settings.json +++ b/.vscode/settings.json @@ -41,5 +41,9 @@ "trailing-spaces.trimOnSave": true, "trailing-spaces.syntaxIgnore": [ "markdown" - ] + ], + "files.associations": { + "*.qrc": "xml", + "*.ui": "xml" + }, } diff --git a/README.md b/README.md index 97dcf4d6..7c71fcf0 100644 --- a/README.md +++ b/README.md @@ -1,27 +1,32 @@ -# LiveSplit AutoSplit +# LiveSplit AutoSplit -This program compares split images to a capture region of any window (OBS, xsplit, etc.) and automatically hits your split hotkey when there is a match. It can be used in tandem with any speedrun timer that accepts hotkeys (LiveSplit, wsplit, etc.). The purpose of this program is to remove the need to manually press your split hotkey and also increase the accuracy of your splits. +This program compares split images to a capture region of any window (OBS, xsplit, etc.) and automatically hits your split hotkey when there is a match. It can be used in tandem with any speedrun timer that accepts hotkeys (LiveSplit, wsplit, etc.). The purpose of this program is to remove the need to manually press your split hotkey and also increase the accuracy of your splits. -![example](example1.5.0.gif) +![example](res/example1.5.0.gif) # TUTORIAL ## DOWNLOAD AND OPEN ### Compatability + - Windows 7, 10, and 11. ### Building -- Read [requirements.txt](/scripts/requirements.txt) for information on how to run/build the python code + +- Read [requirements.txt](/scripts/requirements.txt) for information on how to install, run and build the python code. ### Opening the program -- Download the [latest version](https://github.com/austinryan/Auto-Split/releases) + +- Download the [latest version](/Toufool/Auto-Split/releases) - Extract the file and open AutoSplit.exe. ### Building + - Read [requirements.txt](/requirements.txt) for information on how to run/build the python code (this is not required for normal use). ## Split Image Folder + - Supported image file types: .png, .jpg, .jpeg, .bmp, and [more](https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html#imread). - Images can be any size. - Images are matched in alphanumerical order. @@ -30,6 +35,7 @@ This program compares split images to a capture region of any window (OBS, xspli - Images can be created using Print Screen, [Snipping Tool](https://support.microsoft.com/en-us/help/4027213/windows-10-open-snipping-tool-and-take-a-screenshot), or AutoSplit's Take Screenshot button. ## Capture Region + - This is the region that your split images are compared to. Usually, this is going to be the full game screen. - Click "Select Region" - Click and drag to form a rectangle over the region you want to capture. @@ -40,11 +46,13 @@ This program compares split images to a capture region of any window (OBS, xspli - You can save a screenshot of the capture region to your split image folder using the Take Screenshot button. ## Max FPS + - Calculates the maximum comparison rate of the capture region to split images. This value will likely be much higher than needed, so it is highly recommended to limit your FPS depending on the frame rate of the game you are capturing. ## OPTIONS ### Comparison Method + - There are three comparison methods to choose from: L2 Norm, Histograms, and pHash. - L2 Norm: This method finds the difference between each pixel, squares it, and sums it over the entire image and takes the square root. This is very fast but is a problem if your image is high frequency. Any translational movement or rotation can cause similarity to be very different. - Histograms: An explanation on Histograms comparison can be found [here](https://mpatacchiola.github.io/blog/2016/11/12/the-simplest-classifier-histogram-intersection.html). This is a great method to use if you are using several masked images. @@ -52,21 +60,27 @@ This program compares split images to a capture region of any window (OBS, xspli - Note: v1.0 used L2 Norm. ### Show Live Similarity + - Displays the live similarity between the capture region and the current split image. This number is between 0 and 1, with 1 being a perfect match. ### Show Highest Similarity + - Shows the highest similarity between the capture region and current split image. ### Similarity Threshold + - When the live similarity goes above this value, the program hits your split hotkey and moves to the next split image. ### Pause Time + - Time in seconds that the program stops comparison after a split. Useful for if you have two of the same split images in a row and want to avoid double-splitting. Also useful for reducing CPU usage. ### Delay Time + - Time in milliseconds that the program waits before hitting the split hotkey for that specific split. ### Custom Split Image Settings + - Each split image can have different thresholds, pause times, delay split times, loop amounts, and can be flagged. - These settings are handled in the image's filename. - Custom thresholds are place between parenthesis `()` in the filename and the custom thresholds checkbox must be checked. All images must have a custom threshold if the box is checked. @@ -86,20 +100,24 @@ This program compares split images to a capture region of any window (OBS, xspli - `004_SplitName(0.9)_[10]_#3500#_@3@_{b}.png` is the fourth split image with a threshold of 0.9, pause time of 10 seconds, delay split time of 3.5 seconds, will loop 3 times, and will split when similarity is below the threshold rather than above. ### How to Create a Masked Image + The best way to create a masked image is to set your capture region as the entire game screen, take a screenshot, and use a program like [paint.net](https://www.getpaint.net/) to "erase" (make transparent) everything you don't want the program to compare. More on how to creating images with transparency using paint.net can be found in [this tutorial](https://www.youtube.com/watch?v=v53kkUYFVn8). The last thing you need to do is add {m} to the filename. For visualization, here is what the capture region compared to a masked split image looks like if you would want to split on "Shine Get!" text in Super Mario Sunshine: -![mask_example](mask_example_image.PNG) +![mask_example](res/mask_example_image.PNG) ### Reset image + You can have one (and only one) image with the keyword `reset` in its name. AutoSplit will press the reset button when it finds this image. This image will only be used for resets and it will not be tied to any split. You can set a probability and pause time for it. A custom threshold MUST be applied to this image. The pause time is the amount of seconds AutoSplit will wait before checking for the reset image once the run starts. Also the image can be masked, for example: `Reset_(0.95)_[10]_{m}.png`. ### Timer Global Hotkeys + - Click "Set Hotkey" on each hotkey to set the hotkeys to AutoSplit. The Start / Split hotkey and Pause hotkey must be the same as the one used in your preferred timer program in order for the splitting/pausing to work properly. - Make sure that Global Hotkeys are enabled in your speedrun timer. - All of these actions can also be handled by their corresponding buttons. - Note that pressing your Pause Hotkey does not serve any function in AutoSplit itself and is strictly used for the Pause flag. ### Group dummy splits when undoing / skipping + If this option is disabled, AutoSplit will not account for dummy splits when undoing/skipping. Meaning it will cycle through ths splits normally even if they are dummy splits (this was the normal behavior in versions 1.2.0 and older). If it is enabled, AutoSplit will group dummy splits together with a real split when undoing/skipping. This basically allows you to tie one or more dummy splits to a real split to keep it in sync with LiveSplit/wsplit. @@ -117,11 +135,13 @@ In this situation you would have only 3 splits in LiveSplit/wsplit (even though Please note this option cannot currently be used if you have any loop parameter `@@` greater than 1 in any image. ### Loop Split Images + If this option is enabled, when the last split meets the threshold and splits, AutoSplit will loop back to the first split image and continue comparisons. If this option is disabled, when the last split meets the threshold and splits, AutoSplit will stop running comparisons. This option does not loop single, specific images. See the Custom Split Image Settings section above for this feature. ### Auto Start On Reset + If this option is enabled, when the reset hotkey is hit, the reset button is pressed, or the reset split image meets its threshold, AutoSplit will reset and automatically start again back at the first split image. If this option is disabled, when the reset hotkey is hit, the reset button is pressed, or the reset split image meets its threshold, AutoSplit will stop running comparisons. @@ -133,27 +153,31 @@ If this option is disabled, when the reset hotkey is hit, the reset button is pr - If you are upgrading to Windows 11, it's possible that save files may not transfer perfectly. You may need to readjust or reselect your Capture Region, for example. ## Known Limitations + - For many games, it will be difficult to find a split image for the last split of the run. - The window of the capture region cannot be minimized. ## Known Issues + - Using numpad number keys when numlock is on does not split correctly. Either avoid using numpad or turn numlock off to avoid this issue. - LiveSplit and wsplit will not split correctly if you are holding shift, ctrl, or alt when a match occurs. - Numlock on keys are linked to numlock-off keys. For example, if you set your reset hotkey to 2, you can hit arrow down and it will reset and vice versa. ## Resources + - Still need help? [Open an issue](https://github.com/Toufool/Auto-Split/issues) - Join the [AutoSplit Discord](https://discord.gg/Qcbxv9y) - ## Credits -- https://github.com/harupy/ for the snipping tool code that I used to integrate into the autosplitter. + +- for the snipping tool code that I used to integrate into the autosplitter. - [amaringos](https://twitter.com/amaringos) for the icon. - [ZanasoBayncuh](https://twitter.com/ZanasoBayncuh) for motivating me to start this project back up and for all of the time spent testing and suggesting improvements. - [Avasam](https://twitter.com/Avasam06) for their continued work on making an incredible amount of improvements and changes to AutoSplit while I have not had the time/motivation to do so. - Created by [Toufool](https://twitter.com/Toufool) and [Faschz](https://twitter.com/faschz). ## Donate + If you enjoy using the program, please consider donating. Thank you! [![paypal](https://www.paypalobjects.com/en_US/i/btn/btn_donateCC_LG.gif)](https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=BYRHQG69YRHBA&item_name=AutoSplit+development¤cy_code=USD&source=url) diff --git a/res/about.ui b/res/about.ui index d247f2c3..f5efddb9 100644 --- a/res/about.ui +++ b/res/about.ui @@ -6,20 +6,20 @@ 0 0 - 276 - 249 + 264 + 250 - 276 - 249 + 264 + 250 - 276 - 249 + 264 + 250 @@ -32,10 +32,10 @@ - 190 + 180 220 - 71 - 21 + 75 + 24 @@ -47,12 +47,12 @@ 10 44 - 151 - 16 + 161 + 32 - <html><head/><body><p>Created by <a href="https://twitter.com/toufool"><span style=" text-decoration: underline; color:#0000ff;">Toufool</span></a> and <a href="https://twitter.com/faschz"><span style=" text-decoration: underline; color:#0000ff;">Faschz</span></a></p></body></html> + <html><head/><body><p>Created by <a href="https://twitter.com/toufool"><span style=" text-decoration: underline; color:#0000ff;">Toufool</span></a> and <a href="https://twitter.com/faschz"><span style=" text-decoration: underline; color:#0000ff;">Faschz</span></a><br/>Maintained by <a href="https://twitter.com/Avasam06"><span style=" text-decoration: underline; color:#0000ff;">Avasam</span></a></p></body></html> @@ -60,39 +60,42 @@ 10 21 - 71 + 161 16 - Version: 1.2.0 + Version:
- 46 + 30 95 - 191 - 41 + 204 + 32 If you enjoy using this program, please - consider donating. Thank you! +consider donating. Thank you! + + + Qt::AlignCenter - 52 - 127 - 171 - 91 + 60 + 150 + 147 + 47 - <html><head/><body><p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&business=BYRHQG69YRHBA&item_name=AutoSplit+development&currency_code=USD&source=url"><img src=":/resources/donatebutton.png"/></p></body></html> + <html><head/><body><p><a href="https://www.paypal.com/cgi-bin/webscr?cmd=_donations&amp;business=BYRHQG69YRHBA&amp;item_name=AutoSplit+development&amp;currency_code=USD&amp;source=url"><img src=":/resources/btn_donateCC_LG.png"/></a></p></body></html> Qt::AlignCenter diff --git a/res/btn_donateCC_LG.png b/res/btn_donateCC_LG.png new file mode 100644 index 0000000000000000000000000000000000000000..3abf57adcc5e4e742612e8604ccde1732c5cf7bf GIT binary patch literal 2701 zcmV;83Uc*{P)vs|I%pt$W8XZK=i>#Swj;5000F91TQ2CYf%>KwKVg( zHxLL0925oCq%U||8;58f`oA~juroz543%;r%bYE>izwQsFr$4W;jA)aOBST2sl2

@tVkDtp)B9_p$^a`~e*BED-jd8~?K(drl6MIcg}3*Z{Nl0jTK!q26h)>2ka8 ze!=lsd_rk8O?)SCeKmW9;O6V_ z^7ixf`SSGj`~3Xt0UQ2d0sD9e|Ee90VyRby&I6m*23lyC#OvpQ-pvCQR zpWt7T+gOd-*xTKZn4H7N%D20{)YsUUqNmZz#{SEn{k?|Mz_7l<#e|QQ^6~NWt+?h4 zE@=}x03}yWiIXcfc*M!rn4P|(r^QQDi|6R@0~K2Ofetx^#{iPck;d?fx9NqfuhiMnx_5E#Q zOnm@jvw!l#Ub~)c&-?ZLexKhDg1C$DjEqS>pX8I;@HMabI`8A>IK6((*ob#GXSSTZz8^KQ*>t8EVo{5nmJl!!e;hE}9;u%te!_yPR zGc{vi;!90CW}5zRs(Jx!{_=vY$B~GG=${a(5%RoBn32W zNwc6}ENDt-$tNvXB%}c?FcS(naeQW=CPD8el14+J8i+=eEoqGqOCvzqBATXxIyjh{bItgG zO$5`M$;u4Te0xMO*~6?DZl6s=xOA>saec0+c;tKoy^{ zx6_*hv9l8}Rt9kKtr&rwK|~ssVPY`Q{oK#}{2$^t{LVb&1P30bIO0qYBQ#H07T>$L zs9(9lH{9GuJ^~pz(%r+u)6>h_dlb&21Tost=gv4e_G%g~zB6NdunGQ8LaeW^?^r+4 zxN+w2uMh;A@FVi`_4oJn3m89Pe1HpnjZG6ZCUzYoeE5n}BoVbBIy!pcB1p_)oY;rJ6c-yW7DvV>OowN2;>5T_ zt%>rVDUnE?SdtVJ6qFn!>M^MgL@#}ASx9I|$a0M-C3VG$m1(O|Q&zd9r=?_MWM)d! zvPP*)iSweO#w3X6C5TsNi?gRkCd8>tQxk|aIXRLUxj4&J$-{NZU;F&Jbp?g%H*72@ zDijwMZ_=9B&G^(?mMqzdQ7`nE#!B#k7q@Mj6&e~E@{)_%^zy{i)MwIC-BzsHE-R6x zNlVMJGRjq^9Xobb>~gHwz2}v^`(Dl44-KjuJwj!AjW`e;eelrhkmd5lK#GZU#=R?4 zR8=dg6*Wplbye-6!)v4NFdezoMETU@I(95&W$FsI)RL6ClJxql z@bXM)gt~Y8D=Xi8cxS^~Zzm-kZ>TJ;tZb~9SD`Y!v*6tmCl;POx#*-k_7t>Eo~<(F zE7vR6pH}1*C~CyjN@a0&e&y$b=;$CTO>=IP<_Y)Z-Y^me!QjQaZ0c4=vQ zY34=TyUEk?^7aSrcznvG%d2;c&ac>A_2`vPu<6s!qAy(iytt^NqoXrM-g-*jrZ$PI zzbHy9Qq~kfjT8mNiYo1l!`wi&Yz#ozf>l3RwaA?A^WuY$xbgxg% zo}Qk~GMOw>b}bVM6;Yp2USB4?$gviDxA(@)<0{klCvtLf4&~;y#Adg}CdSF-2^v$c z>l1Wo>{vfaDEdLfBHi@~AMo=-E&;g#O-O6<^70C=tCN*pD-CbQy{nhDx0l7=Zd!e5 z-;J|3HKrf0g6XH++~SU(<(;jaF`ZHUnVPz~x*EIAcQrP`L!+*#$<_6|t7{kBe$krB zywvfAUFBD8Ze25fyL9*{n0c9y>P78Yah4V!+^HL;CAas{%EsoWa} z?{SlK(zCaK=MMlS-NZ>!nRZ>daP{ive-;%fi{y~Sozr1$?{^Po@r{KIm%VKd#&6>E z?7{8fI1zYL(Mg 0 0 - 619 + 640 490 @@ -18,13 +18,13 @@ - 619 + 640 490 - 619 + 640 490 @@ -45,9 +45,9 @@ - 90 + 80 13 - 91 + 98 16 @@ -61,7 +61,7 @@ 187 11 247 - 20 + 22 @@ -103,10 +103,10 @@ - 125 + 120 253 - 121 - 17 + 129 + 20 @@ -139,9 +139,9 @@ 10 - 378 - 91 - 21 + 380 + 102 + 32 @@ -153,7 +153,7 @@ Default value 160 - 383 + 390 64 22 @@ -171,7 +171,7 @@ Default value - 505 + 510 425 101 31 @@ -187,7 +187,7 @@ Default value - 505 + 510 385 101 31 @@ -205,8 +205,8 @@ Default value 477 250 - 61 - 21 + 75 + 24 @@ -219,10 +219,10 @@ Default value - 541 + 560 250 - 61 - 21 + 75 + 24 @@ -237,8 +237,8 @@ Default value 10 420 - 111 - 21 + 112 + 32 @@ -251,7 +251,7 @@ Default value 5 225 - 51 + 53 21 @@ -283,8 +283,8 @@ Default value 10 330 - 111 - 17 + 124 + 20 @@ -305,8 +305,8 @@ Default value 10 351 - 131 - 17 + 145 + 20 @@ -325,7 +325,7 @@ Default value 160 332 46 - 13 + 16 @@ -338,7 +338,7 @@ Default value 160 353 46 - 13 + 16 @@ -348,9 +348,9 @@ Default value - 249 + 240 317 - 61 + 58 16 @@ -361,9 +361,9 @@ Default value - 249 + 240 341 - 61 + 28 16 @@ -374,9 +374,9 @@ Default value - 250 + 240 367 - 50 + 48 16 @@ -387,9 +387,9 @@ Default value - 249 + 240 393 - 61 + 55 16 @@ -400,7 +400,7 @@ Default value - 316 + 310 314 81 20 @@ -413,7 +413,7 @@ Default value - 316 + 310 391 81 20 @@ -429,7 +429,7 @@ Default value - 316 + 310 365 81 20 @@ -442,7 +442,7 @@ Default value - 316 + 310 339 81 20 @@ -455,7 +455,7 @@ Default value - 410 + 400 314 71 21 @@ -471,7 +471,7 @@ Default value - 410 + 400 339 71 21 @@ -487,7 +487,7 @@ Default value - 410 + 400 365 71 21 @@ -503,7 +503,7 @@ Default value - 410 + 400 391 71 21 @@ -576,7 +576,7 @@ Default value - 234 + 230 296 2 163 @@ -690,10 +690,10 @@ Default value - 313 + 310 293 - 101 - 20 + 113 + 16 @@ -703,7 +703,7 @@ Default value - 489 + 500 296 2 163 @@ -910,8 +910,8 @@ Default value 250 251 - 91 - 21 + 92 + 24 @@ -990,9 +990,9 @@ Default value - 143 + 133 299 - 81 + 91 22 @@ -1016,7 +1016,7 @@ Default value 160 - 425 + 430 64 22 @@ -1035,8 +1035,8 @@ Default value 10 - 300 - 101 + 303 + 110 16 @@ -1063,10 +1063,10 @@ Default value - 252 + 240 443 - 240 - 17 + 261 + 20 @@ -1092,11 +1092,11 @@ Default value Select Window - + 362 - 251 + 252 108 20 @@ -1108,9 +1108,9 @@ Default value - 250 + 240 418 - 61 + 31 16 @@ -1121,7 +1121,7 @@ Default value - 316 + 310 416 82 20 @@ -1137,7 +1137,7 @@ Default value - 410 + 400 416 71 21 @@ -1156,10 +1156,10 @@ Default value - 500 + 510 314 - 121 - 17 + 117 + 20 @@ -1172,16 +1172,13 @@ Default value false - - - true - + - 500 + 510 344 - 121 - 17 + 126 + 20 @@ -1258,20 +1255,20 @@ Default value alignregionButton groupDummySplitsCheckBox selectwindowButton - currentsplitimageLabel_2 + imageloopLabel pausehotkeyLabel pausehotkeyLineEdit setpausehotkeyButton loopCheckBox - loopCheckBox_2 + autostartonresetCheckBox 0 0 - 619 - 21 + 640 + 22 @@ -1347,6 +1344,8 @@ Default value undosplitLineEdit groupDummySplitsCheckBox - + + + diff --git a/example1.5.0.gif b/res/example1.5.0.gif similarity index 100% rename from example1.5.0.gif rename to res/example1.5.0.gif diff --git a/icon.ico b/res/icon.ico similarity index 100% rename from icon.ico rename to res/icon.ico diff --git a/mask_example_image.PNG b/res/mask_example_image.PNG similarity index 100% rename from mask_example_image.PNG rename to res/mask_example_image.PNG diff --git a/res/resources.qrc b/res/resources.qrc index bd6e4665..69844bab 100644 --- a/res/resources.qrc +++ b/res/resources.qrc @@ -1,6 +1,6 @@ - donatebutton.png + btn_donateCC_LG.png icon.ico diff --git a/scripts/build.bat b/scripts/build.bat index 4c727460..7cf3fb64 100644 --- a/scripts/build.bat +++ b/scripts/build.bat @@ -1 +1 @@ -pyinstaller -w -F --icon=src/icon.ico "%~p0/../src/AutoSplit.py" +pyinstaller -w -F --icon=res/icon.ico "%~p0/../src/AutoSplit.py" diff --git a/scripts/compile_resources.bat b/scripts/compile_resources.bat index 5c6670bc..3d08a734 100644 --- a/scripts/compile_resources.bat +++ b/scripts/compile_resources.bat @@ -1,6 +1,4 @@ cd "%~dp0.." pyuic6 "./res/about.ui" -o "./src/about.py" pyuic6 "./res/design.ui" -o "./src/design.py" -:: Doesn't work with current setup. Files might have to be moved around. -:: The Donate button file is also missing pyside6-rcc "./res/resources.qrc" -o "./src/resources_rc.py" diff --git a/scripts/designer.exe.lnk b/scripts/designer.exe.lnk new file mode 100644 index 0000000000000000000000000000000000000000..7cc38a7d6eeea025c8e76279c511110e523bda1d GIT binary patch literal 2237 zcmd5-ZA_b06n@G+0;sdBQ@c&2E{@DdYdZ=S2nkqM3TdS9PF>6!St(unveK5eTbPOC zhcWX5jmZ>D#*{D|Zc!tcNz8Pc`=NgpgCl;;{aB3q13I$ACH^p(&w2Y{VI%uF@0)Y( zx#!$_&U4Q__r5*=hIK{cz!{yxa|p$-P;TDqnf?8Sch`|rM4N%T%Bed`?(m8+U;PgNQv zSc!#G2iksZsaMP&+Bj>#Sw?QkFK*SPk@eT%M-p*_$ph#mY!5U<5kiVH8p$J+qx`C{ z6*hG1awV)BIq*1KItDYI%VJrhTsUroe_uKhk5$zIPh_#IR^Fb>VKF=;!7pcWrsEJ+ znsgG&KBA8hPmJ-n9A>oUJtwD(@M&F)nc3fJWr#j~M`eGr#gfc(q{4RT*}vf9e!8e! zOYE6^)hi}qR9d!gv-%}pzP!I-`ZFCDe`imMzq<>aQGQd~WJu9pnmMr|!Hfm5n>?J& zml-|z7}t&&(Z0Q=vq_K9k&RKWTstNtF-qQFLEgP2hI8Xu^f5vWI_WvVFUp8P%4znJ z895m|79ZG58SSV==^@qSHH)6Z^gZLaE6}CMSN0<|-KaF{fQA)DzLg*&} z_mgCW^m0PdTS?OPlcdVUtL474bNa4%b^OVAI2q`*c(iCJrRHi=WhtpCEgiBZ0>RyZ zFim~wn$AEX5!Hf$v=)!0)b_N>gs6+R@(khFpf2LeUn2E}qE@pdsp?z2c`2#4ECE$N zKsB3wb=j1;;YJ+va_#+lNuLwPTH#})sj1DleuEA zrd&&^qRmOIgR-4G(aE|(+kZTj2~Pr+Bx{%{6}&fOJ$0HxQn#>Z3gb4U4K;? zDd6Co{=XFEoiY|7_p_9}=l3Sorkg&FnMG@8=idv+{c>geJxKr`?Fnvac;|fCi63#M z?HBXR3F;q|2?DsC^#8aq%in3iDouWnvZ2X)d!PLHjf8i?+h`ka=pTH5`iM;Mk`7IK VMwEEnwpXr{Ug 1 for x in self.split_image_loop_amount) and self.groupDummySplitsCheckBox.isChecked() == True: - self.dummySplitsError() + error_messages.dummySplitsError() return self.guiChangesOnStart() @@ -574,7 +573,7 @@ def autoSplitter(self): self.undosplitButton.setEnabled(False) self.skipsplitButton.setEnabled(False) self.currentsplitimagefileLabel.setText(' ') - self.currentSplitImage.setAlignment(QtCore.Qt.AlignCenter) + self.currentSplitImage.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) # check for reset while delayed and display a counter of the remaining split delay time delay_start_time = time.time() @@ -636,7 +635,7 @@ def autoSplitter(self): if self.number_of_split_images != self.split_image_number: # set current split image to none self.currentsplitimagefileLabel.setText(' ') - self.currentSplitImage.setAlignment(QtCore.Qt.AlignCenter) + self.currentSplitImage.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.imageloopLabel.setText('Image Loop #: -') # if its the last split image and last loop number, disable the skip split button @@ -802,7 +801,7 @@ def updateSplitImage(self): # get flags self.flags = split_parser.flags_from_filename(split_image_file) - self.imageHasTransparency = self.checkIfImageHasTransparency() + self.imageHasTransparency = compare.checkIfImageHasTransparency(self.split_image_path) # set current split image in UI # if flagged as mask, transform transparency into UI's gray BG color @@ -820,7 +819,7 @@ def updateSplitImage(self): qImg = QtGui.QImage(self.split_image_display, self.split_image_display.shape[1], self.split_image_display.shape[0], self.split_image_display.shape[1] * 3, - QtGui.QImage.Format_RGB888) + QtGui.QImage.Format.Format_RGB888) self.updateCurrentSplitImage.emit(qImg) self.currentsplitimagefileLabel.setText(split_image_file) @@ -865,35 +864,27 @@ def updateSplitImage(self): # exit safely when closing the window def closeEvent(self, event): if self.haveSettingsChanged(): - #give a different warning if there was never a settings file that was loaded successfully, and save as instead of save. - if self.last_successfully_loaded_settings_file_path == None: - msgBox = QtWidgets.QMessageBox - warning = msgBox.warning(self, "AutoSplit","Do you want to save changes made to settings file Untitled?", msgBox.Yes | msgBox.No | msgBox.Cancel) - if warning == msgBox.Yes: - self.saveSettingsAs() - sys.exit() - event.accept() - if warning == msgBox.No: - event.accept() - sys.exit() - pass - if warning == msgBox.Cancel: - event.ignore() - return - else: - msgBox = QtWidgets.QMessageBox - warning = msgBox.warning(self, "AutoSplit", "Do you want to save the changes made to the settings file " + os.path.basename(self.last_successfully_loaded_settings_file_path) + " ?", msgBox.Yes | msgBox.No | msgBox.Cancel) - if warning == msgBox.Yes: - self.saveSettings() - sys.exit() - event.accept() - if warning == msgBox.No: - event.accept() - sys.exit() - pass - if warning == msgBox.Cancel: - event.ignore() - return + # give a different warning if there was never a settings file that was loaded successfully, and save as instead of save. + msgBox = QtWidgets.QMessageBox + settings_file_name = "Untitled" \ + if self.last_successfully_loaded_settings_file_path is None \ + else os.path.basename(self.last_successfully_loaded_settings_file_path) + warning_message = f"Do you want to save changes made to settings file {settings_file_name}?" + + warning = msgBox.warning( + self, + "AutoSplit", + warning_message, + msgBox.StandardButton.Yes | msgBox.StandardButton.No | msgBox.StandardButton.Cancel) + + if warning == msgBox.StandardButton.Yes: + # TODO: Don't close if user cancelled the save + self.saveSettingsAs() + exit() + if warning == msgBox.StandardButton.No: + exit() + if warning == msgBox.StandardButton.Cancel: + event.ignore() else: event.accept() sys.exit() @@ -905,7 +896,7 @@ def main(): w = AutoSplit() w.setWindowIcon(QtGui.QIcon('icon.ico')) w.show() - sys.exit(app.exec_()) + sys.exit(app.exec()) if __name__ == '__main__': diff --git a/src/about.py b/src/about.py index a34864b2..10bf4648 100644 --- a/src/about.py +++ b/src/about.py @@ -1,78 +1,55 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'about.ui' +# Form implementation generated from reading ui file './res/about.ui' # -# Created by: PyQt5 UI code generator 4.11.4 +# Created by: PyQt6 UI code generator 6.1.0 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. -from PyQt5 import QtCore, QtGui, QtWidgets -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s +from PyQt6 import QtCore, QtGui, QtWidgets -try: - _encoding = QtWidgets.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtWidgets.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtWidgets.QApplication.translate(context, text, disambig) class Ui_aboutAutoSplitWidget(object): def setupUi(self, aboutAutoSplitWidget): - aboutAutoSplitWidget.setObjectName(_fromUtf8("aboutAutoSplitWidget")) - aboutAutoSplitWidget.resize(276, 249) - aboutAutoSplitWidget.setMinimumSize(QtCore.QSize(276, 249)) - aboutAutoSplitWidget.setMaximumSize(QtCore.QSize(276, 249)) + aboutAutoSplitWidget.setObjectName("aboutAutoSplitWidget") + aboutAutoSplitWidget.resize(264, 250) + aboutAutoSplitWidget.setMinimumSize(QtCore.QSize(264, 250)) + aboutAutoSplitWidget.setMaximumSize(QtCore.QSize(264, 250)) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(_fromUtf8(":/resources/icon.ico")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap(":/resources/icon.ico"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) aboutAutoSplitWidget.setWindowIcon(icon) self.okButton = QtWidgets.QPushButton(aboutAutoSplitWidget) - self.okButton.setGeometry(QtCore.QRect(190, 220, 71, 21)) - self.okButton.setObjectName(_fromUtf8("okButton")) + self.okButton.setGeometry(QtCore.QRect(180, 220, 75, 24)) + self.okButton.setObjectName("okButton") self.createdbyLabel = QtWidgets.QLabel(aboutAutoSplitWidget) - self.createdbyLabel.setGeometry(QtCore.QRect(10, 44, 151, 16)) - self.createdbyLabel.setObjectName(_fromUtf8("createdbyLabel")) + self.createdbyLabel.setGeometry(QtCore.QRect(10, 44, 161, 32)) + self.createdbyLabel.setObjectName("createdbyLabel") self.versionLabel = QtWidgets.QLabel(aboutAutoSplitWidget) - self.versionLabel.setGeometry(QtCore.QRect(10, 21, 71, 16)) - self.versionLabel.setObjectName(_fromUtf8("versionLabel")) + self.versionLabel.setGeometry(QtCore.QRect(10, 21, 161, 16)) + self.versionLabel.setObjectName("versionLabel") self.donatetextLabel = QtWidgets.QLabel(aboutAutoSplitWidget) - self.donatetextLabel.setGeometry(QtCore.QRect(46, 95, 191, 41)) - self.donatetextLabel.setObjectName(_fromUtf8("donatetextLabel")) + self.donatetextLabel.setGeometry(QtCore.QRect(30, 95, 204, 32)) + self.donatetextLabel.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.donatetextLabel.setObjectName("donatetextLabel") self.donatebuttonLabel = QtWidgets.QLabel(aboutAutoSplitWidget) - self.donatebuttonLabel.setGeometry(QtCore.QRect(52, 127, 171, 91)) - self.donatebuttonLabel.setAlignment(QtCore.Qt.AlignCenter) - self.donatebuttonLabel.setObjectName(_fromUtf8("donatebuttonLabel")) + self.donatebuttonLabel.setGeometry(QtCore.QRect(60, 150, 147, 47)) + self.donatebuttonLabel.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.donatebuttonLabel.setObjectName("donatebuttonLabel") self.iconLabel = QtWidgets.QLabel(aboutAutoSplitWidget) self.iconLabel.setGeometry(QtCore.QRect(190, 17, 62, 71)) - self.iconLabel.setObjectName(_fromUtf8("iconLabel")) + self.iconLabel.setObjectName("iconLabel") self.retranslateUi(aboutAutoSplitWidget) self.okButton.clicked.connect(aboutAutoSplitWidget.close) QtCore.QMetaObject.connectSlotsByName(aboutAutoSplitWidget) def retranslateUi(self, aboutAutoSplitWidget): - aboutAutoSplitWidget.setWindowTitle(_translate("aboutAutoSplitWidget", "About AutoSplit", None)) - self.okButton.setText(_translate("aboutAutoSplitWidget", "OK", None)) - self.createdbyLabel.setText(_translate("aboutAutoSplitWidget", "

Created by Toufool and Faschz

", None)) - self.versionLabel.setText(_translate("aboutAutoSplitWidget", "Version: 1.5.1", None)) + _translate = QtCore.QCoreApplication.translate + aboutAutoSplitWidget.setWindowTitle(_translate("aboutAutoSplitWidget", "About AutoSplit")) + self.okButton.setText(_translate("aboutAutoSplitWidget", "OK")) + self.createdbyLabel.setText(_translate("aboutAutoSplitWidget", "

Created by Toufool and Faschz
Maintained by Avasam

")) + self.versionLabel.setText(_translate("aboutAutoSplitWidget", "Version:")) self.donatetextLabel.setText(_translate("aboutAutoSplitWidget", "If you enjoy using this program, please\n" -" consider donating. Thank you!", None)) - self.donatebuttonLabel.setText(_translate("aboutAutoSplitWidget", "

", None)) - self.iconLabel.setText(_translate("aboutAutoSplitWidget", "

", None)) - -import resources_rc - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - aboutAutoSplitWidget = QtWidgets.QWidget() - ui = Ui_aboutAutoSplitWidget() - ui.setupUi(aboutAutoSplitWidget) - aboutAutoSplitWidget.show() - sys.exit(app.exec_()) - +"consider donating. Thank you!")) + self.donatebuttonLabel.setText(_translate("aboutAutoSplitWidget", "

")) + self.iconLabel.setText(_translate("aboutAutoSplitWidget", "

")) diff --git a/src/compare.py b/src/compare.py index f2a02f52..153dd05e 100644 --- a/src/compare.py +++ b/src/compare.py @@ -158,7 +158,7 @@ def compare_phash_masked(source, capture, mask): return 1 - ((source_hash - capture_hash)/64.0) -def checkIfImageHasTransparency(self): - source = cv2.imread(self.split_image_path, cv2.IMREAD_UNCHANGED) +def checkIfImageHasTransparency(image_path: str): + source = cv2.imread(image_path, cv2.IMREAD_UNCHANGED) # Check if there's a transparency channel (4th channel) and if at least one pixel is transparent (< 255) return source.shape[2] == 4 and np.mean(source[:, :, 3]) != 255 diff --git a/src/design.py b/src/design.py index 353c5dfc..1d3df34b 100644 --- a/src/design.py +++ b/src/design.py @@ -1,370 +1,354 @@ -# -*- coding: utf-8 -*- - -# Form implementation generated from reading ui file 'design.ui' +# Form implementation generated from reading ui file './res/design.ui' # -# Created by: PyQt5 UI code generator 4.11.4 +# Created by: PyQt6 UI code generator 6.1.0 # -# WARNING! All changes made in this file will be lost! +# WARNING: Any manual changes made to this file will be lost when pyuic6 is +# run again. Do not edit this file unless you know what you are doing. -from PyQt5 import QtCore, QtGui, QtWidgets -try: - _fromUtf8 = QtCore.QString.fromUtf8 -except AttributeError: - def _fromUtf8(s): - return s +from PyQt6 import QtCore, QtGui, QtWidgets -try: - _encoding = QtWidgets.QApplication.UnicodeUTF8 - def _translate(context, text, disambig): - return QtWidgets.QApplication.translate(context, text, disambig, _encoding) -except AttributeError: - def _translate(context, text, disambig): - return QtWidgets.QApplication.translate(context, text, disambig) class Ui_MainWindow(object): def setupUi(self, MainWindow): - MainWindow.setObjectName(_fromUtf8("MainWindow")) - MainWindow.resize(612, 490) - sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Fixed, QtWidgets.QSizePolicy.Fixed) + MainWindow.setObjectName("MainWindow") + MainWindow.resize(640, 490) + sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) - MainWindow.setMinimumSize(QtCore.QSize(622, 490)) - MainWindow.setMaximumSize(QtCore.QSize(622, 490)) + MainWindow.setMinimumSize(QtCore.QSize(640, 490)) + MainWindow.setMaximumSize(QtCore.QSize(640, 490)) icon = QtGui.QIcon() - icon.addPixmap(QtGui.QPixmap(_fromUtf8("../../VideoAutoSplitter/icon.ico")), QtGui.QIcon.Normal, QtGui.QIcon.Off) + icon.addPixmap(QtGui.QPixmap("./res\\../../../../VideoAutoSplitter/icon.ico"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) MainWindow.setWindowIcon(icon) - MainWindow.setWhatsThis(_fromUtf8("")) - MainWindow.setLayoutDirection(QtCore.Qt.LeftToRight) + MainWindow.setWhatsThis("") + MainWindow.setLayoutDirection(QtCore.Qt.LayoutDirection.LeftToRight) self.centralwidget = QtWidgets.QWidget(MainWindow) - self.centralwidget.setObjectName(_fromUtf8("centralwidget")) + self.centralwidget.setObjectName("centralwidget") self.splitimagefolderLabel = QtWidgets.QLabel(self.centralwidget) - self.splitimagefolderLabel.setGeometry(QtCore.QRect(90, 13, 91, 16)) - self.splitimagefolderLabel.setObjectName(_fromUtf8("splitimagefolderLabel")) + self.splitimagefolderLabel.setGeometry(QtCore.QRect(80, 13, 98, 16)) + self.splitimagefolderLabel.setObjectName("splitimagefolderLabel") self.splitimagefolderLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.splitimagefolderLineEdit.setGeometry(QtCore.QRect(187, 11, 247, 20)) + self.splitimagefolderLineEdit.setGeometry(QtCore.QRect(187, 11, 247, 22)) self.splitimagefolderLineEdit.setReadOnly(True) - self.splitimagefolderLineEdit.setObjectName(_fromUtf8("splitimagefolderLineEdit")) + self.splitimagefolderLineEdit.setObjectName("splitimagefolderLineEdit") self.browseButton = QtWidgets.QPushButton(self.centralwidget) self.browseButton.setGeometry(QtCore.QRect(443, 9, 75, 24)) - self.browseButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.browseButton.setObjectName(_fromUtf8("browseButton")) + self.browseButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.browseButton.setObjectName("browseButton") self.xLabel = QtWidgets.QLabel(self.centralwidget) self.xLabel.setGeometry(QtCore.QRect(25, 139, 7, 16)) - self.xLabel.setObjectName(_fromUtf8("xLabel")) + self.xLabel.setObjectName("xLabel") self.liveimageCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.liveimageCheckBox.setEnabled(True) - self.liveimageCheckBox.setGeometry(QtCore.QRect(125, 253, 121, 17)) + self.liveimageCheckBox.setGeometry(QtCore.QRect(120, 253, 129, 20)) self.liveimageCheckBox.setChecked(True) self.liveimageCheckBox.setTristate(False) - self.liveimageCheckBox.setObjectName(_fromUtf8("liveimageCheckBox")) - self.loopCheckBox = QtWidgets.QCheckBox(self.centralwidget) - self.loopCheckBox.setEnabled(True) - self.loopCheckBox.setGeometry(QtCore.QRect(500, 314, 121, 17)) - self.loopCheckBox.setChecked(False) - self.loopCheckBox.setTristate(False) - self.loopCheckBox.setObjectName(_fromUtf8("loopCheckBox")) - self.autostartonresetCheckBox = QtWidgets.QCheckBox(self.centralwidget) - self.autostartonresetCheckBox.setEnabled(True) - self.autostartonresetCheckBox.setGeometry(QtCore.QRect(500, 344, 121, 17)) - self.autostartonresetCheckBox.setChecked(False) - self.autostartonresetCheckBox.setTristate(False) - self.autostartonresetCheckBox.setObjectName(_fromUtf8("autostartonresetCheckBox")) + self.liveimageCheckBox.setObjectName("liveimageCheckBox") self.selectregionButton = QtWidgets.QPushButton(self.centralwidget) self.selectregionButton.setGeometry(QtCore.QRect(5, 67, 101, 23)) - self.selectregionButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.selectregionButton.setObjectName(_fromUtf8("selectregionButton")) + self.selectregionButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.selectregionButton.setObjectName("selectregionButton") self.similaritythresholdLabel = QtWidgets.QLabel(self.centralwidget) - self.similaritythresholdLabel.setGeometry(QtCore.QRect(10, 378, 91, 16)) - self.similaritythresholdLabel.setObjectName(_fromUtf8("similaritythresholdLabel")) + self.similaritythresholdLabel.setGeometry(QtCore.QRect(10, 380, 102, 32)) + self.similaritythresholdLabel.setObjectName("similaritythresholdLabel") self.similaritythresholdDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) - self.similaritythresholdDoubleSpinBox.setGeometry(QtCore.QRect(160, 383, 64, 22)) + self.similaritythresholdDoubleSpinBox.setGeometry(QtCore.QRect(160, 390, 64, 22)) self.similaritythresholdDoubleSpinBox.setMaximum(1.0) self.similaritythresholdDoubleSpinBox.setSingleStep(0.01) self.similaritythresholdDoubleSpinBox.setProperty("value", 0.9) - self.similaritythresholdDoubleSpinBox.setObjectName(_fromUtf8("similaritythresholdDoubleSpinBox")) + self.similaritythresholdDoubleSpinBox.setObjectName("similaritythresholdDoubleSpinBox") self.startautosplitterButton = QtWidgets.QPushButton(self.centralwidget) - self.startautosplitterButton.setGeometry(QtCore.QRect(506, 425, 101, 31)) - self.startautosplitterButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.startautosplitterButton.setObjectName(_fromUtf8("startautosplitterButton")) + self.startautosplitterButton.setGeometry(QtCore.QRect(510, 425, 101, 31)) + self.startautosplitterButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.startautosplitterButton.setObjectName("startautosplitterButton") self.resetButton = QtWidgets.QPushButton(self.centralwidget) - self.resetButton.setGeometry(QtCore.QRect(506, 385, 101, 31)) - self.resetButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.resetButton.setObjectName(_fromUtf8("resetButton")) + self.resetButton.setGeometry(QtCore.QRect(510, 385, 101, 31)) + self.resetButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.resetButton.setObjectName("resetButton") self.undosplitButton = QtWidgets.QPushButton(self.centralwidget) - self.undosplitButton.setGeometry(QtCore.QRect(477, 251, 61, 21)) - self.undosplitButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.undosplitButton.setObjectName(_fromUtf8("undosplitButton")) + self.undosplitButton.setGeometry(QtCore.QRect(477, 250, 75, 24)) + self.undosplitButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.undosplitButton.setObjectName("undosplitButton") self.skipsplitButton = QtWidgets.QPushButton(self.centralwidget) - self.skipsplitButton.setGeometry(QtCore.QRect(541, 251, 61, 21)) - self.skipsplitButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.skipsplitButton.setObjectName(_fromUtf8("skipsplitButton")) + self.skipsplitButton.setGeometry(QtCore.QRect(560, 250, 75, 24)) + self.skipsplitButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.skipsplitButton.setObjectName("skipsplitButton") self.pauseLabel = QtWidgets.QLabel(self.centralwidget) - self.pauseLabel.setGeometry(QtCore.QRect(10, 420, 140, 16)) - self.pauseLabel.setObjectName(_fromUtf8("pauseLabel")) + self.pauseLabel.setGeometry(QtCore.QRect(10, 420, 112, 32)) + self.pauseLabel.setObjectName("pauseLabel") self.checkfpsButton = QtWidgets.QPushButton(self.centralwidget) - self.checkfpsButton.setGeometry(QtCore.QRect(5, 225, 51, 21)) - self.checkfpsButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.checkfpsButton.setObjectName(_fromUtf8("checkfpsButton")) + self.checkfpsButton.setGeometry(QtCore.QRect(5, 225, 53, 21)) + self.checkfpsButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.checkfpsButton.setObjectName("checkfpsButton") self.fpsLabel = QtWidgets.QLabel(self.centralwidget) self.fpsLabel.setGeometry(QtCore.QRect(87, 225, 20, 20)) - self.fpsLabel.setObjectName(_fromUtf8("fpsLabel")) + self.fpsLabel.setObjectName("fpsLabel") self.showlivesimilarityCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.showlivesimilarityCheckBox.setEnabled(True) - self.showlivesimilarityCheckBox.setGeometry(QtCore.QRect(10, 330, 111, 17)) + self.showlivesimilarityCheckBox.setGeometry(QtCore.QRect(10, 330, 124, 20)) self.showlivesimilarityCheckBox.setChecked(True) self.showlivesimilarityCheckBox.setTristate(False) - self.showlivesimilarityCheckBox.setObjectName(_fromUtf8("showlivesimilarityCheckBox")) + self.showlivesimilarityCheckBox.setObjectName("showlivesimilarityCheckBox") self.showhighestsimilarityCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.showhighestsimilarityCheckBox.setEnabled(True) - self.showhighestsimilarityCheckBox.setGeometry(QtCore.QRect(10, 351, 131, 17)) + self.showhighestsimilarityCheckBox.setGeometry(QtCore.QRect(10, 351, 145, 20)) self.showhighestsimilarityCheckBox.setChecked(True) self.showhighestsimilarityCheckBox.setTristate(False) - self.showhighestsimilarityCheckBox.setObjectName(_fromUtf8("showhighestsimilarityCheckBox")) + self.showhighestsimilarityCheckBox.setObjectName("showhighestsimilarityCheckBox") self.livesimilarityLabel = QtWidgets.QLabel(self.centralwidget) - self.livesimilarityLabel.setGeometry(QtCore.QRect(160, 332, 46, 13)) - self.livesimilarityLabel.setText(_fromUtf8("")) - self.livesimilarityLabel.setObjectName(_fromUtf8("livesimilarityLabel")) + self.livesimilarityLabel.setGeometry(QtCore.QRect(160, 332, 46, 16)) + self.livesimilarityLabel.setText("") + self.livesimilarityLabel.setObjectName("livesimilarityLabel") self.highestsimilarityLabel = QtWidgets.QLabel(self.centralwidget) - self.highestsimilarityLabel.setGeometry(QtCore.QRect(160, 353, 46, 13)) - self.highestsimilarityLabel.setText(_fromUtf8("")) - self.highestsimilarityLabel.setObjectName(_fromUtf8("highestsimilarityLabel")) + self.highestsimilarityLabel.setGeometry(QtCore.QRect(160, 353, 46, 16)) + self.highestsimilarityLabel.setText("") + self.highestsimilarityLabel.setObjectName("highestsimilarityLabel") self.splitLabel = QtWidgets.QLabel(self.centralwidget) - self.splitLabel.setGeometry(QtCore.QRect(249, 317, 61, 16)) - self.splitLabel.setObjectName(_fromUtf8("splitLabel")) + self.splitLabel.setGeometry(QtCore.QRect(240, 317, 58, 16)) + self.splitLabel.setObjectName("splitLabel") self.resetLabel = QtWidgets.QLabel(self.centralwidget) - self.resetLabel.setGeometry(QtCore.QRect(249, 341, 61, 16)) - self.resetLabel.setObjectName(_fromUtf8("resetLabel")) + self.resetLabel.setGeometry(QtCore.QRect(240, 341, 28, 16)) + self.resetLabel.setObjectName("resetLabel") self.skiptsplitLabel = QtWidgets.QLabel(self.centralwidget) - self.skiptsplitLabel.setGeometry(QtCore.QRect(249, 367, 50, 16)) - self.skiptsplitLabel.setObjectName(_fromUtf8("skiptsplitLabel")) + self.skiptsplitLabel.setGeometry(QtCore.QRect(240, 367, 48, 16)) + self.skiptsplitLabel.setObjectName("skiptsplitLabel") self.undosplitLabel = QtWidgets.QLabel(self.centralwidget) - self.undosplitLabel.setGeometry(QtCore.QRect(249, 393, 61, 16)) - self.undosplitLabel.setObjectName(_fromUtf8("undosplitLabel")) - self.pausehotkeyLabel = QtWidgets.QLabel(self.centralwidget) - self.pausehotkeyLabel.setGeometry(QtCore.QRect(249, 418, 61, 16)) - self.pausehotkeyLabel.setObjectName(_fromUtf8("undosplitLabel")) + self.undosplitLabel.setGeometry(QtCore.QRect(240, 393, 55, 16)) + self.undosplitLabel.setObjectName("undosplitLabel") self.splitLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.splitLineEdit.setGeometry(QtCore.QRect(316, 314, 81, 20)) + self.splitLineEdit.setGeometry(QtCore.QRect(310, 314, 81, 20)) self.splitLineEdit.setReadOnly(True) - self.splitLineEdit.setObjectName(_fromUtf8("splitLineEdit")) + self.splitLineEdit.setObjectName("splitLineEdit") self.undosplitLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.undosplitLineEdit.setGeometry(QtCore.QRect(316, 391, 81, 20)) - self.undosplitLineEdit.setFocusPolicy(QtCore.Qt.StrongFocus) + self.undosplitLineEdit.setGeometry(QtCore.QRect(310, 391, 81, 20)) + self.undosplitLineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) self.undosplitLineEdit.setReadOnly(True) - self.undosplitLineEdit.setObjectName(_fromUtf8("undosplitLineEdit")) + self.undosplitLineEdit.setObjectName("undosplitLineEdit") self.skipsplitLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.skipsplitLineEdit.setGeometry(QtCore.QRect(316, 365, 81, 20)) + self.skipsplitLineEdit.setGeometry(QtCore.QRect(310, 365, 81, 20)) self.skipsplitLineEdit.setReadOnly(True) - self.skipsplitLineEdit.setObjectName(_fromUtf8("skipsplitLineEdit")) + self.skipsplitLineEdit.setObjectName("skipsplitLineEdit") self.resetLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.resetLineEdit.setGeometry(QtCore.QRect(316, 339, 81, 20)) + self.resetLineEdit.setGeometry(QtCore.QRect(310, 339, 81, 20)) self.resetLineEdit.setReadOnly(True) - self.resetLineEdit.setObjectName(_fromUtf8("resetLineEdit")) - self.pausehotkeyLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.pausehotkeyLineEdit.setGeometry(QtCore.QRect(316, 416, 81, 20)) - self.pausehotkeyLineEdit.setReadOnly(True) - self.pausehotkeyLineEdit.setObjectName(_fromUtf8("pausehotkeyLineEdit")) + self.resetLineEdit.setObjectName("resetLineEdit") self.setsplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setsplithotkeyButton.setGeometry(QtCore.QRect(409, 314, 71, 21)) - self.setsplithotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.setsplithotkeyButton.setObjectName(_fromUtf8("setsplithotkeyButton")) + self.setsplithotkeyButton.setGeometry(QtCore.QRect(400, 314, 71, 21)) + self.setsplithotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.setsplithotkeyButton.setObjectName("setsplithotkeyButton") self.setresethotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setresethotkeyButton.setGeometry(QtCore.QRect(410, 339, 71, 21)) - self.setresethotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.setresethotkeyButton.setObjectName(_fromUtf8("setresethotkeyButton")) + self.setresethotkeyButton.setGeometry(QtCore.QRect(400, 339, 71, 21)) + self.setresethotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.setresethotkeyButton.setObjectName("setresethotkeyButton") self.setskipsplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setskipsplithotkeyButton.setGeometry(QtCore.QRect(410, 365, 71, 21)) - self.setskipsplithotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.setskipsplithotkeyButton.setObjectName(_fromUtf8("setskipsplithotkeyButton")) + self.setskipsplithotkeyButton.setGeometry(QtCore.QRect(400, 365, 71, 21)) + self.setskipsplithotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.setskipsplithotkeyButton.setObjectName("setskipsplithotkeyButton") self.setundosplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setundosplithotkeyButton.setGeometry(QtCore.QRect(410, 391, 71, 21)) - self.setundosplithotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.setundosplithotkeyButton.setObjectName(_fromUtf8("setundosplithotkeyButton")) - self.setpausehotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setpausehotkeyButton.setGeometry(QtCore.QRect(410, 416, 71, 21)) - self.setpausehotkeyButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.setpausehotkeyButton.setObjectName(_fromUtf8("setpausehotkeyButton")) + self.setundosplithotkeyButton.setGeometry(QtCore.QRect(400, 391, 71, 21)) + self.setundosplithotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.setundosplithotkeyButton.setObjectName("setundosplithotkeyButton") self.line_live_bottom = QtWidgets.QFrame(self.centralwidget) self.line_live_bottom.setGeometry(QtCore.QRect(111, 247, 240, 2)) - self.line_live_bottom.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_live_bottom.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_live_bottom.setLineWidth(1) - self.line_live_bottom.setFrameShape(QtWidgets.QFrame.HLine) - self.line_live_bottom.setObjectName(_fromUtf8("line_live_bottom")) + self.line_live_bottom.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_live_bottom.setObjectName("line_live_bottom") self.line_live_top = QtWidgets.QFrame(self.centralwidget) self.line_live_top.setGeometry(QtCore.QRect(111, 68, 240, 2)) - self.line_live_top.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_live_top.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_live_top.setLineWidth(1) - self.line_live_top.setFrameShape(QtWidgets.QFrame.HLine) - self.line_live_top.setObjectName(_fromUtf8("line_live_top")) + self.line_live_top.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_live_top.setObjectName("line_live_top") self.line_live_right = QtWidgets.QFrame(self.centralwidget) self.line_live_right.setGeometry(QtCore.QRect(349, 69, 2, 180)) - self.line_live_right.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_live_right.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_live_right.setLineWidth(1) - self.line_live_right.setFrameShape(QtWidgets.QFrame.VLine) - self.line_live_right.setObjectName(_fromUtf8("line_live_right")) + self.line_live_right.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_live_right.setObjectName("line_live_right") self.line_left = QtWidgets.QFrame(self.centralwidget) - self.line_left.setGeometry(QtCore.QRect(234, 296, 2, 163)) - self.line_left.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_left.setGeometry(QtCore.QRect(230, 296, 2, 163)) + self.line_left.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_left.setLineWidth(1) - self.line_left.setFrameShape(QtWidgets.QFrame.VLine) - self.line_left.setObjectName(_fromUtf8("line_left")) + self.line_left.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_left.setObjectName("line_left") self.line_live_left = QtWidgets.QFrame(self.centralwidget) self.line_live_left.setGeometry(QtCore.QRect(110, 69, 2, 180)) - self.line_live_left.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_live_left.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_live_left.setLineWidth(1) - self.line_live_left.setFrameShape(QtWidgets.QFrame.VLine) - self.line_live_left.setObjectName(_fromUtf8("line_live_left")) + self.line_live_left.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_live_left.setObjectName("line_live_left") self.line_split_left = QtWidgets.QFrame(self.centralwidget) self.line_split_left.setGeometry(QtCore.QRect(360, 69, 2, 180)) - self.line_split_left.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_split_left.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_split_left.setLineWidth(1) - self.line_split_left.setFrameShape(QtWidgets.QFrame.VLine) - self.line_split_left.setObjectName(_fromUtf8("line_split_left")) + self.line_split_left.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_split_left.setObjectName("line_split_left") self.line_split_right = QtWidgets.QFrame(self.centralwidget) self.line_split_right.setGeometry(QtCore.QRect(599, 69, 2, 180)) - self.line_split_right.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_split_right.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_split_right.setLineWidth(1) - self.line_split_right.setFrameShape(QtWidgets.QFrame.VLine) - self.line_split_right.setObjectName(_fromUtf8("line_split_right")) + self.line_split_right.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_split_right.setObjectName("line_split_right") self.line_split_top = QtWidgets.QFrame(self.centralwidget) self.line_split_top.setGeometry(QtCore.QRect(361, 68, 240, 2)) - self.line_split_top.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_split_top.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_split_top.setLineWidth(1) - self.line_split_top.setFrameShape(QtWidgets.QFrame.HLine) - self.line_split_top.setObjectName(_fromUtf8("line_split_top")) + self.line_split_top.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_split_top.setObjectName("line_split_top") self.line_split_bottom = QtWidgets.QFrame(self.centralwidget) self.line_split_bottom.setGeometry(QtCore.QRect(361, 247, 240, 2)) - self.line_split_bottom.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_split_bottom.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_split_bottom.setLineWidth(1) - self.line_split_bottom.setFrameShape(QtWidgets.QFrame.HLine) - self.line_split_bottom.setObjectName(_fromUtf8("line_split_bottom")) + self.line_split_bottom.setFrameShape(QtWidgets.QFrame.Shape.HLine) + self.line_split_bottom.setObjectName("line_split_bottom") self.timerglobalhotkeysLabel = QtWidgets.QLabel(self.centralwidget) - self.timerglobalhotkeysLabel.setGeometry(QtCore.QRect(313, 293, 101, 20)) - self.timerglobalhotkeysLabel.setObjectName(_fromUtf8("timerglobalhotkeysLabel")) + self.timerglobalhotkeysLabel.setGeometry(QtCore.QRect(310, 293, 113, 16)) + self.timerglobalhotkeysLabel.setObjectName("timerglobalhotkeysLabel") self.line_right = QtWidgets.QFrame(self.centralwidget) - self.line_right.setGeometry(QtCore.QRect(489, 296, 2, 163)) - self.line_right.setFrameShadow(QtWidgets.QFrame.Plain) + self.line_right.setGeometry(QtCore.QRect(500, 296, 2, 163)) + self.line_right.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_right.setLineWidth(1) - self.line_right.setFrameShape(QtWidgets.QFrame.VLine) - self.line_right.setObjectName(_fromUtf8("line_right")) + self.line_right.setFrameShape(QtWidgets.QFrame.Shape.VLine) + self.line_right.setObjectName("line_right") self.liveImage = QtWidgets.QLabel(self.centralwidget) self.liveImage.setGeometry(QtCore.QRect(111, 69, 240, 180)) - self.liveImage.setText(_fromUtf8("")) - self.liveImage.setObjectName(_fromUtf8("liveImage")) + self.liveImage.setText("") + self.liveImage.setObjectName("liveImage") self.currentSplitImage = QtWidgets.QLabel(self.centralwidget) self.currentSplitImage.setGeometry(QtCore.QRect(361, 69, 240, 180)) - self.currentSplitImage.setText(_fromUtf8("")) - self.currentSplitImage.setObjectName(_fromUtf8("currentSplitImage")) + self.currentSplitImage.setText("") + self.currentSplitImage.setObjectName("currentSplitImage") self.currentsplitimageLabel = QtWidgets.QLabel(self.centralwidget) - self.currentsplitimageLabel.setAlignment(QtCore.Qt.AlignCenter) - self.currentsplitimageLabel.setGeometry(QtCore.QRect(370, 50, 221, 20)) - self.currentsplitimageLabel.setObjectName(_fromUtf8("currentsplitimageLabel")) - self.imageloopLabel = QtWidgets.QLabel(self.centralwidget) - self.imageloopLabel.setGeometry(QtCore.QRect(362, 251, 108, 20)) - self.imageloopLabel.setObjectName(_fromUtf8("Image Loop #:")) + self.currentsplitimageLabel.setGeometry(QtCore.QRect(430, 50, 221, 16)) + self.currentsplitimageLabel.setObjectName("currentsplitimageLabel") self.widthLabel = QtWidgets.QLabel(self.centralwidget) self.widthLabel.setGeometry(QtCore.QRect(14, 177, 31, 16)) - self.widthLabel.setObjectName(_fromUtf8("widthLabel")) + self.widthLabel.setObjectName("widthLabel") self.heightLabel = QtWidgets.QLabel(self.centralwidget) self.heightLabel.setGeometry(QtCore.QRect(68, 177, 31, 16)) - self.heightLabel.setObjectName(_fromUtf8("heightLabel")) + self.heightLabel.setObjectName("heightLabel") self.fpsvalueLabel = QtWidgets.QLabel(self.centralwidget) self.fpsvalueLabel.setGeometry(QtCore.QRect(58, 225, 26, 20)) - self.fpsvalueLabel.setText(_fromUtf8("")) - self.fpsvalueLabel.setObjectName(_fromUtf8("fpsvalueLabel")) + self.fpsvalueLabel.setText("") + self.fpsvalueLabel.setObjectName("fpsvalueLabel") self.widthSpinBox = QtWidgets.QSpinBox(self.centralwidget) self.widthSpinBox.setGeometry(QtCore.QRect(6, 193, 44, 22)) self.widthSpinBox.setMinimum(1) self.widthSpinBox.setMaximum(10000) self.widthSpinBox.setProperty("value", 640) - self.widthSpinBox.setObjectName(_fromUtf8("widthSpinBox")) + self.widthSpinBox.setObjectName("widthSpinBox") self.heightSpinBox = QtWidgets.QSpinBox(self.centralwidget) self.heightSpinBox.setGeometry(QtCore.QRect(62, 193, 44, 22)) self.heightSpinBox.setMinimum(1) self.heightSpinBox.setMaximum(10000) self.heightSpinBox.setProperty("value", 480) - self.heightSpinBox.setObjectName(_fromUtf8("heightSpinBox")) + self.heightSpinBox.setObjectName("heightSpinBox") self.captureregionLabel = QtWidgets.QLabel(self.centralwidget) self.captureregionLabel.setGeometry(QtCore.QRect(192, 50, 81, 16)) - self.captureregionLabel.setObjectName(_fromUtf8("captureregionLabel")) + self.captureregionLabel.setObjectName("captureregionLabel") self.fpslimitLabel = QtWidgets.QLabel(self.centralwidget) self.fpslimitLabel.setGeometry(QtCore.QRect(8, 251, 51, 16)) - self.fpslimitLabel.setObjectName(_fromUtf8("fpslimitLabel")) + self.fpslimitLabel.setObjectName("fpslimitLabel") self.fpslimitSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) self.fpslimitSpinBox.setGeometry(QtCore.QRect(62, 248, 44, 22)) - self.fpslimitSpinBox.setPrefix(_fromUtf8("")) + self.fpslimitSpinBox.setPrefix("") self.fpslimitSpinBox.setDecimals(0) self.fpslimitSpinBox.setMinimum(30.0) self.fpslimitSpinBox.setMaximum(5000.0) self.fpslimitSpinBox.setSingleStep(1.0) self.fpslimitSpinBox.setProperty("value", 60.0) - self.fpslimitSpinBox.setObjectName(_fromUtf8("fpslimitSpinBox")) + self.fpslimitSpinBox.setObjectName("fpslimitSpinBox") self.currentsplitimagefileLabel = QtWidgets.QLabel(self.centralwidget) self.currentsplitimagefileLabel.setGeometry(QtCore.QRect(362, 271, 237, 20)) - self.currentsplitimagefileLabel.setText(_fromUtf8("")) - self.currentsplitimagefileLabel.setAlignment(QtCore.Qt.AlignCenter) - self.currentsplitimagefileLabel.setObjectName(_fromUtf8("currentsplitimagefileLabel")) + self.currentsplitimagefileLabel.setText("") + self.currentsplitimagefileLabel.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) + self.currentsplitimagefileLabel.setObjectName("currentsplitimagefileLabel") self.takescreenshotButton = QtWidgets.QPushButton(self.centralwidget) - self.takescreenshotButton.setGeometry(QtCore.QRect(250, 251, 91, 21)) - self.takescreenshotButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.takescreenshotButton.setObjectName(_fromUtf8("takescreenshotButton")) + self.takescreenshotButton.setGeometry(QtCore.QRect(250, 251, 92, 24)) + self.takescreenshotButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.takescreenshotButton.setObjectName("takescreenshotButton") self.xSpinBox = QtWidgets.QSpinBox(self.centralwidget) self.xSpinBox.setGeometry(QtCore.QRect(6, 154, 44, 22)) self.xSpinBox.setReadOnly(False) - self.xSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.UpDownArrows) + self.xSpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.UpDownArrows) self.xSpinBox.setMinimum(0) self.xSpinBox.setMaximum(999999999) self.xSpinBox.setSingleStep(1) self.xSpinBox.setProperty("value", 0) - self.xSpinBox.setObjectName(_fromUtf8("xSpinBox")) + self.xSpinBox.setObjectName("xSpinBox") self.ySpinBox = QtWidgets.QSpinBox(self.centralwidget) self.ySpinBox.setGeometry(QtCore.QRect(62, 154, 44, 22)) self.ySpinBox.setReadOnly(False) - self.ySpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.UpDownArrows) + self.ySpinBox.setButtonSymbols(QtWidgets.QAbstractSpinBox.ButtonSymbols.UpDownArrows) self.ySpinBox.setMinimum(0) self.ySpinBox.setMaximum(999999999) self.ySpinBox.setProperty("value", 0) - self.ySpinBox.setObjectName(_fromUtf8("ySpinBox")) + self.ySpinBox.setObjectName("ySpinBox") self.yLabel = QtWidgets.QLabel(self.centralwidget) self.yLabel.setGeometry(QtCore.QRect(81, 139, 7, 16)) - self.yLabel.setObjectName(_fromUtf8("yLabel")) + self.yLabel.setObjectName("yLabel") self.comparisonmethodComboBox = QtWidgets.QComboBox(self.centralwidget) - self.comparisonmethodComboBox.setGeometry(QtCore.QRect(143, 299, 81, 22)) - self.comparisonmethodComboBox.setObjectName(_fromUtf8("comparisonmethodComboBox")) - self.comparisonmethodComboBox.addItem(_fromUtf8("")) - self.comparisonmethodComboBox.addItem(_fromUtf8("")) - self.comparisonmethodComboBox.addItem(_fromUtf8("")) + self.comparisonmethodComboBox.setGeometry(QtCore.QRect(133, 299, 91, 22)) + self.comparisonmethodComboBox.setObjectName("comparisonmethodComboBox") + self.comparisonmethodComboBox.addItem("") + self.comparisonmethodComboBox.addItem("") + self.comparisonmethodComboBox.addItem("") self.pauseDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) - self.pauseDoubleSpinBox.setGeometry(QtCore.QRect(160, 425, 64, 22)) + self.pauseDoubleSpinBox.setGeometry(QtCore.QRect(160, 430, 64, 22)) self.pauseDoubleSpinBox.setMaximum(999999999.0) self.pauseDoubleSpinBox.setSingleStep(1.0) self.pauseDoubleSpinBox.setProperty("value", 10.0) - self.pauseDoubleSpinBox.setObjectName(_fromUtf8("pauseDoubleSpinBox")) + self.pauseDoubleSpinBox.setObjectName("pauseDoubleSpinBox") self.comparisonmethodLabel = QtWidgets.QLabel(self.centralwidget) - self.comparisonmethodLabel.setGeometry(QtCore.QRect(10, 300, 101, 16)) - self.comparisonmethodLabel.setObjectName(_fromUtf8("comparisonmethodLabel")) + self.comparisonmethodLabel.setGeometry(QtCore.QRect(10, 303, 110, 16)) + self.comparisonmethodLabel.setObjectName("comparisonmethodLabel") self.alignregionButton = QtWidgets.QPushButton(self.centralwidget) self.alignregionButton.setGeometry(QtCore.QRect(5, 92, 101, 23)) - self.alignregionButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.alignregionButton.setObjectName(_fromUtf8("alignregionButton")) + self.alignregionButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.alignregionButton.setObjectName("alignregionButton") self.groupDummySplitsCheckBox = QtWidgets.QCheckBox(self.centralwidget) - self.groupDummySplitsCheckBox.setGeometry(QtCore.QRect(252, 440, 230, 17)) + self.groupDummySplitsCheckBox.setGeometry(QtCore.QRect(240, 443, 261, 20)) self.groupDummySplitsCheckBox.setChecked(False) - self.groupDummySplitsCheckBox.setObjectName(_fromUtf8("groupDummySplitsCheckBox")) + self.groupDummySplitsCheckBox.setObjectName("groupDummySplitsCheckBox") self.selectwindowButton = QtWidgets.QPushButton(self.centralwidget) self.selectwindowButton.setGeometry(QtCore.QRect(5, 117, 101, 23)) - self.selectwindowButton.setFocusPolicy(QtCore.Qt.NoFocus) - self.selectwindowButton.setObjectName(_fromUtf8("selectwindowButton")) + self.selectwindowButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.selectwindowButton.setObjectName("selectwindowButton") + self.imageloopLabel = QtWidgets.QLabel(self.centralwidget) + self.imageloopLabel.setGeometry(QtCore.QRect(362, 252, 108, 20)) + self.imageloopLabel.setObjectName("imageloopLabel") + self.pausehotkeyLabel = QtWidgets.QLabel(self.centralwidget) + self.pausehotkeyLabel.setGeometry(QtCore.QRect(240, 418, 31, 16)) + self.pausehotkeyLabel.setObjectName("pausehotkeyLabel") + self.pausehotkeyLineEdit = QtWidgets.QLineEdit(self.centralwidget) + self.pausehotkeyLineEdit.setGeometry(QtCore.QRect(310, 416, 82, 20)) + self.pausehotkeyLineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) + self.pausehotkeyLineEdit.setReadOnly(True) + self.pausehotkeyLineEdit.setObjectName("pausehotkeyLineEdit") + self.setpausehotkeyButton = QtWidgets.QPushButton(self.centralwidget) + self.setpausehotkeyButton.setGeometry(QtCore.QRect(400, 416, 71, 21)) + self.setpausehotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.setpausehotkeyButton.setObjectName("setpausehotkeyButton") + self.loopCheckBox = QtWidgets.QCheckBox(self.centralwidget) + self.loopCheckBox.setEnabled(True) + self.loopCheckBox.setGeometry(QtCore.QRect(510, 314, 117, 20)) + self.loopCheckBox.setChecked(False) + self.loopCheckBox.setTristate(False) + self.loopCheckBox.setObjectName("loopCheckBox") + self.autostartonresetCheckBox = QtWidgets.QCheckBox(self.centralwidget) + self.autostartonresetCheckBox.setGeometry(QtCore.QRect(510, 344, 126, 20)) + self.autostartonresetCheckBox.setChecked(False) + self.autostartonresetCheckBox.setTristate(False) + self.autostartonresetCheckBox.setObjectName("autostartonresetCheckBox") self.splitimagefolderLabel.raise_() self.splitimagefolderLineEdit.raise_() self.browseButton.raise_() self.xLabel.raise_() self.liveimageCheckBox.raise_() - self.loopCheckBox.raise_() - self.autostartonresetCheckBox.raise_() self.selectregionButton.raise_() self.similaritythresholdLabel.raise_() self.similaritythresholdDoubleSpinBox.raise_() @@ -383,17 +367,14 @@ def setupUi(self, MainWindow): self.resetLabel.raise_() self.skiptsplitLabel.raise_() self.undosplitLabel.raise_() - self.pausehotkeyLabel.raise_() self.splitLineEdit.raise_() self.undosplitLineEdit.raise_() self.skipsplitLineEdit.raise_() self.resetLineEdit.raise_() - self.pausehotkeyLineEdit.raise_() self.setsplithotkeyButton.raise_() self.setresethotkeyButton.raise_() self.setskipsplithotkeyButton.raise_() self.setundosplithotkeyButton.raise_() - self.setpausehotkeyButton.raise_() self.line_live_bottom.raise_() self.line_live_top.raise_() self.line_live_right.raise_() @@ -406,7 +387,6 @@ def setupUi(self, MainWindow): self.timerglobalhotkeysLabel.raise_() self.line_right.raise_() self.currentsplitimageLabel.raise_() - self.imageloopLabel.raise_() self.liveImage.raise_() self.currentSplitImage.raise_() self.widthLabel.raise_() @@ -428,28 +408,38 @@ def setupUi(self, MainWindow): self.alignregionButton.raise_() self.groupDummySplitsCheckBox.raise_() self.selectwindowButton.raise_() + self.imageloopLabel.raise_() + self.pausehotkeyLabel.raise_() + self.pausehotkeyLineEdit.raise_() + self.setpausehotkeyButton.raise_() + self.loopCheckBox.raise_() + self.autostartonresetCheckBox.raise_() MainWindow.setCentralWidget(self.centralwidget) self.menuBar = QtWidgets.QMenuBar(MainWindow) - self.menuBar.setGeometry(QtCore.QRect(0, 0, 612, 21)) - self.menuBar.setObjectName(_fromUtf8("menuBar")) - self.menuFile = QtWidgets.QMenu(self.menuBar) - self.menuFile.setObjectName(_fromUtf8("menuFile")) + self.menuBar.setGeometry(QtCore.QRect(0, 0, 640, 22)) + self.menuBar.setObjectName("menuBar") self.menuHelp = QtWidgets.QMenu(self.menuBar) - self.menuHelp.setObjectName(_fromUtf8("menuHelp")) + self.menuHelp.setObjectName("menuHelp") + self.menuFile = QtWidgets.QMenu(self.menuBar) + self.menuFile.setObjectName("menuFile") MainWindow.setMenuBar(self.menuBar) - self.actionView_Help = QtWidgets.QAction(MainWindow) - self.actionView_Help.setObjectName(_fromUtf8("actionView_Help")) - self.actionAbout = QtWidgets.QAction(MainWindow) - self.actionAbout.setObjectName(_fromUtf8("actionAbout")) - self.actionSave_Settings = QtWidgets.QAction(MainWindow) - self.actionSave_Settings.setObjectName(_fromUtf8("actionSave_Settings")) - self.actionSave_Settings_As = QtWidgets.QAction(MainWindow) - self.actionSave_Settings_As.setObjectName(_fromUtf8("actionSave_Settings_As")) - self.actionLoad_Settings = QtWidgets.QAction(MainWindow) - self.actionLoad_Settings.setObjectName(_fromUtf8("actionLoad_Settings")) + self.actionView_Help = QtGui.QAction(MainWindow) + self.actionView_Help.setObjectName("actionView_Help") + self.actionAbout = QtGui.QAction(MainWindow) + self.actionAbout.setObjectName("actionAbout") + self.actionSplit_Settings = QtGui.QAction(MainWindow) + self.actionSplit_Settings.setObjectName("actionSplit_Settings") + self.actionSave_Settings = QtGui.QAction(MainWindow) + self.actionSave_Settings.setObjectName("actionSave_Settings") + self.actionSave_Settings_2 = QtGui.QAction(MainWindow) + self.actionSave_Settings_2.setObjectName("actionSave_Settings_2") + self.actionLoad_Settings = QtGui.QAction(MainWindow) + self.actionLoad_Settings.setObjectName("actionLoad_Settings") + self.actionSave_Settings_As = QtGui.QAction(MainWindow) + self.actionSave_Settings_As.setObjectName("actionSave_Settings_As") self.menuHelp.addAction(self.actionView_Help) self.menuHelp.addAction(self.actionAbout) - self.menuFile.addAction(self.actionSave_Settings) + self.menuFile.addAction(self.actionSave_Settings_2) self.menuFile.addAction(self.actionSave_Settings_As) self.menuFile.addAction(self.actionLoad_Settings) self.menuBar.addAction(self.menuFile.menuAction()) @@ -472,70 +462,62 @@ def setupUi(self, MainWindow): MainWindow.setTabOrder(self.splitLineEdit, self.resetLineEdit) MainWindow.setTabOrder(self.resetLineEdit, self.skipsplitLineEdit) MainWindow.setTabOrder(self.skipsplitLineEdit, self.undosplitLineEdit) - MainWindow.setTabOrder(self.undosplitLineEdit, self.pausehotkeyLineEdit) - MainWindow.setTabOrder(self.pausehotkeyLineEdit, self.groupDummySplitsCheckBox) - MainWindow.setTabOrder(self.groupDummySplitsCheckBox, self.loopCheckBox) - MainWindow.setTabOrder(self.loopCheckBox, self.autostartonresetCheckBox) + MainWindow.setTabOrder(self.undosplitLineEdit, self.groupDummySplitsCheckBox) def retranslateUi(self, MainWindow): - MainWindow.setWindowTitle(_translate("MainWindow", "AutoSplit", None)) - self.splitimagefolderLabel.setText(_translate("MainWindow", "Split Image Folder:", None)) - self.browseButton.setText(_translate("MainWindow", "Browse..", None)) - self.xLabel.setText(_translate("MainWindow", "X", None)) - self.liveimageCheckBox.setText(_translate("MainWindow", "Live Capture Region", None)) - self.loopCheckBox.setText(_translate("MainWindow", "Loop Split Images", None)) - self.autostartonresetCheckBox.setText(_translate("MainWindow", "Auto Start On Reset", None)) - self.selectregionButton.setText(_translate("MainWindow", "Select Region", None)) - self.similaritythresholdLabel.setText(_translate("MainWindow", "Similarity threshold\nDefault value", None)) - self.startautosplitterButton.setText(_translate("MainWindow", "Start Auto Splitter", None)) - self.resetButton.setText(_translate("MainWindow", "Reset", None)) - self.undosplitButton.setText(_translate("MainWindow", "Undo Split", None)) - self.skipsplitButton.setText(_translate("MainWindow", "Skip Split", None)) - self.pauseLabel.setText(_translate("MainWindow", "Pause time (seconds)\nDefault value", None)) - self.checkfpsButton.setText(_translate("MainWindow", "Max FPS", None)) - self.fpsLabel.setText(_translate("MainWindow", "FPS", None)) - self.showlivesimilarityCheckBox.setText(_translate("MainWindow", "Show live similarity", None)) - self.showhighestsimilarityCheckBox.setText(_translate("MainWindow", "Show highest similarity", None)) - self.splitLabel.setText(_translate("MainWindow", "Start / Split", None)) - self.resetLabel.setText(_translate("MainWindow", "Reset", None)) - self.skiptsplitLabel.setText(_translate("MainWindow", "Skip Split", None)) - self.undosplitLabel.setText(_translate("MainWindow", "Undo Split", None)) - self.pausehotkeyLabel.setText(_translate("MainWindow", "Pause", None)) - self.setsplithotkeyButton.setText(_translate("MainWindow", "Set Hotkey", None)) - self.setresethotkeyButton.setText(_translate("MainWindow", "Set Hotkey", None)) - self.setskipsplithotkeyButton.setText(_translate("MainWindow", "Set Hotkey", None)) - self.setundosplithotkeyButton.setText(_translate("MainWindow", "Set Hotkey", None)) - self.setpausehotkeyButton.setText(_translate("MainWindow", "Set Hotkey", None)) - self.timerglobalhotkeysLabel.setText(_translate("MainWindow", "Timer Global Hotkeys", None)) - self.currentsplitimageLabel.setText(_translate("MainWindow", "Current Split Image", None)) - self.imageloopLabel.setText(_translate("MainWindow", "Image Loop #:", None)) - self.widthLabel.setText(_translate("MainWindow", "Width", None)) - self.heightLabel.setText(_translate("MainWindow", "Height", None)) - self.captureregionLabel.setText(_translate("MainWindow", "Capture Region", None)) - self.fpslimitLabel.setText(_translate("MainWindow", "FPS Limit:", None)) - self.takescreenshotButton.setText(_translate("MainWindow", "Take Screenshot", None)) - self.yLabel.setText(_translate("MainWindow", "Y", None)) - self.comparisonmethodComboBox.setItemText(0, _translate("MainWindow", "L2 Norm", None)) - self.comparisonmethodComboBox.setItemText(1, _translate("MainWindow", "Histograms", None)) - self.comparisonmethodComboBox.setItemText(2, _translate("MainWindow", "pHash", None)) - self.comparisonmethodLabel.setText(_translate("MainWindow", "Comparison Method", None)) - self.alignregionButton.setText(_translate("MainWindow", "Align Region", None)) - self.groupDummySplitsCheckBox.setText(_translate("MainWindow", "Group dummy splits when undoing/skipping", None)) - self.selectwindowButton.setText(_translate("MainWindow", "Select Window", None)) - self.menuHelp.setTitle(_translate("MainWindow", "Help", None)) - self.menuFile.setTitle(_translate("MainWindow", "File", None)) - self.actionView_Help.setText(_translate("MainWindow", "View Help", None)) - self.actionAbout.setText(_translate("MainWindow", "About", None)) - self.actionSave_Settings.setText(_translate("MainWindow", "Save Settings", None)) - self.actionSave_Settings_As.setText(_translate("MainWindow", "Save Settings As...", None)) - self.actionLoad_Settings.setText(_translate("MainWindow", "Load Settings", None)) - - -if __name__ == "__main__": - import sys - app = QtWidgets.QApplication(sys.argv) - MainWindow = QtWidgets.QMainWindow() - ui = Ui_MainWindow() - ui.setupUi(MainWindow) - MainWindow.show() - sys.exit(app.exec_()) + _translate = QtCore.QCoreApplication.translate + MainWindow.setWindowTitle(_translate("MainWindow", "AutoSplit")) + self.splitimagefolderLabel.setText(_translate("MainWindow", "Split Image Folder:")) + self.browseButton.setText(_translate("MainWindow", "Browse..")) + self.xLabel.setText(_translate("MainWindow", "X")) + self.liveimageCheckBox.setText(_translate("MainWindow", "Live Capture Region")) + self.selectregionButton.setText(_translate("MainWindow", "Select Region")) + self.similaritythresholdLabel.setText(_translate("MainWindow", "Similarity threshold\n" +"Default value")) + self.startautosplitterButton.setText(_translate("MainWindow", "Start Auto Splitter")) + self.resetButton.setText(_translate("MainWindow", "Reset")) + self.undosplitButton.setText(_translate("MainWindow", "Undo Split")) + self.skipsplitButton.setText(_translate("MainWindow", "Skip Split")) + self.pauseLabel.setText(_translate("MainWindow", "Pause time (seconds)\n" +"Default value")) + self.checkfpsButton.setText(_translate("MainWindow", "Max FPS")) + self.fpsLabel.setText(_translate("MainWindow", "FPS")) + self.showlivesimilarityCheckBox.setText(_translate("MainWindow", "Show live similarity")) + self.showhighestsimilarityCheckBox.setText(_translate("MainWindow", "Show highest similarity")) + self.splitLabel.setText(_translate("MainWindow", "Start / Split")) + self.resetLabel.setText(_translate("MainWindow", "Reset")) + self.skiptsplitLabel.setText(_translate("MainWindow", "Skip Split")) + self.undosplitLabel.setText(_translate("MainWindow", "Undo Split")) + self.setsplithotkeyButton.setText(_translate("MainWindow", "Set Hotkey")) + self.setresethotkeyButton.setText(_translate("MainWindow", "Set Hotkey")) + self.setskipsplithotkeyButton.setText(_translate("MainWindow", "Set Hotkey")) + self.setundosplithotkeyButton.setText(_translate("MainWindow", "Set Hotkey")) + self.timerglobalhotkeysLabel.setText(_translate("MainWindow", "Timer Global Hotkeys")) + self.currentsplitimageLabel.setText(_translate("MainWindow", "Current Split Image")) + self.widthLabel.setText(_translate("MainWindow", "Width")) + self.heightLabel.setText(_translate("MainWindow", "Height")) + self.captureregionLabel.setText(_translate("MainWindow", "Capture Region")) + self.fpslimitLabel.setText(_translate("MainWindow", "FPS Limit:")) + self.takescreenshotButton.setText(_translate("MainWindow", "Take Screenshot")) + self.yLabel.setText(_translate("MainWindow", "Y")) + self.comparisonmethodComboBox.setItemText(0, _translate("MainWindow", "L2 Norm")) + self.comparisonmethodComboBox.setItemText(1, _translate("MainWindow", "Histograms")) + self.comparisonmethodComboBox.setItemText(2, _translate("MainWindow", "pHash")) + self.comparisonmethodLabel.setText(_translate("MainWindow", "Comparison Method")) + self.alignregionButton.setText(_translate("MainWindow", "Align Region")) + self.groupDummySplitsCheckBox.setText(_translate("MainWindow", "Group dummy splits when undoing/skipping")) + self.selectwindowButton.setText(_translate("MainWindow", "Select Window")) + self.imageloopLabel.setText(_translate("MainWindow", "Image Loop #:")) + self.pausehotkeyLabel.setText(_translate("MainWindow", "Pause")) + self.setpausehotkeyButton.setText(_translate("MainWindow", "Set Hotkey")) + self.loopCheckBox.setText(_translate("MainWindow", "Loop Split Images")) + self.autostartonresetCheckBox.setText(_translate("MainWindow", "Auto Start On Reset")) + self.menuHelp.setTitle(_translate("MainWindow", "Help")) + self.menuFile.setTitle(_translate("MainWindow", "File")) + self.actionView_Help.setText(_translate("MainWindow", "View Help")) + self.actionAbout.setText(_translate("MainWindow", "About")) + self.actionSplit_Settings.setText(_translate("MainWindow", "Split Image Settings")) + self.actionSave_Settings.setText(_translate("MainWindow", "Save Settings")) + self.actionSave_Settings_2.setText(_translate("MainWindow", "Save Settings")) + self.actionLoad_Settings.setText(_translate("MainWindow", "Load Settings")) + self.actionSave_Settings_As.setText(_translate("MainWindow", "Save Settings As...")) diff --git a/src/error_messages.py b/src/error_messages.py index 4eb88bd4..17dbc54d 100644 --- a/src/error_messages.py +++ b/src/error_messages.py @@ -1,109 +1,73 @@ # Error messages -from PyQt5 import QtWidgets +from PyQt6 import QtWidgets -def splitImageDirectoryError(self): +def setTextMessage(message: str): msgBox = QtWidgets.QMessageBox() msgBox.setWindowTitle('Error') - msgBox.setText("No split image folder is selected.") - msgBox.exec_() + msgBox.setText(message) + msgBox.exec() -def splitImageDirectoryNotFoundError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("The Split Image Folder does not exist.") - msgBox.exec_() +def splitImageDirectoryError(): + setTextMessage("No split image folder is selected.") -def imageTypeError(self, image): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText( - '"' + image + '" is not a valid image file or the full image file path contains a special character.') - msgBox.exec_() +def splitImageDirectoryNotFoundError(): + setTextMessage("The Split Image Folder does not exist.") -def regionError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("No region is selected or the Capture Region window is not open. Select a region or load settings while the Capture Region window is open.") - msgBox.exec_() +def imageTypeError(image): + setTextMessage('"' + image + '" is not a valid image file or the full image file path contains a special character.') -def regionSizeError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Width and height cannot be 0. Please select a larger region.") - msgBox.exec_() +def regionError(): + setTextMessage("No region is selected or the Capture Region window is not open. Select a region or load settings while the Capture Region window is open.") -def splitHotkeyError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("No split hotkey has been set.") - msgBox.exec_() -def pauseHotkeyError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Your split image folder contains an image filename with a pause flag {p}, but no pause hotkey is set.") - msgBox.exec_() +def regionSizeError(): + setTextMessage("Width and height cannot be 0. Please select a larger region.") -def alignRegionImageTypeError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("File not a valid image file") - msgBox.exec_() +def splitHotkeyError(): + setTextMessage("No split hotkey has been set.") -def alignmentNotMatchedError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("No area in capture region matched reference image. Alignment failed.") - msgBox.exec_() +def pauseHotkeyError(): + setTextMessage("Your split image folder contains an image filename with a pause flag {p}, but no pause hotkey is set.") -def multipleResetImagesError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Only one image with the keyword \"reset\" is allowed.") - msgBox.exec_() +def alignRegionImageTypeError(): + setTextMessage("File not a valid image file") -def resetHotkeyError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Your split image folder contains a reset image, but no reset hotkey is set.") - msgBox.exec_() +def alignmentNotMatchedError(): + setTextMessage("No area in capture region matched reference image. Alignment failed.") -def dummySplitsError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText( - "Group dummy splits when undoing/skipping cannot be checked if any split image has a loop parameter greater than 1") - msgBox.exec_() -def oldVersionSettingsFileError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Old version settings file detected. This version allows settings files from v1.3 and above.") - msgBox.exec_() +def multipleResetImagesError(): + setTextMessage("Only one image with the keyword \"reset\" is allowed.") -def invalidSettingsError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Invalid settings file.") - msgBox.exec_() -def noSettingsFileOnOpenError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("No settings file found. One can be loaded on open if placed in the same folder as AutoSplit.exe") - msgBox.exec_() +def resetHotkeyError(): + setTextMessage("Your split image folder contains a reset image, but no reset hotkey is set.") -def tooManySettingsFilesOnOpenError(self): - msgBox = QtWidgets.QMessageBox() - msgBox.setWindowTitle('Error') - msgBox.setText("Too many settings files found. Only one can be loaded on open if placed in the same folder as AutoSplit.exe") - msgBox.exec_() + +def dummySplitsError(): + setTextMessage("Group dummy splits when undoing/skipping cannot be checked if any split image has a loop parameter greater than 1") + + +def oldVersionSettingsFileError(): + setTextMessage("Old version settings file detected. This version allows settings files from v1.3 and above.") + + +def invalidSettingsError(): + setTextMessage("Invalid settings file.") + + +def noSettingsFileOnOpenError(): + setTextMessage("No settings file found. One can be loaded on open if placed in the same folder as AutoSplit.exe") + + +def tooManySettingsFilesOnOpenError(): + setTextMessage("Too many settings files found. Only one can be loaded on open if placed in the same folder as AutoSplit.exe") diff --git a/src/icon.ico b/src/icon.ico deleted file mode 100644 index fae0f994402385bfa8a70d6c031bce929d865d0a..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 33490 zcmdSB1z1$w`aV1}f*{=}B}jJ&lF}lf2#SJ$q=<^rB1jFL1BePLNC=1uk`f}_A%Y;? z4bmbV`&%3JcRU{T^*zUP{?|8`+qL(enYGt_Ke?W@1_T0$Kp|vh5ujy6aL6MNY>3Y< z_}UxXR|oevz%6i!K!XFmzx$F!Ajt4PAD?d^5D)|*!2!2lZ~c)L6GDN&xZxu)FIdSi z1-zn|Qo&1@s>63NwIZ)D^+(z;4Wi@Vm<7iSIL3DG)ru5js)Qe5$^>mNuX$xL>1cAfv)7MVE;{6u;pTLhXAVOf)6cCu_%!Iq+uN3mb)E%kBG>T7Rnk6TbQ@vvw)L&Oy%JaOd;QKOd1;*2FMN*O8ynbzukU=|KIN8+b?1+0o;%Z z0*sLyQ_QcAsS(Ks<6rnKyuZUollZ4y9!mwTW3o8tFjRnthksTlzQyyq=NRxoOdcl! z^OPA6$mlH4?NUsW#M)oV_^&Yk?EPkmExo?I5oS3&>~02ny)cgo4@?KF5fE;prz_z<#0f@MBCm zI~69M`@g~gtY4TUpl4-*fxySD|0Q;K?C+&_@pw*IL9WaG(5=l#$Z;nIa)jc)9FIW@ zA78F_Vj-uk2awB35ac;+3;Fk-g@W5;f1ocv;GtP!8*mU0{31Cfhx3oBz^=WAQ(ys| zcLZ|(3;z!5_EE^c?+k>VcLtd6{{!DH&Ny)WSI1{QoVFf9ZXZ1%zrpiR@Ov51FWmPJ zuz$S=>j7*FPk@}#zh;I185O&JenA}pe4W-`+q)zb)OmbYcK?j~ukilr{dmY}J8IWf z0=w1zngiG_O9ZSjW(XvR%l{F0i~xx5g}ew%4i_hgyYGL=J&=um-)YG8lm8d_!ZQ37 zuD|;d=%pHb7FB2C*&;_)<8h{pw%- zrTwh)&g*ynN7(|1$2#EaI+TFD z`~8ox|APbPwJ?xVocuWl?<99XymrDs*WsM)w>f}g2Z$l~z=m>uF8ia9=Lc(m{p)!C zX1fCHWi$HU|NicC<01D2*Uve^zv$){|5Oj=OPL%rf5#61xg$W$LJG`jew^Qe+y;*C zyZOv-$MkRcc?{j^bA+76y#RhV|M~X4zjyAm9le`V{?tD=fx1I6zaE$?0AGIaFLeO( z^bnZK8z3+hLLQ(F@natY@;W%T`JA`?z43m=3h;N?LC#fr|3M#LpBoRkE&1%`*FV%% zI2Ke3Ct+?=V1wN7ukpiq?sH}$5buBD_as41d+I-sJv?rJf6y6neIf!mE&u0n1J;4v zyx?c^g*T$zASXVE$>sWM{I5a2^NNQb6+dW3;R_~2n zKK>IMfb|ePcMHrnev%V3Nvr@HPyxB|FY#mI7!W}22oN`QLHykO5&qydxj*3ZK@6V@ zhTQHjKrVSIU``YZIQXj1|4thZIj`N`&AopZ4`Dm55W0!!2erv$rk`@KYx{7nUwPQ$ z$NmK9KA6M)`+n~$Hh_OA9CCZW3b{oxLrx1J|Dis`fjI)OfdTEG&lPJ#;xI-C6ejiO zJ^+)-g1~5i&(w&-{z&$4?ZS8H!k0PhS1kWd3+4u^k&s&)ALQ;w3^})4{R1`-2YHWQ z{yF~oBgLS0fe+Vje)igp`*HL*zy@Ca7{4UsJ#pnfmesDVZ$?3`PembjFMP-~O&W6C z`cHF#$B@UY!;j+?oEy9mYXP|+)vxk^-5N(K3n7S=>qw`1j-9H@dPN1G#3% zLhjxKkXtxC_kGP^O}d!>6yV^O*mv<~ zf*A0El@$2E>L209iGRR2p9n@pbq}m^{>x1uv-Hn263?H zhxlPmK@AL!x4*;>CfsQu%8X=QUz z58ytmFYw&>*R?U&=il93U;d%bhw;O8k8&a3-F+(0e(m?aV*lF0^F%NorUp9jV?Vgd zujFpc;nqgPPdIoCIai+lvHu4cU0$64-vfSb?LKs?-w|@jSKFKnpQZ3+UIfQdzyrMg59(sD|94F~47pUmHt@aQgRwvQoa+G_{3-Tk33%VNpe&vkxxpv(Uf`(gY*#*XVhi*qm!@bM4qu)V`P|Fq8gbu5iyGhqLv8mRez zbu7m3Vg0RZ`1`y0KoP$wh#|jN2Zrqs_(ZTr0p8aG+b2B7h3ow8!Ib}sAI$gMVtGIv z@Mpf`AGqQC#_glWuYKKD>~Op*6?Dg7NU`93D}Um(J1>l-!vVVB1J*+~eys;!uM^0R z{J`3*+b3V>)~GAw7P9|e=Kye=f5-~vd$+%nGmQJQ?BO{Lyq^O0FP~%F4|4mjxZxJ| z_wZiC6lM~*mh~rJyS1_B%*3FMe*b54qkrNBTFK~awUIq3mh?1yvMtzY{M z=s{^jlefdk(L2R|#i={dtTaXF*^vWPcv~mmYWX0(gE@E*K2_!SZj7 z@9S9M^{KCGRPeeaj1TtX|91~u?_&N<+;G3JJysl!19g2GOfkUjL-1e2{He6X|0{lW^t&cow@ z?XO;R2XFyliugWr@QMcl96>-v5bzN{uS@){4ZtzIUi3ZiIcT77?3f@D6p;J>2=zZ6 zv+G+6`J}*nVDX=99+vZ0S;PLT31F^20@oejc>MW*&tX1bJApZA208-AYuFEd&jWnF zNn#b`Z@oazo`L5Yg7{01@g+oJ9{j)g-3KNf>m;!unIl2m3S+;8T==tQj$}^m{Q4!U&A%KjiTL;%s*h zH1q(}#)U)wYA*Db+`wFYt0%j*1GvcLf`DCjfH*D&=4`|mAE4*SwEva;?0=U-;NRf= zQ~N-DJpZ@weXkF{y8b8I0sA)Ly*KrujezSU;NvARbzmRwU(~JtE}p;p`CZ?a!$l8l z^0V*z6`nu!9;_pkhl4PX8T`A8zdPhV`gvfha7|PM_^$c?^L2j;=g<0q{YHh5Ev8fE zm-}}9DA1pD27YS=*8vU!|CI+gm;(NL{g3#8pJ9jZf8DoL@#}qCKN<2Ly^RSWM__b8 z&X>kU0&*T+;J-CM-hB)3kp%pD1K2A*@y9u76dM6K6+3v|AI0(~I>Vd*Ty!5sVD3<3 zfjTJ}7$Xnh6 zzkmP!ncrUTu1CBDdo2RU;q`bj;9GgY++7QB;sx^Emw=ODkSh;@y1f+01Hb+1A36U9 zKhhoAK_I|?5VVFs90cz`g9ro;+@irB4uD(uk?s(*1-CN0AKU%l0(?!p`|;f`l)~40 zAZWJ*Uqr*#poJUw&kTHN!PDTE``322ThQ@$?Ljaa`1P}vc=z#O0RL|LrGMg|J?G1K z4t_T-nXlvi+J3?1{uST<;Vy-T5Ag4{fR{n|8W8)Hx7`OH{0FbQ9RQx;_hH`Q7JO~D z1vKxr;O*TOG`s!5*Ms15KWgFc!}sBScU$nl-4=`p+y$pQpxp`3P(MzHM}r4GMW~{z zcp5w$oFWmpdqJab`}7j{GZJbligH?x-Lpkb(exb`1~-pRXtnh@pSfuf$(obn7?6FR zhs8ULu!$h-IHRC9$$ldpb^<5zl{zmR0zF@bh*FY%fiNtTA{+j`6O8=c2qvZgQ}gV? zW4Ra4N95S&6>M7OMB9yr7UZ>s>z-CC$a_9FyWu8%-QvoPM|x*VmbctWm}~1^A#)2| zsY;N{trUqSs4^lZaYojg%2kc>f}Y1dgt23W`s5b`8KrDjqgo9%d@FUG%jSf+vBp|KOHj~IwCTjv&7M&Zc|1RA{#n~4b5^BG3lb|%y1a)<7#Nl27RoGCmnNB$5$ z+8^cCPSelIGOEhxB=K<$Nrn69tb3%I+gm)*?Ye7Q_;PZ})!s%?VQ;kZY&1A5&k{M` zt56>koO7hO=cmD^OzD0hSPyF~({+jk;>26S8FcK9wb?`N;67x}Q>^ZMOnfSHDb!q$ zw48JJM(^4S`K(i_D{56QT8x!mUDKZ1@ZPqi;2J!eFM{X9_X?%#6H=I7iG0;IU^KIq zaNhICV_|tY)oMx0t>C-8T=YcBRnlWwIV081Aw8rHINpVe)1uTyQxsO33?+2yPW!`- zyv0EN(WzM@q2`%1LlGQ!W%*$g9wx+-RnuCo&JJbiMCV_*|4%&c!d2ju&HO%~Of&t2g!=5qvI%7lLy^ zwAiq`m?{Ln-Z(uh7-im4Y(@J>A4$OYy1$Lo;h3iCksIEwB^q>LfqID*24h)`HV5pa zr0#`hq#vuP=;UPSsiTzrFe;8FNa&Ypn43_rLux+NAj`~{C-IE(89w){lb_zwK|hxx zoq5L60Wie#=<(Uuk!AS>x7sDdm2hXo0h0;IOM)~*RGj!_-eEJSOI%U;C%INq#Ar*7 zIR&TbII#D?<2$aRYSJEo%g#5=gb?2$ZOHn(42y=jW= z0UNyhdU`TrL;Rk7nsk;CftrKYy4AXCNAconW^QTo%!C|2ugvCS6d5*SH|)By&86Oa z{TyFHh~J2#jmb3*pKT%KoN(M;r8LB8)>9}0_STZ4YB#vC2opy%XY&_D_tiDZ+v*+f zT;+&t45{(|XdSIChp{(G$kVqc^GGN6Eb){gy-)QDCxfBbF5-ch|ohBiv$`AZ|B`5EaxBbsEMJ&D8VCk*^!XkMZ6{ZE#NG`u&s9HXFe z?3nTsA0zgMUIq`m>WAX&^XnGxpW_p$shDD$ROFkP9&tIefF3Bd2~xbme&@JgpI*8%a{4So%c8`CH7U7Bafzn!c88=<&LR%`T`Cg_9Mle^EPgGl+Ql1lQ2#djWY#Hm(tJaSV1ykQ46{%e9_XG&9-UM8 zL}ScZDNjSIPtY%=&PS$I|1RzuN?AODYl~N2dxR75bA(<{TC)=hy&It<)i$_S3*JOaZS zk;KJ}@1qaT6DAbkn)8jm9eDd?M;7S;Wo+xwInh>qM1qqTUWOB{Kt9l@*WMQ`x-Gi= z2@+9=464+jG7h76<9J3!Q!J<&A0wPmCv@Tg9c%=8ET2fsbjhKm>==4vcwgO`(gFW) z*1a1Mv=!&+Z4@UO6TL#PPcYQ8Hpz0MMT=ve1UPcw)slPc3Ctl`S8N}R*QX&!MTr5| zz3x?lW#K4`^J;m&*s!X)Zcwx3g1~|XupobePyH!5Mg+vikvA+3)J3@psV1{m=w{H^ zW8Ef}!|yW~Z(tkcHSjSt=8h%2FASuG$dHQPqkg{8fB)90!)vKbGZN_Lnh$6t3L&dQ zArJi1_g55^4ye^JzgkGHC=Ci0jDANNI_2+bJ1EnLez%;@v!5RS7KQw%slDuBJaLOd zAyNK*FNT;b#INzzWJF^{kSey9nx;2l%kb_sxEK-pWNL2QnBF>4@6bH{Bz1~+-@}m7 znsW6?g-*8jOsnS`sU^yH!g8dDqEQk0)J26@>?NYqD?EZg8(pY%8Y2_LNX0T#8c$^U zW*jdI7(DerUx zxkpEBRXIadc^~Bphd=N3v2wSmDDs*enV>=KOeZNB4uV1)1bXNxkyAI#Rr#c%`vi8k zGp2D*;2M*>{&;&}Jv%L1e^cR+Dzrel zq`G>449B8%%k75kf=nyrt7x-%on?Fz2WJCiA2Au8v$gs7r|i{P=5`FyHn!^{^Q~(? zJa32{n9rk6YOPj621yL(zmu{gB-U;8se>gL1h6N)Bd(XkJCBvHkO-giuIq+hyWIkcr)!C}OQ zC-y`^+FWFnwqm;c+IxmptOocJ_EPJ+W3i^Fj)i z>)3?+xE*6(6K!s$+#Mx~1sw|O^mkj3j`VfmQ@8N^TaHs|o0H@SQ2Wla@!GTWZyU7bW#vLHd&L!OVyzyt3$= zPW=O){Ngnb2+@JVK_Xkq*B=g~s6Tn>A7r{>jd_tbS^k)Yw5hU!HwHT0H}b~!L}$8^ z`4NO1zNbWxaa7ZE*s5NGpGSi1LTBDYU|b{t1~tis;wE>owpT+1l;)VM7!exJUn_d? zwwhZscgBEo=QOrPV0`wRsOLM9-1wps`-PpP@YbHT_3m+@lB>{ll+xZS`bL8jL7tg+ z2e-GiRdMiM@0vrh{mNt475p8inin_KG@jb07QW_kXnG}eq_|{9DEGp|wa(#$YHQ*M z_wYb*`tp&1+uWYhW=|>5L{D#>l@`eKij?%B&8M~4_u9Rf^iqzQVfN!EXEc-b7wR>h zI`9-#kn}B%zGGS=T$mQ#Vv7|Zov-|OJFY5Pua>fGSwJ{_G_5fR$dT!nV__#(-#>GM_B3d++G?h&|1;)x|I!~~=8+HEDN zGB4Hi=-L-IEt;qqrdIK}&GoMyOklb!Z*kk9d2~c#m|jQP(+D}3Y1Kek*0x^)8=d4k z$ZHUAkP9O??3lUS&U6G1*S@rn$Vv6M)Kw8;+6rR}F%#aJyA`5HE1be*eXFYOj^R#& zS62o+Fe)9)mw8)oAG*B1+#fPFg4_LyEMG_=34yrOe;8jQcVYSTqW-g|_T#OO1bvUE z4sq+m2tD-4ILY`($5B%1U>T0bl*omZx6-a1-PF%tMlPaa`z;WDtEoHj+=5F@0)bXuaFZZm`4u%9l2G7OfwNtAyw^il& zLuU{B5yj{DU+1+I{^TSXA#*2?yxk~tG;k2*dk(43O^>aC>L)BL*qo>jBEQ9*S#*ec z1Ict*&d#GW-7Yp{jnHH)#t%DXf1nfMC`bxRZ;rqTP&m*BUfp&6%z(@>#6&@*MZ+ z&F?Su)k4sh)yNaBIn<0KbB(;YTRnWy@U1mDcJqCOyofdSgmovTH5RHOQgUxvb>thm zhgFM=pSrlQWX8^}g?zwjlNXu2H^vem(kz98!4A0^o2ToTj2>4ygQ8VMrrNF>rqa1R z6D!A0iPCUNEwNdo)sSg8-8|}kzQM{wy!f`fCt*C|9P5T^DJ@-SZ0ZStGYkzuj<$Tb z`*z+cZhd;?R4iP)?}(?Uz$d)8)`JKEPAn)-dl=KksdVlvG&X7^EIc0ns?=3tc*1+I z0)4>Yl+n{O1|TI8r13UVQtsDHT|B6Cnwc^S+?l#rDV{`PATxw5>>fK^lvp;((5R zN}?39{q-cf`4nUD5NrKV2RFG?y3p;KP3nwWZbN1}SDDFkji!V#adq>$4eoo!z4sT7 z4mKa1exQ)eNYcKr9MUka#nxrW@cNTZO1#O9rrrYYf6-iLyLm4e+ zueLiVMf&We*O4E1?5fszMA74zU+!V7Dw7-xF|}Y^;@Ciu*zkc(f@(Aq)mkm?A!gi{ zaip9NZzqzfK8#O1pn~Gvck;NnJw=5^k#b5i6HhGLRbIPLk*#2~X+Q-cRPa6Px;blhd{@TUnBz9*UP<3=>aMFj!VbdxWAXRL`* zSd5k^=T9Arq7Uur7Is!;zLNeN#~zC_CemsjjqkYlNej(ZgBI`WK>;RmhKtSVLjkw= zT$)7vdZq2mu&v*PpUbH1m)Be&LtJ)QN80Q9qY;Jb1-8LO}Zf1c@=kJADL){bc`vW%W^P+6(&IQ!91hUuCQr;Kg(d9+&R=9Ns^0Zv4)E#V+&Dj zb!Fr`milwb4T_qk5em{bOX6+#s5bD0=3T?6Iy^khoux-EE;lXRHM8TqSU_QGRM_|+ zq9QX1bxK4(VvmTmfrpmHqri&B_Cp0D`=XVdFLX4>QlVblUB$E1CbCLVw>3A5_HepW zfI4kUAo(2G6n$+mb&3tsN*W7=`=7#o0>zrY+}l)Ap`ku0Y<5bw8t)-}PS|W)*kjXu zIi($Btx#ysVTrR|r;pPGyIgJmSO@H>?P2~VAJyD}RL^*iC4@vm3Gz~+Nv_me{CZP@ z%AQurt>+e<=kf0!xPJJ2;KId1_W7GUCZ{cI`a1EIH4~XcEwiE5g+c>{QPpP-5E=0>VqZ(~c4^EtGkE#p zZEk&%=RlRtWt_U=g(_5Sa3QiUfx01NXr+!Sz3@uF#0io8i}vI9(AvHqSfcJV@cT&f zR}zJg)z*%b2=yh#=D6I^8|2MVxvK8_dV@#c!=#~W_+S(OrV z4!_tG^{mE*NdaQD!X(kdAC_)NM&_GlsZx5g(TWBWL5Sja%nFMG)O6b-;Ct+Qc~J?$&9iXmjer`eUN!nx(ANywbaJ z-;AGre_``1sca(oIRr`-JL-bR2cv+fh?U^A!fPF5H&2Kho+ebr&QZ~dFTaTz*jJnC zjC^noLEkYz?g{D84bgIucUer&R&R)6)(Y)w$nw-*E~JfMV-CrY1Xg05_V3(N+c{gv zL$%*VNhdg?w)={_CO24P19=q+ID>kh^<$?JEedGA1H}Iq3Z*4^&^}w4!0ZP%kgZ(9(BUu$qZJ;B&_XaL{E ztMM{Nm^gOxm5-#Q(?xjce4*y-bMu$htsY%o6zTbJjZ5jM^OPsaOZD+=UHp*1JS5Ho zOJ!@|ayl#xFFk+%dg2{^G)jx@z7~-T(TvXwr^g9S^jXn~2O%|~=h!&RlR9fq$ISBW z3d$Zu(Ta|KOh48Wnuoemu6d-5Y|x;UH^2M*No#I1dI}2-x*=@&1=IF$@mTINc!*Nn ztMZFaS~zg<4u~gpkVQV1c31Q25zSe+IB)v)oby>~BNV73sNdT6(m+xoBLC8$MQ&Ty z;bHSjHx+8{X$;;d<<6$UyQqXrE#OT5SnpzSPGXD4X0?AQ?|qkO|D0a?tFfA~Qk9`s zi`p&92z-pgyi7Xw)tK>=ymoPc{Zoss1)tvcP^gmF~=;4L`+zwB_xh5=yPh$Uv1nZ^+Q>9 zjysoAxd#m%o=W3jBgc!YI7}Zp&k>r?V!1eLDR|Uf?b`Y#MzHysp#U;KEDf&ye4OT@ zqm4)CBoF9q`h}{FQ(@hn;_wZci_gq3Yss=x6KZqro9zMSyO1-uSY>~6_%8mKU^R2B z=!dXVcy+B;(%5ehm(o0M8QQE*IFaOPn@(YE{kV~r{DtD3|t6@XX)YltFuM%@L|Cyx#rA2ev zQrnAT#RtlIT0fyqpFyOgLJfU~`1vo!Io|?CYxg9|wQHh;>^2paoF|iPGU=o)1$xHC zs)$wWmi)q4x-x?}*8{^D9cPHU3fO z0u>cjof|oO4fX||og?vl{X)gcQkKi)rreC-_^~Ux?)brui;SU}@)CrsZsm{AAGjW& zFBltK#SNjOc3C8?x;^4qRUn(*+MVun0Xwhn8i&(%!%n(iAG5TY$8d4$z4s1#y}esF zVg?46Z#QkCnXjZWivZauB@Mq05>aZMS>oqt$bRzh8lT@Y+!92&KyH>w{Af}(qM+Tt z!tq1!U_xxji|yA?^;ka+3%;7oqw-rXwySjTO+^|!`lfUseCZOj9-FRf`g}f(%fVKh%d&6sl2Bw7WM0BTa z5k7N7D4hupwBipDU^^4I&6|-#W;^|aN;Pp)HP=g>+giTEF4~bw_M(Xel-b0wGr0{U z5!R3_oi6sedGonq6Q<8yl=;jf9s$i@$9DUIJ;!BS)$q4f^0903vI2VJ*|mrL&V zF(Z>{t`jvyo_D=`h}wu_*kuPr+sVnz8h4 zpDsXr?bS@O=h|B>620}z3C2uvWfFQGEZ;xJ>u(#cVf;GGWxKO|v>dI7Wdqct!_h2e zHYv<%N-spIL7Jc zF6r)Bmzeh8KI@T(o?0%Znewa{H+N*O)Oa?h=^fLYfIOrhsfBTqL&NyVBW?91%VZ_Y z*K-r^(mCJ_QaL?APsj-w$eKLnz;dPwrB1TRFn0-4tbB7>@=U~2XEviAcJd`+XUs@t zU5WgMqsh|=uaCM|7y5AD(MF#3&^9~4HP>P+r1!~H8(wy}O@v#pPoEf zP?)7rrLqx5j2}$-cnvG|B7ae_bHa!n(vJ{-=5?Kb;KQOKC`D5vVtZs(D;Jxdxc88= z&j~hy$rO~%v#mQbH>KuInD$0e*vuFrR}O= zYm&@Z6kJ+~!}lZ-=aXz*R}tP=Opa;VCK6XxOK3Oe-!{vUQuophueoi!4YQl_bWt@i^X26rz7pQh7zA znT4d3cVFoC2N9}HUBU-E#{#IYJQE}6WM^rbTg};cf;cz3J#Q}+^XTQ~L34YN*FrR# zH}|2=`CcQ~(=MNL?UfnZrZc3S@RR^(oK|^HyF6O^F%PR@vcg8U%mYQ-1-j(gx58PF zqy>`vs8m_rK`hb$2h<9!g|WH$Oh=qM4|3+|Uad2e`){a$(Xz8dZ8$wD=0f`$1z%e$;wUqcYvj_?HmZOayk4ujfp^@K2HTNfe z;%04Z0g1-@_W7+UjufwR1kU3<;4w=ccW=DWB2LQD5L6h^bSFO3ut+|j^Uf!-ezLn{ zy<{WuAA3(9lr-O@Md3P#Gi-*(tn!;l5YOsnRx*?daH5MOud`LVEr)}d)Dx4Bb+UQ> zcZv8f^EBsebQN=;K~~V05EnB`(HTA3++_KYpD=IsVTZ)UN9Y**ru_5fmu9s2Cu4YC z7SXW8JiQ@htxv>wf38DhV;s3gn5fY^M5R)=>xhJATniryk)V3Y_X#Lbi@3Z|Dkgstu%XyF4@n3 zzqZcH9?QX|m&uBif9$z@we9;*MWX=erH z4j#E>p;Y6x?CF_xjngkchASBzMs)LKV#8O_V|hfL)5YG#W~?%J9rp7&_nh~`Nln?s6pQ1ZJ5 z*Q1xoxjp2}HLBhEI7YA^Ii7zNxP<5--JZgq48mzn8&R%$@jNW`_@rvXMNXRiLCXA>lh^>p786F51c&smavULu}ejjl35aXn$YDcCG}QE6q4nU_YD4 zTO>g-PBZ;xj+rcY4ldb!pwrrs5)7=I52lXG7xClC;9f6`$ioh)K;c(4*` z)#R ziFL$^Cg!LWFHc%?D7)XLODz$d>8bu{2Ei#O9?Wzf-9Lx*saGj>OGsWdms|9_slEdN zt9eF?hTHuu9<-%G(6p@rzm3#NLxyutb;eH00p3YP?vp-kyfL)sLW(A*5{4~Cs#+GJ$(L06lr=LT(|c~#P$NCk{4t#$hY9WFJR=*rU0}c! z5+6t4p;@ORjy$c2?%XrU3WSeRZ87G0M~@&Sw$#|80S#0kcuPvsPjz%hs%2ON4S`x7 z&dUBLHN1YI%5QG4F^*&!W^VHDpBs+N0YZLkdR{$)MV3pSbL6dVUj>EYJS94jjrEL5 z1VRldVwGW_WE$TV($S+P(wwsr;#rsJC{{DON$@(ChU-ykFhcjydGC%Jg!te(_axy? zXS&7COeMBCWsUWd4&r${Wgm+0DMM$Gt;(ZCo3DxniYT>`6j%TaAF zg=Q#HykKF-Q~H+IS8|2cvdiK=UA9!=rZe!GL`c$LJQdbwQKrb_y7hBLU60qa25F(0c28#G!t8_YHEtC# zv%XiSwpQ

|7|i;hIpJ>Jy;Zu+!&tqr^D?!4;y;*U;BUzOT9nkEl6&Z&h*;XRCAGV~a37#Q=J2AaPPg-Qg@AbRVz~PS ztU=DG%e9;o%60yC9WS0m+8aC}jo)xje1}JcS5NSs2+bH$;$^*UR@&}R_(=VlyY(sd z+ySziLpLm|3S1N#)-^A7JWoDKZ8>0WJ+_f1l6sfUi-PL(T~&TPQE#1u8%ZqQOR5VN^Urk# zfi&{BFIBwdwHYRCx0>aD(&N*4&F+Fqs+Y5`-AqT$uxe0vL^I2$;VQhi;JDo!O?Q!P~kr zN7hLvAFt-7CC8Rk3SJ*>5%VA6xWJyvcm-E0g*WXANx(?u9Hew$Ge`QgpyUB*cQ%`>tn4FTbNdmdkKtxHEm(xK&W{Xz^tr*pSU0a+y1l&#tB#8ztdcKWeJ&#)zy~ z6zN2j3$q8s*J$ckQOeGo%e`J6|M*BpM`sqPplm|U4s%@)$dCt=O-tG|~Wx6im!c&MgVw#5_Dk zzOxoOt$MsSMC1>5R*2k5l=L$?nx}@qS$#+-zA}Av(tAMMqKrl!|0ummuO2oDRC7ug zizE}(d})EWYeuw>uQJztc^*^a)^#t_P@H<$;=!7vIj{6Z;Pomw)v7A&_8M$DvGhS^pvni_1pm%@KLh8=4Kx8NQ5liTW3@G*4eR zzek;<>XE+mvc-jh5RY2u;8L0%-ep23}_#R zG(@}4L4$5z7s2-OH*YaVSEg0><1fpy7A*JfL%uyG7h#7$`1NE<8KSgKe*fx6i}+G{%Eb3paY4}S-@P9u47I&i99jZewF@Z zx3+ZHd)@mn88dY?ZZ85D)e%R?kBI3eV1`CLR##UhR<_RE_sr%ImQj>@hkto?4fWLOZgdbE2C`XD?cwGIv(Pr}9$t zBPFJ*uB?#dTb)zgmp3PJ7vITwdCWg}FnXTlmRIoJ1aS-AiNUQ9J^sm}y5OEf^#}e+ z;gZPPly7n#ZB-Say1{qb%ex(=jc?9qzfHo8JD~D*ookUEksyB6ex3+xs)ahXi$;Aa z?2HN*0-eo^V>ppMuZvrNk+pzaT}HK~fp+rX1fIKl4W;2{Bz($cg!Y!9$-qHuBXM(K zcJh;0sGwp6X02D)uL+DNq|iCmbosO6E;Ai%Vm-EGClRPgbTbXZMy<2+^o~L-1v=pJ zeShYHWDzxOCBzG5fsXot!3I+AR42LzIg3tS>z(P`tS9oQMOJX?81V+pMf6yOb-@MO%hRa7b$ueyt4E$%>Fxp%H@rOWwAnGx1( zEG{{xAwqx{9+RYk9WYPXk3OHaZ;gLo9ee~Ax0JZ*A&w_S5t#hexLtU#o~yuoLVBlz zH1vFfzKolj`;oUJQ>-YD?@-c+B1l@rKRH!tmKx9g2BpnC$Pb-qz9 zTL;+@#0Oo88{M|HiqF2)sn|!qs1fdjK$qgiTyW-WUcTl(R(cXVv(2$!DvOTg;A!9ME(zq3128eUGzeXB}>$nSLb#piXkp^QRb5*7USDJ zib&!~#Z!2bQiTy<>GAbY1p;~5bw>(4*O^`f>)T^qsa&177k4_s2x%#~kwWKm9( zUs=_4)xPe7*M50N@G`3;XMO|Ve%&F4;FH(d3HX6MA3?dfl0*->h1Zv)iMZXQojNA) ziGRlrivoepabdc)WOP@4e={!YajGENTWT64HIST?t^~toj(F3KArX@2B|U>7PoiyT zdFM8yNMZeCpyNXdYVs-{y=}MmmR)n?)p2f9kAxtGrP)z(@$==xSeh(hLb*F*Ccuns zbp{ucP->jlm}&R8d6}86<#*J~mhc5QA}mQwg%2*$*3Iw5jbq?qFyOG9)R!fxbV9!i z94nnGoSV1B9ZoA@o@mM3(WEUuvZ_~6BJbYkt}Kg8l@OX)y4@6+P^sh-Q-i9Bz>B_O zsm~urkNeX1s3cF6=vZAzLp-lkp~i`-jXi6G%}nmlTGOY2Z9i`*1o{rK^*O&S%z$z( z2d=~`wDQMNmn#bG*gC_;jD6(ppfqp6j6Td8nV>eM<4!KuJenx7)%Qkk(`uWEX?I^_ z_BK(5Z^>$u)IIwkflA`lI>@ucEN5b7vQtU9MDI$5#*0i@Biz^sqgS_K>ug;UQ(m z;Zu0Ms^fD@r=#}Ey(y>FD7{sM&O;#JvZcYh@H0IcM-*7Gc~_5)w_}I zlL@-xEXuOMpOsMZb6F4>s6L}&AhBqY!7kHuh5lpNijXFamFcQ|B!4t#Yo~050=|LN zrp$yqmi6V+XFUMycBVfm8i42%|3^ud$rl9eC#6OycPeFR?9Z>!Z|-w(E4Z` zVcokV`5Ejd`MwVHkB>mKYji9Y+f3Nl8J=T1wG-(*4bNT}nGIG@zrA~=VP~8rlu>$Q zzPOcASK?@gp>Q?y(N|wRe;oOeO5BWKo-CZAdaN>0f?QtNCB;eGBA}-AIX-%69o-c3-1!QhTgn~znvJ(&= zsELr8le_?uwzi3@yu#F(@l8yF2Fgtv3iUvToE8)$M(HuwTZuTnsZ}Ft*mI5dN;R6# zetsEzv!L5{rc!Oz>z`V?aHmr}#>HO}t>57olvD25P}oZ$OU)#1Dr{xNBM`Zg%UDS$ z9LhtnKJ$$0MKAe&u>ui>Sc&sye9TLXJq=*drK$a+WuE^@y)`CgJfpVU!2#dvJCB`+ zqQGWv)1jetlNj>-0tH13v2Vf_rb!-7=m?Wqk$a9@Nl#W|gCBH7uL8Qv`_U)v_R3Wg zo`u?1hd}R*#I*Dz>PPgY*R@0>^$MsSPB30xlpdUCbnPfnyF?+o>Wf=uO#d;rTI%GZ zh0Ni|3WpH?jnTTRAKFaCwZ{X@LQhGZZ3rI2S%_-Z9nBEg$|bp2`LgQiOX`e=KF-qR zl@{|T$2W>IRG#Kk^oIN&j|})P+VZyT|~eb%Gah zRs8sCw2BU?G8a!EWsmRcb&a&*J$|w_=&T1PyF#){heFlV6SX>#;9E2g?ulOaI)u)p zk`mA!FK#{1(5CaWNx}K{>iLFrd^v8la^eGcNWLdR)!Ul2?iO#dqpK-~8b}Y)JX;$* za~7-);GQf#d7sL&lY4Wtj%L-&x*@j@-7a2yO}K>1NE)n_9vhcJ_!ptOQ|3@&Ch`tO zP7&Hl{=rfgV5B9fykh1CJ1gYG8E6Mj#C#ys*9#bLY z&TQa!GD@o~O6KBO>rz>{k-0abiERCb8?j@QeLxn+R+uq%MmWjKH+l`N5~E25w;!tR zj=g%-QcQ0}ZNVp@64$C~Ucqb(oLFSrDR(jOek ztU^^^;_jbsNmDS5sZd%nWR%2~iDb@Zkd0L5FnR&3VYPKMUtgF}|4p$jf76!d z<_i~NX!8vUGIypT8UQG|815vA^69JI*L9>Dw$h&KE^S3fNtyvgk^t z>(_iV>T_>#CaoW(T52yox^j}&L2HlxgM;-pFWxIu0Rv+=@82}tASB^kb?4=l1VnlN z*r54^HDiPnn(q-R-pNAj@g9RjsUzY(FST=ycK)2GMnVPfKHQ7V~)=m&5sIrG;5{4S7V?Q0IVbhjfF4j zkdle`DzAhiGyX}sFLTgQ1W(orECmiqK*=#UBHNa(ANQgeNuF5txc^Kn_-6-2@H@1Y zVfhS)b;O%=z-Od0Si%nj{LXcff)hgW8>JDxt2T{N8TSNM(@h8#m1S!sV9%(})^bSM zH7hxUVWRt@MOJXmR~%pVcw*UOuH_I7kkEH&FT?U_o(z5d6Y%~)$oQ|t0Ex_{h&U(4T*)dF(BDPfnrb`iHg$PgCm4}sOg|OPvH$%ypmcvsGk5dhYr9iEWfklixh^)RTJ( zOqWAO3z~{!aHPH9;iaJzF22661@%yIrs;61>2jv!QV%7e8Em2N(h>fJpvBJ#`2P?D zgDm_o_|F8mz!TUlByTN`@-4L~)F3N?E?vPEfGaIU$1q;dOcWzFl_EyGSRuH|qJ+KV zf!>H>5NrJ2cD^Db@U@^BNfz1;3%4kwn|If5xEF75=crF9N?mD1|;(V_2RK zd*3tLeL;6h$y!Ir%2mwl3ipo-U3^h+v^E4x#rs~F9j71fD3QB+! z7IB50hOVNpHZEy4HlDH*8cARv(2{l}sfUu~K*j$LV`2C8d4Y!^dZ{{eV*dHC#ecQ% zKg5s-KMdKkS``j#6@p(V*7*0eY1}ML6zVm0^)EzRf~J*VVEGhhf;K-V;E#vJ z@^=}!XSXUGm=c1wcoqJ`$Ta0F%@Rlgd&w`j;Avm7)wouyAlCflhM~0t^)oyf`uu`` zcOnRfN%&!ipXp`ESBIPp+dNY`jJO$XAj-)GM#r`NjX6H6L;kZ6d>AmpDEu(Q3IJAm z2SVUJt$93Z^K5I`k zieD;^@v_P$#2}Rp=k%AL0rfc=euH;e%dcR0Qpmxr@LMk%LIJ=9I|TcrUUA^vY?kET^9s4Xtz7<~fdqKL4HA zRI1XJ=_N_XdWMpaqS20>94R8O^T=!KWG0{r&Z_ zp%p-vnM1Px%38iwDt@9+<>i%eyxbcY4vdZqdz$As5&8U{wfqs5QyU@6e>HLi&|&61 zvzWNaW?H~^I|Y8EG{)}I2n<_8(T2gUSpBwN=flSEJHRJ^XrsmYmm^mI7qRy}u{Qub zPfC8+E%B<#IHQFs-BXHk27oAl)*`mG$iq6|?H2x2z?`-4*th4x-z8T7Yq0k{v)$&H z3W8TDhc^}~+*ux{;FZYlT81$?p4Znr$JwyWUs}T-0AB=5ZuKuEf0eJm%%NGN0v)my z!Rs84?=RNaUmind^-z+HiZ$`pUh^DnzrjBk&F=#r1zO}*|FYx?U>(f7XC+B^KuEsJ zDR6hO#!aPB!70u3cwvg@||vx zR~M`7D2^bMmzNdy6Ki6N-(Dta*LhHf++z**0FMAB7yN4@e^sxO&cG1>56d%!j3;y+zzoI>0RcJ6HB(G5}-{O_I zwOEZyi-%!4aT-_)I*8};`E|~QZ9bzT{sPO#fTtjL^>3710rZfLB9Op#1TRyH|H~=z zwZ$5nyfQe2+$&fQI*Q$Vzd;Z*`HBwsn9=+d@Ht??T6p|*x#0JL{B`UDd;V+|<${i= z3BmJ(;@>(huW(E3D^w_Vy@FgBoX2R0+Tb@aL6fH=pU;?xzp<8&Tf7aQ=kONZU>p2aOeC`~S33oEc_pe&5gfPE zi8zE$#+umDhiwSkL_v#FkvvTgF*odYmVRrt} zEX4^3n|MO7T}YlGCC`@*&sHwCx&=17C5n#M@eb5rdI;9WRz30_gU;g}DMqo}KTQMTdw&g(`wwLh=l$xKk=_S1x;%%VxJg zRe31Ki#>#_DFtidFCE3Bwj!S>3aIOV6FTHkqq)}@?ze`+Se_o=Mf>CfaPkLpp-+-a z48FA&9to2xfb_ZPU9$vDM4?7i2&RN&Mo11y#WSSCjC9zg9LAJOO}Ti=K}e^g7-Z)Q zE`PcwYy3G}{v=V`ITX~yR=w-Wn+QyV)e$Wn(9jWQb;J`^^A)3c*c!fUEst5l8Ea?) z9D749@M+SKcaQjyhPkv40Goezmg(DI`2;S4vXD#)!L$(EBqTe8WUo|glZq`;F(wqF zQc;i!Pe>doQAnf^NFg|Xrr)ab0lPwu#aM&2@&C0oL`D-@L)&QTMzdr!^Tsk~H7Bg$ zDPuTlEhjKMZ7mC7i~6YtFcZ7s^pE8NpCv9a_-QXF=lYratyz{%!{+@s(xE5>H6a*9 zFd+ovLNW%73duN76@oH?qKHF2g+O5AgMa}aivgO}(#Eo6p^o94wVVUaS<8|&ELzL5 rHTXIp*!K#|r~fCkemNKPLFE4cA-}&xs(3vU00000NkvXXu0mjfX?\ +\x22!!\x13T\xc7\xff\xfd\xf9\xfb\xa4Y\xfc\xb5ye\ +\x5c\x81\xae\x9d\x8c\xcd\xbe\xc2C\xef\xaeH\x00\x00\x00\x01\ +tRNS\x00@\xe6\xd8f\x00\x00\x00\x01orN\ +T\x01\xcf\xa2w\x9a\x00\x00\x07.IDATX\xc3\ +\xed\xd6y\x5c\x93u\x1c\x07\xf0g\xf0\x8cB\xf9=\x0f\ +{\x9e\xc91\x10\x01#\xe40\x0e\x93\x89\x08\x9e\x98\xa9\ +A)X\x04*\x88\x22\xd7\x04SP\x04\x86\xc8a\x82\ +\x0a\x1ee9\x0eEM\x93\xd46`h\x0aQR\x1e\ +`\x9a\x09QxT\x06e\x87i\x17\xdd\xf5\xfdmc\ +L}\x00c\xb3\x7f\xf2\xc3^\xbb\x9em\xcf\xfb\xf5\xfd\ +~\x9f\xdf\x0f\x82\xb8\x8b\xf0\x8c\x8cI>\x9f\xe4\x93\xda\ +\xf05\xaf\xf9:\xef\xe3\xe78\xbd~\xce\xd8\x88w7\ +g\xbb\x9b\x18\x19\xf3LL\x1e0@LLx\xc6F\ +\x86\x10\xf1\x8c\x1f4y\x10\xead\x80\x18\x1b\xc1O\x19\ +\xeb_+S\x9e\x89\x91!<\xdd12\xe1\x99\xeaM\ +\xe2\x19R\x84\xc3\xd3\x13\xc535h\x914\xa52\xd5\ +\xab}\x83\xee\x01\x09P\x83\xf4 \x0d6\xbd\x17$\x92\ +4\x1d\xacG\x99\xb8~\xd0\x0c!\x8a6\x17\xf4yR\ +F\xc0\xf4y|\xe0\x85\xe2\xf5bb\x85\x08\x09\x87\xf4\ +uN\x0bd\xd9\xb7i\xc0\x135\xd8\x8a\xdbdIZ\ +\x8b\x90Y\xdf&\x8b>MV\x03n\x1e\xc3\xe7\xfa=\ +l\x22\xad)4\x84\xe4\xdb\xd0\xac\xc8\x96$\x054m\ +I\xb3\xa0`,hJh\xc9'-X$\xa4\x01-\ +0\x13\x0a9q|f\xa0&A\xef&\x92FC\xa1\ +\x1a\x88F\x94-i\x8d\x10K#@\xda\x22\x9a\xa6\x90\ +-i)D\xb4\xc8\x82dh$\x12rv\x91/\xb8\ +\x17&\xb8\x17P\x94\x1di\x89D`b\x19\xd5\xdb\x02\ +;\x92\xb4A\xe6\xdd\xbd\xc3O\x19\x8a\xfe\xcfLB4\ +l(\x82\xd3\xd9#\x16LB\x12p\xb8y6\x0eP\ +\x9b\xee\x19w@\x2233\x8a5\xac\xa9\xd7\x19'\xed\ +\x10\xb2\x1d\x8a\xcf.@,\x1f\xea\xa46\xd9\x0b)\x91\ +Y\x8f\x09\x9e:8\x98\x9bs\xcd\xf8\x80M\x04\xd3\x9b\ +\xc9\xca\x0c\xd1|{D1\xe40(\x96\xb6N\xb8e\ +C\xd5&\xdc;\xcb^/\xce\x01\x8f8AXs\x9b\ +\x84\x22\x0a\xb1\xb6\xb87B3\x0af]['\x1b$\ +\xb2\x11a\xd30\xc4\x9a\x8bH\x06F\xdd\x82\xb3N\xd6\ +z\x98\x18N\x13\x5cn\x0e\x98\xcb\x98SH8\x8c\xec\ +\xa9\x93@\x04\x16\x02\x199\xd2\xdd\xc3\xc3\xd3\xd3\xcb\xdb\ +{\x14\xce\xa3\x041\xda\xd1\xe7\xce89\xf6j\x1a.\ +\xbe3c|\xb0\x09\xfeOB\xac\xaf\xaf\xefX?\xd1\ +\xb8q\xe6\xf0\xaf\x10\x04\x9b\xf0#\xf2\xf3\xf5\xf7\xf7\xf5\ +\x0b\x18?a|\x80\x0b~\x8dM\x135&wl\xf2\ +\xf2\x02\xd2$\x08\x98&O\xe18\xc9h\xf8-\x22\xd0\ +i\xeaT\xa7\xc7 \x8e8\xd3p\x1e\xf7!\x9c9>\ +>\xbd\xdb\xc4\xce\x98\x09y\x22(888\xe8IJ\ +\xc7\xe4\xa7:\xf0\xd4\xac\xd9!\xb3C\xc7\xbbt\x9b\xe6\ +<\xfd\xf43\xf07'\xecYw\xf7\xf0\x88\x88\xb9s\ +\xbd\xe6zc\xd3\xf7\xd5\xd7\xf0\x95o>=\x90\xb3Y\xe2\xff\ +\xfa\xe1\x8e3-\x1f\xb6\xb6\xb5u~\xfb21\x5ce\ +\xaa-\xcc\x17Wm\xca\xaf\xa9\xc9\xdf\xb8!>\xe1t\ +\xadv-\xa0|7K$\x9b\xfd\xafC\xeb\xae\xd3\xba\ +\xeb\x13\xab:ph\xc2\xb2e\xa1/\x05t\xafO\xcd\ +\x9e\x9e\x9e\xcd2\x99,Sv-\x13\x0a\x15Q\x9fQ\ +^_&\xbd\xc8\xb1\x16|\xb7\xf7\xc6\xcd\xe3*\xd3\xf7\ +'rrr\x0e\xe5\xe6\xb6\xc4f\xb7\xc5&\xc6\xc9\xe5\ +\x09\x1aS\xaf\xeb\x13ti\xecX?J(\xfaA\xc4\ +\x22\xdd\xf5\x09\x1f\xf0\xf3C.\x01\xb9\x01MHk\xf2\ +\xf2\xf2\x0a\xaf\xab\x93\x95^+\x0do\xc7\xbd\xab\x97\xb6\ +\xb7\x97\xc5\xdfnZ}i\xdf\x8d\xb375\xa6\x1f\xaf\ +\x82\xe9\xa7\xdc\xdc\xe2\x8e\x9f\xe5\x9d\xad\x9d1\x9dQ\xfd\ +\x99\x9a\xba\xba\xba\x1a\xbb\xcew56\xc2C\xa3\xae\xa9\ +\xc9\xd5\xf5\xbc\xabk\x17\xdc~\xd1\x9a\xca\xbc\xd4\xf1\x86\ +]\xe5Wmn]3\x7f\xbbt\xf9w\x00\xdd<\xab\ +1\xad9x\xeb\xeat\x0av\x96\xbe\xf7\x16\x16c\xf0\ +\x0d\x9b~\xd15\xb1\x8d@r\x05\xb2\x8e\xa9\xdc\x1b\x07\ +\xefq\x93t\xd2\xb3\xb7\x80\xe7\x0f\x00%\xdd\xc4IR\ +\x99v]\xb9p\xf5\xea\xe7\x7f\x16\x15)\x8b\xe4\x90\xc5\ +\x9d\xd3am\xefw\x0ff\xf1\x8d\x85\x0d\x97\xbdm\x0f\ +\xc6o\xe2\xf4\xec\xc1\xed\xe18\x11xS\xd1I\x9cv\ +\x0fv\xfe\xe4k\x9d\xfc\x85\xf7\xe0@\xe7\xbf!>\xfb\ +\xbbS\x11\x18\xe83\xff\x1f\x22\xba\xf7\xfb!O\x97\xb9\ +\x00\x00\x00\x00IEND\xaeB`\x82\ \x00\x00\x82\xd2\ \x00\ -\x00\x01\x00\x02\x00\x40\x40\x00\x00\x01\x00\x20\x00\x28\x42\x00\ -\x00\x26\x00\x00\x00\x00\x00\x00\x00\x01\x00\x20\x00\x84\x40\x00\ -\x00\x4e\x42\x00\x00\x28\x00\x00\x00\x40\x00\x00\x00\x80\x00\x00\ -\x00\x01\x00\x20\x00\x00\x00\x00\x00\x00\x40\x00\x00\x12\x0b\x00\ +\x00\x01\x00\x02\x00@@\x00\x00\x01\x00 \x00(B\x00\ +\x00&\x00\x00\x00\x00\x00\x00\x00\x01\x00 \x00\x84@\x00\ +\x00NB\x00\x00(\x00\x00\x00@\x00\x00\x00\x80\x00\x00\ +\x00\x01\x00 \x00\x00\x00\x00\x00\x00@\x00\x00\x12\x0b\x00\ \x00\x12\x0b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\xff\xff\xff\ \x01\xff\xff\xff\x00\xff\xff\xff\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\x8e\x14\x00\x8d\x7e\x0b\x01\x8d\xad\x25\ -\x12\x8d\xba\x2d\x37\x8d\xc0\x31\x66\x8d\xc5\x33\x94\x8d\xc8\x35\ -\xb9\x8d\xca\x36\xd5\x8d\xcb\x37\xe6\x8d\xcb\x37\xed\x8d\xcb\x37\ -\xec\x8d\xcb\x37\xe5\x8d\xca\x36\xd5\x8d\xc8\x35\xbe\x8d\xc5\x34\ -\x9d\x8d\xc1\x31\x71\x8d\xbb\x2d\x40\x8d\xaf\x26\x16\x8d\x8a\x12\ +\x00\x00\x00\x00\x00\x8d\x8e\x14\x00\x8d~\x0b\x01\x8d\xad%\ +\x12\x8d\xba-7\x8d\xc01f\x8d\xc53\x94\x8d\xc85\ +\xb9\x8d\xca6\xd5\x8d\xcb7\xe6\x8d\xcb7\xed\x8d\xcb7\ +\xec\x8d\xcb7\xe5\x8d\xca6\xd5\x8d\xc85\xbe\x8d\xc54\ +\x9d\x8d\xc11q\x8d\xbb-@\x8d\xaf&\x16\x8d\x8a\x12\ \x02\x8d\x9b\x19\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -990,13 +204,13 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x5e\x0e\x00\x8d\xf8\x43\ -\x00\x8d\xaa\x23\x0d\x8d\xbb\x2d\x40\x8d\xc4\x32\x87\x8d\xc9\x36\ -\xc4\x8d\xcd\x39\xe8\x8d\xd0\x3a\xfa\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\ -\xff\x8d\xd1\x3b\xfc\x8d\xce\x39\xed\x8d\xca\x36\xca\x8d\xc4\x33\ -\x8e\x8d\xbc\x2e\x47\x8d\xae\x26\x12\x8d\x0b\x00\x00\x8d\x8f\x13\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d^\x0e\x00\x8d\xf8C\ +\x00\x8d\xaa#\x0d\x8d\xbb-@\x8d\xc42\x87\x8d\xc96\ +\xc4\x8d\xcd9\xe8\x8d\xd0:\xfa\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2;\ +\xff\x8d\xd1;\xfc\x8d\xce9\xed\x8d\xca6\xca\x8d\xc43\ +\x8e\x8d\xbc.G\x8d\xae&\x12\x8d\x0b\x00\x00\x8d\x8f\x13\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1006,13 +220,13 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\x66\x0e\x00\x8d\xff\x49\x00\x8d\xae\x26\x13\x8d\xbe\x2f\ -\x5c\x8d\xc7\x35\xb8\x8d\xce\x39\xf0\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\ -\xff\x8d\xcf\x39\xf4\x8d\xc9\x36\xc4\x8d\xc0\x30\x6d\x8d\xb2\x28\ +\x00\x8df\x0e\x00\x8d\xffI\x00\x8d\xae&\x13\x8d\xbe/\ +\x5c\x8d\xc75\xb8\x8d\xce9\xf0\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2;\ +\xff\x8d\xcf9\xf4\x8d\xc96\xc4\x8d\xc00m\x8d\xb2(\ \x1c\x8d\x16\x00\x00\x8d\x9a\x19\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1021,15 +235,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x8d\xb7\x29\ -\x00\x8d\xa8\x23\x0a\x8d\xbc\x2e\x55\x8d\xc8\x35\xc0\x8d\xcf\x3a\ -\xf8\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd0\x3a\xfc\x8d\xc9\x36\ -\xcf\x8d\xbe\x2f\x66\x8d\xad\x25\x10\x8d\xc1\x30\x00\x8d\x82\x0b\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x00\x00\x00\x8d\xb7)\ +\x00\x8d\xa8#\x0a\x8d\xbc.U\x8d\xc85\xc0\x8d\xcf:\ +\xf8\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd0:\xfc\x8d\xc96\ +\xcf\x8d\xbe/f\x8d\xad%\x10\x8d\xc10\x00\x8d\x82\x0b\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1037,15 +251,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\x9e\x1c\x00\x8d\x00\x00\x00\x8d\xb6\x2a\ -\x2c\x8d\xc4\x33\xa4\x8d\xce\x39\xf4\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xcf\x3a\xf9\x8d\xc6\x34\xb3\x8d\xb8\x2c\x39\x8d\x7e\x08\ +\x00\x00\x00\x00\x00\x8d\x9e\x1c\x00\x8d\x00\x00\x00\x8d\xb6*\ +,\x8d\xc43\xa4\x8d\xce9\xf4\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xcf:\xf9\x8d\xc64\xb3\x8d\xb8,9\x8d~\x08\ \x01\x8d\xa0\x1d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1053,766 +267,766 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xaa\x23\x00\x8d\x9d\x1b\x04\x8d\xbc\x2e\x55\x8d\xca\x36\ -\xd7\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd2\x3c\xff\x8d\xcb\x37\xe2\x8d\xbe\x2f\ -\x6a\x8d\xa7\x21\x0a\x8d\xb1\x27\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xaa#\x00\x8d\x9d\x1b\x04\x8d\xbc.U\x8d\xca6\ +\xd7\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd2<\xff\x8d\xcb7\xe2\x8d\xbe/\ +j\x8d\xa7!\x0a\x8d\xb1'\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb0\x27\ -\x00\x8d\xa5\x20\x0a\x8d\xbf\x30\x76\x8d\xcd\x38\xee\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x8d\xd2\x3a\ -\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3b\xff\x8d\xd2\x3b\xff\x8d\xd2\x3a\xff\x8d\xd2\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xce\x39\ -\xf6\x8d\xc2\x32\x91\x8d\xaf\x26\x13\x8d\xb7\x2a\x00\x8d\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb0'\ +\x00\x8d\xa5 \x0a\x8d\xbf0v\x8d\xcd8\xee\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x8d\xd2:\ +\xff\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3;\xff\x8d\xd2;\xff\x8d\xd2:\xff\x8d\xd2;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xce9\ +\xf6\x8d\xc22\x91\x8d\xaf&\x13\x8d\xb7*\x00\x8d\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb2\x28\x00\x8d\xa9\x22\ -\x0c\x8d\xc1\x31\x88\x8d\xcf\x39\xf7\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\ -\xff\x8d\xd3\x3b\xff\x8c\xd6\x42\xff\x89\xdb\x4e\xff\x86\xe2\x5d\ -\xff\x83\xe8\x6b\xff\x81\xec\x75\xff\x80\xee\x79\xff\x80\xed\x78\ -\xff\x81\xeb\x73\xff\x83\xe7\x6b\xff\x85\xe3\x60\xff\x89\xdc\x51\ -\xff\x8b\xd6\x43\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd0\x3a\xfc\x8d\xc4\x33\xa2\x8d\xaf\x27\x16\x8d\xb8\x2b\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb2(\x00\x8d\xa9\x22\ +\x0c\x8d\xc11\x88\x8d\xcf9\xf7\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2;\ +\xff\x8d\xd3;\xff\x8c\xd6B\xff\x89\xdbN\xff\x86\xe2]\ +\xff\x83\xe8k\xff\x81\xecu\xff\x80\xeey\xff\x80\xedx\ +\xff\x81\xebs\xff\x83\xe7k\xff\x85\xe3`\xff\x89\xdcQ\ +\xff\x8b\xd6C\xff\x8d\xd3<\xff\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd0:\xfc\x8d\xc43\xa2\x8d\xaf'\x16\x8d\xb8+\ \x00\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xb1\x27\x00\x8d\xa5\x21\x0a\x8d\xc1\x31\ -\x8a\x8d\xcf\x3a\xf9\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x8d\xd4\x3e\xff\x89\xdc\x51\ -\xff\x82\xe9\x6f\xff\x7d\xf5\x88\xff\x7a\xfb\x97\xff\x78\xfe\x9e\ -\xff\x78\xff\xa1\xff\x78\xff\xa1\xff\x78\xff\xa2\xff\x78\xff\xa2\ -\xff\x78\xff\xa1\xff\x78\xff\xa1\xff\x78\xfe\x9f\xff\x79\xfc\x99\ -\xff\x7c\xf6\x8b\xff\x82\xeb\x72\xff\x88\xde\x55\xff\x8c\xd5\x40\ -\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd0\x3a\xfd\x8d\xc4\x33\xa1\x8d\xad\x25\ -\x13\x8d\xb5\x29\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xb1'\x00\x8d\xa5!\x0a\x8d\xc11\ +\x8a\x8d\xcf:\xf9\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd2;\xff\x8d\xd4>\xff\x89\xdcQ\ +\xff\x82\xe9o\xff}\xf5\x88\xffz\xfb\x97\xffx\xfe\x9e\ +\xffx\xff\xa1\xffx\xff\xa1\xffx\xff\xa2\xffx\xff\xa2\ +\xffx\xff\xa1\xffx\xff\xa1\xffx\xfe\x9f\xffy\xfc\x99\ +\xff|\xf6\x8b\xff\x82\xebr\xff\x88\xdeU\xff\x8c\xd5@\ +\xff\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd0:\xfd\x8d\xc43\xa1\x8d\xad%\ +\x13\x8d\xb5)\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xaa\x23\x00\x8d\x92\x14\x04\x8d\xbf\x30\x78\x8d\xcf\x39\ -\xf8\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\ -\xff\x8d\xd3\x3d\xff\x88\xdd\x53\xff\x80\xef\x7b\xff\x7a\xfb\x98\ -\xff\x78\xff\xa1\xff\x78\xff\xa1\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x78\xff\xa1\xff\x79\xfc\x9a\xff\x7e\xf2\x82\ -\xff\x87\xe0\x59\xff\x8c\xd4\x3f\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd0\x3a\xfc\x8d\xc2\x32\ -\x91\x8d\xa6\x21\x0a\x8d\xaf\x26\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xaa#\x00\x8d\x92\x14\x04\x8d\xbf0x\x8d\xcf9\ +\xf8\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\ +\xff\x8d\xd3=\xff\x88\xddS\xff\x80\xef{\xffz\xfb\x98\ +\xffx\xff\xa1\xffx\xff\xa1\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xffx\xff\xa1\xffy\xfc\x9a\xff~\xf2\x82\ +\xff\x87\xe0Y\xff\x8c\xd4?\xff\x8d\xd3;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd0:\xfc\x8d\xc22\ +\x91\x8d\xa6!\x0a\x8d\xaf&\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x9e\x1c\ -\x00\x8d\xf0\x4e\x00\x8d\xbc\x2e\x54\x8d\xcd\x38\xee\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x8b\xd8\x47\ -\xff\x82\xeb\x72\xff\x7a\xfb\x98\xff\x78\xff\xa1\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\ -\xff\x79\xfd\x9b\xff\x80\xee\x79\xff\x8a\xda\x4b\xff\x8d\xd3\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xcf\x39\ -\xf7\x8d\xbf\x30\x70\x8d\x65\x00\x01\x8d\xa8\x23\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x30\x00\x00\x8d\xbc\x2d\ -\x00\x8d\xb5\x2a\x29\x8d\xc9\x36\xd4\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x88\xdd\x52\xff\x7d\xf4\x88\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7c\xf7\x8e\xff\x87\xe0\x5a\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xcc\x38\xe7\x8d\xb9\x2c\x42\x8d\xc8\x35\x00\x8d\xa2\x1e\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xae\x25\x00\x8d\xa3\x1e\ -\x09\x8d\xc4\x33\x9f\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x87\xe0\x5a\xff\x7b\xf9\x92\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7a\xfb\x98\ -\xff\x85\xe5\x64\xff\x8d\xd3\x3d\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd2\x3c\xff\x8d\xc7\x35\xbd\x8d\xae\x25\x15\x8d\xb4\x29\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xa5\x20\x00\x8d\xcd\x39\x00\x8d\xbc\x2e\ -\x54\x8d\xce\x39\xf3\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\ -\xff\x87\xe0\x5a\xff\x7a\xfa\x95\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\ -\xff\x79\xfc\x9a\xff\x85\xe4\x63\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd0\x3a\xfc\x8d\xc0\x30\x71\x8d\xff\x79\ -\x00\x8d\xa4\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xb3\x28\x00\x8d\xae\x25\x13\x8d\xc8\x35\ -\xc0\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x88\xdd\x52\ -\xff\x7b\xf9\x93\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x7a\xfb\x98\xff\x86\xe1\x5b\xff\x8d\xd3\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xca\x36\xd5\x8d\xb3\x29\ -\x22\x8d\xb7\x2b\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xa5\x20\x00\x8d\xcf\x39\x00\x8d\xbe\x2f\x5d\x8d\xcf\x3a\ -\xf9\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x8b\xd7\x46\xff\x7d\xf4\x87\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7b\xf8\x90\xff\x89\xdb\x4d\ -\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd1\x3b\xfe\x8d\xc1\x31\ -\x79\x8d\xff\x6d\x00\x8d\xa5\x20\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xaf\x26\x00\x8d\xa6\x21\x0b\x8d\xc7\x35\xb5\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3d\xff\x82\xea\x70\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xf6\x95\xff\x78\xfb\x9c\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7f\xf0\x7d\ -\xff\x8c\xd5\x40\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xca\x36\ -\xcf\x8d\xb1\x28\x1a\x8d\xb4\x29\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xbe\x2f\x00\x8d\xba\x2d\x3c\x8d\xce\x39\xee\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd2\x3b\xff\x88\xdd\x53\xff\x7a\xfb\x97\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa2\xff\x7a\xdd\x78\xff\x79\xe6\x83\xff\x78\xff\xa2\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x79\xfd\x9c\ -\xff\x86\xe2\x5d\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xcf\x3a\ -\xfa\x8d\xbe\x2f\x5b\x8d\xcb\x37\x00\x8d\xa3\x1f\x00\x00\x00\x00\ +\x00\x8d\xf0N\x00\x8d\xbc.T\x8d\xcd8\xee\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x8b\xd8G\ +\xff\x82\xebr\xffz\xfb\x98\xffx\xff\xa1\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\ +\xffy\xfd\x9b\xff\x80\xeey\xff\x8a\xdaK\xff\x8d\xd3;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xcf9\ +\xf7\x8d\xbf0p\x8de\x00\x01\x8d\xa8#\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d0\x00\x00\x8d\xbc-\ +\x00\x8d\xb5*)\x8d\xc96\xd4\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3;\xff\x88\xddR\xff}\xf4\x88\ +\xffx\xff\xa0\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xff|\xf7\x8e\xff\x87\xe0Z\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xcc8\xe7\x8d\xb9,B\x8d\xc85\x00\x8d\xa2\x1e\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xae%\x00\x8d\xa3\x1e\ +\x09\x8d\xc43\x9f\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x87\xe0Z\xff{\xf9\x92\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\xffz\xfb\x98\ +\xff\x85\xe5d\xff\x8d\xd3=\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd2<\xff\x8d\xc75\xbd\x8d\xae%\x15\x8d\xb4)\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xa5 \x00\x8d\xcd9\x00\x8d\xbc.\ +T\x8d\xce9\xf3\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\ +\xff\x87\xe0Z\xffz\xfa\x95\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\ +\xffy\xfc\x9a\xff\x85\xe4c\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd0:\xfc\x8d\xc00q\x8d\xffy\ +\x00\x8d\xa4 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xb3(\x00\x8d\xae%\x13\x8d\xc85\ +\xc0\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x88\xddR\ +\xff{\xf9\x93\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xffz\xfb\x98\xff\x86\xe1[\xff\x8d\xd3;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xca6\xd5\x8d\xb3)\ +\x22\x8d\xb7+\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xa5 \x00\x8d\xcf9\x00\x8d\xbe/]\x8d\xcf:\ +\xf9\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3;\xff\x8b\xd7F\xff}\xf4\x87\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xff{\xf8\x90\xff\x89\xdbM\ +\xff\x8d\xd3;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd1;\xfe\x8d\xc11\ +y\x8d\xffm\x00\x8d\xa5 \x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xaf&\x00\x8d\xa6!\x0b\x8d\xc75\xb5\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3=\xff\x82\xeap\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xf6\x95\xffx\xfb\x9c\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\xff\x7f\xf0}\ +\xff\x8c\xd5@\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xca6\ +\xcf\x8d\xb1(\x1a\x8d\xb4)\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xbe/\x00\x8d\xba-<\x8d\xce9\xee\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd2;\xff\x88\xddS\xffz\xfb\x97\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa2\xffz\xddx\xffy\xe6\x83\xffx\xff\xa2\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffy\xfd\x9c\ +\xff\x86\xe2]\xff\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xcf:\ +\xfa\x8d\xbe/[\x8d\xcb7\x00\x8d\xa3\x1f\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa8\x22\ -\x00\x8d\xff\x5e\x00\x8d\xc3\x32\x81\x8d\xd1\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd4\x3e\xff\x80\xef\x7b\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa2\xff\x7a\xd9\x73\xff\x7b\xc5\x5b\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\ -\xff\x7e\xf3\x85\xff\x8c\xd6\x42\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3c\ -\xff\x8d\xc6\x34\xa5\x8d\x91\x14\x05\x8d\xad\x25\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1\x27\ -\x00\x8d\xaa\x23\x0e\x8d\xc9\x36\xc0\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\ -\xff\x89\xdc\x4f\xff\x7a\xfb\x97\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa2\xff\x7a\xe0\x7b\xff\x7d\xa6\x35\xff\x79\xf5\x95\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x79\xfd\x9c\xff\x87\xe0\x5a\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xcc\x37\xda\x8d\xb5\x29\x1f\x8d\xb6\x2a\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xbb\x2d\ -\x00\x8d\xb9\x2c\x2f\x8d\xcd\x38\xe8\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\ -\xff\x83\xe8\x6c\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa2\xff\x79\xe8\x85\xff\x7e\x95\x20\xff\x7a\xdc\x75\ -\xff\x78\xff\xa2\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x80\xee\x7a\xff\x8d\xd4\x3d\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xcf\x3a\xf6\x8d\xbe\x2f\x49\x8d\xc2\x32\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa0\x1e\x00\x8d\xc9\x36\ -\x00\x8d\xc0\x30\x5a\x8d\xd0\x3a\xfb\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8c\xd5\x41\ -\xff\x7d\xf4\x87\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x79\xee\x8c\xff\x7e\x93\x1e\xff\x7c\xb7\x49\ -\xff\x78\xfe\x9f\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x7b\xf8\x91\xff\x8b\xd8\x47\xff\x8d\xd3\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd1\x3b\xff\x8d\xc3\x32\x77\x8d\xde\x43\x00\x8d\xa7\x21\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa8\x22\x00\x8d\xf0\x4e\ -\x00\x8d\xc4\x33\x81\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x89\xdb\x4e\ -\xff\x7a\xfb\x97\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x79\xf3\x92\xff\x7e\x99\x25\xff\x7e\x97\x23\ -\xff\x79\xf0\x8e\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x79\xfd\x9c\xff\x87\xdf\x57\xff\x8d\xd2\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xc7\x35\xa0\x8d\x60\x00\x02\x8d\xac\x25\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xac\x24\x00\x8d\x50\x00\ -\x02\x8d\xc7\x35\x9f\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3a\xff\x86\xe1\x5d\ -\xff\x78\xfe\x9e\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x78\xf7\x97\xff\x7e\xa0\x2e\xff\x7f\x87\x0f\ -\xff\x7b\xd2\x6a\xff\x78\xff\xa2\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x84\xe6\x68\xff\x8d\xd2\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xca\x36\xbe\x8d\xa9\x22\x0b\x8d\xb0\x27\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xaf\x26\x00\x8d\xa0\x1d\ -\x07\x8d\xc9\x36\xb4\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x84\xe7\x69\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xfb\x9b\xff\x7d\xa8\x37\xff\x7f\x83\x0b\ -\xff\x7d\xae\x3e\xff\x78\xfc\x9c\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x81\xed\x76\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xcc\x38\xd2\x8d\xb3\x29\x16\x8d\xb4\x29\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1\x27\x00\x8d\xac\x24\ -\x0d\x8d\xcb\x37\xc2\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x82\xeb\x72\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xfd\x9e\xff\x7d\xb0\x40\xff\x7f\x84\x0c\ -\xff\x7e\x92\x1d\xff\x79\xe9\x86\xff\x78\xff\xa2\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7f\xf1\x80\xff\x8d\xd4\x3e\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xcd\x38\xdd\x8d\xb7\x2b\x1f\x8d\xb8\x2b\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb3\x28\x00\x8d\xb0\x27\ -\x10\x8d\xcb\x37\xc9\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x81\xed\x76\ -\xff\x78\xff\xa2\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa2\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x7c\xb8\x4a\xff\x7f\x85\x0d\ -\xff\x7f\x87\x0f\xff\x7b\xc8\x5e\xff\x78\xff\xa2\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7e\xf2\x83\xff\x8c\xd4\x3f\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xce\x39\xe1\x8d\xb9\x2c\x23\x8d\xba\x2c\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb3\x29\x00\x8d\xb1\x27\ -\x11\x8d\xcc\x37\xca\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x81\xed\x77\ -\xff\x78\xff\xa2\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x79\xe7\x84\xff\x7b\xcf\x67\ -\xff\x79\xef\x8d\xff\x78\xfe\x9f\xff\x78\xff\xa2\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7c\xc0\x54\xff\x7f\x85\x0d\ -\xff\x7f\x85\x0d\xff\x7d\xa4\x33\xff\x78\xf8\x98\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7e\xf2\x83\xff\x8c\xd4\x3f\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xce\x39\xe0\x8d\xb9\x2c\x22\x8d\xba\x2c\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb2\x28\x00\x8d\xae\x25\ -\x0e\x8d\xcb\x37\xc5\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x81\xeb\x73\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7a\xdb\x75\xff\x7f\x8b\x14\ -\xff\x7e\x98\x23\xff\x7c\xba\x4c\xff\x7a\xe0\x7a\xff\x78\xf8\x98\ -\xff\x78\xff\xa2\xff\x78\xff\xa3\xff\x7b\xc9\x5f\xff\x7f\x86\x0e\ -\xff\x7f\x87\x0e\xff\x7f\x8d\x17\xff\x7a\xe1\x7c\xff\x78\xff\xa2\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7f\xf0\x7f\xff\x8d\xd4\x3e\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xcd\x38\xdb\x8d\xb7\x2b\x1e\x8d\xb8\x2b\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb0\x26\x00\x8d\xa5\x20\ -\x09\x8d\xca\x36\xb9\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x83\xe7\x6a\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7a\xe2\x7d\xff\x7f\x8d\x16\ -\xff\x7f\x86\x0d\xff\x7f\x86\x0d\xff\x7f\x8d\x17\xff\x7d\xa6\x34\ -\xff\x7b\xcc\x63\xff\x79\xf0\x8e\xff\x7b\xd0\x67\xff\x7f\x88\x10\ -\xff\x7f\x87\x0f\xff\x7f\x86\x0d\xff\x7c\xbd\x51\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x81\xed\x77\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xcc\x38\xd1\x8d\xb3\x29\x15\x8d\xb5\x29\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xad\x25\x00\x8d\x6e\x00\ -\x02\x8d\xc8\x35\xa2\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3a\xff\x86\xe1\x5d\ -\xff\x78\xfe\x9e\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x79\xe8\x84\xff\x7e\x90\x1a\ +\x00\x8d\xff^\x00\x8d\xc32\x81\x8d\xd1;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd4>\xff\x80\xef{\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa2\xffz\xd9s\xff{\xc5[\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\ +\xff~\xf3\x85\xff\x8c\xd6B\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2<\ +\xff\x8d\xc64\xa5\x8d\x91\x14\x05\x8d\xad%\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1'\ +\x00\x8d\xaa#\x0e\x8d\xc96\xc0\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\ +\xff\x89\xdcO\xffz\xfb\x97\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa2\xffz\xe0{\xff}\xa65\xffy\xf5\x95\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffy\xfd\x9c\xff\x87\xe0Z\xff\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xcc7\xda\x8d\xb5)\x1f\x8d\xb6*\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xbb-\ +\x00\x8d\xb9,/\x8d\xcd8\xe8\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\ +\xff\x83\xe8l\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa2\xffy\xe8\x85\xff~\x95 \xffz\xdcu\ +\xffx\xff\xa2\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xff\x80\xeez\xff\x8d\xd4=\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xcf:\xf6\x8d\xbe/I\x8d\xc22\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa0\x1e\x00\x8d\xc96\ +\x00\x8d\xc00Z\x8d\xd0:\xfb\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8c\xd5A\ +\xff}\xf4\x87\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xffy\xee\x8c\xff~\x93\x1e\xff|\xb7I\ +\xffx\xfe\x9f\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xff{\xf8\x91\xff\x8b\xd8G\xff\x8d\xd3;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd1;\xff\x8d\xc32w\x8d\xdeC\x00\x8d\xa7!\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa8\x22\x00\x8d\xf0N\ +\x00\x8d\xc43\x81\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x89\xdbN\ +\xffz\xfb\x97\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xffy\xf3\x92\xff~\x99%\xff~\x97#\ +\xffy\xf0\x8e\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffy\xfd\x9c\xff\x87\xdfW\xff\x8d\xd2;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xc75\xa0\x8d`\x00\x02\x8d\xac%\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xac$\x00\x8dP\x00\ +\x02\x8d\xc75\x9f\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2:\xff\x86\xe1]\ +\xffx\xfe\x9e\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xffx\xf7\x97\xff~\xa0.\xff\x7f\x87\x0f\ +\xff{\xd2j\xffx\xff\xa2\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xff\x84\xe6h\xff\x8d\xd2;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xca6\xbe\x8d\xa9\x22\x0b\x8d\xb0'\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xaf&\x00\x8d\xa0\x1d\ +\x07\x8d\xc96\xb4\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2;\xff\x84\xe7i\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xfb\x9b\xff}\xa87\xff\x7f\x83\x0b\ +\xff}\xae>\xffx\xfc\x9c\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xff\x81\xedv\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xcc8\xd2\x8d\xb3)\x16\x8d\xb4)\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1'\x00\x8d\xac$\ +\x0d\x8d\xcb7\xc2\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x82\xebr\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xfd\x9e\xff}\xb0@\xff\x7f\x84\x0c\ +\xff~\x92\x1d\xffy\xe9\x86\xffx\xff\xa2\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xff\x7f\xf1\x80\xff\x8d\xd4>\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xcd8\xdd\x8d\xb7+\x1f\x8d\xb8+\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb3(\x00\x8d\xb0'\ +\x10\x8d\xcb7\xc9\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x81\xedv\ +\xffx\xff\xa2\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa2\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xff|\xb8J\xff\x7f\x85\x0d\ +\xff\x7f\x87\x0f\xff{\xc8^\xffx\xff\xa2\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xff~\xf2\x83\xff\x8c\xd4?\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xce9\xe1\x8d\xb9,#\x8d\xba,\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb3)\x00\x8d\xb1'\ +\x11\x8d\xcc7\xca\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x81\xedw\ +\xffx\xff\xa2\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xffy\xe7\x84\xff{\xcfg\ +\xffy\xef\x8d\xffx\xfe\x9f\xffx\xff\xa2\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa1\xff|\xc0T\xff\x7f\x85\x0d\ +\xff\x7f\x85\x0d\xff}\xa43\xffx\xf8\x98\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xff~\xf2\x83\xff\x8c\xd4?\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xce9\xe0\x8d\xb9,\x22\x8d\xba,\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb2(\x00\x8d\xae%\ +\x0e\x8d\xcb7\xc5\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x81\xebs\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xffz\xdbu\xff\x7f\x8b\x14\ +\xff~\x98#\xff|\xbaL\xffz\xe0z\xffx\xf8\x98\ +\xffx\xff\xa2\xffx\xff\xa3\xff{\xc9_\xff\x7f\x86\x0e\ +\xff\x7f\x87\x0e\xff\x7f\x8d\x17\xffz\xe1|\xffx\xff\xa2\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xff\x7f\xf0\x7f\xff\x8d\xd4>\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xcd8\xdb\x8d\xb7+\x1e\x8d\xb8+\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb0&\x00\x8d\xa5 \ +\x09\x8d\xca6\xb9\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2;\xff\x83\xe7j\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xffz\xe2}\xff\x7f\x8d\x16\ +\xff\x7f\x86\x0d\xff\x7f\x86\x0d\xff\x7f\x8d\x17\xff}\xa64\ +\xff{\xccc\xffy\xf0\x8e\xff{\xd0g\xff\x7f\x88\x10\ +\xff\x7f\x87\x0f\xff\x7f\x86\x0d\xff|\xbdQ\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xff\x81\xedw\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xcc8\xd1\x8d\xb3)\x15\x8d\xb5)\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xad%\x00\x8dn\x00\ +\x02\x8d\xc85\xa2\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2:\xff\x86\xe1]\ +\xffx\xfe\x9e\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa2\xffy\xe8\x84\xff~\x90\x1a\ \xff\x7f\x86\x0e\xff\x7f\x87\x0f\xff\x7f\x87\x0e\xff\x7f\x85\x0d\ -\xff\x7f\x88\x10\xff\x7e\x99\x24\xff\x7d\xa2\x30\xff\x7f\x88\x10\ -\xff\x7f\x87\x0f\xff\x7f\x86\x0d\xff\x7e\x9c\x29\xff\x79\xf3\x92\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x83\xe8\x6b\xff\x8d\xd2\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xca\x37\xc0\x8d\xaa\x23\x0c\x8d\xb1\x27\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa8\x22\x00\x8d\xf3\x50\ -\x00\x8d\xc5\x33\x82\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x89\xdb\x4e\ -\xff\x7a\xfb\x98\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x79\xec\x8a\xff\x7e\x93\x1e\ +\xff\x7f\x88\x10\xff~\x99$\xff}\xa20\xff\x7f\x88\x10\ +\xff\x7f\x87\x0f\xff\x7f\x86\x0d\xff~\x9c)\xffy\xf3\x92\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xff\x83\xe8k\xff\x8d\xd2;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xca7\xc0\x8d\xaa#\x0c\x8d\xb1'\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa8\x22\x00\x8d\xf3P\ +\x00\x8d\xc53\x82\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x89\xdbN\ +\xffz\xfb\x98\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xffy\xec\x8a\xff~\x93\x1e\ \xff\x7f\x86\x0e\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x86\x0e\xff\x7f\x86\x0e\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x8a\x12\xff\x7a\xd7\x70\ -\xff\x78\xff\xa2\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x79\xfe\x9d\xff\x87\xe0\x5a\xff\x8d\xd2\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xc8\x35\xa5\x8d\x81\x0a\x03\x8d\xad\x25\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa0\x1d\x00\x8d\xc9\x36\ -\x00\x8d\xc0\x31\x5b\x8d\xd0\x3a\xfc\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8c\xd6\x42\ -\xff\x7d\xf5\x89\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x79\xf0\x8f\xff\x7e\x97\x22\ +\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x8a\x12\xffz\xd7p\ +\xffx\xff\xa2\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffy\xfe\x9d\xff\x87\xe0Z\xff\x8d\xd2;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xc85\xa5\x8d\x81\x0a\x03\x8d\xad%\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa0\x1d\x00\x8d\xc96\ +\x00\x8d\xc01[\x8d\xd0:\xfc\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8c\xd6B\ +\xff}\xf5\x89\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xffy\xf0\x8f\xff~\x97\x22\ \xff\x7f\x86\x0e\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff\x7c\xb3\x44\ -\xff\x78\xfd\x9e\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x7b\xf9\x92\xff\x8a\xd9\x49\xff\x8d\xd3\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd2\x3b\xff\x8d\xc4\x33\x7f\x8d\xee\x4c\x00\x8d\xa8\x22\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xbb\x2e\ -\x00\x8d\xba\x2d\x32\x8d\xce\x39\xeb\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x82\xea\x70\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x79\xf5\x94\xff\x7e\x9c\x28\ +\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff|\xb3D\ +\xffx\xfd\x9e\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xff{\xf9\x92\xff\x8a\xd9I\xff\x8d\xd3;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd2;\xff\x8d\xc43\x7f\x8d\xeeL\x00\x8d\xa8\x22\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xbb.\ +\x00\x8d\xba-2\x8d\xce9\xeb\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x82\xeap\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xffy\xf5\x94\xff~\x9c(\ \xff\x7f\x86\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x86\x0e\xff\x7e\x95\x20\ -\xff\x79\xed\x8a\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x80\xef\x7c\xff\x8d\xd4\x3e\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd0\x3a\xf8\x8d\xbe\x2f\x4f\x8d\xc4\x33\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1\x28\ -\x00\x8d\xad\x25\x11\x8d\xca\x36\xc6\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\ -\xff\x88\xdd\x52\xff\x7a\xfc\x99\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x78\xf8\x98\xff\x7d\xa2\x30\ +\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x86\x0e\xff~\x95 \ +\xffy\xed\x8a\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xff\x80\xef|\xff\x8d\xd4>\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd0:\xf8\x8d\xbe/O\x8d\xc43\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1(\ +\x00\x8d\xad%\x11\x8d\xca6\xc6\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2;\ +\xff\x88\xddR\xffz\xfc\x99\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xffx\xf8\x98\xff}\xa20\ \xff\x7f\x85\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x10\ -\xff\x7b\xcd\x64\xff\x78\xff\xa2\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x79\xfe\x9e\xff\x86\xe2\x5d\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xcc\x38\xdd\x8d\xb6\x2a\x22\x8d\xb7\x2b\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa9\x23\ -\x00\x8d\xff\xff\x00\x8d\xc4\x33\x8c\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8c\xd4\x3f\xff\x7f\xf0\x7e\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xfb\x9b\xff\x7d\xa8\x37\ +\xff{\xcdd\xffx\xff\xa2\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffy\xfe\x9e\xff\x86\xe2]\xff\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xcc8\xdd\x8d\xb6*\x22\x8d\xb7+\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa9#\ +\x00\x8d\xff\xff\x00\x8d\xc43\x8c\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8c\xd4?\xff\x7f\xf0~\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xfb\x9b\xff}\xa87\ \xff\x7f\x85\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x85\x0d\ -\xff\x7d\xa9\x38\xff\x78\xfa\x9a\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\ -\xff\x7d\xf5\x8a\xff\x8b\xd7\x44\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xc6\x34\xa8\x8d\x96\x17\x06\x8d\xad\x25\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xc0\x31\x00\x8d\xbc\x2e\x44\x8d\xce\x39\xf2\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd2\x3b\xff\x88\xde\x56\xff\x79\xfc\x99\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xfd\x9e\xff\x7d\xaf\x3f\ +\xff}\xa98\xffx\xfa\x9a\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\ +\xff}\xf5\x8a\xff\x8b\xd7D\xff\x8d\xd3;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xc64\xa8\x8d\x96\x17\x06\x8d\xad%\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xc01\x00\x8d\xbc.D\x8d\xce9\xf2\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd2;\xff\x88\xdeV\xffy\xfc\x99\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xfd\x9e\xff}\xaf?\ \xff\x7f\x85\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x86\x0e\ -\xff\x7e\x90\x19\xff\x79\xe5\x81\xff\x78\xff\xa2\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xfe\x9e\ -\xff\x85\xe4\x62\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd0\x3a\ -\xfb\x8d\xbf\x30\x60\x8d\xce\x39\x00\x8d\xa4\x1f\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xb1\x27\x00\x8d\xaa\x23\x0f\x8d\xc8\x35\xbd\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd4\x3e\xff\x81\xed\x77\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x7c\xb6\x48\ +\xff~\x90\x19\xffy\xe5\x81\xffx\xff\xa2\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xfe\x9e\ +\xff\x85\xe4b\xff\x8d\xd3;\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd0:\ +\xfb\x8d\xbf0`\x8d\xce9\x00\x8d\xa4\x1f\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xb1'\x00\x8d\xaa#\x0f\x8d\xc85\xbd\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd4>\xff\x81\xedw\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xff|\xb6H\ \xff\x7f\x85\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ \xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x8b\x14\xff\x7f\x88\x10\ \xff\x7f\x85\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x86\x0e\xff\x7c\xc2\x57\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7f\xf1\x81\ -\xff\x8c\xd5\x41\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xca\x37\ -\xd6\x8d\xb3\x29\x1f\x8d\xb6\x2a\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xa7\x21\x00\x8d\xd4\x3d\x00\x8d\xbf\x30\x63\x8d\xd0\x3a\ -\xfb\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x8a\xd9\x4a\xff\x7c\xf6\x8c\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7c\xbd\x50\ +\xff\x7f\x86\x0e\xff|\xc2W\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\xff\x7f\xf1\x81\ +\xff\x8c\xd5A\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xca7\ +\xd6\x8d\xb3)\x1f\x8d\xb6*\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xa7!\x00\x8d\xd4=\x00\x8d\xbf0c\x8d\xd0:\ +\xfb\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3;\xff\x8a\xd9J\xff|\xf6\x8c\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\xff|\xbdP\ \xff\x7f\x85\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x86\x0e\xff\x7c\xb3\x45\xff\x7b\xcd\x64\ -\xff\x7d\xa5\x34\xff\x7f\x8d\x16\xff\x7f\x85\x0d\xff\x7f\x86\x0e\ -\xff\x7f\x85\x0d\xff\x7e\xa0\x2e\xff\x79\xf5\x95\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7b\xf9\x94\xff\x89\xdc\x51\ -\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd1\x3b\xff\x8d\xc2\x32\ +\xff\x7f\x87\x0f\xff\x7f\x86\x0e\xff|\xb3E\xff{\xcdd\ +\xff}\xa54\xff\x7f\x8d\x16\xff\x7f\x85\x0d\xff\x7f\x86\x0e\ +\xff\x7f\x85\x0d\xff~\xa0.\xffy\xf5\x95\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xff{\xf9\x94\xff\x89\xdcQ\ +\xff\x8d\xd3;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd1;\xff\x8d\xc22\ \x86\x8d\x00\x00\x00\x8d\xa9\x22\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xb4\x29\x00\x8d\xaf\x26\x17\x8d\xc8\x35\ -\xc6\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x87\xdf\x57\ -\xff\x7a\xfa\x96\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7b\xc4\x59\ +\x00\x00\x00\x00\x00\x8d\xb4)\x00\x8d\xaf&\x17\x8d\xc85\ +\xc6\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x87\xdfW\ +\xffz\xfa\x96\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa2\xff{\xc4Y\ \xff\x7f\x86\x0d\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff\x7c\xb9\x4c\xff\x78\xff\xa2\ -\xff\x78\xf8\x98\xff\x7a\xde\x78\xff\x7c\xb8\x4b\xff\x7e\x97\x23\ -\xff\x7f\x87\x0f\xff\x7f\x8a\x12\xff\x7a\xdb\x75\xff\x78\xff\xa2\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x79\xfd\x9b\xff\x85\xe4\x62\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xcb\x37\xde\x8d\xb6\x2a\ -\x2c\x8d\xba\x2d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xa6\x21\x00\x8d\xd5\x3e\x00\x8d\xbe\x2f\ -\x5e\x8d\xcf\x39\xf7\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x85\xe3\x60\xff\x7a\xfc\x99\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7b\xcc\x62\ +\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff|\xb9L\xffx\xff\xa2\ +\xffx\xf8\x98\xffz\xdex\xff|\xb8K\xff~\x97#\ +\xff\x7f\x87\x0f\xff\x7f\x8a\x12\xffz\xdbu\xffx\xff\xa2\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xffy\xfd\x9b\xff\x85\xe4b\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xcb7\xde\x8d\xb6*\ +,\x8d\xba-\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xa6!\x00\x8d\xd5>\x00\x8d\xbe/\ +^\x8d\xcf9\xf7\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x85\xe3`\xffz\xfc\x99\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa2\xff{\xccb\ \xff\x7f\x87\x0e\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff\x7c\xb2\x43\xff\x78\xfe\x9f\ -\xff\x78\xff\xa1\xff\x78\xff\xa2\xff\x78\xfe\x9f\xff\x79\xee\x8c\ -\xff\x7b\xcd\x64\xff\x7d\xa5\x33\xff\x7c\xc3\x57\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\ -\xff\x79\xfd\x9d\xff\x83\xe8\x6b\xff\x8d\xd4\x3e\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd0\x3a\xfe\x8d\xc1\x31\x7e\x8d\x08\x00\ +\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff|\xb2C\xffx\xfe\x9f\ +\xffx\xff\xa1\xffx\xff\xa2\xffx\xfe\x9f\xffy\xee\x8c\ +\xff{\xcdd\xff}\xa53\xff|\xc3W\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\ +\xffy\xfd\x9d\xff\x83\xe8k\xff\x8d\xd4>\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd0:\xfe\x8d\xc11~\x8d\x08\x00\ \x01\x8d\xa9\x22\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1\x27\x00\x8d\xaa\x23\ -\x0e\x8d\xc5\x34\xae\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x85\xe3\x61\xff\x7a\xfb\x97\xff\x78\xff\xa1\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7b\xd3\x6b\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb1'\x00\x8d\xaa#\ +\x0e\x8d\xc54\xae\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x85\xe3a\xffz\xfb\x97\xffx\xff\xa1\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa2\xff{\xd3k\ \xff\x7f\x88\x10\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff\x7d\xab\x3b\xff\x78\xfc\x9c\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\ -\xff\x78\xff\xa2\xff\x78\xf8\x98\xff\x79\xf1\x8f\xff\x78\xfe\x9f\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x79\xfc\x9b\ -\xff\x83\xe7\x6a\xff\x8d\xd4\x3e\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xc8\x35\xc5\x8d\xb1\x27\x1b\x8d\xb6\x2a\ +\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff}\xab;\xffx\xfc\x9c\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\ +\xffx\xff\xa2\xffx\xf8\x98\xffy\xf1\x8f\xffx\xfe\x9f\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\xffy\xfc\x9b\ +\xff\x83\xe7j\xff\x8d\xd4>\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xc85\xc5\x8d\xb1'\x1b\x8d\xb6*\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x95\x15\x00\x8d\xc1\x31\ -\x00\x8d\xb7\x2b\x36\x8d\xcb\x37\xdf\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x87\xe0\x59\xff\x7c\xf7\x8e\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa2\xff\x7a\xd9\x73\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x95\x15\x00\x8d\xc11\ +\x00\x8d\xb7+6\x8d\xcb7\xdf\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x87\xe0Y\xff|\xf7\x8e\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa2\xffz\xd9s\ \xff\x7f\x8a\x12\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff\x7d\xa5\x33\xff\x78\xf9\x9a\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x78\xff\xa1\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa1\xff\x7b\xf9\x94\xff\x85\xe3\x61\ -\xff\x8d\xd4\x3d\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xcd\x38\xec\x8d\xbb\x2d\x4b\x8d\xcc\x38\x00\x8d\xa6\x20\ +\xff\x7f\x87\x0f\xff\x7f\x85\x0d\xff}\xa53\xffx\xf9\x9a\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xffx\xff\xa1\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa1\xff{\xf9\x94\xff\x85\xe3a\ +\xff\x8d\xd4=\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xcd8\xec\x8d\xbb-K\x8d\xcc8\x00\x8d\xa6 \ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa6\x20\ -\x00\x8d\xff\xff\x00\x8d\xbd\x2f\x63\x8d\xce\x39\xf3\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\xff\x8a\xda\x4b\ -\xff\x80\xee\x79\xff\x79\xfd\x9b\xff\x78\xff\xa3\xff\x7a\xe0\x7b\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xa6 \ +\x00\x8d\xff\xff\x00\x8d\xbd/c\x8d\xce9\xf3\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\xff\x8a\xdaK\ +\xff\x80\xeey\xffy\xfd\x9b\xffx\xff\xa3\xffz\xe0{\ \xff\x7f\x8c\x15\xff\x7f\x87\x0f\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x86\x0d\xff\x7e\x9f\x2c\xff\x78\xf7\x96\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa1\ -\xff\x79\xfe\x9e\xff\x7e\xf2\x81\xff\x89\xdc\x51\xff\x8d\xd3\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd0\x3a\ -\xfb\x8d\xc0\x31\x7f\x8d\x8d\x11\x04\x8d\xaa\x23\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xad\x25\x00\x8d\x9f\x1c\x07\x8d\xc1\x31\x85\x8d\xcf\x3a\ -\xfa\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\ -\xff\x8c\xd4\x3f\xff\x87\xe1\x5b\xff\x7e\xf4\x86\xff\x7a\xe4\x7d\ -\xff\x7e\x8e\x18\xff\x7f\x86\x0e\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ -\xff\x7f\x87\x0f\xff\x7f\x86\x0e\xff\x7e\x9a\x25\xff\x79\xf3\x91\ -\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x78\xff\xa0\xff\x78\xff\xa0\ -\xff\x78\xff\xa1\xff\x78\xff\xa1\xff\x79\xfe\x9d\xff\x7d\xf4\x88\ -\xff\x85\xe3\x60\xff\x8c\xd5\x41\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd1\x3b\xff\x8d\xc4\x33\ -\xa4\x8d\xab\x23\x10\x8d\xb3\x28\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xb3\x28\x00\x8d\xaa\x23\x0f\x8d\xc3\x32\ -\x98\x8d\xd0\x3a\xfc\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x8c\xd6\x42\xff\x88\xd6\x4c\ -\xff\x85\xab\x26\xff\x81\x94\x17\xff\x80\x8a\x11\xff\x7f\x87\x0f\ -\xff\x7f\x86\x0e\xff\x7f\x85\x0d\xff\x7e\x94\x1f\xff\x79\xee\x8d\ -\xff\x78\xff\xa3\xff\x78\xff\xa1\xff\x78\xff\xa0\xff\x79\xfd\x9c\ -\xff\x7b\xf9\x92\xff\x80\xef\x7c\xff\x86\xe1\x5c\xff\x8c\xd6\x43\ -\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd1\x3b\xff\x8d\xc5\x34\xb3\x8d\xb1\x28\ -\x1c\x8d\xbc\x2d\x00\x8d\x34\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb5\x29\x00\x8d\xae\x25\ -\x13\x8d\xc3\x32\x9b\x8d\xd0\x3a\xfb\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3b\ -\xff\x8d\xd3\x3c\xff\x8c\xcc\x38\xff\x89\xc0\x31\xff\x87\xb3\x29\ -\xff\x85\xa9\x23\xff\x84\xa2\x1e\xff\x83\xa6\x26\xff\x7f\xe4\x71\ -\xff\x7f\xf1\x7f\xff\x81\xec\x76\xff\x84\xe6\x68\xff\x87\xdf\x58\ -\xff\x8a\xd8\x48\xff\x8d\xd4\x3e\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd1\x3b\xfe\x8d\xc5\x34\xb1\x8d\xb2\x28\x20\x8d\xbf\x30\ +\xff\x7f\x87\x0f\xff\x7f\x86\x0d\xff~\x9f,\xffx\xf7\x96\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa1\ +\xffy\xfe\x9e\xff~\xf2\x81\xff\x89\xdcQ\xff\x8d\xd3;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd0:\ +\xfb\x8d\xc01\x7f\x8d\x8d\x11\x04\x8d\xaa#\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xad%\x00\x8d\x9f\x1c\x07\x8d\xc11\x85\x8d\xcf:\ +\xfa\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\ +\xff\x8c\xd4?\xff\x87\xe1[\xff~\xf4\x86\xffz\xe4}\ +\xff~\x8e\x18\xff\x7f\x86\x0e\xff\x7f\x87\x0f\xff\x7f\x87\x0f\ +\xff\x7f\x87\x0f\xff\x7f\x86\x0e\xff~\x9a%\xffy\xf3\x91\ +\xffx\xff\xa1\xffx\xff\xa0\xffx\xff\xa0\xffx\xff\xa0\ +\xffx\xff\xa1\xffx\xff\xa1\xffy\xfe\x9d\xff}\xf4\x88\ +\xff\x85\xe3`\xff\x8c\xd5A\xff\x8d\xd3;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd1;\xff\x8d\xc43\ +\xa4\x8d\xab#\x10\x8d\xb3(\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xb3(\x00\x8d\xaa#\x0f\x8d\xc32\ +\x98\x8d\xd0:\xfc\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd2;\xff\x8c\xd6B\xff\x88\xd6L\ +\xff\x85\xab&\xff\x81\x94\x17\xff\x80\x8a\x11\xff\x7f\x87\x0f\ +\xff\x7f\x86\x0e\xff\x7f\x85\x0d\xff~\x94\x1f\xffy\xee\x8d\ +\xffx\xff\xa3\xffx\xff\xa1\xffx\xff\xa0\xffy\xfd\x9c\ +\xff{\xf9\x92\xff\x80\xef|\xff\x86\xe1\x5c\xff\x8c\xd6C\ +\xff\x8d\xd3;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd1;\xff\x8d\xc54\xb3\x8d\xb1(\ +\x1c\x8d\xbc-\x00\x8d4\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb5)\x00\x8d\xae%\ +\x13\x8d\xc32\x9b\x8d\xd0:\xfb\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3;\ +\xff\x8d\xd3<\xff\x8c\xcc8\xff\x89\xc01\xff\x87\xb3)\ +\xff\x85\xa9#\xff\x84\xa2\x1e\xff\x83\xa6&\xff\x7f\xe4q\ +\xff\x7f\xf1\x7f\xff\x81\xecv\xff\x84\xe6h\xff\x87\xdfX\ +\xff\x8a\xd8H\xff\x8d\xd4>\xff\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd1;\xfe\x8d\xc54\xb1\x8d\xb2( \x8d\xbf0\ \x00\x8d\x8d\x12\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb4\x29\ -\x00\x8d\xad\x25\x11\x8d\xc2\x31\x8c\x8d\xce\x39\xf5\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd4\x3d\xff\x8d\xd4\x3d\ -\xff\x8d\xd3\x3c\xff\x8d\xd2\x3c\xff\x8d\xd2\x3b\xff\x8d\xd4\x3e\ -\xff\x8d\xd4\x3d\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x8d\xd2\x3b\ -\xff\x8d\xd3\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xcf\x3a\ -\xfa\x8d\xc3\x33\xa0\x8d\xb0\x27\x1a\x8d\xbe\x30\x00\x8d\x85\x0c\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb4)\ +\x00\x8d\xad%\x11\x8d\xc21\x8c\x8d\xce9\xf5\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd4=\xff\x8d\xd4=\ +\xff\x8d\xd3<\xff\x8d\xd2<\xff\x8d\xd2;\xff\x8d\xd4>\ +\xff\x8d\xd4=\xff\x8d\xd3<\xff\x8d\xd2;\xff\x8d\xd2;\ +\xff\x8d\xd3;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xcf:\ +\xfa\x8d\xc33\xa0\x8d\xb0'\x1a\x8d\xbe0\x00\x8d\x85\x0c\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\xb0\x27\x00\x8d\xa5\x20\x09\x8d\xbe\x2f\x68\x8d\xcb\x37\ -\xe2\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xcd\x38\xed\x8d\xc0\x31\ -\x7e\x8d\xad\x24\x0f\x8d\xb4\x29\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xb0'\x00\x8d\xa5 \x09\x8d\xbe/h\x8d\xcb7\ +\xe2\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xcd8\xed\x8d\xc01\ +~\x8d\xad$\x0f\x8d\xb4)\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x20\x00\ -\x00\x8d\x1e\x00\x00\x8d\x0f\x00\x00\x8d\xff\x9a\x00\x8d\xb5\x2a\ -\x40\x8d\xbe\x2f\xe5\x8d\xcb\x37\xff\x8d\xd2\x3b\xff\x8d\xd4\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd0\x3a\xfd\x8d\xc8\x35\xc7\x8d\xbb\x2d\x4d\x8d\x9f\x1c\ -\x04\x8d\xaa\x23\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d \x00\ +\x00\x8d\x1e\x00\x00\x8d\x0f\x00\x00\x8d\xff\x9a\x00\x8d\xb5*\ +@\x8d\xbe/\xe5\x8d\xcb7\xff\x8d\xd2;\xff\x8d\xd4<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd0:\xfd\x8d\xc85\xc7\x8d\xbb-M\x8d\x9f\x1c\ +\x04\x8d\xaa#\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xad\x25\x00\x8d\xa2\x1e\ -\x04\x8d\xc0\x30\x67\x8d\xc7\x34\x9a\x8d\xc4\x33\x73\x8d\xb9\x2c\ -\x65\x8d\xad\x25\xe7\x8d\xae\x26\xff\x8d\xb8\x2b\xff\x8d\xc5\x33\ -\xff\x8d\xcf\x3a\xff\x8d\xd3\x3c\xff\x8d\xd4\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd1\x3b\xfe\x8d\xcb\x37\ -\xdc\x8d\xc1\x31\x7b\x8d\xb1\x27\x1a\x8d\xff\x53\x00\x8d\x7f\x0f\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xad%\x00\x8d\xa2\x1e\ +\x04\x8d\xc00g\x8d\xc74\x9a\x8d\xc43s\x8d\xb9,\ +e\x8d\xad%\xe7\x8d\xae&\xff\x8d\xb8+\xff\x8d\xc53\ +\xff\x8d\xcf:\xff\x8d\xd3<\xff\x8d\xd4<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd1;\xfe\x8d\xcb7\ +\xdc\x8d\xc11{\x8d\xb1'\x1a\x8d\xffS\x00\x8d\x7f\x0f\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb6\x2a\x00\x8d\xb4\x29\ -\x1d\x8d\xcb\x37\xd9\x8d\xd3\x3c\xff\x8d\xd1\x3b\xfe\x8d\xcf\x3a\ -\xfa\x8d\xca\x37\xfe\x8d\xc4\x33\xff\x8d\xbd\x2e\xff\x8d\xb8\x2b\ -\xff\x8d\xb9\x2c\xff\x8d\xc0\x30\xff\x8d\xc8\x35\xff\x8d\xce\x39\ -\xff\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd0\x3a\xfb\x8d\xca\x37\xd4\x8d\xc2\x31\x80\x8d\xb5\x2a\ -\x27\x8d\x8b\x10\x02\x8d\x9f\x1c\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xb6*\x00\x8d\xb4)\ +\x1d\x8d\xcb7\xd9\x8d\xd3<\xff\x8d\xd1;\xfe\x8d\xcf:\ +\xfa\x8d\xca7\xfe\x8d\xc43\xff\x8d\xbd.\xff\x8d\xb8+\ +\xff\x8d\xb9,\xff\x8d\xc00\xff\x8d\xc85\xff\x8d\xce9\ +\xff\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd0:\xfb\x8d\xca7\xd4\x8d\xc21\x80\x8d\xb5*\ +'\x8d\x8b\x10\x02\x8d\x9f\x1c\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xbf\x30\x00\x8d\xbc\x2e\ -\x3c\x8d\xcf\x39\xf1\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd4\x3c\xff\x8d\xd4\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\ -\xff\x8d\xcf\x39\xff\x8d\xca\x36\xff\x8d\xc6\x34\xff\x8d\xc4\x33\ -\xff\x8d\xc4\x33\xff\x8d\xc6\x34\xff\x8d\xc8\x35\xff\x8d\xcb\x37\ -\xff\x8d\xce\x39\xff\x8d\xd0\x3a\xff\x8d\xd1\x3b\xff\x8d\xd2\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd1\x3b\xff\x8d\xcf\x3a\xf7\x8d\xcc\x38\xdc\x8d\xc7\x34\ -\xa9\x8d\xbf\x30\x5f\x8d\xb3\x28\x1d\x8d\x86\x0d\x01\x8d\x99\x19\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\xbf0\x00\x8d\xbc.\ +<\x8d\xcf9\xf1\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd4<\xff\x8d\xd4<\xff\x8d\xd3<\xff\x8d\xd2;\ +\xff\x8d\xcf9\xff\x8d\xca6\xff\x8d\xc64\xff\x8d\xc43\ +\xff\x8d\xc43\xff\x8d\xc64\xff\x8d\xc85\xff\x8d\xcb7\ +\xff\x8d\xce9\xff\x8d\xd0:\xff\x8d\xd1;\xff\x8d\xd2<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd1;\xff\x8d\xcf:\xf7\x8d\xcc8\xdc\x8d\xc74\ +\xa9\x8d\xbf0_\x8d\xb3(\x1d\x8d\x86\x0d\x01\x8d\x99\x19\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1820,15 +1034,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xa1\x1e\x00\x8d\xcd\x38\x00\x8d\xc1\x31\ -\x64\x8d\xd1\x3b\xfe\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd4\x3c\xff\x8d\xd4\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd1\x3b\xff\x8d\xcf\x39\xff\x8d\xcb\x37\xff\x8d\xc7\x35\ -\xff\x8d\xc3\x32\xff\x8d\xbf\x30\xff\x8d\xbd\x2f\xff\x8d\xbc\x2e\ -\xff\x8d\xbb\x2e\xff\x8d\xbc\x2e\xff\x8d\xbd\x2e\xff\x8d\xbc\x2e\ -\xed\x8d\xc0\x31\x81\x8d\xbe\x2f\x48\x8d\xb5\x2a\x20\x8d\x9f\x1d\ -\x06\x8d\xcb\x34\x00\x8d\x63\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xa1\x1e\x00\x8d\xcd8\x00\x8d\xc11\ +d\x8d\xd1;\xfe\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd4<\xff\x8d\xd4<\xff\x8d\xd3<\ +\xff\x8d\xd1;\xff\x8d\xcf9\xff\x8d\xcb7\xff\x8d\xc75\ +\xff\x8d\xc32\xff\x8d\xbf0\xff\x8d\xbd/\xff\x8d\xbc.\ +\xff\x8d\xbb.\xff\x8d\xbc.\xff\x8d\xbd.\xff\x8d\xbc.\ +\xed\x8d\xc01\x81\x8d\xbe/H\x8d\xb5* \x8d\x9f\x1d\ +\x06\x8d\xcb4\x00\x8dc\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1836,14 +1050,14 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xaa\x23\x00\x8d\xff\x99\x00\x8d\xc5\x34\ -\x8f\x8d\xd2\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x8d\xcf\x39\xff\x8d\xca\x36\ -\xff\x8d\xc4\x33\xff\x8d\xbd\x2f\xff\x8d\xb6\x2a\xff\x8d\xb1\x27\ -\xd7\x8d\xb2\x28\x38\x8d\xa9\x22\x0f\x8d\x85\x10\x02\x8d\xa7\x1b\ +\x00\x00\x00\x00\x00\x8d\xaa#\x00\x8d\xff\x99\x00\x8d\xc54\ +\x8f\x8d\xd2;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd2;\xff\x8d\xcf9\xff\x8d\xca6\ +\xff\x8d\xc43\xff\x8d\xbd/\xff\x8d\xb6*\xff\x8d\xb1'\ +\xd7\x8d\xb2(8\x8d\xa9\x22\x0f\x8d\x85\x10\x02\x8d\xa7\x1b\ \x00\x8d\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1852,15 +1066,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xae\x26\x00\x8d\xa3\x1f\x09\x8d\xc9\x36\ -\xb8\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd4\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x8d\xcf\x3a\ -\xfc\x8d\xcd\x38\xe8\x8d\xca\x37\xcd\x8d\xc5\x34\xa5\x8d\xbb\x2d\ -\x3b\x8d\xc9\x35\x00\x8d\xa8\x22\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xae&\x00\x8d\xa3\x1f\x09\x8d\xc96\ +\xb8\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd4<\xff\x8d\xd3<\xff\x8d\xd2;\xff\x8d\xcf:\ +\xfc\x8d\xcd8\xe8\x8d\xca7\xcd\x8d\xc54\xa5\x8d\xbb-\ +;\x8d\xc95\x00\x8d\xa8\x22\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1868,15 +1082,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xb6\x2a\x00\x8d\xb5\x2a\x1d\x8d\xcc\x38\ -\xd9\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd2\x3b\xff\x8d\xc4\x33\ -\x8b\x8d\xff\x65\x00\x8d\xa9\x22\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xb6*\x00\x8d\xb5*\x1d\x8d\xcc8\ +\xd9\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd2;\xff\x8d\xc43\ +\x8b\x8d\xffe\x00\x8d\xa9\x22\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1884,15 +1098,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xbd\x2f\x00\x8d\xbc\x2e\x35\x8d\xce\x39\ -\xef\x8d\xd4\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd1\x3b\xff\x8d\xc3\x32\ -\x72\x8d\xd8\x3f\x00\x8d\xa7\x21\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xbd/\x00\x8d\xbc.5\x8d\xce9\ +\xef\x8d\xd4<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd1;\xff\x8d\xc32\ +r\x8d\xd8?\x00\x8d\xa7!\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1900,15 +1114,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\xb8\x2c\x00\x8d\xb7\x2b\x1f\x8d\xc7\x35\ -\xb7\x8d\xce\x39\xe9\x8d\xd0\x3a\xf9\x8d\xd2\x3b\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xcf\x3a\xf6\x8d\xbe\x2f\ -\x49\x8d\xc3\x32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\xb8,\x00\x8d\xb7+\x1f\x8d\xc75\ +\xb7\x8d\xce9\xe9\x8d\xd0:\xf9\x8d\xd2;\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xcf:\xf6\x8d\xbe/\ +I\x8d\xc32\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1916,15 +1130,15 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\x8e\x13\x00\x8d\x5a\x00\x00\x8d\xae\x26\ -\x10\x8d\xb9\x2c\x2d\x8d\xbf\x30\x50\x8d\xc3\x33\x7a\x8d\xc7\x35\ -\xa5\x8d\xcb\x37\xcb\x8d\xcd\x39\xe7\x8d\xd0\x3a\xf9\x8d\xd2\x3b\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xcd\x38\xe3\x8d\xb8\x2b\ -\x27\x8d\xb9\x2c\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8d\x8e\x13\x00\x8dZ\x00\x00\x8d\xae&\ +\x10\x8d\xb9,-\x8d\xbf0P\x8d\xc33z\x8d\xc75\ +\xa5\x8d\xcb7\xcb\x8d\xcd9\xe7\x8d\xd0:\xf9\x8d\xd2;\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xcd8\xe3\x8d\xb8+\ +'\x8d\xb9,\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1933,14 +1147,14 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x8d\x4c\x00\x00\x8d\xda\x33\x00\x8d\x93\x17\ -\x04\x8d\xaf\x26\x12\x8d\xb9\x2c\x2c\x8d\xbf\x30\x4f\x8d\xc3\x32\ -\x79\x8d\xc7\x35\xa4\x8d\xca\x37\xc9\x8d\xcd\x38\xe6\x8d\xd0\x3a\ -\xf8\x8d\xd1\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xca\x36\xc5\x8d\xac\x24\ -\x0f\x8d\xb1\x27\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x8dL\x00\x00\x8d\xda3\x00\x8d\x93\x17\ +\x04\x8d\xaf&\x12\x8d\xb9,,\x8d\xbf0O\x8d\xc32\ +y\x8d\xc75\xa4\x8d\xca7\xc9\x8d\xcd8\xe6\x8d\xd0:\ +\xf8\x8d\xd1;\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xca6\xc5\x8d\xac$\ +\x0f\x8d\xb1'\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1950,13 +1164,13 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x32\x00\x00\x8d\xd9\x2e\ -\x00\x8d\x90\x16\x03\x8d\xaf\x26\x11\x8d\xb9\x2c\x2a\x8d\xbf\x30\ -\x4d\x8d\xc3\x32\x77\x8d\xc7\x35\xa2\x8d\xca\x37\xc8\x8d\xcd\x38\ -\xe5\x8d\xd0\x3a\xf8\x8d\xd1\x3b\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd3\x3c\xff\x8d\xc7\x34\x9f\x8d\x5e\x00\ -\x02\x8d\xac\x24\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d2\x00\x00\x8d\xd9.\ +\x00\x8d\x90\x16\x03\x8d\xaf&\x11\x8d\xb9,*\x8d\xbf0\ +M\x8d\xc32w\x8d\xc75\xa2\x8d\xca7\xc8\x8d\xcd8\ +\xe5\x8d\xd0:\xf8\x8d\xd1;\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xd3<\ +\xff\x8d\xd3<\xff\x8d\xd3<\xff\x8d\xc74\x9f\x8d^\x00\ +\x02\x8d\xac$\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1968,11 +1182,11 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x8d\x0d\x00\ -\x00\x8d\xd6\x29\x00\x8d\x8c\x15\x03\x8d\xae\x25\x11\x8d\xb9\x2c\ -\x29\x8d\xbf\x30\x4b\x8d\xc3\x32\x75\x8d\xc7\x35\x9f\x8d\xca\x37\ -\xc5\x8d\xcd\x38\xe3\x8d\xcf\x3a\xf5\x8d\xd1\x3b\xfe\x8d\xd2\x3c\ -\xff\x8d\xd3\x3c\xff\x8d\xd1\x3b\xff\x8d\xc3\x32\x73\x8d\xd9\x40\ -\x00\x8d\xa6\x20\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x8d\xd6)\x00\x8d\x8c\x15\x03\x8d\xae%\x11\x8d\xb9,\ +)\x8d\xbf0K\x8d\xc32u\x8d\xc75\x9f\x8d\xca7\ +\xc5\x8d\xcd8\xe3\x8d\xcf:\xf5\x8d\xd1;\xfe\x8d\xd2<\ +\xff\x8d\xd3<\xff\x8d\xd1;\xff\x8d\xc32s\x8d\xd9@\ +\x00\x8d\xa6 \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1985,9 +1199,9 @@ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ -\x00\x8d\x00\x00\x00\x8d\xce\x25\x00\x8d\x89\x13\x03\x8d\xad\x25\ -\x12\x8d\xb8\x2c\x2d\x8d\xbe\x30\x54\x8d\xc3\x32\x83\x8d\xc7\x34\ -\xb4\x8d\xca\x37\xe2\x8d\xc8\x35\xe0\x8d\xba\x2d\x3c\x8d\xbe\x2f\ +\x00\x8d\x00\x00\x00\x8d\xce%\x00\x8d\x89\x13\x03\x8d\xad%\ +\x12\x8d\xb8,-\x8d\xbe0T\x8d\xc32\x83\x8d\xc74\ +\xb4\x8d\xca7\xe2\x8d\xc85\xe0\x8d\xba-<\x8d\xbe/\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\x00\ @@ -1996,13 +1210,13 @@ \x00\xff\xff\xff\x00\xff\xff\xff\x00\xff\xff\xff\x01\x7f\xff\xfe\ \x00\x00\x7f\xff\xfe\xff\xff\xf8\x00\x00\x1f\xff\xff\xff\xff\xe0\ \x00\x00\x07\xff\xff\xff\xff\x80\x00\x00\x01\xff\xff\xff\xff\x00\ -\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00\x3f\xff\xff\xf8\x00\ +\x00\x00\x00\x7f\xff\xff\xfc\x00\x00\x00\x00?\xff\xff\xf8\x00\ \x00\x00\x00\x1f\xff\xff\xf0\x00\x00\x00\x00\x0f\xff\xff\xe0\x00\ \x00\x00\x00\x07\xff\xff\xc0\x00\x00\x00\x00\x03\xff\xff\xc0\x00\ \x00\x00\x00\x01\xff\xff\x80\x00\x00\x00\x00\x01\xff\xff\x00\x00\ \x00\x00\x00\x00\xff\xff\x00\x00\x00\x00\x00\x00\xff\xfe\x00\x00\ \x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x00\x00\x00\x7f\xfc\x00\x00\ -\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x00\x00\x3f\xfc\x00\x00\ +\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x00?\xfc\x00\x00\ \x00\x00\x00\x00\x1f\xf8\x00\x00\x00\x00\x00\x00\x1f\xf8\x00\x00\ \x00\x00\x00\x00\x1f\xf8\x00\x00\x00\x00\x00\x00\x1f\xf8\x00\x00\ \x00\x00\x00\x00\x0f\xf0\x00\x00\x00\x00\x00\x00\x0f\xf0\x00\x00\ @@ -2012,1081 +1226,1086 @@ \x00\x00\x00\x00\x0f\xf8\x00\x00\x00\x00\x00\x00\x0f\xf8\x00\x00\ \x00\x00\x00\x00\x1f\xf8\x00\x00\x00\x00\x00\x00\x1f\xf8\x00\x00\ \x00\x00\x00\x00\x1f\xfc\x00\x00\x00\x00\x00\x00\x1f\xfc\x00\x00\ -\x00\x00\x00\x00\x3f\xfc\x00\x00\x00\x00\x00\x00\x3f\xfe\x00\x00\ +\x00\x00\x00\x00?\xfc\x00\x00\x00\x00\x00\x00?\xfe\x00\x00\ \x00\x00\x00\x00\x7f\xfe\x00\x00\x00\x00\x00\x00\x7f\xff\x00\x00\ \x00\x00\x00\x00\x7f\xff\x00\x00\x00\x00\x00\x00\xff\xff\x80\x00\ \x00\x00\x00\x01\xff\xff\xc0\x00\x00\x00\x00\x01\xff\xff\xc0\x00\ \x00\x00\x00\x03\xff\xff\xe0\x00\x00\x00\x00\x07\xff\xff\xf0\x00\ \x00\x00\x00\x0f\xff\xff\xf8\x00\x00\x00\x00\x1f\xff\xff\xfc\x00\ -\x00\x00\x00\x3f\xff\xff\xff\x00\x00\x00\x00\x7f\xff\xff\xf0\x00\ +\x00\x00\x00?\xff\xff\xff\x00\x00\x00\x00\x7f\xff\xff\xf0\x00\ \x00\x00\x01\xff\xff\xff\xf0\x00\x00\x00\x03\xff\xff\xff\xf0\x00\ \x00\x00\x0f\xff\xff\xff\xf0\x00\x00\x00\x7f\xff\xff\xff\xf0\x00\ \x00\x00\xff\xff\xff\xff\xe0\x00\x00\x00\x7f\xff\xff\xff\xe0\x00\ \x00\x00\x7f\xff\xff\xff\xe0\x00\x00\x00\x7f\xff\xff\xff\xe0\x00\ \x00\x00\x7f\xff\xff\xff\xf0\x00\x00\x00\x7f\xff\xff\xff\xff\x00\ \x00\x00\x7f\xff\xff\xff\xff\xf8\x00\x00\x7f\xff\xff\xff\xff\xff\ -\xc0\x00\xff\xff\xff\x7f\xff\xff\xfe\x00\xff\xff\xfe\x89\x50\x4e\ -\x47\x0d\x0a\x1a\x0a\x00\x00\x00\x0d\x49\x48\x44\x52\x00\x00\x01\ -\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5c\x72\xa8\x66\x00\x00\ -\x40\x4b\x49\x44\x41\x54\x78\xda\xed\xbd\x79\x9c\x1d\xd7\x5d\xe0\ -\xfb\x3d\xe7\x54\xd5\xdd\x7b\x53\x77\x6b\x97\x25\xb5\xb5\x78\x89\ -\xb3\x98\x2c\x24\x84\x90\x0d\xcf\x0c\x90\x47\x20\x31\x84\x10\x18\ -\x60\x58\x27\x0c\x79\x13\xf6\xc9\x83\x07\x0c\x5b\x86\x1e\x96\xc0\ -\x10\xde\x30\x90\x04\x02\x44\x26\x0b\x09\x4c\x20\x2f\x84\x00\x21\ -\x21\x89\x63\x67\xb3\xbc\x45\xb6\x64\x59\x96\xb5\x74\xb7\xba\xfb\ -\x6e\xb5\x9c\x73\xe6\x8f\xba\xb7\xd5\x92\x5a\x52\x4b\xba\xb7\xaa\ -\xee\xed\xfa\x7e\x3e\x6d\x6b\x69\x75\x9d\x5b\x55\xbf\xf5\xfc\x7e\ -\xbf\x23\xc8\xc9\xb9\x01\xb6\xbc\x7d\x16\xbf\x01\x23\xd3\x14\xa4\ -\x62\x02\xc1\x0e\x21\x39\x20\x25\x77\x48\xc5\xcd\x42\x31\x82\x45\ -\xea\x90\x27\x8d\xe1\xdd\x42\xf0\x31\x20\x3c\x72\xf7\x9b\xd3\x5e\ -\xfa\x86\xc4\x5a\x7b\xc1\xef\x45\xe7\x0f\x54\xe7\xf7\x5a\x08\x91\ -\xf6\x1a\x73\x32\xca\x96\xdf\x9e\x65\xf9\x2b\x30\xf5\x02\x0a\x42\ -\x30\x8a\x60\xbb\x90\xec\x96\x92\x5b\x85\xe2\x80\x72\xd8\xa7\x1c\ -\xb6\x2b\x8f\x09\xc7\xa3\xa4\x3c\xa4\xec\xbc\x59\x41\x13\x9a\x0b\ -\x9c\x88\x02\x7e\xd6\x1a\xde\x25\x24\xe4\x4a\x20\x79\x3a\xf2\xee\ -\x01\x16\x08\x9d\x55\x7f\x97\x4b\x7e\xce\x0a\x37\xfd\xc9\x6c\xfc\ -\x0b\x41\x41\x48\xc6\x84\x60\x9b\x90\xcc\x54\xb7\x71\x50\x28\x6e\ -\x55\x0e\x7b\x95\xc3\x4e\xe5\x31\xee\x78\x14\x95\x87\x50\x2e\x48\ -\x15\x7f\x5d\x8c\x5b\x04\xe5\xb1\x7d\xe9\x24\xff\x29\x0a\xf8\x07\ -\xe0\x78\xda\x9f\x71\x03\x13\x76\x7f\xe1\x74\x2c\xbe\x4e\x7b\x45\ -\x39\xe9\xb1\xf3\x8f\x67\x31\x11\xc2\x29\xe2\x75\xdc\xf8\xad\x42\ -\xb2\x4f\x4a\xf6\x4b\xc5\xad\xd2\x61\x46\xb9\x6c\x57\xee\xfa\x84\ -\xfd\x72\x14\x2a\xe0\x55\xb8\x35\x0a\x79\x2e\xb9\x02\x48\x85\x8e\ -\xbc\xaf\xc4\x01\xb9\xd5\xdf\x60\xec\xf8\xa3\x59\x82\x36\xa2\x34\ -\x42\x41\x4a\xc6\x3b\x6e\xfc\x8c\x94\xdc\x2a\x1d\x0e\x48\xc5\x3e\ -\xe5\xb2\xb5\xe3\xc6\x7b\x8e\xdb\x11\x76\x07\x84\xbc\xf1\xeb\x37\ -\x17\x60\xe9\x14\x6f\x51\x1e\xbf\x1c\xf9\x79\x18\x90\x36\xce\x8d\ -\xff\x88\x9c\xac\xb2\xe3\x8f\x67\xb1\x1a\xe1\x96\x28\x0a\xc1\xb8\ -\x90\xec\x10\x82\xbd\xc5\x1a\xb7\x49\xc5\x01\xe9\x32\xa3\x1c\xb6\ -\x39\x1e\xe3\xca\xc3\x73\x3c\x84\x74\x40\xf5\x48\xd8\xd7\x42\x79\ -\x20\x14\xb7\xb7\x97\xf0\x9c\x02\x41\xda\xf7\x68\xa3\x93\x2b\x80\ -\x21\xe1\xa6\x3f\x99\xc5\x5a\x84\x94\x14\x85\x64\x42\x48\xb6\x0b\ -\xc1\x3e\xa1\x38\x20\x25\xb7\x49\x97\xdd\xca\x61\x87\xe3\x31\xaa\ -\x3c\x0a\x8e\x07\x5d\x37\xbe\x5f\xc2\xbe\x16\x8e\x0b\xca\x61\xaf\ -\x90\x8c\x02\x67\xd2\xbe\x6f\x1b\x9d\x5c\x01\x0c\x20\xbb\xde\xd5\ -\x11\x76\x45\x51\x4a\x36\x75\x84\x7d\xbf\x50\x1c\x90\x8a\x5b\xa4\ -\xc3\x5e\xe5\xb2\xcd\x71\x19\x73\x3c\x3c\x95\x92\xb0\xaf\x45\xc7\ -\xc3\xd8\x29\x24\xdb\xc9\x15\x40\xea\xe4\x39\x80\x0c\xa3\xde\x3c\ -\xcb\xee\xe7\x43\x73\x01\x51\xa8\x50\x12\xb1\xb0\xef\x10\x82\x9b\ -\x85\xe2\x56\xa9\xd8\x2f\x1d\x6e\x76\x5c\xb6\x28\xaf\x23\xec\x6e\ -\x76\x84\xfd\x72\x2c\x9d\xa2\x55\x9f\xe3\xf5\x42\xf0\x7e\xc8\xf3\ -\x00\x69\x92\x7b\x00\x19\x62\xe7\x3b\x66\x31\x1a\xe1\x16\x29\x0b\ -\xc1\x84\x90\xec\x02\x66\x2a\x9b\xb8\x4d\x2a\xf6\xab\x38\x1b\xbf\ -\x45\x79\x8c\xae\x58\x76\x27\xdb\xc2\xbe\x16\x8e\x47\x49\x48\x6e\ -\x55\x2e\xef\xd7\x79\x16\x20\x55\x72\x05\x90\x12\xbb\xdf\x1d\x6f\ -\xbd\x49\x87\xb2\x90\x6c\x12\x82\x9d\x42\xb2\x5f\x48\x0e\x4a\xc5\ -\x2d\x2a\x8e\xd9\xb7\x29\x8f\xda\x20\x0b\xfb\x25\x88\x38\x11\x28\ -\x15\xb7\xb4\x97\x70\xdd\xe2\xf9\x3d\xe9\x9c\xe4\xc9\x15\x40\x02\ -\xec\xfe\xd3\x59\x8c\x46\x0a\x45\x49\x4a\xa6\x84\x8c\xcb\x65\x9d\ -\x42\x1c\xb3\x2b\x87\xdd\xca\x63\xab\x72\x19\x71\x0a\xb8\xca\x1d\ -\x12\x61\x5f\x0b\xdb\x09\x51\x1c\x6e\x96\x8a\x51\xe0\x6c\xda\x4b\ -\xda\xc8\xe4\x0a\xa0\xc7\xec\x7a\x57\x2c\xec\x8e\x47\x59\x48\x26\ -\x85\x60\x97\x90\xec\x73\xe2\x7d\xf6\xfd\x2a\x4e\xd0\x6d\x56\x2e\ -\xa3\x8e\x87\xe3\x78\x71\x62\x6c\x28\x85\xfd\x32\x48\xb5\x92\x08\ -\xdc\x46\xae\x00\x52\x25\x4f\x02\x5e\x27\xd3\xbf\x3d\x4b\x75\x2b\ -\x04\x0d\xa4\xe3\x51\xed\xb8\xf1\x37\x09\xc9\xcd\x42\x72\x5b\x47\ -\xd8\xf7\x28\x97\xcd\x8e\xc7\x88\xf2\x70\x9c\x4e\x41\x8d\x74\x60\ -\xa3\xb7\x5c\x74\x12\x81\xaf\x13\x82\xbf\x82\x3c\x11\x98\x16\xb9\ -\x07\xb0\x1e\xbe\x73\x96\x99\x57\x43\xd8\x40\x4a\x45\x55\x48\xa6\ -\x84\x60\xa7\x80\x83\xa5\x11\x0e\x88\xd8\x8d\xdf\xa5\x5c\xb6\x3a\ -\x1e\xd5\x15\x61\xef\x66\xe3\x37\xb8\xb0\xaf\x85\xe3\x51\x12\x82\ -\xdb\xa4\xe2\xaf\x4c\x5e\x88\x9e\x1a\xb9\x02\xb8\x88\x4d\xbf\x35\ -\xcb\xd4\x5e\x68\x9e\x43\x49\x45\x45\x48\xa6\x85\x60\x27\x9a\x83\ -\x5e\x99\x83\xca\xe1\xa0\x74\xb8\xc9\xf1\x98\x56\x2e\x35\xc7\xc3\ -\xe9\x26\xe8\x44\x2e\xec\xeb\xe3\x7c\x22\xf0\x80\xdf\xc0\x71\x8b\ -\x44\x69\x2f\x69\xa3\xb2\xa1\x15\xc0\xb6\xff\x39\xcb\xe9\xc7\x61\ -\xeb\x7e\x94\x72\x57\x2c\xfb\xee\xb0\xcd\x3e\xaf\xc2\x6d\x4a\xb1\ -\x4f\x3a\xec\x71\x3c\xa6\x3a\xc2\xae\x2e\x11\x76\xc1\xaa\xd6\x8a\ -\x9c\x75\x71\x3e\x11\x78\x40\x3a\x8c\x91\xe7\x01\x52\x63\xc3\x28\ -\x80\x89\xdf\x98\xe5\x05\x3f\x00\x5f\x7a\x1f\x4a\x79\xd4\x84\x60\ -\x4a\x08\xf6\xdc\xf4\x2c\xf6\xc9\x4e\x51\x8d\x72\xb9\x49\xb9\x4c\ -\x2b\x8f\xaa\xe3\xa1\xba\xd9\xf8\x2b\x0a\x7b\x2e\xfc\xd7\x85\x54\ -\xa0\x5c\xb6\x0b\xc1\x16\x72\x05\x90\x1a\x43\xaa\x00\x66\xd9\x7b\ -\x08\x74\x80\x23\x24\x55\x21\xd8\x2c\x04\x37\x3d\xfc\xb7\x1c\x2c\ -\xd6\x3a\x5b\x6f\x2e\x3b\x3b\xc2\x5e\xc9\x85\x3d\x79\xa4\x04\xc7\ -\x63\x93\x90\xdc\x8c\xe0\xcb\x69\xaf\x67\xa3\x32\xf0\x0a\x60\xcf\ -\x9f\xcd\x12\x45\xa0\x14\x0e\x50\x15\x92\x2d\x42\x70\x93\x80\x83\ -\x5e\x89\x83\xd2\xe1\x40\x27\x41\x37\xd5\xb1\xec\xf2\x12\x61\x5f\ -\x8b\x5c\xd8\xfb\x4b\x9c\x07\x28\x09\xc1\x01\xa5\x60\xe6\xd0\x6c\ -\xbe\x13\x90\x02\x03\xad\x00\xf6\xbe\x67\x16\x01\x63\xae\xe2\x65\ -\x52\xf1\xf5\xca\x65\x7f\xa7\xa8\x66\x93\xe3\x52\x55\x1e\xd2\xf1\ -\x3a\x99\xf8\x3c\x41\x97\x39\x3a\xcf\xe6\xd6\x76\x3d\xaf\x08\x4c\ -\x8b\x81\x55\x00\x33\x87\x66\xc1\x32\x8a\xe0\x57\x8a\x15\xbe\xbb\ -\x34\x4a\xd9\x2d\x9e\x1f\x5c\x91\x27\xe8\xb2\x4f\x27\x11\xb8\x5f\ -\x3a\x8c\x00\x73\x69\xaf\x67\x23\x32\x90\x0a\x60\xe6\xd0\x2c\x42\ -\x80\xb5\xbc\xa6\x50\xe5\x7b\x46\xb7\x50\x54\xdd\x31\x87\xab\xc9\ -\x85\x3f\xd3\x5c\x94\x08\xcc\x15\x40\x0a\x0c\x6c\xf1\x69\xbb\x81\ -\x92\x0e\x2f\x28\x8f\x5d\x46\xf8\x73\x32\x8f\x94\xa0\x5c\x26\x85\ -\x60\x26\xed\xb5\x6c\x54\x06\x56\x01\x60\x51\xd2\x61\x2c\x17\xfe\ -\x01\x46\x80\x53\xa0\x24\x14\x07\x94\xdb\x09\xeb\x72\x12\x65\x60\ -\x15\x80\x10\x58\x6b\x30\x98\xb4\x57\x92\x73\x23\x38\x2e\x48\xc9\ -\xed\xed\xe5\xc1\x0c\x47\x07\x9d\x81\x55\x00\xe3\x3b\x08\x8d\xe6\ -\x09\x1d\x92\xb7\x34\x0d\x30\x2a\xee\x86\x9c\x91\x8a\x91\xb4\xd7\ -\xb2\x11\x19\x48\x05\x70\xe4\xee\x37\xd3\x5c\x00\xa3\x79\x38\x0a\ -\xb0\x79\x08\x30\xb8\x74\x12\x81\xbb\x84\x64\x6b\xda\x6b\xd9\x88\ -\x0c\xa4\x02\x00\xb0\x16\xac\xe1\xc1\x28\x60\xd1\xe6\x0a\x60\x60\ -\xe9\x24\x02\xc7\x85\x60\x07\xe4\x79\x80\xa4\x19\x58\x05\x00\x80\ -\xe5\xb8\x0e\x38\x63\xf3\x76\xd2\xc1\x45\x80\xe3\xe2\x09\xc9\xf8\ -\x46\x19\x88\x92\x25\x06\xfa\x96\x1b\xc3\x59\x1d\x71\x44\xe7\xcd\ -\xa4\x83\x8e\x05\x4c\x1e\xca\x25\xcf\x40\x2b\x80\x37\xbe\x9e\xa6\ -\x89\x78\x28\x0a\xc8\x13\x81\x03\x8a\xb5\x10\xf9\x44\xd6\xe4\xa1\ -\x5c\x1a\x0c\xac\x02\x38\x72\xf7\x9b\xf9\x83\xbf\x04\x6b\x78\x40\ -\x07\xb9\xf5\x18\x38\xe2\x4a\x4e\x5a\x8b\xd0\x6e\xf0\x30\xf0\x50\ -\xda\x4b\xda\x88\x0c\xf4\xde\xab\xb5\x60\x0c\x0f\x47\x01\x75\x6b\ -\x19\xc9\x9b\x7d\x32\x4a\xa7\x27\xc3\x5a\xb0\x1a\x74\x04\x91\x0f\ -\x41\x0b\xdd\x5e\xe6\xcb\x26\xe4\x2d\x5e\x85\x63\x61\x2b\x9f\x0d\ -\x98\x34\x03\xad\x00\x00\xb0\x3c\xa1\x03\x4e\x59\xcd\x88\x18\xfc\ -\x4f\x33\xf8\xac\x21\xec\x3a\x80\xd0\xc7\xea\x80\x46\x14\x32\x6f\ -\x22\x8e\x99\x88\xaf\x18\xc3\xbd\xc0\xdf\x4b\xc9\x23\xb9\xf0\xa7\ -\xc3\xc0\x8b\x8c\x31\x9c\xd1\x11\x8f\xe9\x88\x7d\x72\xe0\x3f\xcd\ -\x80\xd1\xf5\xb8\x2c\x18\x1d\x0b\x7a\x14\x42\xe4\x63\x74\x40\x33\ -\x0a\x39\x6b\x22\x8e\x9b\x88\x87\xad\xe1\x21\x6b\x39\x6c\x2d\xc7\ -\xb0\x9c\x04\x96\x11\x44\xd6\xc0\x63\xaf\xcf\x05\x3f\x2d\x06\x5e\ -\x64\x96\x9f\xa6\xe9\xee\xe6\x61\x1d\x70\x97\x5b\x22\xef\x0b\xe8\ -\x17\xab\x84\xdd\x9a\x8e\xc0\xc7\xc2\x4e\xe8\x43\xd8\x26\xd4\x21\ -\xf7\x59\xcd\x17\x3a\xc2\xfe\x90\xb5\x3c\x0e\x9c\x02\x96\x5c\x17\ -\xbd\xbc\x04\x27\xbf\x37\x17\xf6\x2c\x31\xf0\x0a\x60\x7c\x17\x58\ -\xcd\x97\xa3\x38\x11\x38\xb0\x49\xcd\x4c\xb1\x86\xb0\x47\xc1\x8a\ -\x2b\xbf\x62\xe9\x4d\x14\xff\x7d\xe7\x7b\x35\xf0\x3b\xe7\x4e\xf1\ -\xe7\x73\x7f\x89\xbd\xe9\xfb\xe1\xd8\x1b\x72\x61\xcf\x3a\x03\x9f\ -\x36\x9b\x39\x34\x8b\x31\xbc\xa4\x32\xce\x87\x46\xb7\x52\xcb\x13\ -\x81\xd7\xc8\xc5\xc2\x1e\xc5\xc2\xdd\x15\xf6\x28\x88\x2d\xfd\x45\ -\xc2\x7e\xe9\x9b\x13\xc7\xfe\x3f\x8b\xe0\x57\xb1\x79\x3c\x3f\x28\ -\x0c\xbc\x07\x00\x80\xe1\xa8\x0e\x79\xda\x1a\x6a\x42\xa5\xbd\x98\ -\x0c\x73\x91\xb0\xeb\x08\x4c\x08\x61\x10\xbb\xf2\x91\xdf\xf9\xb3\ -\xae\xb0\xdb\x8b\xfe\x1d\x97\xf9\xfd\x79\x6e\xc3\xe2\x01\xf9\x99\ -\xbf\x03\xc2\x50\x28\x00\x6b\x38\xab\x43\x8e\xe9\x90\x7d\x32\x57\ -\x00\x31\x6b\x08\xbb\x0e\x63\x8b\xbe\x22\xec\x61\xec\xde\x5f\xd6\ -\xb2\x5f\x8b\x37\x15\x2b\x8b\x19\x60\x84\x7c\xcc\xf7\xc0\x30\x14\ -\x0a\xe0\x25\xaf\xa7\xf1\x2f\xef\xe5\xb0\x0e\x79\xc5\x86\x4c\x04\ -\xae\x9a\x7d\xb8\xda\x8d\x8f\x02\x88\xda\xab\xdc\x78\x7d\xde\xb2\ -\xaf\x69\xdc\xd7\x10\xf8\x95\x90\x4a\x5c\x3a\x54\x75\xa5\x72\xaf\ -\xb3\xed\x87\x65\xaf\xb5\xbc\xd2\x5a\x3e\xb1\xfb\xdd\xb3\x73\x3a\ -\xa4\x25\x1d\xec\xb1\xef\xcc\xc3\x81\xac\x32\xf0\x11\xf3\x4a\xf7\ -\x98\xe5\x07\x6b\xd3\xfc\x7e\x75\x72\xf0\x3f\xd3\x15\xb9\x9c\x65\ -\xef\x58\xf5\x0b\x62\x76\x7b\x5e\x48\x85\x38\x3f\x2c\x55\xc8\xb8\ -\x0b\x4f\x74\x4e\x24\xee\xfe\x5e\xae\xfa\xfd\xca\x97\xb8\x70\xc8\ -\xea\xaa\xcb\x9f\xdf\xef\xb7\x1d\xa5\xd3\xc6\x46\x01\x8b\x3a\xe2\ -\xb8\xd1\x3c\x6e\x0d\x0f\x5a\xcd\x83\xc6\x72\x18\xc3\x31\xa3\x99\ -\xf7\x2a\x44\x8f\xfe\x6f\xe0\x0f\x73\xa5\x90\x05\x86\x42\x58\x66\ -\x0e\xcd\x62\x0d\x5f\x57\x1e\xe7\x83\x63\x5b\xa9\x0d\xc7\xa7\xe2\ -\x9a\x85\x1d\x3a\xc2\xac\x3a\x5f\x4e\x67\xe2\x4e\xe7\x44\x62\xe5\ -\x9c\x9f\x9a\x2c\x3b\x02\xbe\x22\xd4\xd7\xeb\xfa\xaf\x66\x75\x6e\ -\xe1\xfc\x5a\xc3\x28\x60\x2e\x0a\x38\xa6\x43\x3e\x67\x35\xf7\x1b\ -\xc3\xfd\xc0\x31\x6b\x98\x07\xcc\xd1\xbc\x0e\x20\x35\x86\x42\x54\ -\x66\x0e\xcd\x62\x22\x76\x17\x47\xf8\xe8\xf8\x0e\x66\x06\x32\x0f\ -\x70\x91\x1b\x7f\x89\xb0\x77\x63\x76\x13\x0b\xbb\x10\xe7\x05\xda\ -\xf1\xe2\x11\xdb\xdd\x73\x0b\xa5\xb3\xca\x9a\xaf\x72\xe1\xe3\x1f\ -\x9e\xfc\x47\xb3\x66\x55\xcd\x40\x9b\x28\xf4\x39\xab\x03\xbe\xa2\ -\x43\x3e\x69\x0c\x9f\xb4\x86\xfb\xb0\x9c\x02\x02\x04\x3c\xfe\xba\ -\x5c\x21\x24\xc5\xd0\x28\x00\x1d\x52\xf5\xca\x7c\x60\x7c\x07\x2f\ -\x77\x8b\x69\xaf\xe8\x2a\xac\x12\x76\xa3\x57\x55\xd1\x05\xab\x2c\ -\x7b\x10\x0b\x3b\x36\x76\xd5\x55\x47\xd0\x1d\x0f\x54\xa1\x23\xf0\ -\xab\x04\x7d\xe5\xe7\x42\xe6\x73\x20\xdd\xcf\x1b\xb6\xb1\x41\x93\ -\x46\x14\xf0\x58\x14\x70\xaf\xd1\xfc\xff\x58\x3e\x6d\x34\x4f\x08\ -\x89\xce\x15\x41\xff\x19\x1a\x05\xf0\xe3\xaf\x85\xd9\xf7\xf2\xb6\ -\xb1\x6d\xbc\xb1\x38\x42\x76\x84\x60\xbd\xc2\xae\x3b\x96\x3d\x9e\ -\x90\x83\xe3\x81\x5b\x04\xa7\xd0\x39\x41\xc7\x89\xdd\x76\x86\xec\ -\xc0\x93\xae\xb7\x13\xb6\xc0\x6f\xd2\x0a\x9b\x3c\xaa\x43\x3e\x66\ -\x34\x1f\xb1\x96\xcf\x0a\xc1\x9c\xb5\xd8\x5c\x19\xf4\x87\xa1\x50\ -\x00\x00\x37\xdf\x33\x8b\x35\xfc\x48\x6d\x9a\xdf\xab\x4e\xa6\xb4\ -\x88\x8b\x63\xf6\x70\x8d\xad\xb7\xe8\xc2\xa2\x1a\x11\xcf\xc4\xc3\ -\x2d\x9e\xff\x52\xdd\xe3\xcc\x86\x4c\xd8\xaf\x46\x67\x36\x00\x41\ -\x0b\x82\x3a\x8b\x61\x9b\xcf\xeb\x90\xf7\x5b\xcb\x87\x81\xa3\x40\ -\xf0\xd8\xb7\xe7\x8a\xa0\x97\x0c\x8d\x02\xe8\x26\x02\x2b\x13\x7c\ -\x70\x74\x4b\x02\x89\xc0\xb5\x62\xf6\x60\x0d\x61\xef\x6c\xbd\xad\ -\xce\xc6\x2b\x37\xb6\xec\x5e\x29\xfe\x52\x05\x50\x8a\xa1\xb3\xee\ -\x37\x82\xd1\x10\xb6\xa1\xbd\x4c\x18\x34\x79\x3c\x0a\xf8\xa8\xd5\ -\xdc\x03\x7c\x16\x41\xc3\x5a\x78\x3c\x57\x06\x37\xcc\x50\x29\x00\ -\x13\xb1\xb7\x93\x08\xdc\xd3\xd3\x44\xe0\x95\xdc\xf8\x76\xa7\x74\ -\xf6\xa2\x7d\xf6\x0b\xfe\x79\xc7\xad\x77\x4b\x50\xa8\x74\xac\xbc\ -\xbb\x2a\x76\xcf\xb9\x3c\x36\xbe\xbf\xfe\x32\xb6\x5d\xe7\x6c\xd8\ -\xe2\xa3\xc6\x70\x0f\x96\x7f\x92\x8a\x39\x1d\xc2\xe3\xdf\x91\x2b\ -\x82\xeb\x65\xa8\x14\x80\x0e\xa8\x7a\x55\x3e\x30\xb1\x83\x97\x3b\ -\x85\x1b\xb8\x1b\x6b\x09\xbb\x7f\xbe\x11\x66\xb5\x65\x5f\xb3\xa2\ -\xa6\x53\x51\xa7\x5c\xf0\xca\x50\xa8\x76\x2c\xbd\xc3\x10\xdd\xf1\ -\xe4\xd1\x21\xf8\x0d\xf0\xeb\x34\xfc\x26\x9f\x30\x11\xef\xc4\xf2\ -\x91\xa0\xc5\x9c\x5b\xc8\x15\xc1\xf5\x30\x34\xaf\xe3\xcc\xa1\x59\ -\x1a\x73\x88\xea\x24\xbf\x33\xb2\x85\x37\x96\xc7\x59\xb7\x2b\xbd\ -\xba\x7a\xce\x9a\x8e\x65\x0f\x40\xaf\x8e\xd9\x2d\x5c\xb6\x36\x7e\ -\x15\x52\xc5\x96\xbe\x58\x05\xaf\x12\xef\xc3\x23\xd7\xbf\x96\x9c\ -\xab\x63\x74\xac\x08\xda\x4b\x34\x82\x26\x9f\xd2\x11\x7f\x8e\xe5\ -\x83\x42\x71\xd6\x6a\xc8\xf3\x04\xeb\x67\x68\x14\x00\x74\xf2\x00\ -\x96\x57\x17\x2a\xbc\x73\x74\x0b\x35\xa7\xbb\x1d\xb8\x4a\xf8\xba\ -\xc2\xae\xa3\x95\x0c\x7c\x3b\x0a\x38\xa7\x43\x9e\x8c\x02\x0a\xd6\ -\x72\x3b\x16\xb1\x66\xc7\xdb\x5a\x74\xbe\xcf\xf1\x62\x4b\x5f\xac\ -\xc5\x2e\x7e\xee\xde\xf7\x1f\xa3\x21\x68\x42\x6b\x91\x76\xd0\xe4\ -\xe3\x3a\xe2\x1d\x58\x3e\x82\x60\x01\xe0\xb1\x6f\xcb\x15\xc1\xd5\ -\x18\x3a\x05\x80\xa5\x86\xe0\x2d\x5e\x89\x1f\x2a\x8d\x31\xe2\x78\ -\xb1\xf5\xd6\x21\x36\x0a\x08\x74\xc0\xbc\x0e\x79\x4a\x47\x3c\x6a\ -\x35\x0f\x1b\xc3\x61\x6b\x38\x62\x2d\xc7\x94\xc3\x37\x01\x6f\x07\ -\xbc\xf5\x5c\x6f\xc5\xda\xd7\xe2\xd8\x5e\xb9\x69\xdf\x81\x8d\x49\ -\xd7\x23\x68\x2d\xd2\x08\x9a\x7c\xd4\x68\xde\x8e\xe5\xe3\x08\xda\ -\xb9\x12\xb8\x32\x43\xa5\x00\x00\x66\xde\x33\x0b\x50\xb6\xf0\xf5\ -\x52\xf1\x5c\xa9\xa8\x74\xe6\xd3\x9d\x31\x86\x47\xac\xe1\x2b\x58\ -\x9e\x32\x9a\x85\xb0\x4d\x20\x9d\x58\x78\x3b\x3c\x1f\xc1\x07\x81\ -\xe9\x35\x5d\xf6\xce\x3e\x7d\xd7\xda\x17\xaa\xb9\xb5\xcf\x12\x46\ -\x43\x7b\x09\x9a\x8b\x9c\x09\xdb\xbc\xdf\x1a\xfe\x50\xc0\x7d\x16\ -\x74\xae\x08\xd6\x66\xe8\x14\x40\x97\xb1\xff\x77\x16\xab\xc1\x19\ -\x47\x08\x09\xd2\xc1\x5a\x0b\x67\x7e\x74\xed\x17\xa1\xd3\x54\xb4\ -\x03\xf8\x1b\xe0\x8e\x8b\xff\x5e\xaa\x38\xa1\x57\xac\xc5\xb1\xfd\ -\x4a\x42\x2f\x8f\xed\x33\x87\x0e\xa1\xb5\x88\x6d\x2d\x72\x34\xf4\ -\x79\x3b\x96\x3f\x93\x8a\x13\xd6\x60\x8f\xe4\x8a\xe0\x02\x86\x56\ -\x01\x5c\x2b\x1d\x05\x50\x02\xde\x0d\xbc\xba\xfb\xe7\xca\x8b\x13\ -\x7a\x2b\xb1\xbd\x22\x17\xfa\x01\x21\x68\x41\x73\x81\xc0\xaf\x73\ -\x9f\x8e\xf8\x0d\x62\xe5\x9e\x87\x05\xab\x18\x8a\x79\x00\x3d\x24\ -\xc2\xf2\x14\x22\x2e\xd4\x29\x8d\xc6\x82\xef\xac\xce\x08\xe4\xc2\ -\x3f\x30\x78\x25\x70\x0b\x78\xed\x3a\x2f\x68\xcc\xf3\x07\x61\x8b\ -\x43\xd6\xf2\x3b\x37\xbf\x77\xf6\x21\xab\xf3\xb1\x65\x90\x7b\x00\ -\xcc\xbc\x67\xb6\x2b\xd3\x93\xc0\xf7\x3b\x1e\x3f\x54\x1e\x67\x57\ -\x69\x24\x4f\xea\x0d\x13\x3a\x80\xc6\x02\xb6\xb5\xc4\xfd\x3a\xe4\ -\xad\xc0\x5f\x91\x7b\x03\x1b\x5b\x01\x74\x12\x86\xd2\xc2\x0b\xa5\ -\xe2\x27\x0a\x15\xfe\x4d\x65\x02\xcf\x2b\xa7\xbd\xb2\x9c\x7e\x60\ -\x2d\xf8\xcb\x50\x9f\x67\x21\x6c\xf1\x2e\x6b\xf9\x2d\x2c\x47\x85\ -\xdc\xb8\xde\xc0\x86\x54\x00\x1d\xc1\xc7\x42\x0d\xf8\x76\xc7\xe3\ -\xa7\x2a\xe3\xcc\x94\xc6\xe2\x64\x5f\xce\x70\x13\x05\xd0\x98\x43\ -\xb7\x96\xf8\x27\xa3\xf9\x79\x21\xf8\x24\x16\xbd\x11\x13\x84\x1b\ -\x4e\x01\xcc\x1c\x9a\xc5\xf1\x20\xf4\xd9\x2b\x04\x3f\xe5\x55\xf8\ -\x8e\xea\x04\xd5\x42\x35\xed\x95\xe5\x24\x89\x35\xd0\x3c\x07\x8d\ -\x05\x8e\x6a\x9f\xb7\x5a\x78\xa7\x80\xe6\x46\x53\x02\x1b\x4a\x01\ -\xac\x72\xf9\x5f\xac\x1c\x7e\xa9\x38\xc2\x0b\xab\x9b\x50\x79\xac\ -\xbf\x71\xf1\x1b\x50\x3f\xcb\x52\xd0\xe4\x7f\x59\xcb\x6f\x62\x39\ -\xbe\x91\x42\x82\x0d\xa1\x00\x56\x25\xfa\x4a\xc0\x1b\x1c\x8f\x9f\ -\xac\x4c\x30\x53\x1e\xcb\x8b\x78\x72\x2e\x08\x09\xfe\xce\x44\xfc\ -\xf4\xb9\x79\xbe\x34\xbe\x09\x36\x82\x37\x30\xf4\x0a\xa0\xd3\x1f\ -\x00\x30\x29\x04\xff\xb7\x57\xe2\x8d\xd5\x29\x46\x56\x55\xff\xe5\ -\xe4\x60\x34\x34\xe6\xa1\xb9\xc0\x7d\x3a\xe2\xe7\x84\xe0\xc3\x80\ -\x19\x76\x4f\x60\xa8\x53\x5e\x33\x87\x66\x31\x1a\x84\x60\x46\x48\ -\xde\x5a\xac\xf1\x1f\x46\x36\x53\xf6\x4a\x69\xaf\x2c\x27\x6b\x08\ -\x19\x57\x7a\x2a\x97\xad\x91\xcf\x8b\x8c\x66\x4e\xc0\xc3\x13\xaf\ -\xbd\x2b\x5a\xf8\xcb\x8f\xa4\xbd\xbc\xbe\x31\xb4\x0a\xa0\x33\x21\ -\x08\x21\xb9\x53\x2a\xde\x56\x19\xe3\x1b\x47\xa6\x71\xd4\xba\xda\ -\x7c\x72\x36\x22\x42\xac\x8c\x64\x1b\xd3\x01\x2f\x31\x1a\x6b\xe1\ -\xbe\x89\xd7\xde\x15\x0e\xab\x12\x18\xca\x10\x60\xe6\xd0\x2c\x42\ -\x20\x8c\xe1\x25\xca\xe1\xd7\x2b\x13\x3c\xaf\x32\x91\xc7\xfb\x17\ -\xb0\x7a\x7e\xe1\x65\xfe\x6a\x23\x13\xb6\x60\xe9\x34\x8d\xa0\xc9\ -\xef\x5a\xcb\x7f\x03\xe6\x84\x18\xbe\xe4\xe0\xd0\x3d\xeb\x99\x43\ -\xb3\x20\x10\xd6\xf0\xf5\x8e\xcb\xef\x54\x26\xd9\x5f\x1e\xbb\xf4\ -\x58\xab\xa1\x65\xf5\xe9\x3d\x76\xd5\xff\x0d\x58\x6b\xe3\x93\x7c\ -\x3a\xbf\x16\x40\xb9\x08\x9e\x6b\xe3\x11\x08\x16\x0c\x60\xac\xc0\ -\xd8\xf3\xff\xef\x9e\x02\xd4\xfd\xc1\x1b\xe5\x56\x46\x3e\x2c\x9f\ -\x21\x68\x2f\xf3\x2e\x6b\xf9\x7f\x04\x3c\xcd\x90\x29\x81\xa1\x7a\ -\x96\x9d\x86\x1e\x69\x2d\xaf\x72\x5c\x7e\xbd\x3a\x15\x0b\xff\xb0\ -\xd2\x55\x6a\xd6\x76\x46\x97\x85\x06\x1d\x58\x42\xdf\xa2\x7d\x4b\ -\xd8\x36\x44\x81\x45\x87\xb6\x33\x04\xc5\x62\xb5\x8d\x0f\x17\x31\ -\xa0\xa4\xe5\xdf\xbd\x38\xe2\x19\xfb\x0c\xc6\x80\x21\x16\xf8\xc8\ -\x08\x22\x23\x08\xb4\xa0\x11\x29\x9a\x91\xa4\x11\x4a\x9a\xa1\xa4\ -\x19\x49\x02\x2d\x09\x4d\x47\x39\x74\x14\xc3\x50\xbd\x48\xab\xd0\ -\x21\x2c\x9f\x26\x6a\x2d\x73\x8f\x35\xfc\x8c\x80\x63\xc3\xa4\x04\ -\x86\xe6\xb9\x5d\x20\xfc\x1e\xbf\x59\x9b\x66\x77\xa9\x36\x4c\x9f\ -\x90\x95\xf6\xe3\x78\x6c\x99\x21\x6c\x5a\xfc\xa6\xa1\xbd\xa4\xf1\ -\x1b\x86\xb0\x69\xd0\xa1\x45\x47\x60\x8d\xbd\x60\x66\xa1\xbd\xf4\ -\xc7\xe0\x3a\xf0\x86\x6f\x0a\xb9\xf3\xa0\xc1\x5c\xe1\xb2\x16\xd0\ -\x56\x10\x1a\x81\x1f\x09\x5a\x91\x64\x29\x50\x2c\x05\x8a\xf9\xb6\ -\xc3\x52\xa0\x68\x84\x92\xa8\xa3\x14\x86\x4d\x21\x98\x08\x96\xcf\ -\xa0\x9b\x8b\xbc\xdf\x1a\x7e\x42\xc0\xd1\x61\x51\x02\x43\xf1\x9c\ -\x3a\xc2\x2f\xac\xe5\x9b\x1d\x8f\xd9\xda\x34\x7b\x4a\x23\x69\xaf\ -\xaa\x07\x74\x04\x29\x9e\x97\x6f\x09\x1a\x86\xe6\x39\x4d\x6b\x51\ -\xd3\x5e\xd2\x84\x6d\x8b\x89\x62\x41\x5f\xf1\xd0\xaf\xe1\x89\x7a\ -\x2e\x7c\xcf\x37\x87\xdc\x3e\x73\x65\x05\x70\xd1\x92\x56\xb0\xc4\ -\xde\x42\x57\x21\x2c\xf8\x8a\xb3\x2d\x87\x85\x8e\x52\x08\x8d\x18\ -\x1a\x0f\xc1\x68\x58\x3e\x83\x6d\x9d\xe3\x43\xc6\xf0\x26\xe0\xf1\ -\x61\xc8\x09\x0c\xfa\x73\x59\x1d\xf3\x7f\x63\xc7\xf2\xcf\x0c\xba\ -\xf0\x0b\x11\x1f\x0b\x16\xf9\x96\xd6\x39\x4d\x73\x21\xa2\x31\xaf\ -\x09\x1a\x86\x28\xec\x04\xea\x70\x43\x4f\xcf\x02\xe5\x02\x7c\xdf\ -\xb7\x86\x1c\xd8\xb5\x7e\x05\xb0\xe6\x7a\x57\xfd\x5a\x5b\x68\x45\ -\x92\x85\xb6\xc3\xa9\xa6\xcb\xa9\xa6\xcb\x82\xaf\x68\x45\x72\xdd\ -\x63\x16\xb3\x4a\x47\x09\xe8\xd6\x39\xfe\xda\x18\xfe\xb3\x80\xc7\ -\x06\xdd\x13\x18\xe4\xe7\xd1\x3d\x0b\x00\xa1\x78\x99\xe3\xf2\xfb\ -\xb5\x69\xf6\x97\x46\xd3\x5e\xd5\xf5\xd1\x15\x8e\xc8\xb7\xb4\x16\ -\x35\xcb\xa7\x3b\x42\xdf\x34\xb1\x95\xb7\xbd\x4d\x64\x5a\x0b\xb5\ -\x8a\xe5\x07\x5e\x13\xb1\x67\xdb\x8d\x29\x80\x8b\x59\x3d\x5d\x3d\ -\xd0\x82\x73\x81\xc3\x53\x75\x97\xe3\xcb\x1e\xf3\x6d\x87\xc0\x88\ -\x0b\xbe\x6f\x90\x30\x1a\xea\x67\xb0\xcd\x73\xbc\xcf\x18\xde\x24\ -\xe0\xc9\x41\x56\x02\x03\x3b\x10\x64\x65\x9f\x5f\xf1\x62\xe5\xf0\ -\x9b\xd5\xc9\xc1\x13\xfe\x6e\x5c\xee\x48\xcb\x44\x51\x63\x96\x43\ -\x3e\x77\xbf\xa1\x71\x2e\x16\xfa\x0b\x32\xef\x7d\x90\x16\xd7\x81\ -\x82\x67\x7b\x3e\xe3\x64\xf5\xcf\xf3\x94\x65\x73\x29\x64\xba\x14\ -\x72\x60\xbc\xcd\x99\x96\xc3\xb1\xa5\x02\x4f\x35\x5c\x96\x03\x35\ -\x70\x5e\x81\x54\x50\x9d\x8a\xc3\xcd\xd6\x22\xba\xe3\x09\x9c\x48\ -\x7b\x5d\xd7\xcb\x40\x16\x02\xad\x94\xf7\x0a\x6e\x57\x0e\x6f\xab\ -\x4e\x72\x67\x65\x9c\x81\x79\x93\xba\x02\x52\x72\x0c\x3b\xaa\x01\ -\xcf\x9c\x6c\xf1\xac\xe9\x26\x8d\xd3\x11\x9f\xff\x92\x88\x4f\x05\ -\xa6\xff\x9f\x67\xb4\x06\xcf\xbf\xc3\x50\x4e\xe8\x34\x65\x4f\x5a\ -\xc6\x0a\x9a\x1d\xb5\x90\xed\xd5\x90\xa2\x63\x09\xb5\xc0\xd7\x12\ -\xd3\xff\x8f\xdb\x33\x3a\x55\x83\x52\x47\x1c\x8c\x7c\x6a\xd6\xf2\ -\xc9\x89\xd7\xde\xd5\x9a\xb8\xfb\x2e\x16\xee\x19\xac\x82\xa1\x81\ -\xf3\x00\x3a\xa3\xbf\x01\x66\xa4\x62\xb6\x3c\xce\x0b\xca\x63\x0c\ -\xc4\xdb\xd3\x15\xfc\xaa\x6b\xd8\x59\x0b\x98\x19\x6d\x33\x59\x8a\ -\xf0\x64\xbc\x27\xef\x77\x2c\x62\x52\x6b\x71\xdd\xd8\x0b\x48\xfa\ -\xf3\x4b\x61\xd9\x54\x8c\x98\x28\x46\x1c\x18\x6f\x71\x6c\xa9\xc0\ -\x91\xc5\x02\x67\x5b\x2e\xda\x0e\xc4\xa3\x44\x2a\xa8\x4d\xa1\xac\ -\xe1\xdf\xb7\x97\x59\xb6\x96\x5f\x10\x50\x4f\x7b\x5d\xd7\xca\x40\ -\x79\x00\x9d\x6c\x3f\x16\x36\x09\xc1\xaf\x54\xc6\x78\x75\x6d\x2a\ -\x9e\xfa\x9b\x75\x2c\x50\x76\x0c\xfb\xc7\xda\x7c\xd5\xe6\x26\x07\ -\xc6\x5b\x8c\x7a\x06\xb9\xea\x6d\x7f\xf0\x71\xc9\xa3\x4f\xc8\x44\ -\x04\xc0\x02\xd3\x13\x96\xe7\xde\xa6\x13\x55\x02\x17\x53\x50\x96\ -\xa9\x72\xc4\xce\x6a\x40\xcd\x33\x84\x46\xd0\x8c\xd4\x40\x78\x04\ -\x52\x81\x5b\xc0\x89\x7c\x9e\xa1\x43\x96\x84\xe0\x73\x13\xaf\xbd\ -\xcb\x0c\x92\x17\x30\x00\xa2\x73\x11\x96\x8a\x10\xfc\x6c\xb1\xc6\ -\xb7\x57\x26\xb3\x2f\xfc\x96\x38\x0e\xde\x3f\xd6\xe6\x65\x3b\x97\ -\x78\xc1\xd6\x3a\x9b\xcb\x21\x52\x5c\x18\x2b\x1b\x0b\xad\xb6\x48\ -\x74\xe8\x68\xc1\x8b\x4f\x25\x4e\x73\xce\x69\xf7\xda\x15\xd7\x70\ -\xeb\x44\x8b\x97\xef\x5c\xe2\x79\x9b\xeb\x4c\x16\x23\x44\xb2\xb7\ -\xe3\xba\x70\x0a\x50\x9b\xa2\xe6\x16\xf9\xa9\x4e\x0d\xca\x8a\xa1\ -\x1a\x04\x32\x2e\x3e\xe7\xe9\xdc\x54\x65\xe1\xbb\xbc\x32\xdf\x5f\ -\x9b\xc6\x53\x19\x0e\x60\x2c\x20\x05\x6c\xab\x84\x7c\xcd\xb6\x65\ -\x5e\xb4\xad\xce\xb6\xca\xa5\x82\xdf\xc5\x58\x68\x07\xc9\xbe\xf0\ +\xc0\x00\xff\xff\xff\x7f\xff\xff\xfe\x00\xff\xff\xfe\x89PN\ +G\x0d\x0a\x1a\x0a\x00\x00\x00\x0dIHDR\x00\x00\x01\ +\x00\x00\x00\x01\x00\x08\x06\x00\x00\x00\x5cr\xa8f\x00\x00\ +@KIDATx\xda\xed\xbdy\x9c\x1d\xd7]\xe0\ +\xfb=\xe7T\xd5\xdd{Swk\x97%\xb5\xb5x\x89\ +\xb3\x98,$\x84\x90\x0d\xcf\x0c\x90G 1\x84\x10\x18\ +`X'\x0cy\x13\xf6\xc9\x83\x07\x0c[\x86\x1e\x96\xc0\ +\x10\xde0\x90\x04\x02D&\x0b\x09L /\x84\x00!\ +!\x89cg\xb3\xbcE\xb6dY\x96\xb5t\xb7\xba\xfb\ +n\xb5\x9cs\xe6\x8f\xba\xb7\xd5\x92ZRK\xba\xb7\xaa\ +\xee\xed\xfa~>mkiu\x9d[U\xbf\xf5\xfc~\ +\xbf#\xc8\xc9\xb9\x01\xb6\xbc}\x16\xbf\x01#\xd3\x14\xa4\ +b\x02\xc1\x0e!9 %wH\xc5\xcdB1\x82E\ +\xea\x90'\x8d\xe1\xddB\xf01 \ +\xe5\xb2\xb5\xe3\xc6{\x8e\xdb\x11v\x07\x84\xbc\xf1\xeb7\ +\x17`\xe9\x14oQ\x1e\xbf\x1c\xf9y\x18\x906\xce\x8d\ +\xff\x88\x9c\xac\xb2\xe3\x8fg\xb1\x1a\xe1\x96(\x0a\xc1\xb8\ +\x90\xec\x10\x82\xbd\xc5\x1a\xb7I\xc5\x01\xe92\xa3\x1c\xb6\ +9\x1e\xe3\xca\xc3s<\x84t@\xf5H\xd8\xd7By\ + \x14\xb7\xb7\x97\xf0\x9c\x02A\xda\xf7h\xa3\x93+\x80\ +!\xe1\xa6?\x99\xc5Z\x84\x94\x14\x85dBH\xb6\x0b\ +\xc1>\xa18 %\xb7I\x97\xdd\xcaa\x87\xe31\xaa\ +<\x0a\x8e\x07]7\xbe_\xc2\xbe\x16\x8e\x0b\xcaa\xaf\ +\x90\x8c\x02g\xd2\xbeo\x1b\x9d\x5c\x01\x0c \xbb\xde\xd5\ +\x11vEQJ6u\x84}\xbfP\x1c\x90\x8a[\xa4\ +\xc3^\xe5\xb2\xcdq\x19s<<\x95\x92\xb0\xafE\xc7\ +\xc3\xd8)$\xdb\xc9\x15@\xea\xe49\x80\x0c\xa3\xde<\ +\xcb\xee\xe7Cs\x01Q\xa8P\x12\xb1\xb0\xef\x10\x82\x9b\ +\x85\xe2V\xa9\xd8/\x1dnv\x5c\xb6(\xaf#\xecn\ +v\x84\xfdr,\x9d\xa2U\x9f\xe3\xf5B\xf0~\xc8\xf3\ +\x00i\x92{\x00\x19b\xe7;f1\x1a\xe1\x16)\x0b\ +\xc1\x84\x90\xec\x02f*\x9b\xb8M*\xf6\xab8\x1b\xbf\ +Ey\x8c\xaeXv'\xdb\xc2\xbe\x16\x8eGIHn\ +U.\xef\xd7y\x16 Ur\x05\x90\x12\xbb\xdf\x1do\ +\xbdI\x87\xb2\x90l\x12\x82\x9dB\xb2_H\x0eJ\xc5\ +-*\x8e\xd9\xb7)\x8f\xda \x0b\xfb%\x888\x11(\ +\x15\xb7\xb4\x97p\xdd\xe2\xf9=\xe9\x9c\xe4\xc9\x15@\x02\ +\xec\xfe\xd3Y\x8cF\x0aEIJ\xa6\x84\x8c\xcbe\x9d\ +B\x1c\xb3+\x87\xdd\xcac\xabr\x19q\x0a\xb8\xca\x1d\ +\x12a_\x0b\xdb\x09Q\x1cn\x96\x8aQ\xe0l\xdaK\ +\xda\xc8\xe4\x0a\xa0\xc7\xeczW,\xec\x8eGYH&\ +\x85`\x97\x90\xecs\xe2}\xf6\xfd*N\xd0mV.\ +\xa3\x8e\x87\xe3xqbl(\x85\xfd2H\xb5\x92\x08\ +\xdcF\xae\x00R%O\x02^'\xd3\xbf=Ku+\ +\x04\x0d\xa4\xe3Q\xed\xb8\xf17\x09\xc9\xcdBr[G\ +\xd8\xf7(\x97\xcd\x8e\xc7\x88\xf2p\x9cNA\x8dt`\ +\xa3\xb7\x5ct\x12\x81\xaf\x13\x82\xbf\x82<\x11\x98\x16\xb9\ +\x07\xb0\x1e\xbes\x96\x99WC\xd8@JEUH\xa6\ +\x84`\xa7\x80\x83\xa5\x11\x0e\x88\xd8\x8d\xdf\xa5\x5c\xb6:\ +\x1e\xd5\x15a\xeff\xe37\xb8\xb0\xaf\x85\xe3Q\x12\x82\ +\xdb\xa4\xe2\xafL^\x88\x9e\x1a\xb9\x02\xb8\x88M\xbf5\ +\xcb\xd4^h\x9eCIEEH\xa6\x85`'\x9a\x83\ +^\x99\x83\xca\xe1\xa0t\xb8\xc9\xf1\x98V.5\xc7\xc3\ +\xe9&\xe8D.\xec\xeb\xe3|\x22\xf0\x80\xdf\xc0q\x8b\ +Di/i\xa3\xb2\xa1\x15\xc0\xb6\xff9\xcb\xe9\xc7a\ +\xeb~\x94rW,\xfb\xee\xb0\xcd>\xaf\xc2mJ\xb1\ +O:\xecq<\xa6:\xc2\xae.\x11v\xc1\xaa\xd6\x8a\ +\x9cuq>\x11x@:\x8c\x91\xe7\x01Rc\xc3(\ +\x80\x89\xdf\x98\xe5\x05?\x00_z\x1fJy\xd4\x84`\ +J\x08\xf6\xdc\xf4,\xf6\xc9NQ\x8dr\xb9I\xb9L\ ++\x8f\xaa\xe3\xa1\xba\xd9\xf8+\x0a{.\xfc\xd7\x85T\ +\xa0\x5c\xb6\x0b\xc1\x16r\x05\x90\x1aC\xaa\x00f\xd9{\ +\x08t\x80#$U!\xd8,\x047=\xfc\xb7\x1c,\ +\xd6:[o.;;\xc2^\xc9\x85=y\xa4\x04\xc7\ +c\x93\x90\xdc\x8c\xe0\xcbi\xafg\xa32\xf0\x0a`\xcf\ +\x9f\xcd\x12E\xa0\x14\x0eP\x15\x92-Bp\x93\x80\x83\ +^\x89\x83\xd2\xe1@'A7\xd5\xb1\xec\xf2\x12a_\ +\x8b\x5c\xd8\xfbK\x9c\x07(\x09\xc1\x01\xa5`\xe6\xd0l\ +\xbe\x13\x90\x02\x03\xad\x00\xf6\xbeg\x16\x01c\xae\xe2e\ +R\xf1\xf5\xcae\x7f\xa7\xa8f\x93\xe3RU\x1e\xd2\xf1\ +:\x99\xf8\xb1\xfb\xdd\xb3s:\ +\xa4%\x1d\xec\xb1\xef\xcc\xc3\x81\xac2\xf0\x11\xf3J\xf7\ +\x98\xe5\x07k\xd3\xfc~ur\xf0?\xd3\x15\xb9\x9ce\ +\xefX\xf5\x0bbv{^H\x858?,U\xc8\xb8\ +\x0bOtN$\xee\xfe^\xae\xfa\xfd\xca\x97\xb8p\xc8\ +\xea\xaa\xcb\x9f\xdf\xef\xb7\x1d\xa5\xd3\xc6F\x01\x8b:\xe2\ +\xb8\xd1g5\xf7\x1b\ +\xc3\xfd\xc01k\x98\x07\xcc\xd1\xbc\x0e 5\x86BT\ +f\x0e\xcdb\x22v\x17G\xf8\xe8\xf8\x0ef\x062\x0f\ +p\x91\x1b\x7f\x89\xb0wcv\x13\x0b\xbb\x10\xe7\x05\xda\ +\xf1\xe2\x11\xdb\xdds\x0b\xa5\xb3\xca\x9a\xafr\xe1\xe3\x1f\ +\x9e\xfcG\xb3fU\xcd@\x9b(\xf49\xab\x03\xbe\xa2\ +C>i\x0c\x9f\xb4\x86\xfb\xb0\x9c\x02\x02\x04<\xfe\xba\ +\x5c!$\xc5\xd0(\x00\x1dR\xf5\xca|`|\x07/\ +w\x8bi\xaf\xe8*\xac\x12v\xa3WU\xd1\x05\xab,\ +{\x10\x0b;6v\xd5UG\xd0\x1d\x0fT\xa1#\xf0\ +\xab\x04}\xe5\xe7B\xe6s \xdd\xcf\x1b\xb6\xb1A\x93\ +F\x14\xf0X\x14p\xaf\xd1\xfc\xffX>m4O\x08\ +\x89\xce\x15A\xff\x19\x1a\x05\xf0\xe3\xaf\x85\xd9\xf7\xf2\xb6\ +\xb1m\xbc\xb18Bv\x84`\xbd\xc2\xae;\x96=\x9e\ +\x90\x83\xe3\x81[\x04\xa7\xd09A\xc7\x89\xddv\x86\xec\ +\xc0\x93\xae\xb7\x13\xb6\xc0o\xd2\x0a\x9b<\xaaC>f\ +4\x1f\xb1\x96\xcf\x0a\xc1\x9c\xb5\xd8\x5c\x19\xf4\x87\xa1P\ +\x00\x007\xdf3\x8b5\xfcHm\x9a\xdf\xabN\xa6\xb4\ +\x88\x8bc\xf6p\x8d\xad\xb7\xe8\xc2\xa2\x1a\x11\xcf\xc4\xc3\ +-\x9e\xffR\xdd\xe3\xcc\x86L\xd8\xafFg6\x00A\ +\x0b\x82:\x8ba\x9b\xcf\xeb\x90\xf7[\xcb\x87\x81\xa3@\ +\xf0\xd8\xb7\xe7\x8a\xa0\x97\x0c\x8d\x02\xe8&\x02+\x13|\ +ptK\x02\x89\xc0\xb5b\xf6`\x0da\xefl\xbd\xad\ +\xce\xc6+7\xb6\xec^)\xfeR\x05P\x8a\xa1\xb3\xee\ +7\x82\xd1\x10\xb6\xa1\xbdL\x184y<\x0a\xf8\xa8\xd5\ +\xdc\x03|\x16A\xc3Zx0\xb1\x83\x97;\ +\x85\x1b\xb8\x1bk\x09\xbb\x7f\xbe\x11f\xb5e_\xb3\xa2\ +\xa6SQ\xa7\x5c\xf0\xcaP\xa8v,\xbd\xc3\x10\xdd\xf1\ +\xe4\xd1!\xf8\x0d\xf0\xeb4\xfc&\x9f0\x11\xef\xc4\xf2\ +\x91\xa0\xc5\x9c[\xc8\x15\xc1\xf504\xaf\xe3\xcc\xa1Y\ +\x1as\x88\xea$\xbf3\xb2\x857\x96\xc7Y\xb7+\xbd\ +\xbaz\xce\x9a\x8ee\x0f@\xaf\x8e\xd9-\x5c\xb66~\ +\x15R\xc5\x96\xbeX\x05\xaf\x12\xef\xc3#\xd7\xbf\x96\x9c\ +\xabct\xac\x08\xdaK4\x82&\x9f\xd2\x11\x7f\x8e\xe5\ +\x83Bq\xd6j\xc8\xf3\x04\xebgh\x14\x00t\xf2\x00\ +\x96W\x17*\xbcst\x0b5\xa7\xbb\x1d\xb8J\xf8\xba\ +\xc2\xae\xa3\x95\x0c|;\x0a8\xa7C\x9e\x8c\x02\x0a\xd6\ +r;\x16\xb1f\xc7\xdbZt\xbe\xcf\xf1bK_\xac\ +\xc5.~\xee\xde\xf7\x1f\xa3!hBk\x91v\xd0\xe4\ +\xe3:\xe2\x1dX>\x82`\x01\xe0\xb1o\xcb\x15\xc1\xd5\ +\x18:\x05\x80\xa5\x86\xe0-^\x89\x1f*\x8d1\xe2x\ +\xb1\xf5\xd6!6\x0a\x08t\xc0\xbc\x0eyJG}\xd7\xda\x17\xaa\xb9\xb5\xcf\x12F\ +C{\x09\x9a\x8b\x9c\x09\xdb\xbc\xdf\x1a\xfeP\xc0}\x16\ +t\xae\x08\xd6f\xe8\x14@\x97\xb1\xffw\x16\xab\xc1\x19\ +G\x08\x09\xd2\xc1Z\x0bg~t\xed\x17\xa1\xd3T\xb4\ +\x03\xf8\x1b\xe0\x8e\x8b\xff^\xaa8\xa1W\xac\xc5\xb1\xfd\ +JB/\x8f\xed3\x87\x0e\xa1\xb5\x88m-r4\xf4\ +y;\x96?\x93\x8a\x13\xd6`\x8f\xe4\x8a\xe0\x02\x86V\ +\x01\x5c+\x1d\x05P\x02\xde\x0d\xbc\xba\xfb\xe7\xca\x8b\x13\ +z+\xb1\xbd\x22\x17\xfa\x01!hAs\x81\xc0\xafs\ +\x9f\x8e\xf8\x0db\xe5\x9e\x87\x05\xab\x18\x8ay\x00=$\ +\xc2\xf2\x14\x22.\xd4)\x8d\xc6\x82\xef\xac\xce\x08\xe4\xc2\ +?0x%p\x0bx\xed:/h\xcc\xf3\x07a\x8b\ +C\xd6\xf2;7\xbfw\xf6!\xab\xf3\xb1e\x90{\x00\ +\xcc\xbcg\xb6+\xd3\x93\xc0\xf7;\x1e?T\x1egW\ +i$O\xea\x0d\x13:\x80\xc6\x02\xb6\xb5\xc4\xfd:\xe4\ +\xad\xc0_\x91{\x03\x1b[\x01t\x12\x86\xd2\xc2\x0b\xa5\ +\xe2'\x0a\x15\xfeMe\x02\xcf+\xa7\xbd\xb2\x9c~`\ +-\xf8\xcbP\x9fg!l\xf1.k\xf9-,G\x85\ +\xdc\xb8\xde\xc0\x86T\x00\x1d\xc1\xc7B\x0d\xf8v\xc7\xe3\ +\xa7*\xe3\xcc\x94\xc6\xe2d_\xcep\x13\x05\xd0\x98C\ +\xb7\x96\xf8'\xa3\xf9y!\xf8$\x16\xbd\x11\x13\x84\x1b\ +N\x01\xcc\x1c\x9a\xc5\xf1 \xf4\xd9+\x04?\xe5U\xf8\ +\x8e\xea\x04\xd5B5\xed\x95\xe5$\x895\xd0<\x07\x8d\ +\x05\x8ej\x9f\xb7Zx\xa7\x80\xe6FS\x02\x1bJ\x01\ +\xacr\xf9_\xac\x1c~\xa98\xc2\x0b\xab\x9bPy\xac\ +\xbfq\xf1\x1bP?\xcbR\xd0\xe4\x7fY\xcbob9\ +\xbe\x91B\x82\x0d\xa1\x00V%\xfaJ\xc0\x1b\x1c\x8f\x9f\ +\xacL0S\x1e\xcb\x8bxr.\x08\x09\xfe\xceD\xfc\ +\xf4\xb9y\xbe4\xbe\x096\x8270\xf4\x0a\xa0\xd3\x1f\ +\x000)\x04\xff\xb7W\xe2\x8d\xd5)FVU\xff\xe5\ +\xe4`44\xe6\xa1\xb9\xc0}:\xe2\xe7\x84\xe0\xc3\x80\ +\x19vO`\xa8S^3\x87f1\x1a\x84`FH\ +\xdeZ\xac\xf1\x1fF6S\xf6Ji\xaf,'k\x08\ +\x19Wz*\x97\xad\x91\xcf\x8b\x8cfN\xc0\xc3\x13\xaf\ +\xbd+Z\xf8\xcb\x8f\xa4\xbd\xbc\xbe1\xb4\x0a\xa03!\ +\x08!\xb9S*\xdeV\x19\xe3\x1bG\xa6q\xd4\xba\xda\ +|r6\x22B\xac\x8cd\x1b\xd3\x01/1\x1ak\xe1\ +\xbe\x89\xd7\xde\x15\x0e\xab\x12\x18\xca\x10`\xe6\xd0,B\ + \x8c\xe1%\xca\xe1\xd7+\x13<\xaf2\x91\xc7\xfb\x17\ +\xb0z~\xe1e\xfej#\x13\xb6`\xe94\x8d\xa0\xc9\ +\xefZ\xcb\x7f\x03\xe6\x84\x18\xbe\xe4\xe0\xd0=\xeb\x99C\ +\xb3 \x10\xd6\xf0\xf5\x8e\xcb\xefT&\xd9_\x1e\xbb\xf4\ +X\xab\xa1e\xf5\xe9=v\xd5\xff\x0dXk\xe3\x93|\ +:\xbf\x16@\xb9\x08\x9ek\xe3\x11\x08\x16\x0c`\xac\xc0\ +\xd8\xf3\xff\xef\x9e\x02\xd4\xfd\xc1\x1b\xe5VF>,\x9f\ +!h/\xf3.k\xf9\x7f\x04<\xcd\x90)\x81\xa1z\ +\x96\x9d\x86\x1ei-\xafr\x5c~\xbd:\x15\x0b\xff\xb0\ +\xd2Uj\xd6vF\x97\x85\x06\x1dXB\xdf\xa2}K\ +\xd86D\x81E\x87\xb63\x04\xc5b\xb5\x8d\x0f\x171\ +\xa0\xa4\xe5\xdf\xbd8\xe2\x19\xfb\x0c\xc6\x80!\x16\xf8\xc8\ +\x08\x22#\x08\xb4\xa0\x11)\x9a\x91\xa4\x11J\x9a\xa1\xa4\ +\x19I\x02-\x09MG9t\x14\xc3P\xbdH\xab\xd0\ +!,\x9f&j-s\x8f5\xfc\x8c\x80c\xc3\xa4\x04\ +\x86\xe6\xb9] \xfc\x1e\xbfY\x9bfw\xa96L\x9f\ +\x90\x95\xf6\xe3xl\x99!lZ\xfc\xa6\xa1\xbd\xa4\xf1\ +\x1b\x86\xb0i\xd0\xa1EG`\x8d\xbd`f\xa1\xbd\xf4\ +\xc7\xe0:\xf0\x86o\x0a\xb9\xf3\xa0\xc1\x5c\xe1\xb2\x16\xd0\ +V\x10\x1a\x81\x1f\x09Z\x91d)P,\x05\x8a\xf9\xb6\ +\xc3R\xa0h\x84\x92\xa8\xa3\x14\x86M!\x98\x08\x96\xcf\ +\xa0\x9b\x8b\xbc\xdf\x1a~B\xc0\xd1aQ\x02C\xf1\x9c\ +:\xc2/\xac\xe5\x9b\x1d\x8f\xd9\xda4{J#i\xaf\ +\xaa\x07t\x04)\x9e\x97o\x09\x1a\x86\xe69MkQ\ +\xd3^\xd2\x84m\x8b\x89bA_\xf1\xd0\xaf\xe1\x89z\ +.|\xcf7\x87\xdc>se\x05p\xd1\x92V\xb0\xc4\ +\xdeBW!,\xf8\x8a\xb3-\x87\x85\x8eR\x08\x8d\x18\ +\x1a\x0f\xc1hX>\x83m\x9d\xe3C\xc6\xf0&\xe0\xf1\ +a\xc8\x09\x0c\xfasY\x1d\xf3\x7fc\xc7\xf2\xcf\x0c\xba\ +\xf0\x0b\x11\x1f\x0b\x16\xf9\x96\xd69Ms!\xa21\xaf\ +\x09\x1a\x86(\xec\x04\xeapCO\xcf\x02\xe5\x02|\xdf\ +\xb7\x86\x1c\xd8\xb5~\x05\xb0\xe6zW\xfdZ[hE\ +\x92\x85\xb6\xc3\xa9\xa6\xcb\xa9\xa6\xcb\x82\xafhEr\xdd\ +c\x16\xb3JG\x09\xe8\xd69\xfe\xda\x18\xfe\xb3\x80\xc7\ +\x06\xdd\x13\x18\xe4\xe7\xd1=\x0b\x00\xa1x\x99\xe3\xf2\xfb\ +\xb5i\xf6\x97F\xd3^\xd5\xf5\xd1\x15\x8e\xc8\xb7\xb4\x16\ +5\xcb\xa7;B\xdf4\xb1\x95\xb7\xbdMdZ\x0b\xb5\ +\x8a\xe5\x07^\x13\xb1g\xdb\x8d)\x80\x8bY=]=\ +\xd0\x82s\x81\xc3Su\x97\xe3\xcb\x1e\xf3m\x87\xc0\x88\ +\x0b\xbeo\x900\x1a\xeag\xb0\xcds\xbc\xcf\x18\xde$\ +\xe0\xc9AV\x02\x03;\x10de\x9f_\xf1b\xe5\xf0\ +\x9b\xd5\xc9\xc1\x13\xfen\x5c\xeeH\xcbDQc\x96C\ +>w\xbf\xa1q.\x16\xfa\x0b2\xef}\x90\x16\xd7\x81\ +\x82g{>\xe3d\xf5\xcf\xf3\x94es)d\xba\x14\ +r`\xbc\xcd\x99\x96\xc3\xb1\xa5\x02O5\x5c\x96\x035\ +p^\x81TP\x9d\x8a\xc3\xcd\xd6\x22\xba\xe3\x09\x9cH\ +{]\xd7\xcb@\x16\x02\xad\x94\xf7\x0anW\x0eo\xab\ +Nrge\x9c\x81y\x93\xba\x02Rr\x0c;\xaa\x01\ +\xcf\x9cl\xf1\xac\xe9&\x8d\xd3\x11\x9f\xff\x92\x88O\x05\ +\xa6\xff\x9fg\xb4\x06\xcf\xbf\xc3PN\xe84eOZ\ +\xc6\x0a\x9a\x1d\xb5\x90\xed\xd5\x90\xa2c\x09\xb5\xc0\xd7\x12\ +\xd3\xff\x8f\xdb3:U\x83RG\x1c\x8c|j\xd6\xf2\ +\xc9\x89\xd7\xde\xd5\x9a\xb8\xfb.\x16\xee\x19\xac\x82\xa1\x81\ +\xf3\x00:\xa3\xbf\x01f\xa4b\xb6<\xce\x0b\xcac\x0c\ +\xc4\xdb\xd3\x15\xfc\xaak\xd8Y\x0b\x98\x19m3Y\x8a\ +\xf0d\xbc'\xefw,bRkq\xdd\xd8\x0bH\xfa\ +\xf3Ka\xd9T\x8c\x98(F\x1c\x18oql\xa9\xc0\ +\x91\xc5\x02g[.\xda\x0e\xc4\xa3D*\xa8M\xa1\xac\ +\xe1\xdf\xb7\x97Y\xb6\x96_\x10PO{]\xd7\xca@\ +y\x00\x9dl?\x166\x09\xc1\xafT\xc6xum*\ +\x9e\xfa\x9bu,Pv\x0c\xfb\xc7\xda|\xd5\xe6&\x07\ +\xc6[\x8cz\x06\xb9\xeam\x7f\xf0q\xc9\xa3O\xc8D\ +\x04\xc0\x02\xd3\x13\x96\xe7\xde\xa6\x13U\x02\x17SP\x96\ +\xa9r\xc4\xcej@\xcd3\x84F\xd0\x8c\xd4@x\x04\ +R\x81[\xc0\x89|\x9e\xa1C\x96\x84\xe0s\x13\xaf\xbd\ +\xcb\x0c\x92\x170\x00\xa2s\x11\x96\x8a\x10\xfcl\xb1\xc6\ +\xb7W&\xb3/\xfc\x968\x0e\xde?\xd6\xe6e;\x97\ +x\xc1\xd6:\x9b\xcb!R\x5c\x18+\x1b\x0b\xad\xb6H\ +t\xe8h\xc1\x8bO%Ns\xcei\xf7\xda\x15\xd7p\ +\xebD\x8b\x97\xef\x5c\xe2y\x9b\xebL\x16#D\xb2\xb7\ +\xe3\xbap\x0aP\x9b\xa2\xe6\x16\xf9\xa9N\x0d\xca\x8a\xa1\ +\x1a\x042.>\xe7\xe9\xdcTe\xe1\xbb\xbc2\xdf_\ +\x9b\xc6S\x19\x0e`, \x05l\xab\x84|\xcd\xb6e\ +^\xb4\xad\xce\xb6\xca\xa5\x82\xdf\xc5Xh\x07\xc9\xbe\xf0\ \xc5\x02\xc8\x8c\xbc\x01\xdd\xa3\x17\xcb\x8e\xe1\xf6\xc9\x16\xaf\ -\xbc\x69\x89\xe7\x4c\x35\x18\xf1\x74\xe6\x95\x80\x57\x86\xea\x24\ -\x9b\x95\xcb\x2f\x85\x3e\x2f\xc4\x0e\x8e\x12\xc8\xc8\xe3\xbf\x32\ -\xdd\xa4\x9f\xb5\x7c\x93\x5b\xe0\x2d\xb5\x49\x6a\x4e\x86\xbb\xfa\ -\x2c\x30\xea\x69\xbe\x6a\x73\x83\x97\xee\x5c\x62\x66\xd4\xc7\x91\ -\x57\xce\xb6\x5b\x03\x6d\x3f\x59\xa7\xb7\xe8\xd9\x0b\x42\x90\x2c\ -\xd0\xbd\x47\x35\x57\xf3\xac\xa9\x26\x2f\xdf\xb9\xc4\x81\xf1\x36\ -\x05\xd5\xfb\xdd\x8a\x5e\x52\xaa\x41\x75\x82\x5b\xa4\xe2\xe7\xac\ -\x65\xc7\xa0\x28\x81\xcc\x2b\x80\x55\x49\xbf\x67\x28\x87\x9f\xab\ -\x4e\xb2\xcd\xcb\xe8\x30\x0f\x4b\xbc\xa5\x37\x33\xea\xf3\x75\x3b\ -\x97\xb8\x63\xb2\x49\xc5\x31\xeb\x7a\x71\xb5\x01\x3f\x48\x6e\xad\ -\x82\x6c\x79\x00\x17\x63\x89\xb7\x3e\xa7\x4a\x11\x2f\xda\x5a\xe7\ -\xc5\xdb\x97\x99\x2e\x45\xd9\xcd\x0b\x08\x28\x8d\x41\x71\x84\x57\ -\x08\xc9\x7f\xe9\x0c\x9c\xcd\x3c\x19\x7d\xfc\x17\x62\x61\xab\x94\ -\xfc\x52\x79\x9c\x67\x17\x33\x5c\xe5\x37\x56\xd0\x3c\x6f\x4b\x83\ -\xaf\xd9\xb6\xcc\xe6\x52\xd4\x5d\xfb\x55\x11\x40\xa4\x13\x56\x00\ -\x02\x4a\x05\x9b\x5d\x81\xea\x60\x89\x9b\x96\xf6\x8c\xf8\xbc\x6c\ -\xd7\x12\x77\x4c\x35\x33\xeb\x0d\x48\x05\xb5\x49\x54\xa1\xc2\x77\ -\x02\xdf\x09\xc8\xac\x7b\x01\x99\x56\x00\x1d\xd7\xdf\x13\x82\xff\ -\x58\x1c\xe1\x1b\x2a\x13\xd9\x6b\xeb\xed\xc6\xfa\x37\x8d\xf8\xbc\ -\x74\xc7\x12\xb7\x4e\xb4\xf0\xae\xe3\x05\x8d\x22\x41\x10\x8a\xc4\ -\x04\x52\x88\xd8\x03\xc8\xd8\xed\xbc\x2c\x16\x18\x71\x35\x77\x4e\ -\x37\x78\xd1\xb6\x65\x26\x8b\x51\xda\x4b\x5a\x13\xe5\x42\x65\x13\ -\x55\xa7\xc0\x4f\x5a\xcb\x8b\xb2\x1e\x0a\x64\x56\x01\xcc\x1c\x9a\ -\xc5\xc6\x6f\xe7\xb7\xba\x45\x7e\xa8\xb2\x09\x27\x6b\x33\xfb\xbb\ -\x49\xab\xe7\x4c\x37\x78\xf1\xb6\x3a\x53\xa5\xeb\x7f\x29\xc3\x08\ -\x82\x30\xb9\xb5\x4b\x01\xc5\x0c\xe7\x51\xd6\xa2\xab\x6c\x67\x46\ -\x7d\x5e\xba\x73\x89\xdd\x23\x7e\x26\x77\x0a\x0a\x15\xa8\x8c\xb3\ -\x5b\x2a\xde\x62\x61\x57\xda\xeb\xb9\x12\x99\x54\x00\x2b\x1a\xd3\ -\x70\xbb\x72\xf9\xe9\xea\x24\x9b\xdc\x42\xda\xab\xba\x10\x0b\x4c\ -\x16\x23\x5e\xbc\x7d\x99\x67\x4e\x36\x29\xad\x33\xd6\x5f\x0b\x41\ -\x2c\xfc\x41\x82\x46\x4d\x4a\x28\x16\xb2\x26\x3a\xeb\xc3\x02\xe3\ -\x05\xcd\xd7\x6c\xab\xf3\xec\xa9\x06\xc5\x0c\x86\x04\xa5\x51\x28\ -\x8d\xf0\x0a\x21\xf8\x8f\xd6\xe2\x65\xd5\x0b\xc8\xa4\x02\x00\xb0\ -\x96\x31\x29\xf9\xe9\xf2\x18\x77\x64\xed\xd0\x0e\x29\x60\xcf\x88\ -\xcf\x4b\x76\x2c\x73\x53\x2d\xe8\x89\x15\x0a\x22\x41\x14\x25\xe7\ -\x90\x2b\x15\x87\x00\x83\x8a\x25\x2e\xa5\x7e\xd6\x54\x93\xe7\x6d\ -\xa9\x67\x6e\xbb\x50\x2a\xa8\x4c\x20\xdd\x22\xdf\x0b\x7c\x83\xcd\ -\x68\x28\x90\x39\x05\xd0\x69\xf2\x11\xc0\xeb\xbd\x0a\xaf\x2e\x8f\ -\x67\x27\xee\xef\x66\xf9\x6f\x9d\x68\xf1\x35\xdb\xea\x6c\x2a\x46\ -\x3d\x7b\xe9\x82\x10\xb4\x4e\xe6\xb3\x5a\x0b\x8e\x8a\xb7\x01\x07\ -\x99\x6e\x48\x70\x60\xbc\xcd\xd7\x6e\x5f\x66\xaa\xd4\xbb\xe7\xd1\ -\x0b\x9c\x02\x54\x26\x98\x54\x0e\x3f\x0e\xec\x85\xec\x29\x81\x4c\ -\x29\x80\x55\x37\xe7\x99\x8e\xc7\x8f\x56\x26\x28\x67\xa5\xd8\xc7\ -\x02\x45\x65\xb8\x73\xba\xc1\x9d\x9b\x1b\x37\xe4\xf2\xaf\x45\xdb\ -\x8f\xb7\x02\x93\xc2\x51\x36\xd5\x12\xe0\x5e\xd3\x2d\xb8\xda\x59\ -\x4d\x70\x2b\x65\x1d\x14\x6b\x50\x1c\xe1\x05\x42\xf0\x63\xd6\x92\ -\x39\x9f\x2b\x53\x0a\x00\xc0\x5a\x6a\x42\xf1\xa6\xd2\x28\x07\x0a\ -\x19\x39\xa5\xd7\x12\x97\xaa\x3e\x7f\x4b\x83\xdb\x37\xb5\xf0\x64\ -\xef\x63\xce\x56\x7b\x55\x17\x60\x02\xb8\x0e\x38\x4e\x7a\x09\xb4\ -\x5e\x3b\x3a\x96\xb8\x66\xe0\x6b\xb6\xd5\xd9\x33\xe2\x67\x66\x77\ -\x43\xc8\x95\x50\xe0\x75\xc0\x2b\xb3\x16\x0a\x64\x46\x01\xac\xba\ -\x29\xaf\xf2\xca\x7c\x6b\x56\x3a\xfc\x2c\x71\xf7\xde\xf3\xb7\xd4\ -\xd9\x37\xde\xee\x5b\xd6\xb9\xe5\xc7\xe5\xc0\x49\xe1\xb9\xf1\x57\ -\xd2\x48\x00\x0b\x8d\x76\xef\x3f\xaf\x05\x6a\x9e\xe6\xab\xb7\xd6\ -\x39\x30\xde\xce\x4c\x95\xa3\xe3\x41\x65\x82\xa9\x4e\x28\xb0\x23\ -\xed\xf5\xac\x26\x33\x0a\x00\xc0\x5a\x76\x29\x87\x1f\xac\x8c\x53\ -\xcd\xc2\x81\x9d\x16\xa8\xb9\x86\xaf\xde\x5a\x67\x66\xb4\x7f\x56\ -\xc5\x12\x17\x01\xd9\x84\x14\x80\x25\xde\x01\xf0\x9c\x64\x2e\x28\ -\x88\x5f\x34\x3f\x80\x47\x8f\x4b\x3e\xf8\x8f\x0e\x9f\xb8\x4f\xf5\ -\xe5\x7e\x76\xbd\xb5\xe7\x6e\xc9\x96\x12\x28\xd6\xa0\x50\xe5\x85\ -\x42\xf0\xbd\xd6\xe2\x64\xc5\x0b\xc8\x44\x14\xd8\x49\xfc\x29\x21\ -\xf9\xfe\x62\x8d\x17\x66\xe1\xdc\xbe\xd5\x2f\xd2\xee\x11\xbf\xef\ -\xd7\xf2\x03\xd1\xf3\xb1\x5f\x57\xc2\x73\xfb\xdb\x09\x28\x3a\x5f\ -\xda\xc2\xd9\x45\xc1\xc3\x8f\x4b\xbe\xf0\x88\xe4\xf8\x49\x49\xbd\ -\x09\x2f\x7b\xbe\xee\xdb\x67\x8d\xf3\x35\x96\xe7\x6e\xae\xa3\xa4\ -\xe5\xf0\x5c\x29\x51\xef\x6a\xcd\xfb\x11\x87\x02\x6e\xd8\xe6\x7b\ -\xc2\x16\x7f\x8b\xe0\x33\xe9\xae\x28\x26\x13\x0a\xa0\xc3\x33\x1d\ -\x8f\xef\x28\x8f\xa3\xd2\x6e\xf1\xed\x6e\x31\x3d\x7f\x4b\x6c\xf9\ -\xfb\x8d\x31\xd0\x6c\x5f\x30\x01\xac\xef\x14\xbc\xfe\xf4\x01\x74\ -\x05\xbf\xe9\xc3\x13\x4f\x4b\xbe\xf4\xa8\xe4\xa1\xc7\x24\x67\x17\ -\x04\x51\x67\x97\x43\x08\x18\xa9\x58\x24\xf4\x74\x16\xe1\x6a\x2c\ -\xf1\xac\x81\x67\x4f\x35\xd0\x46\xf0\xf0\x42\x31\x75\x25\xe0\x16\ -\xa1\x34\xc2\x6e\x1d\xf0\x46\x63\xf8\x91\x99\x43\xb3\xf5\xb4\x67\ -\x09\xa6\xae\x00\x3a\xd6\xbf\x28\x14\x3f\x50\x1c\x61\xaf\x9b\xd0\ -\x78\xaa\xcb\xd1\xb5\x1e\xcf\x99\x6e\xb2\xb7\xcf\x96\xbf\x8b\x36\ -\xd0\x4a\xb0\x13\x50\xd0\xdb\x4e\xc0\xae\xd0\x47\x06\xe6\x3a\xd6\ -\xfe\x8b\x8f\x48\x9e\x38\x29\x69\xb6\x3b\xdf\x23\xce\x2b\x1c\xcf\ -\x85\x6d\xd3\xfd\x97\xc6\xee\xb3\xfc\xaa\xcd\x0d\x2c\xf0\xf0\x7c\ -\x31\xf5\x6d\xc2\xd2\x28\xf8\x0d\xbe\xd1\x6f\xf0\x01\xe0\x7d\x33\ -\x87\x66\x53\x1d\x28\x9a\xaa\x02\x58\x89\x83\x04\x2f\x71\x8b\x7c\ -\x4b\x39\x03\x43\x3d\x1d\x61\x79\xe6\x54\x93\x83\xe3\xad\x44\xdc\ -\x71\x41\xec\x01\x24\xd9\x08\x04\x50\x2a\xde\xb8\x07\xd0\xbd\x3d\ -\xcd\x36\x1c\x3b\x19\x5b\xfb\x87\x8f\x4a\xe6\x16\x04\x91\xe9\x28\ -\x86\x8b\xee\xa1\xb1\xb0\x65\xd2\xb2\x73\x4b\x32\xd5\x7b\xdd\xed\ -\xdb\xe7\x4c\x37\xf0\xb5\xe0\xf1\xc5\x74\x77\xe2\x94\x0b\xe5\x31\ -\xc6\x23\x9f\x37\xea\x90\x4f\x0a\xc9\xd3\x69\xae\x27\x75\x0f\xc0\ -\x1a\xaa\xd2\xe1\xfb\xca\xa3\x4c\xa5\x7d\x72\xaf\x14\x70\x70\xa2\ -\xcd\x2d\x13\xad\x44\x93\x47\xc6\x80\x9f\x60\x1f\x80\x10\x50\x2a\ -\xda\x95\x13\x82\xae\xe9\xdf\x72\xde\xda\x9f\x59\x10\x3c\xf4\xb8\ -\xe4\xcb\x8f\x4a\x8e\x3f\x7d\x91\xb5\x17\x97\xff\xf7\x07\xf7\x18\ -\x6a\xe5\xe4\xca\x77\x2d\x50\x71\x0c\xcf\xdd\xdc\xa0\x1d\x49\x9e\ -\x6a\xb8\xa9\x6e\x30\x15\x6b\xd0\xae\xf3\xd5\xad\x45\xbe\x19\xc1\ -\xdb\xd3\xf4\x02\x52\x53\x00\xab\xac\xff\xcb\xdd\x22\x2f\x2f\x64\ -\xa0\x7b\x7a\xcf\x88\xcf\x73\xa6\x9b\x7d\xd9\xe7\xbf\x12\x91\x16\ -\x04\x41\x82\x21\x40\xa7\x11\xe8\x5a\x14\x80\xec\x7c\x6f\xbd\x25\ -\x38\x7a\x42\xf0\xe5\xaf\x48\x1e\x39\x2a\x99\x5f\xec\x58\x7b\x71\ -\xf5\x04\xa6\xb5\x50\x29\x59\x6e\xdd\x6b\xae\x4b\xf9\xdc\x08\xdd\ -\x21\x2d\xcf\xdb\x52\xe7\x9f\x9e\xac\x31\xef\x3b\xa9\x29\x01\x21\ -\xa1\x3c\x46\x31\x68\xf2\x7d\x3a\xe0\xc3\x42\x72\x2c\xa5\xa5\xa4\ -\xbb\x0d\x68\x0d\xe3\x4a\xf1\x03\xe5\x51\x26\xd2\xac\xf8\xb3\xc0\ -\xe6\x72\xc8\x73\xa6\x1b\x14\x55\x6f\x2b\xfc\xd6\x43\x10\xc6\x5f\ -\x49\xb6\x02\x17\xd6\xe1\x6d\x75\xb7\xef\xa2\x08\x8e\x9f\x12\x7c\ -\xf4\x5f\x15\xff\xeb\x7d\x0e\xef\xfa\xa0\xcb\xbf\xdc\xaf\x38\xb3\ -\x10\x9f\x05\x28\xd7\x79\xf4\x97\xb5\xb0\x6b\xab\x65\xdb\x74\xf2\ -\xf7\x18\xce\x17\x0b\x3d\x7b\xba\x49\x49\x25\x58\x75\xb5\x06\x5e\ -\x09\x8a\x55\xee\x10\x82\xbb\xad\x49\x6f\x6e\x40\x2a\x62\x77\x41\ -\xec\x5f\xe6\x45\x69\x5a\x7f\x0b\x8c\x78\xf1\x20\x8f\xb1\x42\x3a\ -\x0d\x25\x7e\xc2\x9d\x80\xea\x2a\x9d\x80\x5d\x61\x5e\x6a\x08\x8e\ -\x1c\x17\x7c\xf1\x11\xc5\x91\xe3\x82\xc5\xba\x40\xaf\xd3\xda\xaf\ -\x79\x5d\x05\xb7\xdd\x6c\x28\x79\xfd\xcb\xfe\xaf\x87\xdd\x23\x3e\ -\x4b\x81\xe2\xbe\xd3\x95\xd4\x76\x06\x84\x84\xd2\x28\x9e\xdf\xe0\ -\xf5\x91\xcf\xfb\x80\x23\x69\xac\x23\x35\x0f\xc0\x1a\x46\xa5\xe2\ -\xbb\x8b\x35\x46\xd3\xec\xf3\x2f\x28\xcb\xb3\xa6\x9a\x6c\x2e\x87\ -\xa9\x08\xbf\x00\xc2\x30\xb6\xb2\x49\xa1\xe4\xa5\xb3\x00\xba\xd6\ -\x5e\x6b\x78\xea\x8c\xe0\xa3\x9f\x8e\xad\xfd\xbb\xff\xc6\xe5\xde\ -\x07\x24\x0b\x4b\x71\x9d\xc2\x7a\xad\xfd\xc5\x58\x0b\x63\x35\xcb\ -\x81\xdd\xe9\x58\xff\x0b\x3e\xbf\x80\x5b\x26\x5a\x7d\xaf\xef\xb8\ -\x1a\x6e\x09\x0a\x15\x6e\x13\x92\x6f\x0d\x5b\x88\x34\xbc\x80\xc4\ -\x3d\x80\xd5\xd6\xdf\x2b\xf1\x75\xc5\x14\x5b\x7d\x05\x70\x70\xbc\ -\xcd\xbe\xb1\x74\x5f\x84\x20\x14\x44\x3a\x99\x23\x74\xad\x05\xa5\ -\xec\x4a\x27\x60\xf7\x92\xdd\xd8\xfe\x8b\x8f\x4a\x1e\x3d\x16\xc7\ -\xf6\xe6\x06\xac\xfd\x5a\xd7\x9d\xd9\x69\x98\x1c\x4b\xbf\x77\xbf\ -\xbb\x3d\xf8\xac\xa9\x26\x0b\x6d\x87\x79\xbf\x3f\x55\x89\x57\x43\ -\x08\x28\x8d\xe2\xf8\x0d\x5e\x63\x0d\x7f\x0e\x1c\x4f\x7a\x0d\xa9\ -\x78\x00\x46\x53\x92\x8a\x6f\x2f\x8e\x30\x26\x53\x8a\xfd\x2d\xb0\ -\xa5\x12\x72\xeb\xa6\x16\x4a\xa4\xfb\x4a\xb6\x83\x4e\x2b\x70\x42\ -\xd7\x73\x9c\x78\x16\x40\x64\x62\x6b\xff\xb1\xcf\x28\xfe\xe8\xfd\ -\x0e\xef\xfa\x90\xcb\xa7\x3e\xaf\x38\xbb\xd0\xfb\xaa\x44\xcf\x8d\ -\xdd\x7f\x37\x23\x53\x9d\x2c\x30\x51\x8c\x78\xd6\x74\xba\x03\x45\ -\xdc\x22\x78\x65\xee\x40\x70\x17\x22\xf9\x46\xa1\x44\xc5\xaf\xfb\ -\xe1\x84\xe0\xab\x9c\x02\x2f\x4d\xab\xe4\xb7\xdb\xe0\x73\xe7\x74\ -\x83\x9a\x9b\xfe\x20\x89\xb6\x9f\x6c\x27\xa0\x14\xf0\xe8\x31\xc9\ -\x3f\xde\x2b\x78\xf8\xa8\x64\xe1\x1a\x32\xf9\xd7\x83\xb5\x30\x35\ -\x61\x99\xd9\x91\xbe\xf5\xbf\x98\xdd\x23\x01\xa7\x1a\x6d\x0e\xcf\ -\x97\x52\xb9\xbe\x90\x50\xac\x51\xf0\xeb\xbc\x46\x87\xbc\x5f\x48\ -\xe6\x92\xbc\x7e\xe2\x1e\x80\xd1\xb8\x52\xf1\xba\x62\x8d\x2d\x69\ -\x35\xfc\x74\x87\x48\xa4\x15\xf7\xaf\xc6\x92\x6c\x27\xa0\x10\xb0\ -\x54\x17\x7c\xf0\xe3\x0e\xff\x72\x7f\x6c\xed\xaf\x25\x93\x7f\xbd\ -\x9f\xf1\xc0\x6e\xc3\x68\x2d\x7b\x0a\xc0\x11\x96\xdb\x27\x5b\xa9\ -\x0e\x13\xf1\xca\xe0\x95\xf8\x6a\x04\x5f\x0b\xc9\x7a\x01\x89\x2b\ -\x00\x21\xd8\xaf\x3c\xee\x2a\xa6\x94\xf9\xb7\xc0\xb6\x4a\xc0\xc1\ -\x84\x8b\x7d\xae\x44\xdb\x4f\xae\x13\x10\xe2\xd2\xe3\x20\xec\x9f\ -\xc5\x5f\x8d\x05\xca\x85\xd8\xfd\xcf\x54\xeb\xe9\xaa\xf5\x8d\x78\ -\x9a\xdb\x36\xb5\x28\xa8\x74\x54\x80\x54\x50\xa8\x31\x22\x15\xaf\ -\x32\x9a\x44\x8b\xe1\x13\x7b\x26\x33\x87\x66\x91\x0a\x84\xe0\xdf\ -\x14\x2a\xec\x4e\xeb\x64\x9f\x82\xb2\xdc\xba\xa9\xb5\xee\x03\x3b\ -\xfa\x8d\x25\x0e\x01\x92\x54\x00\x89\x7e\x3e\x03\xdb\x37\x1b\x76\ -\x6e\xce\xc6\xfd\xbe\x1c\xbb\x47\x7c\xf6\x8c\xf8\xa9\xad\xb1\x50\ -\x01\xc7\xe3\x65\x42\x70\x4b\x92\xd7\x4d\x54\x29\xeb\x90\x2d\xd2\ -\xe5\x9b\x0b\xd5\xf4\x8c\xc1\xde\x51\x9f\x1d\xd5\xf4\x5d\xff\x2e\ -\xd6\xc6\x21\x40\x56\xd6\xd3\x6b\xa4\x84\x5b\x67\x0c\xe5\x62\xb6\ -\x3f\xa3\xdb\x99\xf5\x98\x56\x2d\x88\x72\xa1\x50\x61\xbb\x90\x7c\ -\xfd\xd8\xd6\xe4\xc2\x80\x44\x04\x71\xd5\xd6\xdf\xd7\x78\x65\x9e\ -\xed\xa5\x90\x6f\xe9\x4e\x8b\xb9\x65\xbc\x85\x93\x72\xd6\x7f\x35\ -\x71\x23\x50\x06\x87\xdb\xf7\x00\x6b\xa1\x56\xb1\x1c\xdc\x63\xb2\ -\x30\xdc\xe9\xca\x6b\x05\x36\x95\x22\xf6\x8f\xa5\x37\x44\xa4\x50\ -\x45\x29\x87\x7f\x3b\x7f\x82\xc9\xa4\xae\x99\x98\x25\x36\x9a\x82\ -\x54\x7c\x63\xb1\x42\x25\x8d\x7e\x7f\x01\xdc\x3c\xe6\xb3\x29\x63\ -\x93\x63\xb5\x89\xb7\x01\x87\x11\x6b\x61\xcf\x76\xcb\xe6\x4d\x36\ -\xd5\xca\xbf\xf5\x12\xbf\x23\x6d\xb6\xa4\x94\x1c\x76\x0a\xe0\x16\ -\x79\xa6\x80\xe7\x41\x32\x5e\x40\x62\xa2\x28\x04\x7b\x1c\x8f\x17\ -\xa5\x71\xb0\x67\x7c\x90\x44\xc4\xcc\x68\x3b\x53\x96\xa8\x7b\x26\ -\x60\xdb\x27\x13\xf3\x0f\x7b\x8d\xe3\xc4\xc9\xbf\x42\xea\x3d\xa7\ -\xeb\xa3\xbb\x3d\x7c\x70\xbc\x85\x2b\x93\x57\x01\x52\x81\x57\x65\ -\x4c\x2a\xee\xd2\x61\x32\x5b\xf4\x7d\x57\x00\x33\x87\x66\x91\x0e\ -\x08\xc1\x2b\xbd\x12\xbb\xd3\x28\xfc\x51\x02\x0e\x4c\xb4\x53\x8b\ -\xef\xae\x84\xd6\x02\x3f\x48\xee\x4c\xc0\xa4\xb0\x16\x36\x8d\x5a\ -\x6e\xde\x95\xed\xe4\xdf\x25\xeb\x06\x76\xd6\x02\xb6\x55\xd2\xf1\ -\x02\xbc\x32\x28\x8f\x97\x0a\x99\xcc\xf0\xd0\x44\x3c\x80\xa8\x4d\ -\x4d\xba\xbc\xb2\x50\xc5\x49\xfa\x90\x0f\x0b\x8c\x15\xa2\xf8\x04\ -\x9f\x64\x2f\xbd\xbe\x7b\xa3\xe3\x73\x01\x87\x0d\x0b\xec\xbb\xc9\ -\x30\x31\x9a\xbd\xbd\xff\xab\x51\x50\x96\xfd\xe3\xed\x54\xb6\x05\ -\x1d\x0f\xdc\x22\x7b\x85\x4c\x26\x0c\xe8\xab\x02\x58\xa9\xfc\x93\ -\xec\x77\x3c\xee\x4c\x63\xdc\x97\x14\x71\xec\x5f\xcb\xd8\xd1\x51\ -\x5d\xc2\x68\x38\x15\x40\xc1\x85\xdb\x66\x0c\x4e\x16\xb5\xee\x55\ -\xb0\xc0\xf6\x6a\xc0\xd6\x4a\x90\xf8\x3b\x23\x04\x14\x2a\x54\xa4\ -\xe2\x95\x3a\xa4\xef\xa5\x72\x7d\xf7\x00\x84\x04\x21\x78\xae\x57\ -\x62\x3a\x69\xf7\xbf\x1b\xfb\xef\xce\xd0\x41\x11\x17\xdc\x1b\xe2\ -\xf8\x7f\xd8\x14\x80\xb1\xb0\x75\xca\xb2\x7b\xfb\xe0\x59\xff\x2e\ -\x9e\xb4\xdc\x3c\xea\xe3\xa5\x90\x0b\x70\x8b\xa0\x5c\x9e\x2b\x24\ -\xdb\xa0\xbf\x5e\x40\xdf\x15\x80\x0e\x28\x49\x87\x97\xba\xa5\xe4\ -\x3b\x0f\x05\x71\x81\x47\xd6\x0e\x8e\x5c\x4d\x3b\x48\xf6\x50\xd0\ -\x24\x10\xc0\x2d\x09\x8f\xfd\xea\x35\x16\xd8\x5a\x0d\x99\x2c\x45\ -\x89\x17\x69\xa9\x38\x0c\xd8\x27\x24\xcf\xee\xf7\xb5\xfa\xa6\x00\ -\x56\xed\xfd\xef\x74\x3c\x9e\x9d\xb4\xfb\x1f\x67\x74\x35\xbb\x32\ -\x1a\xfb\x77\x09\x02\x56\x86\x6c\x0c\x03\xd6\x42\xb5\x6c\xb9\x65\ -\x26\xfb\x7b\xff\x57\xa3\xa8\x0c\xbb\x47\x7c\x54\xc2\xdb\xd6\x42\ -\x80\x57\xa2\x2c\x25\x5f\xa7\x43\xfa\xda\x3f\x99\x44\x08\xf0\x1c\ -\xa7\xc8\xce\x34\xb2\xff\x3b\x6b\x01\x13\x3d\x3c\xc1\xb7\x1f\x04\ -\x11\x89\x76\x02\xf6\x1b\x6b\x61\x67\x67\xec\xd7\xa0\x7f\x2c\x01\ -\xec\xa8\x06\x54\x53\xe8\x18\x75\x4b\xa0\x5c\x9e\x27\x24\x9b\xfa\ -\x79\x9d\xbe\x2a\x80\x85\xa7\x10\x52\xf2\x1c\xaf\x48\x31\x69\x0b\ -\x57\x54\x96\x3d\x23\x01\x2a\xe3\x66\xa8\xd5\x16\x89\x9e\x0a\xdc\ -\x6f\x94\x8a\x93\x7f\xa5\x0c\x1c\xed\x76\xa3\x74\xab\x47\x77\x54\ -\x93\xf7\x22\x95\x07\x4e\x81\xfd\x42\x70\x2b\xf4\x2f\x0f\xd0\x57\ -\x05\x30\x3a\xcd\x98\x74\xb8\xd3\x49\x78\x14\xbb\xb5\x30\x59\x0a\ -\x99\x2c\x65\xa7\xe6\x7f\xcd\x75\xd2\x39\x11\x28\xcb\x8b\xbc\x96\ -\xcf\x93\xa1\xb1\x5f\xbd\x42\x89\xd8\x93\xf4\x12\xde\x12\x94\x12\ -\xdc\x12\xe3\x42\xf2\xdc\x52\x1f\x3b\x67\xfb\x1b\x02\x08\x76\x39\ -\x1e\xfb\x92\x9e\xf7\x2f\x65\x3a\x0f\xed\x5a\xb1\xc4\x1e\xc0\x30\ -\x29\x80\xbd\x3b\x6d\x26\xc6\x7e\xf5\x92\xa9\x72\xc4\xa6\x62\xf2\ -\xc9\x40\xb7\x88\x94\x0e\x2f\x68\x2c\xd0\xb7\xfa\xd9\xbe\x28\x80\ -\x99\x43\xb3\xdd\xa3\xa0\x9e\xed\x14\xd8\x9c\xe4\xd0\xcf\x6e\xf2\ -\x2f\x0d\xb7\xed\x9a\xd7\x3a\x64\x9d\x80\x9e\x0b\xcf\xb8\x59\x67\ -\x66\xec\x57\x2f\xe8\x9e\x2c\xb4\xbd\x1a\x24\x9e\xa8\x75\x3c\x70\ -\x5c\x0e\x20\x98\xee\xd7\x35\xfa\xe6\x01\xf8\x0d\xa4\x50\xdc\xe1\ -\x16\x49\xbc\xf3\x7f\x73\x39\xa4\xe6\x65\xdf\x0d\x35\x16\x9a\xed\ -\xe1\xe8\x04\xec\x8e\xfd\xda\x9b\xc1\xb1\x5f\x37\x8a\x00\xb6\x56\ -\x42\x4a\x09\xcf\x90\x90\x0e\x28\x8f\x5d\x42\x70\xb0\x6f\xd7\xe8\ -\xd7\x0f\x56\x1e\x35\xe9\x70\x47\xd2\xf1\xbf\x12\xf1\xc3\xca\x52\ -\xcb\xef\xe5\x88\x22\x56\x8e\xd3\x1a\x06\x0e\x66\x74\xec\xd7\x8d\ -\xd2\x2d\x27\x9f\x28\x26\x5b\xb1\x25\x04\xb8\x45\xaa\x42\xc6\x72\ -\xd4\x8f\x44\x60\xdf\x14\x80\x10\x4c\x2b\x87\x5d\x49\x9e\xf8\x63\ -\x81\xb2\x63\x98\x2a\x65\xbf\xb4\x4e\x00\x61\x24\xf0\x87\xa0\x13\ -\xd0\x12\x1f\x36\x7a\x6b\x46\xc7\x7e\xf5\x82\x82\xb2\x6c\x29\x87\ -\x89\x3f\x2a\xa7\x80\x90\x0e\x77\xb4\x97\xfa\xe3\x49\xf7\xe7\x79\ -\xc5\xb3\xe6\xf6\x3a\x1e\x9b\x45\x92\xf1\xa0\x85\xf1\x62\x94\xd9\ -\xba\xff\x8b\x89\x34\x04\xd1\xe0\x77\x02\x5a\x03\xdb\xa7\xb3\x3f\ -\xf6\xeb\x46\x10\xc0\xe6\x4a\x98\x78\x83\x90\x72\x41\x39\x1c\x90\ -\xaa\x3f\xf5\x00\x3d\x57\x00\x33\x87\x66\x51\x0a\x84\xe4\xa0\xe3\ -\x51\x4d\x32\x71\x22\x44\x1c\xff\xa7\xd1\xcb\x7d\x3d\x68\x13\x2b\ -\x81\x41\x67\x50\xc6\x7e\xdd\x28\xe3\x05\x9d\x78\x59\xb9\x8a\xf3\ -\x00\xdb\x11\xfd\xe9\x0b\xe8\x8b\x07\xd0\xae\xe3\x48\xc5\xad\xaa\ -\x90\xac\x47\xe8\x4a\xcb\x64\x29\x1a\x18\x8b\xaa\x75\xb2\x47\x82\ -\xf5\x83\x41\x1a\xfb\x75\x43\x9f\x13\x28\x3a\x86\xe9\x72\x82\xe7\ -\xb8\x13\x37\xd3\x29\x97\x51\x21\xd9\xdb\x0f\x63\xda\x17\x01\x95\ -\x8a\x8a\x74\x98\x49\x72\xee\xbf\x05\x2a\xae\x61\xac\x30\x18\x26\ -\x35\xce\x01\x0c\xbe\x07\xd0\x1d\xfb\xb5\x65\x40\xc6\x7e\xdd\x08\ -\x12\x98\x2c\x45\x89\x57\x97\x3a\x1e\x25\x29\x99\xe9\x47\x42\xbd\ -\x2f\x0a\x40\x08\x26\x94\xc3\x76\x95\x70\xfc\x3f\xe2\xe9\x54\x8e\ -\xf7\xbe\x5e\x82\x50\xa0\x13\x3a\x13\xb0\x5f\x38\x0e\xdc\x7e\xb3\ -\xc1\x1b\x90\xb1\x5f\x37\xca\xa6\x62\x94\xf8\x76\xa0\x72\x40\x28\ -\x6e\x6e\xcc\xf5\xbe\xa3\xb6\x3f\x0a\x40\xb2\x59\x3a\x4c\x26\x39\ -\xfc\x53\x88\x58\x3b\x3b\x03\x12\xff\x43\x3c\x0b\x40\x9b\xc1\x95\ -\x7f\x6b\x61\xd3\xd8\xe0\x8d\xfd\xba\x11\xca\xae\xa1\xe6\x26\xeb\ -\xb6\x49\x17\xa4\x62\x9b\x74\xe9\xf9\x3c\xed\x9e\x8b\x68\xe7\xb4\ -\x99\x6d\xca\x4d\x76\xfa\xaf\x12\x96\xf1\xe2\xe0\xc4\xff\xd0\x51\ -\x00\x03\x1c\x02\x58\x60\xff\x80\x8e\xfd\xba\xde\xcf\x5b\x90\x86\ -\xf1\x84\xeb\x01\xa4\x02\xa9\xd8\x21\x25\x63\x3d\xff\xd9\xbd\xfc\ -\x61\x33\x87\x66\x51\x1e\x20\xd9\x23\x9d\xe4\x8e\x38\x8a\x13\x34\ -\x96\x51\x6f\xb0\xa4\xc9\x0f\x44\x62\x67\x02\xf6\x83\x82\x1b\x67\ -\xff\xb3\xde\x71\xd9\x4b\xa4\x80\xb1\x82\x4e\xf4\xec\x00\x29\x41\ -\x39\x8c\x21\x98\x80\xde\xee\x04\xf4\xdc\x46\x9f\xfc\x32\x42\x4a\ -\xb6\x2b\x37\x59\x63\x5c\x76\x0c\x25\x67\xb0\xd2\x50\x7e\x98\xfc\ -\x2c\x80\x6e\x43\x8b\xeb\x72\x43\x2f\x71\x3c\xf6\xcb\xb0\x7b\xdb\ -\xc6\xb0\xfe\xab\x19\x2d\xe8\x44\x2b\x4d\x85\x00\xe9\x30\x2a\x24\ -\x53\xbd\xfe\xd9\x3d\x4f\x2a\x8c\xdf\x44\x51\x48\x76\x25\xd9\x00\ -\x84\x8d\x1b\x80\xbc\x14\xcf\x79\xbf\x1e\xfc\x20\x16\xc8\x24\x0e\ -\xe8\xb4\x16\x5c\x15\xc7\xec\x07\xf7\x18\xaa\x65\xcb\xc7\x3e\xe3\ -\xd0\xf2\xaf\x2f\x07\x21\x80\x83\x7b\xec\x40\x8f\xfd\xba\x5e\x2a\ -\x8e\xa1\xa0\x0c\x81\x51\xc9\x58\x39\x01\x52\x51\x80\xd8\x03\xe8\ -\x25\x3d\x57\x00\x02\x4a\xd2\x61\x2a\xd1\x1d\x00\x11\x0f\x6e\x50\ -\x03\x50\xff\xdf\xc5\x00\x2d\xbf\xbf\xaf\x4f\xd7\xda\x97\x4b\xb0\ -\x6b\x8b\xe1\x19\xfb\x0c\x07\xf6\x18\xa6\xc7\x2d\x87\x8f\x48\xcc\ -\x75\x26\x20\xe3\xb1\x5f\xb1\xfb\x2f\x18\xee\xe2\x9f\xb5\x28\x3a\ -\x86\xa2\x63\x59\x4e\xb0\x24\x40\x2a\x5c\x29\xe3\xce\x5a\xdd\xc3\ -\x14\x44\xef\x15\x80\xa4\x26\x25\x53\x49\x96\x00\x4b\x01\x35\x6f\ -\xb0\x5e\x46\x63\xa1\xd5\x8e\xd7\xdb\x4b\x35\xd0\xb5\xf6\x8e\x82\ -\xc9\xb1\x78\x38\xc7\xed\xfb\x0c\xbb\xb6\x1a\x2a\x9d\xac\x8c\x00\ -\x5a\x9d\x59\x84\xd7\x75\x0d\x0b\xbb\xb6\x1a\xb6\x4d\x0d\xfe\xd8\ -\xaf\x6b\xfe\xec\xc4\x05\x67\x15\xc7\x70\xa6\xd7\x0f\xef\x0a\x48\ -\x85\x14\x92\xe9\x5f\x7b\x35\xfc\xc4\x3d\xbd\xfb\xb9\xbd\xdf\xbd\ -\x15\x54\xa5\x43\x25\xc9\x12\x60\x47\x58\xaa\x09\x6f\xcd\xdc\x28\ -\xc6\x74\x3c\x80\x1e\xbd\x44\x5d\x6b\x5f\x2c\xc0\xce\x2d\x86\x3b\ -\xf6\x1b\x6e\xd9\x6b\x98\x1c\xb3\x38\xb2\xa3\x18\x56\x7d\x7f\xb3\ -\x25\xae\x3b\xff\xd0\x1d\xfb\x55\xf4\x06\x47\xe1\xf6\x12\x25\x2d\ -\x25\x37\xc1\xfd\xdb\x38\x07\x80\x90\x6c\xfa\xe1\xdf\x47\x56\x27\ -\x7b\xa7\x77\x7b\xa6\x00\x56\x0e\x01\x11\x8c\x0a\x49\x25\xa9\x9b\ -\x63\x01\x47\x5a\xca\xee\x60\xd9\xa2\xf8\x54\xe0\x1b\xff\xec\xd6\ -\x82\x23\x61\xbc\xb3\x1f\x7f\xc7\x7e\xc3\x9e\xed\x86\x6a\xe9\xfc\ -\xf7\x98\x35\xfe\x5d\xbd\x75\x7d\xa3\xc8\xac\x85\x89\x51\xcb\xfe\ -\xdd\x83\x75\xbf\x7b\x89\x00\x2a\x8e\x4e\x2e\xcb\xdd\xcd\x13\x09\ -\xc6\xbd\x0a\x0e\xd0\xb3\xe3\x64\xfb\xe3\x01\x48\xbc\x24\x3d\x80\ -\x82\xb2\xa9\x1c\xe0\x70\x23\x58\x0b\xc1\x75\xc6\x90\x17\xc7\xf6\ -\xb7\xdd\x6c\x38\xb0\xdb\x30\x35\x6e\x71\xd5\xa5\xd6\x7e\xad\x7f\ -\xdf\x1d\x45\x76\xad\xcf\xc9\x5a\xd8\xbb\xc3\x30\x39\xbe\xf1\x92\ -\x7f\x5d\x04\xe0\x29\x9b\x68\xc8\x29\x14\x48\xc9\x88\x94\x78\x64\ -\x55\x01\x74\x5e\xa6\x11\xa1\xfa\x7f\xa4\xd1\x0a\x16\x0a\xca\x0c\ -\xd4\x0e\x80\x20\x8e\xbf\x83\x70\xfd\x65\xc0\xd6\x76\xbc\x9d\x4e\ -\x6c\x7f\x70\x4f\x27\xb6\xdf\x12\x77\xe1\x75\x6e\xc5\xba\x7c\x43\ -\xcb\xf9\x51\x64\xd7\xaa\xa7\x3d\x17\x6e\xdf\x67\x70\xe5\xfa\xae\ -\x35\xac\x94\x1c\x83\x14\x16\x6d\x93\xb1\x74\x42\xc4\xf9\x35\x21\ -\x29\x00\xf5\x5e\xfd\xdc\xde\x7a\x00\xb1\x4a\x2c\x0a\x91\x7c\x17\ -\xe0\x20\xed\x00\x40\x2c\xfc\x7e\x78\x75\x01\xec\x5a\xfb\x4a\xd9\ -\xb2\x7b\x9b\xe5\xf6\x7d\x86\x03\x37\x19\x36\x8d\x5a\x94\xbc\xba\ -\xb5\x5f\x0b\xa3\xa1\x7d\x1d\xf9\x07\xd3\x1d\xfb\x35\xc0\x47\x7e\ -\xf5\x8a\x82\xb2\x48\x01\x3a\xa1\x1b\xd1\xa9\xb0\x2d\x41\x6f\x8d\ -\x6b\x4f\x15\x80\x54\x60\x2c\x55\x21\xfb\x7b\x9a\xc9\xc5\xb8\xca\ -\x0e\xdc\xc9\x3a\x7e\x10\x9f\x0a\xb4\x16\x5d\x6b\xef\xaa\x58\xe0\ -\x6e\xd9\x6b\xb8\xfd\x66\xc3\xce\x2d\x71\xe2\x0d\xd6\x6f\xed\x2f\ -\xa6\xdb\x85\xd8\x6c\x73\x5d\x49\xac\x83\x7b\x86\x73\xec\xd7\xb5\ -\xe2\x4a\x8b\x92\x96\xd0\x24\xf4\xe2\xc5\x0a\xa0\x8c\xa0\xa7\x3d\ -\x81\xbd\x0d\x01\x24\x20\x70\x45\x92\x43\x6e\x44\xfc\x30\xc4\x00\ -\xbd\x92\x02\x68\x07\xf1\x48\xb0\xd5\x74\xad\x7d\xb5\x1c\x1f\xac\ -\x79\xc7\x7e\xc3\xfe\x9b\x0c\xe3\x23\x16\x25\x62\x81\xef\xc5\xa7\ -\x0c\x22\x41\xdb\xbf\xf6\x87\x54\x2e\xc4\x7b\xff\x92\x8d\xed\xfe\ -\x43\x9c\x78\x96\xf4\x7e\x1b\xf7\x72\x08\x01\x48\x5c\x41\x6f\x8d\ -\x6b\x6f\x3d\x80\x38\x2e\x74\x49\x78\xca\x95\x12\x83\xe7\x01\x68\ -\x2d\x56\x1a\x81\x8c\x89\xdb\x6a\x37\x4f\x58\x6e\x9d\x89\x63\xfb\ -\x1d\x9b\x0d\x45\xf7\xbc\x8b\xdf\x4b\x81\x8b\xa2\xb8\x0c\xf9\x5a\ -\x30\x06\xb6\x6f\x1e\xee\xb1\x5f\xd7\x82\x12\x16\x99\x70\xd8\x29\ -\x62\xf7\xbf\xa7\xb3\x01\x7b\xeb\x01\x28\x40\x24\xdf\x1b\x92\xf4\ -\xe1\x8d\xbd\xc0\x98\xce\xd1\x53\x95\x38\xb6\xbf\xe3\x40\xc7\xda\ -\xd7\xe2\xd8\xd2\xd0\x3f\x2b\x1b\x46\x10\x5e\xa3\x02\x90\x32\xde\ -\xfb\x1f\xf6\xb1\x5f\xeb\x45\x88\x1b\xeb\xa5\xb8\xf6\x0b\x82\x90\ -\x08\x7a\x9c\x5f\xeb\xa9\x02\x28\x54\x20\x6c\xe1\x24\xed\x01\x08\ -\x06\xab\xa7\xde\x12\x2b\xad\x57\xbc\x20\xe2\xe0\x1e\xc3\xd6\x49\ -\x4b\xa1\x4f\xd6\xfe\x62\x04\x71\x01\x52\x78\x0d\xe5\xa4\xd6\xc2\ -\x68\xd5\x72\x60\xcf\x60\x55\x5b\xf6\x13\x29\x52\x39\xd1\x59\xd1\ -\x63\x99\xed\xe9\x0f\xeb\xc4\xb0\x89\xdf\x96\x41\x8a\xff\x21\x16\ -\xa0\x1d\x5b\x0c\xbb\xb7\xb3\x12\xdb\x27\x19\x53\x37\xdb\x10\x69\ -\xb1\xee\x17\xd8\x5a\xd8\xb3\x63\x63\x8c\xfd\x5a\x3f\x36\xf9\x11\ -\xe8\xa2\xf7\xb6\xae\xa7\x9f\xc1\xc4\x31\x6d\xe2\xd2\x38\x88\xe3\ -\x28\x5d\x27\xb6\x20\x69\x08\x54\xab\x2d\xae\x69\x10\x89\xe3\xc4\ -\xee\xff\x46\x19\xfb\xb5\x3e\x52\x31\x3b\x19\x57\x00\xb1\x5b\xa9\ -\x6d\xc2\xbb\x44\xdd\x6d\xb3\x9c\xf5\xd1\x1d\x45\xb6\x1e\x36\xe2\ -\xd8\xaf\xf5\x61\xd3\x31\x3b\x3d\xbe\x68\x4f\x15\x80\x8e\xfb\xdb\ -\x13\x3f\x93\x3b\xa9\x6a\xac\x61\x60\xa5\x0a\x70\x9d\xcf\xc8\xda\ -\x8d\x35\xf6\x6b\xbd\x58\x9b\xc2\x34\x27\x8b\xa1\xc7\x51\x58\x6f\ -\x15\x40\xec\x56\xb6\x6d\xc2\xa1\xa2\x36\xd7\xd7\xd8\xb2\x11\x31\ -\x40\xa3\xb5\xfe\x23\xc9\x8b\x85\xd8\xfd\xdf\x48\x63\xbf\xd6\xc3\ -\xf5\x54\x60\xde\xe8\x05\x3b\x72\xd5\xd3\xb6\xd7\x9e\x2a\x00\xab\ -\xc1\x5a\x7c\x92\x34\x16\x16\x42\x23\xd2\x72\xc8\x06\x0e\x63\xa0\ -\xd9\x5a\xe7\xf7\x5a\xd8\x3a\x69\xb9\x69\x03\x8e\xfd\xba\x1a\xc6\ -\xa6\xe2\x79\x46\x58\x7a\x3a\x86\xa4\xb7\x0a\x20\x2e\x55\x6b\x58\ -\xd3\x5b\x2d\x75\x35\x42\x33\xd8\xc3\x35\x93\xa4\x3b\x87\x60\x3d\ -\xb7\x4b\x00\x07\xf7\x9a\x0d\x39\xf6\xeb\x6a\xe8\x84\xdf\x39\x6b\ -\xc1\x1a\x42\x0b\x3d\x1d\x49\xdc\x5b\x05\x10\xff\xc7\x4f\x34\x04\ -\x10\xb1\x02\xd0\x66\xf0\x0f\xd9\xec\x37\xdd\x2e\xc4\xb6\x7f\xf5\ -\xef\x8d\xc7\x7e\xd9\x95\xb1\x5f\x39\x17\xe2\x6b\x99\xf8\x3b\x67\ -\x2d\x3e\x64\xd8\x03\xe8\xc4\x29\x4b\xc6\xf4\xae\x5f\x79\x3d\x04\ -\x5a\x10\xe5\x26\x6a\x5d\x84\xa1\xa0\x1d\x5c\xfd\xb5\x8d\xc7\x7e\ -\x59\xb6\x4e\x6e\xbc\xb1\x5f\xeb\xc1\xd7\x22\xb1\x4e\x40\x88\xbd\ -\x6b\x6b\x68\x60\x59\x67\x00\xb7\x3e\xfa\x51\xcb\xd0\xb0\x86\x20\ -\xc9\xa4\x5c\x64\x04\x51\x52\x5d\x59\x03\x4e\x10\xc5\x9d\x88\x57\ -\xbb\x5b\xdd\xb1\x5f\xa5\xbe\x9c\x4a\x3f\xf8\xb4\xb4\xc4\x24\x98\ -\x03\xb0\xb1\x71\x6d\xda\x1e\x1b\xd7\x9e\x2b\x00\x6b\xa9\x5b\x43\ -\x33\xa9\xa0\x51\x00\xa1\x91\xb4\xa2\x01\x6c\x08\x48\x18\x41\xdc\ -\x82\x7c\xb5\x51\x64\xd6\xc2\x58\x2d\x1e\xfb\x95\x3b\x56\x97\x62\ -\x81\x46\x28\x13\xbd\x37\xd6\x80\xd5\x9c\xb3\x36\xa3\x0a\xe0\xc8\ -\xdd\x6f\x8e\x17\x6a\xa9\x9b\x88\x66\xa2\x1e\x80\x85\x76\xae\x00\ -\xd6\x85\x1f\x5e\xda\x86\x7c\x31\xd6\xc2\xcc\xce\x8d\x3d\xf6\xeb\ -\x4a\x18\x0b\xf5\x40\x25\xba\xf5\xdc\x09\x01\xce\x45\x41\x96\x73\ -\x00\x00\x86\x86\xb5\x2c\xda\x04\x03\x47\x6d\x04\x8d\x5c\x01\xac\ -\x8b\xb6\x2f\x88\xf4\x95\x1b\x59\x3c\x17\x9e\xd1\x19\xfb\x95\x73\ -\x29\xa1\x91\x34\x42\x99\x68\xd7\x8b\x89\xc0\x5a\x4e\x9d\xf8\xbe\ -\x0c\xd7\x01\x00\x58\xf0\x8d\x66\x3e\xc9\x23\xaf\x62\x97\x4c\xe5\ -\xd6\x6a\x1d\xb4\xda\x57\x3e\x90\xd4\x5a\x98\x9e\xb0\xec\xc9\xc7\ -\x7e\xad\x89\x20\x4e\x00\x36\x13\x36\x38\x5a\xa3\x8d\xe1\xe4\x81\ -\xf7\xf7\xf6\xe7\xf6\xfc\x53\x98\x88\xb6\x35\x9c\xb2\x49\x56\x02\ -\x58\x58\x0a\x64\x5e\x12\xbc\x0e\x9a\xed\xab\x9f\x07\x90\x8f\xfd\ -\xba\x32\xcd\x50\xe2\x6b\x99\xe8\x16\xa0\x89\xf0\xad\xe1\xc9\x5e\ -\x9e\x0a\x04\x7d\x50\x00\xdb\x6f\x27\x34\x9a\x13\xbd\x5e\xe8\x15\ -\x11\xb1\x07\x10\xe8\xbc\x16\xe0\x4a\x58\x62\x0f\xe0\x72\x05\x2c\ -\x16\x28\x15\xcf\x8f\xfd\xca\x59\x9b\xe5\x50\x25\x37\x0b\x90\xd8\ -\x2b\xd3\x21\x4d\x2c\xa7\x7a\xfd\xb3\x7b\xfa\x9c\x8f\xdc\xfd\x66\ -\xe6\x9e\x00\x6b\x38\x61\xa2\x64\xab\x01\x1b\xa1\xa4\x19\xe6\xaf\ -\xed\x95\xb0\xc4\x1e\xc0\xe5\x92\x57\xd6\xc0\x8e\xcd\x86\x1d\x5b\ -\xf2\xec\xff\xe5\xb0\xc0\x42\x5b\x25\x5e\x03\x60\x22\xe6\xac\xc9\ -\xb8\x02\x80\x78\x26\x80\xb5\x9c\xd0\x11\xed\x64\x6e\x4f\x67\x7b\ -\x4b\x0b\x16\x83\x44\x87\x11\x0f\x1c\xc6\xc4\xc3\x40\x2e\xf7\xee\ -\x4a\x09\xb7\xee\x35\x94\x0b\x79\x7b\xf5\xe5\x88\x8c\xe0\x9c\xef\ -\x24\x7a\x83\x8c\x06\xa3\x39\x6b\x2d\xe7\xe0\xfc\x8e\x5b\x2f\xe8\ -\xbd\xc9\x8c\xdb\xa4\x4e\x99\x88\x46\x92\x3b\x01\x91\x15\xcc\xb5\ -\x9d\xfc\xc5\xbd\x02\xda\xc4\xc3\x40\xd6\xc2\xda\x78\x3e\x61\x77\ -\xec\x57\xce\xa5\x08\xa0\x19\x49\xce\xf9\x2a\xf1\x1d\x00\xa3\x39\ -\x6a\x74\xef\x0e\x04\xe9\xd2\x17\x9f\xd9\x1a\x4e\xe9\x90\x53\x49\ -\x2a\x00\x80\xb3\x2d\x07\x5f\xe7\xaf\xef\x5a\x08\xba\x8d\x40\x6b\ -\xff\x7d\x7c\xe4\x57\x3e\xf6\xeb\x6a\x2c\x07\x8a\x56\x94\x6c\x02\ -\x50\x87\x60\x34\x4f\x7c\xe3\x1b\x7a\x5f\x62\xdf\x1f\x05\x60\x39\ -\x67\x34\x27\x13\x4d\x04\x02\x8b\xbe\x43\x23\x54\xb9\x05\xbb\x0c\ -\x61\xe7\x3c\x80\xb5\x70\x1c\xb8\xed\xe6\x7c\xec\xd7\xd5\x38\xdb\ -\x72\x12\x4d\x00\x02\xe8\x80\xd0\x1a\x1e\xfa\xc8\x7b\x7b\xeb\xfe\ -\x43\x9f\x14\x80\x89\x68\x98\x88\x23\xba\xa7\x35\x4b\x57\x46\x00\ -\xad\x48\x30\xd7\xca\xdf\xe0\xcb\x11\x84\xac\x79\x1c\x99\xb5\xf1\ -\x79\x83\xf9\xd8\xaf\x2b\x13\x59\xc1\x7c\xdb\x49\xbc\x02\x30\x0a\ -\x58\xb2\x86\xc7\xfa\xe1\x51\xf7\x45\x01\x94\x46\x89\x8c\xe6\xe1\ -\x28\x48\x76\x27\x20\xb2\x82\xd3\x2d\x37\x9f\x0d\x70\x19\xba\x0a\ -\xe0\x62\x2c\xb0\xef\x26\xc3\xc4\x48\xbe\xf7\x7f\x39\x04\xf1\xfe\ -\xff\xd9\xb6\x93\x6c\xfc\xaf\x41\x87\x3c\x65\x0d\xc7\xfa\xf1\xf3\ -\x7b\xae\x00\x8e\xdc\xfd\x66\xa2\x10\xac\xe5\xb0\x0e\xa8\x27\x3d\ -\xaa\xeb\x74\xd3\xa1\x99\x70\x8c\x36\x08\x08\xc0\x0f\xc5\x9a\x07\ -\x82\x14\xbd\xd8\xfd\xcf\xc7\x7e\x5d\x99\xf9\xb6\x43\x23\x4c\x3e\ -\xfe\xd7\x11\x8f\x59\xcb\x5c\x3f\x7e\x7e\x7f\x36\xce\xe3\xe9\x25\ -\xc7\x22\x9f\xa7\x4d\x82\x79\x00\x01\x2c\x05\x8a\xf9\x76\x1e\x06\ -\xac\x85\x1f\xc4\xe7\x01\xac\x7e\x83\x57\xc6\x7e\x6d\xcd\xad\xff\ -\x95\x30\xc0\xc9\x86\x9b\x7c\xfc\x1f\x27\x00\x0f\x1f\x7d\x0f\xcd\ -\x7e\xfc\xfc\xbe\x55\xce\x58\xc3\x09\x1d\xf1\x50\x92\x79\x00\x80\ -\xc0\x08\x9e\x6a\x78\xf9\xcb\xbc\x06\xad\x36\x71\x23\xd0\xaa\x3f\ -\xcb\xc7\x7e\xad\x0f\x3f\x92\x9c\x4e\x21\xbf\x14\xb6\x09\x8c\xe6\ -\xf0\xcd\x6f\xe8\xcf\xcf\xef\x9b\x02\xf0\xeb\x34\x75\xc4\xe7\x43\ -\x3f\xf9\xf7\xea\xe9\x86\x4b\x33\x61\x57\x6d\x10\x68\xb4\x2e\xec\ -\x03\x38\x3f\xf6\x4b\xe7\xf7\xea\x0a\x08\x60\xae\xed\x70\xce\x77\ -\x92\xad\xff\xd7\x10\x05\xcc\x61\x79\xd0\xda\xde\xef\x00\x40\x1f\ -\x15\x40\x79\x1c\x6b\x0d\x9f\x8b\xda\xc9\xce\x06\x10\xc0\x39\x5f\ -\x71\x26\xdf\x0d\xb8\x80\x95\x3e\x80\x8b\x14\xc0\xae\xad\x96\x6d\ -\x53\xf9\xde\xff\x95\x30\xc0\x93\x75\x8f\x20\xe1\x1a\x13\x1d\x82\ -\x0e\x78\xd4\x5a\x8e\xf6\xeb\x1a\x7d\x51\x00\x2b\xc3\x41\x0c\x87\ -\x43\x9f\xe3\x49\xe6\x01\x20\x0e\x03\x9e\xac\x7b\x89\xd6\x6b\x0f\ -\x02\x2d\xff\xc2\x3e\x00\xa5\xe2\xe4\x5f\xd1\x4d\x7b\x65\xd9\x45\ -\x10\x0f\xff\x38\xbe\x9c\x7c\x58\x19\xf9\xa0\x23\xee\xd7\x21\x0b\ -\xfd\xba\x46\x7f\xbb\x67\x2c\x27\x75\xc8\x03\xd1\x3a\xa6\xd0\xf6\ -\x9a\x93\x0d\x8f\xe5\x20\x2f\x0a\xea\x62\xec\x85\x7d\x00\xd6\xc2\ -\xf8\x88\xe5\xc0\x4d\xf9\xde\xff\xd5\x78\xba\xe9\xb2\x1c\x24\x1f\ -\x52\x86\x6d\x7c\xa3\xf9\xac\x5b\xea\x9f\x83\xd6\x57\x05\xe0\x16\ -\x69\x9a\x88\x4f\x84\xed\x64\xeb\x01\xba\xbb\x01\x27\x1a\xf9\x44\ -\xcb\x2e\xda\x40\xb3\x25\x56\x34\x40\x77\xec\xd7\xa6\x7c\xec\xd7\ -\x15\x09\x8c\xe0\xe8\x52\x81\x28\xe1\x59\x13\x46\x43\xe4\x73\xd6\ -\x1a\xbe\x4c\x9f\xe2\x7f\xe8\xb3\x02\xd0\x11\x58\xc3\xbd\x41\x8b\ -\x39\x93\xa8\x0a\x00\x6d\xe1\x89\x25\x2f\xef\x0d\xe8\x10\xe9\x4e\ -\x1f\x40\xe7\x76\x78\x6e\xec\xfe\xe7\x63\xbf\x2e\x8f\x00\x4e\x37\ -\x5d\x9e\x6e\x24\x9b\xfc\x83\xd8\xfd\x8f\x02\x1e\xa0\x8f\xf1\x3f\ -\xf4\x3b\x04\x20\xce\x03\x44\x01\x0f\xe8\x44\x4f\x0a\xe8\x3c\xbc\ -\x96\xcb\xa9\xa6\xbb\xe1\xc3\x00\x01\x68\x7d\xfe\x3c\x80\xee\xd8\ -\xaf\xbd\xf9\xd8\xaf\x2b\xa2\x2d\x3c\xb6\x58\xa0\xad\x93\xd7\x92\ -\x41\x0b\x74\xc8\xa7\x1e\xff\x45\x16\xfb\x79\x9d\xbe\x7d\xb2\xae\ -\xcb\x12\xfa\x2c\x98\x90\x7f\x0d\x7a\x7a\x9c\xc1\xfa\xf0\x75\x3a\ -\xee\x5b\x16\x89\xf4\x85\xe7\x01\x1c\xc8\xc7\x7e\x5d\x11\x01\x2c\ -\xf8\x0e\x27\xea\xc9\x67\x48\xad\x81\xb0\xc5\xbc\x35\xfc\xe3\xcc\ -\x2f\xf6\xf7\x5a\x7d\x57\x6d\x85\x0a\xd6\x68\xfe\x31\x68\x25\x3b\ -\x29\xb8\xcb\x93\x75\x8f\xf9\x76\x9e\x0c\xf4\x83\xf8\x4c\x80\xee\ -\xd8\xaf\xdb\xf2\xb1\x5f\x57\xc4\x10\x5b\xff\x7a\x0a\xdd\xa5\x51\ -\x00\x91\xcf\x57\xac\xe5\x30\xf4\x2f\xfe\x87\x04\x14\x00\x80\xb5\ -\x7c\x21\x6c\xf3\x60\x94\x42\x18\xd0\x08\x25\x47\x16\x8b\x1b\x7a\ -\x4b\x50\x10\xc7\xff\x41\x3c\x5a\x3a\x1e\xfb\xb5\x39\xcf\xfe\x5f\ -\x0e\x01\x2c\xb4\x1d\x1e\x5f\x2c\xa4\x72\x8f\xc2\xd8\xfd\xff\x44\ -\x14\x70\xa6\xdf\xd7\xea\xab\x02\xe8\x6a\x2e\x1d\x72\xda\x84\xfc\ -\x73\xd0\x97\x6a\xe6\x2b\x63\x81\xa3\x8b\x1e\xf3\xed\xe4\x13\x39\ -\x59\xc2\x0f\x04\x51\x24\x90\x32\xb6\xfe\xe5\x62\x3e\xf6\xeb\x72\ -\x58\xe0\xf1\xa5\x02\x4b\x29\x6c\x23\x1b\x03\x7e\x83\x65\x63\xf8\ -\xb8\xd7\xc7\xed\xbf\x2e\x89\x78\x00\x6e\x11\x63\x34\x1f\xf1\x1b\ -\xc9\xef\x06\x08\xa0\x1e\x2a\x1e\x5e\x28\x6e\xe8\x5c\x40\x10\xc4\ -\x79\x80\xd1\x8a\xe5\xc0\xee\xbc\xee\xef\x72\x08\xe2\xae\xbf\x23\ -\xe7\xd2\xb1\xfe\x51\x1b\xc2\x36\xf7\x5b\xc3\xbf\x42\x7f\xdd\x7f\ -\x48\x40\x01\xac\x3a\x32\xec\xf3\x91\xcf\x97\xa3\xc4\x46\x85\x9e\ -\xc7\x02\xc7\x96\x0a\x9c\x69\x6e\x5c\x2f\xa0\x1d\x08\xb4\x86\x3d\ -\x3b\x2c\x9b\x37\xe5\xc9\xbf\xcb\xa1\x2d\x3c\xbc\x50\x4c\xc5\xfa\ -\x03\xf8\x0d\xd0\x21\x7f\xff\xf8\xcf\xf4\xdf\xfd\x87\x84\x3c\x00\ -\x80\x93\x0f\x70\x56\x87\xfc\x8d\xdf\x48\xb6\x28\x08\x3a\xb9\x80\ -\x48\xf2\xc0\x7c\x69\x43\xd6\x05\x58\xe2\x61\x20\xdd\x13\x7f\xf3\ -\xb1\x5f\x6b\x23\x80\x33\x2d\x97\xa3\x4b\xe9\x58\x7f\x13\x41\xd0\ -\xe4\xa4\x35\xfc\xdd\xcc\x5b\xfb\x6f\xfd\x21\x21\x05\x70\xe4\xee\ -\x37\xb3\xfd\x0e\xb0\x86\xbf\xf7\x9b\x3c\x95\x74\x8b\x30\xc4\x0f\ -\xf7\xc9\x65\x8f\x27\x96\x0b\x1b\xd2\x0b\x10\x02\x26\xc7\xf3\xb1\ -\x5f\x57\x22\x34\x82\x87\xe6\x8b\xd4\x53\xea\x24\xf5\x1b\x10\xb6\ -\xf9\x14\xf0\x40\x52\xd7\x4c\x74\x27\xc8\x5a\x0e\x47\x3e\xff\x90\ -\x46\x32\x10\xe2\xb2\xce\x07\xe6\x4a\x2c\x6f\xc0\x56\xe1\xa2\x67\ -\xb9\x65\x8f\x61\x7c\x34\x77\xff\xd7\x42\x00\x4f\x2c\x7b\x1c\x5d\ -\x4a\xc7\x40\x58\x03\x7e\x9d\x86\xd1\x1c\x12\xb2\xf7\xe3\xbf\x2f\ -\x47\xa2\x0a\x40\x2a\xda\x46\xf3\xa1\xf6\x32\xf5\x34\x6a\x02\x04\ -\x70\xb6\xed\xf0\xd0\x7c\x69\xc3\x6d\x0b\x4e\x8e\x5b\x9e\x75\x50\ -\xe7\x63\xbf\xd6\xa0\x1b\x22\x3e\x38\x5f\x22\x48\x78\xe2\x4f\x97\ -\xb0\x0d\x41\x8b\x07\xb0\xfc\x33\x24\xe3\xfe\x43\x82\x0a\x60\x55\ -\x8b\xf0\x3f\x85\x6d\xbe\x10\xa6\x90\x0c\x84\xb8\x2b\xee\xe1\x85\ -\x22\x27\x1b\xde\x86\xf1\x02\x2c\x71\xe9\xef\xf6\xe9\xdc\xfa\xaf\ -\x85\xb1\xf0\xd0\x7c\x29\xbd\xb2\x71\x0b\xed\x3a\x46\x87\x7c\xf0\ -\x35\xdf\xc6\x53\x49\x5e\x3a\xf1\x62\xb0\x27\x3f\xcf\x69\x1d\xf2\ -\xc1\xf6\x32\x51\x1a\x6f\x63\xf7\x74\x97\x2f\x9c\x29\xd3\xd8\x40\ -\xc3\x43\x0b\x5e\x3c\xfb\x3f\xe7\x42\x04\x70\xaa\xe9\xf2\xd0\x42\ -\x7a\xc5\x62\xa1\x0f\xfe\x32\x47\xac\xe1\x83\xef\xbd\x27\xd9\x6b\ -\x27\xae\x00\x76\xdd\x09\xd6\xf0\x21\xbf\xc1\x63\x61\x0a\x73\x02\ -\x20\x7e\xe8\x27\x9b\x2e\x0f\xcf\x17\xf3\x11\xe2\x1b\x98\xb8\x46\ -\x44\xf2\xf9\x33\xe5\xc4\xa7\xfd\xae\xc6\x6f\x40\x14\xf0\x57\xd6\ -\xf4\xbf\xf4\xf7\x62\x12\x55\x00\xab\x6a\x02\x1e\x8d\x7c\x3e\xe0\ -\xd7\xd3\xf3\x48\x8d\x85\xc3\xf3\x25\x9e\xa8\x6f\x9c\x50\x20\xe7\ -\x42\x74\xe7\x1d\x38\x91\xe2\x3b\xa0\x03\x68\x2f\xf3\xb4\x35\x7c\ -\x40\x3a\xc9\x6f\x91\x27\xee\x01\x1c\xb9\xfb\xcd\x48\x45\x64\x0d\ -\xef\x6f\x2f\xf3\x54\xd2\xfd\x01\x5d\x56\x87\x02\x8b\xf9\xe4\xa0\ -\x0d\xc9\xd1\xa5\x42\xec\x05\xa6\xb8\x86\x76\x1d\xa2\x36\xff\x1b\ -\xf8\x1c\x24\x6b\xfd\x21\x05\x05\xb0\x82\xe5\xfe\xc8\xe7\xaf\xdb\ -\xcb\xa9\xad\x60\x65\xe0\xc3\x17\xce\x94\x53\xcb\xfe\xe6\x24\x8f\ -\x20\x3e\xe3\xef\xbe\xd3\x15\x5a\x3a\x3d\xd7\x5f\x87\xd0\x5a\xe2\ -\x94\xd1\xfc\x89\x90\xa4\x92\x16\x4f\x4d\x01\x08\x85\x6f\x0c\xef\ -\x6e\x2f\x71\x22\x2d\x2f\xa0\xcb\x91\xc5\x02\x0f\xcd\x17\x13\x3d\ -\xf3\x2d\x27\x1d\xba\x71\xff\xe7\x4e\x57\x58\xf0\xd3\xf5\xfc\xda\ -\xcb\x10\xb5\xf9\x08\xf0\x69\x48\xde\xfa\x43\x4a\x0a\x60\xe5\x83\ -\x5a\x3e\x13\xfa\x7c\xa0\xbd\x94\xc6\x2a\xce\x13\x1a\xc1\x17\xcf\ -\x96\x79\x32\xcf\x07\x0c\x35\x82\xb8\x18\xec\xfe\x33\x15\x9e\x5c\ -\x4e\xf7\x59\x47\x01\xb4\x16\x39\x65\x0c\xef\x12\x92\x14\xc6\xe5\ -\xc4\xa4\x3a\x13\x42\x48\x7c\xab\x79\x57\x6b\x89\xc7\xd3\xaa\x0b\ -\x80\xf3\xf9\x80\xcf\x9e\xaa\x70\xa6\xb5\x71\x1b\x86\x86\x1d\x6d\ -\x05\x87\xe7\x4a\x3c\xba\x90\x4e\xad\xff\x6a\xda\xcb\x10\xfa\x7c\ -\x20\xe9\xc2\x9f\x8b\x49\x4d\x01\xac\xfa\xc0\xf7\x45\x3e\xf7\xb4\ -\x16\x49\xd5\x05\xef\x9e\xfe\xf2\xd9\x53\x95\xd4\x3a\xc1\x72\xfa\ -\xcb\xa3\xe7\x0a\x7c\xe1\x6c\x39\xf5\xb6\xf0\xc8\x87\xf6\x22\x27\ -\xac\xe6\x9d\x42\x92\xd2\x66\x78\x4c\xea\x53\xa1\x84\x24\xb2\x86\ -\x77\xb4\x97\xf9\x42\x98\x52\x8f\xc0\xca\x5a\x80\x13\x75\x8f\xcf\ -\x9e\xaa\xe4\x27\x0c\x0f\x19\xc7\x96\x3c\xee\x3b\x5d\xc1\xd7\x22\ -\xd5\xe7\x6a\x2d\x34\x17\xb1\xa1\xcf\x21\xe0\x5e\x48\xcf\xfa\x43\ -\xca\x0a\x60\x55\x79\xf0\x43\x3a\xe4\x1d\x8d\x05\xfc\xa4\x07\x86\ -\xac\xc5\xe3\x4b\x05\xee\xcd\x95\xc0\x50\xd0\x55\xea\xff\xfa\x74\ -\x35\xb5\x2e\xbf\xd5\x84\x2d\x68\x2f\xf1\xa0\x35\xfc\xa1\x90\xa4\ -\xd0\x17\x7b\x21\xa9\x7b\x00\x47\xee\x7e\x33\xd2\xc1\x5a\xc3\xbb\ -\xfd\x06\x1f\xf7\x13\xeb\x83\xba\x3c\xd6\xc2\x23\x0b\x45\x3e\x77\ -\xba\x42\x3b\x65\x8b\x91\x73\x63\x3c\xd5\x70\xf9\xf4\xd3\xd9\x08\ -\xeb\xac\x81\xe6\x39\xb4\x0e\xf9\x93\x28\xe0\x41\x48\xd7\xfa\x43\ -\x06\x14\x40\x17\x21\x39\x63\x34\x6f\x6f\x2c\x30\x97\xf6\xb6\x20\ -\xc4\x0d\x34\x8f\x2c\x14\xf9\xec\xa9\x2a\xad\xdc\x13\x18\x38\xba\ -\x35\x1e\x9f\x3a\x59\x65\x2e\x23\xf3\x20\xdb\xcb\xd0\xae\xf3\xcf\ -\xd6\xf2\x6e\xb7\x88\x4d\x5b\xf8\x21\x23\x0a\x60\xd5\xb6\xe0\xdf\ -\x86\x6d\xfe\xa2\x79\x0e\x9b\x85\x3d\x79\x63\xe1\xe1\xf9\x62\x9e\ -\x13\x18\x30\xba\xbd\x1e\x9f\xcc\x90\xf0\xeb\x10\x9a\xe7\x58\x34\ -\x11\x6f\x13\x82\xe3\x69\xaf\xa7\x4b\x26\x14\x40\x17\x21\x69\x5b\ -\xc3\xff\x68\x2d\xf2\x85\xa0\x91\xf6\x6a\x62\x2c\xf0\xc8\xb9\x22\ -\x9f\x3a\x59\xcd\x0f\x1b\x1d\x10\x4e\x36\x5c\x3e\xf9\x54\x35\x3b\ -\x5b\xba\x16\x9a\xe7\x20\x68\xf1\x3e\xe0\xef\x20\x7d\xd7\xbf\x4b\ -\x66\x14\x40\xf7\x86\x08\xc1\x61\x1d\xf2\xb6\xc6\x3c\x4d\x9d\xf0\ -\xb1\xe2\x97\xc3\x76\x8e\x88\xfa\xe4\xc9\x6a\xea\xd5\x63\x39\x57\ -\xe6\x89\x65\x8f\x4f\x3c\x55\xcb\x8c\xe5\x07\xf0\x9b\xd0\x5a\xe4\ -\xb0\x35\xfc\xb6\x10\x64\xc4\xb4\xc5\xa8\xb4\x17\xb0\x9a\x85\x7b\ -\x3e\xc2\xc4\x6b\xef\x02\x78\xcc\x44\xec\x16\x82\x67\x16\xca\x90\ -\x95\x27\xb9\x18\x28\xce\xb6\x1d\xc6\x0a\x9a\x9a\x9b\x8f\xd6\xce\ -\x0a\x82\x38\x5c\x7b\xf4\x5c\x91\xcf\x3c\x5d\xcd\x54\x73\x97\x89\ -\x60\xf9\x0c\xad\xa0\xc5\x2f\x0b\xf8\x1b\x44\x76\xac\x3f\x64\x4c\ -\x01\x40\x47\x09\xdc\x7d\x97\x6f\x2d\x47\x4d\xc8\x8b\x55\x81\x29\ -\x27\x43\xa7\x7c\xd7\x43\xc5\xe9\xa6\x4b\xc9\x35\x8c\x7a\x1a\x99\ -\x95\x37\x6d\x83\x22\x80\xb6\x16\x3c\x30\x57\xe6\xbe\xd3\x19\xcb\ -\xd5\x58\xa8\xcf\x43\x7b\x91\xf7\x59\xcb\xaf\x0b\x41\x2b\x4b\xc2\ -\x0f\x19\x0a\x01\x2e\xa6\x32\xc6\xfd\x51\xc8\x7f\x6b\xcc\xb3\x9c\ -\xc6\x14\xe1\xcb\x11\x1f\x1a\xa9\xf8\xe4\x53\x55\x0e\xcf\x97\x08\ -\x4d\xbe\x4d\x98\x16\x82\xd8\x2b\xfb\xe4\xc9\x1a\xf7\x65\x70\xcb\ -\xb6\xdd\x80\xd6\x39\xbe\x6c\x34\xbf\x2a\x60\x3e\xed\xf5\xac\x45\ -\xe6\x3c\x00\x88\xbd\x80\xda\xab\xee\x02\x38\x62\x42\x76\x60\x79\ -\x96\x57\x46\x88\x8c\x3c\x5d\x41\xdc\x40\x74\xaa\xe9\xd2\x8c\x14\ -\x13\x05\x4d\x41\x65\x60\xdb\x62\x83\x20\x88\xf3\x32\xc7\xeb\x1e\ -\x9f\x7e\xba\xca\xf1\x65\x0f\x4b\x66\x22\x45\x20\x2e\xf7\x5d\x3e\ -\xcd\x52\xe4\xf3\xf3\x26\xe0\x6f\xa5\x9b\x2d\xd7\xbf\x4b\x26\x15\ -\x00\xc0\xc4\x6b\xef\x42\x08\x02\x6b\x79\x50\x87\x3c\x57\x39\xec\ -\x74\x8b\x69\xaf\xea\x3c\x71\xdc\x29\x38\xdb\x72\x98\x6f\x3b\xd4\ -\x3c\x4d\xc5\x35\x64\x45\x49\x0d\x2b\xb1\xcb\x2f\x79\x60\xae\xc4\ -\xbd\xa7\x2a\x2c\xf8\xd9\x49\xf6\x75\xb1\x06\x96\xcf\x12\xf9\x75\ -\x7e\x0f\x78\x9b\x74\x89\xb2\x28\xfc\x90\x61\x05\xb0\x92\x10\xb4\ -\xcc\x5b\xcb\xd3\x3a\xe4\xa5\x5e\x91\x9a\x4a\xfe\xb8\xf6\xab\xb2\ -\x14\x2a\x9e\x6a\x78\x48\x01\xe3\x45\x8d\x93\xb5\x37\x72\x08\xe8\ -\xde\xd2\xb3\x2d\x87\x7b\x4f\x55\x78\x70\xbe\x88\x6f\x32\x14\xef\ -\x77\xb1\xd0\x58\x80\xe6\x02\x1f\xb7\x86\x9f\x11\x82\xb9\xac\x0a\ -\x3f\x64\x38\x07\x00\xb1\xcb\x24\xe2\x15\xfe\x5d\xe4\xf3\xbb\xcb\ -\x67\xf1\xb3\x94\x0f\xe8\xd2\x1d\x32\xf1\xd9\x53\x15\xfe\xf9\x44\ -\x8d\xd3\x2d\x67\xe5\xcf\x73\x6e\x9c\x6e\xa2\xef\xf0\x7c\x89\x8f\ -\x1d\x1f\xe1\xb1\xc5\x02\xc6\x66\x2b\xde\xef\xd2\xae\x43\x63\x9e\ -\xc3\x46\xf3\x5f\x20\x3b\x05\x3f\x97\x23\xb3\x1e\x40\x97\x4e\x28\ -\x60\xad\xe5\xb0\x0e\xd9\x02\x3c\x33\x4b\xf9\x80\x2e\xdd\x90\x60\ -\xde\x77\x38\xd9\x88\x63\xd2\xaa\x67\xf0\x64\x9e\x1b\xb8\x5e\xba\ -\xb1\xfe\xe9\x96\xcb\xbd\xa7\x2a\x1c\x9e\x2b\xa5\x3a\xc2\xeb\x6a\ -\x84\x6d\x58\x3e\xcd\x42\xe4\xf3\x33\x02\x3e\x2c\x32\xb6\xe5\xb7\ -\x16\x59\xbd\x97\x97\x30\x73\x68\x16\x6b\xd9\xa7\x1c\xde\x51\x9d\ -\xe4\x85\x95\xf1\xec\xae\xde\x02\x4a\xc0\x74\x39\xe4\xf6\x4d\x2d\ -\x76\x54\x03\x5c\x99\x1f\xca\x71\xad\xd4\x43\xc5\x23\x0b\x45\x1e\ -\x59\x88\xcf\xeb\xcb\x32\x3a\x84\xc5\x93\xb4\xfc\x3a\xff\x15\x98\ -\x45\xe0\x67\x5d\xf8\x61\x00\x3c\x80\x2e\x9d\x02\xa1\x79\x6b\x38\ -\xa2\x03\x5e\xa4\x3c\x36\x39\x85\xb4\x57\xb5\x36\x82\x58\x09\x2c\ -\x87\x8a\x13\x75\x8f\xc5\x40\x51\x54\x96\x92\x6b\xf3\xa3\xb9\xae\ -\x82\x00\x02\x2d\x78\x6c\xa9\xc8\x67\x9e\xae\xf0\xd8\x52\x31\xf5\ -\x1e\xfe\xab\x61\x34\xd4\xcf\x60\xda\x75\xde\x6d\x2d\xbf\x24\x04\ -\x8d\x41\x10\x7e\x18\x20\x05\xd0\x29\x10\x42\x08\x8e\x1b\xcd\xbc\ -\x0e\x78\xb1\x53\xa4\x92\xc5\xa4\x60\x17\x41\x3c\x86\x6a\xae\xed\ -\xf0\x64\xdd\xa3\x11\x4a\x4a\x8e\xa1\xe8\x98\xbc\x80\xe8\x22\x04\ -\x10\x6a\xc1\x93\x0d\x8f\x7b\x4f\x55\x79\x70\xbe\xc4\x52\xa8\x56\ -\xfe\x2e\xab\x58\x0b\x8d\x39\x68\x2e\xf0\xd7\xd6\xf0\x93\x02\x4e\ -\x23\xe2\xf7\x75\x10\x18\x18\x05\x00\x2b\x3b\x03\x16\x78\xd0\x44\ -\x58\x13\xf1\x22\xb7\x88\x2b\x33\x7e\xe4\x55\xb7\x6e\xe0\x6c\xcb\ -\xe5\x78\xbd\xc0\x72\xa0\x28\x38\x86\xd2\x06\x57\x04\x62\xd5\xbd\ -\x39\x51\xf7\xf8\xdc\xe9\x0a\x5f\x9a\x2b\x33\xd7\x76\x32\x9b\xe4\ -\xbb\x80\x4e\x93\x4f\x63\x8e\xcf\x19\xcd\x8f\x0a\x78\x34\x6b\xa5\ -\xbe\x57\x63\xa0\x14\x00\xac\x24\x05\x8d\x85\x2f\xea\x90\x92\x89\ -\xf8\x2a\xaf\x84\x23\x33\xfe\x49\xba\x2f\x73\xd0\x51\x04\x4f\xd6\ -\x0b\x2c\x05\x0e\x4a\x40\xc9\x31\x38\x22\xdb\x96\xae\x1f\xf7\xa2\ -\x19\x49\x9e\x58\xf6\xb8\xff\x4c\x2c\xf8\x67\x07\x45\xf0\x3b\xb4\ -\x96\x61\xf9\x0c\x87\x75\xc4\x9b\x74\xc0\x67\xa4\x33\x58\xc2\x0f\ -\x03\xfc\xce\x75\x92\x82\x13\x42\xf2\x1b\xa5\x11\xbe\xab\x36\x8d\ -\x52\x19\xf7\x04\x56\xd3\x4d\x08\x16\x95\x65\x6b\x25\x60\xcf\xa8\ -\xcf\xd6\x72\x48\xd9\x35\x2b\x39\x84\x61\xa2\xfb\xa2\x45\x56\x70\ -\xce\x57\x1c\x5f\xf6\x78\x62\xd9\x63\xae\xe5\x10\x0d\x90\xd0\x77\ -\x69\x2f\xc3\xf2\x69\x9e\x0c\x7d\xfe\x13\xf0\xfe\x41\xc8\xf8\xaf\ -\xc5\x00\x89\xcc\xa5\x88\x38\x29\xf8\x96\xd6\x22\x8e\x10\x7c\x47\ -\x6d\x1a\x95\x75\x4f\x60\xd5\xda\x01\xf0\xb5\xe0\xf1\xa5\x02\xc7\ -\xeb\x1e\xe3\x05\xcd\x8e\x6a\xc0\xae\x5a\xc0\x44\x31\xc2\xed\x6c\ -\x21\x0e\xaa\x32\xe8\x7e\x46\x6d\xa1\x19\x29\x4e\x35\x1d\x9e\x58\ -\x2a\x70\xaa\xe9\x50\x0f\xd5\x4a\xf9\xee\xa0\x09\xbf\xdf\x80\xe5\ -\xd3\x3c\x1d\xfa\xfc\x94\x10\x7c\x10\x06\x53\xf8\x61\xf0\xee\xfd\ -\x05\xcc\x1c\x9a\x05\x0b\x16\x76\x4a\xc9\x6f\x96\x46\x79\x75\x6d\ -\x0a\x99\xf5\x9c\xc0\xe5\xe8\x0a\x44\xd9\x31\x4c\x96\x22\xb6\x55\ -\x03\xa6\x4b\x11\x63\x85\x08\x4f\xd9\x95\x87\x95\x65\x85\xb0\xda\ -\xd2\x37\x43\xc9\x99\x96\xc3\x53\x0d\x8f\x53\x0d\x87\xa5\x40\xad\ -\x8c\xe4\x1e\xd4\x17\x2f\x68\xc2\xd2\x29\xe6\xc2\x16\x6f\x41\xf0\ -\x87\x90\xdd\x32\xdf\xf5\x30\xa8\xcf\x61\x85\x4e\x28\x00\xb0\x4b\ -\x4a\xfe\x7b\x69\x8c\x57\xd7\x26\x07\x57\x09\x40\x47\xc0\x2d\x48\ -\x01\x05\xc7\x30\x51\x8c\x98\x2e\x45\x4c\x97\x43\x46\x0b\x9a\x8a\ -\x63\x70\xa4\xbd\xe0\xe1\xa5\xa1\x14\x2e\xbe\xbe\xaf\x05\xf5\x50\ -\x71\xa6\xe9\x70\xaa\xe9\x72\xa6\xe5\x52\x0f\x25\xa1\x19\x6c\xa1\ -\xef\xd2\x11\xfe\x85\xa0\xc5\xcf\x09\xf8\xff\x10\x04\x83\x2c\xfc\ -\x30\xf8\xcf\x04\xb8\xc0\x13\xd8\x2d\x24\x6f\x2d\x8f\xf2\x2d\xb5\ -\x29\xd4\x20\x2b\x81\x2e\x5d\xc1\x16\x80\x2b\x2d\x45\xc7\x30\x5e\ -\xd0\x4c\x14\x23\x36\x95\x22\x46\xbc\x58\x21\xb8\xca\xa2\x84\xbd\ -\xe4\x81\xde\x88\x62\x10\x6b\xfc\xde\x76\xbe\x22\x23\xf0\xb5\xa0\ -\x19\x49\x16\xda\x0e\x0b\xbe\xc3\xd9\x56\x6c\xe5\x5b\x91\x44\xdb\ -\xb5\x7f\xc6\xa0\xd2\x15\xfe\xb0\xc5\x2f\x02\xbf\x3f\x28\x85\x3e\ -\x57\x63\x58\x9e\x0f\x7b\xdf\x33\xdb\x7d\x41\x77\x4a\xc9\x5b\x8b\ -\x23\xbc\xa6\x36\x85\x93\xe5\x3a\x81\xeb\xa1\xeb\x1d\x08\x01\x4a\ -\x5a\x8a\xca\x52\x76\x0c\x35\x4f\x53\xf3\x34\x23\x9e\xa6\xea\xc6\ -\x5b\x8c\x45\x15\x7b\x0a\x4a\x80\x14\x16\x71\x85\x9d\x86\xae\xa2\ -\xb0\x36\x2e\x69\x36\x36\x9e\xb2\x13\x1a\x49\x60\x20\xd0\x92\x76\ -\x24\xa9\x87\x92\xe5\x40\xc5\xff\x0f\x63\x61\xf7\xf5\x79\x81\x87\ -\x21\x7a\xa9\x3a\x74\x62\xfe\xf9\xb0\xc5\x7f\xb5\xf0\x3f\xc4\x90\ -\x08\x3f\x0c\xd9\xb3\x5a\x15\x0e\x6c\x15\x82\x5f\x28\xd6\xf8\xf7\ -\xb5\x69\xdc\x2c\x4d\x14\xea\x35\x76\xf5\x2f\x44\x5c\x82\xac\x84\ -\xc5\x53\x96\x82\x32\x14\x94\xc5\x53\x86\xa2\xb2\xb8\xd2\xe2\x2a\ -\x8b\xc0\x22\xc5\xf9\xa3\xd8\x8c\x15\x68\x13\xc7\xed\x91\x16\x04\ -\x46\x10\x68\x11\x0b\xbf\x16\x84\x56\x10\x19\x41\xd4\x51\x0e\x76\ -\xb5\x5b\xc2\x90\xbd\x44\x17\xe1\x37\x60\xf9\x14\x67\x82\x36\x3f\ -\x27\xe0\x8f\x87\xc5\xf2\x77\x19\xba\x67\xb7\x2a\x1c\x98\x12\x82\ -\xb7\x78\x15\xfe\xc3\xc8\x34\xe5\x2c\xcd\x12\x48\x02\x7b\xc9\x2f\ -\xb8\xe0\x69\x5f\xb2\xd5\xb8\x56\xac\x20\xd6\xfc\xe5\x86\xa1\xb5\ -\x04\xf5\x33\x3c\x19\xfa\xfc\x82\x80\x77\x22\x08\x87\x49\xf8\x61\ -\x88\x9f\xeb\xcc\x7b\x66\xb1\x50\x15\xf0\x26\xaf\xcc\x4f\xd6\xa6\ -\xa8\x79\x95\xb4\x57\x95\x33\x08\x58\x0b\xad\x45\xa8\x9f\xe5\xb1\ -\x28\xe0\xc7\x3b\x5b\x7d\x7a\xd8\x84\x1f\x06\xb0\x12\x70\xbd\x2c\ -\xfc\xe5\x47\x98\xb8\xfb\xae\x00\xb8\x57\x87\x9c\x0d\xdb\x3c\x53\ -\x3a\x8c\xb8\x19\x6d\x20\xca\xc9\x06\x46\xc7\xb5\xfd\x8d\x39\x3e\ -\xab\x43\xfe\xb3\x10\x7c\x18\x30\xc3\x28\xfc\x30\xc4\x0a\x00\x56\ -\x7a\x07\x42\xe0\x3e\xad\x79\x3c\x6a\xf3\x6c\x6b\xd9\xe4\x16\xc9\ -\x47\x77\xe5\x5c\x82\x0e\x61\xf9\x34\x51\x6b\x91\x0f\x1b\xcd\x8f\ -\x61\xf9\x94\x10\xd9\x38\xc2\xab\x5f\x6c\x08\x31\x98\x39\x34\x0b\ -\x02\x61\x0d\x2f\x90\x8a\x5f\x2a\x8f\xf1\xb2\xca\x26\xc4\x20\x95\ -\x0e\xe7\xf4\x97\xa0\x01\xf5\x39\x1a\x7e\x83\x77\x59\xcb\xaf\x60\ -\x79\x52\xc8\xc1\xad\xf0\x5b\x2f\x1b\x42\x01\xc0\x05\x3b\x04\xfb\ -\xa4\xe4\xe7\xbd\x0a\xdf\x52\x9b\xa4\xe4\x96\xd2\x5e\x59\x4e\x9a\ -\x58\x03\xed\x25\xa8\xcf\x71\x22\xf4\xf9\x35\xe0\x9d\xc0\xf2\xa0\ -\xd6\xf6\x5f\x2b\x1b\x46\x01\xc0\x05\x4a\x60\x4c\xc0\x0f\xbb\x25\ -\xde\x5c\xd9\xc4\xa6\x62\x2d\x0f\x09\x36\x22\x3a\x84\xc6\x3c\xb6\ -\xb5\xc8\xa7\x75\xc4\x2f\x0b\xc1\xdf\x32\xe0\xa5\xbd\xd7\xca\x86\ -\x7c\xed\x3b\x5b\x85\x9e\x85\x6f\x52\x0e\x3f\x5b\x1e\xe7\x39\x95\ -\x09\x18\x94\x46\xa2\x9c\x1b\x27\x68\x42\xfd\x2c\x75\xbf\xc9\x3d\ -\xd6\xf0\xab\x68\x1e\x45\xc1\x63\xdf\xb6\x71\x84\x1f\x36\xa8\x02\ -\x80\xce\x36\x61\x5c\x3c\xf3\x0c\x29\xf9\xf9\x42\x95\x6f\xa8\x4c\ -\x50\xf4\xca\x69\xaf\x2c\xa7\x9f\x18\x0d\xad\x73\xd8\xe6\x39\x8e\ -\x85\x3e\xff\x9d\xd8\xe5\x5f\xda\x28\x2e\xff\xc5\x6c\x58\x05\x00\ -\x9d\x90\xc0\x00\x82\x4d\xc0\x77\xbb\x05\xde\x54\x1e\x67\x67\x69\ -\x34\xf7\x06\x86\x91\xa0\x05\x8d\x79\x02\xbf\xce\xdf\x19\xcd\xaf\ -\x09\xc1\xa7\x19\xd2\xfd\xfd\xf5\xb2\xa1\x15\x40\x97\x99\x43\xb3\ -\x00\xca\x5a\xbe\x56\x2a\x7e\xa2\x50\xe5\xe5\x95\x71\xbc\xdc\x1b\ -\x18\x0e\x8c\x8e\x0b\x7b\x9a\xe7\x38\x11\xf9\xfc\x9e\xb5\xfc\x11\ -\x96\x53\x1b\x21\xcb\x7f\x35\x72\x05\xd0\x61\xe6\x3d\xb3\x98\xb8\ -\xc9\x66\x5a\xc0\x77\x3b\x05\x7e\xa4\x34\xc6\xee\xd2\x08\x0c\x5b\ -\x43\xd1\x86\xc1\xae\x58\xfd\xb6\x5f\xe7\xc3\xc6\xf0\x3b\xc0\x27\ -\x80\x68\xa3\xc5\xfa\x97\x23\x57\x00\x17\xb1\xf7\x3d\xb1\x37\x00\ -\x3c\x4f\x4a\x7e\xd8\x2d\xf1\xaa\xca\x38\xa3\x85\x2a\xdd\x53\x8a\ -\x72\x06\x80\x28\x80\xd6\x22\xb6\xb5\xc8\xc3\x3a\xe0\xed\x16\xfe\ -\x54\xc0\x9c\xb5\xf0\xd8\xb7\xe7\xc2\xdf\x25\x57\x00\x6b\xb0\xf7\ -\x3d\xb3\xdd\xe6\x98\x0a\x82\x57\x29\x87\x37\x16\x2a\xdc\x59\x1e\ -\xa7\xe0\x95\xc8\xef\x5a\x86\x31\x3a\x9e\xd7\xd7\x3c\xc7\xd9\xb0\ -\xcd\x5f\x5a\xc3\x1f\x00\x5f\x04\x4c\x6e\xf5\x2f\x25\x7f\x95\xaf\ -\xc0\xcc\xa1\x59\xa4\x02\x1d\xb2\x15\xc1\xeb\x1c\x8f\xef\x2f\xd6\ -\xd8\x5f\x1e\x43\x66\xf5\x50\x92\x8d\x8a\x35\xf1\xd6\x5e\xf3\x1c\ -\x6d\xbf\xc1\x3f\x18\xcd\xef\x03\x1f\x05\x5a\xe4\x56\xff\xb2\xe4\ -\x0a\x60\x1d\xcc\xbc\x67\x25\x49\x78\x40\x48\xbe\xcb\x29\x70\x77\ -\xb1\xc6\x4d\xa5\x51\xe4\x30\xcf\x1a\x18\x04\xac\x85\xb0\x05\xad\ -\x45\xa2\x76\x9d\xfb\x4c\xc8\x1f\x5b\xcb\x7b\x11\x9c\xc9\x05\xff\ -\xea\xe4\x0a\xe0\x1a\xd8\xfb\x17\xb3\x10\x4f\x52\x7e\x86\x90\x7c\ -\x9f\x5b\xe4\x9b\x8b\x35\xb6\x15\x6b\x88\xdc\x23\x48\x16\x6b\xe3\ -\xc3\x38\xdb\x4b\xe8\xf6\x32\x87\x75\xc8\x9f\x5a\xc3\x21\x6b\x38\ -\x26\x24\x36\x17\xfc\xf5\x91\x2b\x80\xeb\xa0\xa3\x08\x0a\xc0\x1d\ -\x42\xf2\x9d\x6e\x91\x57\x17\xab\xec\x28\x8e\x20\x94\x97\x97\x15\ -\xf7\x13\x6b\x62\x8b\xdf\x5e\x26\x6a\xd7\x79\x50\x87\xdc\x63\x0d\ -\xf7\x00\x8f\x00\x26\x17\xfc\x6b\x23\x7f\x55\xaf\x93\xce\xc0\x11\ -\x00\x0f\xcb\x33\x85\xe4\x75\x4e\x81\x7f\x57\x28\x33\x53\x1c\xc5\ -\xc9\x5b\x8e\x7b\x8b\xd1\x71\xc7\x5e\x7b\x99\x66\xd0\xe4\x4b\x3a\ -\xe4\x90\xb5\x7c\xc8\x5a\x8e\x08\x91\x0b\xfe\xf5\x92\xbf\xa2\x3d\ -\x60\x55\x68\x30\x23\x24\xaf\x51\x2e\xdf\xe2\x95\xb9\xb5\x58\x8d\ -\x4b\x8b\x87\x61\x3a\x71\x1a\x58\x0b\x3a\x88\xe7\xf2\xf9\x75\xce\ -\x86\x6d\x3e\xa3\x23\xfe\x02\xcb\xc7\x80\xa7\x20\x77\xf5\x6f\x94\ -\x5c\x01\xf4\x90\x8e\x22\x90\xc0\x76\x04\x2f\x53\x8a\xff\xcb\x29\ -\xf2\xb5\xc5\x1a\x9b\xbc\x32\x38\x85\xdc\x2b\x58\x0f\x3a\x8a\xdd\ -\x7c\xbf\x41\x10\x34\xf9\x8a\x0e\xf8\x98\xd1\xfc\x15\xf0\x39\x60\ -\xc1\x5a\x78\xfc\x75\xb9\xe0\xf7\x82\xfc\x75\xec\x03\x7b\xfe\x6c\ -\x16\xe5\x82\x8e\xa8\x09\xc1\xf3\x84\xe2\xdf\x3a\x2e\xaf\x70\x4b\ -\xec\x2b\x54\x28\x77\xbd\x82\x5c\x19\x9c\xc7\x68\x88\xda\xe0\x37\ -\x31\x41\x93\xa7\x23\x9f\xcf\x98\x88\xbf\xb1\x96\x8f\x5b\xc3\x51\ -\x21\x88\x16\x16\x61\xe1\x87\x72\xc1\xef\x25\xf9\x2b\xd8\x67\xf6\ -\xfc\x79\xbc\x85\x28\x04\xdb\x11\xbc\x50\x2a\x5e\xe5\x14\x78\xae\ -\x5b\x64\x97\x57\xc6\x73\x8b\x71\xa9\xf1\x46\x54\x06\x26\x82\xd0\ -\x87\xb0\x85\x0e\x9a\xcc\x87\x3e\xf7\x9b\x88\x7f\xb0\x86\xbf\xb7\ -\x96\x07\xdd\x32\xf5\xe5\x13\x70\xf2\x47\x72\xa1\xef\x17\x1b\xf0\ -\xb5\x4b\x87\xdd\xef\x9e\xc5\x2d\x41\xe4\x53\x02\x76\x09\xc9\x0b\ -\xa4\xe2\xc5\x8e\xc7\x57\x3b\x05\x76\x79\x25\xaa\x4e\x11\x1c\xb7\ -\xd3\x89\x38\x84\x4f\xc6\x9a\xd8\xd2\x87\x6d\x08\xdb\x44\x41\x8b\ -\x53\x91\xcf\x97\x3b\x42\xff\x2f\xd6\xf2\x80\xd1\x2c\x08\x09\x47\ -\xbf\x23\x17\xfa\x24\x10\x36\x1e\x91\xb3\x72\xee\xa4\xd8\x88\xa6\ -\x28\x61\x76\xfe\xd1\x2c\xc5\x09\x08\x9b\x78\x42\xb0\x5d\x48\x9e\ -\x21\x25\xcf\x97\x0e\xcf\x56\x2e\xb7\xba\x05\x36\xbb\x25\x8a\x8e\ -\xd7\xf1\x0e\xd4\x60\x7a\x08\xd6\xc6\x56\x3e\x0a\x20\xf2\x31\x61\ -\x9b\x46\xe4\x73\x4c\x87\x7c\xd1\x68\x3e\x61\x0d\xf7\x5a\xcb\xc3\ -\x58\x96\x11\xd8\x3c\xae\x4f\x9e\xae\x02\xe8\xf6\xbb\x85\xb9\x02\ -\x48\x9e\x9d\xef\x98\x45\x87\x88\x42\x85\x2a\x82\x5d\x42\xf2\x0c\ -\xa9\xb8\x53\x2a\x6e\x57\x2e\x7b\x95\xcb\x66\xb7\x40\x55\x79\x28\ -\xc7\x8b\x3d\x84\xac\x29\x05\x6b\xe2\x2f\x1d\xc5\xa3\xb6\x22\x9f\ -\x28\x0a\xa8\xeb\x80\x13\x3a\xe4\x51\xa3\xb9\xd7\x18\xee\xb7\x86\ -\xc3\x58\x9e\x1e\xdf\x45\xfb\xe4\x03\x70\xf2\x07\x73\xa1\x4f\x92\ -\x4b\x0c\xbe\xb5\x17\x1e\x09\x93\x2b\x80\xf4\xb9\xe9\x5d\xb3\x04\ -\x4d\x44\xa1\x46\x55\x08\xa6\x84\x64\x46\x48\x0e\x4a\xc5\x33\xa4\ -\xc3\x8c\x74\xd8\xa5\x1c\xc6\x94\x4b\x4d\xb9\x78\xca\x41\x48\xa7\ -\xa3\x18\x64\xe7\x0b\x2e\x7f\xba\x27\x6b\xfc\x39\x5c\xfe\x24\x51\ -\xdb\x39\x14\xd4\xc4\x56\xbd\xeb\xca\x9b\x08\x4c\x84\xd5\x11\x2d\ -\x1d\xd0\xd0\x11\x67\x75\xc4\x13\x56\xf3\x15\xa3\x79\xd8\x1a\xbe\ -\x6c\x2d\x8f\x59\xc3\x19\x6b\x68\x02\x1c\x7b\x43\x2e\xf0\x69\xd2\ -\x91\x77\x8f\xf8\x91\x86\xb9\xb4\x0f\x00\x9b\x7f\x77\x96\xe9\xdb\ -\x60\xf9\x04\x2e\x82\xb2\x90\x4c\x0a\xc1\xb4\x10\xdc\x24\x24\x3b\ -\x84\x64\xaf\x54\x6c\x93\x8a\x2d\x52\x31\x26\x14\xa3\x52\x51\x90\ -\x0a\x4f\x48\x1c\x29\x51\x48\xa4\x10\x48\x21\x38\x7f\xa6\xdf\xaa\ -\xf3\x01\xbb\x42\x8e\xc5\x58\x83\xb5\xf1\xff\xb5\x35\x44\x46\x13\ -\x5a\x43\xdb\x68\xea\x46\xb3\x64\x35\xf3\xc6\x32\x67\x35\x27\xac\ -\xe1\x29\x63\x38\x6a\x2d\x27\x30\x3c\x6d\x2d\x0b\x61\x8b\xfa\xa9\ -\x07\x30\x13\xbb\xe1\xf4\x8f\xe5\x02\x9f\x25\x2e\x31\xf8\x69\x2f\ -\x28\xe7\xfa\x99\xfc\xad\x59\x96\x4e\xc3\xe6\xfd\x38\xd2\xa1\x28\ -\x04\x35\x21\x18\x45\x30\x21\x04\xe3\x42\x32\x06\x8c\x0a\xc9\x38\ -\x50\x15\x82\x32\x82\xa2\x88\x43\x3e\x85\x40\x60\xe3\x83\x80\x01\ -\x1f\x8b\x01\x9a\xd6\xd2\xc6\xb2\x64\xa1\x8e\xe1\x9c\xb5\x9c\x03\ -\xce\x59\xcb\x92\x35\x2c\x5a\xcb\xb2\x35\xf8\x3a\x20\xd8\xf7\x0a\ -\xcc\xa7\xff\x27\xb4\x7e\x39\x17\xf4\x41\xe4\xff\x00\x21\xbf\xbf\ -\x45\xaa\x78\x3d\x13\x00\x00\x00\x00\x49\x45\x4e\x44\xae\x42\x60\ +\xbci\x89\xe7L5\x18\xf1t\xe6\x95\x80W\x86\xea$\ +\x9b\x95\xcb/\x85>/\xc4\x0e\x8e\x12\xc8\xc8\xe3\xbf2\ +\xdd\xa4\x9f\xb5|\x93[\xe0-\xb5IjN\x86\xbb\xfa\ +,0\xeai\xbejs\x83\x97\xee\x5cbf\xd4\xc7\x91\ +W\xce\xb6[\x03m?Y\xa7\xb7\xe8\xd9\x0bB\x90,\ +\xd0\xbdG5W\xf3\xac\xa9&/\xdf\xb9\xc4\x81\xf16\ +\x05\xd5\xfb\xdd\x8a^R\xaaAu\x82[\xa4\xe2\xe7\xac\ +e\xc7\xa0(\x81\xcc+\x80UI\xbfg(\x87\x9f\xab\ +N\xb2\xcd\xcb\xe80\x0fK\xbc\xa573\xea\xf3u;\ +\x97\xb8c\xb2I\xc51\xebzq\xb5\x01?Hn\xad\ +\x82ly\x00\x17c\x89\xb7>\xa7J\x11/\xdaZ\xe7\ +\xc5\xdb\x97\x99.E\xd9\xcd\x0b\x08(\x8dAq\x84W\ +\x08\xc9\x7f\xe9\x0c\x9c\xcd<\x19}\xfc\x17ba\xab\x94\ +\xfcRy\x9cg\x173\x5c\xe57V\xd0\x7fK\x83\xdb7\xb5\xf0d\ +\xefc\xceV{U\x17`\x02\xb8\x0e8Nz\x09\xb4\ +^;:\x96\xb8f\xe0k\xb6\xd5\xd93\xe2gfw\ +C\xc8\x95P\xe0u\xc0+\xb3\x16\x0adF\x01\xac\xba\ +)\xaf\xf2\xca|kV:\xfc,q\xf7\xde\xf3\xb7\xd4\ +\xd97\xde\xee[\xd6\xb9\xe5\xc7\xe5\xc0I\xe1\xb9\xf1W\ +\xd2H\x00\x0b\x8dv\xef?\xaf\x05j\x9e\xe6\xab\xb7\xd6\ +90\xde\xceL\x95\xa3\xe3Ae\x82\xa9N(\xb0#\ +\xed\xf5\xac&3\x0a\x00\xc0Zv)\x87\x1f\xac\x8cS\ +\xcd\xc2\x81\x9d\x16\xa8\xb9\x86\xaf\xdeZgf\xb4\x7fV\ +\xc5\x12\x17\x01\xd9\x84\x14\x80%\xde\x01\xf0\x9cd.(\ +\x88_4?\x80G\x8fK>\xf8\x8f\x0e\x9f\xb8O\xf5\ +\xe5~v\xbd\xb5\xe7n\xc9\x96\x12(\xd6\xa0P\xe5\x85\ +B\xf0\xbd\xd6\xe2d\xc5\x0b\xc8D\x14\xd8I\xfc)!\ +\xf9\xfeb\x8d\x17f\xe1\xdc\xbe\xd5/\xd2\xee\x11\xbf\xef\ +\xd7\xf2\x03\xd1\xf3\xb1_W\xc2s\xfb\xdb\x09(:_\ +\xda\xc2\xd9E\xc1\xc3\x8fK\xbe\xf0\x88\xe4\xf8II\xbd\ +\x09/{\xbe\xee\xdbg\x8d\xf35\x96\xe7n\xae\xa3\xa4\ +\xe5\xf0\x5c)Q\xefj\xcd\xfb\x11\x87\x02n\xd8\xe6{\ +\xc2\x16\x7f\x8b\xe03\xe9\xae(&\x13\x0a\xa0\xc33\x1d\ +\x8f\xef(\x8f\xa3\xd2n\xf1\xedn1=\x7fKl\xf9\ +\xfb\x8d1\xd0l_0\x01\xac\xef\x14\xbc\xfe\xf4\x01t\ +\x05\xbf\xe9\xc3\x13OK\xbe\xf4\xa8\xe4\xa1\xc7$g\x17\ +\x04Qg\x97C\x08\x18\xa9X$\xf4t\x16\xe1j,\ +\xf1\xac\x81gO5\xd0F\xf0\xf0B1u%\xe0\x16\ +\xa14\xc2n\x1d\xf0Fc\xf8\x91\x99C\xb3\xf5\xb4g\ +\x09\xa6\xae\x00:\xd6\xbf(\x14?P\x1ca\xaf\x9b\xd0\ +x\xaa\xcb\xd1\xb5\x1e\xcf\x99n\xb2\xb7\xcf\x96\xbf\x8b6\ +\xd0J\xb0\x13P\xd0\xdbN\xc0\xae\xd0G\x06\xe6:\xd6\ +\xfe\x8b\x8fH\x9e8)i\xb6;\xdf#\xce+\x1c\xcf\ +\x85m\xd3\xfd\x97\xc6\xee\xb3\xfc\xaa\xcd\x0d,\xf0\xf0|\ +1\xf5m\xc2\xd2(\xf8\x0d\xbe\xd1o\xf0\x01\xe0}3\ +\x87fS\x1d(\x9a\xaa\x02X\x89\x83\x04/q\x8b|\ +K9\x03C=\x1day\xe6T\x93\x83\xe3\xadD\xdc\ +qA\xec\x01$\xd9\x08\x04P*\xde\xb8\x07\xd0\xbd=\ +\xcd6\x1c;\x19[\xfb\x87\x8fJ\xe6\x16\x04\x91\xe9(\ +\x86\x8b\xee\xa1\xb1\xb0e\xd2\xb2sK2\xd5{\xdd\xed\ +\xdb\xe7L7\xf0\xb5\xe0\xf1\xc5tw\xe2\x94\x0b\xe51\ +\xc6#\x9f7\xea\x90O\x0a\xc9\xd3i\xae'u\x0f\xc0\ +\x1a\xaa\xd2\xe1\xfb\xca\xa3L\xa5}r\xaf\x14pp\xa2\ +\xcd-\x13\xadD\x93G\xc6\x80\x9f`\x1f\x80\x10P*\ +\xda\x95\x13\x82\xae\xe9\xdfr\xde\xda\x9fY\x10<\xf4\xb8\ +\xe4\xcb\x8fJ\x8e?}\x91\xb5\x17\x97\xff\xf7\x07\xf7\x18\ +j\xe5\xe4\xcaw-Pq\x0c\xcf\xdd\xdc\xa0\x1dI\x9e\ +j\xb8\xa9n0\x15k\xd0\xae\xf3\xd5\xadE\xbe\x19\xc1\ +\xdb\xd3\xf4\x02RS\x00\xab\xac\xff\xcb\xdd\x22//d\ +\xa0{z\xcf\x88\xcfs\xa6\x9b}\xd9\xe7\xbf\x12\x91\x16\ +\x04A\x82!@\xa7\x11\xe8Z\x14\x80\xec|o\xbd%\ +8zB\xf0\xe5\xafH\x1e9*\x99_\xecX{q\ +\xf5\x04\xa6\xb5P)Yn\xddk\xaeK\xf9\xdc\x08\xdd\ +!-\xcf\xdbR\xe7\x9f\x9e\xac1\xef;\xa9)\x01!\ +\xa1\ +K\x81\xe2\xbe\xd3\x95\xd4v\x06\x84\x84\xd2(\x9e\xdf\xe0\ +\xf5\x91\xcf\xfb\x80#i\xac#5\x0f\xc0\x1aF\xa5\xe2\ +\xbb\x8b5F\xd3\xec\xf3/(\xcb\xb3\xa6\x9al.\x87\ +\xa9\x08\xbf\x00\xc20\xb6\xb2I\xa1\xe4\xa5\xb3\x00\xba\xd6\ +^kx\xea\x8c\xe0\xa3\x9f\x8e\xad\xfd\xbb\xff\xc6\xe5\xde\ +\x07$\x0bKq\x9d\xc2z\xad\xfd\xc5X\x0bc5\xcb\ +\x81\xdd\xe9X\xff\x0b>\xbf\x80[&Z}\xaf\xef\xb8\ +\x1an\x09\x0a\x15n\x13\x92o\x0d[\x884\xbc\x80\xc4\ +=\x80\xd5\xd6\xdf+\xf1u\xc5\x14[}\x05pp\xbc\ +\xcd\xbe\xb1t_\x84 \x14D:\x99#t\xad\x05\xa5\ +\xecJ'`\xf7\x92\xdd\xd8\xfe\x8b\x8fJ\x1e=\x16\xc7\ +\xf6\xe6\x06\xac\xfdZ\xd7\x9d\xd9i\x98\x1cK\xbfw\xbf\ +\xbb=\xf8\xac\xa9&\x0bm\x87y\xbf?U\x89WC\ +\x08(\x8d\xe2\xf8\x0d^c\x0d\x7f\x0e\x1cOz\x0d\xa9\ +x\x00FS\x92\x8ao/\x8e0&S\x8a\xfd-\xb0\ +\xa5\x12r\xeb\xa6\x16J\xa4\xfbJ\xb6\x83N+pB\ +\xd7s\x9cx\x16@dbk\xff\xb1\xcf(\xfe\xe8\xfd\ +\x0e\xef\xfa\x90\xcb\xa7>\xaf8\xbb\xd0\xfb\xaaD\xcf\x8d\ +\xdd\x7f7#S\x9d,0Q\x8cx\xd6t\xba\x03E\ +\xdc\x22xe\xee@p\x17\x22\xf9F\xa1D\xc5\xaf\xfb\ +\xe1\x84\xe0\xab\x9c\x02/M\xab\xe4\xb7\xdb\xe0s\xe7t\ +\x83\x9a\x9b\xfe \x89\xb6\x9fl'\xa0\x14\xf0\xe81\xc9\ +?\xde+x\xf8\xa8d\xe1\x1a2\xf9\xd7\x83\xb505\ +a\x99\xd9\x91\xbe\xf5\xbf\x98\xdd#\x01\xa7\x1am\x0e\xcf\ +\x97R\xb9\xbe\x90P\xacQ\xf0\xeb\xbcF\x87\xbc_H\ +\xe6\x92\xbc~\xe2\x1e\x80\xd1\xb8R\xf1\xbab\x8d-i\ +5\xfct\x87H\xa4\x15\xf7\xaf\xc6\x92l'\xa0\x10\xb0\ +T\x17|\xf0\xe3\x0e\xffr\x7fl\xed\xaf%\x93\x7f\xbd\ +\x9f\xf1\xc0n\xc3h-{\x0a\xc0\x11\x96\xdb'[\xa9\ +\x0e\x13\xf1\xca\xe0\x95\xf8j\x04_\x0b\xc9z\x01\x89+\ +\x00!\xd8\xaf<\xee*\xa6\x94\xf9\xb7\xc0\xb6J\xc0\xc1\ +\x84\x8b}\xaeD\xdbO\xae\x13\x10\xe2\xd2\xe3 \xec\x9f\ +\xc5_\x8d\x05\xca\x85\xd8\xfd\xcfT\xeb\xe9\xaa\xf5\x8dx\ +\x9a\xdb6\xb5(\xa8tT\x80TP\xa81\x22\x15\xaf\ +2\x9aD\x8b\xe1\x13{&3\x87f\x91\x0a\x84\xe0\xdf\ +\x14*\xecN\xebd\x9f\x82\xb2\xdc\xba\xa9\xb5\xee\x03;\ +\xfa\x8d%\x0e\x01\x92T\x00\x89~>\x03\xdb7\x1bv\ +n\xce\xc6\xfd\xbe\x1c\xbbG|\xf6\x8c\xf8\xa9\xad\xb1P\ +\x01\xc7\xe3eBpK\x92\xd7MT)\xeb\x90-\xd2\ +\xe5\x9b\x0b\xd5\xf4\x8c\xc1\xdeQ\x9f\x1d\xd5\xf4]\xff.\ +\xd6\xc6!@V\xd6\xd3k\xa4\x84[g\x0c\xe5b\xb6\ +?\xa3\xdb\x99\xf5\x98V-\x88r\xa1Pa\xbb\x90|\ +\xfd\xd8\xd6\xe4\xc2\x80D\x04q\xd5\xd6\xdf\xd7xe\x9e\ +\xed\xa5\x90o\xe9N\x8b\xb9e\xbc\x85\x93r\xd6\x7f5\ +q#P\x06\x87\xdb\xf7\x00k\xa1V\xb1\x1c\xdcc\xb2\ +0\xdc\xe9\xcak\x056\x95\x22\xf6\x8f\xa57D\xa4P\ +E)\x87\x7f;\x7f\x82\xc9\xa4\xae\x99\x98%6\x9a\x82\ +T|c\xb1B%\x8d~\x7f\x01\xdc<\xe6\xb3)c\ +\x93c\xb5\x89\xb7\x01\x87\x11ka\xcfv\xcb\xe6M6\ +\xd5\xca\xbf\xf5\x12\xbf#m\xb6\xa4\x94\x1cv\x0a\xe0\x16\ +y\xa6\x80\xe7A2^@b\xa2(\x04{\x1c\x8f\x17\ +\xa5q\xb0g|\x90D\xc4\xcch;S\x96\xa8{&\ +`\xdb'\x13\xf3\x0f{\x8d\xe3\xc4\xc9\xbfB\xea=\xa7\ +\xeb\xa3\xbb=|p\xbc\x85+\x93W\x01R\x81We\ +L*\xee\xd2a2[\xf4}W\x003\x87f\x91\x0e\ +\x08\xc1+\xbd\x12\xbb\xd3(\xfcQ\x02\x0eL\xb4S\x8b\ +\xef\xae\x84\xd6\x02?H\xeeL\xc0\xa4\xb0\x166\x8dZ\ +n\xde\x95\xed\xe4\xdf%\xeb\x06v\xd6\x02\xb6U\xd2\xf1\ +\x02\xbc2(\x8f\x97\x0a\x99\xcc\xf0\xd0D<\x80\xa8M\ +M\xba\xbc\xb2P\xc5I\xfa\x90\x0f\x0b\x8c\x15\xa2\xf8\x04\ +\x9fd/\xbd\xbe{\xa3\xe3s\x01\x87\x0d\x0b\xec\xbb\xc9\ +01\x9a\xbd\xbd\xff\xabQP\x96\xfd\xe3\xedT\xb6\x05\ +\x1d\x0f\xdc\x22{\x85L&\x0c\xe8\xab\x02X\xa9\xfc\x93\ +\xecw<\xeeLc\xdc\x97\x14q\xec_\xcb\xd8\xd1Q\ +]\xc2h8\x15@\xc1\x85\xdbf\x0cN\x16\xb5\xeeU\ +\xb0\xc0\xf6j\xc0\xd6J\x90\xf8;#\x04\x14*T\xa4\ +\xe2\x95:\xa4\xef\xa5r}\xf7\x00\x84\x04!x\xaeW\ +b:i\xf7\xbf\x1b\xfb\xef\xce\xd0A\x11\x17\xdc\x1b\xe2\ +\xf8\x7f\xd8\x14\x80\xb1\xb0u\xca\xb2{\xfb\xe0Y\xff.\ +\x9e\xb4\xdc<\xea\xe3\xa5\x90\x0bp\x8b\xa0\x5c\x9e+$\ +\xdb\xa0\xbf^@\xdf\x15\x80\x0e(I\x87\x97\xba\xa5\xe4\ +;\x0f\x05q\x81G\xd6\x0e\x8e\x5cM;H\xf6P\xd0\ +$\x10\xc0-\x09\x8f\xfd\xea5\x16\xd8Z\x0d\x99,E\ +\x89\x17i\xa98\x0c\xd8'$\xcf\xee\xf7\xb5\xfa\xa6\x00\ +V\xed\xfd\xeft<\x9e\x9d\xb4\xfb\x1fgt5\xbb2\ +\x1a\xfbw\x09\x02V\x86l\x0c\x03\xd6B\xb5l\xb9e\ +&\xfb{\xffW\xa3\xa8\x0c\xbbG|T\xc2\xdb\xd6B\ +\x80W\xa2,%_\xa7C\xfa\xda?\x99D\x08\xf0\x1c\ +\xa7\xc8\xce4\xb2\xff;k\x01\x13=<\xc1\xb7\x1f\x04\ +\x11\x89v\x02\xf6\x1bkagg\xec\xd7\xa0\x7f,\x01\ +\xec\xa8\x06TS\xe8\x18uK\xa0\x5c\x9e'$\x9b\xfa\ +y\x9d\xbe*\x80\x85\xa7\x10R\xf2\x1c\xafH1i\x0b\ +WT\x96=#\x01*\xe3f\xa8\xd5\x16\x89\x9e\x0a\xdc\ +o\x94\x8a\x93\x7f\xa5\x0c\x1c\xedv\xa3t\xabGwT\ +\x93\xf7\x22\x95\x07N\x81\xfdBp+\xf4/\x0f\xd0W\ +\x050:\xcd\x98t\xb8\xd3Ix\x14\xbb\xb50Y\x0a\ +\x99,e\xa7\xe6\x7f\xcdu\xd29\x11(\xcb\x8b\xbc\x96\ +\xcf\x93\xa1\xb1_\xbdB\x89\xd8\x93\xf4\x12\xde\x12\x94\x12\ +\xdc\x12\xe3B\xf2\xdcR\x1f;g\xfb\x1b\x02\x08v9\ +\x1e\xfb\x92\x9e\xf7/e:\x0f\xedZ\xb1\xc4\x1e\xc00\ +)\x80\xbd;m&\xc6~\xf5\x92\xa9r\xc4\xa6b\xf2\ +\xc9@\xb7\x88\x94\x0e/h,\xd0\xb7\xfa\xd9\xbe(\x80\ +\x99C\xb3\xdd\xa3\xa0\x9e\xed\x14\xd8\x9c\xe4\xd0\xcfn\xf2\ +/\x0d\xb7\xed\x9a\xd7:d\x9d\x80\x9e\x0b\xcf\xb8Yg\ +f\xecW/\xe8\x9e,\xb4\xbd\x1a$\x9e\xa8u\xe3\ +\xd0\xf2\xaf/\x07!\x80\x83{\xec@\x8f\xfd\xba^*\ +\x8e\xa1\xa0\x0c\x81Q\xc9X9\x01RQ\x80\xd8\x03\xe8\ +%=W\x00\x02J\xd2a*\xd1\x1d\x00\x11\x0fnP\ +\x03P\xff\xdf\xc5\x00-\xbf\xbf\xafO\xd7\xda\x97K\xb0\ +k\x8b\xe1\x19\xfb\x0c\x07\xf6\x18\xa6\xc7-\x87\x8fH\xcc\ +u& \xe3\xb1_\xb1\xfb/\x18\xee\xe2\x9f\xb5(:\ +\x86\xa2cYN\xb0$@*\x5c)\xe3\xceZ\xdd\xc3\ +\x14D\xef\x15\x80\xa4&%SI\x96\x00K\x015o\ +\xb0^Fc\xa1\xd5\x8e\xd7\xdbK5\xd0\xb5\xf6\x8e\x82\ +\xc9\xb1x8\xc7\xed\xfb\x0c\xbb\xb6\x1a*\x9d\xac\x8c\x00\ +Z\x9dY\x84\xd7u\x0d\x0b\xbb\xb6\x1a\xb6M\x0d\xfe\xd8\ +\xafk\xfe\xec\xc4\x05g\x15\xc7p\xa6\xd7\x0f\xef\x0aH\ +\x85\x14\x92\xe9_{5\xfc\xc4=\xbd\xfb\xb9\xbd\xdf\xbd\ +\x15T\xa5C%\xc9\x12`GX\xaa\x09o\xcd\xdc(\ +\xc6t<\x80\x1e\xbdD]k_,\xc0\xce-\x86;\ +\xf6\x1bn\xd9k\x98\x1c\xb38\xb2\xa3\x18V}\x7f\xb3\ +%\xae;\xff\xd0\x1d\xfbU\xf4\x06G\xe1\xf6\x12%-\ +%7\xc1\xfd\xdb8\x07\x80\x90l\xfa\xe1\xdfGV'\ +{\xa7w{\xa6\x00V\x0e\x01\x11\x8c\x0aI%\xa9\x9b\ +c\x01GZ\xca\xee`\xd9\xa2\xf8T\xe0\x1b\xff\xec\xd6\ +\x82#a\xbc\xb3\x1f\x7f\xc7~\xc3\x9e\xed\x86j\xe9\xfc\ +\xf7\x985\xfe]\xbdu}\xa3\xc8\xac\x85\x89Q\xcb\xfe\ +\xdd\x83u\xbf{\x89\x00*\x8eN.\xcb\xdd\xcd\x13\x09\ +\xc6\xbd\x0a\x0e\xd0\xb3\xe3d\xfb\xe3\x01H\xbc$=\x80\ +\x82\xb2\xa9\x1c\xe0p#X\x0b\xc1u\xc6\x90\x17\xc7\xf6\ +\xb7\xddl8\xb0\xdb05nq\xd5\xa5\xd6~\xad\x7f\ +\xdf\x1dEv\xad\xcf\xc9Z\xd8\xbb\xc309\xbe\xf1\x92\ +\x7f]\x04\xe0)\x9bh\xc8)\x14H\xc9\x88\x94xd\ +U\x01t^\xa6\x11\xa1\xfa\x7f\xa4\xd1\x0a\x16\x0a\xca\x0c\ +\xd4\x0e\x80 \x8e\xbf\x83p\xfde\xc0\xd6v\xbc\x9dN\ +l\x7fpO'\xb6\xdf\x12w\xe1un\xc5\xba|C\ +\xcb\xf9Qd\xd7\xaa\xa7=\x17n\xdfgp\xe5\xfa\xae\ +5\xac\x94\x1c\x83\x14\x16m\x93\xb1tB\xc4\xf95!\ +)\x00\xf5^\xfd\xdc\xdez\x00\xb1J,\x0a\x91|\x17\ +\xe0 \xed\x00@,\xfc~xu\x01\xecZ\xfbJ\xd9\ +\xb2{\x9b\xe5\xf6}\x86\x037\x196\x8dZ\x94\xbc\xba\ +\xb5_\x0b\xa3\xa1}\x1d\xf9\x07\xd3\x1d\xfb5\xc0G~\ +\xf5\x8a\x82\xb2H\x01:\xa1\x1b\xd1\xa9\xb0-Ao\x8d\ +kO\x15\x80T`,U!\xfb{\x9a\xc9\xc5\xb8\xca\ +\x0e\xdc\xc9:~\x10\x9f\x0a\xb4\x16]k\xef\xaaX\xe0\ +n\xd9k\xb8\xfdf\xc3\xce-q\xe2\x0d\xd6o\xed/\ +\xa6\xdb\x85\xd8ls]I\xac\x83{\x86s\xec\xd7\xb5\ +\xe2J\x8b\x92\x96\xd0$\xf4\xe2\xc5\x0a\xa0\x8c\xa0\xa7=\ +\x81\xbd\x0d\x01$ pE\x92CnD\xfc0\xc4\x00\ +\xbd\x92\x02h\x07\xf1H\xb0\xd5t\xad}\xb5\x1c\x1f\xac\ +y\xc7~\xc3\xfe\x9b\x0c\xe3#\x16%b\x81\xef\xc5\xa7\ +\x0c\x22A\xdb\xbf\xf6\x87T.\xc4{\xff\x92\x8d\xed\xfe\ +C\x9cx\x96\xf4~\x1b\xf7r\x08\x01H\x5cAo\x8d\ +ko=\x808.tIx\xca\x95\x12\x83\xe7\x01h\ +-V\x1a\x81\x8c\x89\xdbj7OXn\x9d\x89c\xfb\ +\x1d\x9b\x0dE\xf7\xbc\x8b\xdfK\x81\x8b\xa2\xb8\x0c\xf9Z\ +0\x06\xb6o\x1e\xee\xb1_\xd7\x82\x12\x16\x99p\xd8)\ +b\xf7\xbf\xa7\xb3\x01{\xeb\x01(@$\xdf\x1b\x92\xf4\ +\xe1\x8d\xbd\xc0\x98\xce\xd1S\x958\xb6\xbf\xe3@\xc7\xda\ +\xd7\xe2\xd8\xd2\xd0?+\x1bF\x10^\xa3\x02\x902\xde\ +\xfb\x1f\xf6\xb1_\xebE\x88\x1b\xeb\xa5\xb8\xf6\x0b\x82\x90\ +\x08z\x9c_\xeb\xa9\x02(T l\xe1$\xed\x01\x08\ +\x06\xab\xa7\xde\x12+\xadW\xbc \xe2\xe0\x1e\xc3\xd6I\ +K\xa1O\xd6\xfeb\x04q\x01Rx\x0d\xe5\xa4\xd6\xc2\ +h\xd5r`\xcf`U[\xf6\x13)R9\xd1Y\xd1\ +c\x99\xed\xe9\x0f\xeb\xc4\xb0\x89\xdf\x96A\x8a\xff!\x16\ +\xa0\x1d[\x0c\xbb\xb7\xb3\x12\xdb'\x19S7\xdb\x10i\ +\xb1\xee\x17\xd8Z\xd8\xb3cc\x8c\xfdZ?6\xf9\x11\ +\xe8\xa2\xf7\xb6\xae\xa7\x9f\xc1\xc41m\xe2\xd28\x88\xe3\ +(]'\xb6 i\x08T\xab-\xaei\x10\x89\xe3\xc4\ +\xee\xffF\x19\xfb\xb5>R1;\x19W\x00\xb1[\xa9\ +m\xc2\xbbD\xddm\xb3\x9c\xf5\xd1\x1dE\xb6\x1e6\xe2\ +\xd8\xaf\xf5a\xd31;=\xbehO\x15\x80\x8e\xfb\xdb\ +\x13?\x93;\xa9j\xaca`\xa5\x0ap\x9d\xcf\xc8\xda\ +\x8d5\xf6k\xbdX\x9b\xc24'\x8b\xa1\xc7QXo\ +\x15@\xecV\xb6m\xc2\xa1\xa26\xd7\xd7\xd8\xb2\x111\ +@\xa3\xb5\xfe#\xc9\x8b\x85\xd8\xfd\xdfHc\xbf\xd6\xc3\ +\xf5T`\xde\xe8\x05;r\xd5\xd3\xb6\xd7\x9e*\x00\xab\ +\xc1Z|\x924\x16\x16B#\xd2r\xc8\x06\x0ec\xa0\ +\xd9Z\xe7\xf7Z\xd8:i\xb9i\x03\x8e\xfd\xba\x1a\xc6\ +\xa6\xe2yFXz:\x86\xa4\xb7\x0a .UkX\ +\xd3[-u5B3\xd8\xc35\x93\xa4;\x87`=\ +\xb7K\x00\x07\xf7\x9a\x0d9\xf6\xebj\xe8\x84\xdf9k\ +\xc1\x1aB\x0b=\x1dI\xdc[\x05\x10\xff\xc7O4\x04\ +\x10\xb1\x02\xd0f\xf0\x0f\xd9\xec7\xdd.\xc4\xb6\x7f\xf5\ +\xef\x8d\xc7~\xd9\x95\xb1_9\x17\xe2k\x99\xf8;g\ +->d\xd8\x03\xe8\xc4)K\xc6\xf4\xae_y=\x04\ +Z\x10\xe5&j]\x84\xa1\xa0\x1d\x5c\xfd\xb5\x8d\xc7~\ +Y\xb6Nn\xbc\xb1_\xeb\xc1\xd7\x22\xb1N@\x88\xbd\ +kkh`Yg\x00\xb7>\xfaQ\xcb\xd0\xb0\x86 \ +\xc9\xa4\x5cd\x04QR]Y\x03N\x10\xc5\x9d\x88W\ +\xbb[\xdd\xb1_\xa5\xbe\x9cJ?\xf8\xb4\xb4\xc4$\x98\ +\x03\xb0\xb1qm\xda\x1e\x1b\xd7\x9e+\x00k\xa9[C\ +3\xa9\xa0Q\x00\xa1\x91\xb4\xa2\x01l\x08H\x18A\xdc\ +\x82|\xb5Qd\xd6\xc2X-\x1e\xfb\x95;V\x97b\ +\x81F(\x13\xbd7\xd6\x80\xd5\x9c\xb36\xa3\x0a\xe0\xc8\ +\xddo\x8e\x17j\xa9\x9b\x88f\xa2\x1e\x80\x85v\xae\x00\ +\xd6\x85\x1f^\xda\x86|1\xd6\xc2\xcc\xce\x8d=\xf6\xeb\ +J\x18\x0b\xf5@%\xba\xf5\xdc\x09\x01\xceEA\x96s\ +\x00\x00\x86\x86\xb5,\xda\x04\x03Gm\x04\x8d\x5c\x01\xac\ +\x8b\xb6/\x88\xf4\x95\x1bY<\x17\x9e\xd1\x19\xfb\x95s\ +)\xa1\x914B\x99h\xd7\x8b\x89\xc0ZN\x9d\xf8\xbe\ +\x0c\xd7\x01\x00X\xf0\x8df>\xc9#\xafb\x97L\xe5\ +\xd6j\x1d\xb4\xdaW>\x90\xd4Z\x98\x9e\xb0\xec\xc9\xc7\ +~\xad\x89 N\x006\x1368Z\xa3\x8d\xe1\xe4\x81\ +\xf7\xf7\xf6\xe7\xf6\xfcS\x98\x88\xb65\x9c\xb2IV\x02\ +XX\x0ad^\x12\xbc\x0e\x9a\xed\xab\x9f\x07\x90\x8f\xfd\ +\xba2\xcdP\xe2k\x99\xe8\x16\xa0\x89\xf0\xad\xe1\xc9^\ +\x9e\x0a\x04}P\x00\xdbo'4\x9a\x13\xbd^\xe8\x15\ +\x11\xb1\x07\x10\xe8\xbc\x16\xe0JXb\x0f\xe0r\x05,\ +\x16(\x15\xcf\x8f\xfd\xcaY\x9b\xe5P%7\x0b\x90\xd8\ ++\xd3!M,\xa7z\xfd\xb3{\xfa\x9c\x8f\xdc\xfdf\ +\xe6\x9e\x00k8a\xa2d\xab\x01\x1b\xa1\xa4\x19\xe6\xaf\ +\xed\x95\xb0\xc4\x1e\xc0\xe5\x92W\xd6\xc0\x8e\xcd\x86\x1d[\ +\xf2\xec\xff\xe5\xb0\xc0B[%^\x03`\x22\xe6\xac\xc9\ +\xb8\x02\x80x&\x80\xb5\x9c\xd0\x11\xeddnOg{\ +K\x0b\x16\x83D\x87\x11\x0f\x1c\xc6\xc4\xc3@.\xf7\xee\ +J\x09\xb7\xee5\x94\x0by{\xf5\xe5\x88\x8c\xe0\x9c\xef\ +$z\x83\x8c\x06\xa39k-\xe7\xe0\xfc\x8e[/\xe8\ +\xbd\xc9\x8c\xdb\xa4N\x99\x88F\x92;\x01\x91\x15\xcc\xb5\ +\x9d\xfc\xc5\xbd\x02\xda\xc4\xc3@\xd6\xc2\xdax>aw\ +\xecW\xce\xa5\x08\xa0\x19I\xce\xf9*\xf1\x1d\x00\xa39\ +jt\xef\x0e\x04\xe9\xd2\x17\x9f\xd9\x1aN\xe9\x90SI\ +*\x00\x80\xb3-\x07_\xe7\xaf\xefZ\x08\xba\x8d@k\ +\xff}|\xe4W>\xf6\xebj,\x07\x8aV\x94l\x02\ +P\x87`4O|\xe3\x1bz_b\xdf\x1f\x05`9\ +g4'\x13M\x04\x02\x8b\xbeC#T\xb9\x05\xbb\x0c\ +a\xe7<\x80\xb5p\x1c\xb8\xed\xe6|\xec\xd7\xd58\xdb\ +r\x12M\x00\x02\xe8\x80\xd0\x1a\x1e\xfa\xc8{{\xeb\xfe\ +C\x9f\x14\x80\x89h\x98\x88#\xba\xa75KWF\x00\ +\xadH0\xd7\xca\xdf\xe0\xcb\x11\x84\xacy\x1c\x99\xb5\xf1\ +y\x83\xf9\xd8\xaf+\x13Y\xc1|\xdbI\xbc\x020\x0a\ +X\xb2\x86\xc7\xfa\xe1Q\xf7E\x01\x94F\x89\x8c\xe6\xe1\ +(Hv' \xb2\x82\xd3-7\x9f\x0dp\x19\xba\x0a\ +\xe0b,\xb0\xef&\xc3\xc4H\xbe\xf7\x7f9\x04\xf1\xfe\ +\xff\xd9\xb6\x93l\xfc\xafA\x87\ +\xfe\xd7\x11\x8fY\xcb\x5c?~~\x7f6\xce\xe3\xe9%\ +\xc7\x22\x9f\xa7M\x82y\x00\x01,\x05\x8a\xf9v\x1e\x06\ +\xac\x85\x1f\xc4\xe7\x01\xac~\x83W\xc6~m\xcd\xad\xff\ +\x950\xc0\xc9\x86\x9b|\xfc\x1f'\x00\x0f\x1f}\x0f\xcd\ +~\xfc\xfc\xbeU\xceX\xc3\x09\x1d\xf1P\x92y\x00\x80\ +\xc0\x08\x9ejx\xf9\xcb\xbc\x06\xad6q#\xd0\xaa?\ +\xcb\xc7~\xad\x0f?\x92\x9cN!\xbf\x14\xb6\x09\x8c\xe6\ +\xf0\xcdo\xe8\xcf\xcf\xef\x9b\x02\xf0\xeb4u\xc4\xe7C\ +?\xf9\xf7\xea\xe9\x86K3aWm\x10h\xb4.\xec\ +\x038?\xf6K\xe7\xf7\xea\x0a\x08`\xae\xedp\xcew\ +\x92\xad\xff\xd7\x10\x05\xccay\xd0\xda\xde\xef\x00@\x1f\ +\x15@y\x1ck\x0d\x9f\x8b\xda\xc9\xce\x06\x10\xc09_\ +q&\xdf\x0d\xb8\x80\x95>\x80\x8b\x14\xc0\xae\xad\x96m\ +S\xf9\xde\xff\x950\xc0\x93u\x8f \xe1\x1a\x13\x1d\x82\ +\x0ex\xd4Z\x8e\xf6\xeb\x1a}Q\x00+\xc3A\x0c\x87\ +C\x9f\xe3I\xe6\x01 \x0e\x03\x9e\xac{\x89\xd6k\x0f\ +\x02-\xff\xc2>\x00\xa5\xe2\xe4_\xd1M{e\xd9E\ +\x10\x0f\xff8\xbe\x9c|X\x19\xf9\xa0#\xee\xd7!\x0b\ +\xfd\xbaF\x7f\xbbg,'u\xc8\x03\xd1:\xa6\xd0\xf6\ +\x9a\x93\x0d\x8f\xe5 /\x0a\xeab\xec\x85}\x00\xd6\xc2\ +\xf8\x88\xe5\xc0M\xf9\xde\xff\xd5x\xba\xe9\xb2\x1c$\x1f\ +R\x86m|\xa3\xf9\xac[\xea\x9f\x83\xd6W\x05\xe0\x16\ +i\x9a\x88O\x84\xedd\xeb\x01\xba\xbb\x01'\x1a\xf9D\ +\xcb.\xda@\xb3%V4@w\xec\xd7\xa6|\xec\xd7\ +\x15\x09\x8c\xe0\xe8R\x81(\xe1Y\x13FC\xe4s\xd6\ +\x1a\xbeL\x9f\xe2\x7f\xe8\xb3\x02\xd0\x11X\xc3\xbdA\x8b\ +9\x93\xa8\x0a\x00m\xe1\x89%/\xef\x0d\xe8\x10\xe9N\ +\x1f@\xe7vxn\xec\xfe\xe7c\xbf.\x8f\x00N7\ +]\x9en$\x9b\xfc\x83\xd8\xfd\x8f\x02\x1e\xa0\x8f\xf1?\ +\xf4;\x04 \xce\x03D\x01\x0f\xe8DO\x0a\xe8<\xbc\ +\x96\xcb\xa9\xa6\xbb\xe1\xc3\x00\x01h}\xfe<\x80\xee\xd8\ +\xaf\xbd\xf9\xd8\xaf+\xa2-<\xb6X\xa0\xad\x93\xd7\x92\ +A\x0bt\xc8\xa7\x1e\xffE\x16\xfby\x9d\xbe}\xb2\xae\ +\xcb\x12\xfa,\x98\x90\x7f\x0dzz\x9c\xc1\xfa\xf0u:\ +\xee[\x16\x89\xf4\x85\xe7\x01\x1c\xc8\xc7~]\x11\x01,\ +\xf8\x0e'\xea\xc9gH\xad\x81\xb0\xc5\xbc5\xfc\xe3\xcc\ +/\xf6\xf7Z}Wm\x85\x0a\xd6h\xfe1h%;\ +)\xb8\xcb\x93u\x8f\xf9v\x9e\x0c\xf4\x83\xf8L\x80\xee\ +\xd8\xaf\xdb\xf2\xb1_W\xc4\x10[\xffz\x0a\xdd\xa5Q\ +\x00\x91\xcfW\xac\xe50\xf4/\xfe\x87\x04\x14\x00\x80\xb5\ +|!l\xf3`\x94B\x18\xd0\x08%G\x16\x8b\x1bz\ +KP\x10\xc7\xffA\xf6\xebr\ +X\xe0\xf1\xa5\x02K)l#\x1b\x03~\x83ec\xf8\ +\xb8\xd7\xc7\xed\xbf.\x89x\x00n\x11c4\x1f\xf1\x1b\ +\xc9\xef\x06\x08\xa0\x1e*\x1e^(n\xe8\x5c@\x10\xc4\ +y\x80\xd1\x8a\xe5\xc0\xee\xbc\xee\xefr\x08\xe2\xae\xbf#\ +\xe7\xd2\xb1\xfeQ\x1b\xc26\xf7[\xc3\xbfB\x7f\xdd\x7f\ +H@\x01\xac:2\xec\xf3\x91\xcf\x97\xa3\xc4F\x85\x9e\ +\xc7\x02\xc7\x96\x0a\x9cin\x5c/\xa0\x1d\x08\xb4\x86=\ +;,\x9b7\xe5\xc9\xbf\xcb\xa1-<\xbcPL\xc5\xfa\ +\x03\xf8\x0d\xd0!\x7f\xff\xf8\xcf\xf4\xdf\xfd\x87\x84<\x00\ +\x80\x93\x0fpV\x87\xfc\x8d\xdfH\xb6(\x08:\xb9\x80\ +H\xf2\xc0|iC\xd6\x05X\xe2a \xdd\x13\x7f\xf3\ +\xb1_k#\x803-\x97\xa3K\xe9X\x7f\x13A\xd0\ +\xe4\xa45\xfc\xdd\xcc[\xfbo\xfd!!\x05p\xe4\xee\ +7\xb3\xfd\x0e\xb0\x86\xbf\xf7\x9b<\x95t\x8b0\xc4\x0f\ +\xf7\xc9e\x8f'\x96\x0b\x1b\xd2\x0b\x10\x02&\xc7\xf3\xb1\ +_W\x224\x82\x87\xe6\x8b\xd4S\xea$\xf5\x1b\x10\xb6\ +\xf9\x14\xf0@R\xd7Lt'\xc8Z\x0eG>\xff\x90\ +F2\x10\xe2\xb2\xce\x07\xe6J,o\xc0V\xe1\xa2g\ +\xb9e\x8fa|4w\xff\xd7B\x00O,{\x1c]\ +J\xc7@X\x03~\x9d\x86\xd1\x1c\x12\xb2\xf7\xe3\xbf/\ +G\xa2\x0a@*\xdaF\xf3\xa1\xf62\xf54j\x02\x04\ +p\xb6\xed\xf0\xd0|i\xc3m\x0bN\x8e[\x9euP\ +\xe7c\xbf\xd6\xa0\x1b\x22>8_\x22Hx\xe2O\x97\ +\xb0\x0dA\x8b\x07\xb0\xfc3$\xe3\xfeC\x82\x0a`U\ +\x8b\xf0?\x85m\xbe\x10\xa6\x90\x0c\x84\xb8+\xee\xe1\x85\ +\x22'\x1b\xde\x86\xf1\x02,q\xe9\xef\xf6\xe9\xdc\xfa\xaf\ +\x85\xb1\xf0\xd0|)\xbd\xb2q\x0b\xed:F\x87|\xf0\ +5\xdf\xc6SI^:\xf1b\xb0'?\xcfi\x1d\xf2\ +\xc1\xf62Q\x1aoc\xf7t\x97/\x9c)\xd3\xd8@\ +\xc3C\x0b^<\xfb?\xe7B\x04p\xaa\xe9\xf2\xd0B\ +z\xc5b\xa1\x0f\xfe2G\xac\xe1\x83\xef\xbd'\xd9k\ +'\xae\x00v\xdd\x09\xd6\xf0!\xbf\xc1ca\x0as\x02\ + ~\xe8'\x9b.\x0f\xcf\x17\xf3\x11\xe2\x1b\x98\xb8F\ +D\xf2\xf93\xe5\xc4\xa7\xfd\xae\xc6o@\x14\xf0W\xd6\ +\xf4\xbf\xf4\xf7b\x12U\x00\xabj\x02\x1e\x8d|>\xe0\ +\xd7\xd3\xf3H\x8d\x85\xc3\xf3%\x9e\xa8o\x9cP \xe7\ +Bt\xe7\x1d8\x91\xe2;\xa0\x03h/\xf3\xb45|\ +@:\xc9o\x91'\xee\x01\x1c\xb9\xfb\xcdHEd\x0d\ +\xefo/\xf3T\xd2\xfd\x01]V\x87\x02\x8b\xf9\xe4\xa0\ +\x0d\xc9\xd1\xa5B\xec\x05\xa6\xb8\x86v\x1d\xa26\xff\x1b\ +\xf8\x1c$k\xfd!\x05\x05\xb0\x82\xe5\xfe\xc8\xe7\xaf\xdb\ +\xcb\xa9\xad`e\xe0\xc3\x17\xce\x94S\xcb\xfe\xe6$\x8f\ + >\xe3\xef\xbe\xd3\x15Z:=\xd7_\x87\xd0Z\xe2\ +\x94\xd1\xfc\x89\x90\xa4\x92\x16OM\x01\x08\x85o\x0c\xef\ +n/q\x22-/\xa0\xcb\x91\xc5\x02\x0f\xcd\x17\x13=\ +\xf3-'\x1d\xbaq\xff\xe7NWX\xf0\xd3\xf5\xfc\xda\ +\xcb\x10\xb5\xf9\x08\xf0iH\xde\xfaCJ\x0a`\xe5\x83\ +Z>\x13\xfa|\xa0\xbd\x94\xc6*\xce\x13\x1a\xc1\x17\xcf\ +\x96y2\xcf\x07\x0c5\x82\xb8\x18\xec\xfe3\x15\x9e\x5c\ +N\xf7YG\x01\xb4\x169e\x0c\xef\x12\x92\x14\xc6\xe5\ +\xc4\xa4:\x13BH|\xabyWk\x89\xc7\xd3\xaa\x0b\ +\x80\xf3\xf9\x80\xcf\x9e\xaap\xa6\xb5q\x1b\x86\x86\x1dm\ +\x05\x87\xe7J<\xba\x90N\xad\xffj\xda\xcb\x10\xfa|\ + \xe9\xc2\x9f\x8bIM\x01\xac\xfa\xc0\xf7E>\xf7\xb4\ +\x16I\xd5\x05\xef\x9e\xfe\xf2\xd9S\x95\xd4:\xc1r\xfa\ +\xcb\xa3\xe7\x0a|\xe1l9\xf5\xb6\xf0\xc8\x87\xf6\x22'\ +\xac\xe6\x9dB\x92\xd2fxL\xeaS\xa1\x84$\xb2\x86\ +w\xb4\x97\xf9B\x98R\x8f\xc0\xcaZ\x80\x13u\x8f\xcf\ +\x9e\xaa\xe4'\x0c\x0f\x19\xc7\x96<\xee;]\xc1\xd7\x22\ +\xd5\xe7j-4\x17\xb1\xa1\xcf!\xe0^H\xcf\xfaC\ +\xca\x0a`Uy\xf0C:\xe4\x1d\x8d\x05\xfc\xa4\x07\x86\ +\xac\xc5\xe3K\x05\xee\xcd\x95\xc0P\xd0U\xea\xff\xfat\ +5\xb5.\xbf\xd5\x84-h/\xf1\xa05\xfc\xa1\x90\xa4\ +\xd0\x17{!\xa9{\x00G\xee~3\xd2\xc1Z\xc3\xbb\ +\xfd\x06\x1f\xf7\x13\xeb\x83\xba<\xd6\xc2#\x0bE>w\ +\xbaB;e\x8b\x91sc<\xd5p\xf9\xf4\xd3\xd9\x08\ +\xeb\xac\x81\xe69\xb4\x0e\xf9\x93(\xe0AH\xd7\xfaC\ +\x06\x14@\x17!9c4oo,0\x97\xf6\xb6 \ +\xc4\x0d4\x8f,\x14\xf9\xec\xa9*\xad\xdc\x13\x188\xba\ +5\x1e\x9f:Ye.#\xf3 \xdb\xcb\xd0\xae\xf3\xcf\ +\xd6\xf2n\xb7\x88M[\xf8!#\x0a`\xd5\xb6\xe0\xdf\ +\x86m\xfe\xa2y\x0e\x9b\x85=yc\xe1\xe1\xf9b\x9e\ +\x13\x180\xba\xbd\x1e\x9f\xcc\x90\xf0\xeb\x10\x9a\xe7X4\ +\x11o\x13\x82\xe3i\xaf\xa7K&\x14@\x17!i[\ +\xc3\xffh-\xf2\x85\xa0\x91\xf6jb,\xf0\xc8\xb9\x22\ +\x9f:Y\xcd\x0f\x1b\x1d\x10N6\x5c>\xf9T5;\ +[\xba\x16\x9a\xe7 h\xf1>\xe0\xef }\xd7\xbfK\ +f\x14@\xf7\x86\x08\xc1a\x1d\xf2\xb6\xc6\xc2\xc4k\xef\x02x\xccD\xec\x16\x82g\x16\xca\x90\ +\x95'\xb9\x18(\xce\xb6\x1d\xc6\x0a\x9a\x9a\x9b\x8f\xd6\xce\ +\x0a\x828\x5c{\xf4\x5c\x91\xcf<]\xcdTs\x97\x89\ +`\xf9\x0c\xad\xa0\xc5/\x0b\xf8\x1bDv\xac?dL\ +\x01@G\x09\xdc}\x97o-GM\xc8\x8bU\x81)\ +'C\xa7|\xd7C\xc5\xe9\xa6K\xc95\x8cz\x1a\x99\ +\x957m\x83\x22\x80\xb6\x16<0W\xe6\xbe\xd3\x19\xcb\ +\xd5X\xa8\xcfC{\x91\xf7Y\xcb\xaf\x0bA+K\xc2\ +\x0f\x19\x0a\x01.\xa62\xc6\xfdQ\xc8\x7fk\xcc\xb3\x9c\ +\xc6\x14\xe1\xcb\x11\x1f\x1a\xa9\xf8\xe4SU\x0e\xcf\x97\x08\ +M\xbeM\x98\x16\x82\xd8+\xfb\xe4\xc9\x1a\xf7ep\xcb\ +\xb6\xdd\x80\xd69\xbel4\xbf*`>\xed\xf5\xacE\ +\xe6<\x00\x88\xbd\x80\xda\xab\xee\x028bBv`y\ +\x96WF\x88\x8c<]A\xdc@t\xaa\xe9\xd2\x8c\x14\ +\x13\x05MAe`\xdbb\x83 \x88\xf32\xc7\xeb\x1e\ +\x9f~\xba\xca\xf1e\x0fKf\x22E .\xf7]>\ +\xcdR\xe4\xf3\xf3&\xe0o\xa5\x9b-\xd7\xbfK&\x15\ +\x00\xc0\xc4k\xefB\x08\x02kyP\x87\xcdB\xe4\xf33\x02>,2\xb6\xe5\xb7\ +\x16Y\xbd\x97\x970sh\x16k\xd9\xa7\x1c\xdeQ\x9d\ +\xe4\x85\x95\xf1\xec\xae\xde\x02J\xc0t9\xe4\xf6M-\ +vT\x03\x5c\x99\x1f\xcaq\xad\xd4C\xc5#\x0bE\x1e\ +Y\x88\xcf\xeb\xcb2:\x84\xc5\x93\xb4\xfc:\xff\x15\x98\ +E\xe0g]\xf8a\x00<\x80.\x9d\x02\xa1yk8\ +\xa2\x03^\xa4<69\x85\xb4W\xb56\x82X\x09,\ +\x87\x8a\x13u\x8f\xc5@QT\x96\x92k\xf3\xa3\xb9\xae\ +\x82\x00\x02-xl\xa9\xc8g\x9e\xae\xf0\xd8R1\xf5\ +\x1e\xfe\xaba4\xd4\xcf`\xdau\xdem-\xbf$\x04\ +\x8dA\x10~\x18 \x05\xd0)\x10B\x08\x8e\x1b\xcd\xbc\ +\x0ex\xb1S\xa4\x92\xc5\xa4`\x17A<\x86j\xae\xed\ +\xf0d\xdd\xa3\x11JJ\x8e\xa1\xe8\x98\xbc\x80\xe8\x22\x04\ +\x10j\xc1\x93\x0d\x8f{OUyp\xbe\xc4R\xa8V\ +\xfe.\xabX\x0b\x8d9h.\xf0\xd7\xd6\xf0\x93\x02N\ +#\xe2\xf7u\x10\x18\x18\x05\x00+;\x03\x16x\xd0D\ +X\x13\xf1\x22\xb7\x88+3~\xe4U\xb7n\xe0l\xcb\ +\xe5x\xbd\xc0r\xa0(8\x86\xd2\x06W\x04b\xd5\xbd\ +9Q\xf7\xf8\xdc\xe9\x0a_\x9a+3\xd7v2\x9b\xe4\ +\xbb\x80N\x93Oc\x8e\xcf\x19\xcd\x8f\x0ax4k\xa5\ +\xbeWc\xa0\x14\x00\xac$\x05\x8d\x85/\xea\x90\x92\x89\ +\xf8*\xaf\x84#3\xfeI\xba/s\xd0Q\x04O\xd6\ +\x0b,\x05\x0eJ@\xc918\x22\xdb\x96\xae\x1f\xf7\xa2\ +\x19I\x9eX\xf6\xb8\xffL,\xf8g\x07E\xf0;\xb4\ +\x96a\xf9\x0c\x87u\xc4\x9bt\xc0g\xa43X\xc2\x0f\ +\x03\xfc\xceu\x92\x82\x13B\xf2\x1b\xa5\x11\xbe\xab6\x8d\ +R\x19\xf7\x04V\xd3M\x08\x16\x95ek%`\xcf\xa8\ +\xcf\xd6rH\xd95+9\x84a\xa2\xfb\xa2EVp\ +\xceW\x1c_\xf6xb\xd9c\xae\xe5\x10\x0d\x90\xd0w\ +i/\xc3\xf2i\x9e\x0c}\xfe\x13\xf0\xfeA\xc8\xf8\xaf\ +\xc5\x00\x89\xcc\xa5\x888)\xf8\x96\xd6\x22\x8e\x10|G\ +m\x1a\x95uO`\xd5\xda\x01\xf0\xb5\xe0\xf1\xa5\x02\xc7\ +\xeb\x1e\xe3\x05\xcd\x8ej\xc0\xaeZ\xc0D1\xc2\xedl\ +!\x0e\xaa2\xe8~Fm\xa1\x19)N5\x1d\x9eX\ +*p\xaa\xe9P\x0f\xd5J\xf9\xee\xa0\x09\xbf\xdf\x80\xe5\ +\xd3<\x1d\xfa\xfc\x94\x10|\x10\x06S\xf8a\xf0\xee\xfd\ +\x05\xcc\x1c\x9a\x05\x0b\x16vJ\xc9o\x96Fyum\ +\x0a\x99\xf5\x9c\xc0\xe5\xe8\x0aD\xd91L\x96\x22\xb6U\ +\x03\xa6K\x11c\x85\x08O\xd9\x95\x87\x95e\x85\xb0\xda\ +\xd27C\xc9\x99\x96\xc3S\x0d\x8fS\x0d\x87\xa5@\xad\ +\x8c\xe4\x1e\xd4\x17/h\xc2\xd2)\xe6\xc2\x16oA\xf0\ +\x87\x90\xdd2\xdf\xf50\xa8\xcfa\x85N(\x00\xb0K\ +J\xfe{i\x8cW\xd7&\x07W\x09@G\xc0-H\ +\x01\x05\xc70Q\x8c\x98.EL\x97CF\x0b\x9a\x8a\ +cp\xa4\xbd\xe0\xe1\xa5\xa1\x14.\xbe\xbe\xaf\x05\xf5P\ +q\xa6\xe9p\xaa\xe9r\xa6\xe5R\x0f%\xa1\x19l\xa1\ +\xef\xd2\x11\xfe\x85\xa0\xc5\xcf\x09\xf8\xff\x10\x04\x83,\xfc\ +0\xf8\xcf\x04\xb8\xc0\x13\xd8-$o-\x8f\xf2-\xb5\ +)\xd4 +\x81.]\xc1\x16\x80+-E\xc70^\ +\xd0L\x14#6\x95\x22F\xbcX!\xb8\xca\xa2\x84\xbd\ +\xe4\x81\xde\x88b\x10k\xfc\xdev\xbe\x22#\xf0\xb5\xa0\ +\x19I\x16\xda\x0e\x0b\xbe\xc3\xd9Vl\xe5[\x91D\xdb\ +\xb5\x7f\xc6\xa0\xd2\x15\xfe\xb0\xc5/\x02\xbf?(\x85>\ +WcX\x9e\x0f{\xdf3\xdb}AwJ\xc9[\x8b\ +#\xbc\xa66\x85\x93\xe5:\x81\xeb\xa1\xeb\x1d\x08\x01J\ +Z\x8a\xcaRv\x0c5OS\xf34#\x9e\xa6\xea\xc6\ +[\x8cE\x15{\x0aJ\x80\x14\x16q\x85\x9d\x86\xae\xa2\ +\xb06.i66\x9e\xb2\x13\x1aI` \xd0\x92v\ +$\xa9\x87\x92\xe5@\xc5\xff\x0fca\xf7\xf5y\x81\x87\ +!z\xa9:tb\xfe\xf9\xb0\xc5\x7f\xb5\xf0?\xc4\x90\ +\x08?\x0c\xd9\xb3Z\x15\x0el\x15\x82_(\xd6\xf8\xf7\ +\xb5i\xdc,M\x14\xea5v\xf5/D\x5c\x82\xac\x84\ +\xc5S\x96\x822\x14\x94\xc5S\x86\xa2\xb2\xb8\xd2\xe2*\ +\x8b\xc0\x22\xc5\xf9\xa3\xd8\x8c\x15h\x13\xc7\xed\x91\x16\x04\ +F\x10h\x11\x0b\xbf\x16\x84V\x10\x19A\xd4Q\x0ev\ +\xb5[\xc2\x90\xbdD\x17\xe17`\xf9\x14g\x826?\ +'\xe0\x8f\x87\xc5\xf2w\x19\xbag\xb7*\x1c\x98\x12\x82\ +\xb7x\x15\xfe\xc3\xc84\xe5,\xcd\x12H\x02{\xc9/\ +\xb8\xe0i_\xb2\xd5\xb8V\xac \xd6\xfc\xe5\x86\xa1\xb5\ +\x04\xf53<\x19\xfa\xfc\x82\x80w\x22\x08\x87I\xf8a\ +\x88\x9f\xeb\xcc{f\xb1P\x15\xf0&\xaf\xccO\xd6\xa6\ +\xa8y\x95\xb4W\x953\x08X\x0b\xadE\xa8\x9f\xe5\xb1\ +(\xe0\xc7;[}z\xd8\x84\x1f\x06\xb0\x12p\xbd,\ +\xfc\xe5G\x98\xb8\xfb\xae\x00\xb8W\x87\x9c\x0d\xdb\ +\xabC\xfe\xb3\x10|\x180\xc3(\xfc0\xc4\x0a\x00V\ +z\x07B\xe0>\xady\xff\x9d\xd8\xe5_\xda(.\xff\xc5lX\x05\x00\ +\x9d\x90\xc0\x00\x82M\xc0w\xbb\x05\xdeT\x1eggi\ +4\xf7\x06\x86\x91\xa0\x05\x8dy\x02\xbf\xce\xdf\x19\xcd\xaf\ +\x09\xc1\xa7\x19\xd2\xfd\xfd\xf5\xb2\xa1\x15@\x97\x99C\xb3\ +\x00\xcaZ\xbeV*~\xa2P\xe5\xe5\x95q\xbc\xdc\x1b\ +\x18\x0e\x8c\x8e\x0b{\x9a\xe78\x11\xf9\xfc\x9e\xb5\xfc\x11\ +\x96S\x1b!\xcb\x7f5r\x05\xd0a\xe6=\xb3\x98\xb8\ +\xc9fZ\xc0w;\x05~\xa44\xc6\xee\xd2\x08\x0c[\ +C\xd1\x86\xc1\xaeX\xfd\xb6_\xe7\xc3\xc6\xf0;\xc0'\ +\x80h\xa3\xc5\xfa\x97#W\x00\x17\xb1\xf7=\xb17\x00\ +\xa3#\xfe\x02\xcb\xc7\x80\xa7 w\xf5o\x94\ +\x5c\x01\xf4\x90\x8e\x22\x90\xc0v\x04/S\x8a\xff\xcb)\ +\xf2\xb5\xc5\x1a\x9b\xbc28\x85\xdc+X\x0f:\x8a\xdd\ +|\xbfA\x104\xf9\x8a\x0e\xf8\x98\xd1\xfc\x15\xf09`\ +\xc1Zx\xfcu\xb9\xe0\xf7\x82\xfcu\xec\x03{\xfel\ +\x16\xe5\x82\x8e\xa8\x09\xc1\xf3\x84\xe2\xdf:.\xafpK\ +\xec+T(w\xbd\x82\x5c\x19\x9c\xc7h\x88\xda\xe07\ +1A\x93\xa7#\x9f\xcf\x98\x88\xbf\xb1\x96\x8f[\xc3Q\ +!\x88\x16\x16a\xe1\x87r\xc1\xef%\xf9+\xd8g\xf6\ +\xfcy\xbc\x85(\x04\xdb\x11\xbcP*^\xe5\x14x\xae\ +[d\x97W\xc6s\x8bq\xa9\xf1FT\x06&\x82\xd0\ +\x87\xb0\x85\x0e\x9a\xcc\x87>\xf7\x9b\x88\x7f\xb0\x86\xbf\xb7\ +\x96\x07\xdd2\xf5\xe5\x13p\xf2Gr\xa1\xef\x17\x1b\xf0\ +\xb5K\x87\xdd\xef\x9e\xc5-A\xe4S\x02v\x09\xc9\x0b\ +\xa4\xe2\xc5\x8e\xc7W;\x05vy%\xaaN\x11\x1c\xb7\ +\xd3\x898\x84O\xc6\x9a\xd8\xd2\x87m\x08\xdbDA\x8b\ +S\x91\xcf\x97;B\xff/\xd6\xf2\x80\xd1,\x08\x09G\ +\xbf#\x17\xfa$\x106\x1e\x91\xb3r\xee\xa4\xd8\x88\xa6\ +(av\xfe\xd1,\xc5\x09\x08\x9bxB\xb0]H\x9e\ +!%\xcf\x97\x0e\xcfV.\xb7\xba\x056\xbb%\x8a\x8e\ +\xd7\xf1\x0e\xd4`z\x08\xd6\xc6V>\x0a \xf21a\ +\x9bF\xe4sL\x87|\xd1h>a\x0d\xf7Z\xcb\xc3\ +X\x96\x11\xd8<\xaeO\x9e\xae\x02\xe8\xf6\xbb\x85\xb9\x02\ +H\x9e\x9d\xef\x98E\x87\x88B\x85*\x82]B\xf2\x0c\ +\xa9\xb8S*nW.{\x95\xcbf\xb7@Uy(\ +\xc7\x8b=\x84\xac)\x05k\xe2/\x1d\xc5\xa3\xb6\x22\x9f\ +(\x0a\xa8\xeb\x80\x13:\xe4Q\xa3\xb9\xd7\x18\xee\xb7\x86\ +\xc3X\x9e\x1e\xdfE\xfb\xe4\x03p\xf2\x07s\xa1O\x92\ +K\x0c\xbe\xb5\x17\x1e\x09\x93+\x80\xf4\xb9\xe9]\xb3\x04\ +MD\xa1FU\x08\xa6\x84dFH\x0eJ\xc53\xa4\ +\xc3\x8ct\xd8\xa5\x1c\xc6\x94KM\xb9x\xcaAH\xa7\ +\xa3\x18d\xe7\x0b.\x7f\xba'k\xfc9\x5c\xfe$Q\ +\xdb9\x14\xd4\xc4V\xbd\xeb\xca\x9b\x08L\x84\xd5\x11-\ +\x1d\xd0\xd0\x11gu\xc4\x13V\xf3\x15\xa3y\xd8\x1a\xbe\ +l-\x8fY\xc3\x19kh\x02\x1c{C.\xf0i\xd2\ +\x91w\x8f\xf8\x91\x86\xb9\xb4\x0f\x00\x9b\x7fw\x96\xe9\xdb\ +`\xf9\x04.\x82\xb2\x90L\x0a\xc1\xb4\x10\xdc$$;\ +\x84d\xafTl\x93\x8a-R1&\x14\xa3RQ\x90\ +\x0aOH\x1c)QH\xa4\x10H!8\x7f\xa6\xdf\xaa\ +\xf3\x01\xbbB\x8e\xc5X\x83\xb5\xf1\xff\xb55DF\x13\ +ZC\xdbh\xeaF\xb3d5\xf3\xc62g5'\xac\ +\xe1)c8j-'0\x85@`\xe3\x83\x80\x01\ +\x1f\x8b\x01\x9a\xd6\xd2\xc6\xb2d\xa1\x8e\xe1\x9c\xb5\x9c\x03\ +\xceY\xcb\x925,Z\xcb\xb25\xf8: \xd8\xf7\x0a\ +\xcc\xa7\xff'\xb4~9\x17\xf4A\xe4\xff\x00!\xbf\xbf\ +E\xaax=\x13\x00\x00\x00\x00IEND\xaeB`\ \x82\ " qt_resource_name = b"\ \x00\x09\ -\x0a\x6c\x78\x43\ -\x00\x72\ -\x00\x65\x00\x73\x00\x6f\x00\x75\x00\x72\x00\x63\x00\x65\x00\x73\ -\x00\x10\ -\x0a\x2c\xb7\x07\ -\x00\x64\ -\x00\x6f\x00\x6e\x00\x61\x00\x74\x00\x65\x00\x62\x00\x75\x00\x74\x00\x74\x00\x6f\x00\x6e\x00\x2e\x00\x70\x00\x6e\x00\x67\ +\x0alxC\ +\x00r\ +\x00e\x00s\x00o\x00u\x00r\x00c\x00e\x00s\ +\x00\x13\ +\x0f\xce\x16\xa7\ +\x00b\ +\x00t\x00n\x00_\x00d\x00o\x00n\x00a\x00t\x00e\x00C\x00C\x00_\x00L\x00G\x00.\x00p\ +\x00n\x00g\ \x00\x08\ -\x0a\x61\x42\x7f\ -\x00\x69\ -\x00\x63\x00\x6f\x00\x6e\x00\x2e\x00\x69\x00\x63\x00\x6f\ +\x0aaB\x7f\ +\x00i\ +\x00c\x00o\x00n\x00.\x00i\x00c\x00o\ " qt_resource_struct = b"\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x01\x00\x00\x00\x01\ +\x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ +\x00\x00\x00\x00\x00\x00\x00\x00\ +\x00\x00\x00D\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x91\ +\x00\x00\x01}\x07\xd9\xd2m\ \x00\x00\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x00\x3e\x00\x00\x00\x00\x00\x01\x00\x00\x3b\x83\ +\x00\x00\x01}\x07\xd9\xd20\ " def qInitResources(): - QtCore.qRegisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + QtCore.qRegisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) def qCleanupResources(): - QtCore.qUnregisterResourceData(0x01, qt_resource_struct, qt_resource_name, qt_resource_data) + QtCore.qUnregisterResourceData(0x03, qt_resource_struct, qt_resource_name, qt_resource_data) qInitResources() diff --git a/src/screen_region.py b/src/screen_region.py index 44d24af3..27793fb5 100644 --- a/src/screen_region.py +++ b/src/screen_region.py @@ -1,11 +1,14 @@ -from PyQt5 import QtCore, QtGui, QtTest, QtWidgets +from PyQt6 import QtCore, QtGui, QtTest, QtWidgets from win32 import win32gui +from typing import cast, Callable import capture_windows import ctypes import ctypes.wintypes import cv2 import numpy as np +import error_messages + def selectRegion(self): # Create a screen selector widget selector = SelectRegionWidget() @@ -17,7 +20,7 @@ def selectRegion(self): # return an error if width or height are zero. if selector.width == 0 or selector.height == 0: - self.regionSizeError() + error_messages.regionSizeError() return # Width and Height of the spinBox @@ -25,11 +28,11 @@ def selectRegion(self): self.heightSpinBox.setValue(selector.height) # Grab the window handle from the coordinates selected by the widget - self.hwnd = win32gui.WindowFromPoint((selector.left, selector.top)) + self.hwnd = cast(int, win32gui.WindowFromPoint((selector.left, selector.top))) # Want to pull the parent window from the window handle # By using GetAncestor we are able to get the parent window instead # of the owner window. - GetAncestor = ctypes.windll.user32.GetAncestor + GetAncestor = cast(Callable[[int, int], int], ctypes.windll.user32.GetAncestor) GA_ROOT = 2 while win32gui.IsChild(win32gui.GetParent(self.hwnd), self.hwnd): @@ -80,10 +83,9 @@ def selectWindow(self): QtTest.QTest.qWait(1) # Grab the window handle from the coordinates selected by the widget - self.hwnd = None - self.hwnd = win32gui.WindowFromPoint((selector.x, selector.y)) + self.hwnd = cast(int, win32gui.WindowFromPoint((selector.x, selector.y))) - if self.hwnd is None: + if self.hwnd == 0: return del selector @@ -91,7 +93,7 @@ def selectWindow(self): # Want to pull the parent window from the window handle # By using GetAncestor we are able to get the parent window instead # of the owner window. - GetAncestor = ctypes.windll.user32.GetAncestor + GetAncestor = cast(Callable[[int, int], int], ctypes.windll.user32.GetAncestor) GA_ROOT = 2 while win32gui.IsChild(win32gui.GetParent(self.hwnd), self.hwnd): self.hwnd = GetAncestor(self.hwnd, GA_ROOT) @@ -120,12 +122,15 @@ def selectWindow(self): def alignRegion(self): # check to see if a region has been set if self.hwnd == 0 or win32gui.GetWindowText(self.hwnd) == '': - self.regionError() + error_messages.regionError() return # This is the image used for aligning the capture region # to the best fit for the user. - template_filename = str(QtWidgets.QFileDialog.getOpenFileName(self, "Select Reference Image", "", - "Image Files (*.png *.jpg *.jpeg *.jpe *.jp2 *.bmp *.tiff *.tif *.dib *.webp *.pbm *.pgm *.ppm *.sr *.ras)")) + template_filename = str(QtWidgets.QFileDialog.getOpenFileName( + self, + "Select Reference Image", + "", + "Image Files (*.png *.jpg *.jpeg *.jpe *.jp2 *.bmp *.tiff *.tif *.dib *.webp *.pbm *.pgm *.ppm *.sr *.ras)")) # return if the user presses cancel if template_filename == '': @@ -135,7 +140,7 @@ def alignRegion(self): # shouldn't need this, but just for caution, throw a type error if file is not a valid image file if template is None: - self.alignRegionImageTypeError() + error_messages.alignRegionImageTypeError() return # Obtaining the capture of a region which contains the @@ -183,7 +188,7 @@ def alignRegion(self): # Go ahead and check if this satisfies our requirement before setting the region # We don't want a low similarity image to be aligned. if best_match < 0.9: - self.alignmentNotMatchedError() + error_messages.alignmentNotMatchedError() return # The new region can be defined by using the min_loc point and the @@ -221,13 +226,13 @@ def __init__(self): self.setWindowTitle(' ') self.setWindowOpacity(0.5) - self.setWindowFlags(QtCore.Qt.FramelessWindowHint) + self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint) self.show() - def mouseReleaseEvent(self, event): + def mouseReleaseEvent(self, event: QtGui.QMouseEvent): self.close() - self.x = event.pos().x() - self.y = event.pos().y() + self.x = int(event.position().x()) + self.y = int(event.position().y()) # Widget for dragging screen region # https://github.com/harupy/snipping-tool @@ -254,36 +259,36 @@ def __init__(self): self.begin = QtCore.QPoint() self.end = QtCore.QPoint() self.setWindowOpacity(0.5) - QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CrossCursor)) - self.setWindowFlags(QtCore.Qt.FramelessWindowHint) + QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CursorShape.CrossCursor)) + self.setWindowFlags(QtCore.Qt.WindowType.FramelessWindowHint) self.show() - def paintEvent(self, event): + def paintEvent(self, event: QtGui.QPaintEvent): qp = QtGui.QPainter(self) qp.setPen(QtGui.QPen(QtGui.QColor('red'), 2)) qp.setBrush(QtGui.QColor('opaque')) qp.drawRect(QtCore.QRect(self.begin, self.end)) - def mousePressEvent(self, event): - self.begin = event.pos() + def mousePressEvent(self, event: QtGui.QMouseEvent): + self.begin = event.position().toPoint() self.end = self.begin self.update() - def mouseMoveEvent(self, event): - self.end = event.pos() + def mouseMoveEvent(self, event: QtGui.QMouseEvent): + self.end = event.position().toPoint() self.update() - def mouseReleaseEvent(self, event): - QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.ArrowCursor)) + def mouseReleaseEvent(self, event: QtGui.QMouseEvent): + QtWidgets.QApplication.setOverrideCursor(QtGui.QCursor(QtCore.Qt.CursorShape.ArrowCursor)) self.close() # The coordinates are pulled relative to the top left of the set geometry, # so the added virtual screen offsets convert them back to the virtual # screen coordinates - self.left = min(self.begin.x(), self.end.x()) + self.SM_XVIRTUALSCREEN - self.top = min(self.begin.y(), self.end.y()) + self.SM_YVIRTUALSCREEN - self.right = max(self.begin.x(), self.end.x()) + self.SM_XVIRTUALSCREEN - self.bottom = max(self.begin.y(), self.end.y()) + self.SM_YVIRTUALSCREEN + self.left = int(min(self.begin.x(), self.end.x()) + self.SM_XVIRTUALSCREEN) + self.top = int(min(self.begin.y(), self.end.y()) + self.SM_YVIRTUALSCREEN) + self.right = int(max(self.begin.x(), self.end.x()) + self.SM_XVIRTUALSCREEN) + self.bottom = int(max(self.begin.y(), self.end.y()) + self.SM_YVIRTUALSCREEN) self.height = self.bottom - self.top self.width = self.right - self.left diff --git a/src/settings_file.py b/src/settings_file.py index e43575ab..f14035cd 100644 --- a/src/settings_file.py +++ b/src/settings_file.py @@ -1,8 +1,12 @@ from win32 import win32gui -from PyQt5 import QtWidgets +from PyQt6 import QtWidgets import keyboard import pickle import glob +import logging + +from hotkeys import _hotkey_action +import error_messages def getSaveSettingsValues(self): @@ -102,12 +106,13 @@ def saveSettings(self): with open(self.last_successfully_loaded_settings_file_path, 'wb') as f: pickle.dump(self.last_saved_settings, f) + def saveSettingsAs(self): - # user picks save destination - self.save_settings_file_path = str(QtWidgets.QFileDialog.getSaveFileName(self, "Save Settings As", "", "PKL (*.pkl)")) + # User picks save destination + self.save_settings_file_path = QtWidgets.QFileDialog.getSaveFileName(self, "Save Settings As", "", "PKL (*.pkl)")[0] - #if user cancels save destination window, don't save settings - if self.save_settings_file_path == '': + # If user cancels save destination window, don't save settings + if not self.save_settings_file_path: return self.getSaveSettingsValues() @@ -153,11 +158,11 @@ def loadSettings(self): if self.load_settings_on_open: self.settings_files = glob.glob("*.pkl") if len(self.settings_files) < 1: - self.noSettingsFileOnOpenError() + error_messages.noSettingsFileOnOpenError() self.last_loaded_settings = None return elif len(self.settings_files) > 1: - self.tooManySettingsFilesOnOpenError() + error_messages.tooManySettingsFilesOnOpenError() self.last_loaded_settings = None return else: @@ -222,7 +227,7 @@ def loadSettings(self): self.pause_key = '' self.auto_start_on_reset_setting = 0 elif self.settings_count < 18: - self.oldVersionSettingsFileError() + error_messages.oldVersionSettingsFileError() return self.split_image_directory = str(self.split_image_directory) @@ -311,4 +316,4 @@ def loadSettings(self): except Exception: logging.error(logging.traceback.format_exc()) - self.invalidSettingsError() + error_messages.invalidSettingsError() From f763e7372c40f6099e3ba79d6db047cbbea93b51 Mon Sep 17 00:00:00 2001 From: Avasam Date: Tue, 9 Nov 2021 23:14:11 -0500 Subject: [PATCH 8/8] Autostart image Cleaner PyQt6 widgets placements Co-authored-by: KaDiWa4 --- README.md | 16 +- res/design.ui | 305 ++++++------------ scripts/{designer.exe.lnk => Qt Designer.lnk} | Bin 2237 -> 2255 bytes scripts/requirements.txt | 16 +- src/AutoSplit.py | 221 ++++++++++--- src/design.py | 151 ++++----- src/error_messages.py | 4 +- src/hotkeys.py | 10 +- src/menu_bar.py | 5 + src/resources_rc.py | 4 +- 10 files changed, 350 insertions(+), 382 deletions(-) rename scripts/{designer.exe.lnk => Qt Designer.lnk} (61%) diff --git a/README.md b/README.md index 7c71fcf0..3516c748 100644 --- a/README.md +++ b/README.md @@ -12,10 +12,6 @@ This program compares split images to a capture region of any window (OBS, xspli - Windows 7, 10, and 11. -### Building - -- Read [requirements.txt](/scripts/requirements.txt) for information on how to install, run and build the python code. - ### Opening the program - Download the [latest version](/Toufool/Auto-Split/releases) @@ -30,7 +26,7 @@ This program compares split images to a capture region of any window (OBS, xspli - Supported image file types: .png, .jpg, .jpeg, .bmp, and [more](https://docs.opencv.org/3.0-beta/modules/imgcodecs/doc/reading_and_writing_images.html#imread). - Images can be any size. - Images are matched in alphanumerical order. -- Recommended filenaming convention: `001_SplitName.png, 002_SplitName.png, 003_SplitName.png`... +- Recommended filenaming convention: `001_SplitName.png, 002_SplitName.png, 003_SplitName.png`... - Custom split image settings are handled in the filename. See how [here](https://github.com/Toufool/Auto-Split#custom-split-image-settings). - Images can be created using Print Screen, [Snipping Tool](https://support.microsoft.com/en-us/help/4027213/windows-10-open-snipping-tool-and-take-a-screenshot), or AutoSplit's Take Screenshot button. @@ -47,7 +43,7 @@ This program compares split images to a capture region of any window (OBS, xspli ## Max FPS - - Calculates the maximum comparison rate of the capture region to split images. This value will likely be much higher than needed, so it is highly recommended to limit your FPS depending on the frame rate of the game you are capturing. +- Calculates the maximum comparison rate of the capture region to split images. This value will likely be much higher than needed, so it is highly recommended to limit your FPS depending on the frame rate of the game you are capturing. ## OPTIONS @@ -82,9 +78,9 @@ This program compares split images to a capture region of any window (OBS, xspli ### Custom Split Image Settings - Each split image can have different thresholds, pause times, delay split times, loop amounts, and can be flagged. -- These settings are handled in the image's filename. +- These settings are handled in the image's filename. - Custom thresholds are place between parenthesis `()` in the filename and the custom thresholds checkbox must be checked. All images must have a custom threshold if the box is checked. -- Custom pause times are placed between square brackets `[]` in the filename and the custom pause times checkbox must be checked. All images must have a custom threshold if the box is checked. +- Custom pause times are placed between square brackets `[]` in the filename and the custom pause times checkbox must be checked. All images must have a custom threshold if the box is checked. - Custom delay times are placed between hash signs `##` in the filename. Note that these are in milliseconds. For example, a 10 second split delay would be `#10000#`. You cannot skip or undo splits during split delays. - Image loop amounts are placed between at symbols `@@` in the filename. For example, a specific image that you want to split 5 times in a row would be `@5@`. The current loop # is conveniently located beneath the current split image. - Flags are placed between curly brackets `{}` in the filename. Multiple flags are placed in the same set of curly brackets. Current available flags: @@ -93,7 +89,7 @@ This program compares split images to a capture region of any window (OBS, xspli - {m} masked split image. This allows you to customize what you want compared in your split image by using transparency. Transparent pixels in the split image are ignored when comparing. This is useful if only a certain part of the capture region is consistent (for example, consistent text on the screen, but the background is always different). These images MUST be .png and contain transparency. For more on this, see [How to Create a Masked Image](https://github.com/Toufool/Auto-Split/blob/master/README.md#how-to-create-a-masked-image). Histogram or L2 norm comparison is recommended if you use any masked images. It is highly recommended that you do NOT use pHash comparison if you use any masked images, as it is very inaccurate - {p} pause flag. When a split image filename has this flag, it will hit your pause hotkey rather than your split hokey. - A pause flag and a dummy flag `{pd}` cannot be used together -- Filename examples: +- Filename examples: - `001_SplitName_(0.9)_[10].png` is a split image with a threshold of 0.9 and a pause time of 10 seconds. - `002_SplitName_(0.9)_[10]_{d}.png` is the second split image with a threshold of 0.9, pause time of 10, and is a dummy split. - `003_SplitName_(0.85)_[20]_#3500#_{m}.png` is the third split image with a threshold of 0.85, pause time of 20, delay split time of 3.5 seconds and it is a masked image. @@ -120,7 +116,7 @@ You can have one (and only one) image with the keyword `reset` in its name. Auto If this option is disabled, AutoSplit will not account for dummy splits when undoing/skipping. Meaning it will cycle through ths splits normally even if they are dummy splits (this was the normal behavior in versions 1.2.0 and older). -If it is enabled, AutoSplit will group dummy splits together with a real split when undoing/skipping. This basically allows you to tie one or more dummy splits to a real split to keep it in sync with LiveSplit/wsplit. +If it is enabled, AutoSplit will group dummy splits together with a real split when undoing/skipping. This basically allows you to tie one or more dummy splits to a real split to keep it in sync with LiveSplit/wsplit. Examples: Given these splits: 1 dummy, 2 normal, 3 dummy, 4 dummy, 5 normal, 6 normal. diff --git a/res/design.ui b/res/design.ui index 4b151279..76a4ebbe 100644 --- a/res/design.ui +++ b/res/design.ui @@ -6,7 +6,7 @@ 0 0 - 640 + 632 490 @@ -18,13 +18,13 @@ - 640 + 632 490 - 640 + 632 490 @@ -45,8 +45,8 @@ - 80 - 13 + 20 + 12 98 16 @@ -58,9 +58,9 @@ - 187 - 11 - 247 + 130 + 10 + 411 22 @@ -71,7 +71,7 @@ - 443 + 539 9 75 24 @@ -152,7 +152,7 @@ Default value - 160 + 150 390 64 22 @@ -171,9 +171,9 @@ Default value - 510 + 500 425 - 101 + 121 31 @@ -187,9 +187,9 @@ Default value - 510 + 500 385 - 101 + 121 31 @@ -203,9 +203,9 @@ Default value - 477 + 480 250 - 75 + 71 24 @@ -221,7 +221,7 @@ Default value 560 250 - 75 + 61 24 @@ -348,7 +348,7 @@ Default value - 240 + 230 317 58 16 @@ -361,7 +361,7 @@ Default value - 240 + 230 341 28 16 @@ -374,7 +374,7 @@ Default value - 240 + 230 367 48 16 @@ -387,7 +387,7 @@ Default value - 240 + 230 393 55 16 @@ -400,7 +400,7 @@ Default value - 310 + 300 314 81 20 @@ -413,7 +413,7 @@ Default value - 310 + 300 391 81 20 @@ -429,7 +429,7 @@ Default value - 310 + 300 365 81 20 @@ -442,7 +442,7 @@ Default value - 310 + 300 339 81 20 @@ -455,7 +455,7 @@ Default value - 400 + 390 314 71 21 @@ -471,7 +471,7 @@ Default value - 400 + 390 339 71 21 @@ -487,7 +487,7 @@ Default value - 400 + 390 365 71 21 @@ -503,7 +503,7 @@ Default value - 400 + 390 391 71 21 @@ -516,67 +516,10 @@ Default value Set Hotkey - - - - 111 - 247 - 240 - 2 - - - - QFrame::Plain - - - 1 - - - Qt::Horizontal - - - - - - 111 - 68 - 240 - 2 - - - - QFrame::Plain - - - 1 - - - Qt::Horizontal - - - - - - 349 - 69 - 2 - 180 - - - - QFrame::Plain - - - 1 - - - Qt::Vertical - - - 230 + 220 296 2 163 @@ -592,105 +535,10 @@ Default value Qt::Vertical - - - - 110 - 69 - 2 - 180 - - - - QFrame::Plain - - - 1 - - - Qt::Vertical - - - - - - 360 - 69 - 2 - 180 - - - - QFrame::Plain - - - 1 - - - Qt::Vertical - - - - - - 599 - 69 - 2 - 180 - - - - QFrame::Plain - - - 1 - - - Qt::Vertical - - - - - - 361 - 68 - 240 - 2 - - - - QFrame::Plain - - - 1 - - - Qt::Horizontal - - - - - - 361 - 247 - 240 - 2 - - - - QFrame::Plain - - - 1 - - - Qt::Horizontal - - - 310 + 300 293 113 16 @@ -703,7 +551,7 @@ Default value - 500 + 490 296 2 163 @@ -722,12 +570,15 @@ Default value - 111 + 120 69 240 180 + + QFrame::Box + @@ -735,12 +586,15 @@ Default value - 361 + 380 69 240 180 + + QFrame::Box + @@ -748,9 +602,9 @@ Default value - 430 + 450 50 - 221 + 102 16 @@ -838,9 +692,9 @@ Default value - 192 + 200 50 - 81 + 82 16 @@ -892,9 +746,9 @@ Default value - 362 - 271 - 237 + 380 + 270 + 241 20 @@ -992,7 +846,7 @@ Default value 133 299 - 91 + 81 22 @@ -1015,7 +869,7 @@ Default value - 160 + 150 430 64 22 @@ -1063,7 +917,7 @@ Default value - 240 + 230 443 261 20 @@ -1095,7 +949,7 @@ Default value - 362 + 380 252 108 20 @@ -1108,7 +962,7 @@ Default value - 240 + 230 418 31 16 @@ -1121,9 +975,9 @@ Default value - 310 + 300 416 - 82 + 81 20 @@ -1137,7 +991,7 @@ Default value - 400 + 390 416 71 21 @@ -1156,8 +1010,8 @@ Default value - 510 - 314 + 500 + 340 117 20 @@ -1175,8 +1029,8 @@ Default value - 510 - 344 + 500 + 360 126 20 @@ -1191,6 +1045,35 @@ Default value false + + + + 500 + 300 + 121 + 31 + + + + Qt::NoFocus + + + Reload Start Image + + + + + + 120 + 270 + 241 + 16 + + + + Start image: + + splitimagefolderLabel splitimagefolderLineEdit browseButton @@ -1222,15 +1105,7 @@ Default value setresethotkeyButton setskipsplithotkeyButton setundosplithotkeyButton - line_live_bottom - line_live_top - line_live_right line_left - line_live_left - line_split_left - line_split_right - line_split_top - line_split_bottom timerglobalhotkeysLabel line_right currentsplitimageLabel @@ -1261,13 +1136,15 @@ Default value setpausehotkeyButton loopCheckBox autostartonresetCheckBox + startImageReloadButton + startImageLabel 0 0 - 640 + 632 22 diff --git a/scripts/designer.exe.lnk b/scripts/Qt Designer.lnk similarity index 61% rename from scripts/designer.exe.lnk rename to scripts/Qt Designer.lnk index 7cc38a7d6eeea025c8e76279c511110e523bda1d..32ad191e237fd6030e07345c3538a9b6cdd2dde5 100644 GIT binary patch delta 32 ccmdlhcwTVBCuZSz20b8*K_)kUWvxL0t)CuYX5&8#e^SO6@L1vLNw diff --git a/scripts/requirements.txt b/scripts/requirements.txt index 416568eb..5e1c26c9 100644 --- a/scripts/requirements.txt +++ b/scripts/requirements.txt @@ -1,22 +1,26 @@ # Requirements file for AutoSplit # -# Python: CPython 3.7+ +# Python: CPython 3.9+ # -# Usage: pip3.7 install -r requirements.txt +# Usage: .scripts/install.bat # # If you're having issues with the libraries, you might want to first run: -# pip3.7 uninstall -r requirements.txt +# pip3 uninstall -r requirements.txt # -# Creating AutoSplit.exe with PyInstaller: pyinstaller -w -F --hidden-import sip --icon=src\icon.ico src\AutoSplit.py +# Creating AutoSplit.exe with PyInstaller: .scripts/build.bat # # Comment this out if you don't want to create AutoSplit.exe: PyInstaller # +# Comment this out if you don't want to install the PyQt designer +PyQt6-tools +# # Other dependencies: -PyQT5==5.9 +PyQt6 opencv-python Pillow ImageHash -pywin32==226 +pywin32 keyboard pyautogui +PySide6 diff --git a/src/AutoSplit.py b/src/AutoSplit.py index 387ac3e1..26c8031a 100644 --- a/src/AutoSplit.py +++ b/src/AutoSplit.py @@ -6,10 +6,11 @@ import sys import os import cv2 -import time import ctypes.wintypes import ctypes import numpy as np +import threading +import time from hotkeys import send_hotkey from menu_bar import about, VERSION, viewHelp @@ -78,6 +79,7 @@ def __init__(self, parent=None): self.setpausehotkeyButton.clicked.connect(self.setPauseHotkey) self.alignregionButton.clicked.connect(self.alignRegion) self.selectwindowButton.clicked.connect(self.selectWindow) + self.startImageReloadButton.clicked.connect(lambda: self.loadStartImage(True, False)) # update x, y, width, and height when changing the value of these spinbox's are changed self.xSpinBox.valueChanged.connect(self.updateX) @@ -103,7 +105,7 @@ def __init__(self, parent=None): self.hwnd_title = '' self.rect = ctypes.wintypes.RECT() - #last loaded settings and last successful loaded settings file path to None until we try to load them + # Last loaded settings and last successful loaded settings file path to None until we try to load them self.last_loaded_settings = None self.last_successfully_loaded_settings_file_path = None @@ -117,8 +119,19 @@ def __init__(self, parent=None): self.live_image_function_on_open = True + # Automatic timer start + self.timerStartImage = QtCore.QTimer() + self.timerStartImage.timeout.connect(self.startImageFunction) + self.timerStartImage_is_running = False + self.start_image = None + self.highest_similarity = 0.0 + self.check_start_image_timestamp = 0.0 + + # Try to load start image + self.loadStartImage(wait_for_delay=False) + # FUNCTIONS - #TODO add checkbox for going back to image 1 when resetting. + # TODO add checkbox for going back to image 1 when resetting. def browse(self): # User selects the file with the split images in it. self.split_image_directory = str( @@ -166,6 +179,126 @@ def liveImageFunction(self): except AttributeError: pass + def loadStartImage(self, started_by_button=False, wait_for_delay=True): + self.timerStartImage.stop() + self.currentsplitimagefileLabel.setText(' ') + self.startImageLabel.setText("Start image: not found") + QtWidgets.QApplication.processEvents() + + if self.splitimagefolderLineEdit.text() == 'No Folder Selected' \ + or not os.path.exists(self.split_image_directory): + # Only show error messages if the user clicked the button + if started_by_button: + self.splitImageDirectoryError() + return + if self.hwnd == 0 or win32gui.GetWindowText(self.hwnd) == '': + if started_by_button: + self.regionError() + return + + self.start_image_name = None + for image in os.listdir(self.split_image_directory): + if 'start_auto_splitter' in image.lower(): + if self.start_image_name is None: + self.start_image_name = image + else: + if started_by_button: + error_messages.multipleKeywordImagesError('start_auto_splitter') + return + + if self.start_image_name is None: + if started_by_button: + self.noKeywordImageError('start_auto_splitter') + return + + self.split_image_filenames = os.listdir(self.split_image_directory) + self.split_image_number = 0 + self.loop_number = 1 + self.start_image_mask = None + flags = split_parser.flags_from_filename(self.start_image_name) + path = self.split_image_directory + self.start_image_name + # if theres a mask flag, create a mask + if (flags & 0x02 == 0x02): + # create mask based on resized, nearest neighbor interpolated split image + self.start_image = cv2.imread(path, cv2.IMREAD_UNCHANGED) + self.start_image = cv2.resize(self.start_image, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT), + interpolation=cv2.INTER_NEAREST) + lower = np.array([0, 0, 0, 1], dtype="uint8") + upper = np.array([255, 255, 255, 255], dtype="uint8") + self.start_image_mask = cv2.inRange(self.start_image, lower, upper) + + # set split image as BGR + self.start_image = cv2.cvtColor(self.start_image, cv2.COLOR_BGRA2BGR) + + # else if there is no mask flag, open image normally. don't interpolate nearest neighbor here so setups before 1.2.0 still work. + else: + self.start_image = cv2.imread(path, cv2.IMREAD_COLOR) + self.start_image = cv2.resize(self.start_image, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT)) + + start_image_pause = split_parser.pause_from_filename(self.start_image_name) + if wait_for_delay and start_image_pause is not None and start_image_pause > 0: + self.check_start_image_timestamp = time.time() + start_image_pause + self.startImageLabel.setText("Start image: paused") + self.currentSplitImage.setText('none (paused)') + self.currentSplitImage.setAlignment(QtCore.Qt.AlignCenter) + self.highestsimilarityLabel.setText(' ') + else: + self.check_start_image_timestamp = 0.0 + self.startImageLabel.setText("Start image: ready") + self.updateSplitImage(self.start_image_name) + + self.highest_similarity = 0.0 + + self.timerStartImage.start(int(1000 / self.fpslimitSpinBox.value())) + + QtWidgets.QApplication.processEvents() + + def startImageFunction(self): + if time.time() < self.check_start_image_timestamp: + return + + if self.check_start_image_timestamp > 0: + self.check_start_image_timestamp = 0.0 + self.startImageLabel.setText("Start image: ready") + self.updateSplitImage(self.start_image_name) + + start_image_masked = (self.start_image_mask is not None) + capture = self.getCaptureForComparison(start_image_masked) + start_image_similarity = self.compareImage(self.start_image, self.start_image_mask, capture) + start_image_threshold = split_parser.threshold_from_filename(self.start_image_name) \ + or self.similaritythresholdDoubleSpinBox.value() + start_image_split_below_threshold = False + start_image_flags = split_parser.flags_from_filename(self.start_image_name) + start_image_delay = split_parser.delay_from_filename(self.start_image_name) + + if start_image_similarity > self.highest_similarity: + self.highest_similarity = start_image_similarity + + # If the {b} flag is set, let similarity go above threshold first, then split on similarity below threshold + # Otherwise just split when similarity goes above threshold + if start_image_flags & 0x04 == 0x04 \ + and not start_image_split_below_threshold \ + and start_image_similarity >= start_image_threshold: + start_image_split_below_threshold = True + return + if (start_image_flags & 0x04 == 0x04 + and start_image_split_below_threshold + and start_image_similarity < start_image_threshold) \ + or (start_image_similarity >= start_image_threshold and start_image_flags & 0x04 == 0): + def split(): + self.hasSentStart = False + keyboard.send(str(self.splitLineEdit.text())) + time.sleep(1 / self.fpslimitSpinBox.value()) + self.startAutoSplitter() + + self.timerStartImage.stop() + self.startImageLabel.setText("Start image: started") + + if start_image_delay > 0: + threading.Timer(start_image_delay / 1000, split).start() + else: + split() + # update x, y, width, height when spinbox values are changed def updateX(self): try: @@ -324,21 +457,27 @@ def skipSplit(self): return - #def pause(self): - #TODO add what to do when you hit pause hotkey, if this even needs to be done + # def pause(self): + # TODO add what to do when you hit pause hotkey, if this even needs to be done def reset(self): - # when the reset button or hotkey is pressed, it will change this text, which will trigger in the autoSplitter function, if running, to abort and change GUI. + # When the reset button or hotkey is pressed, it will change this text, + # which will trigger in the autoSplitter function, if running, to abort and change GUI. self.startautosplitterButton.setText('Start Auto Splitter') return - # functions for the hotkeys to return to the main thread from signals and start their corresponding functions + # Functions for the hotkeys to return to the main thread from signals and start their corresponding functions def startAutoSplitter(self): - # if the auto splitter is already running or the button is disabled, don't emit the signal to start it. - if self.startautosplitterButton.text() == 'Running..' or self.startautosplitterButton.isEnabled() == False: + self.hasSentStart = True + + # If the auto splitter is already running or the button is disabled, don't emit the signal to start it + if self.startautosplitterButton.text() == 'Running...': return - else: - self.startAutoSplitterSignal.emit() + + if self.startImageLabel.text() == "Start image: ready" or self.startImageLabel.text() == "Start image: paused": + self.startImageLabel.setText("Start image: not ready") + + self.startAutoSplitterSignal.emit() def startReset(self): self.resetSignal.emit() @@ -352,6 +491,15 @@ def startUndoSplit(self): def startPause(self): self.pauseSignal.emit() + def checkForReset(self): + if self.startautosplitterButton.text() == 'Start Auto Splitter': + if self.autostartonresetCheckBox.isChecked(): + self.startAutoSplitterSignal.emit() + else: + self.guiChangesOnReset() + return True + return False + def autoSplitter(self): # error checking: if str(self.splitimagefolderLineEdit.text()) == 'No Folder Selected': @@ -406,7 +554,7 @@ def autoSplitter(self): if split_parser.is_reset_image(image): self.guiChangesOnReset() - error_messages.multipleResetImagesError() + error_messages.multipleKeywordImagesError('reset') return # If there is no reset hotkey set but a reset image is present, throw an error. @@ -477,14 +625,8 @@ def autoSplitter(self): if win32gui.GetWindowText(self.hwnd) == '': self.reset() - # loop goes into here if start auto splitter text is "Start Auto Splitter" - if self.startautosplitterButton.text() == 'Start Auto Splitter': - if self.autostartonresetCheckBox.isChecked(): - self.startAutoSplitterSignal.emit() - return - else: - self.guiChangesOnReset() - return + if self.checkForReset(): + return # calculate similarity for reset image capture = self.getCaptureForComparison() @@ -495,14 +637,8 @@ def autoSplitter(self): send_hotkey(self.resetLineEdit.text()) self.reset() - # loop goes into here if start auto splitter text is "Start Auto Splitter" - if self.startautosplitterButton.text() == 'Start Auto Splitter': - if self.autostartonresetCheckBox.isChecked(): - self.startAutoSplitterSignal.emit() - return - else: - self.guiChangesOnReset() - return + if self.checkForReset(): + return # TODO: Check is this actually still needed? # get capture again if current and reset image have different mask flags @@ -583,13 +719,8 @@ def autoSplitter(self): # check for reset if win32gui.GetWindowText(self.hwnd) == '': self.reset() - if self.startautosplitterButton.text() == 'Start Auto Splitter': - if self.autostartonresetCheckBox.isChecked(): - self.startAutoSplitterSignal.emit() - return - else: - self.guiChangesOnReset() - return + if self.checkForReset(): + return # calculate similarity for reset image if self.shouldCheckResetImage(): @@ -662,13 +793,8 @@ def autoSplitter(self): # check for reset if win32gui.GetWindowText(self.hwnd) == '': self.reset() - if self.startautosplitterButton.text() == 'Start Auto Splitter': - if self.autostartonresetCheckBox.isChecked(): - self.startAutoSplitterSignal.emit() - return - else: - self.guiChangesOnReset() - return + if self.checkForReset(): + return # check for skip/undo split: if self.split_image_number != pause_split_image_number or self.loop_number != pause_loop_number: @@ -690,7 +816,8 @@ def autoSplitter(self): self.guiChangesOnReset() def guiChangesOnStart(self): - self.startautosplitterButton.setText('Running..') + self.timerStartImage.stop() + self.startautosplitterButton.setText('Running...') self.browseButton.setEnabled(False) self.startautosplitterButton.setEnabled(False) self.resetButton.setEnabled(True) @@ -702,6 +829,7 @@ def guiChangesOnStart(self): self.setundosplithotkeyButton.setEnabled(False) self.setpausehotkeyButton.setEnabled(False) self.groupDummySplitsCheckBox.setEnabled(False) + self.startImageReloadButton.setEnabled(False) QtWidgets.QApplication.processEvents() def guiChangesOnReset(self): @@ -722,7 +850,9 @@ def guiChangesOnReset(self): self.setundosplithotkeyButton.setEnabled(True) self.setpausehotkeyButton.setEnabled(True) self.groupDummySplitsCheckBox.setEnabled(True) + self.startImageReloadButton.setEnabled(True) QtWidgets.QApplication.processEvents() + self.loadStartImage(False, False) def compareImage(self, image, mask, capture): if mask is None: @@ -793,10 +923,9 @@ def findResetImage(self): self.reset_image = cv2.imread(path, cv2.IMREAD_COLOR) self.reset_image = cv2.resize(self.reset_image, (self.RESIZE_WIDTH, self.RESIZE_HEIGHT)) - def updateSplitImage(self): - + def updateSplitImage(self, custom_image_file=None): # get split image path - split_image_file = self.split_image_filenames[0 + self.split_image_number] + split_image_file = custom_image_file or self.split_image_filenames[0 + self.split_image_number] self.split_image_path = self.split_image_directory + split_image_file # get flags diff --git a/src/design.py b/src/design.py index 1d3df34b..474ab17a 100644 --- a/src/design.py +++ b/src/design.py @@ -12,14 +12,14 @@ class Ui_MainWindow(object): def setupUi(self, MainWindow): MainWindow.setObjectName("MainWindow") - MainWindow.resize(640, 490) + MainWindow.resize(632, 490) sizePolicy = QtWidgets.QSizePolicy(QtWidgets.QSizePolicy.Policy.Fixed, QtWidgets.QSizePolicy.Policy.Fixed) sizePolicy.setHorizontalStretch(0) sizePolicy.setVerticalStretch(0) sizePolicy.setHeightForWidth(MainWindow.sizePolicy().hasHeightForWidth()) MainWindow.setSizePolicy(sizePolicy) - MainWindow.setMinimumSize(QtCore.QSize(640, 490)) - MainWindow.setMaximumSize(QtCore.QSize(640, 490)) + MainWindow.setMinimumSize(QtCore.QSize(632, 490)) + MainWindow.setMaximumSize(QtCore.QSize(632, 490)) icon = QtGui.QIcon() icon.addPixmap(QtGui.QPixmap("./res\\../../../../VideoAutoSplitter/icon.ico"), QtGui.QIcon.Mode.Normal, QtGui.QIcon.State.Off) MainWindow.setWindowIcon(icon) @@ -28,14 +28,14 @@ def setupUi(self, MainWindow): self.centralwidget = QtWidgets.QWidget(MainWindow) self.centralwidget.setObjectName("centralwidget") self.splitimagefolderLabel = QtWidgets.QLabel(self.centralwidget) - self.splitimagefolderLabel.setGeometry(QtCore.QRect(80, 13, 98, 16)) + self.splitimagefolderLabel.setGeometry(QtCore.QRect(20, 12, 98, 16)) self.splitimagefolderLabel.setObjectName("splitimagefolderLabel") self.splitimagefolderLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.splitimagefolderLineEdit.setGeometry(QtCore.QRect(187, 11, 247, 22)) + self.splitimagefolderLineEdit.setGeometry(QtCore.QRect(130, 10, 411, 22)) self.splitimagefolderLineEdit.setReadOnly(True) self.splitimagefolderLineEdit.setObjectName("splitimagefolderLineEdit") self.browseButton = QtWidgets.QPushButton(self.centralwidget) - self.browseButton.setGeometry(QtCore.QRect(443, 9, 75, 24)) + self.browseButton.setGeometry(QtCore.QRect(539, 9, 75, 24)) self.browseButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.browseButton.setObjectName("browseButton") self.xLabel = QtWidgets.QLabel(self.centralwidget) @@ -55,25 +55,25 @@ def setupUi(self, MainWindow): self.similaritythresholdLabel.setGeometry(QtCore.QRect(10, 380, 102, 32)) self.similaritythresholdLabel.setObjectName("similaritythresholdLabel") self.similaritythresholdDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) - self.similaritythresholdDoubleSpinBox.setGeometry(QtCore.QRect(160, 390, 64, 22)) + self.similaritythresholdDoubleSpinBox.setGeometry(QtCore.QRect(150, 390, 64, 22)) self.similaritythresholdDoubleSpinBox.setMaximum(1.0) self.similaritythresholdDoubleSpinBox.setSingleStep(0.01) self.similaritythresholdDoubleSpinBox.setProperty("value", 0.9) self.similaritythresholdDoubleSpinBox.setObjectName("similaritythresholdDoubleSpinBox") self.startautosplitterButton = QtWidgets.QPushButton(self.centralwidget) - self.startautosplitterButton.setGeometry(QtCore.QRect(510, 425, 101, 31)) + self.startautosplitterButton.setGeometry(QtCore.QRect(500, 425, 121, 31)) self.startautosplitterButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.startautosplitterButton.setObjectName("startautosplitterButton") self.resetButton = QtWidgets.QPushButton(self.centralwidget) - self.resetButton.setGeometry(QtCore.QRect(510, 385, 101, 31)) + self.resetButton.setGeometry(QtCore.QRect(500, 385, 121, 31)) self.resetButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.resetButton.setObjectName("resetButton") self.undosplitButton = QtWidgets.QPushButton(self.centralwidget) - self.undosplitButton.setGeometry(QtCore.QRect(477, 250, 75, 24)) + self.undosplitButton.setGeometry(QtCore.QRect(480, 250, 71, 24)) self.undosplitButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.undosplitButton.setObjectName("undosplitButton") self.skipsplitButton = QtWidgets.QPushButton(self.centralwidget) - self.skipsplitButton.setGeometry(QtCore.QRect(560, 250, 75, 24)) + self.skipsplitButton.setGeometry(QtCore.QRect(560, 250, 61, 24)) self.skipsplitButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.skipsplitButton.setObjectName("skipsplitButton") self.pauseLabel = QtWidgets.QLabel(self.centralwidget) @@ -107,123 +107,77 @@ def setupUi(self, MainWindow): self.highestsimilarityLabel.setText("") self.highestsimilarityLabel.setObjectName("highestsimilarityLabel") self.splitLabel = QtWidgets.QLabel(self.centralwidget) - self.splitLabel.setGeometry(QtCore.QRect(240, 317, 58, 16)) + self.splitLabel.setGeometry(QtCore.QRect(230, 317, 58, 16)) self.splitLabel.setObjectName("splitLabel") self.resetLabel = QtWidgets.QLabel(self.centralwidget) - self.resetLabel.setGeometry(QtCore.QRect(240, 341, 28, 16)) + self.resetLabel.setGeometry(QtCore.QRect(230, 341, 28, 16)) self.resetLabel.setObjectName("resetLabel") self.skiptsplitLabel = QtWidgets.QLabel(self.centralwidget) - self.skiptsplitLabel.setGeometry(QtCore.QRect(240, 367, 48, 16)) + self.skiptsplitLabel.setGeometry(QtCore.QRect(230, 367, 48, 16)) self.skiptsplitLabel.setObjectName("skiptsplitLabel") self.undosplitLabel = QtWidgets.QLabel(self.centralwidget) - self.undosplitLabel.setGeometry(QtCore.QRect(240, 393, 55, 16)) + self.undosplitLabel.setGeometry(QtCore.QRect(230, 393, 55, 16)) self.undosplitLabel.setObjectName("undosplitLabel") self.splitLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.splitLineEdit.setGeometry(QtCore.QRect(310, 314, 81, 20)) + self.splitLineEdit.setGeometry(QtCore.QRect(300, 314, 81, 20)) self.splitLineEdit.setReadOnly(True) self.splitLineEdit.setObjectName("splitLineEdit") self.undosplitLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.undosplitLineEdit.setGeometry(QtCore.QRect(310, 391, 81, 20)) + self.undosplitLineEdit.setGeometry(QtCore.QRect(300, 391, 81, 20)) self.undosplitLineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) self.undosplitLineEdit.setReadOnly(True) self.undosplitLineEdit.setObjectName("undosplitLineEdit") self.skipsplitLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.skipsplitLineEdit.setGeometry(QtCore.QRect(310, 365, 81, 20)) + self.skipsplitLineEdit.setGeometry(QtCore.QRect(300, 365, 81, 20)) self.skipsplitLineEdit.setReadOnly(True) self.skipsplitLineEdit.setObjectName("skipsplitLineEdit") self.resetLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.resetLineEdit.setGeometry(QtCore.QRect(310, 339, 81, 20)) + self.resetLineEdit.setGeometry(QtCore.QRect(300, 339, 81, 20)) self.resetLineEdit.setReadOnly(True) self.resetLineEdit.setObjectName("resetLineEdit") self.setsplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setsplithotkeyButton.setGeometry(QtCore.QRect(400, 314, 71, 21)) + self.setsplithotkeyButton.setGeometry(QtCore.QRect(390, 314, 71, 21)) self.setsplithotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.setsplithotkeyButton.setObjectName("setsplithotkeyButton") self.setresethotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setresethotkeyButton.setGeometry(QtCore.QRect(400, 339, 71, 21)) + self.setresethotkeyButton.setGeometry(QtCore.QRect(390, 339, 71, 21)) self.setresethotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.setresethotkeyButton.setObjectName("setresethotkeyButton") self.setskipsplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setskipsplithotkeyButton.setGeometry(QtCore.QRect(400, 365, 71, 21)) + self.setskipsplithotkeyButton.setGeometry(QtCore.QRect(390, 365, 71, 21)) self.setskipsplithotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.setskipsplithotkeyButton.setObjectName("setskipsplithotkeyButton") self.setundosplithotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setundosplithotkeyButton.setGeometry(QtCore.QRect(400, 391, 71, 21)) + self.setundosplithotkeyButton.setGeometry(QtCore.QRect(390, 391, 71, 21)) self.setundosplithotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.setundosplithotkeyButton.setObjectName("setundosplithotkeyButton") - self.line_live_bottom = QtWidgets.QFrame(self.centralwidget) - self.line_live_bottom.setGeometry(QtCore.QRect(111, 247, 240, 2)) - self.line_live_bottom.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_live_bottom.setLineWidth(1) - self.line_live_bottom.setFrameShape(QtWidgets.QFrame.Shape.HLine) - self.line_live_bottom.setObjectName("line_live_bottom") - self.line_live_top = QtWidgets.QFrame(self.centralwidget) - self.line_live_top.setGeometry(QtCore.QRect(111, 68, 240, 2)) - self.line_live_top.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_live_top.setLineWidth(1) - self.line_live_top.setFrameShape(QtWidgets.QFrame.Shape.HLine) - self.line_live_top.setObjectName("line_live_top") - self.line_live_right = QtWidgets.QFrame(self.centralwidget) - self.line_live_right.setGeometry(QtCore.QRect(349, 69, 2, 180)) - self.line_live_right.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_live_right.setLineWidth(1) - self.line_live_right.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_live_right.setObjectName("line_live_right") self.line_left = QtWidgets.QFrame(self.centralwidget) - self.line_left.setGeometry(QtCore.QRect(230, 296, 2, 163)) + self.line_left.setGeometry(QtCore.QRect(220, 296, 2, 163)) self.line_left.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_left.setLineWidth(1) self.line_left.setFrameShape(QtWidgets.QFrame.Shape.VLine) self.line_left.setObjectName("line_left") - self.line_live_left = QtWidgets.QFrame(self.centralwidget) - self.line_live_left.setGeometry(QtCore.QRect(110, 69, 2, 180)) - self.line_live_left.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_live_left.setLineWidth(1) - self.line_live_left.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_live_left.setObjectName("line_live_left") - self.line_split_left = QtWidgets.QFrame(self.centralwidget) - self.line_split_left.setGeometry(QtCore.QRect(360, 69, 2, 180)) - self.line_split_left.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_split_left.setLineWidth(1) - self.line_split_left.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_split_left.setObjectName("line_split_left") - self.line_split_right = QtWidgets.QFrame(self.centralwidget) - self.line_split_right.setGeometry(QtCore.QRect(599, 69, 2, 180)) - self.line_split_right.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_split_right.setLineWidth(1) - self.line_split_right.setFrameShape(QtWidgets.QFrame.Shape.VLine) - self.line_split_right.setObjectName("line_split_right") - self.line_split_top = QtWidgets.QFrame(self.centralwidget) - self.line_split_top.setGeometry(QtCore.QRect(361, 68, 240, 2)) - self.line_split_top.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_split_top.setLineWidth(1) - self.line_split_top.setFrameShape(QtWidgets.QFrame.Shape.HLine) - self.line_split_top.setObjectName("line_split_top") - self.line_split_bottom = QtWidgets.QFrame(self.centralwidget) - self.line_split_bottom.setGeometry(QtCore.QRect(361, 247, 240, 2)) - self.line_split_bottom.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) - self.line_split_bottom.setLineWidth(1) - self.line_split_bottom.setFrameShape(QtWidgets.QFrame.Shape.HLine) - self.line_split_bottom.setObjectName("line_split_bottom") self.timerglobalhotkeysLabel = QtWidgets.QLabel(self.centralwidget) - self.timerglobalhotkeysLabel.setGeometry(QtCore.QRect(310, 293, 113, 16)) + self.timerglobalhotkeysLabel.setGeometry(QtCore.QRect(300, 293, 113, 16)) self.timerglobalhotkeysLabel.setObjectName("timerglobalhotkeysLabel") self.line_right = QtWidgets.QFrame(self.centralwidget) - self.line_right.setGeometry(QtCore.QRect(500, 296, 2, 163)) + self.line_right.setGeometry(QtCore.QRect(490, 296, 2, 163)) self.line_right.setFrameShadow(QtWidgets.QFrame.Shadow.Plain) self.line_right.setLineWidth(1) self.line_right.setFrameShape(QtWidgets.QFrame.Shape.VLine) self.line_right.setObjectName("line_right") self.liveImage = QtWidgets.QLabel(self.centralwidget) - self.liveImage.setGeometry(QtCore.QRect(111, 69, 240, 180)) + self.liveImage.setGeometry(QtCore.QRect(120, 69, 240, 180)) + self.liveImage.setFrameShape(QtWidgets.QFrame.Shape.Box) self.liveImage.setText("") self.liveImage.setObjectName("liveImage") self.currentSplitImage = QtWidgets.QLabel(self.centralwidget) - self.currentSplitImage.setGeometry(QtCore.QRect(361, 69, 240, 180)) + self.currentSplitImage.setGeometry(QtCore.QRect(380, 69, 240, 180)) + self.currentSplitImage.setFrameShape(QtWidgets.QFrame.Shape.Box) self.currentSplitImage.setText("") self.currentSplitImage.setObjectName("currentSplitImage") self.currentsplitimageLabel = QtWidgets.QLabel(self.centralwidget) - self.currentsplitimageLabel.setGeometry(QtCore.QRect(430, 50, 221, 16)) + self.currentsplitimageLabel.setGeometry(QtCore.QRect(450, 50, 102, 16)) self.currentsplitimageLabel.setObjectName("currentsplitimageLabel") self.widthLabel = QtWidgets.QLabel(self.centralwidget) self.widthLabel.setGeometry(QtCore.QRect(14, 177, 31, 16)) @@ -248,7 +202,7 @@ def setupUi(self, MainWindow): self.heightSpinBox.setProperty("value", 480) self.heightSpinBox.setObjectName("heightSpinBox") self.captureregionLabel = QtWidgets.QLabel(self.centralwidget) - self.captureregionLabel.setGeometry(QtCore.QRect(192, 50, 81, 16)) + self.captureregionLabel.setGeometry(QtCore.QRect(200, 50, 82, 16)) self.captureregionLabel.setObjectName("captureregionLabel") self.fpslimitLabel = QtWidgets.QLabel(self.centralwidget) self.fpslimitLabel.setGeometry(QtCore.QRect(8, 251, 51, 16)) @@ -263,7 +217,7 @@ def setupUi(self, MainWindow): self.fpslimitSpinBox.setProperty("value", 60.0) self.fpslimitSpinBox.setObjectName("fpslimitSpinBox") self.currentsplitimagefileLabel = QtWidgets.QLabel(self.centralwidget) - self.currentsplitimagefileLabel.setGeometry(QtCore.QRect(362, 271, 237, 20)) + self.currentsplitimagefileLabel.setGeometry(QtCore.QRect(380, 270, 241, 20)) self.currentsplitimagefileLabel.setText("") self.currentsplitimagefileLabel.setAlignment(QtCore.Qt.AlignmentFlag.AlignCenter) self.currentsplitimagefileLabel.setObjectName("currentsplitimagefileLabel") @@ -292,13 +246,13 @@ def setupUi(self, MainWindow): self.yLabel.setGeometry(QtCore.QRect(81, 139, 7, 16)) self.yLabel.setObjectName("yLabel") self.comparisonmethodComboBox = QtWidgets.QComboBox(self.centralwidget) - self.comparisonmethodComboBox.setGeometry(QtCore.QRect(133, 299, 91, 22)) + self.comparisonmethodComboBox.setGeometry(QtCore.QRect(133, 299, 81, 22)) self.comparisonmethodComboBox.setObjectName("comparisonmethodComboBox") self.comparisonmethodComboBox.addItem("") self.comparisonmethodComboBox.addItem("") self.comparisonmethodComboBox.addItem("") self.pauseDoubleSpinBox = QtWidgets.QDoubleSpinBox(self.centralwidget) - self.pauseDoubleSpinBox.setGeometry(QtCore.QRect(160, 430, 64, 22)) + self.pauseDoubleSpinBox.setGeometry(QtCore.QRect(150, 430, 64, 22)) self.pauseDoubleSpinBox.setMaximum(999999999.0) self.pauseDoubleSpinBox.setSingleStep(1.0) self.pauseDoubleSpinBox.setProperty("value", 10.0) @@ -311,7 +265,7 @@ def setupUi(self, MainWindow): self.alignregionButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.alignregionButton.setObjectName("alignregionButton") self.groupDummySplitsCheckBox = QtWidgets.QCheckBox(self.centralwidget) - self.groupDummySplitsCheckBox.setGeometry(QtCore.QRect(240, 443, 261, 20)) + self.groupDummySplitsCheckBox.setGeometry(QtCore.QRect(230, 443, 261, 20)) self.groupDummySplitsCheckBox.setChecked(False) self.groupDummySplitsCheckBox.setObjectName("groupDummySplitsCheckBox") self.selectwindowButton = QtWidgets.QPushButton(self.centralwidget) @@ -319,31 +273,38 @@ def setupUi(self, MainWindow): self.selectwindowButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.selectwindowButton.setObjectName("selectwindowButton") self.imageloopLabel = QtWidgets.QLabel(self.centralwidget) - self.imageloopLabel.setGeometry(QtCore.QRect(362, 252, 108, 20)) + self.imageloopLabel.setGeometry(QtCore.QRect(380, 252, 108, 20)) self.imageloopLabel.setObjectName("imageloopLabel") self.pausehotkeyLabel = QtWidgets.QLabel(self.centralwidget) - self.pausehotkeyLabel.setGeometry(QtCore.QRect(240, 418, 31, 16)) + self.pausehotkeyLabel.setGeometry(QtCore.QRect(230, 418, 31, 16)) self.pausehotkeyLabel.setObjectName("pausehotkeyLabel") self.pausehotkeyLineEdit = QtWidgets.QLineEdit(self.centralwidget) - self.pausehotkeyLineEdit.setGeometry(QtCore.QRect(310, 416, 82, 20)) + self.pausehotkeyLineEdit.setGeometry(QtCore.QRect(300, 416, 81, 20)) self.pausehotkeyLineEdit.setFocusPolicy(QtCore.Qt.FocusPolicy.StrongFocus) self.pausehotkeyLineEdit.setReadOnly(True) self.pausehotkeyLineEdit.setObjectName("pausehotkeyLineEdit") self.setpausehotkeyButton = QtWidgets.QPushButton(self.centralwidget) - self.setpausehotkeyButton.setGeometry(QtCore.QRect(400, 416, 71, 21)) + self.setpausehotkeyButton.setGeometry(QtCore.QRect(390, 416, 71, 21)) self.setpausehotkeyButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) self.setpausehotkeyButton.setObjectName("setpausehotkeyButton") self.loopCheckBox = QtWidgets.QCheckBox(self.centralwidget) self.loopCheckBox.setEnabled(True) - self.loopCheckBox.setGeometry(QtCore.QRect(510, 314, 117, 20)) + self.loopCheckBox.setGeometry(QtCore.QRect(500, 340, 117, 20)) self.loopCheckBox.setChecked(False) self.loopCheckBox.setTristate(False) self.loopCheckBox.setObjectName("loopCheckBox") self.autostartonresetCheckBox = QtWidgets.QCheckBox(self.centralwidget) - self.autostartonresetCheckBox.setGeometry(QtCore.QRect(510, 344, 126, 20)) + self.autostartonresetCheckBox.setGeometry(QtCore.QRect(500, 360, 126, 20)) self.autostartonresetCheckBox.setChecked(False) self.autostartonresetCheckBox.setTristate(False) self.autostartonresetCheckBox.setObjectName("autostartonresetCheckBox") + self.startImageReloadButton = QtWidgets.QPushButton(self.centralwidget) + self.startImageReloadButton.setGeometry(QtCore.QRect(500, 300, 121, 31)) + self.startImageReloadButton.setFocusPolicy(QtCore.Qt.FocusPolicy.NoFocus) + self.startImageReloadButton.setObjectName("startImageReloadButton") + self.startImageLabel = QtWidgets.QLabel(self.centralwidget) + self.startImageLabel.setGeometry(QtCore.QRect(120, 270, 241, 16)) + self.startImageLabel.setObjectName("startImageLabel") self.splitimagefolderLabel.raise_() self.splitimagefolderLineEdit.raise_() self.browseButton.raise_() @@ -375,15 +336,7 @@ def setupUi(self, MainWindow): self.setresethotkeyButton.raise_() self.setskipsplithotkeyButton.raise_() self.setundosplithotkeyButton.raise_() - self.line_live_bottom.raise_() - self.line_live_top.raise_() - self.line_live_right.raise_() self.line_left.raise_() - self.line_live_left.raise_() - self.line_split_left.raise_() - self.line_split_right.raise_() - self.line_split_top.raise_() - self.line_split_bottom.raise_() self.timerglobalhotkeysLabel.raise_() self.line_right.raise_() self.currentsplitimageLabel.raise_() @@ -414,9 +367,11 @@ def setupUi(self, MainWindow): self.setpausehotkeyButton.raise_() self.loopCheckBox.raise_() self.autostartonresetCheckBox.raise_() + self.startImageReloadButton.raise_() + self.startImageLabel.raise_() MainWindow.setCentralWidget(self.centralwidget) self.menuBar = QtWidgets.QMenuBar(MainWindow) - self.menuBar.setGeometry(QtCore.QRect(0, 0, 640, 22)) + self.menuBar.setGeometry(QtCore.QRect(0, 0, 632, 22)) self.menuBar.setObjectName("menuBar") self.menuHelp = QtWidgets.QMenu(self.menuBar) self.menuHelp.setObjectName("menuHelp") @@ -512,6 +467,8 @@ def retranslateUi(self, MainWindow): self.setpausehotkeyButton.setText(_translate("MainWindow", "Set Hotkey")) self.loopCheckBox.setText(_translate("MainWindow", "Loop Split Images")) self.autostartonresetCheckBox.setText(_translate("MainWindow", "Auto Start On Reset")) + self.startImageReloadButton.setText(_translate("MainWindow", "Reload Start Image")) + self.startImageLabel.setText(_translate("MainWindow", "Start image:")) self.menuHelp.setTitle(_translate("MainWindow", "Help")) self.menuFile.setTitle(_translate("MainWindow", "File")) self.actionView_Help.setText(_translate("MainWindow", "View Help")) diff --git a/src/error_messages.py b/src/error_messages.py index 17dbc54d..8093e63d 100644 --- a/src/error_messages.py +++ b/src/error_messages.py @@ -45,8 +45,8 @@ def alignmentNotMatchedError(): setTextMessage("No area in capture region matched reference image. Alignment failed.") -def multipleResetImagesError(): - setTextMessage("Only one image with the keyword \"reset\" is allowed.") +def multipleKeywordImagesError(keyword): + setTextMessage(f"Only one image with the keyword \"{keyword}\" is allowed.") def resetHotkeyError(): diff --git a/src/hotkeys.py b/src/hotkeys.py index 9465bdc8..860db280 100644 --- a/src/hotkeys.py +++ b/src/hotkeys.py @@ -113,7 +113,7 @@ def __is_key_already_set(self, key_name): # TODO: Refactor to de-duplicate all this code, including settings_file.py # Going to comment on one func, and others will be similar. def setSplitHotkey(self): - self.setsplithotkeyButton.setText('Press a key..') + self.setsplithotkeyButton.setText('Press a key...') # disable some buttons self.beforeSettingHotkey() @@ -171,7 +171,7 @@ def callback(hotkey): def setResetHotkey(self): - self.setresethotkeyButton.setText('Press a key..') + self.setresethotkeyButton.setText('Press a key...') self.beforeSettingHotkey() def callback(hotkey): @@ -200,7 +200,7 @@ def callback(hotkey): def setSkipSplitHotkey(self): - self.setskipsplithotkeyButton.setText('Press a key..') + self.setskipsplithotkeyButton.setText('Press a key...') self.beforeSettingHotkey() def callback(hotkey): @@ -229,7 +229,7 @@ def callback(hotkey): def setUndoSplitHotkey(self): - self.setundosplithotkeyButton.setText('Press a key..') + self.setundosplithotkeyButton.setText('Press a key...') self.beforeSettingHotkey() def callback(hotkey): @@ -258,7 +258,7 @@ def callback(hotkey): def setPauseHotkey(self): - self.setpausehotkeyButton.setText('Press a key..') + self.setpausehotkeyButton.setText('Press a key...') self.beforeSettingHotkey() def callback(hotkey): diff --git a/src/menu_bar.py b/src/menu_bar.py index 94e48b94..e36a67de 100644 --- a/src/menu_bar.py +++ b/src/menu_bar.py @@ -1,6 +1,11 @@ import os from PyQt6 import QtWidgets import about +import resources_rc + +# AutoSplit Version number +VERSION = "1.5.A4" + # AutoSplit Version number VERSION = "1.5.1" diff --git a/src/resources_rc.py b/src/resources_rc.py index 61d3becf..fb3714ff 100644 --- a/src/resources_rc.py +++ b/src/resources_rc.py @@ -2297,9 +2297,9 @@ \x00\x00\x00\x00\x00\x02\x00\x00\x00\x02\x00\x00\x00\x02\ \x00\x00\x00\x00\x00\x00\x00\x00\ \x00\x00\x00D\x00\x00\x00\x00\x00\x01\x00\x00\x0a\x91\ -\x00\x00\x01}\x07\xd9\xd2m\ +\x00\x00\x01}\x07\xf8'\x92\ \x00\x00\x00\x18\x00\x00\x00\x00\x00\x01\x00\x00\x00\x00\ -\x00\x00\x01}\x07\xd9\xd20\ +\x00\x00\x01}\x07\xf7U\x91\ " def qInitResources():