From 0ba88c1d27dfd3e290a8f94333ad4e815140d261 Mon Sep 17 00:00:00 2001 From: longjunyu2 <877730493@qq.com> Date: Fri, 25 Sep 2020 19:59:18 +0800 Subject: [PATCH 001/312] [commit] --- .idea/.name | 1 - .idea/codeStyles/Project.xml | 1 + .idea/gradle.xml | 11 +- .idea/inspectionProfiles/Project_Default.xml | 19 + .idea/misc.xml | 2 +- .idea/render.experimental.xml | 7 - Q&A.md | 2 - README.md | 76 +- assets/.gitignore | 1 + {sharedmodule => assets}/build.gradle | 14 +- {sharedmodule => assets}/consumer-rules.pro | 0 {sharedmodule => assets}/proguard-rules.pro | 2 +- .../assets/ExampleInstrumentedTest.java | 26 + assets/src/main/AndroidManifest.xml | 5 + .../src/main/res/anim/layout_in_from_left.xml | 0 .../src/main/res/anim/layout_out_to_left.xml | 0 .../ic_account_box_black_24dp.png | Bin .../res/drawable-hdpi/ic_add_black_24dp.png | Bin .../ic_add_circle_outline_black_24dp.png | Bin .../drawable-hdpi/ic_autorenew_black_24dp.png | Bin .../res/drawable-hdpi/ic_build_black_24dp.png | Bin .../drawable-hdpi/ic_cancel_black_24dp.png | Bin .../ic_check_circle_green_a700_36dp.png | Bin .../ic_check_circle_green_a700_48dp.png | Bin .../ic_chevron_left_black_24dp.png | Bin .../res/drawable-hdpi/ic_code_black_24dp.png | Bin .../drawable-hdpi/ic_code_blue_500_24dp.png | Bin .../drawable-hdpi/ic_delete_black_24dp.png | Bin .../res/drawable-hdpi/ic_dns_black_24dp.png | Bin .../drawable-hdpi/ic_extension_black_24dp.png | Bin .../ic_file_download_black_24dp.png | Bin .../drawable-hdpi/ic_gamepad_black_24dp.png | Bin .../ic_gamepad_blue_300_24dp.png | Bin .../ic_help_outline_blue_500_24dp.png | Bin .../res/drawable-hdpi/ic_home_black_24dp.png | Bin .../drawable-hdpi/ic_info_blue_500_24dp.png | Bin .../ic_info_outline_blue_500_24dp.png | Bin .../drawable-hdpi/ic_info_red_500_24dp.png | Bin .../res/drawable-hdpi/ic_input_black_24dp.png | Bin .../ic_insert_drive_file_black_24dp.png | Bin .../drawable-hdpi/ic_joystick_black_24dp.png | Bin .../ic_joystick_blue_300_24dp.png | Bin .../ic_keyboard_backspace_black_24dp.png | Bin .../drawable-hdpi/ic_keyboard_black_24dp.png | Bin .../ic_keyboard_blue_300_24dp.png | Bin .../ic_keyboard_hide_black_24dp.png | Bin .../ic_keyboard_hide_blue_300_24dp.png | Bin .../drawable-hdpi/ic_language_black_24dp.png | Bin .../res/drawable-hdpi/ic_list_black_36dp.png | Bin .../ic_lock_open_blue_500_24dp.png | Bin .../ic_lock_outline_black_24dp.png | Bin .../res/drawable-hdpi/ic_mouse_black_24dp.png | Bin .../drawable-hdpi/ic_mouse_blue_300_24dp.png | Bin .../ic_navigation_black_24dp.png | Bin .../drawable-hdpi/ic_refresh_black_24dp.png | Bin .../ic_remove_circle_black_24dp.png | Bin .../ic_remove_circle_outline_black_24dp.png | Bin .../ic_report_problem_yellow_900_18dp.png | Bin .../ic_report_problem_yellow_900_24dp.png | Bin .../res/drawable-hdpi/ic_save_black_24dp.png | Bin .../ic_sd_storage_black_24dp.png | Bin .../ic_settings_applications_black_18dp.png | Bin .../drawable-hdpi/ic_settings_black_24dp.png | Bin .../drawable-hdpi/ic_unarchive_black_24dp.png | Bin .../res/drawable-hdpi/ic_usb_black_24dp.png | Bin .../drawable-hdpi/ic_usb_blue_300_24dp.png | Bin .../outline_error_outline_orange_800_24dp.png | Bin 0 -> 552 bytes .../ic_account_box_black_24dp.png | Bin .../res/drawable-mdpi/ic_add_black_24dp.png | Bin .../ic_add_circle_outline_black_24dp.png | Bin .../drawable-mdpi/ic_autorenew_black_24dp.png | Bin .../res/drawable-mdpi/ic_build_black_24dp.png | Bin .../drawable-mdpi/ic_cancel_black_24dp.png | Bin .../ic_check_circle_green_a700_36dp.png | Bin .../ic_check_circle_green_a700_48dp.png | Bin .../ic_chevron_left_black_24dp.png | Bin .../res/drawable-mdpi/ic_code_black_24dp.png | Bin .../drawable-mdpi/ic_code_blue_500_24dp.png | Bin .../drawable-mdpi/ic_delete_black_24dp.png | Bin .../res/drawable-mdpi/ic_dns_black_24dp.png | Bin .../drawable-mdpi/ic_extension_black_24dp.png | Bin .../ic_file_download_black_24dp.png | Bin .../drawable-mdpi/ic_gamepad_black_24dp.png | Bin .../ic_gamepad_blue_300_24dp.png | Bin .../ic_help_outline_blue_500_24dp.png | Bin .../res/drawable-mdpi/ic_home_black_24dp.png | Bin .../drawable-mdpi/ic_info_blue_500_24dp.png | Bin .../ic_info_outline_blue_500_24dp.png | Bin .../drawable-mdpi/ic_info_red_500_24dp.png | Bin .../res/drawable-mdpi/ic_input_black_24dp.png | Bin .../ic_insert_drive_file_black_24dp.png | Bin .../drawable-mdpi/ic_joystick_black_24dp.png | Bin .../ic_joystick_blue_300_24dp.png | Bin .../ic_keyboard_backspace_black_24dp.png | Bin .../drawable-mdpi/ic_keyboard_black_24dp.png | Bin .../ic_keyboard_blue_300_24dp.png | Bin .../ic_keyboard_hide_black_24dp.png | Bin .../ic_keyboard_hide_blue_300_24dp.png | Bin .../drawable-mdpi/ic_language_black_24dp.png | Bin .../res/drawable-mdpi/ic_list_black_36dp.png | Bin .../ic_lock_open_blue_500_24dp.png | Bin .../ic_lock_outline_black_24dp.png | Bin .../res/drawable-mdpi/ic_mouse_black_24dp.png | Bin .../drawable-mdpi/ic_mouse_blue_300_24dp.png | Bin .../ic_navigation_black_24dp.png | Bin .../drawable-mdpi/ic_refresh_black_24dp.png | Bin .../ic_remove_circle_black_24dp.png | Bin .../ic_remove_circle_outline_black_24dp.png | Bin .../ic_report_problem_yellow_900_18dp.png | Bin .../ic_report_problem_yellow_900_24dp.png | Bin .../res/drawable-mdpi/ic_save_black_24dp.png | Bin .../ic_sd_storage_black_24dp.png | Bin .../ic_settings_applications_black_18dp.png | Bin .../drawable-mdpi/ic_settings_black_24dp.png | Bin .../drawable-mdpi/ic_unarchive_black_24dp.png | Bin .../res/drawable-mdpi/ic_usb_black_24dp.png | Bin .../drawable-mdpi/ic_usb_blue_300_24dp.png | Bin .../outline_error_outline_orange_800_24dp.png | Bin 0 -> 374 bytes .../ic_account_box_black_24dp.png | Bin .../res/drawable-xhdpi/ic_add_black_24dp.png | Bin .../ic_add_circle_outline_black_24dp.png | Bin .../ic_autorenew_black_24dp.png | Bin .../drawable-xhdpi/ic_build_black_24dp.png | Bin .../drawable-xhdpi/ic_cancel_black_24dp.png | Bin .../ic_check_circle_green_a700_36dp.png | Bin .../ic_check_circle_green_a700_48dp.png | Bin .../ic_chevron_left_black_24dp.png | Bin .../res/drawable-xhdpi/ic_code_black_24dp.png | Bin .../drawable-xhdpi/ic_code_blue_500_24dp.png | Bin .../drawable-xhdpi/ic_delete_black_24dp.png | Bin .../res/drawable-xhdpi/ic_dns_black_24dp.png | Bin .../ic_extension_black_24dp.png | Bin .../ic_file_download_black_24dp.png | Bin .../drawable-xhdpi/ic_gamepad_black_24dp.png | Bin .../ic_gamepad_blue_300_24dp.png | Bin .../ic_help_outline_blue_500_24dp.png | Bin .../res/drawable-xhdpi/ic_home_black_24dp.png | Bin .../drawable-xhdpi/ic_info_blue_500_24dp.png | Bin .../ic_info_outline_blue_500_24dp.png | Bin .../drawable-xhdpi/ic_info_red_500_24dp.png | Bin .../drawable-xhdpi/ic_input_black_24dp.png | Bin .../ic_insert_drive_file_black_24dp.png | Bin .../drawable-xhdpi/ic_joystick_black_24dp.png | Bin .../ic_joystick_blue_300_24dp.png | Bin .../ic_keyboard_backspace_black_24dp.png | Bin .../drawable-xhdpi/ic_keyboard_black_24dp.png | Bin .../ic_keyboard_blue_300_24dp.png | Bin .../ic_keyboard_hide_black_24dp.png | Bin .../ic_keyboard_hide_blue_300_24dp.png | Bin .../drawable-xhdpi/ic_language_black_24dp.png | Bin .../drawable-xhdpi/ic_launcher_background.xml | 0 .../drawable-xhdpi/ic_launcher_foreground.xml | 0 .../res/drawable-xhdpi/ic_list_black_36dp.png | Bin .../ic_lock_open_blue_500_24dp.png | Bin .../ic_lock_outline_black_24dp.png | Bin .../drawable-xhdpi/ic_mouse_black_24dp.png | Bin .../drawable-xhdpi/ic_mouse_blue_300_24dp.png | Bin .../ic_navigation_black_24dp.png | Bin .../drawable-xhdpi/ic_refresh_black_24dp.png | Bin .../ic_remove_circle_black_24dp.png | Bin .../ic_remove_circle_outline_black_24dp.png | Bin .../ic_report_problem_yellow_900_18dp.png | Bin .../ic_report_problem_yellow_900_24dp.png | Bin .../res/drawable-xhdpi/ic_save_black_24dp.png | Bin .../ic_sd_storage_black_24dp.png | Bin .../ic_settings_applications_black_18dp.png | Bin .../drawable-xhdpi/ic_settings_black_24dp.png | Bin .../ic_unarchive_black_24dp.png | Bin .../res/drawable-xhdpi/ic_usb_black_24dp.png | Bin .../drawable-xhdpi/ic_usb_blue_300_24dp.png | Bin .../drawable-xxhdpi/ic_cancel_black_24dp.png | Bin .../ic_check_circle_green_a700_36dp.png | Bin .../ic_check_circle_green_a700_48dp.png | Bin .../drawable-xxhdpi/ic_code_black_24dp.png | Bin .../drawable-xxhdpi/ic_code_blue_500_24dp.png | Bin .../drawable-xxhdpi/ic_gamepad_black_24dp.png | Bin .../ic_gamepad_blue_300_24dp.png | Bin .../ic_help_outline_blue_500_24dp.png | Bin .../ic_joystick_black_24dp.png | Bin .../ic_joystick_blue_300_24dp.png | Bin .../ic_keyboard_black_24dp.png | Bin .../ic_keyboard_blue_300_24dp.png | Bin .../ic_keyboard_hide_black_24dp.png | Bin .../ic_language_black_24dp.png | Bin .../drawable-xxhdpi/ic_list_black_36dp.png | Bin .../ic_lock_open_blue_500_24dp.png | Bin .../ic_lock_outline_black_24dp.png | Bin .../drawable-xxhdpi/ic_mouse_black_24dp.png | Bin .../ic_mouse_blue_300_24dp.png | Bin .../ic_navigation_black_24dp.png | Bin .../ic_report_problem_yellow_900_18dp.png | Bin .../ic_report_problem_yellow_900_24dp.png | Bin .../ic_settings_applications_black_18dp.png | Bin .../res/drawable-xxhdpi/ic_usb_black_24dp.png | Bin .../drawable-xxhdpi/ic_usb_blue_300_24dp.png | Bin .../drawable-xxxhdpi/ic_cancel_black_24dp.png | Bin .../ic_check_circle_green_a700_36dp.png | Bin .../ic_check_circle_green_a700_48dp.png | Bin .../drawable-xxxhdpi/ic_code_black_24dp.png | Bin .../ic_code_blue_500_24dp.png | Bin .../ic_gamepad_black_24dp.png | Bin .../ic_gamepad_blue_300_24dp.png | Bin .../ic_help_outline_blue_500_24dp.png | Bin .../ic_joystick_black_24dp.png | Bin .../ic_joystick_blue_300_24dp.png | Bin .../ic_keyboard_black_24dp.png | Bin .../ic_keyboard_blue_300_24dp.png | Bin .../ic_keyboard_hide_black_24dp.png | Bin .../ic_language_black_24dp.png | Bin .../drawable-xxxhdpi/ic_list_black_36dp.png | Bin .../ic_lock_open_blue_500_24dp.png | Bin .../ic_lock_outline_black_24dp.png | Bin .../drawable-xxxhdpi/ic_mouse_black_24dp.png | Bin .../ic_mouse_blue_300_24dp.png | Bin .../ic_navigation_black_24dp.png | Bin .../ic_report_problem_yellow_900_18dp.png | Bin .../ic_report_problem_yellow_900_24dp.png | Bin .../ic_settings_applications_black_18dp.png | Bin .../drawable-xxxhdpi/ic_usb_black_24dp.png | Bin .../drawable-xxxhdpi/ic_usb_blue_300_24dp.png | Bin .../src/main/res/drawable/alex.png | Bin .../src/main/res/drawable/background.png | Bin .../res/drawable/background_dialog_alpha.xml | 0 .../drawable/background_dialog_noalpha.xml | 0 .../res/drawable/background_dialog_simple.xml | 0 .../res/drawable/background_gray_corner.xml | 14 + .../src/main/res/drawable/backtohome.png | Bin .../src/main/res/drawable/book.png | Bin .../src/main/res/drawable/book_2.png | Bin .../src/main/res/drawable/bookshelf.png | Bin .../src/main/res/drawable/chicken.png | Bin .../src/main/res/drawable/command.png | Bin .../src/main/res/drawable/craft_table.png | Bin .../src/main/res/drawable/forge.png | Bin .../src/main/res/drawable/furnace.png | Bin .../src/main/res/drawable/grass.png | Bin .../src/main/res/drawable/grass_2d.bmp | Bin .../src/main/res/drawable/icon.png | Bin .../src/main/res/drawable/steve.png | Bin .../src/main/res/drawable/steve_pic.bmp | Bin .../src/main/res/drawable/steve_pic_2.png | Bin .../src/main/res/values/colors.xml | 6 +- .../src/main/res/values/dimens.xml | 3 + .../aof/mcinabox/assets/ExampleUnitTest.java | 17 + boat/build.gradle | 34 +- .../cosine/boat/ExampleInstrumentedTest.java | 10 - .../main/java/cosine/boat/BoatActivity.java | 234 ++++ .../java/cosine/boat/BoatClientActivity.java | 1211 ----------------- boat/src/main/java/cosine/boat/BoatInput.java | 51 + .../cosine/boat/BoatInputEventSender.java | 171 --- .../java/cosine/boat/LauncherActivity.java | 49 +- boat/src/main/java/cosine/boat/LoadMe.java | 47 +- .../boat/controller/VirtualController.java | 56 - .../inputers/physcial/CodeTranslation.java | 10 - .../inputers/physcial/Keyboard.java | 48 - .../inputers/physcial/KeyboardSupport.java | 25 - .../controller/inputers/virtual/CrossKey.java | 348 ----- .../cosine/boat/version3/BoatApplication.java | 70 - .../boat/version3/BoatClientActivity.java | 1151 ---------------- .../boat/version3/BoatInputEventSender.java | 55 - .../boat/version3/LauncherActivity.java | 51 - .../java/cosine/boat/version3/LoadMe.java | 63 - boat/src/main/jni/CMakeLists.txt | 21 - boat/src/main/jni/boat3/CMakeLists.txt | 15 - boat/src/main/jni/boat3/boat.c | 130 -- boat/src/main/jni/client3/CMakeLists.txt | 18 - boat/src/main/jni/client3/Client.cpp | 31 - boat/src/main/jni/client3/Client.h | 41 - boat/src/main/jni/client3/Main.cpp | 190 --- boat/src/main/jni/client3/Main.h | 12 - boat/src/main/jni/client3/Server.h | 16 - boat/src/main/jni/client3/boat.h | 10 - boat/src/main/jni/client3/boat_server.h | 41 - boat/src/main/jni/server3/CMakeLists.txt | 16 - boat/src/main/jni/server3/Client.h | 21 - boat/src/main/jni/server3/Server.cpp | 53 - boat/src/main/jni/server3/Server.h | 22 - boat/src/main/jni/server3/boat.h | 10 - boat/src/main/jni/server3/boat_server.h | 31 - boat/src/main/jniLibs/armeabi-v7a/libboat.so | Bin 13484 -> 13800 bytes .../main/jniLibs/armeabi-v7a/libc++_shared.so | Bin 0 -> 657000 bytes .../src/main/jniLibs/armeabi-v7a/libclient.so | Bin 87332 -> 0 bytes .../src/main/jniLibs/armeabi-v7a/libserver.so | Bin 83236 -> 0 bytes .../java/cosine/boat/ExampleUnitTest.java | 5 - build.gradle | 2 +- ckb/.gitignore | 1 + ckb/build.gradle | 34 + ckb/consumer-rules.pro | 0 ckb/proguard-rules.pro | 21 + .../ckb}/ExampleInstrumentedTest.java | 7 +- ckb/src/main/AndroidManifest.xml | 5 + .../ckb/CustomizeKeyboardEditorActivity.java | 273 ++++ .../ckb/achieve/CkbManager.java | 220 +++ .../ckb/achieve/CkbManagerDialog.java | 282 ++++ .../ckb/achieve/GameButtonDialog.java | 687 ++++++++++ .../gamecontroller/ckb/button/GameButton.java | 667 +++++++++ .../ckb/support/CallCustomizeKeyboard.java | 7 + .../ckb/support/CkbThemeMarker.java | 124 ++ .../ckb/support/CkbThemeRecorder.java | 49 + .../ckb/support/GameButtonArray.java | 7 + .../ckb/support/GameButtonRecorder.java | 65 + .../ckb/support/KeyboardRecorder.java | 22 + .../ckb/support/QwertButton.java | 22 + ckb/src/main/res/drawable/selecter_button.xml | 5 + .../res/drawable/selecter_button_normal.xml | 0 .../res/drawable/selecter_button_pressed.xml | 0 ckb/src/main/res/layout/activity_ckbe.xml | 51 + .../dialog_customize_keyboard_config.xml | 273 ++++ .../res/layout/dialog_gamebutton_config.xml | 786 +++++++++++ .../res/layout/dialog_keymap_selecter.xml | 168 +++ ckb/src/main/res/layout/layout_ckbe_main.xml | 7 + ckb/src/main/res/layout/layout_ckbe_sider.xml | 13 + ckb/src/main/res/layout/selecter_keyboard.xml | 993 ++++++++++++++ ckb/src/main/res/values/attrs.xml | 9 + ckb/src/main/res/values/styles.xml | 9 + .../gamecontroller/ckb/ExampleUnitTest.java | 17 + definitions/.gitignore | 1 + definitions/build.gradle | 29 + definitions/consumer-rules.pro | 0 definitions/proguard-rules.pro | 21 + definitions/src/main/AndroidManifest.xml | 5 + .../aof/mcinabox/definitions/id/AppEvent.java | 7 + .../mcinabox/definitions/id/key/KeyEvent.java | 16 + .../mcinabox/definitions/id/key/KeyMode.java | 6 + .../definitions/manifest/AppManifest.java | 82 ++ .../aof/mcinabox/definitions/map/KeyMap.java | 116 ++ .../mcinabox/definitions/map/MouseMap.java | 11 + .../mcinabox/definitions/models/BoatArgs.java | 57 + .../gamecontroller/client/ClientInput.java | 18 + .../controller/BaseController.java | 143 ++ .../gamecontroller/controller/Controller.java | 27 + .../gamecontroller/event}/BaseKeyEvent.java | 25 +- .../mcinabox/gamecontroller/input/Input.java | 17 + .../gamecontroller/input/OnscreenInput.java | 14 + .../gamecontroller/input/OtgInput.java | 9 + filedownloader/.gitignore | 1 + filedownloader/build.gradle | 32 + filedownloader/consumer-rules.pro | 0 filedownloader/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 25 + filedownloader/src/main/AndroidManifest.xml | 5 + .../filedownloader/ExampleUnitTest.java | 17 + gamecontroller/.gitignore | 1 + gamecontroller/build.gradle | 35 + gamecontroller/consumer-rules.pro | 0 gamecontroller/proguard-rules.pro | 21 + .../ExampleInstrumentedTest.java | 26 + gamecontroller/src/main/AndroidManifest.xml | 5 + .../gamecontroller/codes/AndroidKeyMap.java | 132 ++ .../gamecontroller/codes/BoatKeycodes.java | 433 ++++++ .../gamecontroller/codes/BoatMousecodes.java | 13 + .../gamecontroller/codes/GlfwKeyMap.java | 133 ++ .../gamecontroller/codes/LwjglKeyMap.java | 134 ++ .../gamecontroller/codes/Translation.java | 31 + .../gamecontroller/codes/XKeyMap.java | 142 ++ .../controller/HardwareController.java | 79 ++ .../controller/VirtualController.java | 557 ++++++++ .../gamecontroller/input/otg/GamePad.java | 4 + .../gamecontroller/input/otg/Keyboard.java | 94 ++ .../gamecontroller/input/otg/Mouse.java | 4 + .../input/screen/Button/BaseButton.java | 25 + .../input/screen/Button/CrossButton.java | 13 + .../input/screen}/Button/ItemButton.java | 7 +- .../input/screen}/Button/MouseButton.java | 17 +- .../input/screen/Button/QwertButton.java | 31 + .../input/screen/CrossKeyboard.java | 822 +++++++++++ .../input/screen/CustomizeKeyboard.java | 169 +++ .../gamecontroller/input/screen/InputBox.java | 649 +++++++++ .../gamecontroller/input/screen/ItemBar.java | 511 +++++++ .../input/screen/OnscreenJoystick.java | 581 ++++++++ .../input/screen/OnscreenKeyboard.java | 640 +++++++++ .../input/screen/OnscreenMouse.java | 651 +++++++++ .../input/screen/OnscreenTouchpad.java | 607 +++++++++ .../input/sensor/Gyroscope.java | 81 ++ .../res/drawable/background_mouse_pri.xml | 5 + .../drawable/background_mouse_pri_pressed.xml | 16 + .../drawable/background_mouse_pri_release.xml | 16 + .../res/drawable/background_mouse_sec.xml | 5 + .../drawable/background_mouse_sec_pressed.xml | 16 + .../drawable/background_mouse_sec_release.xml | 16 + .../res/drawable/background_mouse_wheel.xml | 13 + .../background_mouse_wheel_button.xml | 13 + .../res/drawable/background_switchbar.xml | 0 .../drawable/background_virtual_edittext.xml | 8 +- .../main/res/drawable/checkbox_crosskey.xml | 0 .../main/res/drawable/checkbox_edittext.xml | 0 .../main/res/drawable/checkbox_joystick.xml | 0 .../src/main/res/drawable/checkbox_lock.xml | 0 .../main/res/drawable/checkbox_mousekey.xml | 0 .../src/main/res/drawable/checkbox_otg.xml | 0 .../res/drawable/checkbox_qwertkeyboard.xml | 0 .../res/drawable/checkbox_virtualkeyboard.xml | 0 .../src/main/res/drawable/control_button.xml | 0 .../res/drawable/control_button_normal.xml | 16 + .../res/drawable/control_button_pressed.xml | 16 + .../src/main/res/drawable/crosskey_shift.xml | 0 .../src/main/res/drawable}/cursor.png | Bin .../src/main/res/drawable/default_area_bg.xml | 0 .../main/res/drawable/default_rocker_bg.xml | 0 .../main/res/drawable/ic_crosskey_down.png | Bin .../res/drawable/ic_crosskey_down_left.png | Bin .../res/drawable/ic_crosskey_down_right.png | Bin .../main/res/drawable/ic_crosskey_jump.png | Bin .../main/res/drawable/ic_crosskey_left.png | Bin .../main/res/drawable/ic_crosskey_right.png | Bin .../res/drawable/ic_crosskey_shift_normal.png | Bin .../drawable/ic_crosskey_shift_pressed.png | Bin .../src/main/res/drawable/ic_crosskey_up.png | Bin .../main/res/drawable/ic_crosskey_up_left.png | Bin .../res/drawable/ic_crosskey_up_right.png | Bin .../main/res/layout/char_input_scanner.xml | 22 + .../layout/dialog_controller_functions.xml | 377 +++++ .../res/layout/dialog_inputbox_config.xml | 260 ++++ .../main/res/layout/dialog_itembar_config.xml | 215 +++ .../dialog_onscreen_crosskeyboard_config.xml | 237 ++++ .../dialog_onscreen_joystick_config.xml | 191 +++ .../dialog_onscreen_keyboard_config.xml | 195 +++ .../layout/dialog_onscreen_mouse_config.xml | 237 ++++ .../dialog_onscreen_touchpad_config.xml | 201 +++ .../res/layout/menu_switch_virtualitem.xml | 0 .../src/main/res/layout/overlay.xml | 27 +- .../src/main/res/layout/virtual_crosskey.xml | 130 ++ .../res/layout/virtual_crosskey_extend.xml | 17 + .../src/main/res/layout/virtual_itembar.xml | 64 +- .../src/main/res/layout/virtual_joystick.xml | 16 +- .../src/main/res/layout/virtual_keyboard.xml | 1170 ++++++++++++++++ .../src/main/res/layout/virtual_mouse.xml | 78 ++ .../src/main/res/layout/virtual_touchpad.xml | 6 + .../src/main/res/values-zh/strings.xml | 1 - gamecontroller/src/main/res/values/attrs.xml | 19 + .../src/main/res/values/dimensions.xml | 4 + .../src/main/res/values/strings.xml | 2 + gamecontroller/src/main/res/values/styles.xml | 9 + .../gamecontroller/ExampleUnitTest.java | 17 + gradle/wrapper/gradle-wrapper.properties | 4 +- jndcrash/.gitignore | 1 + jndcrash/build.gradle | 29 + jndcrash/consumer-rules.pro | 0 jndcrash/proguard-rules.pro | 21 + .../jndcrash/ExampleInstrumentedTest.java | 26 + jndcrash/src/main/AndroidManifest.xml | 5 + .../java/ru/ivanarh/jndcrash/NDCrash.java | 0 .../ru/ivanarh/jndcrash/NDCrashError.java | 0 .../ru/ivanarh/jndcrash/NDCrashService.java | 0 .../ru/ivanarh/jndcrash/NDCrashUnwinder.java | 0 .../ru/ivanarh/jndcrash/NDCrashUtils.java | 0 .../ru/ivanarh/jndcrash/ExampleUnitTest.java | 17 + lwjgl/.gitignore | 1 + lwjgl/build.gradle | 32 + lwjgl/consumer-rules.pro | 0 lwjgl/proguard-rules.pro | 21 + .../org/lwjgl/ExampleInstrumentedTest.java | 26 + .../src/main/AndroidManifest.xml | 5 +- .../src/main/java/org/lwjgl/glfw/GLFW.java | 0 .../main/java/org/lwjgl/input/Keyboard.java | 0 .../test/java/org/lwjgl/ExampleUnitTest.java | 17 + mcinabox/FileDownloader.aar | Bin 0 -> 274379 bytes mcinabox/build.gradle | 25 +- mcinabox/libs/fileDownloader.aar | Bin 0 -> 285825 bytes mcinabox/src/main/AndroidManifest.xml | 31 +- .../com/aof/mcinabox/DataPathManifest.java | 3 - .../java/com/aof/mcinabox/FileChooser.java | 3 +- .../java/com/aof/mcinabox/MainActivity.java | 458 ++----- .../aof/mcinabox/VirtualKeyBoardActivity.java | 585 -------- .../com/aof/mcinabox/launcher/JsonUtils.java | 129 -- .../com/aof/mcinabox/launcher/UrlSource.java | 71 - .../launcher/core/LaunchMinecraft.java | 448 ------ .../com/aof/mcinabox/launcher/core/Utils.java | 14 - .../mcinabox/launcher/dialogs/BaseDialog.java | 29 - .../launcher/dialogs/ContributorsDialog.java | 16 +- .../launcher/dialogs/CreateUserDialog.java | 156 --- .../launcher/dialogs/DownloaderDialog.java | 67 +- .../launcher/dialogs/LanguageDialog.java | 48 - .../launcher/download/DownloadManager.java | 219 +++ .../download/support}/DownloadHelper.java | 8 +- .../download/support/DownloadSupport.java} | 129 +- .../download/support/DownloaderDialog.java | 147 ++ .../launcher/download/support/UrlSource.java | 81 ++ .../launcher/gamedir/GamedirManager.java | 45 + .../aof/mcinabox/launcher/json/ArgsJson.java | 5 - .../mcinabox/launcher/json/KeyboardJson.java | 8 - .../mcinabox/launcher/json/RuntimeJson.java | 67 - .../mcinabox/launcher/json/SettingJson.java | 101 -- .../launcher/keyboard/ConfigDialog.java | 28 - .../launcher/keyboard/GameButton.java | 9 - .../mcinabox/launcher/lang/LangManager.java | 59 + .../launcher/lang/LanguageDialog.java | 45 + .../launcher/lang/support/LanguageUtils.java | 75 + .../launcher/launch/LaunchManager.java | 78 ++ .../launcher/launch/support/AsyncManager.java | 544 ++++++++ .../launcher/launch/support/BoatArgsJson.java | 7 + .../launch/support/BoatArgsMaker.java | 296 ++++ .../launch/support/CheckManifest.java | 153 +++ .../launch/support/FeedBackDialog.java | 31 + .../launcher/launch/support/Utils.java | 293 ++++ .../launcher/runtime/RuntimeManager.java | 152 +++ .../runtime/support/ConditionResolve.java | 69 + .../launcher/runtime/support/Definitions.java | 23 + .../runtime/support/RuntimePackInfo.java | 88 ++ .../launcher/setting/SettingManager.java | 100 ++ .../setting/support/SettingChecker.java | 114 ++ .../launcher/setting/support/SettingJson.java | 286 ++++ .../mcinabox/launcher/theme/ThemeManager.java | 38 + .../launcher/theme/support/ThemeUtils.java | 68 + .../aof/mcinabox/launcher/tipper/Tipper.java | 109 +- .../launcher/tipper/TipperListBean.java | 30 - .../launcher/tipper/TipperManager.java | 84 ++ .../com/aof/mcinabox/launcher/tipper/ids.java | 5 + .../{ => support}/TipperListAdapter.java | 60 +- .../tipper/support/TipperListBean.java | 56 + .../tipper/support/TipperRunable.java | 7 + .../com/aof/mcinabox/launcher/uis/BaseUI.java | 38 +- .../mcinabox/launcher/uis/FunctionbarUI.java | 73 +- .../mcinabox/launcher/uis/GameSettingUI.java | 141 +- .../aof/mcinabox/launcher/uis/GamedirUI.java | 127 +- .../aof/mcinabox/launcher/uis/GamelistUI.java | 86 +- .../launcher/uis/InstallVersionUI.java | 81 +- .../launcher/uis/LauncherSettingUI.java | 194 ++- .../mcinabox/launcher/uis/MainToolbarUI.java | 79 +- .../aof/mcinabox/launcher/uis/PluginUI.java | 29 +- .../mcinabox/launcher/uis/StartGameUI.java | 161 +-- .../com/aof/mcinabox/launcher/uis/UserUI.java | 144 +- .../launcher/uis/achieve/UiManager.java | 137 ++ .../launcher/uis/{ => support}/Utils.java | 3 +- .../launcher/user/CreateUserDialog.java | 114 ++ .../launcher/user/UserListAdapter.java | 153 --- .../mcinabox/launcher/user/UserListBean.java | 40 - .../mcinabox/launcher/user/UserManager.java | 191 +++ .../user/support}/Login.java | 43 +- .../user/support/UserListAdapter.java | 154 +++ .../launcher/user/support/UserListBean.java | 87 ++ .../version/LocalVersionListBean.java | 18 - .../launcher/version/VersionManager.java | 76 ++ .../LocalVersionListAdapter.java | 48 +- .../version/support/LocalVersionListBean.java | 31 + .../minecraft/{ => forge}/ForgeInstaller.java | 41 +- .../java/com/aof/mcinabox/plugin/Plugin.java | 23 - .../aof/mcinabox/plugin/PluginAdapter.java | 4 - .../com/aof/mcinabox/plugin/PluginBean.java | 4 - .../java/com/aof/mcinabox/plugin/Test.java | 27 - .../java/com/aof/mcinabox/plugin/Utils.java | 4 - .../com/aof/mcinabox/utils/ColorUtils.java | 9 - .../com/aof/mcinabox/utils/LanguageUtils.java | 44 - .../java/com/aof/mcinabox/utils/PathTool.java | 60 - .../res/drawable/background_layout_item.xml | 4 +- .../src/main/res/layout/activity_main.xml | 1 + .../res/layout/activity_virtual_keyboard.xml | 6 +- .../src/main/res/layout/dialog_configkey.xml | 406 ------ .../src/main/res/layout/dialog_download.xml | 94 +- .../src/main/res/layout/dialog_languages.xml | 3 +- .../res/layout/dialog_launch_feedback.xml | 52 + .../src/main/res/layout/dialog_loadmodel.xml | 110 -- .../src/main/res/layout/dialog_savemodel.xml | 111 -- .../src/main/res/layout/listview_tipper.xml | 6 +- .../src/main/res/layout/listview_user.xml | 12 +- .../src/main/res/layout/listview_version.xml | 9 +- .../src/main/res/layout/ui_functionbar.xml | 234 ++-- mcinabox/src/main/res/layout/ui_gamedir.xml | 62 +- .../src/main/res/layout/ui_gamesetting.xml | 170 ++- mcinabox/src/main/res/layout/ui_setting.xml | 79 ++ .../src/main/res/layout/ui_toolbar_main.xml | 110 +- mcinabox/src/main/res/values-en/strings.xml | 20 +- mcinabox/src/main/res/values-es/strings.xml | 94 +- .../src/main/res/values-fr-rFR/strings.xml | 172 --- .../src/main/res/values/attrs.xml | 18 +- mcinabox/src/main/res/values/config.xml | 11 - mcinabox/src/main/res/values/keymap_main.xml | 63 - .../src/main/res/values/keymap_special.xml | 13 - mcinabox/src/main/res/values/strings.xml | 26 +- mcinabox/src/main/res/values/styles.xml | 1 + plugin/build.gradle | 10 +- .../plugin/controller/client/Client.java | 22 - .../controller/controller/BaseController.java | 85 -- .../controller/controller/Controller.java | 18 - .../controller/inputer/BaseScreenInputer.java | 11 - .../plugin/controller/inputer/Inputer.java | 11 - .../plugin/controller/keyevent/Event.java | 8 - settings.gradle | 9 +- sharedmodule/.gitignore | 1 - .../aof/sharedmodule/Button/CrossButton.java | 25 - .../aof/sharedmodule/Button/GameButton.java | 82 -- .../aof/sharedmodule/Button/PublicButton.java | 28 - .../aof/sharedmodule/Button/QwertButton.java | 14 - .../sharedmodule/Data/DataPathManifest.java | 82 -- .../com/aof/sharedmodule/Dialog/Helper.java | 17 - .../com/aof/sharedmodule/Model/ArgsModel.java | 35 - .../sharedmodule/Model/KeyboardJsonModel.java | 166 --- .../Tools/Convert_GLFW_LWJGL.java | 130 -- .../aof/sharedmodule/Tools/GLFW_KeyTool.java | 64 - .../src/main/res/drawable-xhdpi/ic_boat.png | Bin 7107 -> 0 bytes .../res/layout/dialog_controller_help.xml | 164 --- .../src/main/res/layout/virtual_crosskey.xml | 164 --- .../src/main/res/layout/virtual_keyboard.xml | 887 ------------ .../src/main/res/layout/virtual_mousekey.xml | 42 - .../src/main/res/values-zh/strings.xml | 11 - sharedmodule/src/main/res/values/colors.xml | 4 - sharedmodule/src/main/res/values/strings.xml | 11 - sharedmodule/src/main/res/values/styles.xml | 14 - .../com/aof/sharedmodule/ExampleUnitTest.java | 1 - utils/.gitignore | 1 + utils/build.gradle | 34 + utils/consumer-rules.pro | 0 .../libs/commons-compress-1.19.jar | Bin {boat => utils}/libs/xz-1.8.jar | Bin utils/proguard-rules.pro | 21 + .../aof/utils/ExampleInstrumentedTest.java | 26 + utils/src/main/AndroidManifest.xml | 5 + .../src/main/java/com/aof/utils/AppUtils.java | 22 + .../main/java/com/aof/utils/BoatUtils.java | 18 +- .../main/java/com/aof/utils}/ColorUtils.java | 2 +- .../java/com/aof/utils/ConversionUtils.java | 66 + .../main/java/com/aof/utils/DisplayUtils.java | 17 + .../main/java/com/aof}/utils/FileTool.java | 104 +- .../main/java/com/aof/utils/FormatUtils.java | 60 + .../main/java/com/aof}/utils/MemoryUtils.java | 7 +- .../src/main/java/com/aof/utils/PicUtils.java | 27 + .../main/java/com/aof/utils/PromptUtils.java | 10 + .../com/aof/utils/dialog/DialogUtils.java | 104 ++ .../utils/dialog/support/DialogSupports.java | 9 + .../aof/utils/dialog/support/TaskDialog.java | 42 + utils/src/main/res/layout/dialog_task.xml | 52 + .../java/com/aof/utils/ExampleUnitTest.java | 17 + 622 files changed, 22603 insertions(+), 10901 deletions(-) delete mode 100644 .idea/.name create mode 100644 .idea/inspectionProfiles/Project_Default.xml delete mode 100644 .idea/render.experimental.xml delete mode 100644 Q&A.md create mode 100644 assets/.gitignore rename {sharedmodule => assets}/build.gradle (60%) rename {sharedmodule => assets}/consumer-rules.pro (100%) rename {sharedmodule => assets}/proguard-rules.pro (94%) create mode 100644 assets/src/androidTest/java/com/aof/mcinabox/assets/ExampleInstrumentedTest.java create mode 100644 assets/src/main/AndroidManifest.xml rename {sharedmodule => assets}/src/main/res/anim/layout_in_from_left.xml (100%) rename {sharedmodule => assets}/src/main/res/anim/layout_out_to_left.xml (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_account_box_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_add_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_add_circle_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_autorenew_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_build_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_cancel_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_check_circle_green_a700_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_check_circle_green_a700_48dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_chevron_left_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_code_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_code_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_delete_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_dns_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_extension_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_file_download_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_gamepad_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_gamepad_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_help_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_home_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_info_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_info_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_info_red_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_input_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_insert_drive_file_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_joystick_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_joystick_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_keyboard_backspace_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_keyboard_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_keyboard_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_keyboard_hide_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_keyboard_hide_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_language_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_list_black_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_lock_open_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_lock_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_mouse_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_mouse_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_navigation_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_remove_circle_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_remove_circle_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_save_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_sd_storage_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_settings_applications_black_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_settings_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_unarchive_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_usb_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-hdpi/ic_usb_blue_300_24dp.png (100%) create mode 100644 assets/src/main/res/drawable-hdpi/outline_error_outline_orange_800_24dp.png rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_account_box_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_add_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_add_circle_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_autorenew_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_build_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_cancel_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_check_circle_green_a700_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_check_circle_green_a700_48dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_chevron_left_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_code_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_code_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_delete_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_dns_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_extension_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_file_download_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_gamepad_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_gamepad_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_help_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_home_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_info_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_info_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_info_red_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_input_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_insert_drive_file_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_joystick_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_joystick_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_keyboard_backspace_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_keyboard_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_keyboard_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_keyboard_hide_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_keyboard_hide_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_language_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_list_black_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_lock_open_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_lock_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_mouse_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_mouse_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_navigation_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_refresh_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_remove_circle_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_remove_circle_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_report_problem_yellow_900_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_report_problem_yellow_900_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_save_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_sd_storage_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_settings_applications_black_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_settings_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_unarchive_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_usb_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-mdpi/ic_usb_blue_300_24dp.png (100%) create mode 100644 assets/src/main/res/drawable-mdpi/outline_error_outline_orange_800_24dp.png rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_account_box_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_add_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_add_circle_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_autorenew_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_build_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_cancel_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_48dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_chevron_left_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_code_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_code_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_dns_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_extension_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_file_download_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_gamepad_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_gamepad_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_help_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_home_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_info_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_info_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_info_red_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_input_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_insert_drive_file_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_joystick_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_joystick_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_keyboard_backspace_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_keyboard_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_keyboard_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_keyboard_hide_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_keyboard_hide_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_language_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_launcher_background.xml (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_launcher_foreground.xml (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_list_black_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_lock_open_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_lock_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_mouse_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_mouse_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_navigation_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_refresh_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_remove_circle_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_remove_circle_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_save_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_sd_storage_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_settings_applications_black_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_unarchive_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_usb_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xhdpi/ic_usb_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_cancel_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_48dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_code_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_code_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_gamepad_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_gamepad_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_help_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_joystick_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_joystick_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_keyboard_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_keyboard_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_keyboard_hide_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_language_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_list_black_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_lock_open_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_lock_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_mouse_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_mouse_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_navigation_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_settings_applications_black_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_usb_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxhdpi/ic_usb_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_cancel_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_48dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_code_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_code_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_gamepad_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_gamepad_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_help_outline_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_joystick_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_joystick_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_keyboard_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_keyboard_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_keyboard_hide_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_language_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_list_black_36dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_lock_open_blue_500_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_lock_outline_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_mouse_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_mouse_blue_300_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_navigation_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_settings_applications_black_18dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_usb_black_24dp.png (100%) rename {sharedmodule => assets}/src/main/res/drawable-xxxhdpi/ic_usb_blue_300_24dp.png (100%) rename {mcinabox => assets}/src/main/res/drawable/alex.png (100%) rename {mcinabox => assets}/src/main/res/drawable/background.png (100%) rename {mcinabox => assets}/src/main/res/drawable/background_dialog_alpha.xml (100%) rename {mcinabox => assets}/src/main/res/drawable/background_dialog_noalpha.xml (100%) rename {sharedmodule => assets}/src/main/res/drawable/background_dialog_simple.xml (100%) create mode 100644 assets/src/main/res/drawable/background_gray_corner.xml rename {mcinabox => assets}/src/main/res/drawable/backtohome.png (100%) rename {mcinabox => assets}/src/main/res/drawable/book.png (100%) rename {mcinabox => assets}/src/main/res/drawable/book_2.png (100%) rename {mcinabox => assets}/src/main/res/drawable/bookshelf.png (100%) rename {mcinabox => assets}/src/main/res/drawable/chicken.png (100%) rename {mcinabox => assets}/src/main/res/drawable/command.png (100%) rename {mcinabox => assets}/src/main/res/drawable/craft_table.png (100%) rename {mcinabox => assets}/src/main/res/drawable/forge.png (100%) rename {mcinabox => assets}/src/main/res/drawable/furnace.png (100%) rename {mcinabox => assets}/src/main/res/drawable/grass.png (100%) rename {mcinabox => assets}/src/main/res/drawable/grass_2d.bmp (100%) rename {mcinabox => assets}/src/main/res/drawable/icon.png (100%) rename {mcinabox => assets}/src/main/res/drawable/steve.png (100%) rename {mcinabox => assets}/src/main/res/drawable/steve_pic.bmp (100%) rename {mcinabox => assets}/src/main/res/drawable/steve_pic_2.png (100%) rename {mcinabox => assets}/src/main/res/values/colors.xml (82%) rename {mcinabox => assets}/src/main/res/values/dimens.xml (77%) create mode 100644 assets/src/test/java/com/aof/mcinabox/assets/ExampleUnitTest.java delete mode 100644 boat/src/androidTest/java/cosine/boat/ExampleInstrumentedTest.java create mode 100644 boat/src/main/java/cosine/boat/BoatActivity.java delete mode 100644 boat/src/main/java/cosine/boat/BoatClientActivity.java create mode 100644 boat/src/main/java/cosine/boat/BoatInput.java delete mode 100644 boat/src/main/java/cosine/boat/BoatInputEventSender.java delete mode 100644 boat/src/main/java/cosine/boat/controller/VirtualController.java delete mode 100644 boat/src/main/java/cosine/boat/controller/inputers/physcial/CodeTranslation.java delete mode 100644 boat/src/main/java/cosine/boat/controller/inputers/physcial/Keyboard.java delete mode 100644 boat/src/main/java/cosine/boat/controller/inputers/physcial/KeyboardSupport.java delete mode 100644 boat/src/main/java/cosine/boat/controller/inputers/virtual/CrossKey.java delete mode 100644 boat/src/main/java/cosine/boat/version3/BoatApplication.java delete mode 100644 boat/src/main/java/cosine/boat/version3/BoatClientActivity.java delete mode 100644 boat/src/main/java/cosine/boat/version3/BoatInputEventSender.java delete mode 100644 boat/src/main/java/cosine/boat/version3/LauncherActivity.java delete mode 100644 boat/src/main/java/cosine/boat/version3/LoadMe.java delete mode 100644 boat/src/main/jni/CMakeLists.txt delete mode 100644 boat/src/main/jni/boat3/CMakeLists.txt delete mode 100644 boat/src/main/jni/boat3/boat.c delete mode 100644 boat/src/main/jni/client3/CMakeLists.txt delete mode 100644 boat/src/main/jni/client3/Client.cpp delete mode 100644 boat/src/main/jni/client3/Client.h delete mode 100644 boat/src/main/jni/client3/Main.cpp delete mode 100644 boat/src/main/jni/client3/Main.h delete mode 100644 boat/src/main/jni/client3/Server.h delete mode 100644 boat/src/main/jni/client3/boat.h delete mode 100644 boat/src/main/jni/client3/boat_server.h delete mode 100644 boat/src/main/jni/server3/CMakeLists.txt delete mode 100644 boat/src/main/jni/server3/Client.h delete mode 100644 boat/src/main/jni/server3/Server.cpp delete mode 100644 boat/src/main/jni/server3/Server.h delete mode 100644 boat/src/main/jni/server3/boat.h delete mode 100644 boat/src/main/jni/server3/boat_server.h create mode 100644 boat/src/main/jniLibs/armeabi-v7a/libc++_shared.so delete mode 100644 boat/src/main/jniLibs/armeabi-v7a/libclient.so delete mode 100644 boat/src/main/jniLibs/armeabi-v7a/libserver.so delete mode 100644 boat/src/test/java/cosine/boat/ExampleUnitTest.java create mode 100644 ckb/.gitignore create mode 100644 ckb/build.gradle create mode 100644 ckb/consumer-rules.pro create mode 100644 ckb/proguard-rules.pro rename {sharedmodule/src/androidTest/java/com/aof/sharedmodule => ckb/src/androidTest/java/com/aof/mcinabox/gamecontroller/ckb}/ExampleInstrumentedTest.java (85%) create mode 100644 ckb/src/main/AndroidManifest.xml create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/CustomizeKeyboardEditorActivity.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManager.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManagerDialog.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/GameButtonDialog.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/button/GameButton.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CallCustomizeKeyboard.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeMarker.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeRecorder.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonArray.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonRecorder.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/KeyboardRecorder.java create mode 100644 ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/QwertButton.java create mode 100644 ckb/src/main/res/drawable/selecter_button.xml rename sharedmodule/src/main/res/drawable/control_button_normal.xml => ckb/src/main/res/drawable/selecter_button_normal.xml (100%) rename sharedmodule/src/main/res/drawable/control_button_pressed.xml => ckb/src/main/res/drawable/selecter_button_pressed.xml (100%) create mode 100644 ckb/src/main/res/layout/activity_ckbe.xml create mode 100644 ckb/src/main/res/layout/dialog_customize_keyboard_config.xml create mode 100644 ckb/src/main/res/layout/dialog_gamebutton_config.xml create mode 100644 ckb/src/main/res/layout/dialog_keymap_selecter.xml create mode 100644 ckb/src/main/res/layout/layout_ckbe_main.xml create mode 100644 ckb/src/main/res/layout/layout_ckbe_sider.xml create mode 100644 ckb/src/main/res/layout/selecter_keyboard.xml create mode 100644 ckb/src/main/res/values/attrs.xml create mode 100644 ckb/src/main/res/values/styles.xml create mode 100644 ckb/src/test/java/com/aof/mcinabox/gamecontroller/ckb/ExampleUnitTest.java create mode 100644 definitions/.gitignore create mode 100644 definitions/build.gradle create mode 100644 definitions/consumer-rules.pro create mode 100644 definitions/proguard-rules.pro create mode 100644 definitions/src/main/AndroidManifest.xml create mode 100644 definitions/src/main/java/com/aof/mcinabox/definitions/id/AppEvent.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/definitions/id/key/KeyEvent.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/definitions/id/key/KeyMode.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/definitions/manifest/AppManifest.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/definitions/map/KeyMap.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/definitions/map/MouseMap.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/definitions/models/BoatArgs.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/gamecontroller/client/ClientInput.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/gamecontroller/controller/BaseController.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/gamecontroller/controller/Controller.java rename {plugin/src/main/java/com/aof/mcinabox/plugin/controller/keyevent => definitions/src/main/java/com/aof/mcinabox/gamecontroller/event}/BaseKeyEvent.java (55%) create mode 100644 definitions/src/main/java/com/aof/mcinabox/gamecontroller/input/Input.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/gamecontroller/input/OnscreenInput.java create mode 100644 definitions/src/main/java/com/aof/mcinabox/gamecontroller/input/OtgInput.java create mode 100644 filedownloader/.gitignore create mode 100644 filedownloader/build.gradle create mode 100644 filedownloader/consumer-rules.pro create mode 100644 filedownloader/proguard-rules.pro create mode 100644 filedownloader/src/androidTest/java/com/liulishuo/filedownloader/ExampleInstrumentedTest.java create mode 100644 filedownloader/src/main/AndroidManifest.xml create mode 100644 filedownloader/src/test/java/com/liulishuo/filedownloader/ExampleUnitTest.java create mode 100644 gamecontroller/.gitignore create mode 100644 gamecontroller/build.gradle create mode 100644 gamecontroller/consumer-rules.pro create mode 100644 gamecontroller/proguard-rules.pro create mode 100644 gamecontroller/src/androidTest/java/com/aof/mcinabox/gamecontroller/ExampleInstrumentedTest.java create mode 100644 gamecontroller/src/main/AndroidManifest.xml create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/codes/AndroidKeyMap.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/codes/BoatKeycodes.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/codes/BoatMousecodes.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/codes/GlfwKeyMap.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/codes/LwjglKeyMap.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/codes/Translation.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/codes/XKeyMap.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/controller/HardwareController.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/controller/VirtualController.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/otg/GamePad.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/otg/Keyboard.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/otg/Mouse.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/Button/BaseButton.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/Button/CrossButton.java rename {sharedmodule/src/main/java/com/aof/sharedmodule => gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen}/Button/ItemButton.java (58%) rename {sharedmodule/src/main/java/com/aof/sharedmodule => gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen}/Button/MouseButton.java (62%) create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/Button/QwertButton.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/CrossKeyboard.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/CustomizeKeyboard.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/InputBox.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/ItemBar.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/OnscreenJoystick.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/OnscreenKeyboard.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/OnscreenMouse.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/screen/OnscreenTouchpad.java create mode 100644 gamecontroller/src/main/java/com/aof/mcinabox/gamecontroller/input/sensor/Gyroscope.java create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_pri.xml create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_pri_pressed.xml create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_pri_release.xml create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_sec.xml create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_sec_pressed.xml create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_sec_release.xml create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_wheel.xml create mode 100644 gamecontroller/src/main/res/drawable/background_mouse_wheel_button.xml rename {sharedmodule => gamecontroller}/src/main/res/drawable/background_switchbar.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/background_virtual_edittext.xml (70%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_crosskey.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_edittext.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_joystick.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_lock.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_mousekey.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_otg.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_qwertkeyboard.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/checkbox_virtualkeyboard.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/control_button.xml (100%) create mode 100644 gamecontroller/src/main/res/drawable/control_button_normal.xml create mode 100644 gamecontroller/src/main/res/drawable/control_button_pressed.xml rename {sharedmodule => gamecontroller}/src/main/res/drawable/crosskey_shift.xml (100%) rename {sharedmodule/src/main/res/drawable-xhdpi => gamecontroller/src/main/res/drawable}/cursor.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/default_area_bg.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/default_rocker_bg.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_down.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_down_left.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_down_right.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_jump.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_left.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_right.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_shift_normal.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_shift_pressed.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_up.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_up_left.png (100%) rename {sharedmodule => gamecontroller}/src/main/res/drawable/ic_crosskey_up_right.png (100%) create mode 100644 gamecontroller/src/main/res/layout/char_input_scanner.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_controller_functions.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_inputbox_config.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_itembar_config.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_onscreen_crosskeyboard_config.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_onscreen_joystick_config.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_onscreen_keyboard_config.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_onscreen_mouse_config.xml create mode 100644 gamecontroller/src/main/res/layout/dialog_onscreen_touchpad_config.xml rename {sharedmodule => gamecontroller}/src/main/res/layout/menu_switch_virtualitem.xml (100%) rename {sharedmodule => gamecontroller}/src/main/res/layout/overlay.xml (76%) create mode 100644 gamecontroller/src/main/res/layout/virtual_crosskey.xml create mode 100644 gamecontroller/src/main/res/layout/virtual_crosskey_extend.xml rename {sharedmodule => gamecontroller}/src/main/res/layout/virtual_itembar.xml (61%) rename {sharedmodule => gamecontroller}/src/main/res/layout/virtual_joystick.xml (68%) create mode 100644 gamecontroller/src/main/res/layout/virtual_keyboard.xml create mode 100644 gamecontroller/src/main/res/layout/virtual_mouse.xml rename {sharedmodule => gamecontroller}/src/main/res/layout/virtual_touchpad.xml (71%) rename sharedmodule/src/main/res/values/dimensions.xml => gamecontroller/src/main/res/values-zh/strings.xml (58%) create mode 100644 gamecontroller/src/main/res/values/attrs.xml create mode 100644 gamecontroller/src/main/res/values/dimensions.xml create mode 100644 gamecontroller/src/main/res/values/strings.xml create mode 100644 gamecontroller/src/main/res/values/styles.xml create mode 100644 gamecontroller/src/test/java/com/aof/mcinabox/gamecontroller/ExampleUnitTest.java create mode 100644 jndcrash/.gitignore create mode 100644 jndcrash/build.gradle create mode 100644 jndcrash/consumer-rules.pro create mode 100644 jndcrash/proguard-rules.pro create mode 100644 jndcrash/src/androidTest/java/ru/ivanarh/jndcrash/ExampleInstrumentedTest.java create mode 100644 jndcrash/src/main/AndroidManifest.xml rename {sharedmodule => jndcrash}/src/main/java/ru/ivanarh/jndcrash/NDCrash.java (100%) rename {sharedmodule => jndcrash}/src/main/java/ru/ivanarh/jndcrash/NDCrashError.java (100%) rename {sharedmodule => jndcrash}/src/main/java/ru/ivanarh/jndcrash/NDCrashService.java (100%) rename {sharedmodule => jndcrash}/src/main/java/ru/ivanarh/jndcrash/NDCrashUnwinder.java (100%) rename {sharedmodule => jndcrash}/src/main/java/ru/ivanarh/jndcrash/NDCrashUtils.java (100%) create mode 100644 jndcrash/src/test/java/ru/ivanarh/jndcrash/ExampleUnitTest.java create mode 100644 lwjgl/.gitignore create mode 100644 lwjgl/build.gradle create mode 100644 lwjgl/consumer-rules.pro create mode 100644 lwjgl/proguard-rules.pro create mode 100644 lwjgl/src/androidTest/java/org/lwjgl/ExampleInstrumentedTest.java rename {sharedmodule => lwjgl}/src/main/AndroidManifest.xml (61%) rename {sharedmodule => lwjgl}/src/main/java/org/lwjgl/glfw/GLFW.java (100%) rename {sharedmodule => lwjgl}/src/main/java/org/lwjgl/input/Keyboard.java (100%) create mode 100644 lwjgl/src/test/java/org/lwjgl/ExampleUnitTest.java create mode 100644 mcinabox/FileDownloader.aar create mode 100644 mcinabox/libs/fileDownloader.aar delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/DataPathManifest.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/VirtualKeyBoardActivity.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/JsonUtils.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/UrlSource.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/core/LaunchMinecraft.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/core/Utils.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/BaseDialog.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/CreateUserDialog.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/LanguageDialog.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/download/DownloadManager.java rename mcinabox/src/main/java/com/aof/mcinabox/{utils/downloader => launcher/download/support}/DownloadHelper.java (74%) rename mcinabox/src/main/java/com/aof/mcinabox/{minecraft/DownloadMinecraft.java => launcher/download/support/DownloadSupport.java} (53%) create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloaderDialog.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/UrlSource.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/gamedir/GamedirManager.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/json/ArgsJson.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/json/KeyboardJson.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/json/RuntimeJson.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/json/SettingJson.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/ConfigDialog.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/GameButton.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LangManager.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LanguageDialog.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/support/LanguageUtils.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/LaunchManager.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/AsyncManager.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsJson.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsMaker.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/CheckManifest.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/FeedBackDialog.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/Utils.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/RuntimeManager.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/ConditionResolve.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/Definitions.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/RuntimePackInfo.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/SettingManager.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingChecker.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingJson.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/ThemeManager.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/support/ThemeUtils.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperListBean.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperManager.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/ids.java rename mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/{ => support}/TipperListAdapter.java (55%) create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperListBean.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperRunable.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/achieve/UiManager.java rename mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/{ => support}/Utils.java (86%) create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/user/CreateUserDialog.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListAdapter.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListBean.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserManager.java rename mcinabox/src/main/java/com/aof/mcinabox/{minecraft => launcher/user/support}/Login.java (81%) create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListAdapter.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListBean.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/version/LocalVersionListBean.java create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/version/VersionManager.java rename mcinabox/src/main/java/com/aof/mcinabox/launcher/version/{ => support}/LocalVersionListAdapter.java (56%) create mode 100644 mcinabox/src/main/java/com/aof/mcinabox/launcher/version/support/LocalVersionListBean.java rename mcinabox/src/main/java/com/aof/mcinabox/minecraft/{ => forge}/ForgeInstaller.java (60%) delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/plugin/Plugin.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginAdapter.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginBean.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/plugin/Test.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/plugin/Utils.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/utils/ColorUtils.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/utils/LanguageUtils.java delete mode 100644 mcinabox/src/main/java/com/aof/mcinabox/utils/PathTool.java delete mode 100644 mcinabox/src/main/res/layout/dialog_configkey.xml create mode 100644 mcinabox/src/main/res/layout/dialog_launch_feedback.xml delete mode 100644 mcinabox/src/main/res/layout/dialog_loadmodel.xml delete mode 100644 mcinabox/src/main/res/layout/dialog_savemodel.xml delete mode 100644 mcinabox/src/main/res/values-fr-rFR/strings.xml rename {sharedmodule => mcinabox}/src/main/res/values/attrs.xml (51%) delete mode 100644 mcinabox/src/main/res/values/keymap_main.xml delete mode 100644 mcinabox/src/main/res/values/keymap_special.xml delete mode 100644 plugin/src/main/java/com/aof/mcinabox/plugin/controller/client/Client.java delete mode 100644 plugin/src/main/java/com/aof/mcinabox/plugin/controller/controller/BaseController.java delete mode 100644 plugin/src/main/java/com/aof/mcinabox/plugin/controller/controller/Controller.java delete mode 100644 plugin/src/main/java/com/aof/mcinabox/plugin/controller/inputer/BaseScreenInputer.java delete mode 100644 plugin/src/main/java/com/aof/mcinabox/plugin/controller/inputer/Inputer.java delete mode 100644 plugin/src/main/java/com/aof/mcinabox/plugin/controller/keyevent/Event.java delete mode 100644 sharedmodule/.gitignore delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Button/CrossButton.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Button/GameButton.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Button/PublicButton.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Button/QwertButton.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Data/DataPathManifest.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Dialog/Helper.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Model/ArgsModel.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Model/KeyboardJsonModel.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Tools/Convert_GLFW_LWJGL.java delete mode 100644 sharedmodule/src/main/java/com/aof/sharedmodule/Tools/GLFW_KeyTool.java delete mode 100644 sharedmodule/src/main/res/drawable-xhdpi/ic_boat.png delete mode 100644 sharedmodule/src/main/res/layout/dialog_controller_help.xml delete mode 100644 sharedmodule/src/main/res/layout/virtual_crosskey.xml delete mode 100644 sharedmodule/src/main/res/layout/virtual_keyboard.xml delete mode 100644 sharedmodule/src/main/res/layout/virtual_mousekey.xml delete mode 100644 sharedmodule/src/main/res/values-zh/strings.xml delete mode 100644 sharedmodule/src/main/res/values/colors.xml delete mode 100644 sharedmodule/src/main/res/values/strings.xml delete mode 100644 sharedmodule/src/main/res/values/styles.xml delete mode 100644 sharedmodule/src/test/java/com/aof/sharedmodule/ExampleUnitTest.java create mode 100644 utils/.gitignore create mode 100644 utils/build.gradle create mode 100644 utils/consumer-rules.pro rename {boat => utils}/libs/commons-compress-1.19.jar (100%) rename {boat => utils}/libs/xz-1.8.jar (100%) create mode 100644 utils/proguard-rules.pro create mode 100644 utils/src/androidTest/java/com/aof/utils/ExampleInstrumentedTest.java create mode 100644 utils/src/main/AndroidManifest.xml create mode 100644 utils/src/main/java/com/aof/utils/AppUtils.java rename boat/src/main/java/cosine/boat/Utils.java => utils/src/main/java/com/aof/utils/BoatUtils.java (92%) rename {sharedmodule/src/main/java/com/aof/sharedmodule/Tools => utils/src/main/java/com/aof/utils}/ColorUtils.java (99%) create mode 100644 utils/src/main/java/com/aof/utils/ConversionUtils.java create mode 100644 utils/src/main/java/com/aof/utils/DisplayUtils.java rename {mcinabox/src/main/java/com/aof/mcinabox => utils/src/main/java/com/aof}/utils/FileTool.java (75%) create mode 100644 utils/src/main/java/com/aof/utils/FormatUtils.java rename {mcinabox/src/main/java/com/aof/mcinabox => utils/src/main/java/com/aof}/utils/MemoryUtils.java (80%) create mode 100644 utils/src/main/java/com/aof/utils/PicUtils.java create mode 100644 utils/src/main/java/com/aof/utils/PromptUtils.java create mode 100644 utils/src/main/java/com/aof/utils/dialog/DialogUtils.java create mode 100644 utils/src/main/java/com/aof/utils/dialog/support/DialogSupports.java create mode 100644 utils/src/main/java/com/aof/utils/dialog/support/TaskDialog.java create mode 100644 utils/src/main/res/layout/dialog_task.xml create mode 100644 utils/src/test/java/com/aof/utils/ExampleUnitTest.java diff --git a/.idea/.name b/.idea/.name deleted file mode 100644 index 2791bf9a..00000000 --- a/.idea/.name +++ /dev/null @@ -1 +0,0 @@ -MCinaBox \ No newline at end of file diff --git a/.idea/codeStyles/Project.xml b/.idea/codeStyles/Project.xml index 264b2220..681f41ae 100644 --- a/.idea/codeStyles/Project.xml +++ b/.idea/codeStyles/Project.xml @@ -94,6 +94,7 @@ http://schemas.android.com/apk/res/android + ANDROID_ATTRIBUTE_ORDER
diff --git a/.idea/gradle.xml b/.idea/gradle.xml index 8651af59..fb31af9b 100644 --- a/.idea/gradle.xml +++ b/.idea/gradle.xml @@ -4,19 +4,26 @@ diff --git a/.idea/inspectionProfiles/Project_Default.xml b/.idea/inspectionProfiles/Project_Default.xml new file mode 100644 index 00000000..c34a8235 --- /dev/null +++ b/.idea/inspectionProfiles/Project_Default.xml @@ -0,0 +1,19 @@ + + + + \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml index 892046b8..37a75096 100644 --- a/.idea/misc.xml +++ b/.idea/misc.xml @@ -1,6 +1,6 @@ - + diff --git a/.idea/render.experimental.xml b/.idea/render.experimental.xml deleted file mode 100644 index 53769a05..00000000 --- a/.idea/render.experimental.xml +++ /dev/null @@ -1,7 +0,0 @@ - - - - - \ No newline at end of file diff --git a/Q&A.md b/Q&A.md deleted file mode 100644 index 70a934c1..00000000 --- a/Q&A.md +++ /dev/null @@ -1,2 +0,0 @@ -##I'm still writing
-我还在写 diff --git a/README.md b/README.md index f10211a2..13701af2 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,9 @@ # MCinaBox - A Minecraft Java Edition Launcher on Android -[Now is English] [切换为简体中文](./README_zh-cn.md) +现在是简体中文[Change to English](./README_en.md)
+Other languages are still being translated. Please be patient(Software and some page) ## Warning - There is a problem with the latest source code. Some functions are not working properly. -- Because I have no time to maintain the project, the latest source code is not perfect. +- 由于我没时间维护项目,最新的源代码不完善。 ## Table of Contents - [Background](#Background) @@ -15,18 +16,72 @@ - [Contribution](#Contribution) - [Related](#Related) - [License](#License) -- [Q&A](./Q&A.md) - +- [Q&A] ## Background `Origin` I discovered the `BoardwalkApp` a few years ago, which can launch Minecraft Java Edition on Android devices. It's so exciting to see minecraft start on my phone.It's really a curious and interesting project
`MCinaBox` is an open source project, and the back end is supported by the `BoatApp` project. And in the efforts of many people to make it run. >zhuowei 's BoardwalkApp https://github.com/zhuowei/Boardwalk
>CosineMath 's BoatApp https://github.com/CosineMath/BoatApp + ## Change Log -- [English](./CHANGELOG.md) -- [Chinese](./CHANGELOG_zh-cn.md) +### v0.1.3 +- Fix create new user crash (By by-scott) +- Fix minecraft dependency priority is higher than Forge +- Add minecraft genuine validation (By by-scott) +- Add mouse mode to switch (manual) +- Add Spanish (By salted fish King) +### v0.1.2 +- Fix reediting keys caused a crash while repairing virtual keyboard configurations +- Fix some control behavior exceptions in Boat-3 mode +- Add a new downloader to provide visual download progress feedback +- Add the Minecraft Json Parsing Tool Library +- Add multilingual support (preliminary) +- Add Forge and LiteLoader support (see documentation) +### v0.1.1 +- Fix crashes caused by asynchronous message manager refresh when memory is empty +- Fix crashes caused by null values when adding custom keys +- Fix downloader to duplicate download of existing files +- Fix invalid custom keys with primary key value of mouse in boat-3 mode +- Fix Gallery crash caused by Android media scanning minecraft folder +- Change custom key dialog action button set top +- Add drag to change position when adding custom keys +- Add a status indicator to increase the limit on memory size settings +- Remove temporary removal of integration package import function entry +- Remove more options for temporarily removing Toolbar +### v0.1.0 +- First Release Version. + +Chinese Translation: + +### v0.1.3 +- 修复 创建新用户崩溃的问题 (By by-scott) +- 修复 Minecraft依赖项优先级高于Forge +- 添加 Minecraft正版验证 (By by-scott) +- 添加 鼠标模式切换(手动) +- 添加 西班牙语(By Salted fish King) + +### v0.1.2 +- 修复 虚拟键盘配置时重新编辑键导致的崩溃 +- 修正 Boat-3模式中的一些控制行为异常 +- 添加 新的下载程序以提供可视化的下载进度反馈 +- 添加 Minecraft Json解析工具库 +- 添加 多语言支持(初步) +- 添加 Forge和LiteLoader支持(请参阅文档) +### v0.1.1 +- 修复 内存为空时因异步消息管理器刷新而引发的崩溃 +- 修复 添加自定义按键时一些值为空引发的崩溃 +- 修复 下载器重复下载已经存在的文件 +- 修复 boat-3模式下主键值为鼠标的自定义按键无效 +- 修复 Android媒体扫描minecraft文件夹而引发的图库崩溃 +- 更改 自定义按键对话框操作按钮置顶 +- 添加 自定义按键时拖动来改变位置 +- 添加 状态指示器增加对内存大小设置的限制 +- 移除 暂时移除整合包导入功能入口 +- 移除 暂时移除Toolbar 更多选项 +### v0.1.0 +-第一个发行版本 ## Build @@ -49,7 +104,7 @@ ## Usage ### Install -1. Download the latest APK and runtime pack to your Android phone. +1. Download the lastest APK and runtime pack to your Android phone. 2. Install APK and start it at least one time. 3. Copy the runtime to ```/sdcard/Android/data/com.aof.mcinabox/files/MCinaBox/runtimepack/``` 4. Then start APK and find ```Launcher Set``` to import the runtime pack. @@ -61,7 +116,7 @@ In theory, forge is supported, but we need to make some changes to start it. 1. Copy an installed version of forge from your computer to ```/sdcard/mcinabox/.minecraft/```, including ```libraries``` and ```versions``` 2. Launch it in MCinaBox at least one time. (As a result, it can't be started) 3. Edit ```/sdcard/MCinaBox/.minecraft/config/splash.properties``` to change ```enabled=true``` to ```enabled=false``` to close forge loading animation. -4. Try to launch forge again. It's going to be black for a while, but it's usually useful. +4. Try to launch forge again.It's going to be black for a while, but it's usually useful ### Matters needing attention 1. Mipmap will cause rendering problems. Please turn it off in Minecraft ```settings - video settings - mipmap=0``` @@ -88,6 +143,11 @@ The software is distributed under [GPL v3](https://www.gnu.org/licenses/gpl-3.0. 1. When you distribute a modified version of the software, you must change the software name or the version number in a reasonable way in order to distinguish it from the original version. [under GPLv3, 7(c).] 2. You must not remove the copyright declaration displayed in the software. [under GPLv3, 7(b).] +Chinese Translation: +### 附加条款(依据 GPLv3 协议第七条) +1. 当你分发本程序的修改版本时,你必须以一种合理的方式修改本程序的名称或版本号,以示其与原始版本不同。 [依据 GPLv3, 7(c).] +2. 你不得移除本程序所显示的版权声明。[依据 GPLv3, 7(b).] + ## Contribution This project exists thanks to all the people who contribute. diff --git a/assets/.gitignore b/assets/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/assets/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/sharedmodule/build.gradle b/assets/build.gradle similarity index 60% rename from sharedmodule/build.gradle rename to assets/build.gradle index 08a4c199..bf3e899b 100644 --- a/sharedmodule/build.gradle +++ b/assets/build.gradle @@ -2,8 +2,7 @@ apply plugin: 'com.android.library' android { compileSdkVersion 28 - buildToolsVersion "28.0.3" - + buildToolsVersion '30.0.2' defaultConfig { minSdkVersion 21 @@ -12,7 +11,7 @@ android { versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - consumerProguardFiles 'consumer-rules.pro' + consumerProguardFiles "consumer-rules.pro" } buildTypes { @@ -21,13 +20,10 @@ android { proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' } } - } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.2.0' - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'com.github.kongqw:AndroidRocker:1.0.1' - implementation 'com.google.code.gson:gson:2.8.6' -} +} \ No newline at end of file diff --git a/sharedmodule/consumer-rules.pro b/assets/consumer-rules.pro similarity index 100% rename from sharedmodule/consumer-rules.pro rename to assets/consumer-rules.pro diff --git a/sharedmodule/proguard-rules.pro b/assets/proguard-rules.pro similarity index 94% rename from sharedmodule/proguard-rules.pro rename to assets/proguard-rules.pro index f1b42451..481bb434 100644 --- a/sharedmodule/proguard-rules.pro +++ b/assets/proguard-rules.pro @@ -18,4 +18,4 @@ # If you keep the line number information, uncomment this to # hide the original source file name. -#-renamesourcefileattribute SourceFile +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/assets/src/androidTest/java/com/aof/mcinabox/assets/ExampleInstrumentedTest.java b/assets/src/androidTest/java/com/aof/mcinabox/assets/ExampleInstrumentedTest.java new file mode 100644 index 00000000..1b69c4d1 --- /dev/null +++ b/assets/src/androidTest/java/com/aof/mcinabox/assets/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package com.aof.mcinabox.assets; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("com.aof.mcinabox.assets.test", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/assets/src/main/AndroidManifest.xml b/assets/src/main/AndroidManifest.xml new file mode 100644 index 00000000..74d1d8e3 --- /dev/null +++ b/assets/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + / + \ No newline at end of file diff --git a/sharedmodule/src/main/res/anim/layout_in_from_left.xml b/assets/src/main/res/anim/layout_in_from_left.xml similarity index 100% rename from sharedmodule/src/main/res/anim/layout_in_from_left.xml rename to assets/src/main/res/anim/layout_in_from_left.xml diff --git a/sharedmodule/src/main/res/anim/layout_out_to_left.xml b/assets/src/main/res/anim/layout_out_to_left.xml similarity index 100% rename from sharedmodule/src/main/res/anim/layout_out_to_left.xml rename to assets/src/main/res/anim/layout_out_to_left.xml diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_account_box_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_account_box_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_account_box_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_account_box_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_add_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_add_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_add_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_add_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_add_circle_outline_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_add_circle_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_add_circle_outline_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_add_circle_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_autorenew_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_autorenew_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_autorenew_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_autorenew_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_build_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_build_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_build_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_build_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_cancel_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_cancel_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_cancel_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_cancel_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_check_circle_green_a700_36dp.png b/assets/src/main/res/drawable-hdpi/ic_check_circle_green_a700_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_check_circle_green_a700_36dp.png rename to assets/src/main/res/drawable-hdpi/ic_check_circle_green_a700_36dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_check_circle_green_a700_48dp.png b/assets/src/main/res/drawable-hdpi/ic_check_circle_green_a700_48dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_check_circle_green_a700_48dp.png rename to assets/src/main/res/drawable-hdpi/ic_check_circle_green_a700_48dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_chevron_left_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_chevron_left_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_chevron_left_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_chevron_left_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_code_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_code_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_code_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_code_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_code_blue_500_24dp.png b/assets/src/main/res/drawable-hdpi/ic_code_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_code_blue_500_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_code_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_delete_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_delete_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_delete_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_delete_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_dns_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_dns_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_dns_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_dns_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_extension_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_extension_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_extension_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_extension_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_file_download_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_file_download_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_file_download_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_file_download_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_gamepad_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_gamepad_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_gamepad_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_gamepad_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_gamepad_blue_300_24dp.png b/assets/src/main/res/drawable-hdpi/ic_gamepad_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_gamepad_blue_300_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_gamepad_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_help_outline_blue_500_24dp.png b/assets/src/main/res/drawable-hdpi/ic_help_outline_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_help_outline_blue_500_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_help_outline_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_home_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_home_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_home_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_home_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_info_blue_500_24dp.png b/assets/src/main/res/drawable-hdpi/ic_info_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_info_blue_500_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_info_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_info_outline_blue_500_24dp.png b/assets/src/main/res/drawable-hdpi/ic_info_outline_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_info_outline_blue_500_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_info_outline_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_info_red_500_24dp.png b/assets/src/main/res/drawable-hdpi/ic_info_red_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_info_red_500_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_info_red_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_input_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_input_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_input_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_input_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_insert_drive_file_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_insert_drive_file_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_insert_drive_file_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_insert_drive_file_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_joystick_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_joystick_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_joystick_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_joystick_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_joystick_blue_300_24dp.png b/assets/src/main/res/drawable-hdpi/ic_joystick_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_joystick_blue_300_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_joystick_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_backspace_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_keyboard_backspace_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_backspace_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_keyboard_backspace_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_keyboard_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_keyboard_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_blue_300_24dp.png b/assets/src/main/res/drawable-hdpi/ic_keyboard_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_blue_300_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_keyboard_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_hide_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_keyboard_hide_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_hide_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_keyboard_hide_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_hide_blue_300_24dp.png b/assets/src/main/res/drawable-hdpi/ic_keyboard_hide_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_keyboard_hide_blue_300_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_keyboard_hide_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_language_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_language_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_language_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_language_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_list_black_36dp.png b/assets/src/main/res/drawable-hdpi/ic_list_black_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_list_black_36dp.png rename to assets/src/main/res/drawable-hdpi/ic_list_black_36dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_lock_open_blue_500_24dp.png b/assets/src/main/res/drawable-hdpi/ic_lock_open_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_lock_open_blue_500_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_lock_open_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_lock_outline_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_lock_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_lock_outline_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_lock_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_mouse_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_mouse_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_mouse_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_mouse_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_mouse_blue_300_24dp.png b/assets/src/main/res/drawable-hdpi/ic_mouse_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_mouse_blue_300_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_mouse_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_navigation_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_navigation_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_navigation_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_navigation_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_refresh_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_remove_circle_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_remove_circle_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_remove_circle_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_remove_circle_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_remove_circle_outline_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_remove_circle_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_remove_circle_outline_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_remove_circle_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_18dp.png b/assets/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_18dp.png rename to assets/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_18dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_24dp.png b/assets/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_report_problem_yellow_900_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_save_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_save_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_save_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_save_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_sd_storage_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_sd_storage_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_sd_storage_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_sd_storage_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_settings_applications_black_18dp.png b/assets/src/main/res/drawable-hdpi/ic_settings_applications_black_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_settings_applications_black_18dp.png rename to assets/src/main/res/drawable-hdpi/ic_settings_applications_black_18dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_settings_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_settings_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_settings_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_settings_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_unarchive_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_unarchive_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_unarchive_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_unarchive_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_usb_black_24dp.png b/assets/src/main/res/drawable-hdpi/ic_usb_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_usb_black_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_usb_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-hdpi/ic_usb_blue_300_24dp.png b/assets/src/main/res/drawable-hdpi/ic_usb_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-hdpi/ic_usb_blue_300_24dp.png rename to assets/src/main/res/drawable-hdpi/ic_usb_blue_300_24dp.png diff --git a/assets/src/main/res/drawable-hdpi/outline_error_outline_orange_800_24dp.png b/assets/src/main/res/drawable-hdpi/outline_error_outline_orange_800_24dp.png new file mode 100644 index 0000000000000000000000000000000000000000..2f67096a50fe6ea13d6f0e254a56582a19863aa0 GIT binary patch literal 552 zcmV+@0@wYCP)*&_ss51{LMf`rnjH2S+R zpS?9rwn71Fvf;77@7b}-~!x&Cin$i_Iv}* zKt#8p8L$Hy;7^i!kOI@H4Q+xq4@P)i!GG|APm;QCHQiPI~deZ zflK%Zw!x&thfFc;6PKgVub~W=sKn~XYoS^(*Ice+uZEIbg1mw)o#S#QWer(h^g#kE zY^%GyXqnZS$(}{WMVaJ%2R<1?`y}WY_&pT8*+c7RIcCjM24zFxT?`ml*Cj;hU!EZ(r73|V(vtSxSO$C_rL5s+UamV02ruy2wzC2%{Q1!xi$Ln(VgEYBZFU-S&$_*wDCS z^k9sL3|SXoi-=&vh3NNWE>|CG4eX$@!uF%mPy1o9rJ+H~ zb2$@UTi6qYEo_O)b)>4vZz^c=&j%fY4qe8eD>ep&*$70(prWoZ$R?p+P>ib{rL7&Y q%N=S%8>O92^r8Q382=v{3H|}U%KZVguFhou0000rNM1}=SNQoi_n*}Rzg(Hy` zFhKQ!k|_%rLBs;pi!+(BBb6=WWV8&VjK+?usBl9nDvU@78Y5zg3K*_N zN(li(6m|im6n40Z>mDGs17Z;<##UU{(yGFFKu(2&9PtrIRptjQRVMqOuJkF!0F5q; U;w%W{>Hq)$07*qoM6N<$f~wS#!vFvP literal 0 HcmV?d00001 diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_account_box_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_account_box_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_account_box_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_account_box_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_add_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_add_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_add_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_add_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_add_circle_outline_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_add_circle_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_add_circle_outline_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_add_circle_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_autorenew_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_autorenew_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_autorenew_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_autorenew_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_build_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_build_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_build_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_build_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_cancel_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_cancel_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_cancel_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_cancel_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_36dp.png b/assets/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_36dp.png rename to assets/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_36dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_48dp.png b/assets/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_48dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_48dp.png rename to assets/src/main/res/drawable-xhdpi/ic_check_circle_green_a700_48dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_chevron_left_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_chevron_left_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_chevron_left_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_chevron_left_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_code_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_code_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_code_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_code_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_code_blue_500_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_code_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_code_blue_500_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_code_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_delete_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_dns_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_dns_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_dns_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_dns_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_extension_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_extension_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_extension_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_extension_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_file_download_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_file_download_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_file_download_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_file_download_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_gamepad_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_gamepad_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_gamepad_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_gamepad_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_gamepad_blue_300_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_gamepad_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_gamepad_blue_300_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_gamepad_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_help_outline_blue_500_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_help_outline_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_help_outline_blue_500_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_help_outline_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_home_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_home_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_home_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_home_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_info_blue_500_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_info_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_info_blue_500_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_info_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_info_outline_blue_500_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_info_outline_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_info_outline_blue_500_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_info_outline_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_info_red_500_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_info_red_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_info_red_500_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_info_red_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_input_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_input_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_input_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_input_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_insert_drive_file_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_insert_drive_file_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_insert_drive_file_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_insert_drive_file_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_joystick_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_joystick_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_joystick_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_joystick_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_joystick_blue_300_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_joystick_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_joystick_blue_300_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_joystick_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_backspace_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_keyboard_backspace_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_backspace_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_keyboard_backspace_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_keyboard_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_keyboard_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_blue_300_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_keyboard_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_blue_300_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_keyboard_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_hide_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_keyboard_hide_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_hide_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_keyboard_hide_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_hide_blue_300_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_keyboard_hide_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_keyboard_hide_blue_300_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_keyboard_hide_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_language_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_language_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_language_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_language_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_launcher_background.xml b/assets/src/main/res/drawable-xhdpi/ic_launcher_background.xml similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_launcher_background.xml rename to assets/src/main/res/drawable-xhdpi/ic_launcher_background.xml diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_launcher_foreground.xml b/assets/src/main/res/drawable-xhdpi/ic_launcher_foreground.xml similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_launcher_foreground.xml rename to assets/src/main/res/drawable-xhdpi/ic_launcher_foreground.xml diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_list_black_36dp.png b/assets/src/main/res/drawable-xhdpi/ic_list_black_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_list_black_36dp.png rename to assets/src/main/res/drawable-xhdpi/ic_list_black_36dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_lock_open_blue_500_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_lock_open_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_lock_open_blue_500_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_lock_open_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_lock_outline_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_lock_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_lock_outline_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_lock_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_mouse_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_mouse_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_mouse_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_mouse_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_mouse_blue_300_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_mouse_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_mouse_blue_300_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_mouse_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_navigation_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_navigation_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_navigation_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_navigation_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_refresh_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_refresh_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_refresh_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_refresh_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_remove_circle_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_remove_circle_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_remove_circle_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_remove_circle_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_remove_circle_outline_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_remove_circle_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_remove_circle_outline_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_remove_circle_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_18dp.png b/assets/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_18dp.png rename to assets/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_18dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_report_problem_yellow_900_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_save_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_save_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_save_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_save_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_sd_storage_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_sd_storage_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_sd_storage_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_sd_storage_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_settings_applications_black_18dp.png b/assets/src/main/res/drawable-xhdpi/ic_settings_applications_black_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_settings_applications_black_18dp.png rename to assets/src/main/res/drawable-xhdpi/ic_settings_applications_black_18dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_settings_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_unarchive_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_unarchive_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_unarchive_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_unarchive_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_usb_black_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_usb_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_usb_black_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_usb_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xhdpi/ic_usb_blue_300_24dp.png b/assets/src/main/res/drawable-xhdpi/ic_usb_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xhdpi/ic_usb_blue_300_24dp.png rename to assets/src/main/res/drawable-xhdpi/ic_usb_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_cancel_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_cancel_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_cancel_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_cancel_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_36dp.png b/assets/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_36dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_36dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_48dp.png b/assets/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_48dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_48dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_check_circle_green_a700_48dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_code_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_code_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_code_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_code_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_code_blue_500_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_code_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_code_blue_500_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_code_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_gamepad_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_gamepad_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_gamepad_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_gamepad_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_gamepad_blue_300_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_gamepad_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_gamepad_blue_300_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_gamepad_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_help_outline_blue_500_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_help_outline_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_help_outline_blue_500_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_help_outline_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_joystick_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_joystick_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_joystick_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_joystick_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_joystick_blue_300_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_joystick_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_joystick_blue_300_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_joystick_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_keyboard_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_keyboard_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_keyboard_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_keyboard_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_keyboard_blue_300_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_keyboard_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_keyboard_blue_300_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_keyboard_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_keyboard_hide_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_keyboard_hide_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_keyboard_hide_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_keyboard_hide_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_language_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_language_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_language_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_language_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_list_black_36dp.png b/assets/src/main/res/drawable-xxhdpi/ic_list_black_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_list_black_36dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_list_black_36dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_lock_open_blue_500_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_lock_open_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_lock_open_blue_500_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_lock_open_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_lock_outline_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_lock_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_lock_outline_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_lock_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_mouse_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_mouse_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_mouse_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_mouse_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_mouse_blue_300_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_mouse_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_mouse_blue_300_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_mouse_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_navigation_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_navigation_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_navigation_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_navigation_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_18dp.png b/assets/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_18dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_18dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_report_problem_yellow_900_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_settings_applications_black_18dp.png b/assets/src/main/res/drawable-xxhdpi/ic_settings_applications_black_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_settings_applications_black_18dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_settings_applications_black_18dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_usb_black_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_usb_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_usb_black_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_usb_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxhdpi/ic_usb_blue_300_24dp.png b/assets/src/main/res/drawable-xxhdpi/ic_usb_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxhdpi/ic_usb_blue_300_24dp.png rename to assets/src/main/res/drawable-xxhdpi/ic_usb_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_cancel_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_cancel_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_cancel_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_cancel_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_36dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_36dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_36dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_48dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_48dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_48dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_check_circle_green_a700_48dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_code_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_code_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_code_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_code_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_code_blue_500_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_code_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_code_blue_500_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_code_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_gamepad_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_gamepad_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_gamepad_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_gamepad_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_gamepad_blue_300_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_gamepad_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_gamepad_blue_300_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_gamepad_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_help_outline_blue_500_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_help_outline_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_help_outline_blue_500_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_help_outline_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_joystick_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_joystick_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_joystick_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_joystick_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_joystick_blue_300_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_joystick_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_joystick_blue_300_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_joystick_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_keyboard_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_keyboard_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_keyboard_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_keyboard_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_keyboard_blue_300_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_keyboard_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_keyboard_blue_300_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_keyboard_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_keyboard_hide_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_keyboard_hide_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_keyboard_hide_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_keyboard_hide_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_language_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_language_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_language_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_language_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_list_black_36dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_list_black_36dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_list_black_36dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_list_black_36dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_lock_open_blue_500_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_lock_open_blue_500_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_lock_open_blue_500_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_lock_open_blue_500_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_lock_outline_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_lock_outline_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_lock_outline_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_lock_outline_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_mouse_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_mouse_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_mouse_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_mouse_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_mouse_blue_300_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_mouse_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_mouse_blue_300_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_mouse_blue_300_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_navigation_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_navigation_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_navigation_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_navigation_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_18dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_18dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_18dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_report_problem_yellow_900_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_settings_applications_black_18dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_settings_applications_black_18dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_settings_applications_black_18dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_settings_applications_black_18dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_usb_black_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_usb_black_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_usb_black_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_usb_black_24dp.png diff --git a/sharedmodule/src/main/res/drawable-xxxhdpi/ic_usb_blue_300_24dp.png b/assets/src/main/res/drawable-xxxhdpi/ic_usb_blue_300_24dp.png similarity index 100% rename from sharedmodule/src/main/res/drawable-xxxhdpi/ic_usb_blue_300_24dp.png rename to assets/src/main/res/drawable-xxxhdpi/ic_usb_blue_300_24dp.png diff --git a/mcinabox/src/main/res/drawable/alex.png b/assets/src/main/res/drawable/alex.png similarity index 100% rename from mcinabox/src/main/res/drawable/alex.png rename to assets/src/main/res/drawable/alex.png diff --git a/mcinabox/src/main/res/drawable/background.png b/assets/src/main/res/drawable/background.png similarity index 100% rename from mcinabox/src/main/res/drawable/background.png rename to assets/src/main/res/drawable/background.png diff --git a/mcinabox/src/main/res/drawable/background_dialog_alpha.xml b/assets/src/main/res/drawable/background_dialog_alpha.xml similarity index 100% rename from mcinabox/src/main/res/drawable/background_dialog_alpha.xml rename to assets/src/main/res/drawable/background_dialog_alpha.xml diff --git a/mcinabox/src/main/res/drawable/background_dialog_noalpha.xml b/assets/src/main/res/drawable/background_dialog_noalpha.xml similarity index 100% rename from mcinabox/src/main/res/drawable/background_dialog_noalpha.xml rename to assets/src/main/res/drawable/background_dialog_noalpha.xml diff --git a/sharedmodule/src/main/res/drawable/background_dialog_simple.xml b/assets/src/main/res/drawable/background_dialog_simple.xml similarity index 100% rename from sharedmodule/src/main/res/drawable/background_dialog_simple.xml rename to assets/src/main/res/drawable/background_dialog_simple.xml diff --git a/assets/src/main/res/drawable/background_gray_corner.xml b/assets/src/main/res/drawable/background_gray_corner.xml new file mode 100644 index 00000000..9a2874db --- /dev/null +++ b/assets/src/main/res/drawable/background_gray_corner.xml @@ -0,0 +1,14 @@ + + + + + + + diff --git a/mcinabox/src/main/res/drawable/backtohome.png b/assets/src/main/res/drawable/backtohome.png similarity index 100% rename from mcinabox/src/main/res/drawable/backtohome.png rename to assets/src/main/res/drawable/backtohome.png diff --git a/mcinabox/src/main/res/drawable/book.png b/assets/src/main/res/drawable/book.png similarity index 100% rename from mcinabox/src/main/res/drawable/book.png rename to assets/src/main/res/drawable/book.png diff --git a/mcinabox/src/main/res/drawable/book_2.png b/assets/src/main/res/drawable/book_2.png similarity index 100% rename from mcinabox/src/main/res/drawable/book_2.png rename to assets/src/main/res/drawable/book_2.png diff --git a/mcinabox/src/main/res/drawable/bookshelf.png b/assets/src/main/res/drawable/bookshelf.png similarity index 100% rename from mcinabox/src/main/res/drawable/bookshelf.png rename to assets/src/main/res/drawable/bookshelf.png diff --git a/mcinabox/src/main/res/drawable/chicken.png b/assets/src/main/res/drawable/chicken.png similarity index 100% rename from mcinabox/src/main/res/drawable/chicken.png rename to assets/src/main/res/drawable/chicken.png diff --git a/mcinabox/src/main/res/drawable/command.png b/assets/src/main/res/drawable/command.png similarity index 100% rename from mcinabox/src/main/res/drawable/command.png rename to assets/src/main/res/drawable/command.png diff --git a/mcinabox/src/main/res/drawable/craft_table.png b/assets/src/main/res/drawable/craft_table.png similarity index 100% rename from mcinabox/src/main/res/drawable/craft_table.png rename to assets/src/main/res/drawable/craft_table.png diff --git a/mcinabox/src/main/res/drawable/forge.png b/assets/src/main/res/drawable/forge.png similarity index 100% rename from mcinabox/src/main/res/drawable/forge.png rename to assets/src/main/res/drawable/forge.png diff --git a/mcinabox/src/main/res/drawable/furnace.png b/assets/src/main/res/drawable/furnace.png similarity index 100% rename from mcinabox/src/main/res/drawable/furnace.png rename to assets/src/main/res/drawable/furnace.png diff --git a/mcinabox/src/main/res/drawable/grass.png b/assets/src/main/res/drawable/grass.png similarity index 100% rename from mcinabox/src/main/res/drawable/grass.png rename to assets/src/main/res/drawable/grass.png diff --git a/mcinabox/src/main/res/drawable/grass_2d.bmp b/assets/src/main/res/drawable/grass_2d.bmp similarity index 100% rename from mcinabox/src/main/res/drawable/grass_2d.bmp rename to assets/src/main/res/drawable/grass_2d.bmp diff --git a/mcinabox/src/main/res/drawable/icon.png b/assets/src/main/res/drawable/icon.png similarity index 100% rename from mcinabox/src/main/res/drawable/icon.png rename to assets/src/main/res/drawable/icon.png diff --git a/mcinabox/src/main/res/drawable/steve.png b/assets/src/main/res/drawable/steve.png similarity index 100% rename from mcinabox/src/main/res/drawable/steve.png rename to assets/src/main/res/drawable/steve.png diff --git a/mcinabox/src/main/res/drawable/steve_pic.bmp b/assets/src/main/res/drawable/steve_pic.bmp similarity index 100% rename from mcinabox/src/main/res/drawable/steve_pic.bmp rename to assets/src/main/res/drawable/steve_pic.bmp diff --git a/mcinabox/src/main/res/drawable/steve_pic_2.png b/assets/src/main/res/drawable/steve_pic_2.png similarity index 100% rename from mcinabox/src/main/res/drawable/steve_pic_2.png rename to assets/src/main/res/drawable/steve_pic_2.png diff --git a/mcinabox/src/main/res/values/colors.xml b/assets/src/main/res/values/colors.xml similarity index 82% rename from mcinabox/src/main/res/values/colors.xml rename to assets/src/main/res/values/colors.xml index ef74d588..4fb1b9f9 100644 --- a/mcinabox/src/main/res/values/colors.xml +++ b/assets/src/main/res/values/colors.xml @@ -1,5 +1,8 @@ + #00FFFFFF + + #657DDB #5B63B7 #D81B60 @@ -10,4 +13,5 @@ #4B4B4B #FF0000 #8C8C8C - + + \ No newline at end of file diff --git a/mcinabox/src/main/res/values/dimens.xml b/assets/src/main/res/values/dimens.xml similarity index 77% rename from mcinabox/src/main/res/values/dimens.xml rename to assets/src/main/res/values/dimens.xml index 9a695cd6..ed0df471 100644 --- a/mcinabox/src/main/res/values/dimens.xml +++ b/assets/src/main/res/values/dimens.xml @@ -1,6 +1,9 @@ + + 15sp 13sp 10sp + \ No newline at end of file diff --git a/assets/src/test/java/com/aof/mcinabox/assets/ExampleUnitTest.java b/assets/src/test/java/com/aof/mcinabox/assets/ExampleUnitTest.java new file mode 100644 index 00000000..affc2c22 --- /dev/null +++ b/assets/src/test/java/com/aof/mcinabox/assets/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.aof.mcinabox.assets; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/boat/build.gradle b/boat/build.gradle index 7cd56936..fba1dcb7 100644 --- a/boat/build.gradle +++ b/boat/build.gradle @@ -1,48 +1,52 @@ -tasks.whenTaskAdded{ task-> - if(task.name.equals("lint")) { - task.enabled=false - } -} apply plugin: 'com.android.library' android { compileSdkVersion 28 - buildToolsVersion '28.0.3' + buildToolsVersion '30.0.2' defaultConfig { minSdkVersion 21 targetSdkVersion 21 versionCode 1 versionName "1.0" testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" - ndk{ - abiFilters "armeabi-v7a" - } - externalNativeBuild { + /*externalNativeBuild { cmake { arguments "-DANDROID_STL=c++_shared" } } + + */ } buildTypes { release { minifyEnabled false proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + /*ndk{ + abiFilters "armeabi-v7a" + } + + */ } } - externalNativeBuild { + /*externalNativeBuild { cmake { path file('src/main/jni/CMakeLists.txt') } } + */ + //ndkVersion '17.2.4988734' } dependencies { implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.1.0' - androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation project(path: ':gamecontroller') + implementation project(path: ':jndcrash') + implementation project(path: ':assets') + implementation project(path: ':definitions') implementation 'com.google.code.gson:gson:2.8.6' - implementation project(path: ':sharedmodule') - implementation 'com.github.kongqw:AndroidRocker:1.0.1' + implementation project(path: ':plugin') + implementation project(path: ':utils') } diff --git a/boat/src/androidTest/java/cosine/boat/ExampleInstrumentedTest.java b/boat/src/androidTest/java/cosine/boat/ExampleInstrumentedTest.java deleted file mode 100644 index 35a902c0..00000000 --- a/boat/src/androidTest/java/cosine/boat/ExampleInstrumentedTest.java +++ /dev/null @@ -1,10 +0,0 @@ -package cosine.boat; - -import android.content.Context; - -import androidx.test.platform.app.InstrumentationRegistry; - -import org.junit.Test; -import org.junit.runner.RunWith; - -import static org.junit.Assert.*; diff --git a/boat/src/main/java/cosine/boat/BoatActivity.java b/boat/src/main/java/cosine/boat/BoatActivity.java new file mode 100644 index 00000000..4a9e798b --- /dev/null +++ b/boat/src/main/java/cosine/boat/BoatActivity.java @@ -0,0 +1,234 @@ +package cosine.boat; + +import android.app.Activity; +import android.graphics.Color; +import android.view.MotionEvent; +import android.os.Bundle; +import android.app.NativeActivity; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.widget.PopupWindow; +import android.view.Gravity; +import android.view.WindowManager.LayoutParams; +import android.view.View; +import android.os.Handler; +import android.os.Message; +import android.widget.RelativeLayout; +import android.view.SurfaceHolder; +import com.aof.mcinabox.definitions.id.AppEvent; +import com.aof.mcinabox.definitions.models.BoatArgs; +import com.aof.mcinabox.gamecontroller.client.ClientInput; +import com.aof.mcinabox.gamecontroller.controller.BaseController; +import com.aof.mcinabox.gamecontroller.controller.Controller; +import com.aof.mcinabox.gamecontroller.controller.HardwareController; +import com.aof.mcinabox.gamecontroller.controller.VirtualController; +import java.util.ArrayList; + +public class BoatActivity extends NativeActivity implements View.OnClickListener, View.OnTouchListener, ClientInput, AppEvent { + + private BoatArgs boatArgs; + private PopupWindow popupWindow; + private RelativeLayout baseLayout; + private BaseController virtualController; + private BaseController otgController; + private BoatHandler mHandler; + private final static String TAG = "BoatActivity"; + + @Override + protected void onCreate(Bundle savedInstanceState) { + + super.onCreate(savedInstanceState); + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + boatArgs = (BoatArgs) getIntent().getSerializableExtra("LauncherConfig"); + + //设置悬浮窗口以及基本LinearLayout + popupWindow = new PopupWindow(); + popupWindow.setWidth(LayoutParams.MATCH_PARENT); + popupWindow.setHeight(LayoutParams.MATCH_PARENT); + popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); + popupWindow.setFocusable(true); + baseLayout = new RelativeLayout(this); + ViewGroup.LayoutParams layoutParams = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.MATCH_PARENT, ViewGroup.LayoutParams.MATCH_PARENT); + baseLayout.setLayoutParams(layoutParams); + baseLayout.setBackgroundColor(Color.parseColor("#00FFFFFF")); + popupWindow.setContentView(baseLayout); + + //添加控制器 + virtualController = new VirtualController(this, TO_X_KEY); + otgController = new HardwareController(this, TO_X_KEY); + //设定当前Activity + BoatInput.mActivity = this; + + //初始化Handler + mHandler = new BoatHandler(); + + } + + @Override + protected void onPause() { + + super.onPause(); + popupWindow.dismiss(); + } + + @Override + public void onWindowFocusChanged(boolean hasFocus) { + + super.onWindowFocusChanged(hasFocus); + if (hasFocus) { + popupWindow.showAtLocation(BoatActivity.this.getWindow().getDecorView(), Gravity.TOP | Gravity.LEFT, 0, 0); + } + + } + + @Override + public void surfaceCreated(SurfaceHolder holder) { + + super.surfaceCreated(holder); + System.out.println("Surface is created!"); + + new Thread() { + @Override + public void run() { + BoatArgs boatArgs = (BoatArgs) getIntent().getSerializableExtra("LauncherConfig"); + LoadMe.exec(boatArgs); + Message msg = new Message(); + msg.what = -1; + mHandler.sendMessage(msg); + } + }.start(); + } + + public void setCursorMode(int mode) { + Message msg = new Message(); + msg.what = mode; + mHandler.sendMessage(msg); + } + + @Override + public void surfaceChanged(SurfaceHolder holder, int format, int width, int height) { + super.surfaceChanged(holder, format, width, height); + } + + private class BoatHandler extends Handler { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case BoatInput.CursorDisabled: + for (Controller c : new Controller[]{otgController, virtualController}) { + c.setInputMode(MARK_INPUT_MODE_CATCH); + } + break; + case BoatInput.CursorEnabled: + for (Controller c : new Controller[]{otgController, virtualController}) { + c.setInputMode(MARK_INPUT_MODE_ALONE); + } + break; + default: + BoatActivity.this.finish(); + break; + } + } + } + + @Override + public void onClick(View p1) { + + } + + @Override + public boolean onTouch(View p1, MotionEvent p2) { + return false; + } + + //重写 addContentView(View, ViewGroup.MarginLayoutParams) 方法实现NativeActivity动态添加View的功能 + @Override + public void addContentView(View view, ViewGroup.LayoutParams params) { + if (params instanceof RelativeLayout.LayoutParams) { + this.baseLayout.addView(view, params); + } else { + RelativeLayout.LayoutParams tparams = new RelativeLayout.LayoutParams(params.width, params.height); + this.baseLayout.addView(view, tparams); + } + bringControllerToFront(); + } + + @Override + public void typeWords(String str) { + //TODO:根据字符串输入字符 + char[] cs = str.toCharArray(); + for (char c : cs) { + BoatInput.setKey(0, c, true); + BoatInput.setKey(0, c, false); + } + } + + private ArrayList cvs = new ArrayList<>(); + + @Override + public void addControllerView(View v) { + if (!cvs.contains(v)) { + cvs.add(v); + } + this.addView(v); + } + + public void bringControllerToFront(){ + for(View v : cvs){ + v.bringToFront(); + } + } + + @Override + public void setKey(int keyCode, boolean pressed) { + BoatInput.setKey(keyCode, 0, pressed); + } + + @Override + public void setMouseButton(int mouseCode, boolean pressed) { + BoatInput.setMouseButton(mouseCode, pressed); + } + + @Override + public void setMousePoniter(int x, int y) { + BoatInput.setPointer(x, y); + } + + @Override + public Activity getActivity() { + return this; + } + + @Override + public void addView(View v) { + if (v.getLayoutParams() == null) { + return; + } + if (v.getLayoutParams() instanceof RelativeLayout.LayoutParams) { + this.baseLayout.addView(v); + } else { + this.addContentView(v, v.getLayoutParams()); + } + bringControllerToFront(); + } + + private void stopControllers() { + for (Controller c : new Controller[]{otgController, virtualController}) { + c.onStop(); + } + } + + @Override + public void surfaceDestroyed(SurfaceHolder holder) { + super.surfaceDestroyed(holder); + stopControllers(); + } + + @Override + public void onDestroy(){ + super.onDestroy(); + } + +} + + diff --git a/boat/src/main/java/cosine/boat/BoatClientActivity.java b/boat/src/main/java/cosine/boat/BoatClientActivity.java deleted file mode 100644 index ee3b35f8..00000000 --- a/boat/src/main/java/cosine/boat/BoatClientActivity.java +++ /dev/null @@ -1,1211 +0,0 @@ -package cosine.boat; - -import android.app.Activity; -import android.content.Context; -import android.graphics.drawable.GradientDrawable; -import android.util.Log; -import android.view.MotionEvent; -import android.os.Bundle; -import android.app.NativeActivity; -import android.view.WindowManager; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.HorizontalScrollView; -import android.widget.ImageButton; -import android.widget.PopupWindow; -import android.widget.RelativeLayout; -import android.view.Gravity; -import android.view.WindowManager.LayoutParams; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.os.Handler; -import android.os.Message; -import android.widget.EditText; -import android.widget.TextView; -import android.text.TextWatcher; -import android.text.Editable; -import android.view.inputmethod.EditorInfo; -import android.view.KeyEvent; -import android.view.SurfaceHolder; - -import java.io.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import android.view.ViewGroup; -import android.widget.Toast; - -import com.aof.mcinabox.plugin.controller.client.Client; -import com.aof.sharedmodule.Button.CrossButton; -import com.aof.sharedmodule.Button.ItemButton; -import com.aof.sharedmodule.Button.MouseButton; -import com.aof.sharedmodule.Button.QwertButton; -import com.aof.sharedmodule.Dialog.Helper; -import com.aof.sharedmodule.Tools.Convert_GLFW_LWJGL; -import com.google.gson.Gson; -import com.aof.sharedmodule.Model.ArgsModel; -import com.aof.sharedmodule.Tools.ColorUtils; -import com.aof.sharedmodule.Button.GameButton; -import com.aof.sharedmodule.Tools.GLFW_KeyTool; -import com.aof.sharedmodule.Model.KeyboardJsonModel; -import com.kongqw.rockerlibrary.view.RockerView; -import org.lwjgl.input.Keyboard; - -public class BoatClientActivity extends NativeActivity implements Client, View.OnClickListener, View.OnTouchListener, TextWatcher, TextView.OnEditorActionListener { - - private ArgsModel argsModel; - private ArrayList KeyboardList; - private LinearLayout QwertKeyboard; - private LinearLayout CrossKey; - private LinearLayout MouseKey; - private LinearLayout SwitcherBar; - private LinearLayout JoyStick; - private int screenWidth,screenHeight; - private PopupWindow popupWindow; - private RelativeLayout base; - private LinearLayout itemBar; - private ImageView mouseCursor; - private EditText inputScanner; - public boolean mode = false; - private MyHandler mHandler; - private int initialX; - private int initialY; - private int baseX; - private int baseY; - private HashMap layoutsPos; - private CrossButton[] crosskeychildren; - private int[] tempCrossKey; - private CheckBox checkbox_qwertkeyboard,checkbox_crosskey,checkbox_mousekey,checkbox_virtualkeyboard,checkbox_otg,checkbox_joystick,checkbox_lock,checkbox_edittext,checkbox_modeswitch,checkbox_helper; - private CheckBox[] toolerBarChildren; - private HorizontalScrollView SwitcherBar_container; - private ImageButton SwitcherBar_switcher; - private boolean switcher_isClickOnly = true; - private RockerView JoyStick_Rocker; - private Button joystick_move; - private int[] recordJoyStick; - public BoatInputEventSender mInputEventSender; - private Convert_GLFW_LWJGL ConvertInput; - private Button touchpad; - private Button qwertkeyboard_move; - private Button mousekey_move; - private Button crosskey_move; - private HashMap autoKeep = new HashMap(); - - private final int PAUSE_TIME = 5; //ms - private boolean TOUCH_LONG_APPLY = false; - private boolean TOUCH_IS_MOVED = false; - - @Override - protected void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - - //初始化键值转换工具 - ConvertInput = new Convert_GLFW_LWJGL(); - //获取参数对象 - argsModel = (ArgsModel) getIntent().getSerializableExtra("LauncherConfig"); - //获取屏幕的长宽像素 - screenWidth = getResources().getDisplayMetrics().widthPixels; - screenHeight = getResources().getDisplayMetrics().heightPixels; - //初始化界面 - InitWindowsAndScreenKeyboard(); - //初始化hanlder - mHandler = new MyHandler(); - //初始化Map - layoutsPos = new HashMap(); - //启动输入事件发送服务 - new Thread(){ - @Override - public void run(){ - try - { - System.out.println("Trying to create mInputEventSender"); - mInputEventSender = new BoatInputEventSender(); - mInputEventSender.startServer(BoatClientActivity.this); - - } - catch (Exception e) - { - e.printStackTrace(); - System.out.println("Failed to create mInputEventSender"); - } - - } - }.start(); - - } - - @Override - protected void onPause() { - super.onPause(); - popupWindow.dismiss(); - } - - - @Override - public void surfaceCreated(SurfaceHolder holder) { - - super.surfaceCreated(holder); - System.out.println("Surface is created!"); - - - new Thread() { - @Override - public void run() { - ArgsModel argsModel = (ArgsModel) getIntent().getSerializableExtra("LauncherConfig"); - LoadMe.exec(argsModel, BoatClientActivity.this); - Message msg = new Message(); - msg.what = -1; - mHandler.sendMessage(msg); - - } - }.start(); - } - - private class MyHandler extends Handler { - @Override - public void handleMessage(Message msg) { - - switch (msg.what) { - case 1: - BoatClientActivity.this.mouseCursor.setVisibility(View.INVISIBLE); - BoatClientActivity.this.itemBar.setVisibility(View.VISIBLE); - BoatClientActivity.this.mode = true; - break; - case 0: - BoatClientActivity.this.mouseCursor.setVisibility(View.VISIBLE); - BoatClientActivity.this.itemBar.setVisibility(View.INVISIBLE); - BoatClientActivity.this.mode = false; - break; - default: - BoatClientActivity.this.finish(); - break; - } - } - } - - private Button findButton(int id) { - Button b = (Button) base.findViewById(id); - b.setOnTouchListener(this); - return b; - } - - @Override - public void onClick(View p1) { - - if (p1 == inputScanner) { - inputScanner.setSelection(1); - } - } - - public void changeGrab(byte g){ - Message msg=new Message(); - msg.what = g; - mHandler.sendMessage(msg); - } - - @Override - public void beforeTextChanged(CharSequence p1, int p2, int p3, int p4) { - - } - - @Override - public void onTextChanged(CharSequence p1, int p2, int p3, int p4) { - - } - - @Override - public void afterTextChanged(Editable p1) { - - String newText = p1.toString(); - if (newText.length() < 1) { - - mInputEventSender.setKey(Keyboard.KEY_BACK, true,0); - mInputEventSender.setKey(Keyboard.KEY_BACK, false,0); - inputScanner.setText(">"); - inputScanner.setSelection(1); - } - if (newText.length() > 1) { - for (int i = 1; i < newText.length(); i++) { - mInputEventSender.setKey(0, true, newText.charAt(i)); - mInputEventSender.setKey(0, false, newText.charAt(i)); - } - - inputScanner.setText(">"); - inputScanner.setSelection(1); - } - } - - @Override - public boolean onEditorAction(TextView p1, int p2, KeyEvent p3) { - - mInputEventSender.setKey(Keyboard.KEY_RETURN, true, '\n'); - mInputEventSender.setKey(Keyboard.KEY_RETURN, false, '\n'); - return false; - } - - @Override - public boolean onTouch(View p1, MotionEvent p2) { - - //Log.e("TouchedView","ID: "+p1.getId()); - //Log.e("MotionEvent",p2.getAction()+""); - - if (p1 == inputScanner) { - inputScanner.setSelection(1); - return false; - } - - //开关栏手势 - if(p1 == SwitcherBar_switcher){ - switch(p2.getAction()){ - case MotionEvent.ACTION_DOWN: - switcher_isClickOnly = true; - break; - case MotionEvent.ACTION_MOVE: - switcher_isClickOnly = false; - case MotionEvent.ACTION_UP: - if(switcher_isClickOnly){ - OnClickSwitcherBar(); - }else{ - //nothing. - } - } - OnMoveSwitcherBar(p1,p2); - return true; - } - - //物品栏手势 - if(p1 instanceof ItemButton){ - OnTouchItemButton((ItemButton) p1,p2); - return false; - } - - //全键盘手势 - if((p1 instanceof QwertButton) && p1 != qwertkeyboard_move){ - OnTouchQwertKeyboard((QwertButton)p1,p2); - return false; - } - - //摇杆拖动手势 - if(p1 == joystick_move){ - OnMoveJoyStick(p1,p2); - return true; - } - - //移动全键盘 - if(p1 == qwertkeyboard_move){ - OnMoveQwertKeyboard(p1,p2); - return true; - } - - //十字键手势 - if(p1 instanceof CrossButton){ - //Log.e("StartTouchCross","true"); - OnTouchCrossKey(p1,p2); - return false; - } - - //移动十字键 - if(p1 == crosskey_move){ - OnMoveCrossKey((Button)p1,p2); - return true; - } - - //自定义虚拟按键手势 - for(GameButton gameButton : KeyboardList){ - if(p1 == gameButton){ - OnTouchVirtualKeyboard(gameButton,p2); - return false; - } - } - - //屏幕鼠标手势 - if(p1 instanceof MouseButton){ - OnTouchMouseKey((MouseButton) p1,p2); - return false; - } - - //移动屏幕鼠标 - if(p1 == mousekey_move){ - OnMoveMouseKey(p1,p2); - return true; - } - - - //鼠标指针 - if (p1 == touchpad) { - OnTouchVirtualMouse(p2); - OnClickTouchPad(p2); - return !(p2.getAction() == MotionEvent.ACTION_DOWN || p2.getAction() == MotionEvent.ACTION_UP); - } - - return false; - - } - - - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - if (hasFocus) { - popupWindow.showAtLocation(BoatClientActivity.this.getWindow().getDecorView(), Gravity.TOP | Gravity.LEFT, 0, 0); - } - } - - - /**【初始化界面和布局】**/ - public void InitWindowsAndScreenKeyboard(){ - //初始化一个悬浮窗口 - popupWindow = new PopupWindow(); - popupWindow.setWidth(LayoutParams.MATCH_PARENT); - popupWindow.setHeight(LayoutParams.MATCH_PARENT); - popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); - popupWindow.setFocusable(true); - - //设定界面 - //base = (RelativeLayout) LayoutInflater.from(BoatClientActivity.this).inflate(R.layout.overlay, null); - base = findViewById(R.id.base); - touchpad = base.findViewById(R.id.touchpad).findViewById(R.id.touchpad_button); - touchpad.setOnTouchListener(this); - touchpad.setOnLongClickListener(longclicklistener); - - mouseCursor = base.findViewById(R.id.mouse_cursor); - itemBar = base.findViewById(R.id.item_bar); - inputScanner = base.findViewById(R.id.input_scanner); - inputScanner.setFocusable(true); - inputScanner.addTextChangedListener(this); - inputScanner.setOnEditorActionListener(this); - inputScanner.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_ACTION_DONE); - inputScanner.setSelection(1); - inputScanner.bringToFront(); - QwertKeyboard = base.findViewById(R.id.QwertKeyboard); - CrossKey = base.findViewById(R.id.CrossKey); - MouseKey = base.findViewById(R.id.MouseKey); - crosskeychildren = new CrossButton[]{CrossKey.findViewById(R.id.crosskey_up_left), CrossKey.findViewById(R.id.crosskey_up_right), CrossKey.findViewById(R.id.crosskey_down_left), CrossKey.findViewById(R.id.crosskey_down_right)}; - SwitcherBar = base.findViewById(R.id.SwitcherBar); - checkbox_qwertkeyboard = SwitcherBar.findViewById(R.id.checkbox_QwertKeyboard); - checkbox_crosskey = SwitcherBar.findViewById(R.id.checkbox_CrossKey); - checkbox_virtualkeyboard = SwitcherBar.findViewById(R.id.checkbox_VirtualKeyboard); - checkbox_mousekey = SwitcherBar.findViewById(R.id.checkbox_MouseKey); - checkbox_joystick = SwitcherBar.findViewById(R.id.checkbox_Joystick); - checkbox_otg = SwitcherBar.findViewById(R.id.checkbox_Otg); - checkbox_lock = SwitcherBar.findViewById(R.id.checkbox_Lock); - checkbox_edittext = SwitcherBar.findViewById(R.id.checkbox_Edittext); - checkbox_modeswitch = SwitcherBar.findViewById(R.id.checkbox_ModeSwitch); - checkbox_helper = SwitcherBar.findViewById(R.id.checkbox_Help); - toolerBarChildren = new CheckBox[]{checkbox_qwertkeyboard,checkbox_crosskey,checkbox_mousekey,checkbox_virtualkeyboard,checkbox_otg,checkbox_joystick,checkbox_lock,checkbox_edittext,checkbox_modeswitch,checkbox_helper}; - SwitcherBar_container = SwitcherBar.findViewById(R.id.switchbar_container); - SwitcherBar_switcher = SwitcherBar.findViewById(R.id.switchbar_switcher); - SwitcherBar_switcher.setOnTouchListener(this); - JoyStick = base.findViewById(R.id.JoyStick); - JoyStick_Rocker = JoyStick.findViewById(R.id.joystick_rocker); - JoyStick_Rocker.setCallBackMode(RockerView.CallBackMode.CALL_BACK_MODE_STATE_CHANGE); - JoyStick_Rocker.setOnShakeListener(RockerView.DirectionMode.DIRECTION_8,shakelistener); - joystick_move = JoyStick.findViewById(R.id.joystick_move); - joystick_move.setOnTouchListener(this); - qwertkeyboard_move = QwertKeyboard.findViewById(R.id.QwertKeyboard_move); - crosskey_move = CrossKey.findViewById(R.id.crosskey_move); - mousekey_move = MouseKey.findViewById(R.id.mousekey_move); - //设定checkbox监听 - for(CheckBox checkBox:toolerBarChildren){ - checkBox.setOnCheckedChangeListener(checkedlistener); - } - - //设定虚拟鼠标 - for(int i =0; i < MouseKey.getChildCount();i++){ - if(MouseKey.getChildAt(i) instanceof Button){ - MouseKey.getChildAt(i).setOnTouchListener(this); - }else { - for (int a = 0; a < ((LinearLayout) MouseKey.getChildAt(i)).getChildCount(); a++) { - (((LinearLayout) MouseKey.getChildAt(i)).getChildAt(a)).setOnTouchListener(this); - } - } - } - - //设定物品栏 - for(int i = 0;i < itemBar.getChildCount();i++){ - itemBar.getChildAt(i).setOnTouchListener(this); - } - - //计算并设定物品栏大小 - int height = getWindowManager().getDefaultDisplay().getHeight(); - int width = getWindowManager().getDefaultDisplay().getWidth(); - int scale = 1; - while (width / (scale + 1) >= 320 && height / (scale + 1) >= 240) { - scale++; - } - RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) itemBar.getLayoutParams(); - lp.height = 20 * scale; - lp.width = 20 * scale * 9; - itemBar.setLayoutParams(lp); - - //添加虚拟键盘 - KeyboardList = InitFromFile(); - for(GameButton gameButton : KeyboardList){ - gameButton.bringToFront(); - base.addView(gameButton); - gameButton.setOnTouchListener(this); - } - - //设定QwertKeyboard全键盘的监听 - for(int i = 0;i < ((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildCount();i++){ - for(int a = 0;a < ((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildCount();a++){ - if(((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a) instanceof LinearLayout){ - for(int b = 0;b <((LinearLayout)((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a)).getChildCount() ;b++){ - ((LinearLayout)((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a)).getChildAt(b).setOnTouchListener(this); - } - }else { - ((LinearLayout) ((LinearLayout) base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a).setOnTouchListener(this); - } - } - } - - //设定CrossKey十字键的监听 - for(int i = 0;i < ((LinearLayout)base.findViewById(R.id.CrossKey)).getChildCount();i++){ - if(((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i) instanceof Button){ - ((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i).setOnTouchListener(this); - }else{ - for(int a = 0;a < ((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildCount();a++){ - for(int b = 0;b< ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildCount();b++){ - ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildAt(b).setOnTouchListener(this); - ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildAt(b).getBackground().setAlpha(150); - } - } - } - } - - - //显示布局到悬浮窗 - popupWindow.setContentView(base); - - //代码动态添加Qwert全键盘 - //QwertKeyboard = (LinearLayout) getLayoutInflater().inflate(R.layout.virtual_keyboard,null); - //base.addView(QwertKeyboard); - - } - - - /**【从文件获取虚拟键盘】**/ - public ArrayList InitFromFile(){ - InputStream inputStream; - Gson gson = new Gson(); - File jsonFile = new File(argsModel.getKeyboardFilePath()); - Log.e("InitFromFile",argsModel.getKeyboardFilePath()); - ArrayList keyboardList = new ArrayList(); - if(!jsonFile.exists()){ - Toast.makeText(this, "找不到键盘模板", Toast.LENGTH_SHORT).show(); - return null; - } - try { - inputStream = new FileInputStream(jsonFile); - Reader reader = new InputStreamReader(inputStream); - KeyboardJsonModel[] jsonArray = new Gson().fromJson(reader, KeyboardJsonModel[].class); - List tempList1 = Arrays.asList(jsonArray); - ArrayList tempList2 = new ArrayList(tempList1); - if(tempList2.size() != 0){ - //Toast.makeText(this, "导入成功", Toast.LENGTH_SHORT).show(); - for(KeyboardJsonModel targetModel : tempList2){ - GameButton gameButton = GetButtonFromModel(targetModel.getKeyName(),targetModel.getKeySizeW(),targetModel.getKeySizeH(),targetModel.getKeyLX(),targetModel.getKeyLY(),targetModel.getKeyMain(),targetModel.getSpecialOne(),targetModel.getSpecialTwo(),targetModel.isAutoKeep(),targetModel.isHide(),targetModel.isMult(),targetModel.getMainPos(),targetModel.getSpecialOnePos(),targetModel.getSpecialTwoPos(),targetModel.getColorhex(),targetModel.getCornerRadius()); - keyboardList.add(gameButton); - } - }else{ - //Toast.makeText(this, "导入失败", Toast.LENGTH_SHORT).show(); - return null; - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - return keyboardList; - } - - public GameButton GetButtonFromModel(String KeyName, int KeySizeW,int KeySizeH, float KeyLX, float KeyLY, String KeyMain, String SpecialOne, String SpecialTwo, boolean isAutoKeep, boolean isHide, boolean isMult,int MainPos,int SpecialOnePos,int SpecialTwoPos,String colorhex,int conerRadius){ - GameButton KeyButton = new GameButton(getApplicationContext()); - //设置外观以及基本属性 - KeyButton.setText(KeyName); - KeyButton.setLayoutParams(new ViewGroup.LayoutParams((int)getPxFromDp(this,KeySizeW),(int)getPxFromDp(this,KeySizeH) )); - KeyButton.setX(getPxFromDp(this,KeyLX)); - KeyButton.setY(getPxFromDp(this,KeyLY)); - KeyButton.setKeyLX_dp(KeyLX); - KeyButton.setKeyLY_dp(KeyLY); - KeyButton.setKeySizeW(KeySizeW); - KeyButton.setKeySizeH(KeySizeH); - KeyButton.setKeep(isAutoKeep); - KeyButton.setHide(isHide); - KeyButton.setSpecialOne(SpecialOne); - KeyButton.setSpecialTwo(SpecialTwo); - KeyButton.setKeyMain(KeyMain); - KeyButton.setMult(isMult); - KeyButton.setClickable(true); - KeyButton.setId(KeyButton.hashCode()); - KeyButton.setGravity(Gravity.CENTER); - KeyButton.setMainPos(MainPos); - KeyButton.setSpecialOnePos(SpecialOnePos); - KeyButton.setSpecialTwoPos(SpecialTwoPos); - KeyButton.setCornerRadius(conerRadius); - KeyButton.setColorHex(colorhex); - GradientDrawable gradientDrawable = new GradientDrawable(); - gradientDrawable.setShape(GradientDrawable.RECTANGLE); - gradientDrawable.setColor(ColorUtils.hex2Int(colorhex)); - gradientDrawable.setCornerRadius(conerRadius); - KeyButton.setBackground(gradientDrawable); - - //设置键索引 - KeyButton.setMainIndex(GLFW_KeyTool.IndexKeyMap(KeyMain)); - if(isMult){ - KeyButton.setSpecialOneIndex(GLFW_KeyTool.IndexKeyMap(SpecialOne)); - KeyButton.setSpecialTwoIndex(GLFW_KeyTool.IndexKeyMap(SpecialTwo)); - } - return KeyButton; - } - - public static float getPxFromDp(Context context, float dpValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (float) (dpValue * scale + 0.5f); - } - - public static float getDpFromPx(Context context, float pxValue){ - final float scale = context.getResources().getDisplayMetrics().density; - return ((float) ((pxValue - 0.5f)/scale))+1; - } - - private void OnTouchVirtualKeyboard(GameButton gameButton,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - if(gameButton.isKeep()){ - if(autoKeep.containsKey(gameButton)){ - autoKeep.remove(gameButton); - return; - }else{ - autoKeep.put(gameButton,true); - } - } - if(gameButton.isMult()){ - Log.e("VirtualKey-Mult","KeyName: " + gameButton.getKeyMain() + " " + gameButton.getSpecialOne() + " " + gameButton.getSpecialTwo() +" KeyIndex: " + gameButton.getMainIndex() + " " + gameButton.getSpecialOneIndex() + " " + gameButton.getSpecialTwoIndex() + " Status: " + "pressed"); - //首先要判断返回值是否为-1,如果是的话,就不要执行这个按键 - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()), true, 0); - } - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialOneIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialOneIndex()), true, 0); - } - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialTwoIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialTwoIndex()), true, 0); - } - }else{ - Log.e("VirtualKey-Single","KeyName: " + gameButton.getKeyMain() + " KeyIndex: " + gameButton.getMainIndex() + " Status: " + "pressed"); - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()), true, 0); - } - } - }else if (p2.getActionMasked() == MotionEvent.ACTION_UP){ - if(gameButton.isKeep() && autoKeep.containsKey(gameButton)){ - return; - } - if(gameButton.isMult()){ - Log.e("VirtualKey-Mult","KeyName: " + gameButton.getKeyMain() + " " + gameButton.getSpecialOne() + " " + gameButton.getSpecialTwo() +" KeyIndex: " + gameButton.getMainIndex() + " " + gameButton.getSpecialOneIndex() + " " + gameButton.getSpecialTwoIndex() + " Status: " + "uped"); - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()), false, 0); - } - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialOneIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialOneIndex()), false, 0); - } - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialTwoIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getSpecialTwoIndex()), false, 0); - } - }else{ - Log.e("VirtualKey-Single","KeyName: " + gameButton.getKeyMain() + " KeyIndex: " + gameButton.getMainIndex() + " Status: " + "uped"); - if(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()) != -1){ - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(gameButton.getMainIndex()), false, 0); - } - } - } - } - - private void OnTouchVirtualMouse(MotionEvent p2){ - if (mode) { - switch (p2.getActionMasked()) { - case MotionEvent.ACTION_DOWN: - initialX = (int) p2.getX(); - initialY = (int) p2.getY(); - case MotionEvent.ACTION_MOVE: - mInputEventSender.setPointer(baseX + (int) p2.getX() - initialX, baseY + (int) p2.getY() - initialY); - break; - case MotionEvent.ACTION_UP: - baseX += ((int) p2.getX() - initialX); - baseY += ((int) p2.getY() - initialY); - - mInputEventSender.setPointer(baseX, baseY); - break; - default: - break; - } - } else { - baseX = (int) p2.getX(); - baseY = (int) p2.getY(); - mInputEventSender.setPointer(baseX, baseY); - } - mouseCursor.setX(p2.getX()); - mouseCursor.setY(p2.getY()); - } - - private void OnTouchMouseKey(MouseButton p1,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - Log.e("ItemButton","MouseName: " + p1.getMouseName() + " MouseIndex: " + ConvertInput.GetMouseFromGLFW(p1.getMouseIndex()) + " pressed"); - mInputEventSender.setMouseButton(ConvertInput.GetMouseFromGLFW(p1.getMouseIndex()), true); - }else if(p2.getActionMasked() == MotionEvent.ACTION_UP){ - Log.e("ItemButton","MouseName: " + p1.getMouseName() + " MouseIndex: " + ConvertInput.GetMouseFromGLFW(p1.getMouseIndex()) + " uped"); - mInputEventSender.setMouseButton(ConvertInput.GetMouseFromGLFW(p1.getMouseIndex()), false); - } - } - private void OnTouchItemButton(ItemButton p1,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - Log.e("ItemButton","KeyName: " + p1.getButtonName() + " KeyIndex: " + ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()) + " pressed"); - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()),true,0); - }else if(p2.getActionMasked() == MotionEvent.ACTION_UP){ - Log.e("ItemButton","KeyName: " + p1.getButtonName() + " KeyIndex: " + ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()) + " uped"); - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()),false,0); - } - } - - private void OnTouchQwertKeyboard(QwertButton p1,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - Log.e("QwertKeyboard","KeyName: " + p1.getButtonName() + " KeyIndex: " + ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()) + " pressed"); - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()),true,0); - }else if(p2.getActionMasked() == MotionEvent.ACTION_UP){ - Log.e("QwertKeyboard","KeyName: " + p1.getButtonName() + " KeyIndex: " + ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()) + " uped"); - mInputEventSender.setKey(ConvertInput.GetLwjglInputFromGLFW(p1.getButtonIndex()),false,0); - } - } - - private void OnTouchCrossKey(View p1,MotionEvent p2){ - int[] Indexs = ApplyCrossKeyByTouchPosition(CrossKey.findViewById(R.id.crosskey_shift),CrossKey.findViewById(R.id.crosskey_parent),p2); - switch (p2.getAction()){ - case MotionEvent.ACTION_DOWN: - Log.e("Action","Down"); - for(int temp:Indexs){ - Log.e("OnTouchCrossKey","ACTION_DOWN " + temp); - } - SendDownOrUpToInput(tempCrossKey,Indexs,1); - tempCrossKey = Indexs; - break; - case MotionEvent.ACTION_MOVE: - Log.e("Action","Move"); - SendDownOrUpToInput(tempCrossKey,Indexs,1); - break; - case MotionEvent.ACTION_UP: - Log.e("Action","Up"); - for(int temp:Indexs){ - Log.e("OnTouchCrossKey","Release Index: "+temp); - mInputEventSender.setKey(temp,false,0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - SendDownOrUpToInput(tempCrossKey,Indexs,1); - tempCrossKey = null; - default: - break; - } - } - - private void OnMoveSwitcherBar(View p1,MotionEvent p3){ - MoveViewByTouch(p1,SwitcherBar,p3); - } - private void OnClickSwitcherBar(){ - ShowOrHideViewByClick(SwitcherBar_container,View.INVISIBLE); - } - private void OnMoveJoyStick(View p1,MotionEvent p2){ - MoveViewByTouch(p1,JoyStick,p2); - } - - private void OnMoveMouseKey(View p1,MotionEvent p2){ - MoveViewByTouch(p1,MouseKey,p2); - } - - private void OnMoveCrossKey(Button p1,MotionEvent p2){ - MoveViewByTouch(p1,CrossKey,p2); - } - - private void OnMoveQwertKeyboard(View p1,MotionEvent p2){ - MoveViewByTouch(p1,QwertKeyboard,p2); - } - - private void ShowOrHideViewByClick(View p1,int mode){ - if(p1.getVisibility() == View.VISIBLE){ - switch(mode){ - case View.GONE: - p1.setVisibility(View.GONE); - break; - case View.INVISIBLE: - p1.setVisibility(View.INVISIBLE); - break; - default: - break; - } - }else{ - p1.setVisibility(View.VISIBLE); - } - } - - private void MoveViewByTouch(View p1,View p2, MotionEvent p3){ - switch(p3.getAction()){ - case MotionEvent.ACTION_DOWN: - if(!layoutsPos.containsKey(p2)){ - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - }else{ - layoutsPos.remove(p2); - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - } - break; - case MotionEvent.ACTION_MOVE: - int dx = (int) p3.getRawX() - layoutsPos.get(p2)[0]; - int dy = (int) p3.getRawY() - layoutsPos.get(p2)[1]; - int l = p2.getLeft() + dx; - int b = p2.getBottom() + dy; - int r = p2.getRight() + dx; - int t = p2.getTop() + dy; - //下面判断移动是否超出屏幕 - if(l < 0){ - l = 0; - r = l + p2.getWidth(); - } - if(t < 0){ - t = 0; - b = t+ p2.getHeight(); - } - if(r > screenWidth){ - r = screenWidth; - l = r - p2.getWidth(); - } - if(b > screenHeight){ - b = screenHeight; - t = b - p2.getHeight(); - } - p2.layout(l,t,r,b); - layoutsPos.remove(p2); - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - p2.postInvalidate(); - break; - case MotionEvent.ACTION_UP: - break; - default: - break; - } - - } - - //p1传入中间位置按键 p2传入corsskey p3传入触摸事件 - public int[] ApplyCrossKeyByTouchPosition(View p1,View p2,MotionEvent p3){ - int[] initPos = new int[2]; - p2.getLocationOnScreen(initPos); - int[] changPos = {(int) p3.getRawX() - initPos[0],(int) p3.getRawY() - initPos[1]}; - int[] targetPos = new int[2]; - p1.getLocationOnScreen(targetPos); - Log.e("CrossKeyTouchDebug","TouchX: " + p3.getRawX() + " TouchY: " + p3.getRawY()); - Log.e("CrossKeyTochDebug","ChangeX " + changPos[0] + " ChangeY: " + changPos[1]); - //自左向右,第一列 - if(changPos[0] < targetPos[0] - initPos[0] && changPos[0] >= 0){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //左上 - Log.e("CrossKey","Up-Left"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_W,Keyboard.KEY_A}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //左中 - Log.e("CrossKey","Center-Left"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[0],crosskeychildren[2]},p3); - return (new int[]{Keyboard.KEY_A}); - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //左下 - Log.e("CrossKey","Down-Left"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_S,Keyboard.KEY_A}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - //第二列 - }else if(changPos[0] <= targetPos[0] + p1.getWidth() - initPos[0] && changPos[0] >= targetPos[0] - initPos[0]){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //上 - Log.e("CrossKey","Up"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[0],crosskeychildren[1]},p3); - return (new int[]{Keyboard.KEY_W}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //中 - Log.e("CrossKey","Center"); - ReflectCrossKeyToScreen(new View[]{},p3); - if(p3.getAction() == MotionEvent.ACTION_MOVE){ - return(new int[]{}); - }else{ - return (new int[]{Keyboard.KEY_LSHIFT}); - } - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //下 - Log.e("CrossKey","Down"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[2],crosskeychildren[3]},p3); - return (new int[]{Keyboard.KEY_S}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - //第三列 - }else if(changPos[0] > targetPos[0] + p1.getWidth() - initPos[0] && changPos[0] <= p2.getWidth()){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //右上 - Log.e("CrossKey","Up-Right"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_W,Keyboard.KEY_D}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //右中 - Log.e("CrossKey","Right"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[1],crosskeychildren[3]},p3); - return (new int[]{Keyboard.KEY_D}); - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //右下 - Log.e("CrossKey","Down-Right"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_S,Keyboard.KEY_D}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - return (new int[]{}); - } - - private void ReflectCrossKeyToScreen(View[] views,MotionEvent p1){ - switch(p1.getAction()){ - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_MOVE: - for(View v1:crosskeychildren){ - v1.setVisibility(View.INVISIBLE); - for(View v2:views){ - if(v1 == v2){ - v1.setVisibility(View.VISIBLE); - } - } - } - break; - case MotionEvent.ACTION_UP: - for(View v1:crosskeychildren){ - v1.setVisibility(View.INVISIBLE); - } - break; - default: - break; - } - } - - private void SendDownOrUpToInput(int[] recordKeys,int[] downKeys,int mode){ - if(recordKeys == null){ - if(mode == 1){ - tempCrossKey = downKeys; - }else if(mode ==2){ - recordJoyStick = downKeys; - } - for (int temp : downKeys) { - Log.e("DnOrUpInput", "Catch Index: " + temp); - mInputEventSender.setKey(temp, true, 0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }else if(Arrays.equals(recordKeys,downKeys)){ - Log.e("DnOrUpInput","KeepPressed."); - return; - }else{ - for(int temp:recordKeys){ - Log.e("DnOrUpInput","Release Index: "+temp); - mInputEventSender.setKey(temp,false,0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - if(mode == 1){ - tempCrossKey = downKeys; - }else if(mode ==2){ - recordJoyStick = downKeys; - } - for (int temp : downKeys) { - Log.e("DnOrUpInput", "Catch Index: " + temp); - mInputEventSender.setKey(temp, true, 0); - } - } - } - - - - private CompoundButton.OnCheckedChangeListener checkedlistener = new CompoundButton.OnCheckedChangeListener(){ - - @Override - public void onCheckedChanged(CompoundButton v,boolean ischecked){ - if (v == checkbox_qwertkeyboard) { - if(ischecked){ - QwertKeyboard.setVisibility(View.VISIBLE); - }else{ - QwertKeyboard.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_crosskey){ - if(ischecked){ - CrossKey.setVisibility(View.VISIBLE); - }else{ - CrossKey.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_virtualkeyboard){ - if(ischecked){ - for(GameButton button:KeyboardList){ - button.setVisibility(View.INVISIBLE); - } - }else{ - for(GameButton button:KeyboardList){ - button.setVisibility(View.VISIBLE); - } - } - }else if(v == checkbox_mousekey){ - if(ischecked){ - MouseKey.setVisibility(View.VISIBLE); - }else{ - MouseKey.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_otg){ - //Otg switch - - }else if(v == checkbox_joystick){ - if(ischecked){ - JoyStick.setVisibility(View.VISIBLE); - }else{ - JoyStick.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_lock){ - if(ischecked){ - joystick_move.setVisibility(View.VISIBLE); - mousekey_move.setVisibility(View.VISIBLE); - crosskey_move.setVisibility(View.VISIBLE); - }else{ - joystick_move.setVisibility(View.INVISIBLE); - mousekey_move.setVisibility(View.INVISIBLE); - crosskey_move.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_edittext){ - if(ischecked){ - inputScanner.setVisibility(View.VISIBLE); - }else{ - inputScanner.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_modeswitch){ - if(mode){ - mode = false; - BoatClientActivity.this.mouseCursor.setVisibility(View.VISIBLE); - }else{ - mode = true; - BoatClientActivity.this.mouseCursor.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_helper){ - Helper helper = new Helper(getApplication()); - helper.show(); - } - } - }; - - private void ChangeLayoutParam(View p1){ - RelativeLayout.LayoutParams lpFeedback = new RelativeLayout.LayoutParams( - RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT); - lpFeedback.leftMargin = p1.getLeft(); - lpFeedback.topMargin = p1.getTop(); - lpFeedback.setMargins(p1.getLeft(),p1.getTop(),0,0); - p1.setLayoutParams(lpFeedback); - - } - - private RockerView.OnShakeListener shakelistener = new RockerView.OnShakeListener() { - @Override - public void onStart() { - } - - @Override - public void direction(RockerView.Direction direction) { - OnJoyStickShake(direction); - } - - @Override - public void onFinish() { - for(int temp:recordJoyStick){ - Log.e("JoyStick","Release Index " + temp); - mInputEventSender.setKey(temp,false,0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - recordJoyStick = null; - } - }; - - private void OnJoyStickShake(RockerView.Direction direction) { - String message = null; - int[] temp = new int[]{}; - switch (direction) { - case DIRECTION_LEFT: - message = "左"; - temp = new int[]{Keyboard.KEY_A}; - break; - case DIRECTION_RIGHT: - message = "右"; - temp = new int[]{Keyboard.KEY_D}; - break; - case DIRECTION_UP: - message = "上"; - temp = new int[]{Keyboard.KEY_W}; - break; - case DIRECTION_DOWN: - message = "下"; - temp = new int[]{Keyboard.KEY_S}; - break; - case DIRECTION_UP_LEFT: - message = "左上"; - temp = new int[]{Keyboard.KEY_W,Keyboard.KEY_A}; - break; - case DIRECTION_UP_RIGHT: - message = "右上"; - temp = new int[]{Keyboard.KEY_W,Keyboard.KEY_D}; - break; - case DIRECTION_DOWN_LEFT: - message = "左下"; - temp = new int[]{Keyboard.KEY_S,Keyboard.KEY_A}; - break; - case DIRECTION_DOWN_RIGHT: - message = "右下"; - temp = new int[]{Keyboard.KEY_S,Keyboard.KEY_D}; - break; - default: - break; - } - Log.e("JoyStick",message); - SendDownOrUpToInput(recordJoyStick,temp,2); - } - - private void OnClickTouchPad(MotionEvent p1){ - if(mode){ - //捕获模式 - switch(p1.getAction()){ - case MotionEvent.ACTION_DOWN: - break; - case MotionEvent.ACTION_MOVE: - TOUCH_IS_MOVED = true; - - break; - case MotionEvent.ACTION_UP: - if(!TOUCH_LONG_APPLY && !TOUCH_IS_MOVED){ - mInputEventSender.setMouseButton((byte)2,true); - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - mInputEventSender.setMouseButton((byte)2,false); - } - if(TOUCH_LONG_APPLY){ - Log.e("Screen","释放长按操作!"); - mInputEventSender.setMouseButton((byte)1,false); - } - TOUCH_IS_MOVED = false; - TOUCH_LONG_APPLY = false; - - } - }else{ - //鼠标模式 - switch(p1.getAction()){ - case MotionEvent.ACTION_DOWN: - mInputEventSender.setMouseButton((byte)1,true); //boat-2 - break; - case MotionEvent.ACTION_MOVE: - break; - case MotionEvent.ACTION_UP: - mInputEventSender.setMouseButton((byte)1,false); //boat-2 - break; - default: - break; - } - } - } - - private Button.OnLongClickListener longclicklistener = new Button.OnLongClickListener(){ - @Override - public boolean onLongClick(View view){ - if (mode && !TOUCH_IS_MOVED && view == touchpad) { - Log.e("Screen", "OnLongClickListener执行长按操作!"); - TOUCH_LONG_APPLY = true; - mInputEventSender.setMouseButton((byte) 1, true); - return false; - } - return false; - } - }; - - public void onDestroy() { - super.onDestroy(); - } - - - /* - Client Implenment - */ - @Override - public void setKey(int keyCode, boolean pressed) { - mInputEventSender.setKey(keyCode,pressed,0); - } - - @Override - public void setMouseButton(int mouseCode, boolean pressed) { - mInputEventSender.setMouseButton((byte) mouseCode,pressed); - } - - @Override - public void setMousePoniter(int x, int y) { - mInputEventSender.setPointer(x,y); - } - - @Override - public Activity getActivity() { - return this; - } -} - diff --git a/boat/src/main/java/cosine/boat/BoatInput.java b/boat/src/main/java/cosine/boat/BoatInput.java new file mode 100644 index 00000000..9118a705 --- /dev/null +++ b/boat/src/main/java/cosine/boat/BoatInput.java @@ -0,0 +1,51 @@ +package cosine.boat; + +import android.app.*; +import android.util.Log; + +public class BoatInput{ + + public static final int KeyPress = 2; + public static final int KeyRelease = 3; + public static final int ButtonPress = 4; + public static final int ButtonRelease = 5; + public static final int MotionNotify = 6; + + public static final int Button1 = 1; + public static final int Button2 = 2; + public static final int Button3 = 3; + public static final int Button4 = 4; + public static final int Button5 = 5; + public static final int Button6 = 6; + public static final int Button7 = 7; + + public static final int CursorEnabled = 1; + public static final int CursorDisabled = 0; + + static { + System.loadLibrary("boat"); + } + + public static void setMouseButton(int button, boolean press) { + send(System.nanoTime(), press ? ButtonPress : ButtonRelease, button, 0); + } + public static void setPointer(int x, int y) { + send(System.nanoTime(), MotionNotify, x, y); + } + + public static void setKey(int keyCode, int keyChar, boolean press){ + send(System.nanoTime(), press ? KeyPress : KeyRelease, keyCode, keyChar); + } + + + public static native void send(long time, int type, int p1, int p2); + + // To be called by lwjgl/glfw. + public static BoatActivity mActivity; + public static void setCursorMode(int mode){ + if(mActivity != null){ + mActivity.setCursorMode(mode); + } + } + +} diff --git a/boat/src/main/java/cosine/boat/BoatInputEventSender.java b/boat/src/main/java/cosine/boat/BoatInputEventSender.java deleted file mode 100644 index 2dcd2a34..00000000 --- a/boat/src/main/java/cosine/boat/BoatInputEventSender.java +++ /dev/null @@ -1,171 +0,0 @@ -package cosine.boat; -import java.util.Deque; -import java.util.ArrayDeque; -import java.util.concurrent.BlockingDeque; -import java.util.concurrent.LinkedBlockingDeque; -import java.io.IOException; -import java.net.ServerSocket; -import java.net.InetSocketAddress; -import java.io.InputStream; -import java.net.Socket; -import java.io.OutputStream; - -public class BoatInputEventSender{ - - public static final int KeyPress = 2; - public static final int KeyRelease = 3; - public static final int ButtonPress = 4; - public static final int ButtonRelease = 5; - public static final int MotionNotify = 6; - - private static final int MESSAGE_SIZE = 10; - private static final int CACHE_SIZE = 8 * MESSAGE_SIZE; - - - private Deque cachedObjs = new ArrayDeque(CACHE_SIZE); - private BlockingDeque deque = new LinkedBlockingDeque(); - - public ServerSocket serverSock; - public Socket sock; - - private OutputStream os; - private InputStream is; - public int port; - public boolean receiving; - public boolean running; - - private BoatClientActivity activity; - public void startServer(BoatClientActivity a){ - activity = a; - running = true; - try{ - this.serverSock = new ServerSocket(); - this.serverSock.bind(new InetSocketAddress("127.0.0.1", 0)); - new Thread(new Sender()).start(); - new Thread(new Receiver()).start(); - port = this.serverSock.getLocalPort(); - System.out.println("BoatInputEventSender is created!The port is:" + port); - - } - catch (IOException e){ - e.printStackTrace(); - } - } - - private class Receiver implements Runnable - { - - @Override - public void run() - { - // TODO: Implement this method - try { - - while(!receiving){ - - } - byte[] msg = new byte[1]; - - while (running) { - - is.read(msg, 0, 1); - - activity.changeGrab(msg[0]); - - } - - } catch (Exception e) { - e.printStackTrace(); - } - - - } - - - } - - private class Sender implements Runnable - { - - @Override - public void run() - { - // TODO: Implement this method - try { - BoatInputEventSender.this.sock = BoatInputEventSender.this.serverSock.accept(); - BoatInputEventSender.this.serverSock.close(); - BoatInputEventSender.this.os = BoatInputEventSender.this.sock.getOutputStream(); - BoatInputEventSender.this.is = BoatInputEventSender.this.sock.getInputStream(); - BoatInputEventSender.this.receiving = true; - while (running) { - byte[] event = deque.take(); - os.write(event); - recycle(event); - } - sock.close(); - } catch (Exception e) { - e.printStackTrace(); - } - System.out.println("Exiting input event sender"); - } - - - } - - - private byte[] obtain() { - byte[] msg = this.cachedObjs.poll(); - if (msg == null) { - return new byte[MESSAGE_SIZE]; - } - return msg; - } - - private void recycle(byte[] msg) { - if (this.cachedObjs.size() < CACHE_SIZE) { - this.cachedObjs.add(msg); - } - } - - - - public static void writeInt(byte[] src, int offset, int i) { - src[0 + offset] = (byte)( i >> (0 * 8)); - src[1 + offset] = (byte)( i >> (1 * 8)); - src[2 + offset] = (byte)( i >> (2 * 8)); - src[3 + offset] = (byte)( i >> (3 * 8)); - } - - - public void setMouseButton(byte button, boolean press) { - byte[] msg = obtain(); - msg[0] = (byte) (press ? ButtonPress : ButtonRelease); - msg[1] = button; - this.deque.add(msg); - } - public void setPointer(int x, int y) { - byte[] msg = obtain(); - msg[0] = (byte) (MotionNotify); - writeInt(msg, 2, x); - writeInt(msg, 6, y); - this.deque.add(msg); - } - public void setKey(int keyCode, boolean press , int keyChar){ - //处理鼠标按钮 - if(keyCode == 1001){ - setMouseButton((byte)1,press); - return; - }else if(keyCode == 1002){ - setMouseButton((byte)2,press); - return; - } - - - byte[] msg = obtain(); - msg[0] = (byte) (press ? KeyPress : KeyRelease); - writeInt(msg, 2, keyCode); - writeInt(msg, 6, keyChar); - this.deque.add(msg); - } - -} diff --git a/boat/src/main/java/cosine/boat/LauncherActivity.java b/boat/src/main/java/cosine/boat/LauncherActivity.java index 6ff83839..69732537 100644 --- a/boat/src/main/java/cosine/boat/LauncherActivity.java +++ b/boat/src/main/java/cosine/boat/LauncherActivity.java @@ -2,48 +2,45 @@ import android.app.Activity; import android.os.Bundle; -import com.aof.sharedmodule.Model.ArgsModel; +import com.aof.mcinabox.definitions.models.BoatArgs; import cosine.boat.logcat.Logcat; import cosine.boat.logcat.LogcatService; -import ru.ivanarh.jndcrash.NDCrashError; import ru.ivanarh.jndcrash.NDCrash; +import ru.ivanarh.jndcrash.NDCrashError; import ru.ivanarh.jndcrash.NDCrashService; import ru.ivanarh.jndcrash.NDCrashUnwinder; import android.content.Intent; -import static com.aof.sharedmodule.Data.DataPathManifest.*; +import static com.aof.mcinabox.definitions.manifest.AppManifest.*; public class LauncherActivity extends Activity{ - public ArgsModel argsModel; + public BoatArgs boatArgs; public void onCreate(Bundle savedInstance) { super.onCreate(savedInstance); //从序列化中取出参数对象 - argsModel = (ArgsModel) getIntent().getSerializableExtra("LauncherConfig"); - - //初始化日志 - //【release版暂时不开启】 - - //final String logPath = BOAT_HOME + "/log.txt"; - //Logcat.initializeOutOfProcess(this, logPath, LogcatService.class); - - - final String reportPath = BOAT_HOME + "/crash.txt"; - System.out.println("Crash report: " + reportPath); - final NDCrashError error = NDCrash.initializeOutOfProcess(this, reportPath, NDCrashUnwinder.libcorkscrew, NDCrashService.class); - if (error == NDCrashError.ok) { - System.out.println("NDCrash: OK"); - // Initialization is successful. - } else { - System.out.println("NDCrash: Error"); - System.out.println(error.name()); - // Initialization failed, check error value. + boatArgs = (BoatArgs) getIntent().getSerializableExtra("LauncherConfig"); + + if(boatArgs.getDebug()){ + final String logPath = BOAT_CACHE_HOME + "/log.txt"; + Logcat.initializeOutOfProcess(this, logPath, LogcatService.class); + + final String reportPath = BOAT_CACHE_HOME + "/crash.txt"; + System.out.println("Crash report: " + reportPath); + final NDCrashError error = NDCrash.initializeOutOfProcess(this, reportPath, NDCrashUnwinder.libcorkscrew, NDCrashService.class); + if (error == NDCrashError.ok) { + System.out.println("NDCrash: OK"); + // Initialization is successful. + } else { + System.out.println("NDCrash: Error"); + System.out.println(error.name()); + // Initialization failed, check error value. + } } - //界面跳转至Client - Intent intent = new Intent(this, BoatClientActivity.class); - intent.putExtra("LauncherConfig", argsModel); + Intent intent = new Intent(this, BoatActivity.class); + intent.putExtra("LauncherConfig", boatArgs); this.startActivity(intent); this.finish(); diff --git a/boat/src/main/java/cosine/boat/LoadMe.java b/boat/src/main/java/cosine/boat/LoadMe.java index 53bcfe4a..87bd9cd8 100644 --- a/boat/src/main/java/cosine/boat/LoadMe.java +++ b/boat/src/main/java/cosine/boat/LoadMe.java @@ -1,12 +1,12 @@ package cosine.boat; -import com.aof.sharedmodule.Model.ArgsModel; -import static com.aof.sharedmodule.Data.DataPathManifest.*; +import com.aof.mcinabox.definitions.models.BoatArgs; +import static com.aof.mcinabox.definitions.manifest.AppManifest.*; public class LoadMe { public static native int chdir(String str); - public static native void jliLaunch(String[] strArr); + public static native int jliLaunch(String[] strArr); public static native void redirectStdio(String file); public static native void setenv(String str, String str2); public static native void setupJLI(); @@ -16,32 +16,27 @@ public class LoadMe { System.loadLibrary("boat"); } - public static int exec(ArgsModel args, BoatClientActivity activity) { + public static int exec(BoatArgs args) { try { - String runtimePath = RUNTIME_HOME; - String home = args.getHome(); - - setenv("HOME", home); - setenv("JAVA_HOME" ,runtimePath + "/j2re-image"); - setenv("BOAT_INPUT_PORT", Integer.toString(activity.mInputEventSender.port)); - - dlopen(runtimePath + "/j2re-image/lib/aarch32/jli/libjli.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/client/libjvm.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libverify.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libjava.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libnet.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libnio.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libawt.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libawt_headless.so"); - dlopen("libserver.so"); - dlopen(runtimePath + "/libopenal.so.1"); - dlopen(runtimePath + "/libGL.so.1"); - dlopen(runtimePath + "/lwjgl2/liblwjgl.so"); + + setenv("HOME", args.getGamedir()); + setenv("JAVA_HOME" ,args.getJava_home()); + + // sharedlibraries + for(String str : args.getShared_libraries()){ + dlopen(str); + } setupJLI(); - redirectStdio(home + "/boat_output.txt"); - chdir(home); - jliLaunch(args.getArgs()); + redirectStdio(BOAT_CACHE_HOME + "/boat_output.txt"); + chdir(args.getGamedir()); + + String finalArgs[] = new String[] {"java"}; + for (int i = 0; i < finalArgs.length; i++){ + + System.out.println(finalArgs[i]); + } + System.out.println("OpenJDK exited with code : " + jliLaunch(args.getArgs())); } catch (Exception e) { e.printStackTrace(); diff --git a/boat/src/main/java/cosine/boat/controller/VirtualController.java b/boat/src/main/java/cosine/boat/controller/VirtualController.java deleted file mode 100644 index 947e3afe..00000000 --- a/boat/src/main/java/cosine/boat/controller/VirtualController.java +++ /dev/null @@ -1,56 +0,0 @@ -package cosine.boat.controller; - -import android.app.Activity; -import android.util.Log; - -import com.aof.mcinabox.plugin.controller.controller.BaseController; -import com.aof.mcinabox.plugin.controller.keyevent.BaseKeyEvent; -import com.aof.mcinabox.plugin.controller.keyevent.Event; - -import cosine.boat.controller.inputers.virtual.CrossKey; - -public class VirtualController extends BaseController { - - public VirtualController(Activity activity) { - super(activity); - addInputer(new CrossKey()); - } - - @Override - public void sendKey(BaseKeyEvent event) { - toLog(event); - switch (event.getType()){ - case Event.KEYBOARD_BUTTON: - client.setKey(event.getKeyCode(),event.isPressed()); - break; - case Event.MOUSE_BUTTON: - client.setMouseButton(event.getKeyCode(),event.isPressed()); - break; - case Event.MOUSE_POINTER: - client.setMousePoniter(event.getPointer()[0],event.getPointer()[1]); - - break; - default: - break; - } - } - - private void toLog(BaseKeyEvent event){ - String info; - switch (event.getType()){ - case Event.KEYBOARD_BUTTON: - info = "Type: " + event.getType() + " KeyCode: " + event.getKeyCode() + " Pressed: " + event.isPressed(); - break; - case Event.MOUSE_BUTTON: - info = "Type: " + event.getType() + " MouseCode " + event.getKeyCode() + " Pressed: " + event.isPressed(); - break; - case Event.MOUSE_POINTER: - info = "Type: " + event.getType() + " PointerX: " + event.getPointer()[0] + " PointerY: " + event.getPointer()[1]; - break; - default: - info = "Unknown Type: " + event.getType(); - } - Log.i(event.getTag(),info); - - } -} diff --git a/boat/src/main/java/cosine/boat/controller/inputers/physcial/CodeTranslation.java b/boat/src/main/java/cosine/boat/controller/inputers/physcial/CodeTranslation.java deleted file mode 100644 index 8682420f..00000000 --- a/boat/src/main/java/cosine/boat/controller/inputers/physcial/CodeTranslation.java +++ /dev/null @@ -1,10 +0,0 @@ -package cosine.boat.controller.inputers.physcial; - -public class CodeTranslation { - public static int to(int origin){ - - //根据KeyEvent.getCode进行转换 - //TODO:物理键值 转换为 Lwjgl键值 - return 0; - } -} diff --git a/boat/src/main/java/cosine/boat/controller/inputers/physcial/Keyboard.java b/boat/src/main/java/cosine/boat/controller/inputers/physcial/Keyboard.java deleted file mode 100644 index e72d3255..00000000 --- a/boat/src/main/java/cosine/boat/controller/inputers/physcial/Keyboard.java +++ /dev/null @@ -1,48 +0,0 @@ -package cosine.boat.controller.inputers.physcial; - -import android.app.Activity; -import android.view.KeyEvent; - -import com.aof.mcinabox.plugin.controller.controller.Controller; -import com.aof.mcinabox.plugin.controller.inputer.Inputer; -import com.aof.mcinabox.plugin.controller.keyevent.BaseKeyEvent; - -public class Keyboard extends KeyboardSupport implements Inputer { - - Controller mController; - Activity mContext; - - @Override - public boolean load(Activity context, Controller controller) { - this.mController = controller; - this.mContext = context; - return false; - } - - @Override - public boolean unload() { - return false; - } - - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - sendKeyEvent(event,true); - return false; - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - sendKeyEvent(event,false); - return false; - } - - public void sendKeyEvent(KeyEvent event, boolean pressed){ - /*TODO: 这里写 物理键盘 按下时的操作 - 暂时用屏幕控制器传输数据,如果有必要的话以后重写一个物理控制器 - */ - BaseKeyEvent mEvent = new BaseKeyEvent("Controller(Keyboard)",event.getCharacters(),CodeTranslation.to(event.getKeyCode()),pressed,KEYBOARD_BUTTON,null); - mController.sendKey(mEvent); - } -} - - diff --git a/boat/src/main/java/cosine/boat/controller/inputers/physcial/KeyboardSupport.java b/boat/src/main/java/cosine/boat/controller/inputers/physcial/KeyboardSupport.java deleted file mode 100644 index 0868cb23..00000000 --- a/boat/src/main/java/cosine/boat/controller/inputers/physcial/KeyboardSupport.java +++ /dev/null @@ -1,25 +0,0 @@ -package cosine.boat.controller.inputers.physcial; - -import android.view.KeyEvent; - -public class KeyboardSupport implements KeyEvent.Callback { - @Override - public boolean onKeyDown(int keyCode, KeyEvent event) { - return false; - } - - @Override - public boolean onKeyLongPress(int keyCode, KeyEvent event) { - return false; - } - - @Override - public boolean onKeyUp(int keyCode, KeyEvent event) { - return false; - } - - @Override - public boolean onKeyMultiple(int keyCode, int count, KeyEvent event) { - return false; - } -} diff --git a/boat/src/main/java/cosine/boat/controller/inputers/virtual/CrossKey.java b/boat/src/main/java/cosine/boat/controller/inputers/virtual/CrossKey.java deleted file mode 100644 index 2de40967..00000000 --- a/boat/src/main/java/cosine/boat/controller/inputers/virtual/CrossKey.java +++ /dev/null @@ -1,348 +0,0 @@ -package cosine.boat.controller.inputers.virtual; - -import android.app.Activity; -import android.util.Log; -import android.view.MotionEvent; -import android.view.View; -import android.widget.Button; -import android.widget.LinearLayout; -import android.widget.RelativeLayout; - -import com.aof.mcinabox.plugin.controller.controller.Controller; -import com.aof.mcinabox.plugin.controller.inputer.BaseScreenInputer; -import com.aof.mcinabox.plugin.controller.keyevent.Event; -import com.aof.mcinabox.plugin.controller.keyevent.BaseKeyEvent; -import com.aof.sharedmodule.Button.CrossButton; - -import org.lwjgl.input.Keyboard; - -import java.util.Arrays; -import java.util.HashMap; - -import cosine.boat.R; - -public class CrossKey implements BaseScreenInputer { - private Activity mContext; - private Controller mController; - private LinearLayout CrossKey; - private CrossButton[] crosskeychildren; - private int[] tempCrossKey; - private Button crosskey_move; - private RelativeLayout base; - private static int PAUSE_TIME = 10; - private int screenWidth; - private int screenHeight; - private HashMap layoutsPos; - - @Override - public boolean load(Activity context, Controller controller) { - mContext = context; - mController = controller; - screenWidth = context.getResources().getDisplayMetrics().widthPixels; - screenHeight = context.getResources().getDisplayMetrics().heightPixels; - layoutsPos = new HashMap<>(); - base = context.findViewById(R.id.base); - CrossKey = base.findViewById(R.id.CrossKey); - crosskeychildren = new CrossButton[]{CrossKey.findViewById(R.id.crosskey_up_left), CrossKey.findViewById(R.id.crosskey_up_right), CrossKey.findViewById(R.id.crosskey_down_left), CrossKey.findViewById(R.id.crosskey_down_right)}; - crosskey_move = CrossKey.findViewById(R.id.crosskey_move); - - //设定CrossKey十字键的监听 - for(int i = 0;i < ((LinearLayout)base.findViewById(R.id.CrossKey)).getChildCount();i++){ - if(((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i) instanceof Button){ - ((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i).setOnTouchListener(this); - }else{ - for(int a = 0;a < ((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildCount();a++){ - for(int b = 0;b< ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildCount();b++){ - ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildAt(b).setOnTouchListener(this); - ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildAt(b).getBackground().setAlpha(150); - } - } - } - } - - return true; - } - - @Override - public boolean unload() { - CrossKey.setVisibility(View.GONE); - return true; - } - - - @Override - public boolean onTouch(View p1, MotionEvent p2) { - //十字键手势 - if(p1 instanceof CrossButton){ - //Log.i("StartTouchCross","true"); - OnTouchCrossKey(p1,p2); - return false; - } - - //移动十字键 - if(p1 == crosskey_move){ - OnMoveCrossKey((Button)p1,p2); - return true; - } - - return false; - } - - @Override - public void setUiMoveable(boolean moveable) { - - } - - @Override - public void setUiVisiability(int visiablity) { - - } - - private void OnTouchCrossKey(View p1,MotionEvent p2){ - int[] Indexs = ApplyCrossKeyByTouchPosition(CrossKey.findViewById(R.id.crosskey_shift),CrossKey.findViewById(R.id.crosskey_parent),p2); - switch (p2.getAction()){ - case MotionEvent.ACTION_DOWN: - Log.i("Action","Down"); - for(int temp:Indexs){ - Log.i("OnTouchCrossKey","ACTION_DOWN " + temp); - } - SendDownOrUpToInput(tempCrossKey,Indexs,1); - tempCrossKey = Indexs; - break; - case MotionEvent.ACTION_MOVE: - Log.i("Action","Move"); - SendDownOrUpToInput(tempCrossKey,Indexs,1); - break; - case MotionEvent.ACTION_UP: - Log.i("Action","Up"); - for(int temp:Indexs){ - Log.i("OnTouchCrossKey","Release Index: "+temp); - sendKeyEvent(temp,false); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - SendDownOrUpToInput(tempCrossKey,Indexs,1); - tempCrossKey = null; - default: - break; - } - } - - private void OnMoveCrossKey(Button p1,MotionEvent p2){ - MoveViewByTouch(p1,CrossKey,p2); - } - - public int[] ApplyCrossKeyByTouchPosition(View p1,View p2,MotionEvent p3){ - int[] initPos = new int[2]; - p2.getLocationOnScreen(initPos); - int[] changPos = {(int) p3.getRawX() - initPos[0],(int) p3.getRawY() - initPos[1]}; - int[] targetPos = new int[2]; - p1.getLocationOnScreen(targetPos); - Log.i("CrossKeyTouchDebug","TouchX: " + p3.getRawX() + " TouchY: " + p3.getRawY()); - Log.i("CrossKeyTochDebug","ChangeX " + changPos[0] + " ChangeY: " + changPos[1]); - //自左向右,第一列 - if(changPos[0] < targetPos[0] - initPos[0] && changPos[0] >= 0){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //左上 - Log.i("CrossKey","Up-Left"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_W,Keyboard.KEY_A}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //左中 - Log.i("CrossKey","Center-Left"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[0],crosskeychildren[2]},p3); - return (new int[]{Keyboard.KEY_A}); - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //左下 - Log.i("CrossKey","Down-Left"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_S,Keyboard.KEY_A}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - //第二列 - }else if(changPos[0] <= targetPos[0] + p1.getWidth() - initPos[0] && changPos[0] >= targetPos[0] - initPos[0]){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //上 - Log.i("CrossKey","Up"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[0],crosskeychildren[1]},p3); - return (new int[]{Keyboard.KEY_W}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //中 - Log.i("CrossKey","Center"); - ReflectCrossKeyToScreen(new View[]{},p3); - if(p3.getAction() == MotionEvent.ACTION_MOVE){ - return(new int[]{}); - }else{ - return (new int[]{Keyboard.KEY_LSHIFT}); - } - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //下 - Log.i("CrossKey","Down"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[2],crosskeychildren[3]},p3); - return (new int[]{Keyboard.KEY_S}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - //第三列 - }else if(changPos[0] > targetPos[0] + p1.getWidth() - initPos[0] && changPos[0] <= p2.getWidth()){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //右上 - Log.i("CrossKey","Up-Right"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_W,Keyboard.KEY_D}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //右中 - Log.i("CrossKey","Right"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[1],crosskeychildren[3]},p3); - return (new int[]{Keyboard.KEY_D}); - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //右下 - Log.i("CrossKey","Down-Right"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{Keyboard.KEY_S,Keyboard.KEY_D}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - return (new int[]{}); - } - - private void ReflectCrossKeyToScreen(View[] views,MotionEvent p1){ - switch(p1.getAction()){ - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_MOVE: - for(View v1:crosskeychildren){ - v1.setVisibility(View.INVISIBLE); - for(View v2:views){ - if(v1 == v2){ - v1.setVisibility(View.VISIBLE); - } - } - } - break; - case MotionEvent.ACTION_UP: - for(View v1:crosskeychildren){ - v1.setVisibility(View.INVISIBLE); - } - break; - default: - break; - } - } - - private void SendDownOrUpToInput(int[] recordKeys,int[] downKeys,int mode){ - if(recordKeys == null){ - tempCrossKey = downKeys; - for (int temp : downKeys) { - Log.i("DnOrUpInput", "Catch Index: " + temp); - sendKeyEvent(temp, true); - - //时序 - paused(); - - } - }else if(Arrays.equals(recordKeys,downKeys)){ - Log.i("DnOrUpInput","KeepPressed."); - return; - }else{ - for(int temp:recordKeys){ - Log.i("DnOrUpInput","Release Index: "+temp); - sendKeyEvent(temp, false); - - //时序 - paused(); - - } - tempCrossKey = downKeys; - for (int temp : downKeys) { - Log.i("DnOrUpInput", "Catch Index: " + temp); - sendKeyEvent(temp, true); - } - } - } - - private void MoveViewByTouch(View p1,View p2, MotionEvent p3){ - switch(p3.getAction()){ - case MotionEvent.ACTION_DOWN: - if(!layoutsPos.containsKey(p2)){ - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - }else{ - layoutsPos.remove(p2); - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - } - break; - case MotionEvent.ACTION_MOVE: - int dx = (int) p3.getRawX() - layoutsPos.get(p2)[0]; - int dy = (int) p3.getRawY() - layoutsPos.get(p2)[1]; - int l = p2.getLeft() + dx; - int b = p2.getBottom() + dy; - int r = p2.getRight() + dx; - int t = p2.getTop() + dy; - //下面判断移动是否超出屏幕 - if(l < 0){ - l = 0; - r = l + p2.getWidth(); - } - if(t < 0){ - t = 0; - b = t+ p2.getHeight(); - } - if(r > screenWidth){ - r = screenWidth; - l = r - p2.getWidth(); - } - if(b > screenHeight){ - b = screenHeight; - t = b - p2.getHeight(); - } - p2.layout(l,t,r,b); - layoutsPos.remove(p2); - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - p2.postInvalidate(); - break; - case MotionEvent.ACTION_UP: - break; - default: - break; - } - - } - - private void paused(){ - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - } - - private void sendKeyEvent(int keyCode,boolean pressed){ - mController.sendKey(new BaseKeyEvent("Controller(CrossKey)",null,keyCode,pressed, Event.KEYBOARD_BUTTON,null)); - } - -} diff --git a/boat/src/main/java/cosine/boat/version3/BoatApplication.java b/boat/src/main/java/cosine/boat/version3/BoatApplication.java deleted file mode 100644 index 0c53ffe6..00000000 --- a/boat/src/main/java/cosine/boat/version3/BoatApplication.java +++ /dev/null @@ -1,70 +0,0 @@ -package cosine.boat.version3; - -import android.app.Application; -import android.app.Activity; -import android.os.Bundle; - -public class BoatApplication extends Application implements Application.ActivityLifecycleCallbacks -{ - public static Activity mCurrentActivity; - public static Activity getCurrentActivity(){ - return BoatApplication.mCurrentActivity; - } - - @Override - public void onActivityCreated(Activity p1, Bundle p2) - { - // TODO: Implement this method - - } - - @Override - public void onActivityStarted(Activity p1) - { - // TODO: Implement this method - BoatApplication.mCurrentActivity = p1; - System.out.println(BoatApplication.mCurrentActivity); - } - - @Override - public void onActivityResumed(Activity p1) - { - // TODO: Implement this method - - } - - @Override - public void onActivityPaused(Activity p1) - { - // TODO: Implement this method - - } - - @Override - public void onActivityStopped(Activity p1) - { - // TODO: Implement this method - } - - @Override - public void onActivitySaveInstanceState(Activity p1, Bundle p2) - { - // TODO: Implement this method - } - - @Override - public void onActivityDestroyed(Activity p1) - { - // TODO: Implement this method - } - - - @Override - public void onCreate() - { - // TODO: Implement this method - super.onCreate(); - this.registerActivityLifecycleCallbacks(this); - } - -} diff --git a/boat/src/main/java/cosine/boat/version3/BoatClientActivity.java b/boat/src/main/java/cosine/boat/version3/BoatClientActivity.java deleted file mode 100644 index dd6f36af..00000000 --- a/boat/src/main/java/cosine/boat/version3/BoatClientActivity.java +++ /dev/null @@ -1,1151 +0,0 @@ -package cosine.boat.version3; - -import android.content.Context; -import android.content.Intent; -import android.graphics.drawable.GradientDrawable; -import android.text.method.Touch; -import android.util.Log; -import android.view.MotionEvent; -import android.os.Bundle; -import android.app.NativeActivity; -import android.view.WindowManager; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.HorizontalScrollView; -import android.widget.ImageButton; -import android.widget.PopupWindow; -import android.widget.RelativeLayout; -import android.view.LayoutInflater; -import android.view.Gravity; -import android.view.WindowManager.LayoutParams; -import android.view.View; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.os.Handler; -import android.os.Message; -import android.widget.EditText; -import android.widget.TextView; -import android.text.TextWatcher; -import android.text.Editable; -import android.view.inputmethod.EditorInfo; -import android.view.KeyEvent; -import android.view.SurfaceHolder; - -import java.io.*; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; -import java.util.List; -import android.view.ViewGroup; -import android.widget.Toast; - -import com.aof.sharedmodule.Button.CrossButton; -import com.aof.sharedmodule.Button.ItemButton; -import com.aof.sharedmodule.Button.MouseButton; -import com.aof.sharedmodule.Button.QwertButton; -import com.aof.sharedmodule.Dialog.Helper; -import com.aof.sharedmodule.Tools.GLFW_KeyTool; -import com.google.gson.Gson; -import com.aof.sharedmodule.Model.ArgsModel; -import com.aof.sharedmodule.Tools.ColorUtils; -import com.aof.sharedmodule.Button.GameButton; -import com.aof.sharedmodule.Model.KeyboardJsonModel; -import com.kongqw.rockerlibrary.view.RockerView; - -import cosine.boat.R; - -import static org.lwjgl.glfw.GLFW.*; - -public class BoatClientActivity extends NativeActivity implements View.OnClickListener, View.OnTouchListener, TextWatcher, TextView.OnEditorActionListener { - - private ArgsModel argsModel; - private ArrayList KeyboardList; - private LinearLayout QwertKeyboard; - private LinearLayout CrossKey; - private LinearLayout MouseKey; - private LinearLayout SwitcherBar; - private LinearLayout JoyStick; - private int screenWidth,screenHeight; - private PopupWindow popupWindow; - private RelativeLayout base; - private LinearLayout itemBar; - private ImageView mouseCursor; - private EditText inputScanner; - public boolean mode = false; - private MyHandler mHandler; - private int initialX; - private int initialY; - private int baseX; - private int baseY; - private HashMap layoutsPos; - private CrossButton[] crosskeychildren; - private int[] tempCrossKey; - private CheckBox checkbox_qwertkeyboard,checkbox_crosskey,checkbox_mousekey,checkbox_virtualkeyboard,checkbox_otg,checkbox_joystick,checkbox_lock,checkbox_edittext,checkbox_modeswitch,checkbox_helper; - private CheckBox[] toolerBarChildren; - private HorizontalScrollView SwitcherBar_container; - private ImageButton SwitcherBar_switcher; - private boolean switcher_isClickOnly = true; - private RockerView JoyStick_Rocker; - private Button joystick_move; - private int[] recordJoyStick; - private Button touchpad; - private Button qwertkeyboard_move; - private Button mousekey_move; - private Button crosskey_move; - private HashMap autoKeep = new HashMap(); - - private final int PAUSE_TIME = 5; //ms - private boolean TOUCH_LONG_APPLY = false; - private boolean TOUCH_IS_MOVED = false; - - @Override - protected void onCreate(Bundle savedInstanceState) { - - super.onCreate(savedInstanceState); - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - //获取参数对象 - argsModel = (ArgsModel) getIntent().getSerializableExtra("LauncherConfig"); - //获取屏幕的长宽像素 - screenWidth = getResources().getDisplayMetrics().widthPixels; - screenHeight = getResources().getDisplayMetrics().heightPixels; - //初始化界面 - InitWindowsAndScreenKeyboard(); - //初始化hanlder - mHandler = new MyHandler(); - //初始化Map - layoutsPos = new HashMap(); - - } - - @Override - protected void onPause() { - super.onPause(); - popupWindow.dismiss(); - } - - - @Override - public void surfaceCreated(SurfaceHolder holder) { - - super.surfaceCreated(holder); - System.out.println("Surface is created!"); - - - new Thread() { - @Override - public void run() { - ArgsModel argsModel = (ArgsModel) getIntent().getSerializableExtra("LauncherConfig"); - LoadMe.exec(argsModel, BoatClientActivity.this); - Message msg = new Message(); - msg.what = -1; - mHandler.sendMessage(msg); - - } - }.start(); - } - - private class MyHandler extends Handler { - @Override - public void handleMessage(Message msg) { - - switch (msg.what) { - case 0: - BoatClientActivity.this.mouseCursor.setVisibility(View.INVISIBLE); - BoatClientActivity.this.itemBar.setVisibility(View.VISIBLE); - BoatClientActivity.this.mode = true; - break; - case 1: - BoatClientActivity.this.mouseCursor.setVisibility(View.VISIBLE); - BoatClientActivity.this.itemBar.setVisibility(View.INVISIBLE); - BoatClientActivity.this.mode = false; - break; - default: - BoatClientActivity.this.finish(); - break; - } - } - } - - private Button findButton(int id) { - Button b = (Button) base.findViewById(id); - b.setOnTouchListener(this); - return b; - } - - @Override - public void onClick(View p1) { - - if (p1 == inputScanner) { - inputScanner.setSelection(1); - } - } - - public void setCursorMode(int mode) { - Message msg = new Message(); - msg.what = mode; - mHandler.sendMessage(msg); - } - - @Override - public void beforeTextChanged(CharSequence p1, int p2, int p3, int p4) { - - } - - @Override - public void onTextChanged(CharSequence p1, int p2, int p3, int p4) { - - } - - @Override - public void afterTextChanged(Editable p1) { - - String newText = p1.toString(); - if (newText.length() < 1) { - - BoatInputEventSender.setKey(GLFW_KEY_BACKSPACE, true, 0); - BoatInputEventSender.setKey(GLFW_KEY_BACKSPACE, false, 0); - inputScanner.setText(">"); - inputScanner.setSelection(1); - } - if (newText.length() > 1) { - for (int i = 1; i < newText.length(); i++) { - BoatInputEventSender.setKey(0, true, newText.charAt(i)); - BoatInputEventSender.setKey(0, false, newText.charAt(i)); - } - - inputScanner.setText(">"); - inputScanner.setSelection(1); - } - } - - @Override - public boolean onEditorAction(TextView p1, int p2, KeyEvent p3) { - - BoatInputEventSender.setKey(GLFW_KEY_ENTER, true, '\n'); - BoatInputEventSender.setKey(GLFW_KEY_ENTER, false, '\n'); - return false; - } - - @Override - public boolean onTouch(View p1, MotionEvent p2) { - - //Log.e("TouchedView","ID: "+p1.getId()); - //Log.e("MotionEvent",p2.getAction()+""); - - if (p1 == inputScanner) { - inputScanner.setSelection(1); - return false; - } - - //开关栏手势 - if(p1 == SwitcherBar_switcher){ - switch(p2.getAction()){ - case MotionEvent.ACTION_DOWN: - switcher_isClickOnly = true; - break; - case MotionEvent.ACTION_MOVE: - switcher_isClickOnly = false; - case MotionEvent.ACTION_UP: - if(switcher_isClickOnly){ - OnClickSwitcherBar(); - }else{ - //nothing. - } - } - OnMoveSwitcherBar(p1,p2); - return true; - } - - //物品栏手势 - if(p1 instanceof ItemButton){ - OnTouchItemButton((ItemButton) p1,p2); - return false; - } - - //全键盘手势 - if((p1 instanceof QwertButton) && p1 != qwertkeyboard_move){ - OnTouchQwertKeyboard((QwertButton)p1,p2); - return false; - } - - //摇杆拖动手势 - if(p1 == joystick_move){ - OnMoveJoyStick(p1,p2); - return true; - } - - //移动全键盘 - if(p1 == qwertkeyboard_move){ - OnMoveQwertKeyboard(p1,p2); - return true; - } - - //十字键手势 - if(p1 instanceof CrossButton){ - OnTouchCrossKey(p1,p2); - return false; - } - - //移动十字键 - if(p1 == crosskey_move){ - OnMoveCrossKey((Button)p1,p2); - return true; - } - - //自定义虚拟按键手势 - for(GameButton gameButton : KeyboardList){ - if(p1 == gameButton){ - OnTouchVirtualKeyboard(gameButton,p2); - return false; - } - } - - //屏幕鼠标手势 - if(p1 instanceof MouseButton){ - OnTouchMouseKey((MouseButton) p1,p2); - return false; - } - - //移动屏幕鼠标 - if(p1 == mousekey_move){ - OnMoveMouseKey(p1,p2); - return true; - } - - - //鼠标指针 - if (p1 == touchpad) { - OnTouchVirtualMouse(p2); - OnClickTouchPad(p2); - return !(p2.getAction() == MotionEvent.ACTION_DOWN || p2.getAction() == MotionEvent.ACTION_UP); - } - - return false; - - } - - - @Override - public void onWindowFocusChanged(boolean hasFocus) { - super.onWindowFocusChanged(hasFocus); - if (hasFocus) { - popupWindow.showAtLocation(BoatClientActivity.this.getWindow().getDecorView(), Gravity.TOP | Gravity.LEFT, 0, 0); - } - } - - - /**【初始化界面和布局】**/ - public void InitWindowsAndScreenKeyboard(){ - //初始化一个悬浮窗口 - popupWindow = new PopupWindow(); - popupWindow.setWidth(LayoutParams.MATCH_PARENT); - popupWindow.setHeight(LayoutParams.MATCH_PARENT); - popupWindow.setInputMethodMode(PopupWindow.INPUT_METHOD_NEEDED); - popupWindow.setFocusable(true); - - //设定界面 - base = (RelativeLayout) LayoutInflater.from(BoatClientActivity.this).inflate(R.layout.overlay, null); - touchpad = base.findViewById(R.id.touchpad).findViewById(R.id.touchpad_button); - touchpad.setOnTouchListener(this); - touchpad.setOnLongClickListener(longclicklistener); - - mouseCursor = base.findViewById(R.id.mouse_cursor); - itemBar = base.findViewById(R.id.item_bar); - inputScanner = base.findViewById(R.id.input_scanner); - inputScanner.setFocusable(true); - inputScanner.addTextChangedListener(this); - inputScanner.setOnEditorActionListener(this); - inputScanner.setImeOptions(EditorInfo.IME_FLAG_NO_EXTRACT_UI | EditorInfo.IME_FLAG_NO_FULLSCREEN | EditorInfo.IME_ACTION_DONE); - inputScanner.setSelection(1); - inputScanner.bringToFront(); - QwertKeyboard = base.findViewById(R.id.QwertKeyboard); - CrossKey = base.findViewById(R.id.CrossKey); - MouseKey = base.findViewById(R.id.MouseKey); - crosskeychildren = new CrossButton[]{CrossKey.findViewById(R.id.crosskey_up_left), CrossKey.findViewById(R.id.crosskey_up_right), CrossKey.findViewById(R.id.crosskey_down_left), CrossKey.findViewById(R.id.crosskey_down_right)}; - SwitcherBar = base.findViewById(R.id.SwitcherBar); - checkbox_qwertkeyboard = SwitcherBar.findViewById(R.id.checkbox_QwertKeyboard); - checkbox_crosskey = SwitcherBar.findViewById(R.id.checkbox_CrossKey); - checkbox_virtualkeyboard = SwitcherBar.findViewById(R.id.checkbox_VirtualKeyboard); - checkbox_mousekey = SwitcherBar.findViewById(R.id.checkbox_MouseKey); - checkbox_joystick = SwitcherBar.findViewById(R.id.checkbox_Joystick); - checkbox_otg = SwitcherBar.findViewById(R.id.checkbox_Otg); - checkbox_lock = SwitcherBar.findViewById(R.id.checkbox_Lock); - checkbox_edittext = SwitcherBar.findViewById(R.id.checkbox_Edittext); - checkbox_modeswitch = SwitcherBar.findViewById(R.id.checkbox_ModeSwitch); - checkbox_helper = SwitcherBar.findViewById(R.id.checkbox_Help); - toolerBarChildren = new CheckBox[]{checkbox_qwertkeyboard,checkbox_crosskey,checkbox_mousekey,checkbox_virtualkeyboard,checkbox_otg,checkbox_joystick,checkbox_lock,checkbox_edittext,checkbox_modeswitch,checkbox_helper}; - SwitcherBar_container = SwitcherBar.findViewById(R.id.switchbar_container); - SwitcherBar_switcher = SwitcherBar.findViewById(R.id.switchbar_switcher); - SwitcherBar_switcher.setOnTouchListener(this); - JoyStick = base.findViewById(R.id.JoyStick); - JoyStick_Rocker = JoyStick.findViewById(R.id.joystick_rocker); - JoyStick_Rocker.setCallBackMode(RockerView.CallBackMode.CALL_BACK_MODE_STATE_CHANGE); - JoyStick_Rocker.setOnShakeListener(RockerView.DirectionMode.DIRECTION_8,shakelistener); - joystick_move = JoyStick.findViewById(R.id.joystick_move); - joystick_move.setOnTouchListener(this); - qwertkeyboard_move = QwertKeyboard.findViewById(R.id.QwertKeyboard_move); - crosskey_move = CrossKey.findViewById(R.id.crosskey_move); - mousekey_move = MouseKey.findViewById(R.id.mousekey_move); - //设定checkbox监听 - for(CheckBox checkBox:toolerBarChildren){ - checkBox.setOnCheckedChangeListener(checkedlistener); - } - - //设定虚拟鼠标 - for(int i =0; i < MouseKey.getChildCount();i++){ - if(MouseKey.getChildAt(i) instanceof Button){ - MouseKey.getChildAt(i).setOnTouchListener(this); - }else { - for (int a = 0; a < ((LinearLayout) MouseKey.getChildAt(i)).getChildCount(); a++) { - (((LinearLayout) MouseKey.getChildAt(i)).getChildAt(a)).setOnTouchListener(this); - } - } - } - - //设定物品栏 - for(int i = 0;i < itemBar.getChildCount();i++){ - itemBar.getChildAt(i).setOnTouchListener(this); - } - - //计算并设定物品栏大小 - int height = getWindowManager().getDefaultDisplay().getHeight(); - int width = getWindowManager().getDefaultDisplay().getWidth(); - int scale = 1; - while (width / (scale + 1) >= 320 && height / (scale + 1) >= 240) { - scale++; - } - RelativeLayout.LayoutParams lp = (RelativeLayout.LayoutParams) itemBar.getLayoutParams(); - lp.height = 20 * scale; - lp.width = 20 * scale * 9; - itemBar.setLayoutParams(lp); - - //添加虚拟键盘 - KeyboardList = InitFromFile(); - for(GameButton gameButton : KeyboardList){ - gameButton.bringToFront(); - base.addView(gameButton); - gameButton.setOnTouchListener(this); - } - - //设定QwertKeyboard全键盘的监听 - for(int i = 0;i < ((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildCount();i++){ - for(int a = 0;a < ((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildCount();a++){ - if(((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a) instanceof LinearLayout){ - for(int b = 0;b <((LinearLayout)((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a)).getChildCount() ;b++){ - ((LinearLayout)((LinearLayout)((LinearLayout)base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a)).getChildAt(b).setOnTouchListener(this); - } - }else { - ((LinearLayout) ((LinearLayout) base.findViewById(R.id.QwertKeyboard)).getChildAt(i)).getChildAt(a).setOnTouchListener(this); - } - } - } - - //设定CrossKey十字键的监听 - for(int i = 0;i < ((LinearLayout)base.findViewById(R.id.CrossKey)).getChildCount();i++){ - if(((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i) instanceof Button){ - ((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i).setOnTouchListener(this); - }else{ - for(int a = 0;a < ((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildCount();a++){ - for(int b = 0;b< ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildCount();b++){ - ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildAt(b).setOnTouchListener(this); - ((LinearLayout)(((LinearLayout)((LinearLayout)base.findViewById(R.id.CrossKey)).getChildAt(i)).getChildAt(a))).getChildAt(b).getBackground().setAlpha(150); - } - } - } - } - - - //显示布局到悬浮窗 - popupWindow.setContentView(base); - - //代码动态添加Qwert全键盘 - //QwertKeyboard = (LinearLayout) getLayoutInflater().inflate(R.layout.virtual_keyboard,null); - //base.addView(QwertKeyboard); - - } - - - /**【从文件获取虚拟键盘】**/ - public ArrayList InitFromFile(){ - InputStream inputStream; - Gson gson = new Gson(); - File jsonFile = new File(argsModel.getKeyboardFilePath()); - Log.e("InitFromFile",argsModel.getKeyboardFilePath()); - ArrayList keyboardList = new ArrayList(); - if(!jsonFile.exists()){ - Toast.makeText(this, "找不到键盘模板", Toast.LENGTH_SHORT).show(); - return null; - } - try { - inputStream = new FileInputStream(jsonFile); - Reader reader = new InputStreamReader(inputStream); - KeyboardJsonModel[] jsonArray = new Gson().fromJson(reader, KeyboardJsonModel[].class); - List tempList1 = Arrays.asList(jsonArray); - ArrayList tempList2 = new ArrayList(tempList1); - if(tempList2.size() != 0){ - //Toast.makeText(this, "导入成功", Toast.LENGTH_SHORT).show(); - for(KeyboardJsonModel targetModel : tempList2){ - GameButton gameButton = GetButtonFromModel(targetModel.getKeyName(),targetModel.getKeySizeW(),targetModel.getKeySizeH(),targetModel.getKeyLX(),targetModel.getKeyLY(),targetModel.getKeyMain(),targetModel.getSpecialOne(),targetModel.getSpecialTwo(),targetModel.isAutoKeep(),targetModel.isHide(),targetModel.isMult(),targetModel.getMainPos(),targetModel.getSpecialOnePos(),targetModel.getSpecialTwoPos(),targetModel.getColorhex(),targetModel.getCornerRadius()); - keyboardList.add(gameButton); - } - }else{ - //Toast.makeText(this, "导入失败", Toast.LENGTH_SHORT).show(); - return null; - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - return keyboardList; - } - - public GameButton GetButtonFromModel(String KeyName, int KeySizeW,int KeySizeH, float KeyLX, float KeyLY, String KeyMain, String SpecialOne, String SpecialTwo, boolean isAutoKeep, boolean isHide, boolean isMult,int MainPos,int SpecialOnePos,int SpecialTwoPos,String colorhex,int conerRadius){ - GameButton KeyButton = new GameButton(getApplicationContext()); - //设置外观以及基本属性 - KeyButton.setText(KeyName); - KeyButton.setLayoutParams(new ViewGroup.LayoutParams((int)getPxFromDp(this,KeySizeW),(int)getPxFromDp(this,KeySizeH) )); - KeyButton.setX(getPxFromDp(this,KeyLX)); - KeyButton.setY(getPxFromDp(this,KeyLY)); - KeyButton.setKeyLX_dp(KeyLX); - KeyButton.setKeyLY_dp(KeyLY); - KeyButton.setKeySizeW(KeySizeW); - KeyButton.setKeySizeH(KeySizeH); - KeyButton.setKeep(isAutoKeep); - KeyButton.setHide(isHide); - KeyButton.setSpecialOne(SpecialOne); - KeyButton.setSpecialTwo(SpecialTwo); - KeyButton.setKeyMain(KeyMain); - KeyButton.setMult(isMult); - KeyButton.setClickable(true); - KeyButton.setId(KeyButton.hashCode()); - KeyButton.setGravity(Gravity.CENTER); - KeyButton.setMainPos(MainPos); - KeyButton.setSpecialOnePos(SpecialOnePos); - KeyButton.setSpecialTwoPos(SpecialTwoPos); - KeyButton.setCornerRadius(conerRadius); - KeyButton.setColorHex(colorhex); - GradientDrawable gradientDrawable = new GradientDrawable(); - gradientDrawable.setShape(GradientDrawable.RECTANGLE); - gradientDrawable.setColor(ColorUtils.hex2Int(colorhex)); - gradientDrawable.setCornerRadius(conerRadius); - KeyButton.setBackground(gradientDrawable); - - //设置键索引 - KeyButton.setMainIndex(GLFW_KeyTool.IndexKeyMap(KeyMain)); - if(isMult){ - KeyButton.setSpecialOneIndex(GLFW_KeyTool.IndexKeyMap(SpecialOne)); - KeyButton.setSpecialTwoIndex(GLFW_KeyTool.IndexKeyMap(SpecialTwo)); - } - return KeyButton; - } - - public static float getPxFromDp(Context context, float dpValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (float) (dpValue * scale + 0.5f); - } - - public static float getDpFromPx(Context context, float pxValue){ - final float scale = context.getResources().getDisplayMetrics().density; - return ((float) ((pxValue - 0.5f)/scale))+1; - } - - private void OnTouchVirtualKeyboard(GameButton gameButton,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - if(gameButton.isKeep()){ - if(autoKeep.containsKey(gameButton)){ - autoKeep.remove(gameButton); - return; - }else{ - autoKeep.put(gameButton,true); - } - } - if(gameButton.isMult()){ - Log.e("VirtualKey-Mult","KeyName: " + gameButton.getKeyMain() + " " + gameButton.getSpecialOne() + " " + gameButton.getSpecialTwo() +" KeyIndex: " + gameButton.getMainIndex() + " " + gameButton.getSpecialOneIndex() + " " + gameButton.getSpecialTwoIndex() + " Status: " + "pressed"); - BoatInputEventSender.setKey(gameButton.getMainIndex(), true, 0); - BoatInputEventSender.setKey(gameButton.getSpecialOneIndex(), true, 0); - BoatInputEventSender.setKey(gameButton.getSpecialTwoIndex(), true, 0); - }else{ - Log.e("VirtualKey-Single","KeyName: " + gameButton.getKeyMain() + " KeyIndex: " + gameButton.getMainIndex() + " Status: " + "pressed"); - BoatInputEventSender.setKey(gameButton.getMainIndex(), true, 0); - } - }else if (p2.getActionMasked() == MotionEvent.ACTION_UP){ - if(gameButton.isMult()){ - Log.e("VirtualKey-Mult","KeyName: " + gameButton.getKeyMain() + " " + gameButton.getSpecialOne() + " " + gameButton.getSpecialTwo() +" KeyIndex: " + gameButton.getMainIndex() + " " + gameButton.getSpecialOneIndex() + " " + gameButton.getSpecialTwoIndex() + " Status: " + "uped"); - BoatInputEventSender.setKey(gameButton.getMainIndex(), false, 0); - BoatInputEventSender.setKey(gameButton.getSpecialOneIndex(), false, 0); - BoatInputEventSender.setKey(gameButton.getSpecialTwoIndex(), false, 0); - }else{ - Log.e("VirtualKey-Single","KeyName: " + gameButton.getKeyMain() + " KeyIndex: " + gameButton.getMainIndex() + " Status: " + "uped"); - BoatInputEventSender.setKey(gameButton.getMainIndex(), false, 0); - } - } - } - - private void OnTouchVirtualMouse(MotionEvent p2){ - if (mode){ - switch(p2.getActionMasked()){ - case MotionEvent.ACTION_DOWN: - initialX = (int)p2.getX(); - initialY = (int)p2.getY(); - case MotionEvent.ACTION_MOVE: - BoatInputEventSender.setPointer(baseX + (int)p2.getX() -initialX, baseY + (int)p2.getY() - initialY); - break; - case MotionEvent.ACTION_UP: - baseX += ((int)p2.getX() - initialX); - baseY += ((int)p2.getY() - initialY); - - BoatInputEventSender.setPointer(baseX, baseY); - break; - default: - break; - } - } - else{ - baseX = (int)p2.getX(); - baseY = (int)p2.getY(); - BoatInputEventSender.setPointer(baseX, baseY); - } - mouseCursor.setX(p2.getX()); - mouseCursor.setY(p2.getY()); - } - - private void OnTouchMouseKey(MouseButton p1,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - Log.e("ItemButton","MouseName: " + p1.getMouseName() + " MouseIndex: " + p1.getMouseIndex() + " pressed"); - BoatInputEventSender.setMouseButton(p1.getMouseIndex(), true); - }else if(p2.getActionMasked() == MotionEvent.ACTION_UP){ - Log.e("ItemButton","MouseName: " + p1.getMouseName() + " MouseIndex: " + p1.getMouseIndex() + " uped"); - BoatInputEventSender.setMouseButton(p1.getMouseIndex(), false); - } - } - - private void OnTouchItemButton(ItemButton p1,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - Log.e("ItemButton","KeyName: " + p1.getButtonName() + " KeyIndex: " + p1.getButtonIndex() + " pressed"); - BoatInputEventSender.setKey(p1.getButtonIndex(),true,0); - }else if(p2.getActionMasked() == MotionEvent.ACTION_UP){ - Log.e("ItemButton","KeyName: " + p1.getButtonName() + " KeyIndex: " + p1.getButtonIndex() + " uped"); - BoatInputEventSender.setKey(p1.getButtonIndex(),false,0); - } - } - - private void OnTouchQwertKeyboard(QwertButton p1,MotionEvent p2){ - if(p2.getActionMasked() == MotionEvent.ACTION_DOWN){ - Log.e("QwertKeyboard","KeyName: " + p1.getButtonName() + " KeyIndex: " + p1.getButtonIndex() + " pressed"); - BoatInputEventSender.setKey(p1.getButtonIndex(),true,0); - }else if(p2.getActionMasked() == MotionEvent.ACTION_UP){ - Log.e("QwertKeyboard","KeyName: " + p1.getButtonName() + " KeyIndex: " + p1.getButtonIndex() + " uped"); - BoatInputEventSender.setKey(p1.getButtonIndex(),false,0); - } - } - - private void OnTouchCrossKey(View p1,MotionEvent p2){ - int[] Indexs = ApplyCrossKeyByTouchPosition(CrossKey.findViewById(R.id.crosskey_shift),CrossKey.findViewById(R.id.crosskey_parent),p2); - switch (p2.getAction()){ - case MotionEvent.ACTION_DOWN: - Log.e("Action","Down"); - for(int temp:Indexs){ - Log.e("OnTouchCrossKey","ACTION_DOWN " + temp); - } - SendDownOrUpToInput(tempCrossKey,Indexs,1); - tempCrossKey = Indexs; - break; - case MotionEvent.ACTION_MOVE: - Log.e("Action","Move"); - SendDownOrUpToInput(tempCrossKey,Indexs,1); - break; - case MotionEvent.ACTION_UP: - Log.e("Action","Up"); - for(int temp:Indexs){ - Log.e("OnTouchCrossKey","Release Index: "+temp); - BoatInputEventSender.setKey(temp,false,0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - SendDownOrUpToInput(tempCrossKey,Indexs,1); - tempCrossKey = null; - default: - break; - } - } - - private void OnMoveSwitcherBar(View p1,MotionEvent p3){ - MoveViewByTouch(p1,SwitcherBar,p3); - } - private void OnClickSwitcherBar(){ - ShowOrHideViewByClick(SwitcherBar_container,View.INVISIBLE); - } - private void OnMoveJoyStick(View p1,MotionEvent p2){ - MoveViewByTouch(p1,JoyStick,p2); - } - - private void OnMoveMouseKey(View p1,MotionEvent p2){ - MoveViewByTouch(p1,MouseKey,p2); - } - - private void OnMoveCrossKey(Button p1,MotionEvent p2){ - MoveViewByTouch(p1,CrossKey,p2); - } - - private void OnMoveQwertKeyboard(View p1,MotionEvent p2){ - MoveViewByTouch(p1,QwertKeyboard,p2); - } - - private void ShowOrHideViewByClick(View p1,int mode){ - if(p1.getVisibility() == View.VISIBLE){ - switch(mode){ - case View.GONE: - p1.setVisibility(View.GONE); - break; - case View.INVISIBLE: - p1.setVisibility(View.INVISIBLE); - break; - default: - break; - } - }else{ - p1.setVisibility(View.VISIBLE); - } - } - - private void MoveViewByTouch(View p1,View p2, MotionEvent p3){ - switch(p3.getAction()){ - case MotionEvent.ACTION_DOWN: - if(!layoutsPos.containsKey(p2)){ - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - }else{ - layoutsPos.remove(p2); - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - } - break; - case MotionEvent.ACTION_MOVE: - int dx = (int) p3.getRawX() - layoutsPos.get(p2)[0]; - int dy = (int) p3.getRawY() - layoutsPos.get(p2)[1]; - int l = p2.getLeft() + dx; - int b = p2.getBottom() + dy; - int r = p2.getRight() + dx; - int t = p2.getTop() + dy; - //下面判断移动是否超出屏幕 - if(l < 0){ - l = 0; - r = l + p2.getWidth(); - } - if(t < 0){ - t = 0; - b = t+ p2.getHeight(); - } - if(r > screenWidth){ - r = screenWidth; - l = r - p2.getWidth(); - } - if(b > screenHeight){ - b = screenHeight; - t = b - p2.getHeight(); - } - p2.layout(l,t,r,b); - layoutsPos.remove(p2); - layoutsPos.put(p2,(new int[]{(int)p3.getRawX(),(int)p3.getRawY()})); - p2.postInvalidate(); - break; - case MotionEvent.ACTION_UP: - break; - default: - break; - } - - } - - //p1传入中间位置按键 p2传入corsskey p3传入触摸事件 - public int[] ApplyCrossKeyByTouchPosition(View p1,View p2,MotionEvent p3){ - int[] initPos = new int[2]; - p2.getLocationOnScreen(initPos); - int[] changPos = {(int) p3.getRawX() - initPos[0],(int) p3.getRawY() - initPos[1]}; - int[] targetPos = new int[2]; - p1.getLocationOnScreen(targetPos); - Log.e("CrossKeyTouchDebug","TouchX: " + p3.getRawX() + " TouchY: " + p3.getRawY()); - Log.e("CrossKeyTochDebug","ChangeX " + changPos[0] + " ChangeY: " + changPos[1]); - //自左向右,第一列 - if(changPos[0] < targetPos[0] - initPos[0] && changPos[0] >= 0){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //左上 - Log.e("CrossKey","Up-Left"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{GLFW_KEY_W,GLFW_KEY_A}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //左中 - Log.e("CrossKey","Center-Left"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[0],crosskeychildren[2]},p3); - return (new int[]{GLFW_KEY_A}); - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //左下 - Log.e("CrossKey","Down-Left"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{GLFW_KEY_S,GLFW_KEY_A}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - //第二列 - }else if(changPos[0] <= targetPos[0] + p1.getWidth() - initPos[0] && changPos[0] >= targetPos[0] - initPos[0]){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //上 - Log.e("CrossKey","Up"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[0],crosskeychildren[1]},p3); - return (new int[]{GLFW_KEY_W}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //中 - Log.e("CrossKey","Center"); - ReflectCrossKeyToScreen(new View[]{},p3); - if(p3.getAction() == MotionEvent.ACTION_MOVE){ - return(new int[]{}); - }else{ - return (new int[]{GLFW_KEY_LEFT_SHIFT}); - } - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //下 - Log.e("CrossKey","Down"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[2],crosskeychildren[3]},p3); - return (new int[]{GLFW_KEY_S}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - //第三列 - }else if(changPos[0] > targetPos[0] + p1.getWidth() - initPos[0] && changPos[0] <= p2.getWidth()){ - if(changPos[1] < targetPos[1] - initPos[1] && changPos[1] >= 0){ - //右上 - Log.e("CrossKey","Up-Right"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{GLFW_KEY_W,GLFW_KEY_D}); - }else if(changPos[1] <= targetPos[1] + p1.getHeight() - initPos[1] && changPos[1] >= targetPos[1] -initPos[1]){ - //右中 - Log.e("CrossKey","Right"); - ReflectCrossKeyToScreen(new View[]{crosskeychildren[1],crosskeychildren[3]},p3); - return (new int[]{GLFW_KEY_D}); - }else if(changPos[1] > 0 && changPos[1] > changPos[1] + p1.getHeight() - initPos[1] && changPos[1] <= p2.getHeight()){ - //右下 - Log.e("CrossKey","Down-Right"); - if(p3.getAction() != MotionEvent.ACTION_MOVE) { - ReflectCrossKeyToScreen(new View[]{}, p3); - } - return (new int[]{GLFW_KEY_S,GLFW_KEY_D}); - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - }else{ - SendDownOrUpToInput(tempCrossKey,new int[]{},1); - p3.setAction(MotionEvent.ACTION_UP); - ReflectCrossKeyToScreen(new View[]{},p3); - } - return (new int[]{}); - } - - private void ReflectCrossKeyToScreen(View[] views,MotionEvent p1){ - switch(p1.getAction()){ - case MotionEvent.ACTION_DOWN: - case MotionEvent.ACTION_MOVE: - for(View v1:crosskeychildren){ - v1.setVisibility(View.INVISIBLE); - for(View v2:views){ - if(v1 == v2){ - v1.setVisibility(View.VISIBLE); - } - } - } - break; - case MotionEvent.ACTION_UP: - for(View v1:crosskeychildren){ - v1.setVisibility(View.INVISIBLE); - } - break; - default: - break; - } - } - - private void SendDownOrUpToInput(int[] recordKeys,int[] downKeys,int mode){ - if(recordKeys == null){ - if(mode == 1){ - tempCrossKey = downKeys; - }else if(mode ==2){ - recordJoyStick = downKeys; - } - for (int temp : downKeys) { - Log.e("DnOrUpInput", "Catch Index: " + temp); - BoatInputEventSender.setKey(temp, true, 0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - }else if(Arrays.equals(recordKeys,downKeys)){ - Log.e("DnOrUpInput","KeepPressed."); - return; - }else{ - for(int temp:recordKeys){ - Log.e("DnOrUpInput","Release Index: "+temp); - BoatInputEventSender.setKey(temp,false,0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - if(mode == 1){ - tempCrossKey = downKeys; - }else if(mode ==2){ - recordJoyStick = downKeys; - } - for (int temp : downKeys) { - Log.e("DnOrUpInput", "Catch Index: " + temp); - BoatInputEventSender.setKey(temp, true, 0); - } - } - } - - - - private CompoundButton.OnCheckedChangeListener checkedlistener = new CompoundButton.OnCheckedChangeListener(){ - - @Override - public void onCheckedChanged(CompoundButton v,boolean ischecked){ - if (v == checkbox_qwertkeyboard) { - if(ischecked){ - QwertKeyboard.setVisibility(View.VISIBLE); - }else{ - QwertKeyboard.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_crosskey){ - if(ischecked){ - CrossKey.setVisibility(View.VISIBLE); - }else{ - CrossKey.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_virtualkeyboard){ - if(ischecked){ - for(GameButton button:KeyboardList){ - button.setVisibility(View.INVISIBLE); - } - }else{ - for(GameButton button:KeyboardList){ - button.setVisibility(View.VISIBLE); - } - } - }else if(v == checkbox_mousekey){ - if(ischecked){ - MouseKey.setVisibility(View.VISIBLE); - }else{ - MouseKey.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_otg){ - //Otg switch - - }else if(v == checkbox_joystick){ - if(ischecked){ - JoyStick.setVisibility(View.VISIBLE); - }else{ - JoyStick.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_lock){ - if(ischecked){ - joystick_move.setVisibility(View.VISIBLE); - mousekey_move.setVisibility(View.VISIBLE); - crosskey_move.setVisibility(View.VISIBLE); - }else{ - joystick_move.setVisibility(View.INVISIBLE); - mousekey_move.setVisibility(View.INVISIBLE); - crosskey_move.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_edittext){ - if(ischecked){ - inputScanner.setVisibility(View.VISIBLE); - }else{ - inputScanner.setVisibility(View.INVISIBLE); - } - }else if(v == checkbox_modeswitch){ - if(mode){ - BoatClientActivity.this.mouseCursor.setVisibility(View.VISIBLE); - mode = false; - }else{ - BoatClientActivity.this.mouseCursor.setVisibility(View.INVISIBLE); - mode = true; - } - }else if(v == checkbox_helper){ - Helper helper = new Helper(getApplication()); - helper.show(); - } - } - }; - - private void ChangeLayoutParam(View p1){ - RelativeLayout.LayoutParams lpFeedback = new RelativeLayout.LayoutParams( - RelativeLayout.LayoutParams.WRAP_CONTENT,RelativeLayout.LayoutParams.WRAP_CONTENT); - lpFeedback.leftMargin = p1.getLeft(); - lpFeedback.topMargin = p1.getTop(); - lpFeedback.setMargins(p1.getLeft(),p1.getTop(),0,0); - p1.setLayoutParams(lpFeedback); - - } - - private RockerView.OnShakeListener shakelistener = new RockerView.OnShakeListener() { - @Override - public void onStart() { - } - - @Override - public void direction(RockerView.Direction direction) { - OnJoyStickShake(direction); - } - - @Override - public void onFinish() { - for(int temp:recordJoyStick){ - Log.e("JoyStick","Release Index " + temp); - BoatInputEventSender.setKey(temp,false,0); - - //时序 - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - - } - recordJoyStick = null; - } - }; - - private void OnJoyStickShake(RockerView.Direction direction) { - String message = null; - int[] temp = new int[]{}; - switch (direction) { - case DIRECTION_LEFT: - message = "左"; - temp = new int[]{GLFW_KEY_A}; - break; - case DIRECTION_RIGHT: - message = "右"; - temp = new int[]{GLFW_KEY_D}; - break; - case DIRECTION_UP: - message = "上"; - temp = new int[]{GLFW_KEY_W}; - break; - case DIRECTION_DOWN: - message = "下"; - temp = new int[]{GLFW_KEY_S}; - break; - case DIRECTION_UP_LEFT: - message = "左上"; - temp = new int[]{GLFW_KEY_W,GLFW_KEY_A}; - break; - case DIRECTION_UP_RIGHT: - message = "右上"; - temp = new int[]{GLFW_KEY_W,GLFW_KEY_D}; - break; - case DIRECTION_DOWN_LEFT: - message = "左下"; - temp = new int[]{GLFW_KEY_S,GLFW_KEY_A}; - break; - case DIRECTION_DOWN_RIGHT: - message = "右下"; - temp = new int[]{GLFW_KEY_S,GLFW_KEY_D}; - break; - default: - break; - } - Log.e("JoyStick",message); - SendDownOrUpToInput(recordJoyStick,temp,2); - } - - private void OnClickTouchPad(MotionEvent p1){ - if(mode){ - //捕获模式 - switch(p1.getAction()){ - case MotionEvent.ACTION_DOWN: - break; - case MotionEvent.ACTION_MOVE: - TOUCH_IS_MOVED = true; - break; - case MotionEvent.ACTION_UP: - //TOUCH_UP_TIME = p1.getEventTime(); - //long DV = TOUCH_UP_TIME - TOUCH_DOWN_TIME; - //if( !TOUCH_IS_MOVED && DV >= MIN_CLICK_TIME && DV <= MAX_CLICK_TIME){ - if(!TOUCH_LONG_APPLY && !TOUCH_IS_MOVED){ - BoatInputEventSender.setMouseButton((byte)3,true); - try { - Thread.sleep(PAUSE_TIME); - } catch (InterruptedException e) { - e.printStackTrace(); - } - BoatInputEventSender.setMouseButton((byte)3,false); - } - if(TOUCH_LONG_APPLY){ - Log.e("Screen","释放长按操作!"); - BoatInputEventSender.setMouseButton((byte)3,false); - } - //TOUCH_IS_LONGCLICK = false; - //TOUCH_IS_OUTLIMITION = false; - TOUCH_IS_MOVED = false; - TOUCH_LONG_APPLY = false; - - } - }else{ - //鼠标模式 - switch(p1.getAction()){ - case MotionEvent.ACTION_DOWN: - BoatInputEventSender.setMouseButton((byte)1,true); - break; - case MotionEvent.ACTION_MOVE: - break; - case MotionEvent.ACTION_UP: - BoatInputEventSender.setMouseButton((byte)1,false); - break; - default: - break; - } - } - } - - private Button.OnLongClickListener longclicklistener = new Button.OnLongClickListener(){ - @Override - public boolean onLongClick(View view){ - if (mode && !TOUCH_IS_MOVED && view == touchpad) { - Log.e("Screen", "OnLongClickListener执行长按操作!"); - TOUCH_LONG_APPLY = true; - BoatInputEventSender.setMouseButton((byte) 1, true); - return false; - } - return false; - } - }; - - public void onDestroy() { - super.onDestroy(); - } - -} - diff --git a/boat/src/main/java/cosine/boat/version3/BoatInputEventSender.java b/boat/src/main/java/cosine/boat/version3/BoatInputEventSender.java deleted file mode 100644 index d4bdb07a..00000000 --- a/boat/src/main/java/cosine/boat/version3/BoatInputEventSender.java +++ /dev/null @@ -1,55 +0,0 @@ -package cosine.boat.version3; -import android.app.Activity; - -public class BoatInputEventSender{ - - public static int KeyPress = 2; - public static int KeyRelease = 3; - public static int ButtonPress = 4; - public static int ButtonRelease = 5; - public static int MotionNotify = 6; - - public static int Button1 = 1; - public static int Button2 = 2; - public static int Button3 = 3; - public static int Button4 = 4; - public static int Button5 = 5; - public static int Button6 = 6; - public static int Button7 = 7; - - - public static void setMouseButton(int button, boolean press) { - - send(System.nanoTime(), press ? ButtonPress : ButtonRelease, button, 0); - } - public static void setPointer(int x, int y) { - send(System.nanoTime(), MotionNotify, x, y); - } - - public static void setKey(int keyCode, boolean press , int keyChar){ - if(keyCode == 1001){ - setMouseButton(1,press); - return; - } - if(keyCode == 1002){ - setMouseButton(3,press); - return; - } - - send(System.nanoTime(), press ? KeyPress : KeyRelease, keyCode, keyChar); - } - - - public static native void send(long time, int type, int p1, int p2); - - public static void setCursorMode(int mode){ - Activity activity = BoatApplication.getCurrentActivity(); - if (activity instanceof BoatClientActivity){ - BoatClientActivity client = (BoatClientActivity)activity; - client.setCursorMode(mode); - } - } - static { - System.loadLibrary("client3"); - } -} diff --git a/boat/src/main/java/cosine/boat/version3/LauncherActivity.java b/boat/src/main/java/cosine/boat/version3/LauncherActivity.java deleted file mode 100644 index 5c9ac8d6..00000000 --- a/boat/src/main/java/cosine/boat/version3/LauncherActivity.java +++ /dev/null @@ -1,51 +0,0 @@ -package cosine.boat.version3; - -import android.app.Activity; -import android.os.Bundle; -import com.aof.sharedmodule.Model.ArgsModel; - -import cosine.boat.R; -import cosine.boat.logcat.Logcat; -import cosine.boat.logcat.LogcatService; -import ru.ivanarh.jndcrash.NDCrashError; -import ru.ivanarh.jndcrash.NDCrash; -import ru.ivanarh.jndcrash.NDCrashService; -import ru.ivanarh.jndcrash.NDCrashUnwinder; -import android.content.Intent; -import static com.aof.sharedmodule.Data.DataPathManifest.*; - -public class LauncherActivity extends Activity{ - public ArgsModel argsModel; - - public void onCreate(Bundle savedInstance) { - super.onCreate(savedInstance); - - //从序列化中取出参数对象 - argsModel = (ArgsModel) getIntent().getSerializableExtra("LauncherConfig"); - - //初始化日志 - final String logPath = BOAT_HOME + "/log.txt"; - Logcat.initializeOutOfProcess(this, logPath, LogcatService.class); - - final String reportPath = BOAT_HOME + "/crash.txt"; - System.out.println("Crash report: " + reportPath); - final NDCrashError error = NDCrash.initializeOutOfProcess(this, reportPath, NDCrashUnwinder.libcorkscrew, NDCrashService.class); - if (error == NDCrashError.ok) { - System.out.println("NDCrash: OK"); - // Initialization is successful. - } else { - System.out.println("NDCrash: Error"); - System.out.println(error.name()); - // Initialization failed, check error value. - } - - - //界面跳转至Client - Intent intent = new Intent(this, BoatClientActivity.class); - intent.putExtra("LauncherConfig", argsModel); - this.startActivity(intent); - this.finish(); - - } - -} diff --git a/boat/src/main/java/cosine/boat/version3/LoadMe.java b/boat/src/main/java/cosine/boat/version3/LoadMe.java deleted file mode 100644 index ff38a48f..00000000 --- a/boat/src/main/java/cosine/boat/version3/LoadMe.java +++ /dev/null @@ -1,63 +0,0 @@ -package cosine.boat.version3; - -import com.aof.sharedmodule.Model.ArgsModel; - -import static com.aof.sharedmodule.Data.DataPathManifest.*; - -public class LoadMe { - - public static native int chdir(String str); - public static native void jliLaunch(String[] strArr); - public static native void redirectStdio(String file); - public static native void setenv(String str, String str2); - public static native void setupJLI(); - public static native int dlopen(String name); - - static { - System.loadLibrary("boat3"); - } - - public static int exec(ArgsModel args, BoatClientActivity activity) { - try { - - String runtimePath = RUNTIME_HOME; - String home = args.getHome(); - - setenv("HOME", home); - setenv("JAVA_HOME" ,runtimePath + "/j2re-image"); - - dlopen(runtimePath + "/j2re-image/lib/aarch32/libfreetype.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/jli/libjli.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/client/libjvm.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libverify.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libjava.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libnet.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libnio.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libawt.so"); - dlopen(runtimePath + "/j2re-image/lib/aarch32/libawt_headless.so"); - dlopen("libserve3.so"); - dlopen(runtimePath + "/libopenal.so.1"); - dlopen(runtimePath + "/libGL.so.1"); - dlopen(runtimePath + "/lwjgl3/libglfw.so"); - dlopen(runtimePath + "/lwjgl3/liblwjgl_stb.so"); - dlopen(runtimePath + "/lwjgl3/liblwjgl_tinyfd.so"); - dlopen(runtimePath + "/lwjgl3/liblwjgl_opengl.so"); - dlopen(runtimePath + "/lwjgl3/liblwjgl.so"); - - setupJLI(); - redirectStdio(home + "/boat_output.txt"); - chdir(home); - jliLaunch(args.getArgs()); - - } catch (Exception e) { - e.printStackTrace(); - return 1; - } - return 0; - } -} - - - - - diff --git a/boat/src/main/jni/CMakeLists.txt b/boat/src/main/jni/CMakeLists.txt deleted file mode 100644 index bd7951d9..00000000 --- a/boat/src/main/jni/CMakeLists.txt +++ /dev/null @@ -1,21 +0,0 @@ -#指定需要CMAKE的最小版本 -cmake_minimum_required(VERSION 3.4.1) - - -#C 的编译选项是 CMAKE_C_FLAGS -# 指定编译参数,可选 -#SET(CMAKE_CXX_FLAGS "-Wno-error=format-security -Wno-error=pointer-sign") - -#设置生成的so动态库最后输出的路径 -#set(CMAKE_LIBRARY_OUTPUT_DIRECTORY ${PROJECT_SOURCE_DIR}/../jniLibs/${ANDROID_ABI}) - -#设置头文件搜索路径(和此txt同个路径的头文件无需设置),可选 -#INCLUDE_DIRECTORIES(${CMAKE_CURRENT_SOURCE_DIR}/common) - -#指定用到的系统库或者NDK库或者第三方库的搜索路径,可选。 -#LINK_DIRECTORIES(/usr/local/lib) - -ADD_SUBDIRECTORY(boat3) -ADD_SUBDIRECTORY(client3) -ADD_SUBDIRECTORY(server3) -#ADD_SUBDIRECTORY(crashreport) \ No newline at end of file diff --git a/boat/src/main/jni/boat3/CMakeLists.txt b/boat/src/main/jni/boat3/CMakeLists.txt deleted file mode 100644 index 0c07af00..00000000 --- a/boat/src/main/jni/boat3/CMakeLists.txt +++ /dev/null @@ -1,15 +0,0 @@ -if (${ANDROID_ABI} STREQUAL "x86_64") - include_directories(${ANDROID_SYSROOT}/usr/include/x86_64-linux-android) -elseif (${ANDROID_ABI} STREQUAL "x86") - include_directories(${ANDROID_SYSROOT}/usr/include/i686-linux-android) -elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") - include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) -elseif (${ANDROID_ABI} STREQUAL "armeabi-v7a") - include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) -endif() - -add_library(boat3 SHARED boat.c) -find_library(log-lib log) -find_library(dl-lib dl) -target_link_libraries(boat3 ${log-lib} ${dl-lib}) -SET(CMAKE_CXX_FLAGS "-mthumb -std=gnu99") diff --git a/boat/src/main/jni/boat3/boat.c b/boat/src/main/jni/boat3/boat.c deleted file mode 100644 index dc509ead..00000000 --- a/boat/src/main/jni/boat3/boat.c +++ /dev/null @@ -1,130 +0,0 @@ - -#include -#include -#include -#include -#include -#include -#include - - -JNIEXPORT void JNICALL Java_cosine_boat_version3_LoadMe_redirectStdio(JNIEnv* env, jclass clazz, jstring path){ - - char const* file = (*env)->GetStringUTFChars(env , path , 0); - - int fd = open(file , O_WRONLY | O_CREAT | O_TRUNC, 0666); - dup2(fd, 1); - dup2(fd, 2); - - (*env)->ReleaseStringUTFChars(env , path , file); -} - -JNIEXPORT jint JNICALL Java_cosine_boat_version3_LoadMe_chdir(JNIEnv* env, jclass clazz, jstring path){ - - char const* dir = (*env)->GetStringUTFChars(env ,path ,0); - int b = chdir(dir); - (*env)->ReleaseStringUTFChars(env ,path , dir); - return b; -} -JNIEXPORT void JNICALL Java_cosine_boat_version3_LoadMe_setenv(JNIEnv* env, jclass clazz, jstring str1, jstring str2){ - char const* name = (*env)->GetStringUTFChars(env ,str1 , 0); - char const* value = (*env)->GetStringUTFChars(env, str2 , 0); - - setenv(name , value ,1); - - (*env)->ReleaseStringUTFChars(env , str1 , name); - (*env)->ReleaseStringUTFChars(env ,str2 , value); -} - - -JNIEXPORT jint JNICALL Java_cosine_boat_version3_LoadMe_dlopen(JNIEnv* env, jclass clazz, jstring str1){ - - char const* lib_name = (*env)->GetStringUTFChars(env ,str1 , 0); - - void* handle; - handle = dlopen(lib_name, RTLD_LAZY); - if (handle == NULL){ - __android_log_print(ANDROID_LOG_ERROR, "Boat", "%s : %s", lib_name, dlerror()); - } - else{ - __android_log_print(ANDROID_LOG_ERROR, "Boat", "%s : loaded shared library.", lib_name ); - } - - (*env)->ReleaseStringUTFChars(env , str1 , lib_name); -} - - - - -#define FULL_VERSION "1.8.0-internal-cosine_2019_12_31_15_53-b00" -#define DOT_VERSION "1.8" -#define PROGNAME "java" -#define LAUNCHER_NAME "openjdk" - - -static char* const_progname = PROGNAME; -static const char* const_launcher = LAUNCHER_NAME; -static const char** const_jargs = NULL; -static const char** const_appclasspath = NULL; -static const jboolean const_cpwildcard = JNI_TRUE; -static const jboolean const_javaw = JNI_FALSE; -static const jint const_ergo_class = 0; //DEFAULT_POLICY - -int -(*JLI_Launch)(int argc, char ** argv, /* main argc, argc */ - int jargc, const char** jargv, /* java args */ - int appclassc, const char** appclassv, /* app classpath */ - const char* fullversion, /* full version defined */ - const char* dotversion, /* dot version defined */ - const char* pname, /* program name */ - const char* lname, /* launcher name */ - jboolean javaargs, /* JAVA_ARGS */ - jboolean cpwildcard, /* classpath wildcard */ - jboolean javaw, /* windows-only javaw */ - jint ergo_class /* ergnomics policy */ -); - -JNIEXPORT void JNICALL Java_cosine_boat_version3_LoadMe_setupJLI(JNIEnv* env, jclass clazz){ - - void* handle; - handle = dlopen("libjli.so", RTLD_LAZY); - JLI_Launch = (int (*)(int, char **, int, const char**, int, const char**, const char*, const char*, const char*, const char*, jboolean, jboolean, jboolean, jint))dlsym(handle, "JLI_Launch"); - -} - -JNIEXPORT jint JNICALL Java_cosine_boat_version3_LoadMe_jliLaunch(JNIEnv *env, jclass clazz, jobjectArray argsArray){ - int argc = (*env)->GetArrayLength(env, argsArray); - char* argv[argc]; - for (int i = 0; i < argc; i++) { - jstring str = (*env)->GetObjectArrayElement(env, argsArray, i); - int len = (*env)->GetStringUTFLength(env, str); - char* buf = malloc(len + 1); - int characterLen = (*env)->GetStringLength(env, str); - (*env)->GetStringUTFRegion(env, str, 0, characterLen, buf); - buf[len] = 0; - argv[i] = buf; - } - - - - return JLI_Launch(argc, argv, - sizeof(const_jargs) / sizeof(char *), const_jargs, - sizeof(const_appclasspath) / sizeof(char *), const_appclasspath, - FULL_VERSION, - DOT_VERSION, - (const_progname != NULL) ? const_progname : *argv, - (const_launcher != NULL) ? const_launcher : *argv, - (const_jargs != NULL) ? JNI_TRUE : JNI_FALSE, - const_cpwildcard, const_javaw, const_ergo_class); - -} - - - - - - - - - - diff --git a/boat/src/main/jni/client3/CMakeLists.txt b/boat/src/main/jni/client3/CMakeLists.txt deleted file mode 100644 index 44ee9dcf..00000000 --- a/boat/src/main/jni/client3/CMakeLists.txt +++ /dev/null @@ -1,18 +0,0 @@ -if (${ANDROID_ABI} STREQUAL "x86_64") - include_directories(${ANDROID_SYSROOT}/usr/include/x86_64-linux-android) -elseif (${ANDROID_ABI} STREQUAL "x86") - include_directories(${ANDROID_SYSROOT}/usr/include/i686-linux-android) -elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") - include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) -elseif (${ANDROID_ABI} STREQUAL "armeabi-v7a") - include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) -endif() - -add_library(client3 SHARED Client.cpp Main.cpp) -find_library(log-lib log) -find_library(dl-lib dl) -find_library(android-lib android) -find_library(EGL-lib EGL) -find_library(GLESv2-lib GLESv2) -target_link_libraries(client3 ${log-lib} ${dl-lib} ${android-lib} ${EGL-lib} ${GLESv2-lib}) -SET(CMAKE_CXX_FLAGS "-isystem D:\\Android-others\\Sdk\\ndk\\16.1.4479499\\sysroot\\usr\\include\\arm-linux-androideabi -std=c++11") diff --git a/boat/src/main/jni/client3/Client.cpp b/boat/src/main/jni/client3/Client.cpp deleted file mode 100644 index 7d4df269..00000000 --- a/boat/src/main/jni/client3/Client.cpp +++ /dev/null @@ -1,31 +0,0 @@ - - -#include "Client.h" -Client* Client::mClient = 0; -Client::Client(){ - - char* value = getenv("BOAT"); - if (value == NULL){ - printf("BOAT not specificed!"); - abort(); - } - sscanf(value, "%p", &this->mBoat); - this->mBoat->client = this; - -} -Client::~Client(){ - -} -void Client::setup(ANativeWindow* win, void* dis){ - this->window = win; - this->display = dis; -} -void Client::send(BoatInputEvent* event){ - if (this->mBoat->server != 0 && this->mBoat->server->current_event_processor != 0){ - this->mBoat->server->current_event_processor(event); - } - -} -//__android_log_print(ANDROID_LOG_ERROR, "Boat", "Request: %d", this->request); - - diff --git a/boat/src/main/jni/client3/Client.h b/boat/src/main/jni/client3/Client.h deleted file mode 100644 index 617fea03..00000000 --- a/boat/src/main/jni/client3/Client.h +++ /dev/null @@ -1,41 +0,0 @@ -#pragma once - -#include -#include -#include -#include -#include -#include - - -#include "boat.h" -#include "boat_server.h" -#include "Server.h" - -class Client{ - -public : - - struct boat* mBoat; - - void* display; - ANativeWindow* window; - void (*setCursorMode)(int); - - // client-only - JavaVM* jvm; - jclass g_BoatInputEventSender; - - -public : - Client(); - ~Client(); - void setup(ANativeWindow* , void*); - void send(BoatInputEvent*); - - -public : - static Client* mClient; - -}; - diff --git a/boat/src/main/jni/client3/Main.cpp b/boat/src/main/jni/client3/Main.cpp deleted file mode 100644 index b2fa0927..00000000 --- a/boat/src/main/jni/client3/Main.cpp +++ /dev/null @@ -1,190 +0,0 @@ -#include "Main.h" - -struct boat mBoat; -//ANativeActivity callbacks - -void onStart(ANativeActivity* activity){ - -} -void onResume(ANativeActivity* activity){ - -} - -void* onSaveInstanceState(ANativeActivity* activity, size_t* outSize){ - -} - -void onPause(ANativeActivity* activity){ - -} - -void onStop(ANativeActivity* activity){ - -} - -void onDestroy(ANativeActivity* activity){ - delete Client::mClient; - Client::mClient = 0; -} - -void onWindowFocusChanged(ANativeActivity* activity, int hasFocus){ - - -} - - - -void onNativeWindowCreated(ANativeActivity* activity, ANativeWindow* win){ - - Client::mClient->setup(win, EGL_DEFAULT_DISPLAY); -} - -void onNativeWindowDestroyed(ANativeActivity* activity, ANativeWindow* win){ - -} -void onNativeWindowRedrawNeeded(ANativeActivity* activity, ANativeWindow* win){ - -} -void onNativeWindowResized(ANativeActivity* activity, ANativeWindow* win){ - -} - -void onInputQueueCreated(ANativeActivity* activity, AInputQueue* queue) { - -} - -void onInputQueueDestroyed(ANativeActivity* activity, AInputQueue* queue) { - -} -void onConfigurationChanged(ANativeActivity* activity){ - -} - -void onLowMemory(ANativeActivity* activity) -{ - -} - -void ANativeActivity_onCreate(ANativeActivity* activity, void* savedState, size_t savedStateSize) { - - activity->callbacks->onStart = onStart; - activity->callbacks->onResume = onResume; - activity->callbacks->onSaveInstanceState = onSaveInstanceState; - activity->callbacks->onPause = onPause; - activity->callbacks->onStop = onStop; - activity->callbacks->onDestroy = onDestroy; - activity->callbacks->onWindowFocusChanged = onWindowFocusChanged; - activity->callbacks->onNativeWindowCreated = onNativeWindowCreated; - activity->callbacks->onNativeWindowDestroyed = onNativeWindowDestroyed; - activity->callbacks->onInputQueueCreated = 0; - activity->callbacks->onInputQueueDestroyed = 0; - activity->callbacks->onConfigurationChanged = onConfigurationChanged; - activity->callbacks->onLowMemory = onLowMemory; - - char value[256] = {0}; - mBoat.server = 0; - mBoat.client = 0; - snprintf(value, sizeof(value) , "%p", &mBoat); - setenv("BOAT", value, 1); - - Client::mClient = new Client(); - - -} - - -extern "C" JNIEXPORT void JNICALL Java_cosine_boat_version3_BoatInputEventSender_send(JNIEnv* env, jclass clazz, jlong time, jint type, jint p1, jint p2){ - - BoatInputEvent* event = (BoatInputEvent*)malloc(sizeof(BoatInputEvent)); - - event->time = time; - event->type = type; - - if (type == ButtonPress || type == ButtonRelease){ - event->mouse_button = p1; - } - else if (type == KeyPress || type == KeyRelease){ - event->keycode = p1; - event->keychar = p2; - } - else if (type == MotionNotify){ - event->x = p1; - event->y = p2; - } - - Client::mClient->send(event); - - free(event); - -} - - -extern "C" void setCursorMode(int mode){ - - if (Client::mClient == 0 || Client::mClient->jvm == 0){ - return; - } - JNIEnv* env = 0; - - jint result = Client::mClient->jvm->AttachCurrentThread(&env, 0); - - if (result != JNI_OK || env == 0){ - __android_log_print(ANDROID_LOG_ERROR, "BoatClient", "Failed to attach thread to JavaVM."); - abort(); - } - - jclass class_BoatInputEventSender = Client::mClient->g_BoatInputEventSender; - - if (class_BoatInputEventSender == 0){ - __android_log_print(ANDROID_LOG_ERROR, "BoatClient", "Failed to find class: cosine/boat/version3/BoatInputEventSender."); - abort(); - } - - jmethodID BoatInputEventSender_setCursorMode = env->GetStaticMethodID(class_BoatInputEventSender, "setCursorMode", "(I)V"); - - if (BoatInputEventSender_setCursorMode == 0){ - __android_log_print(ANDROID_LOG_ERROR, "BoatClient", "Failed to find static method BoatInputEventSender::setCursorMode"); - abort(); - } - env->CallStaticVoidMethod(class_BoatInputEventSender, BoatInputEventSender_setCursorMode, mode); - - - - - - Client::mClient->jvm->DetachCurrentThread(); - - - -} - - -extern "C" JNIEXPORT jint JNI_OnLoad(JavaVM* vm,void*) -{ - if (Client::mClient == 0){ - - abort(); - } - Client::mClient->jvm = vm; - Client::mClient->setCursorMode = setCursorMode; - - JNIEnv* env = 0; - - jint result = Client::mClient->jvm->AttachCurrentThread(&env, 0); - - if (result != JNI_OK || env == 0){ - __android_log_print(ANDROID_LOG_ERROR, "BoatClient", "Failed to attach thread to JavaVM."); - abort(); - } - - jclass class_BoatInputEventSender = env->FindClass("cosine/boat/version3/BoatInputEventSender"); - - /*if (cls == 0){ - __android_log_print(ANDROID_LOG_ERROR, "BoatClient", "Failed to find class: cosine/boat/version3/BoatInputEventSender."); - abort(); - }*/ - - Client::mClient->g_BoatInputEventSender = (jclass)env->NewGlobalRef(class_BoatInputEventSender); - - return JNI_VERSION_1_6; -} diff --git a/boat/src/main/jni/client3/Main.h b/boat/src/main/jni/client3/Main.h deleted file mode 100644 index b0147681..00000000 --- a/boat/src/main/jni/client3/Main.h +++ /dev/null @@ -1,12 +0,0 @@ -#ifndef NDK_NATIVE_ACTIVITY_H -#define NDK_NATIVE_ACTIVITY_H - -#include -#include -#include -#include "boat.h" -#include "Client.h" -#include "boat_server.h" - - -#endif diff --git a/boat/src/main/jni/client3/Server.h b/boat/src/main/jni/client3/Server.h deleted file mode 100644 index 1feab1cc..00000000 --- a/boat/src/main/jni/client3/Server.h +++ /dev/null @@ -1,16 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "boat_server.h" -class Server{ - -public : - struct boat* mBoat; - void* current_window; - void (*current_event_processor)(BoatInputEvent*); - -}; - diff --git a/boat/src/main/jni/client3/boat.h b/boat/src/main/jni/client3/boat.h deleted file mode 100644 index d128e159..00000000 --- a/boat/src/main/jni/client3/boat.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef BOAT_H -#define BOAT_H - -class Server; -class Client; -struct boat{ - Server* server; - Client* client; -}; -#endif diff --git a/boat/src/main/jni/client3/boat_server.h b/boat/src/main/jni/client3/boat_server.h deleted file mode 100644 index e442dabd..00000000 --- a/boat/src/main/jni/client3/boat_server.h +++ /dev/null @@ -1,41 +0,0 @@ -#ifndef BOAT_SERVER_H -#define BOAT_SERVER_H - -#include - -#define KeyPress 2 -#define KeyRelease 3 -#define ButtonPress 4 -#define ButtonRelease 5 -#define MotionNotify 6 - -#define Button1 1 -#define Button2 2 -#define Button3 3 -#define Button4 4 -#define Button5 5 -#define Button6 6 -#define Button7 7 -typedef struct { - long long time; - char type; - - char mouse_button; - int x; - int y; - - int keycode; - int keychar; - -} BoatInputEvent; - - -ANativeWindow* boat_server_GetNativeWindow(void); - -void* boat_server_GetNativeDisplay(void); - -void boat_server_SetCurrentEventProcessor(void*, void (*)(BoatInputEvent*)); - -void* boat_server_GetCurrentWindow(void); - -#endif diff --git a/boat/src/main/jni/server3/CMakeLists.txt b/boat/src/main/jni/server3/CMakeLists.txt deleted file mode 100644 index fdd7f4c6..00000000 --- a/boat/src/main/jni/server3/CMakeLists.txt +++ /dev/null @@ -1,16 +0,0 @@ -if (${ANDROID_ABI} STREQUAL "x86_64") - include_directories(${ANDROID_SYSROOT}/usr/include/x86_64-linux-android) -elseif (${ANDROID_ABI} STREQUAL "x86") - include_directories(${ANDROID_SYSROOT}/usr/include/i686-linux-android) -elseif (${ANDROID_ABI} STREQUAL "arm64-v8a") - include_directories(${ANDROID_SYSROOT}/usr/include/aarch64-linux-android) -elseif (${ANDROID_ABI} STREQUAL "armeabi-v7a") - include_directories(${ANDROID_SYSROOT}/usr/include/arm-linux-androideabi) -endif() - -add_library(serve3 SHARED Server.cpp) -find_library(log-lib log) -find_library(dl-lib dl) -#find_library(libc++ c++) -target_link_libraries(serve3 ${log-lib} ${dl-lib}) -SET(CMAKE_CXX_FLAGS "-isystem D:\\Android-others\\Sdk\\ndk\\16.1.4479499\\sysroot\\usr\\include\\arm-linux-androideabi -std=c++11") diff --git a/boat/src/main/jni/server3/Client.h b/boat/src/main/jni/server3/Client.h deleted file mode 100644 index a0dcd76d..00000000 --- a/boat/src/main/jni/server3/Client.h +++ /dev/null @@ -1,21 +0,0 @@ -#pragma once - -#include -#include -#include -#include - -#include "boat.h" - -class Client{ - -public : - - struct boat* mBoat; - - void* display; - ANativeWindow* window; - void (*setCursorMode)(int); - -}; - diff --git a/boat/src/main/jni/server3/Server.cpp b/boat/src/main/jni/server3/Server.cpp deleted file mode 100644 index 26182c7a..00000000 --- a/boat/src/main/jni/server3/Server.cpp +++ /dev/null @@ -1,53 +0,0 @@ -#include "Server.h" -#include - -#include -#include - -Server* Server::mServer = 0; -Server::Server(){ - char* value = getenv("BOAT"); - if (value == NULL){ - printf("BOAT not specificed!"); - abort(); - } - sscanf(value, "%p", &this->mBoat); - - this->mBoat->server = this; - this->current_event_processor = 0; -} - - -extern "C"{ - -ANativeWindow* boat_server_GetNativeWindow(void){ - //__android_log_print(ANDROID_LOG_ERROR, "BoatServer", "GetNativeWindow()"); - return Server::mServer->mBoat->client->window; -} - -void* boat_server_GetNativeDisplay(void){ - //__android_log_print(ANDROID_LOG_ERROR, "BoatServer", "GetNativeDisplay()"); - return Server::mServer->mBoat->client->display; -} -void* boat_server_GetCurrentWindow(void){ - //__android_log_print(ANDROID_LOG_ERROR, "BoatServer", "GetCurrentWindow()"); - return Server::mServer->current_window; -} -void boat_server_SetCurrentEventProcessor(void* win, void (*pcs)(BoatInputEvent*)){ - //__android_log_print(ANDROID_LOG_ERROR, "BoatServer", "SetCurrentEventProcessor()"); - Server::mServer->current_window = win; - Server::mServer->current_event_processor = pcs; -} -void boat_server_SetCursorMode(int mode){ - __android_log_print(ANDROID_LOG_ERROR, "BoatServer", "SetCursorMode()"); - Server::mServer->mBoat->client->setCursorMode(mode); -} - -__attribute__((constructor)) -void init_server(){ - Server::mServer = new Server(); - __android_log_print(ANDROID_LOG_ERROR, "BoatServer", "Server initialized!"); - -} -} - diff --git a/boat/src/main/jni/server3/Server.h b/boat/src/main/jni/server3/Server.h deleted file mode 100644 index d2d450d3..00000000 --- a/boat/src/main/jni/server3/Server.h +++ /dev/null @@ -1,22 +0,0 @@ -#pragma once - -#include -#include -#include - -#include "Client.h" -#include "boat_server.h" -class Server{ - -public : - struct boat* mBoat; - void* current_window; - void (*current_event_processor)(BoatInputEvent*); - -public : - Server(); -public : - static Server* mServer; - -}; - diff --git a/boat/src/main/jni/server3/boat.h b/boat/src/main/jni/server3/boat.h deleted file mode 100644 index d128e159..00000000 --- a/boat/src/main/jni/server3/boat.h +++ /dev/null @@ -1,10 +0,0 @@ -#ifndef BOAT_H -#define BOAT_H - -class Server; -class Client; -struct boat{ - Server* server; - Client* client; -}; -#endif diff --git a/boat/src/main/jni/server3/boat_server.h b/boat/src/main/jni/server3/boat_server.h deleted file mode 100644 index c6da65bf..00000000 --- a/boat/src/main/jni/server3/boat_server.h +++ /dev/null @@ -1,31 +0,0 @@ -#ifndef BOAT_SERVER_H -#define BOAT_SERVER_H - - -#define KeyPress 2 -#define KeyRelease 3 -#define ButtonPress 4 -#define ButtonRelease 5 -#define MotionNotify 6 - -#define Button1 1 -#define Button2 2 -#define Button3 3 -#define Button4 4 -#define Button5 5 -#define Button6 6 -#define Button7 7 -typedef struct { - long long time; - char type; - - char mouse_button; - int x; - int y; - - int keycode; - int keychar; - -} BoatInputEvent; - -#endif diff --git a/boat/src/main/jniLibs/armeabi-v7a/libboat.so b/boat/src/main/jniLibs/armeabi-v7a/libboat.so index 5f0e5bac7a740905705ef170eeb63725502daa95..30c2b659cc1ec7d8b91520863b5a9162a2db9771 100644 GIT binary patch literal 13800 zcmeHueSDPFmH&NS<|WA_GYL^c2=F8UI*}+b z?J^*C(ZzKVsD^}}Vs%>-DhbN3P^H0_y3|5DV{t!-x{g~Rf$%cXxbp~@XTRrpW?)3! z_S5}+et-4m^PO|fz2}~L@42s;oUEO@K;}4(C6d7GEFn!t=CP^x;F)1Mlb9K0xojje zB8$or&?=ykh&)1~K3FY9Co)DbkYv-#OG_9ly-CLhs4$Lanq4Xf%Vwc`7Rm_{$_dnN zqK)a06L=N*ghbim6Mh%OuO+Gv^9)s6E=^!8fo^0F67_FG{p9|IP)10!Z-$Kxx*ayB z$>nSIy4W?4eN(Tm2l=bh^y%NdVfqa>{MGfT|Ji^5IBvazJv6fPOWV8e<(3C8){g#p z-LD>6)%EvR8^^FNrz~*x%MxQG&j9wP>we2(7B(MpP6cD-pqUtT4d`!^%E|HXK`sR) z{nel;8I0w{<)46#hx{NKrt+UdP9$pYm4pCF@@rSg?34I}jRNcDGI zRsPGXMU|K=+B2;|pbuOi;wImnA3&|H)MzktkP(l=n!P)8#_QZAo%5 zEIBsm88Nyv%uWMFYWn?G_kK59Fu$^jHG1nCN?MzV z);Bx-#Oi8Jzk9XU&nVO3_TTFCdsn%adYfF$_pud~$oy(awYRmU(YYp(S+&yVb2s_t zuEK|wx5VvF&RgVbZg97@Hv5taAuVinxzW5+Ke%ceoA0S@@p)mwS>NpQqomdEY*=2~ z;8|Y#1E;s~D;f8!boyNEX6GtrZ9{Xbx5-^gU9Y9C&Tnd2>91{dH=+F2`L#7o3!0tZ zph~$5-L*cq%jtKaq?|i zu13AJ#@00}XhK|#G#&BW70$-S<_1V^pAUZfHXCSSWy{SA<};vnfpcY3gXddy?``zP zHJY22_?_@@bJK0^)|D&VV3s&nx#u^*;Y|&06#6M|k#l9MR_1SRfmrQs_4}IFfYTR- z+}yCTwaVjcy2tH8X7ZY;^0{H+>fE@2ujSw7cKMw5-RgF`zM-fUYnKdZv$}Ytd!_q| z@hf@BrmLEpe&D@lr4MVkx#>#(7Bt_t(7mGBw}#EpyE>-FqVu0>VI#Y9jdQX6o9KtyDQT`rvsEG z19T75orBmxm(ZJQI2pLl@XYzRaaY;Y)7QB+DbEH8K@WTVi`hSks z-@zBV5sppxP%jrQ%k-|L^|58PPCMds zTbw=@r#s?QtkCt$ak>oo*I=^hh+=YFMDc*~5QTFaiH^l1mZ-#-pC}g8YND8o2Z>_Q z28d!|Z6Jz?*hmzMaT8HEK1dXccRNum>|I2$&|U?-7K`a1QH=9VqF6MCh+-lS6U71z z5rq?u62)X6BZ>w70Z}+GLKF++6QbA{{Y2rIGeogaqD0Z|5K(L}g(x=3C8AjTVr23O zG4k|@jL72=bM)6IMA|@aJ^r7<+nfGV{Or{e3I5WjSNNeM{!9}8NfQ4-5`Q#_Kb*wB znZ&=E#J`-x?@HpIOX9aB@mrGkO-cL)@FIKq1Y?g!4y)?v)pWqHMSmKjPT_3ol#iKh z`^OgP=@S;{@Y3TE((8rZ?a=!`RaJi8>T2d;o)!n|eF{F*}{5xfUR4#vMkRv z?IVHydN4 zRwD&9Qaa73VMdMNb0*Z_&u4dVp0M&}W@hJvTOO$XNa;9usoDsgT)6?g$U!e`L0jBb zK5XS{whXXk=oFzR!q%~K0&IP7PPa8ZE3?zq^`WxhAb;78ne1qN3wSuseD6jF7gYO3 zXgSPt&DM>TJVtkIci?~;`}H~2TLM3h0nEVvEoE#h_QQ98T<|-v7cAh1KyyGR#LFxw zi|!S6Pd>%cHg#{4pO9yHzx4dtvr%3rrv+2n%Am$;9&5FrTaiXON(NSwd0VV0NeyD z1F``lKx?bLJ5?6skCcAQ)CUSXNI0TYAG8KD+N>Qjv=%qkG07Hu1T#zJwu9+|6&Yz* zUq8g07DrOseR9g?h$B6i9$#OH87@M9ieSN5V8#raJ588D6K1&otPwMO`m7DB7lwb-3Ojb ztO5hPX_O9r%CRhME$lnXdVi0{z{|i*I2%(zjliQg7heS40{#u4{ky4qguF@qu{PH! z?P=P&el9DelZ~VGTp$~_88%~v;VVmIyTcqbcT{{jC%frJl|Ld z3S@DcfR@c@Swzdmps_=ZEjw!n>Y6*UOr6Fq2F+Z}s-Ytlc4;LqRKx>8Z6#Y|gG}?A z-fr1!joVM}WQ8eOt(2#Zpl?T%yohm&;V0teZbw=$p=HtL0keVrrUuhGQnzviYHZwD zYkXYk7+3K@8t+J%!?-x;>2-HxSvpgb`ep0>z9PO7)kfSNAF(ZHZOdq2_vR;M!r3FMqe%0V3yOnOqf`IhRlvEc(D}sYCo_D zphp?)pC4=c#}E|TQecXb8BtrC<~k!*VK?gT09N4*K(qZ+ zeC%xt9;_bc8Ru~*mIV&QW^pLlc@8C~cqw@D$F8iUkQ_>RUZ%WMDF-)emP4sH>`94AS){<3Br zWw5ybE##t&1+zL}*A8u6XFGK4Xm^p;gGI&EYB5TSEnKM@n|a2elwQ^i#&vJkbZ^&m zr(Z7hk047+mFcsVDy3)Ecb}0DD=bnIWfq5W7i!d_^}Aqi+2N>z?}iSwlDAY@R$O_z zE{%gUZ&nq~PklsODMn}s_RWd!ej4FyoGT+dH)-edM~V_Z-(DSLR)a1&f3*8v z8KV-G)Q_mIiE_dpoo&uV&ZV$obJ7hEuA|Skx}{2E-r~9upe~GbULJYh1K-pgjyO^= zekt!UIa{-v;#sO#irXq3%7Ydo*8Nh@pAVYFf0aYH>*fux-dnM*Echj77w`hm4)}n( zft!Krf!Fa)Yy(R0%Ypv(&|e(M{KMM17J_`6*uk~4%?7+klFPr1-*CAe)e`9)bJac( zJJK#yf#a7G`>*d*J(Vxb5cC7Y5Z7?=bWTJ zTG!Y3QM$gykJR-w{yIIsp7dG%YZ~PmNXpbpG~TM$Xy9>Dia04*MEBV?{Gz)B*aU0< z9t8YABj5s-0WxqCAb9R(3wo=ftf~;mscvyhJ{7A8$nA3eOEqJ#lGFCfX#**uIB?YO zvYlk+0i(f=`TCRkYUOnyE@&JyvkIJe@2gx_=UnlfWph(Q;-GrNCw*M``nl%!#6d3Y zKl;*TA;QLUk@a)W{n0K9c%?)i=j_H1Z#ReT+HchMR*Sr1Sz*K#X)JUL9#)ic{Eg3q zIyLsZ%IuQU(wibNiL_j*6iX~u@LrPAtUA7+i#pkU*5_a(~rhh*4fb~u55gkA2x8h5L4fvcx)j$v4P%%N>sQmGV-9%tu~Y zesk28+Unw@$NDSy#qvz~M){y4xPROJQu%vY-JfC=jXPzY{JW58vN0@aZ9S$6J6QCV zi|}(qlGD*cS}7HcEsozU#~9|Mk4|%$H^|;QqcfIrY^4ID{$}|VLE>_Uc zM;@>8TI9DpX|6Fn^zOM^9T5?{6J=g1fK8L#5Hj0S!Bj18=3T<085 zj+|M?M>zO`m+*4BICgI;?sZ`&+nk2hK34JCpcmD}Z??j1B|9meIdwUhk7O$rS=`C; zs}yl^fvns54^`~89r&Z>u;=wb!>r$9|l(7j#JCZ z>g?LAl?|JFQpRORN@Yv_B=qd}@WUK=pM%*y3m19KSe?`0D+Bz`hf?gHg!}tSq2(E- z8P1>?UPtTmI{EF!N4nEx78T6dqxoQ#XRD0YX#0)(v-ro9(WQoVq3|&!uhbIZi&8%r zVWGS%(a`?>9=-tik~r{?xNnfR7OgP%?pi(qcW*`XXn@;%RAJj`1+(ZM0{c9dv!Rr?>xS&jP41P%hvp9 z^79eW8y^n5G|kiMsX6`5{hfK(p#iSUFnAX)wx@)DVNjn z{v96Xi^Wb$Z;?Dgw%40`tCZp?n<7+Je6JciKfIw*4DY=6sY(v}zaoOOSzOyU-7_xA zs;SknVP>xk@m-@#+`Fv!@51SWwzSt}v?~ake>%55By^;O}L< z56duyv!QWXOYbVub~Uztc>UZwt*wzbO9$%3!d>-64WH#KZz#jLnSQ)3&xrS^8vDZ~ zYd$ZNN8cDO$LgIV+ap{dx4F#2O=m^>dd2IF0~^HRK88G+9sWa{(q9T_$?!bBu)45g zKi8GE-z?=ttodZ+N5dI$dtJk6H&Y&c*P_O@44b6XNQz|E`l!ad!(x}c-Y6}vf3ZGA zyKh+Uof5;B%ZE;Kg>RkY3*S6RCyGISy*pbTD~l8F)AwQSstF766=_SDD|}|p`sF$D zKa61)jQ^EUIi~kok2r0vQdq~8WfpxF&K_cmJmD7_&PToz6$P$nX_%W*b2@w8b9=-A zv+?`knFh4f-6bPB$B zVL7~*&s`9r5_)SxZ)K&Bab;rB5c)|v#xJZ9TM2(`-=Nj{kMHqPTZEfp?iI_pDLWf# z!V=EjtqPNV9Fa<*nhyUSD{c(uqRu_<8K#^J+ioiI95>zau3?H@E{t+~g)*;bcDORi z^ONdW^q&+~a+79dJ-B&cHUT{<9wBFZDD7}DHgE{uf40&Px=ksxRRCOBtdAdfNMI$e zgeqm*r1D-{LFMz@!0Ws)@D}&e&)@R>bLETVi?m8bv?_hnYyKGZ@>bY?A>_e`7ArsN zD~t+45!#=v4EGdy?t+)8ccM_Cgl=TfYK5C(4N={m_o&7!<oCeQGaapIKxO^~9qi1*y$OQ6%slXgyG2jG#2&@CzfM3W9Ss1;&W?cGEsfc80-&=m0&OiJGIxGI1&Q3K}`sZ|BP-9Og z=?M2P*zQu3iP{h z#-+r)`e`3dh$=SW;ck3)qMcz!)o$EkSz%UE5w))qc1@MbWVXdFXW(Tp@)B`VWotnh z&Z!xfuKQSuuH`bLDmOA*b2?y7AGD;T$#|s)?Q%Nwxl2McC^B39u&<~lHGe~ zKoF{`h0P@q7L5vlqU*vUPv_o~s#MkeIjiBqDbhd$Q5X4k`KNp69kA_7W*?%{s0P1( zPT1KOL>(4Q7t)JPg;+jXHQTAxfEcy%r2m_XBvJkJ0+J&a+xoT_WrS;n*4DpKB}7dE z%g>!7n0Ux`d0ubjP@pnB(p^*&?y;xg)uhH2t32M*zY5u+QSO&``=rTTkv;bDVYF5t z>>`7zuD8Z( VD`}Wc4G{}+Mzpk+hsAo9JUqVV37&_v+_dRvQ+Rd zeTU-pjt*0AqUep4*``(H+2yL!{IpS#-`dv>mF=efzM*Mc=`XdLrr8Y@tsTn0s?UZ( zHTLQyhT7S?e}9rm20CdT8oT$6Ml*i9x!aS)bM3;QndjRDym2hj`)eLk((%p9OT+rh z&%77kaSaC=%?F74`S2T!$JPkAcg>}gGaQ>XK%b=pjLmrxd%Zh-18zVzm-wCC0pgSM zlldx5C-6V&n0v^k7MjKW68_bb>e}w^?!Zyd7FAt)Nt3yNtxsKR-tc5#L%+J#h5Tiw zbh+`gx)y&9V=mCUkpJ(X%Rna#sB7y$_kogr;~8E5IZ(=%&g=DZK)buSfL)_vV0v6$ zq){QT43yg45tlE-%Pmno{}WK^?>VBo`M|A%y1bg`^L)VeDaktmcWSgdP^Zxs0_~u? zeR~4)KGXH9L3hpmZr~|R-Vt~~qb~$LiI-m>$~FX~A$2X=AO=c7NxqZl4k6$H-Icy4 zaGd1b=D@5NDEd_ax@$HU@O+_<*K$$MF9jt#6>)hc(O-yx9bfACZ-Z73t7{K~&IA2- z&;_7JK^K9(14@3^B4T93q_|y@zgcqn5vbyk{2qi6Xc-i)ap%Gkc0~nYI4-H7(b?KM zQ_=%grcl7jl*<7tB@`}#pqWHmjD7yZJFl*fXav8vL0aMVdzxL+<*GAhezod1+Gpci zrJ2(BR-HB?_yv7$^*9m#A|VRF=k%>9p>PC5iBRA{Qas7jlJb($$%xBw`w&VrIUa5^ zt#s-QwNt0nmQAglI-_<*+2s1tQU+CaFUGFL(cJ4={>@<_)Q=W;@o(vG9{8IF{^o(d z&I1o7f`d?;l4T=ah2m-OHMxe{)AabEgOKrcKQjXtRJEC?5s2bo zhl&*J8^l=9t>S zpVe78Vsa?HifmGR66Ie+Kgd=TbQ2oA1ge038P6XE%|_=CZqZC*{Qs5KjYSMB@CZO@ zmtBul*QG0;+u-Z}Ey&s-{0-&^z#LUoGbKAh$0thDOKvDxE#bPEQ95;6nPhMAxqWU# z*|oYSCSu;{Vr{xdTIKe&BIHk+QBqn`R$5wGUMflUdMLUi2J&6$Z0r`uWYWgNmEn4tkdsqWR2o#o7!YMNu_QutIMlg|>fxof!V zgd8rHAHx@L6S!)Qm9%;gE9rOEvy!G}zq=$6+2?gpgsh&2kiwGsmEK0zWCZP(xYjgL z7^p`5K33v!wt83z>BL9%6`>Y2lFDjP0Y0J1I@8jKR?t~|&be)22^i{%&QjoFiLY6U zbS%NM#9Qn1`4G!n0@k14Vad6|+kjS@VMEtNJR~b=XkM}6t79OaO}^YoY6H(9pSOOc z-`xtg{l$s)o(Z7!o%nx>j-=YOUntR1Oz0iPrXh^eO7xF}9?c=yBzv^C33c(k3|5q1V0KBs?;uF9+23lw3i8u$V=!^eZn08?Qh~~ zuM_B;ARCGPfn_d$_CM*-89=B2PkNL`loC0c)-vVMSw}bsKG81e(OL5#Kzfycc1B|F zZUj$ybS@_J0^q41bT%gTb_9GPCE9%$83{c)lL;3n7&D#{djAZW^r(NUC+OG^*CCS7 zdjdT4TGoRm|6dHcsU^~*aXbT%J(_1amk8K;mlLss=K=iXMjM~@e?EwDq56qL_6U0c zI=9IWbVip$FVQDtX|_my4IrP8p7wu1(38+mLYFAne;c6oNpIO~J=W+s@QIYr{{u1- zdaMEh4x7YSNjIVQE_kv__VAZ5Mlo5{;1ek^rsK#Udvs<|B0aaxYM)d__!B_;D3Sco oqxF|aiFPj_18ue>@`KR3F(H7GElNbGZ;A9f=%pqKk(prs8-*z$sQ>@~ literal 13484 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�I05K_ASk=SXlmucP=TM-x)Xv6`e!rbJq@u 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

BqBdrti4<44;N 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

`xwo{mD;YfATQwPX=Ls^0%-*`6ld7z61M{e}w(X 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

)CrB0I82Kd?}q4D*(eJSv?FbRuGFAFIS!u#XG=D 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

t`*MsCKBT(v0Cjg${P;4wJK2~{W2=gD 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

>DDZcDB#b_kMuh9W9~O)0@@e0OIw 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 G=>Gzi2xou* literal 0 HcmV?d00001 diff --git a/boat/src/main/jniLibs/armeabi-v7a/libclient.so b/boat/src/main/jniLibs/armeabi-v7a/libclient.so deleted file mode 100644 index e81b85b6bfedfd3734a6766d3295962e3a3920fa..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 87332 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 Mbq_!cD1fO001ba7_y7O^ diff --git a/boat/src/main/jniLibs/armeabi-v7a/libserver.so b/boat/src/main/jniLibs/armeabi-v7a/libserver.so deleted file mode 100644 index c0154f7d8011a3ba6f622d4864a855b9f2886eb0..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 83236 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 + + / + \ No newline at end of file diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/CustomizeKeyboardEditorActivity.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/CustomizeKeyboardEditorActivity.java new file mode 100644 index 00000000..2cea4e3a --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/CustomizeKeyboardEditorActivity.java @@ -0,0 +1,273 @@ +package com.aof.mcinabox.gamecontroller.ckb; + +import android.animation.ObjectAnimator; +import android.content.Context; +import android.graphics.drawable.BitmapDrawable; +import android.hardware.SensorManager; +import android.opengl.Matrix; +import android.os.Bundle; +import android.util.AttributeSet; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import android.view.WindowManager; +import android.view.animation.DecelerateInterpolator; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RelativeLayout; + +import androidx.annotation.NonNull; +import androidx.appcompat.app.AppCompatActivity; +import androidx.appcompat.widget.Toolbar; +import androidx.core.content.ContextCompat; +import androidx.drawerlayout.widget.DrawerLayout; + +import com.aof.mcinabox.gamecontroller.ckb.achieve.CkbManager; +import com.aof.mcinabox.gamecontroller.ckb.achieve.CkbManagerDialog; +import com.aof.mcinabox.gamecontroller.ckb.support.CallCustomizeKeyboard; +import com.aof.utils.PicUtils; + +public class CustomizeKeyboardEditorActivity extends AppCompatActivity implements View.OnClickListener , DrawerLayout.DrawerListener , CallCustomizeKeyboard { + + private Toolbar mToolbar; + private ViewGroup mLayout_main; + private DrawerLayout mDrawerLayout; + private DragFloatActionButton dButton; + private CkbManagerDialog mDialog; + private CkbManager mManager; + + @Override + protected void onCreate(Bundle savedInstanceState){ + super.onCreate(savedInstanceState); + //隐藏系统状态栏 + getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + setContentView(R.layout.activity_ckbe); + + //初始化 + initUI(); + } + + private void initUI(){ + + mToolbar = findViewById(R.id.ckbe_toolbar); + mLayout_main = findViewById(R.id.ckbe_layout_main); + mDrawerLayout = findViewById(R.id.ckbe_drawerlayout); + dButton = new DragFloatActionButton(this); + mManager = new CkbManager(this,this,null); + mDialog = new CkbManagerDialog(this,mManager); + + //配置悬浮按钮 + ViewGroup.LayoutParams lp = new ViewGroup.LayoutParams(ViewGroup.LayoutParams.WRAP_CONTENT, ViewGroup.LayoutParams.WRAP_CONTENT); + this.addContentView(dButton,lp); + dButton.setBackground(ContextCompat.getDrawable(this,R.drawable.ic_build_black_24dp)); + dButton.setTodo(new ArrangeRule(){ + @Override + public void run(){ + mDialog.show(); + } + }); + + //设定工具栏 + setSupportActionBar(mToolbar); + + //设定监听 + mLayout_main.setOnClickListener(this); + mDrawerLayout.addDrawerListener(this); + + //设置背景 + mLayout_main.setBackground(new BitmapDrawable(getResources(),PicUtils.blur(this,10,((BitmapDrawable)ContextCompat.getDrawable(this,R.drawable.background)).getBitmap()))); + } + + + @Override + public void onClick(View v) { + if(v == mLayout_main){ + switchToolbar(); + } + } + + private Float viewPosY; + @Override + public void onDrawerSlide(@NonNull View drawerView, float slideOffset) { + if(viewPosY == null){ + viewPosY = mToolbar.getY(); + } + int viewHeight = mToolbar.getHeight(); + float slideSize = viewHeight * slideOffset; + mToolbar.setY(viewPosY - slideSize); + + } + + @Override + public void onDrawerOpened(@NonNull View drawerView) { + + } + + @Override + public void onDrawerClosed(@NonNull View drawerView) { + + } + + @Override + public void onDrawerStateChanged(int newState) { + + } + + private void switchToolbar(){ + int v = View.VISIBLE; + switch(mToolbar.getVisibility()){ + case View.INVISIBLE: + case View.GONE: + v = View.VISIBLE; + break; + case View.VISIBLE: + v = View.GONE; + break; + default: + break; + } + mToolbar.setVisibility(v); + } + + @Override + public void addView(View view) { + if(view.getLayoutParams() == null){ + return; + } + if(view.getLayoutParams() instanceof RelativeLayout.LayoutParams){ + this.mLayout_main.addView(view); + }else{ + RelativeLayout.LayoutParams params = new RelativeLayout.LayoutParams(view.getLayoutParams().width,view.getLayoutParams().height); + view.setLayoutParams(params); + this.mLayout_main.addView(view); + } + } + + + +} + +class DragFloatActionButton extends LinearLayout implements ViewGroup.OnTouchListener { + + private static final String TAG = "DragButton"; + private int parentHeight; + private int parentWidth; + + private int lastX; + private int lastY; + + private boolean isDrag; + private ViewGroup parent; + + private ArrangeRule aRule; + + + public DragFloatActionButton(Context context) { + super(context); + this.setOnTouchListener(this); + } + + @Override + public boolean performClick(){ + super.performClick(); + return false; + } + + public DragFloatActionButton(Context context, AttributeSet attrs) { + super(context, attrs); + } + + public DragFloatActionButton(Context context, AttributeSet attrs, int defStyleAttr) { + super(context, attrs, defStyleAttr); + } + + + public void behave(MotionEvent event){ + int rawX = (int) event.getRawX(); + int rawY = (int) event.getRawY(); + switch(event.getAction()){ + case MotionEvent.ACTION_DOWN: + isDrag = false; + this.setAlpha(0.9f); + getParent().requestDisallowInterceptTouchEvent(true); + lastX = rawX; + lastY = rawY; + if(getParent() != null){ + parent = (ViewGroup) getParent(); + parentHeight = parent.getHeight(); + parentWidth = parent.getWidth(); + } + break; + case MotionEvent.ACTION_MOVE: + this.setAlpha(0.9f); + int dx = rawX - lastX; + int dy = rawY - lastY; + int distance = (int) Math.sqrt(dx *dx + dy*dy); + if(distance > 2 && !isDrag){ + isDrag = true; + } + + float x = getX() + dx; + float y = getY() + dy; + //检测是否到达边缘 左上右下 + x = x < 0 ? 0 : x > parentWidth - getWidth() ? parentWidth - getWidth() : x; + y = getY() < 0 ? 0 : getY() + getHeight() > parentHeight ? parentHeight - getHeight() : y; + setX(x); + setY(y); + lastX = rawX; + lastY = rawY; + break; + case MotionEvent.ACTION_UP: + if(isDrag){ + //恢复按压效果 + setPressed(false); + moveHide(rawX); + }else{ + //执行点击操作 + startTodo(); + } + break; + } + } + + private void moveHide(int rawX){ + if(rawX >= parentWidth / 2){ + //靠右吸附 + ObjectAnimator oa = ObjectAnimator.ofFloat(this,"x",getX(),parentWidth - getWidth()); + oa.setInterpolator(new DecelerateInterpolator()); + oa.setDuration(500); + oa.start(); + }else{ + //靠左吸附 + ObjectAnimator oa = ObjectAnimator.ofFloat(this,"x",getX(),0); + oa.setInterpolator(new DecelerateInterpolator()); + oa.setDuration(500); + oa.start(); + } + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + if(v == this){ + this.behave(event); + return true; + } + return false; + } + + public void setTodo(ArrangeRule ar){ + this.aRule = ar; + } + + public void startTodo(){ + if(aRule != null){ + aRule.run(); + } + } +} + +class ArrangeRule{ + public void run(){ + // Override this method. + } +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManager.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManager.java new file mode 100644 index 00000000..44c6fa9e --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManager.java @@ -0,0 +1,220 @@ +package com.aof.mcinabox.gamecontroller.ckb.achieve; + +import android.content.Context; +import android.util.Log; +import android.view.ViewGroup; + +import androidx.annotation.NonNull; + +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.gamecontroller.ckb.button.GameButton; +import com.aof.mcinabox.gamecontroller.ckb.support.CallCustomizeKeyboard; +import com.aof.mcinabox.gamecontroller.ckb.support.GameButtonArray; +import com.aof.mcinabox.gamecontroller.ckb.support.GameButtonRecorder; +import com.aof.mcinabox.gamecontroller.ckb.support.KeyboardRecorder; +import com.aof.mcinabox.gamecontroller.controller.Controller; +import com.google.gson.Gson; + +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; + +public class CkbManager { + + private final static String TAG = "CkbManager"; + public final static int MAX_KEYBOARD_SIZE = 80; + public final static int MIN_KEYBOARD_SIZE = 0; + + private Context mContext; + private CallCustomizeKeyboard mCall; + private Controller mController; + + private GameButtonArray buttonList; + + private int buttonMode = GameButton.MODE_MOVEABLE_EDITABLE; + + public CkbManager(@NonNull Context context , @NonNull CallCustomizeKeyboard call , Controller controller){ + super(); + this.mContext = context; + this.mCall = call; + this.mController = controller; + init(); + } + + private void init(){ + + //初始化按键列表 + buttonList = new GameButtonArray<>(); + + } + + public Controller getController(){ + return mController; + } + + public boolean addGameButton(GameButton button){ + if( this.containGameButton(button) || this.buttonList.size() >= MAX_KEYBOARD_SIZE){ + button.unsetFirstAdded(); + return false; + }else{ + if(button == null){ + button = new GameButton(mContext,mCall,mController,this).setButtonMode(buttonMode).setFirstAdded(); + ( new GameButtonDialog(mContext,button,this) ).show(); + } + this.buttonList.add(button); + this.addView(button); + return true; + } + } + + public boolean containGameButton(GameButton g){ + return buttonList.contains(g); + } + + public boolean removeGameButton(GameButton g){ + if ( this.containGameButton(g) ){ + GameButtonArray gl = new GameButtonArray<>(); + for(GameButton gb : buttonList){ + if(gb != g){ + gl.add(gb); + } + } + this.removeView(g); + this.buttonList = gl; + return true; + }else{ + return false; + } + } + + private boolean addView(GameButton g){ + + if( g != null && g.getParent() == null){ + mCall.addView(g); + return true; + }else{ + return false; + } + + } + + private boolean removeView(GameButton g){ + + if(g != null && g.getParent() != null){ + ViewGroup vg = (ViewGroup) g.getParent(); + vg.removeView(g); + return true; + }else{ + return false; + } + + } + + public int getButtonCounts(){ + return buttonList.size(); + } + + public boolean setButtonsMode(int mode) { + if(mode == GameButton.MODE_GAME || mode == GameButton.MODE_MOVEABLE_EDITABLE || mode == GameButton.MODE_PREVIEW){ + for (GameButton g : buttonList) { + g.setButtonMode(mode); + } + this.buttonMode = mode; + return true; + }else{ + return false; + } + } + + public GameButton[] getGameButtons(){ + GameButton[] views = new GameButton[getButtonCounts()]; + for(int i = 0; i < views.length ; i++){ + views[i] = buttonList.get(i); + } + return views; + } + + public GameButton getGameButton(int index){ + if(index >= 0 && index < buttonList.size()){ + return buttonList.get(index); + }else{ + return null; + } + } + + public void setInputMode(int mode){ + for(GameButton gb : buttonList){ + gb.setInputMode(mode); + } + } + + public boolean exportKeyboard(String fileName){ + GameButtonRecorder[] gbrs = new GameButtonRecorder[buttonList.size()]; + for(int a = 0; a < buttonList.size() ; a++){ + GameButtonRecorder gbr = new GameButtonRecorder(); + gbr.recordData(buttonList.get(a)); + gbrs[a] = gbr; + } + KeyboardRecorder kr = new KeyboardRecorder(); + kr.setScreenArgs(mContext.getResources().getDisplayMetrics().widthPixels,mContext.getResources().getDisplayMetrics().heightPixels); + kr.setRecorderDatas(gbrs); + + Gson gson = new Gson(); + String jsonString = gson.toJson(kr); + try { + FileWriter jsonWriter = new FileWriter(new File(AppManifest.MCINABOX_KEYBOARD + "/" + fileName + ".json")); + BufferedWriter out = new BufferedWriter(jsonWriter); + out.write(jsonString); + out.close(); + return true; + } catch (IOException e) { + e.printStackTrace(); + return false; + } + } + + public boolean loadKeyboard(String fileName){ + File file = new File(AppManifest.MCINABOX_KEYBOARD + "/" + fileName); + if( !file.exists()){ + return false; + } + KeyboardRecorder kr; + try { + InputStream inputStream = new FileInputStream(file); + Reader reader = new InputStreamReader(inputStream); + Gson gson = new Gson(); + kr = gson.fromJson(reader, KeyboardRecorder.class); + } catch (Exception e) { + e.printStackTrace(); + return false; + } + GameButtonRecorder[] gbr; + if(kr != null){ + gbr = kr.getRecorderDatas(); + }else{ + return false; + } + //清除全部按键 + clearKeyboard(); + //添加新的按键 + for(GameButtonRecorder tgbr: gbr){ + addGameButton(tgbr.recoverData(mContext,mCall,mController,this)); + } + return true; + } + + public void clearKeyboard(){ + for (GameButton gb : buttonList){ + removeView(gb); + } + buttonList = new GameButtonArray<>(); + } + + +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManagerDialog.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManagerDialog.java new file mode 100644 index 00000000..deb3386a --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/CkbManagerDialog.java @@ -0,0 +1,282 @@ +package com.aof.mcinabox.gamecontroller.ckb.achieve; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.os.FileObserver; +import android.view.View; +import android.widget.ArrayAdapter; +import android.widget.BaseAdapter; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.Spinner; +import android.widget.TextView; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.gamecontroller.ckb.R; +import com.aof.mcinabox.gamecontroller.ckb.button.GameButton; +import com.aof.utils.dialog.support.DialogSupports; +import com.aof.utils.dialog.DialogUtils; +import com.aof.utils.FileTool; +import com.aof.utils.PromptUtils; +import java.io.File; +import java.util.ArrayList; +import java.util.Timer; +import java.util.TimerTask; + +public class CkbManagerDialog extends Dialog implements View.OnClickListener, CompoundButton.OnCheckedChangeListener, Dialog.OnCancelListener { + + private Context mContext; + private CkbManager mManager; + private RadioButton radioEditable; + private RadioButton radioGame; + private TextView textButtonSum; + private Button buttonAdd; + private Spinner spinnerSelected; + private EditText editFileName; + private Button buttonLoad; + private Button buttonExport; + private Button buttonOK; + private Button buttonDel; + private Button buttonClear; + private KeyboardFileListener fileListener; + + + + private final static String TAG = "CkbConfigDialog"; + + public CkbManagerDialog(@NonNull Context context, CkbManager manager) { + super(context); + this.setContentView(R.layout.dialog_customize_keyboard_config); + this.mContext = context; + this.mManager = manager; + initUI(); + } + + private void initUI() { + + radioEditable = findViewById(R.id.input_customize_keyboard_dialog_radio_editable); + radioGame = findViewById(R.id.input_customize_keyboard_dialog_radio_ingame); + textButtonSum = findViewById(R.id.input_customize_keyboard_dialog_text_button_sum); + buttonAdd = findViewById(R.id.input_customize_keyboard_dialog_button_add); + spinnerSelected = findViewById(R.id.input_customize_keyboard_dialog_spinner_select); + editFileName = findViewById(R.id.input_customize_keyboard_dialog_edit_filename); + buttonLoad = findViewById(R.id.input_customize_keyboard_dialog_button_load); + buttonExport = findViewById(R.id.input_customize_keyboard_dialog_button_export); + buttonOK = findViewById(R.id.input_customize_keyboard_dialog_button_ok); + buttonDel = findViewById(R.id.input_customize_keyboard_dialog_button_delete); + buttonClear = findViewById(R.id.input_customize_keyboard_dialog_button_clear); + + //设定监听 + for (View v : new View[]{buttonAdd, buttonLoad, buttonExport, buttonOK, buttonDel, buttonClear}) { + v.setOnClickListener(this); + } + for (RadioButton r : new RadioButton[]{radioGame, radioEditable}) { + r.setOnCheckedChangeListener(this); + } + this.setOnCancelListener(this); + + //是否显示模式选项 + if(mManager.getController() == null){ + ((LinearLayout)findViewById(R.id.input_customize_keyboard_dialog_layout_mode)).setVisibility(View.GONE); + } + + } + + @Override + public void dismiss() { + super.dismiss(); + //关闭目录监听 + fileListener.stopWatching(); + //关闭按键数量刷新 + setCountsRefresh(false); + } + + @Override + public void show() { + super.show(); + //启用目录变化监听 + fileListener = new KeyboardFileListener(this); + fileListener.startWatching(); + updataUI(); + //启用按键数量刷新 + setCountsRefresh(true); + } + + @Override + public void onCancel(DialogInterface dialog) { + + } + + private void removeSelectedFile(){ + String filePath = AppManifest.MCINABOX_KEYBOARD + "/" + spinnerSelected.getSelectedItem().toString(); + FileTool.deleteFile(new File(filePath)); + } + + private void loadSelectedFile(){ + String fileName = spinnerSelected.getSelectedItem().toString(); + if(! mManager.loadKeyboard(fileName)){ + DialogUtils.createSingleChoiceDialog(mContext, "错误", "载入键盘文件失败,文件已损坏!", "确定", null); + }else{ + PromptUtils.createPrompt(mContext,"键盘文件载入成功!"); + } + } + + @Override + public void onClick(View v) { + if (v == buttonOK) { + this.dismiss(); + } + if (v == buttonAdd) { + mManager.addGameButton(null); + } + if (v == buttonExport) { + if (editFileName.getText() == null) { + PromptUtils.createPrompt(mContext, "文件名不能为空!"); + return; + } + final String fn = editFileName.getText().toString(); + if (fn.equals("")) { + PromptUtils.createPrompt(mContext, "文件名不能为空!"); + return; + } + + //检查文件是否存在重复,如果重复,提示是否覆盖。 + boolean run = true; + for (String str : FileTool.listChildFilesFromTargetDir(AppManifest.MCINABOX_KEYBOARD)) { + if (str.equals(fn + ".json")) { + run = false; + DialogUtils.createBothChoicesDialog(mContext, "是否覆盖", "存在同名文件,是否覆盖现有文件?覆盖操作不可恢复", "覆盖", "取消", new DialogSupports() { + @Override + public void runWhenPositive() { + mManager.exportKeyboard(fn); + } + }); + } + } + if (run) { + mManager.exportKeyboard(fn); + } + } + + if (v == buttonDel) { + if (spinnerSelected.getSelectedItem() != null) { + String str = spinnerSelected.getSelectedItem().toString(); + if (!str.equals("")) { + DialogUtils.createBothChoicesDialog(mContext, "即将删除文件","您将要删除文件 " + str + " ,删除操作不可恢复。", "删除", "取消", new DialogSupports(){ + @Override + public void runWhenPositive(){ + removeSelectedFile(); + } + }); + } + } + } + + if(v == buttonLoad){ + if(spinnerSelected.getSelectedItem() != null){ + String str = spinnerSelected.getSelectedItem().toString(); + if(!str.equals("")){ + DialogUtils.createBothChoicesDialog(mContext, "即将载入文件","您将要载入文件 " + str + " ,载入操作将会清除您当前的配置,请确认您已经保存了当前的模板。", "载入", "取消", new DialogSupports(){ + @Override + public void runWhenPositive(){ + loadSelectedFile(); + } + }); + } + } + } + + if(v == buttonClear){ + DialogUtils.createBothChoicesDialog(mContext,"即将清空模板", "您将要清除当前已添加的所有自定义按键,此操作不会影响已保存的模板文件,清除操作不可恢复。","清空","取消",new DialogSupports(){ + @Override + public void runWhenPositive(){ + mManager.clearKeyboard(); + } + }); + } + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + + if (buttonView == radioEditable) { + if (isChecked) { + mManager.setButtonsMode(GameButton.MODE_MOVEABLE_EDITABLE); + buttonAdd.setVisibility(View.VISIBLE); + } + } + + if (buttonView == radioGame) { + if (isChecked) { + mManager.setButtonsMode(GameButton.MODE_GAME); + buttonAdd.setVisibility(View.GONE); + } + } + } + + private ArrayList data; + public void updataUI() { + if(data == null){ + data = new ArrayList<>(); + data.addAll(FileTool.listChildFilesFromTargetDir(AppManifest.MCINABOX_KEYBOARD)); + spinnerSelected.setAdapter(new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_dropdown_item, data)); + }else{ + data.clear(); + data.addAll(FileTool.listChildFilesFromTargetDir(AppManifest.MCINABOX_KEYBOARD)); + ( (BaseAdapter) spinnerSelected.getAdapter()).notifyDataSetChanged(); + } + } + + public void setButtonCounts(final int counts){ + this.textButtonSum.post(new Runnable() { + @Override + public void run() { + textButtonSum.setText(String.valueOf(counts)); + } + }); + } + + private Timer mTimer; + public void setCountsRefresh(boolean able){ + if(able){ + mTimer = new Timer(); + mTimer.schedule(new TimerTask() { + @Override + public void run() { + setButtonCounts(mManager.getButtonCounts()); + } + },500,500); + }else{ + if(mTimer != null){ + mTimer.cancel(); + } + } + } +} + +class KeyboardFileListener extends FileObserver { + + private CkbManagerDialog mDialog; + + public KeyboardFileListener(CkbManagerDialog dialog) { + super(AppManifest.MCINABOX_KEYBOARD); + this.mDialog = dialog; + } + + @Override + public void onEvent(int event, @Nullable String path) { + switch (event) { + case FileObserver.CREATE: + case FileObserver.DELETE: + mDialog.updataUI(); + break; + default: + break; + } + } +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/GameButtonDialog.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/GameButtonDialog.java new file mode 100644 index 00000000..6b53fd2b --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/achieve/GameButtonDialog.java @@ -0,0 +1,687 @@ +package com.aof.mcinabox.gamecontroller.ckb.achieve; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.Button; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.SeekBar; +import android.widget.Spinner; +import android.widget.TextView; + +import androidx.annotation.NonNull; +import androidx.appcompat.widget.SwitchCompat; + +import com.aof.mcinabox.definitions.id.key.KeyEvent; +import com.aof.mcinabox.gamecontroller.ckb.R; +import com.aof.mcinabox.gamecontroller.ckb.button.GameButton; +import com.aof.mcinabox.gamecontroller.ckb.support.CkbThemeMarker; +import com.aof.mcinabox.gamecontroller.ckb.support.QwertButton; +import com.aof.utils.dialog.support.DialogSupports; +import com.aof.utils.dialog.DialogUtils; + +import java.util.Arrays; + +public class GameButtonDialog extends Dialog implements View.OnClickListener, SeekBar.OnSeekBarChangeListener, CompoundButton.OnCheckedChangeListener, Dialog.OnCancelListener, View.OnFocusChangeListener, Spinner.OnItemSelectedListener { + + private Context mContext; + private GameButton mGameButton; + private CkbManager mManager; + + private EditText editKeyName; + + private Button buttonReduceWidth; + private EditText editKeyWidth; + private Button buttonPlusWidth; + + private Button buttonReduceHeight; + private EditText editKeyHeight; + private Button buttonPlusHeight; + + private Button buttonReduceLeft; + private EditText editKeyLeft; + private Button buttonPlusLeft; + + private Button buttonReduceTop; + private EditText editKeyTop; + private Button buttonPlusTop; + + private TextView textMap1; + private TextView textMap2; + private TextView textMap3; + private TextView textMap4; + + private EditText editBackColor; + private View viewBackColorPreview; + + private EditText editTextColor; + private View viewTextColorPreview; + + private SeekBar seekbarTextSize; + private TextView textTextSize; + + private SeekBar seekbarCornerSize; + private TextView textCornerSize; + + private SeekBar seekbarAlpha; + private TextView textAlpha; + + private SwitchCompat switchKeep; + private SwitchCompat switchHide; + private SwitchCompat switchViewerFollow; + + private RadioButton rbtShowAll; + private RadioButton rbtShowInGame; + private RadioButton rbtShowOutGame; + + private Spinner spinnerDesign; + + private Button buttonOK; + private Button buttonCancel; + private Button buttonDel; + private Button buttonCopy; + + public final static int DEFAULT_MOVE_DISTANCE = 1; + public final static int DEFAULT_MARGIN_DISTANCE = 5; + private final static String TAG = "GameButtonDialog"; + + + public GameButtonDialog(@NonNull Context context, GameButton gamebutton, CkbManager manager) { + super(context); + setContentView(R.layout.dialog_gamebutton_config); + this.mContext = context; + this.mGameButton = gamebutton; + this.mManager = manager; + initUI(); + } + + private void initUI() { + this.setCanceledOnTouchOutside(false); + + //初始化对象 + this.editKeyName = findViewById(R.id.gamebutton_config_dialog_edittext_keyname); + + this.buttonReduceWidth = findViewById(R.id.gamebutton_config_dialog_button_reduce_width); + this.editKeyWidth = findViewById(R.id.gamebutton_config_dialog_edittext_width); + this.buttonPlusWidth = findViewById(R.id.gamebutton_config_dialog_button_plus_width); + + this.buttonReduceHeight = findViewById(R.id.gamebutton_config_dialog_button_reduce_height); + this.editKeyHeight = findViewById(R.id.gamebutton_config_dialog_edittext_height); + this.buttonPlusHeight = findViewById(R.id.gamebutton_config_dialog_button_plus_height); + + this.buttonReduceLeft = findViewById(R.id.gamebutton_config_dialog_button_reduce_left); + this.editKeyLeft = findViewById(R.id.gamebutton_config_dialog_edittext_left); + this.buttonPlusLeft = findViewById(R.id.gamebutton_config_dialog_button_plus_left); + + this.buttonReduceTop = findViewById(R.id.gamebutton_config_dialog_button_reduce_top); + this.editKeyTop = findViewById(R.id.gamebutton_config_dialog_edittext_top); + this.buttonPlusTop = findViewById(R.id.gamebutton_config_dialog_button_plus_top); + + this.textMap1 = findViewById(R.id.gamebutton_config_dialog_text_map_1); + this.textMap2 = findViewById(R.id.gamebutton_config_dialog_text_map_2); + this.textMap3 = findViewById(R.id.gamebutton_config_dialog_text_map_3); + this.textMap4 = findViewById(R.id.gamebutton_config_dialog_text_map_4); + + this.editBackColor = findViewById(R.id.gamebutton_config_dialog_edittext_backcolor_hex); + this.viewBackColorPreview = findViewById(R.id.gamebutton_config_dialog_view_backcolor_preview); + + this.editTextColor = findViewById(R.id.gamebutton_config_dialog_edittext_textcolor_hex); + this.viewTextColorPreview = findViewById(R.id.gamebutton_config_dialog_view_textcolor_preview); + + this.seekbarAlpha = findViewById(R.id.gamebutton_config_dialog_seekbar_alpha); + this.textAlpha = findViewById(R.id.gamebutton_config_dialog_text_alpha); + + this.seekbarCornerSize = findViewById(R.id.gamebutton_config_dialog_seekbar_cornersize); + this.textCornerSize = findViewById(R.id.gamebutton_config_dialog_text_cornersize); + + this.seekbarTextSize = findViewById(R.id.gamebutton_config_dialog_seekbar_textsize); + this.textTextSize = findViewById(R.id.gamebutton_config_dialog_text_textsize); + + this.switchKeep = findViewById(R.id.gamebutton_config_dialog_switch_keep); + this.switchHide = findViewById(R.id.gamebutton_config_dialog_switch_hide); + this.switchViewerFollow = findViewById(R.id.gamebutton_config_dialog_switch_viewerfollow); + + this.rbtShowAll = findViewById(R.id.gamebutton_config_dialog_rb_all); + this.rbtShowInGame = findViewById(R.id.gamebutton_config_dialog_rb_in_game); + this.rbtShowOutGame = findViewById(R.id.gamebutton_config_dialog_rb_out_game); + + this.spinnerDesign = findViewById(R.id.gamebutton_config_dialog_spinner_design); + + this.buttonOK = findViewById(R.id.gamebutton_config_dialog_button_ok); + this.buttonCancel = findViewById(R.id.gamebutton_config_dialog_button_cancel); + this.buttonDel = findViewById(R.id.gamebutton_config_dialog_button_del); + this.buttonCopy = findViewById(R.id.gamebutton_config_dialog_button_copy); + + //设定控件属性 + seekbarAlpha.setMax(GameButton.MAX_ALPHA_SIZE_PT); + seekbarCornerSize.setMax(GameButton.MAX_CORNOR_SIZE_PT); + seekbarTextSize.setMax(GameButton.MAX_TEXT_SIZE_SP); + spinnerDesign.setAdapter(new ArrayAdapter(mContext, android.R.layout.simple_spinner_item, Arrays.asList(CkbThemeMarker.DESIGNS))); + + + //设定监听 + for (View v : new View[]{buttonReduceWidth, buttonPlusWidth, buttonReduceHeight, buttonPlusHeight, buttonReduceLeft, buttonPlusLeft, + buttonReduceTop, buttonPlusTop, textMap1, textMap2, textMap3, textMap4, viewBackColorPreview, viewTextColorPreview, buttonOK, buttonCancel, + buttonDel, buttonCopy}) { + v.setOnClickListener(this); + } + for (SeekBar s : new SeekBar[]{seekbarTextSize, seekbarCornerSize, seekbarAlpha}) { + s.setOnSeekBarChangeListener(this); + } + for (SwitchCompat s : new SwitchCompat[]{switchHide, switchKeep, switchViewerFollow}) { + s.setOnCheckedChangeListener(this); + } + for (EditText e : new EditText[]{editKeyName, editKeyWidth, editKeyHeight, editKeyLeft, editKeyTop, editBackColor, editTextColor}) { + e.setOnFocusChangeListener(this); + } + for (RadioButton rbt : new RadioButton[]{rbtShowOutGame, rbtShowInGame, rbtShowAll}) { + rbt.setOnCheckedChangeListener(this); + } + this.setOnCancelListener(this); + this.spinnerDesign.setOnItemSelectedListener(this); + + //从GameButton设定控件状态 + setUIStateFromGameButton(); + + } + + private void setUIStateFromGameButton() { + editKeyName.setText(mGameButton.getKeyName()); + editKeyWidth.setText(String.valueOf(mGameButton.getKeySize()[0])); + editKeyHeight.setText(String.valueOf(mGameButton.getKeySize()[1])); + editKeyLeft.setText(String.valueOf(mGameButton.getKeyPos()[0])); + editKeyTop.setText(String.valueOf(mGameButton.getKeyPos()[1])); + textMap1.setText(mGameButton.getKeyMaps()[0]); + textMap2.setText(mGameButton.getKeyMaps()[1]); + textMap3.setText(mGameButton.getKeyMaps()[2]); + textMap4.setText(mGameButton.getKeyMaps()[3]); + editBackColor.setText(mGameButton.getBackColorHex()); + editTextColor.setText(mGameButton.getTextColorHex()); + seekbarAlpha.setProgress(mGameButton.getAlphaSize() - GameButton.MIN_ALPHA_SIZE_PT); + seekbarTextSize.setProgress(mGameButton.getTextProgress() - GameButton.MIN_TEXT_SIZE_SP); + seekbarCornerSize.setProgress(mGameButton.getCornerRadius() - GameButton.MIN_CORNOR_SIZE_PT); + switchKeep.setChecked(mGameButton.isKeep()); + switchHide.setChecked(mGameButton.isHide()); + switchViewerFollow.setChecked(mGameButton.isViewerFollow()); + switch (mGameButton.getShow()) { + case GameButton.SHOW_ALL: + rbtShowAll.setChecked(true); + break; + case GameButton.SHOW_IN_GAME: + rbtShowInGame.setChecked(true); + break; + case GameButton.SHOW_OUT_GAME: + rbtShowOutGame.setChecked(true); + break; + } + spinnerDesign.setSelection(mGameButton.getDesignIndex() - 1); + } + + @Override + public void onCancel(DialogInterface dialog) { + + if (dialog == this) { + if (mGameButton.isFirstAdded()) { + mGameButton.removeSelfFromParent(); + } else { + restoreGameButon(); + } + } + + } + + @Override + public void show() { + super.show(); + //在显示的时候记录下GameButton的初始状态 + recordGameButton(); + } + + public void clearEditTextFocus() { + for (EditText et : new EditText[]{editKeyName, editBackColor, editTextColor, editKeyWidth, editKeyHeight, editKeyLeft, editKeyTop}) { + et.clearFocus(); + } + } + + @Override + public void onClick(View v) { + + clearEditTextFocus(); + + if (v == buttonOK) { + mManager.addGameButton(mGameButton); + this.dismiss(); + } + + if (v == buttonCancel) { + this.cancel(); + } + + if (v == buttonDel) { + DialogUtils.createBothChoicesDialog(mContext, "删除按键", "你确定要删除这个按键吗?执行该操作后无法恢复。", "确定", "取消", new DialogSupports() { + @Override + public void runWhenPositive() { + mGameButton.removeSelfFromParent(); + dismiss(); + } + }); + } + + if (v == buttonCopy) { + DialogUtils.createBothChoicesDialog(mContext, "复制按键", "你确定要复制这个按键吗?执行该操作后将会将编辑对象切换为新增按键。", "确定", "取消", new DialogSupports() { + @Override + public void runWhenPositive() { + buttonOK.performClick(); + GameButton g = mGameButton.getNewButtonLikeThis().setFirstAdded(); + new GameButtonDialog(mContext, g, mManager).show(); + mManager.addGameButton(g); + } + }); + } + + if (v == buttonReduceWidth) { + float wDp = Float.parseFloat(editKeyWidth.getText().toString()) - DEFAULT_MOVE_DISTANCE; + if (mGameButton.setKeySize(wDp, mGameButton.getKeySize()[1])) { + editKeyWidth.setText(String.valueOf(wDp)); + } + } + + if (v == buttonPlusWidth) { + float wDp = Float.parseFloat(editKeyWidth.getText().toString()) + DEFAULT_MOVE_DISTANCE; + if (mGameButton.setKeySize(wDp, mGameButton.getKeySize()[1])) { + editKeyWidth.setText(String.valueOf(wDp)); + } + } + + if (v == buttonReduceHeight) { + float hDp = Float.parseFloat(editKeyHeight.getText().toString()) - DEFAULT_MOVE_DISTANCE; + if (mGameButton.setKeySize(mGameButton.getKeySize()[0], hDp)) { + editKeyHeight.setText(String.valueOf(hDp)); + } + } + + if (v == buttonPlusHeight) { + float hDp = Float.parseFloat(editKeyHeight.getText().toString()) + DEFAULT_MOVE_DISTANCE; + if (mGameButton.setKeySize(mGameButton.getKeySize()[0], hDp)) { + editKeyHeight.setText(String.valueOf(hDp)); + } + } + + if (v == buttonReduceLeft) { + float lPx = Float.parseFloat(editKeyLeft.getText().toString()) - DEFAULT_MARGIN_DISTANCE; + float[] result = mGameButton.setKeyPos(lPx, mGameButton.getKeyPos()[1]); + editKeyLeft.setText(String.valueOf(result[0])); + editKeyTop.setText(String.valueOf(result[1])); + } + + if (v == buttonPlusLeft) { + float lPx = Float.parseFloat(editKeyLeft.getText().toString()) + DEFAULT_MARGIN_DISTANCE; + float[] result = mGameButton.setKeyPos(lPx, mGameButton.getKeyPos()[1]); + editKeyLeft.setText(String.valueOf(result[0])); + editKeyTop.setText(String.valueOf(result[1])); + } + + if (v == buttonReduceTop) { + float tPx = Float.parseFloat(editKeyTop.getText().toString()) - DEFAULT_MARGIN_DISTANCE; + float[] result = mGameButton.setKeyPos(mGameButton.getKeyPos()[0], tPx); + editKeyLeft.setText(String.valueOf(result[0])); + editKeyTop.setText(String.valueOf(result[1])); + } + + if (v == buttonPlusTop) { + float tPx = Float.parseFloat(editKeyTop.getText().toString()) + DEFAULT_MARGIN_DISTANCE; + float[] result = mGameButton.setKeyPos(mGameButton.getKeyPos()[0], tPx); + editKeyLeft.setText(String.valueOf(result[0])); + editKeyTop.setText(String.valueOf(result[1])); + } + + if (v == textMap1 || v == textMap2 || v == textMap3 || v == textMap4) { + int i = 0; + String n = ""; + if (v == textMap1) { + n = textMap1.getText().toString(); + } else if (v == textMap2) { + i = 1; + n = textMap2.getText().toString(); + } else if (v == textMap3) { + i = 2; + n = textMap3.getText().toString(); + } else { + i = 3; + n = textMap4.getText().toString(); + } + new CkbKeyMapSelecterDialog(mContext, this, i, n).show(); + } + + if (v == viewBackColorPreview) { + //TODO:颜色选择器 + } + + if (v == viewTextColorPreview) { + //TODO:颜色选择器 + } + + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + + if (buttonView == switchKeep) { + mGameButton.setKeep(isChecked); + } + + if (buttonView == switchHide) { + mGameButton.setHide(isChecked); + } + + if (buttonView == switchViewerFollow) { + mGameButton.setViewerFollow(isChecked); + } + + if (buttonView == rbtShowAll) { + if (isChecked) { + mGameButton.setShow(GameButton.SHOW_ALL); + } + } + + if (buttonView == rbtShowInGame) { + if (isChecked) { + mGameButton.setShow(GameButton.SHOW_IN_GAME); + } + } + + if (buttonView == rbtShowOutGame) { + if (isChecked) { + mGameButton.setShow(GameButton.SHOW_OUT_GAME); + } + } + + } + + @Override + public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser) { + + if (seekBar == this.seekbarAlpha) { + int a = seekBar.getProgress() + GameButton.MIN_ALPHA_SIZE_PT; + textAlpha.setText(String.valueOf(a)); + mGameButton.setAlphaSize(a); + } + + if (seekBar == this.seekbarCornerSize) { + int a = seekBar.getProgress() + GameButton.MIN_CORNOR_SIZE_PT; + textCornerSize.setText(String.valueOf(a)); + mGameButton.setCornerRadius(a); + } + + if (seekBar == this.seekbarTextSize) { + int a = seekBar.getProgress() + GameButton.MIN_TEXT_SIZE_SP; + textTextSize.setText(String.valueOf(a)); + mGameButton.setTextSize(a); + } + + } + + @Override + public void onStartTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onStopTrackingTouch(SeekBar seekBar) { + + } + + @Override + public void onFocusChange(View v, boolean hasFocus) { + + if (v == editKeyName) { + if (!hasFocus) { + if (!mGameButton.setKeyName(editKeyName.getText().toString())) { + editKeyName.setText(mGameButton.getKeyName()); + } + } + } + + if (v == editKeyWidth) { + if (!hasFocus) { + if (!editKeyWidth.getText().toString().equals("")) { + if (!mGameButton.setKeySize(Float.parseFloat(editKeyWidth.getText().toString()), mGameButton.getKeySize()[1])) { + editKeyWidth.setText(String.valueOf(mGameButton.getKeySize()[0])); + } + } else { + editKeyWidth.setText(String.valueOf(mGameButton.getKeySize()[0])); + } + } + } + + if (v == editKeyHeight) { + if (!hasFocus) { + if (!editKeyHeight.getText().toString().equals("")) { + if (!mGameButton.setKeySize(mGameButton.getKeySize()[0], Float.parseFloat(editKeyHeight.getText().toString()))) { + editKeyHeight.setText(String.valueOf(mGameButton.getKeySize()[1])); + } + } else { + editKeyHeight.setText(String.valueOf(mGameButton.getKeySize()[1])); + } + } + } + + if (v == editKeyLeft) { + if (!hasFocus) { + if (!editKeyLeft.getText().toString().equals("")) { + mGameButton.setKeyPos(Float.parseFloat(editKeyLeft.getText().toString()), mGameButton.getKeyPos()[1]); + } + editKeyLeft.setText(String.valueOf(mGameButton.getKeyPos()[0])); + } + } + + if (v == editKeyTop) { + if (!hasFocus) { + if (!editKeyTop.getText().toString().equals("")) { + mGameButton.setKeyPos(mGameButton.getKeyPos()[0], Float.parseFloat(editKeyTop.getText().toString())); + } + editKeyTop.setText(String.valueOf(mGameButton.getKeyPos()[1])); + } + } + + if (v == editBackColor) { + if (!hasFocus) { + if (!mGameButton.setBackColor(editBackColor.getText().toString())) { + editBackColor.setText(mGameButton.getBackColorHex()); + } + } + } + + if (v == editTextColor) { + if (!hasFocus) { + if (!mGameButton.setTextColor(editTextColor.getText().toString())) { + editTextColor.setText(mGameButton.getTextColorHex()); + } + } + } + + } + + private String originalKeyName; + private float[] originalKeySize; + private float[] originalKeyPos; + private String[] originalMaps; + private String originalBackColorHex; + private String originalTextColorHex; + private int originalAlpha; + private int originalTextSize; + private int originalCornerSize; + private boolean originalKeep; + private boolean originalHide; + private boolean originalViewerFollow; + private boolean originalAutoHide; + private int originalDesignIndex; + private int originalShow; + + private void recordGameButton() { + this.originalKeyName = mGameButton.getKeyName(); + this.originalKeySize = mGameButton.getKeySize(); + this.originalKeyPos = mGameButton.getKeyPos(); + this.originalMaps = mGameButton.getKeyMaps(); + this.originalBackColorHex = mGameButton.getBackColorHex(); + this.originalTextColorHex = mGameButton.getTextColorHex(); + this.originalAlpha = mGameButton.getAlphaSize(); + this.originalTextSize = mGameButton.getTextProgress(); + this.originalCornerSize = mGameButton.getCornerRadius(); + this.originalKeep = mGameButton.isKeep(); + this.originalHide = mGameButton.isHide(); + this.originalViewerFollow = mGameButton.isViewerFollow(); + this.originalShow = mGameButton.getShow(); + this.originalDesignIndex = mGameButton.getDesignIndex(); + } + + private void restoreGameButon() { + mGameButton.setKeyName(this.originalKeyName); + mGameButton.setKeySize(this.originalKeySize[0], this.originalKeySize[1]); + mGameButton.setKeyPos(this.originalKeyPos[0], this.originalKeyPos[1]); + mGameButton.setKeyMaps(this.originalMaps); + mGameButton.setBackColor(this.originalBackColorHex); + mGameButton.setTextColor(this.originalTextColorHex); + mGameButton.setAlphaSize(this.originalAlpha); + mGameButton.setTextSize(this.originalTextSize); + mGameButton.setCornerRadius(this.originalCornerSize); + mGameButton.setKeep(this.originalKeep); + mGameButton.setHide(this.originalHide); + mGameButton.setShow(this.originalShow); + mGameButton.setViewerFollow(this.originalViewerFollow); + mGameButton.setDesignIndex(originalDesignIndex); + } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (parent == spinnerDesign) { + mGameButton.setDesignIndex(position + 1); + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + + } + + public void setKeyMap(int index, String name, int type) { + //设置数据 + String[] tmp = mGameButton.getKeyMaps(); + tmp[index] = name; + mGameButton.setKeyMaps(tmp); + + int[] tmp2 = mGameButton.getKeyTypes(); + tmp2[index] = type; + mGameButton.setKeyTypes(tmp2); + + //更新UI + textMap1.setText(tmp[0]); + textMap2.setText(tmp[1]); + textMap3.setText(tmp[2]); + textMap4.setText(tmp[3]); + } +} + +class CkbKeyMapSelecterDialog extends Dialog implements View.OnClickListener, Dialog.OnCancelListener { + + private Context mContext; + private GameButtonDialog mDialog; + private final static String TAG = "CkbKMSDialog"; + + private LinearLayout keyboardLayer; + private LinearLayout mouseLayer; + private TextView textKeyName; + private Button buttonOK; + private Button buttonCancel; + private Button buttonClear; + + private String selectedData; + private int index; + private int type = KeyEvent.KEYBOARD_BUTTON; + + public CkbKeyMapSelecterDialog(@NonNull Context context, GameButtonDialog dialog, int index, String data) { + super(context); + this.mContext = context; + this.mDialog = dialog; + this.index = index; + selectedData = data; + this.setContentView(R.layout.dialog_keymap_selecter); + init(); + } + + private void init() { + this.setOnCancelListener(this); + + keyboardLayer = findViewById(R.id.dialog_keymap_selecter_keyboard_layout); + mouseLayer = findViewById(R.id.dialog_keymap_selecter_mouse_layout); + textKeyName = findViewById(R.id.dialog_keymap_selecter_text_keyname); + buttonOK = findViewById(R.id.dialog_keymap_selecter_button_ok); + buttonCancel = findViewById(R.id.dialog_keymap_selecter_button_cancel); + buttonClear = findViewById(R.id.dialog_keymap_selecter_button_clear); + + //设置监听 + //keyboardlayer + for (int a = 0; a < keyboardLayer.getChildCount(); a++) { + if (keyboardLayer.getChildAt(a) instanceof LinearLayout) { + for (int b = 0; b < ((LinearLayout) keyboardLayer.getChildAt(a)).getChildCount(); b++) { + ((LinearLayout) keyboardLayer.getChildAt(a)).getChildAt(b).setOnClickListener(this); + } + } + } + //mouselayer + for (int a = 0; a < mouseLayer.getChildCount(); a++) { + mouseLayer.getChildAt(a).setOnClickListener(this); + } + + for (View v : new View[]{buttonOK, buttonCancel, buttonClear}) { + v.setOnClickListener(this); + } + //设置属性 + textKeyName.setText(selectedData); + + } + + @Override + public void onCancel(DialogInterface dialog) { + + } + + @Override + public void onClick(View v) { + if (v instanceof QwertButton) { + this.selectedData = ((QwertButton) v).getButtonName(); + if (v.getParent() == mouseLayer) { + this.type = KeyEvent.MOUSE_BUTTON; + } else { + this.type = KeyEvent.KEYBOARD_BUTTON; + } + updateUI(); + } + if (v == buttonOK) { + mDialog.setKeyMap(index, selectedData, type); + dismiss(); + } + if (v == buttonCancel) { + cancel(); + } + if (v == buttonClear) { + this.selectedData = ""; + updateUI(); + } + } + + private void updateUI() { + if (selectedData != null) { + this.textKeyName.setText(selectedData); + } else { + this.textKeyName.setText(""); + } + } + +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/button/GameButton.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/button/GameButton.java new file mode 100644 index 00000000..0a6f135b --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/button/GameButton.java @@ -0,0 +1,667 @@ +package com.aof.mcinabox.gamecontroller.ckb.button; + +import android.annotation.SuppressLint; +import android.app.Activity; +import android.content.Context; +import android.view.MotionEvent; +import android.view.View; +import android.view.ViewGroup; +import androidx.annotation.NonNull; +import androidx.annotation.Nullable; +import com.aof.mcinabox.definitions.id.AppEvent; +import com.aof.mcinabox.gamecontroller.ckb.achieve.CkbManager; +import com.aof.mcinabox.gamecontroller.ckb.achieve.GameButtonDialog; +import com.aof.mcinabox.gamecontroller.ckb.support.CallCustomizeKeyboard; +import com.aof.mcinabox.gamecontroller.ckb.support.CkbThemeMarker; +import com.aof.mcinabox.gamecontroller.ckb.support.CkbThemeRecorder; +import com.aof.mcinabox.gamecontroller.controller.Controller; +import com.aof.mcinabox.gamecontroller.event.BaseKeyEvent; +import com.aof.utils.ColorUtils; +import com.aof.utils.DisplayUtils; + +import java.util.HashMap; + +@SuppressLint("ViewConstructor") +public class GameButton extends androidx.appcompat.widget.AppCompatButton implements View.OnTouchListener , AppEvent { + + private CallCustomizeKeyboard mCall; + private Controller mController; + private Context mContext; + private CkbManager mManager; + private Activity mActivity; + + private int buttonMode; + private int screenWidth; + private int screenHeight; + + public final static int MODE_MOVEABLE_EDITABLE = 1; + public final static int MODE_PREVIEW = 2; + public final static int MODE_GAME = 3; + + public final static int MAX_KEYMAP_SIZE = 4; + public final static int MAX_KEY_SIZE_DP = 250; + public final static int MIN_KEY_SIZE_DP = 20; + public final static int MIN_TEXT_SIZE_SP = 2; + public final static int MAX_TEXT_SIZE_SP = 20; + public final static int MIN_ALPHA_SIZE_PT = 0; + public final static int MAX_ALPHA_SIZE_PT = 100; + public final static int MIN_CORNOR_SIZE_PT = 0; + public final static int MAX_CORNOR_SIZE_PT = 100; + public final static int MIN_MOVE_DISTANCE = 10; + + public final static int DEFAULT_DESIGN_INDEX = CkbThemeMarker.DESIGN_SIGNLE_FILL; + public final static int DEFAULT_BUTTON_MODE = MODE_MOVEABLE_EDITABLE; + public final static int DEFAULT_KEY_SIZE_DP = 50; + public final static int DEFAULT_CORNOR_SIZE_PT = 20; + public final static int DEFAULT_ALPHA_SIZE_PT = 30; + public final static int DEFAULT_TEXT_SIZE_SP = 5; + public final static String DEFAULT_BACK_COLOR_HEX = "#FFFFFF"; + public final static String DEFAULT_TEXT_COLOR_HEX = "#000000"; + + private final static String TAG = "GameButton"; + private final static int KEY_TYPE = KEYBOARD_BUTTON; + private final static int POINTER_TYPE = MOUSE_POINTER; + private final static int MOUSE_TYPE = MOUSE_BUTTON; + + public final static int SHOW_ALL = 0; + public final static int SHOW_IN_GAME = 1; + public final static int SHOW_OUT_GAME = 2; + + private String[] keyMaps; //最多映射N个按键 + private int[] keyTypes; //映射的按键的类型 + private CkbThemeRecorder mRecorder; //主题记录器 + + private boolean isKeep; //自动保持 + private boolean isHide; //隐藏 + private float[] keyPos; // leftPx , topPx + private float[] keySize; // widthDp, heightDp + private int alphaSize; //透明度百分比 + private String keyName; //按键名 + private int textSize; //字体大小 + private boolean viewerFollow; //视角跟随 + private int inputMode = MARK_INPUT_MODE_ALONE; //输入模式 |捕获|独立| + private int show; + private boolean isFirstedAdded = false; //被首次创建 + + + + public GameButton( @NonNull Context context, @NonNull CallCustomizeKeyboard call , @NonNull CkbManager manager){ + this(context,call,null,manager); + } + public GameButton(Context context, @NonNull CallCustomizeKeyboard call , @Nullable Controller controller , @NonNull CkbManager manager){ + super(context); + this.mContext = context; + this.mCall = call; + this.mController = controller; + this.mManager = manager; + if(mContext instanceof Activity){ + this.mActivity = (Activity) mContext; + + }else{ + mActivity = null; + } + //初始化 + init(); + } + + @SuppressLint("ClickableViewAccessibility") + private void init(){ + //添加params + this.setLayoutParams(new ViewGroup.LayoutParams(0,0)); + //屏幕长宽 + screenWidth = mContext.getResources().getDisplayMetrics().widthPixels; + screenHeight = mContext.getResources().getDisplayMetrics().heightPixels; + //设定监听 + this.setOnTouchListener(this); + //初始化状态列表 + this.stateMap = new HashMap<>(); + //初始化默认属性 + initAttribute(); + //更新UI + updateUI(); + } + + private void initAttribute(){ + if(mController != null){ + this.inputMode = mController.getInputMode(); + } + mRecorder = new CkbThemeRecorder(); + this.setKeyName(""); + this.setButtonMode(DEFAULT_BUTTON_MODE); + this.setTextSize(DEFAULT_TEXT_SIZE_SP); + + String[] strs = new String[MAX_KEYMAP_SIZE]; + for(int i =0 ; i < MAX_KEYMAP_SIZE ; i++){ + strs[i] = ""; + } + this.setKeyMaps(strs); + this.setKeyTypes(new int[]{KEY_TYPE,KEY_TYPE,KEY_TYPE,KEY_TYPE}); + this.setShow(SHOW_ALL); + this.setKeep(false); + this.setViewerFollow(false); + this.setBackColor(DEFAULT_BACK_COLOR_HEX); + this.setTextColor(DEFAULT_TEXT_COLOR_HEX); + this.setKeyPos(0,0); + this.setKeySize(DEFAULT_KEY_SIZE_DP,DEFAULT_KEY_SIZE_DP); + this.setCornerRadius(DEFAULT_CORNOR_SIZE_PT); + this.setAlphaSize(DEFAULT_ALPHA_SIZE_PT); + this.setDesignIndex(DEFAULT_DESIGN_INDEX); + + } + + public boolean setKeyMaps(String[] map){ + if(map.length == MAX_KEYMAP_SIZE){ + String[] tmp = new String[MAX_KEYMAP_SIZE]; + System.arraycopy(map, 0, tmp, 0, MAX_KEYMAP_SIZE); + this.keyMaps = tmp; + return true; + }else{ + return false; + } + } + + public boolean setKeyTypes(int[] types){ + if(types.length == MAX_KEYMAP_SIZE){ + int[] tmp = new int[MAX_KEYMAP_SIZE]; + System.arraycopy(types,0,tmp,0,MAX_KEYMAP_SIZE); + this.keyTypes = tmp; + return true; + }else{ + return false; + } + } + + public String[] setKeyMaps(String keyName, int index){ + if(index > MAX_KEYMAP_SIZE || index < 0){ + return null; + }else{ + keyMaps[index] = keyName; + return keyMaps; + } + } + + public GameButton setButtonMode(int mode){ + if(mode == MODE_GAME || mode == MODE_MOVEABLE_EDITABLE || mode == MODE_PREVIEW) { + this.buttonMode = mode; + updateUI(); + } + return this; + } + + public void setKeep(boolean isKeep){ + this.isKeep = isKeep; + } + + public void setHide(boolean isHide){ + this.isHide = isHide; + //UI刷新 + updateUI(); + } + + public boolean setBackColor(String colorHex){ + int color = ColorUtils.hex2Int(colorHex); + if( color != 0){ + this.mRecorder.setColors(0,color); + updateUI(); + return true; + } + return false; + } + + public boolean setTextColor(String colorHex){ + int color = ColorUtils.hex2Int(colorHex); + if( color != 0 ){ + this.setTextColor(color); + this.mRecorder.setTextColor(color); + return true; + } + return false; + } + + public float[] setKeyPos(float x,float y){ + + int viewWidth = this.getLayoutParams().width; + int viewHeight = this.getLayoutParams().height; + + if((int)x > screenWidth - viewWidth){ + x = screenWidth - viewWidth; + } + if((int)x < 0){ + x = 0; + } + if((int)y > screenHeight - viewHeight){ + y = screenHeight - viewHeight; + } + if((int)y < 0){ + y = 0; + } + this.setX(x); + this.setY(y); + + this.keyPos = new float[]{x,y}; + + return this.keyPos; //x ,y + } + + //按键大小用Dp表示 + public boolean setKeySize(float widthDp, float heightDp){ + int widthPx = DisplayUtils.getPxFromDp(mContext,widthDp); + int heightPx = DisplayUtils.getPxFromDp(mContext,heightDp); + if( (widthDp <= MAX_KEY_SIZE_DP && heightDp <= MAX_KEY_SIZE_DP) && (widthDp >= MIN_KEY_SIZE_DP && heightDp >= MIN_KEY_SIZE_DP) ){ + ViewGroup.LayoutParams params = this.getLayoutParams(); + params.width = widthPx; + params.height = heightPx; + this.requestLayout(); + this.keySize = new float[]{widthDp,heightDp}; + return true; + }else{ + return false; + } + } + + public boolean setCornerRadius(int radius){ + if(radius < MIN_CORNOR_SIZE_PT || radius > MAX_CORNOR_SIZE_PT){ + return false; + }else{ + this.mRecorder.setCornerRadiusPt(radius); + updateUI(); + return true; + } + } + + public boolean setAlphaSize(int alphaPt){ + if( alphaPt < MIN_ALPHA_SIZE_PT || alphaPt > MAX_ALPHA_SIZE_PT ) { + return false; + }else{ + this.setAlpha(alphaPt * 0.01f); + this.alphaSize = alphaPt; + return true; + } + } + + public boolean setKeyName(String str){ + if(str != null){ + this.setText(str); + this.keyName = new String(str); + return true; + }else{ + return false; + } + } + + public boolean setTextSize(int spValue){ + if( spValue >= MIN_TEXT_SIZE_SP && spValue <= MAX_TEXT_SIZE_SP ){ + this.setTextSize((float) DisplayUtils.getPxFromSp(mContext,spValue)); + this.textSize = spValue; + return true; + }else{ + return false; + } + } + + public GameButton setShow(int s){ + this.show = s; + updateUI(); + return this; + } + + public GameButton setDesignIndex(int index){ + this.mRecorder.setDesignIndex(index); + updateUI(); + return this; + } + + public String[] getColorHexs(){ + int[] c = mRecorder.getColors(); + String[] tmp = new String[CkbThemeRecorder.COLOR_INDEX_LENGTH]; + int a; + for(a = 0; a < c.length ; a++){ + tmp[a] = ColorUtils.int2Hex(c[a]); + } + return tmp; + } + + public void setInputMode(int mode){ + this.inputMode = mode; + //执行UI刷新 + updateUI(); + } + + public void setViewerFollow(boolean follow){ + this.viewerFollow = follow; + } + + public GameButton getNewButtonLikeThis(){ + GameButton g = new GameButton(mContext,mCall,mController,mManager); + g.setButtonMode(this.buttonMode); + g.setKeyName(this.keyName); + g.setKeySize(this.keySize[0],this.keySize[1]); + g.setKeyPos(this.keyPos[0],this.keyPos[1]); + g.setKeyMaps(this.keyMaps); + g.setKeyTypes(this.keyTypes); + g.setBackColor(ColorUtils.int2Hex(mRecorder.getColor(0))); + g.setTextColor(ColorUtils.int2Hex(mRecorder.getTextColor())); + g.setAlphaSize(this.alphaSize); + g.setCornerRadius(this.mRecorder.getCornerRadiusPt()); + g.setTextSize(this.textSize); + g.setKeep(this.isKeep); + g.setHide(this.isHide); + g.setShow(this.show); + g.setViewerFollow(this.viewerFollow); + g.setInputMode(this.inputMode); + g.setDesignIndex(this.mRecorder.getDesignIndex()); + return g; + } + + private HashMap stateMap; + private void sendKey(String keyName, boolean pressed, int type){ + + //该算法可以保证CustomizeKeyboard不会造成clientinput的setkey()方法堵塞; + if(pressed){ + + if( stateMap.containsKey(keyName) && stateMap.get(keyName) ){ + return; + } + if( ! stateMap.containsKey(keyName) ){ + stateMap.put(keyName,pressed); + } + if( stateMap.containsKey(keyName) && !stateMap.get(keyName) ){ + stateMap.remove(keyName); + stateMap.put(keyName,pressed); + } + mController.sendKey( new BaseKeyEvent(TAG,keyName,pressed,type,null) ); + + }else{ + + if( stateMap.containsKey(keyName) && stateMap.get(keyName) ){ + stateMap.remove(keyName); + stateMap.put(keyName,pressed); + mController.sendKey( new BaseKeyEvent(TAG,keyName,pressed,type,null) ); + } + + } + + } + + public GameButton setFirstAdded(){ + this.isFirstedAdded = true; + return this; + } + + public GameButton unsetFirstAdded(){ + this.isFirstedAdded = false; + return this; + } + + private boolean isBeingPressed = false; + private int initialX = 0; + private int initialY = 0; + private int baseX = 0; + private int baseY = 0; + private void inputPointerEvent(MotionEvent e){ + switch (e.getAction()){ + case MotionEvent.ACTION_DOWN: + initialX = (int)e.getX(); + initialY = (int)e.getY(); + baseX = mController.getPointer()[0]; + baseY = mController.getPointer()[1]; + break; + case MotionEvent.ACTION_MOVE: + int incrementX = (int) (e.getX() - initialX); + int incrementY = (int) (e.getY() - initialY); + int resultX = baseX + incrementX; + int resultY = baseY + incrementY; + mController.sendKey(new BaseKeyEvent(TAG,null,false,POINTER_TYPE,new int[]{resultX,resultY})); + break; + case MotionEvent.ACTION_UP: + break; + + } + } + + private void inputKeyEvent(MotionEvent e){ + switch (e.getAction()){ + case MotionEvent.ACTION_DOWN: + if(isKeep){ + if(!isBeingPressed){ + for(int a = 0; a < MAX_KEYMAP_SIZE ; a++){ + sendKey(keyMaps[a],true,keyTypes[a]); + } + } + }else{ + for(int a = 0; a < MAX_KEYMAP_SIZE ; a++){ + sendKey(keyMaps[a],true,keyTypes[a]); + } + } + break; + case MotionEvent.ACTION_MOVE: + break; + case MotionEvent.ACTION_UP: + + if(isKeep){ + if(isBeingPressed){ + for(int a = 0; a < MAX_KEYMAP_SIZE ; a++){ + sendKey(keyMaps[a],false,keyTypes[a]); + } + isBeingPressed = false; + }else{ + isBeingPressed = true; + } + }else{ + for(int a = 0; a < MAX_KEYMAP_SIZE ; a++){ + sendKey(keyMaps[a],false,keyTypes[a]); + } + } + break; + default: + break; + } + } + + private boolean hasDragged = false; + private int touchPosX; + private int touchPosY; + private void editView(MotionEvent e){ + switch(e.getAction()){ + case MotionEvent.ACTION_DOWN: + touchPosX = (int)e.getRawX(); + touchPosY = (int)e.getRawY(); + break; + case MotionEvent.ACTION_MOVE: + if(hasDragged){ + int tmpTouchPosX = (int)e.getRawX(); + int tmpTouchPosY = (int)e.getRawY(); + int lastPosX = (int)getKeyPos()[0]; + int lastPosY = (int)getKeyPos()[1]; + int dx = tmpTouchPosX - touchPosX; + int dy = tmpTouchPosY - touchPosY; + int viewWidth = getLayoutParams().width; + int viewHeight = getLayoutParams().height; + int posLeft = dx + lastPosX; + int posTop = dy + lastPosY; + int posRight = posLeft + viewWidth; + int posBottom = posTop + viewHeight; + int resultX = posLeft; + int resultY = posTop; + + //判断边界 + if(posLeft < 0){ + resultX = 0; + } + if(posTop < 0){ + resultY = 0; + } + if(posRight > screenWidth){ + resultX = screenWidth - viewWidth; + } + if(posBottom > screenHeight){ + resultY = screenHeight - viewHeight; + } + touchPosX = tmpTouchPosX; + touchPosY = tmpTouchPosY; + setKeyPos(resultX,resultY); + }else{ + if(Math.abs((int)e.getRawX() - touchPosX) >= MIN_MOVE_DISTANCE && Math.abs((int)e.getRawY() - touchPosY) >= MIN_MOVE_DISTANCE){ + hasDragged = true; + } + } + break; + case MotionEvent.ACTION_UP: + if(!hasDragged){ + new GameButtonDialog(mContext,this,mManager).show(); + } + hasDragged = false; + break; + default: + break; + } + } + + public void addSelfToParent(){ + mManager.addGameButton(this); + } + + public void removeSelfFromParent(){ + mManager.removeGameButton(this); + } + + @Override + public boolean onTouch(View v, MotionEvent event) { + if(v == this){ + switch(this.buttonMode){ + case MODE_GAME: + switch(this.inputMode){ + case MARK_INPUT_MODE_ALONE: + break; + case MARK_INPUT_MODE_CATCH: + if(viewerFollow){ + inputPointerEvent(event); + } + break; + } + inputKeyEvent(event); + break; + case MODE_PREVIEW: + case MODE_MOVEABLE_EDITABLE: + editView(event); + break; + } + return true; + } + + return false; + } + + public void updateUI(){ + + //判断按键的显示/隐藏 + switch(this.buttonMode){ + case MODE_GAME: + if(!isHide){ + + switch (inputMode){ + case MARK_INPUT_MODE_CATCH: + if(show == SHOW_ALL || show == SHOW_IN_GAME){ + this.setVisibility(VISIBLE); + }else{ + this.setVisibility(GONE); + } + break; + case MARK_INPUT_MODE_ALONE: + if(show == SHOW_ALL || show == SHOW_OUT_GAME){ + this.setVisibility(VISIBLE); + }else{ + this.setVisibility(GONE); + } + break; + } + }else{ + this.setVisibility(GONE); + } + break; + case MODE_PREVIEW: + case MODE_MOVEABLE_EDITABLE: + if(this.getVisibility() == GONE){ + this.setVisibility(VISIBLE); + } + break; + } + //刷新背景 + this.setBackground(CkbThemeMarker.getDesign(mRecorder)); + } + + //getter + + public int getButtonMode() { + return buttonMode; + } + + public String[] getKeyMaps() { + return keyMaps; + } + + public boolean isKeep() { + return isKeep; + } + + public String getBackColorHex() { + return ColorUtils.int2Hex(mRecorder.getColor(0)); + } + + public String getTextColorHex() { + return ColorUtils.int2Hex(mRecorder.getTextColor()); + } + + public float[] getKeyPos() { + return keyPos; + } + + public float[] getKeySize() { + return keySize; + } + + public int getTextProgress(){ + return textSize; + } + + public int getCornerRadius() { + return mRecorder.getCornerRadiusPt(); + } + + public int getAlphaSize() { + return alphaSize; + } + + public String getKeyName(){ + return keyName; + } + + public boolean isHide(){ + return isHide; + } + + public boolean isFirstAdded(){ + return isFirstedAdded; + } + + public boolean isViewerFollow(){ + return viewerFollow; + } + + public int getDesignIndex(){ + return mRecorder.getDesignIndex(); + } + + public CkbThemeRecorder getThemeRecorder(){ + return this.mRecorder; + } + + public int[] getKeyTypes(){ + return this.keyTypes; + } + + public int getShow(){ + return this.show; + } + +} \ No newline at end of file diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CallCustomizeKeyboard.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CallCustomizeKeyboard.java new file mode 100644 index 00000000..2c0312b8 --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CallCustomizeKeyboard.java @@ -0,0 +1,7 @@ +package com.aof.mcinabox.gamecontroller.ckb.support; + +import android.view.View; + +public interface CallCustomizeKeyboard { + void addView(View view); +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeMarker.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeMarker.java new file mode 100644 index 00000000..511d2e52 --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeMarker.java @@ -0,0 +1,124 @@ +package com.aof.mcinabox.gamecontroller.ckb.support; + +import android.graphics.Color; +import android.graphics.Paint; +import android.graphics.drawable.Drawable; +import android.graphics.drawable.GradientDrawable; +import android.graphics.drawable.LayerDrawable; +import android.graphics.drawable.ShapeDrawable; +import android.graphics.drawable.shapes.RoundRectShape; +import android.util.Log; + +public class CkbThemeMarker { + + private final static String TAG = "CkbThemeMaker"; + public final static int DESIGN_SIGNLE_FILL = 1; //单层纯色背景 + public final static int DESIGN_SIGNLE_RING = 2; //单边框空心背景 + public final static int DESIGN_DOUBLE_RING = 3; //双边框空心背景 + public final static int DESIGN_BLACK_SHADOW = 4; //阴影背景 + + public final static String[] DESIGNS = new String[]{"1","2","3","4"}; + + public static LayerDrawable getDesign(final CkbThemeRecorder recorder){ + + switch(recorder.getDesignIndex()){ + case DESIGN_SIGNLE_FILL: + return getDesign_signle_fill(recorder); + case DESIGN_SIGNLE_RING: + return getDesign_signle_ring(recorder); + case DESIGN_DOUBLE_RING: + return getDesign_double_ring(recorder); + case DESIGN_BLACK_SHADOW: + return getDesign_black_shadow(recorder); + default: + return null; + } + } + + private static LayerDrawable getDesign_signle_fill(CkbThemeRecorder recorder){ + int radiusSize = recorder.getCornerRadius(); + int mainColor = recorder.getColor(0); + + float[] outerR = new float[]{radiusSize,radiusSize,radiusSize,radiusSize,radiusSize,radiusSize,radiusSize,radiusSize}; + RoundRectShape rectShape = new RoundRectShape(outerR,null,null); + ShapeDrawable shapeDrawable = new ShapeDrawable(); + shapeDrawable.setShape(rectShape); + shapeDrawable.getPaint().setStyle(Paint.Style.FILL); + shapeDrawable.getPaint().setColor(mainColor); + + Drawable[] layers = new Drawable[]{shapeDrawable}; + LayerDrawable layerDrawable = new LayerDrawable(layers); + + return layerDrawable; + } + + private static LayerDrawable getDesign_signle_ring(CkbThemeRecorder recorder){ + int strokeWidth = 5; + int drawableSize = 50; + int radius = recorder.getCornerRadius(); + int mainColor = Color.WHITE; + + GradientDrawable drawable1 = new GradientDrawable(); + drawable1.setShape(GradientDrawable.RECTANGLE); + drawable1.setStroke(strokeWidth, mainColor); + drawable1.setCornerRadius(radius); + drawable1.setSize(drawableSize,drawableSize); + + Drawable[] layers = new Drawable[]{drawable1}; + LayerDrawable mainDrawable = new LayerDrawable(layers); + + return mainDrawable; + + } + + private static LayerDrawable getDesign_double_ring(CkbThemeRecorder recorder){ + int strokeWidth_1 = 5; + int strokeWidth_2 = 5; + int mainColor = Color.WHITE; + int drawableSize = 50; + int radius = recorder.getCornerRadius(); + + GradientDrawable drawable1 = new GradientDrawable(); + drawable1.setShape(GradientDrawable.RECTANGLE); + drawable1.setStroke(strokeWidth_1,mainColor); + drawable1.setCornerRadius(radius); + drawable1.setSize(drawableSize,drawableSize); + + GradientDrawable drawable2 = new GradientDrawable(); + drawable2.setShape(GradientDrawable.RECTANGLE); + drawable2.setStroke(strokeWidth_2,mainColor); + drawable2.setCornerRadius(radius); + drawable2.setSize(drawableSize,drawableSize); + + Drawable[] layers = new Drawable[]{drawable1,drawable2}; + LayerDrawable mainDrawable = new LayerDrawable(layers); + mainDrawable.setLayerInset(1,strokeWidth_1 * 2, strokeWidth_1 * 2, strokeWidth_1 * 2, strokeWidth_1 * 2); + + return mainDrawable; + } + + private static LayerDrawable getDesign_black_shadow(CkbThemeRecorder recorder){ + int storkeWidth = 5; + int mainColor = Color.WHITE; + int drawableSize =50; + int radius = recorder.getCornerRadius(); + + GradientDrawable drawable1 = new GradientDrawable(); + drawable1.setShape(GradientDrawable.RECTANGLE); + drawable1.setStroke(storkeWidth, mainColor); + drawable1.setCornerRadius(radius); + drawable1.setSize(drawableSize, drawableSize); + + GradientDrawable drawable2 = new GradientDrawable(); + drawable2.setShape(GradientDrawable.RECTANGLE); + drawable2.setColor(Color.BLACK); + drawable2.setCornerRadius(radius); + drawable2.setSize(drawableSize,drawableSize); + + Drawable[] layers = new Drawable[]{drawable2,drawable1}; + LayerDrawable mainDrawable = new LayerDrawable(layers); + mainDrawable.setLayerInset(1,1,1,1,1); + + return mainDrawable; + } +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeRecorder.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeRecorder.java new file mode 100644 index 00000000..87e87b14 --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/CkbThemeRecorder.java @@ -0,0 +1,49 @@ +package com.aof.mcinabox.gamecontroller.ckb.support; + +public class CkbThemeRecorder { + public final static int COLOR_INDEX_LENGTH = 3; + + private int[] themeColors = new int[COLOR_INDEX_LENGTH]; + private int cornerRadiusPt; + private int designIndex; + private int textColor; + + public CkbThemeRecorder setColors(int index, int color){ + if(index >= 0 && index < COLOR_INDEX_LENGTH){ + this.themeColors[index] = color; + } + return this; + } + public CkbThemeRecorder setCornerRadiusPt(int radius){ + this.cornerRadiusPt = radius; + return this; + } + public int getCornerRadius(){ + return (int)(cornerRadiusPt * 0.01f * 180); + } + public int getCornerRadiusPt(){ + return this.cornerRadiusPt; + } + public void setDesignIndex(int index){ + this.designIndex = index; + } + public void setTextColor(int color){ + this.textColor = color; + } + public int getColor(int index){ + if(index >= 0 && index < COLOR_INDEX_LENGTH){ + return themeColors[index]; + }else{ + return 0; + } + } + public int[] getColors(){ + return themeColors; + } + public int getDesignIndex(){ + return designIndex; + } + public int getTextColor(){ + return textColor; + } +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonArray.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonArray.java new file mode 100644 index 00000000..095de51d --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonArray.java @@ -0,0 +1,7 @@ +package com.aof.mcinabox.gamecontroller.ckb.support; + +import java.util.ArrayList; + +public class GameButtonArray extends ArrayList { + +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonRecorder.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonRecorder.java new file mode 100644 index 00000000..3f8f8cb7 --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/GameButtonRecorder.java @@ -0,0 +1,65 @@ +package com.aof.mcinabox.gamecontroller.ckb.support; + +import android.content.Context; +import com.aof.mcinabox.gamecontroller.ckb.achieve.CkbManager; +import com.aof.mcinabox.gamecontroller.ckb.button.GameButton; +import com.aof.mcinabox.gamecontroller.controller.Controller; +import com.aof.utils.ColorUtils; + +public class GameButtonRecorder { + public String[] keyMaps = new String[GameButton.MAX_KEYMAP_SIZE]; + public int[] keyTypes = new int[GameButton.MAX_KEYMAP_SIZE]; + public int show; + public int designIndex; + public int cornerRadius; + public String textColor; + public String[] themeColors = new String[CkbThemeRecorder.COLOR_INDEX_LENGTH]; + public boolean isKeep; + public boolean isHide; + public float[] keyPos = new float[2]; + public float[] keySize = new float[2]; + public int alphaSize; + public String keyName; + public int textSize; + public boolean isViewerFollow; + + public void recordData(GameButton gb){ + System.arraycopy(gb.getKeyMaps(),0,this.keyMaps,0,GameButton.MAX_KEYMAP_SIZE); + System.arraycopy(gb.getKeyTypes(),0,this.keyTypes,0,GameButton.MAX_KEYMAP_SIZE); + this.designIndex = gb.getDesignIndex(); + this.cornerRadius = gb.getCornerRadius(); + this.textColor = new String(gb.getTextColorHex()); + System.arraycopy(gb.getColorHexs(),0,this.themeColors,0,CkbThemeRecorder.COLOR_INDEX_LENGTH); + this.isKeep = gb.isKeep(); + this.isHide = gb.isHide(); + System.arraycopy(gb.getKeyPos(),0,this.keyPos,0, 2); + System.arraycopy(gb.getKeySize(),0,this.keySize,0, 2); + this.alphaSize = gb.getAlphaSize(); + this.keyName = new String(gb.getKeyName()); + this.isViewerFollow = gb.isViewerFollow(); + this.show = gb.getShow(); + this.textSize = gb.getTextProgress(); + } + + public GameButton recoverData(Context context, CallCustomizeKeyboard call, Controller controller, CkbManager manager){ + GameButton gb = new GameButton(context,call,controller,manager); + gb.setKeyMaps(this.keyMaps); + gb.setKeyTypes(this.keyTypes); + gb.setDesignIndex(this.designIndex); + gb.setCornerRadius(this.cornerRadius); + gb.setTextColor(this.textColor); + for(int a = 0; a < CkbThemeRecorder.COLOR_INDEX_LENGTH ; a++){ + gb.getThemeRecorder().setColors(a, ColorUtils.hex2Int(this.themeColors[a])); + } + gb.setKeep(this.isKeep); + gb.setHide(this.isHide); + gb.setKeyPos(this.keyPos[0],this.keyPos[1]); + gb.setKeySize(this.keySize[0],this.keySize[1]); + gb.setAlphaSize(this.alphaSize); + gb.setKeyName(this.keyName); + gb.setTextSize(this.textSize); + gb.setViewerFollow(this.isViewerFollow); + gb.setShow(this.show); + return gb; + } +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/KeyboardRecorder.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/KeyboardRecorder.java new file mode 100644 index 00000000..affebde0 --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/KeyboardRecorder.java @@ -0,0 +1,22 @@ +package com.aof.mcinabox.gamecontroller.ckb.support; + +public class KeyboardRecorder { + private int screenWidth; + private int screenHeight; + private GameButtonRecorder[] games; + + public void setScreenArgs(int sw, int sh){ + this.screenWidth = sw; + this.screenHeight = sh; + } + + public void setRecorderDatas(GameButtonRecorder[] data){ + this.games = data; + } + public GameButtonRecorder[] getRecorderDatas(){ + return games; + } + public int[] getScreenData(){ + return new int[]{screenWidth,screenHeight}; + } +} diff --git a/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/QwertButton.java b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/QwertButton.java new file mode 100644 index 00000000..3a87c087 --- /dev/null +++ b/ckb/src/main/java/com/aof/mcinabox/gamecontroller/ckb/support/QwertButton.java @@ -0,0 +1,22 @@ +package com.aof.mcinabox.gamecontroller.ckb.support; + +import android.content.Context; +import android.content.res.TypedArray; +import android.util.AttributeSet; +import androidx.annotation.Nullable; + +import com.aof.mcinabox.gamecontroller.ckb.R; + +public class QwertButton extends androidx.appcompat.widget.AppCompatButton { + + public QwertButton(Context context, @Nullable AttributeSet attrs){ + super(context,attrs); + TypedArray array = context.obtainStyledAttributes(attrs, R.styleable.SelecterButton); + setButtonName(array.getString(R.styleable.SelecterButton_button_name)); + array.recycle(); + } + private String button_name; + + public String getButtonName() { return button_name; } + public void setButtonName(String buttonName) { button_name = buttonName; } +} diff --git a/ckb/src/main/res/drawable/selecter_button.xml b/ckb/src/main/res/drawable/selecter_button.xml new file mode 100644 index 00000000..53d8246b --- /dev/null +++ b/ckb/src/main/res/drawable/selecter_button.xml @@ -0,0 +1,5 @@ + + + + + diff --git a/sharedmodule/src/main/res/drawable/control_button_normal.xml b/ckb/src/main/res/drawable/selecter_button_normal.xml similarity index 100% rename from sharedmodule/src/main/res/drawable/control_button_normal.xml rename to ckb/src/main/res/drawable/selecter_button_normal.xml diff --git a/sharedmodule/src/main/res/drawable/control_button_pressed.xml b/ckb/src/main/res/drawable/selecter_button_pressed.xml similarity index 100% rename from sharedmodule/src/main/res/drawable/control_button_pressed.xml rename to ckb/src/main/res/drawable/selecter_button_pressed.xml diff --git a/ckb/src/main/res/layout/activity_ckbe.xml b/ckb/src/main/res/layout/activity_ckbe.xml new file mode 100644 index 00000000..42cfbe31 --- /dev/null +++ b/ckb/src/main/res/layout/activity_ckbe.xml @@ -0,0 +1,51 @@ + + + + + + + + + + + + + + + + + + + diff --git a/ckb/src/main/res/layout/dialog_customize_keyboard_config.xml b/ckb/src/main/res/layout/dialog_customize_keyboard_config.xml new file mode 100644 index 00000000..2890af95 --- /dev/null +++ b/ckb/src/main/res/layout/dialog_customize_keyboard_config.xml @@ -0,0 +1,273 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/sharedmodule/src/main/res/layout/virtual_touchpad.xml b/gamecontroller/src/main/res/layout/virtual_touchpad.xml similarity index 71% rename from sharedmodule/src/main/res/layout/virtual_touchpad.xml rename to gamecontroller/src/main/res/layout/virtual_touchpad.xml index 6f7bf653..773902be 100644 --- a/sharedmodule/src/main/res/layout/virtual_touchpad.xml +++ b/gamecontroller/src/main/res/layout/virtual_touchpad.xml @@ -11,4 +11,10 @@ android:layout_height="fill_parent" android:alpha="0.0"/> + + \ No newline at end of file diff --git a/sharedmodule/src/main/res/values/dimensions.xml b/gamecontroller/src/main/res/values-zh/strings.xml similarity index 58% rename from sharedmodule/src/main/res/values/dimensions.xml rename to gamecontroller/src/main/res/values-zh/strings.xml index acfc6a13..0d2c4cc4 100644 --- a/sharedmodule/src/main/res/values/dimensions.xml +++ b/gamecontroller/src/main/res/values-zh/strings.xml @@ -1,5 +1,4 @@ - 8sp \ No newline at end of file diff --git a/gamecontroller/src/main/res/values/attrs.xml b/gamecontroller/src/main/res/values/attrs.xml new file mode 100644 index 00000000..dc734818 --- /dev/null +++ b/gamecontroller/src/main/res/values/attrs.xml @@ -0,0 +1,19 @@ + + + + + + + + + + + + + + + + + + + diff --git a/gamecontroller/src/main/res/values/dimensions.xml b/gamecontroller/src/main/res/values/dimensions.xml new file mode 100644 index 00000000..ba234e07 --- /dev/null +++ b/gamecontroller/src/main/res/values/dimensions.xml @@ -0,0 +1,4 @@ + + + 6sp + \ No newline at end of file diff --git a/gamecontroller/src/main/res/values/strings.xml b/gamecontroller/src/main/res/values/strings.xml new file mode 100644 index 00000000..85420055 --- /dev/null +++ b/gamecontroller/src/main/res/values/strings.xml @@ -0,0 +1,2 @@ + + diff --git a/gamecontroller/src/main/res/values/styles.xml b/gamecontroller/src/main/res/values/styles.xml new file mode 100644 index 00000000..c6aef5c9 --- /dev/null +++ b/gamecontroller/src/main/res/values/styles.xml @@ -0,0 +1,9 @@ + + + + + \ No newline at end of file diff --git a/gamecontroller/src/test/java/com/aof/mcinabox/gamecontroller/ExampleUnitTest.java b/gamecontroller/src/test/java/com/aof/mcinabox/gamecontroller/ExampleUnitTest.java new file mode 100644 index 00000000..d2f5ae5a --- /dev/null +++ b/gamecontroller/src/test/java/com/aof/mcinabox/gamecontroller/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package com.aof.mcinabox.gamecontroller; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/gradle/wrapper/gradle-wrapper.properties b/gradle/wrapper/gradle-wrapper.properties index 81eb4d62..326a44ff 100644 --- a/gradle/wrapper/gradle-wrapper.properties +++ b/gradle/wrapper/gradle-wrapper.properties @@ -1,6 +1,6 @@ -#Thu Jan 30 14:19:22 CST 2020 +#Mon Aug 10 14:46:51 CST 2020 distributionBase=GRADLE_USER_HOME distributionPath=wrapper/dists zipStoreBase=GRADLE_USER_HOME zipStorePath=wrapper/dists -distributionUrl=https\://services.gradle.org/distributions/gradle-5.4.1-all.zip +distributionUrl=https\://services.gradle.org/distributions/gradle-6.1.1-all.zip diff --git a/jndcrash/.gitignore b/jndcrash/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/jndcrash/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/jndcrash/build.gradle b/jndcrash/build.gradle new file mode 100644 index 00000000..bf3e899b --- /dev/null +++ b/jndcrash/build.gradle @@ -0,0 +1,29 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + buildToolsVersion '30.0.2' + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.2.0' + +} \ No newline at end of file diff --git a/jndcrash/consumer-rules.pro b/jndcrash/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/jndcrash/proguard-rules.pro b/jndcrash/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/jndcrash/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/jndcrash/src/androidTest/java/ru/ivanarh/jndcrash/ExampleInstrumentedTest.java b/jndcrash/src/androidTest/java/ru/ivanarh/jndcrash/ExampleInstrumentedTest.java new file mode 100644 index 00000000..3977f4fa --- /dev/null +++ b/jndcrash/src/androidTest/java/ru/ivanarh/jndcrash/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package ru.ivanarh.jndcrash; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("ru.ivanarh.jndcrash.test", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/jndcrash/src/main/AndroidManifest.xml b/jndcrash/src/main/AndroidManifest.xml new file mode 100644 index 00000000..8dce8fd2 --- /dev/null +++ b/jndcrash/src/main/AndroidManifest.xml @@ -0,0 +1,5 @@ + + + / + \ No newline at end of file diff --git a/sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrash.java b/jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrash.java similarity index 100% rename from sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrash.java rename to jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrash.java diff --git a/sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashError.java b/jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashError.java similarity index 100% rename from sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashError.java rename to jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashError.java diff --git a/sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashService.java b/jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashService.java similarity index 100% rename from sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashService.java rename to jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashService.java diff --git a/sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashUnwinder.java b/jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashUnwinder.java similarity index 100% rename from sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashUnwinder.java rename to jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashUnwinder.java diff --git a/sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashUtils.java b/jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashUtils.java similarity index 100% rename from sharedmodule/src/main/java/ru/ivanarh/jndcrash/NDCrashUtils.java rename to jndcrash/src/main/java/ru/ivanarh/jndcrash/NDCrashUtils.java diff --git a/jndcrash/src/test/java/ru/ivanarh/jndcrash/ExampleUnitTest.java b/jndcrash/src/test/java/ru/ivanarh/jndcrash/ExampleUnitTest.java new file mode 100644 index 00000000..fb3ac9e9 --- /dev/null +++ b/jndcrash/src/test/java/ru/ivanarh/jndcrash/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package ru.ivanarh.jndcrash; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/lwjgl/.gitignore b/lwjgl/.gitignore new file mode 100644 index 00000000..42afabfd --- /dev/null +++ b/lwjgl/.gitignore @@ -0,0 +1 @@ +/build \ No newline at end of file diff --git a/lwjgl/build.gradle b/lwjgl/build.gradle new file mode 100644 index 00000000..bc0ec72b --- /dev/null +++ b/lwjgl/build.gradle @@ -0,0 +1,32 @@ +apply plugin: 'com.android.library' + +android { + compileSdkVersion 28 + buildToolsVersion '30.0.2' + + defaultConfig { + minSdkVersion 21 + targetSdkVersion 21 + versionCode 1 + versionName "1.0" + + testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" + consumerProguardFiles "consumer-rules.pro" + } + + buildTypes { + release { + minifyEnabled false + proguardFiles getDefaultProguardFile('proguard-android-optimize.txt'), 'proguard-rules.pro' + } + } +} + +dependencies { + implementation fileTree(dir: "libs", include: ["*.jar"]) + implementation 'androidx.appcompat:appcompat:1.2.0' + testImplementation 'junit:junit:4.12' + androidTestImplementation 'androidx.test.ext:junit:1.1.1' + androidTestImplementation 'androidx.test.espresso:espresso-core:3.2.0' + +} \ No newline at end of file diff --git a/lwjgl/consumer-rules.pro b/lwjgl/consumer-rules.pro new file mode 100644 index 00000000..e69de29b diff --git a/lwjgl/proguard-rules.pro b/lwjgl/proguard-rules.pro new file mode 100644 index 00000000..481bb434 --- /dev/null +++ b/lwjgl/proguard-rules.pro @@ -0,0 +1,21 @@ +# Add project specific ProGuard rules here. +# You can control the set of applied configuration files using the +# proguardFiles setting in build.gradle. +# +# For more details, see +# http://developer.android.com/guide/developing/tools/proguard.html + +# If your project uses WebView with JS, uncomment the following +# and specify the fully qualified class name to the JavaScript interface +# class: +#-keepclassmembers class fqcn.of.javascript.interface.for.webview { +# public *; +#} + +# Uncomment this to preserve the line number information for +# debugging stack traces. +#-keepattributes SourceFile,LineNumberTable + +# If you keep the line number information, uncomment this to +# hide the original source file name. +#-renamesourcefileattribute SourceFile \ No newline at end of file diff --git a/lwjgl/src/androidTest/java/org/lwjgl/ExampleInstrumentedTest.java b/lwjgl/src/androidTest/java/org/lwjgl/ExampleInstrumentedTest.java new file mode 100644 index 00000000..8eb88e5a --- /dev/null +++ b/lwjgl/src/androidTest/java/org/lwjgl/ExampleInstrumentedTest.java @@ -0,0 +1,26 @@ +package org.lwjgl; + +import android.content.Context; + +import androidx.test.platform.app.InstrumentationRegistry; +import androidx.test.ext.junit.runners.AndroidJUnit4; + +import org.junit.Test; +import org.junit.runner.RunWith; + +import static org.junit.Assert.*; + +/** + * Instrumented test, which will execute on an Android device. + * + * @see Testing documentation + */ +@RunWith(AndroidJUnit4.class) +public class ExampleInstrumentedTest { + @Test + public void useAppContext() { + // Context of the app under test. + Context appContext = InstrumentationRegistry.getInstrumentation().getTargetContext(); + assertEquals("org.lwjgl.test", appContext.getPackageName()); + } +} \ No newline at end of file diff --git a/sharedmodule/src/main/AndroidManifest.xml b/lwjgl/src/main/AndroidManifest.xml similarity index 61% rename from sharedmodule/src/main/AndroidManifest.xml rename to lwjgl/src/main/AndroidManifest.xml index 221e2028..b6194f4e 100644 --- a/sharedmodule/src/main/AndroidManifest.xml +++ b/lwjgl/src/main/AndroidManifest.xml @@ -1,2 +1,5 @@ + package="org.lwjgl"> + + / + \ No newline at end of file diff --git a/sharedmodule/src/main/java/org/lwjgl/glfw/GLFW.java b/lwjgl/src/main/java/org/lwjgl/glfw/GLFW.java similarity index 100% rename from sharedmodule/src/main/java/org/lwjgl/glfw/GLFW.java rename to lwjgl/src/main/java/org/lwjgl/glfw/GLFW.java diff --git a/sharedmodule/src/main/java/org/lwjgl/input/Keyboard.java b/lwjgl/src/main/java/org/lwjgl/input/Keyboard.java similarity index 100% rename from sharedmodule/src/main/java/org/lwjgl/input/Keyboard.java rename to lwjgl/src/main/java/org/lwjgl/input/Keyboard.java diff --git a/lwjgl/src/test/java/org/lwjgl/ExampleUnitTest.java b/lwjgl/src/test/java/org/lwjgl/ExampleUnitTest.java new file mode 100644 index 00000000..9e938a8b --- /dev/null +++ b/lwjgl/src/test/java/org/lwjgl/ExampleUnitTest.java @@ -0,0 +1,17 @@ +package org.lwjgl; + +import org.junit.Test; + +import static org.junit.Assert.*; + +/** + * Example local unit test, which will execute on the development machine (host). + * + * @see Testing documentation + */ +public class ExampleUnitTest { + @Test + public void addition_isCorrect() { + assertEquals(4, 2 + 2); + } +} \ No newline at end of file diff --git a/mcinabox/FileDownloader.aar b/mcinabox/FileDownloader.aar new file mode 100644 index 0000000000000000000000000000000000000000..4f3960dd14cb77b7bb6a21b1e7471e1629405460 GIT binary patch literal 274379 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�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%0DmPKM*jG5T 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 z zH&DLqULqaV5Bd=+h_3DC*%w!FKpY~I3!iL!s)k6+3=BdY`s<`8DM?EO&MIiJ7spB7 znXxD^360rAk`YHFQ-(uUd(81e^N5Xm^N0%g%CqLEdzk&P! zO)BLRy8-kZlMjX=~+yS~d5F899 zxK+n(YsP7dS^it_eXyBp17H2U?s`Ko=90C7LMpS8x8?8Gun}LSyc%lk0 z;Eu)ar(hkm*B4PXjQfj1yhQsiCvX>v15RnGIW-(+E7vSN19zgQ!CQ8?O1A!e8@n@4 zzstMXJ@U<%$}XAowIta)g^vDyzlU5f!Y0OA;NT%2p#+|m7$o6z-2pPeynz^jt5w7j z{w2hir;|!nP1Pu^6L9;J8&d%+opk40zCGuY)%my)|7f6UMhqLh7k;Bi>+Q$ZxsB_K zE9~a)=~NKH9$OZ(y?Ncdt(#cRxZvVwG^yZ_@2&{U_A=XGE5+))Z6kXUE=jnjkZNo> za!zA6C-)Y`5YGDvcW!tK*hG#`C#ugdOold;cI88zlSu`U5u%~uiBnR z@BdF6{71>}uiEhJj0_MX0@#hMoiS*j+dk@!0lWyER#ITAJW?dMtuZH`xViW<{OuCg z3jhy_eFVZDqG#$Ui>`0T>z20T+rNFy`4cdEOkrMu=tRU-54wSe#pQ?9M;n|B<_r*>Rnh2+Yk*yApbSZ6Jw-j z19by@hKx^Eo%hk@`Fw-YH|aLSR2j9`cmb8pt1mF}@uamHp?X4?(CC&^54)%iY2og@`VIyze z$XvUY94GMhZ1DnQ>R}W_`2_L@atpXsS5?zNT+X@4K+tJdLwpKpIxE&FC~rpNLHwUuVMEs7jo4PlWxDnm4>G$XAnz=}JmQ&xmS=1s(r zC9N@=Mt-3%-McXP5DdCj(=j<0ee%Ee=={_fZ@M7l3$c64VTJ_8CyZ>A-DA}*uY`h| z+v9y$0(!Mtj?LPU+2joGdueg5mv_fM2 z!F2o2BmF<(>Skzc=VWecLof2@i~oXG)ZE2b*-pXO$-!Otzkcvnb|lv!Gr)ktO;;2& zt56Cen1&JSCT65ZbJkxV00l$qeqhw?&0Mgqq3D@I^55C|9;y4eZ;7$?W` zu;n>L6+qO?Q;n}8x`|^M)M8|uVg-41753^t>P;hk6~A36t+j&o(Ke}gbPL4UTZHtN^o9z-`+s$oZO8nkhO{$uIpGCqn}Oi2P@hAm-#`_jmMF&i`>!!?*U`DpxYlu6|r| zVUh%rfFV8=eH@yZI5r<-QSoC_AgTK5MR5l8@=4A^(PQ;+~x(wka$gw$&z?s@v)&)cheD4>j(5H zrv6}40!ubJp{gvEl`OxcDIE{CprsNHj$TZzFCdYKE+!9U9NUq#{3&QJftJ;-N}ok# z>pV0{Iv-tx**1n1lxV_9%TjzgfIzhEGRI=oG~DJY!OUWszAHhp_Nzc2Tiehsh4@s= zJh)wnsoX@vXh`sPye@_X4#dw%a1|&iD8}a`L9q z^Eko z7+dXQ4!%NrrZ!B8;J{W?Eb-o`Pvp)P!1UDWI96k^Jmb(Wd9VYSG4=|c!8DQKJSo5W z!5pVmz1zGJ#8>6qDa%n_#9pjC6%9dV&Tb*|&}i0TOx4>h#*}U`pUc$hPGq)QfOait zF#BUXqgYuk(_(p;cuM(+WXWwQVNQiOuVqM`2hAL6?hILwu!xa6nplgg_!~{o%7bXmWRRuKjD~0Deo}N0OO{;F*P0D~MF7*KPH1?T zXsTIeS~N)b&?$RM1OQ#26EYO)77gH$V$K?)(7V;Tj#$ziqDD~O2 z(O3%@+^&fE%8g?mQyRaw3trZ02eh;91+WnPMmhTnKX8RmgPuSC(b?l3Qv{!zo68m-1kgThziUACo^+>h z$q~Zf1_tpKgZ4UmF$8(uAZH<9eL{aDMQz;pkCex4?)jXb^Y~oz_#~ejjhrFPymQ36 z(Sd8cVg;FtKi{UH&*;d6lg(b@gCJ|Z@&8pgg)E9Y*#E3tRDXQE?0+VlGR97>whoqZ zwpQkb|84z}pZMdkP`D3&gi?gtmz7cX1vN0(47T3#MGx+EFFenu4rpbP2|Cu5io9 zK?d$sxosXE`8gL=C;{U#t?7#tesrWZ2qGeGg5=@7D-0?K4XC|)6S~WiOIR%L4Dh&b_LG(HqEn*!FO&kK{+0r_X44lP%^*exfoQ@I^RQVzgAAb4S zWSD(qMnu(i@Gc)>w{6#x z!|&m>IV|gMz0gWXrCUDvUDZ%VqCIfHm##(!V>#=03@RKCtQ0qbyt7h!CM$M6A9Om% zqfMWMqN59CFkzn!B#}#gn=mm-vT?SwFwPf_KM>QbU-Zf6%lBV_TUstfJ(+Ykm0)}i zz{4hIk;u$QxF8+P@uK+R=2=C^GAUKfh8IxWlbMc?UROlPwO8lG7n8kI{jl-d?uc|1 z3D&n#;9{oaxyhH;AyZk@W$2gVDmhHwos>=*TNlFjX`ITZJ03Z?!SKQzYLf=xc+(Se zdl%P2Gpf+*aWz|Q_bq8O-SqYe@zy8|hK6xW*2>pjU=moT8&dlVdxuNZJ9_iX^#Ok9Weu~?uSOTwL8K(}20p3;jvmR`n)**u{vxX*0~N6Mm~Jyli1 zAn!U!7W$HnyfiU!u#H<=pPI%_$}oIHTccivbhz65kh%hS-Gzw*#e~Etp zx{B`%F~8els}mk?1Hp*EgfwI!Yp2s;8@u#P7TDg`7`A12I{yY-@S&%9k z8#+6fJN@@0fcqc$mbZ)`P@WtGP#**`J`x^AM7tb^Fb)6j--CrB(NUR&y)y;^20P$4 z1qdl}dVB``$r|Hr^+we=$E0JIzAZAsQqQva5%_8qADbn-xq?g6(P{AL{Ee$Z7Gjq@sJrb5+J25%P7aB=wAHFQ%rPkI7|5vOi|Y)XA zLmE8i%Wk;(X8#anfRFcS?TDeRA}Oa1$AyHSKX4^M!9R1p*G-{@ofe*rG1?_?%uYh&_fwQ~9!&_zoBEXoEa z(=9&=fC}F->GWD#tD_&Lf_$kQ1X}&&842e--u$) zSVicSb-y^698ErZA2XRgkId9;1Jdkop;U9Usth`BQWyY62&35FV?_5g6kACT_0fVW z2e*AGb|D98G%7E8=NHJ70^KX5;t7`3Q8owRhnJqSNlQJ$W6C_P2yG@EwLu*MxHR`5 znJ*;RD?TuF7WZopJd%efU28RId#>3o)M%FDWE5q=A`kP2Irigk;<(_+?ysZdx8 za3JiqhbD2uXSpvZLJsVUBa1(e7QS-e zulKzJyDVLES%Gs4JEAJMA&4@>Orxosq9F8-yR>jIhZMB7L1p5TV2muD^&(dp9t~}A zap#4NT8A<&PEcxNLhC?2FU=4a_EIh3O7>IQ0LhQr>B-qF53{aXFT{O#`SPS=%;a&) zSXwTIi3~`OAbo+e>1Yk;pp!9N8xqfSu*a#6K(@og`p;XcE-TRORJT5d@i9y5mKbjDqs!YY`0aBeDGBdi}@9 z&P509uCvTnhqr8)xC_2$xYOKj{)k%WQU|U8fyXbwl?o5->!R`n)8n3R0JrEQvf>+x zp?wrd%4EpLmG!ebSpD(_7qL=j?P`e2?&dS^A6TV(4LBGkM{jfqM{;N!i*c1nf|rn| z*&Ojnl#o@~P30$8r(JsySw2T1{U_sQyp@^k^CE{=89!u>$`LdkwwM~w)3!!zRI!+2 z*HV^FT7}Jw;)tzWzOLC6wk8Zox1?`+#}#><4pr1DcMXNz+?mk@9KSt_Wh5^vWp4wy zi?)}Ne*^|iYv`_b+Hs&yM{EVcrvs~^ra^fkseCnEHz2<%H#0HxKs*jTxf^TcJJwoVM37^y)RmgWo5?wvP|=(XzMH z#Uc)~f$Rur9py?Tp0;caNbC7m0=yX#Soi;#{10#d0I~lM1W06wdJ~eLuEeO--@*KNoW@aOu`Fn{~L#&rez-35#sj4YeX;7ODyq zHI-r`W#Z?Ad0=SPD{v_wCiCRKf3#5MR=GL9F)1`^D_gW!jMt2(3y!(XH54{bdULM3 z25GD|0?Q=TY8RA%t|)(n69@3guj@W_iN=7c$e!O?fpB6M2u;6hXU8+0u+uPPWpk!A zo(4lf+mwFbnwKe~s&#i^do-pN4gtR=u;8AuPD-3?*aW`%6#|q(4vCW=S@CN zYuO*#%s%v|a(i<^7_T1f54nQCwwnU2$b^U^wVX300wITNt0#9C;bdo*1wOcIUk%^R z+AEHv^PL?LOI`*yAA@n&*z4Y|vxKUlwcc%r^;tw1JT10Kcz z9bSH%|9XJ}2K6%BfeQy)mY=WF&yDPm>fi5UwSz|mR`#;gLra0N+H3B;%P7h0J*f~{ zE9I6`S#@7Dw*wuH9*W`jcIIz7_4Lfj=WrEkSittUMG-43;KIJK$ZKrN;?Mx-8cbci zzm$8V%01&&s(ZTKjM<5&Z&DvW6(DKzNOv;k8Rk>IJ_L?=N~?Cg1s$7Bu^}LqX*lhN z)F8*IFAY{-6UEvCqGb1$T=X{PZpI06T^kZzEfSp@iNTyC;|+zBa#()J=x32NZPkeQ z@k{B*^})Elhp=u&8-Ht$JrZODRwL2e8{M=m zNLP<$Bq)1|6fV}w--zWr&QL?fY$o<>WIiZ|@g7A`=`htBtN^|ZICCu~n4H1JY;Lde z>6qtwt~L_snj$Vi;X?Fan<)*f`}h>z$S7m-Q>>YEx~v#KNvM?OTB9zR=mJ~o5C{=5R&OSPOpmPoSoj7KMq8BN5LzZ zoh(cneae`>NJ{o!vZbN&V4cC@(;U6&XFRu_xlF&mo?Es7wR(di&k-MXh%qf7*obcS z_t6+8M^lp+(fJ|n5ovai=Zu6Cpozo1pm~P!BWD8prS*4IQiW_MUbq4|5uNs+F?E^5 zezs`n$tf)yxD3zYgmA+6fo`n3^&+HYjvLpX3Hb0#%rZ8V|6Z97Hc4Lixw1TU2O(%V z%!I4T{9Aac)FHUq%f*Y1Eqkou-ceF`iUCUFmJV3)69v`~BKoZODw^@d@K)F%r%s{} zHET|qM^&5JjfJ#_`0)K!?=$&gvtlGge}S^dxL3BO^-9WNTSUl)4>8 zkg-YLg1;eR6T`f|aM)I{IfbReD|`1YLr`Zwx**Bjqj~vQs%o!NjqWu$TnDWv{>TC* zOZp=gIYSkOs;sv@FNrcN4#_pVS;wAMb68cWw2`Gr{s2|ABs`u!cpc|T=FYgvqV-H; zNDm_lmz|PGM*O)_i(ANKW4wkBD-5?-j_7BF#4#}lhRg+dD$;Xw_29X?D#Nb@C%TX} zcoRHsv@FO}HP|I4Q zO+~!`s;fQza!tR8a(~y`Z2$LEJ@zI^|8o7CdXrgi=U16i1-$2EYZ@K`x7ZZ0P3Nvr zP?fA*F+nEXt;?(8#NOF2s%xeP)=-nz^d@jVCC4xU6)YMO!}r;#^F%tewtJnV4R|gv z8wMs6OQJ6NC|v95@(54CnmJ&`yY{M%4`Zj_Q(SQ-oNOty3T6PL8=2+(PF>)_Mebyr zKd!h{9fF%fwJD5ikmGZg``UX$Bb~?Bv5iMvXNjDz0q`R|ZO&%2Di zQP$9SJS|)hMg89>@-PMBJG1W*Ui|6pq(s8e=Gk?@iJL*?bPX)YGjm(wtsn+e;RC|X zWtiuUsvu_hfm}HXcloww5PH;Q(Xyx0irPL{9=(sF!J84|SQGMXZ^>KoK0>QS&7^tw zGvH?saN)iJ39#YFqQP6{=&Z@!;*Z;lM%e4ykUhfT&;m7xK!96?%;*$z2O4=K3M^Zr z;q8HuAL3H@lTCm;lX=d`#J_>)6r|Y9RIm|`Jh%*;#w0s1w1-jQKXE%{iF?@EB|4Bk zZR2Zr!qsq$$${t@2n>aIUV(Tp3%+OhwF+RvV4~*4efjh(Ml{P;q`!%sxJ1ttowm+S zJR+}nk!BEOKEmP57kaRbXnW2VZE|sS3!t~nx(6UJ!jP`N0+#r9|1DX>Vp1o85I8sj7lqSxk}kqT@Nqo(%V{H-I;Ry>b1<{vW; z1Ox!U{hw>}Upv6^eg7!yW`HMeV$GbyWCd zfb;goF!B5&S?|qDW3%3x^jxU9j*$g8HiN!^VgY>u(FiQnO#~Jowx2%Gt`K10*UKUB zFe#PLM6l3M=ahR3n*G_f;6r7tvQ85zNgtB-qs-TFxnl9a!9qZenD`of)zt!RxVx3h zn{3f`t0@gN&DF}TxAS^JD??L-0Eg7^f;K6B#K!g1omIXj-0rrM z{-pHV0s99EkH*F=JRF=~vH}pHwRu*fkzah`vU&QTjUFbs6OwG&SXOqoo4=-q|`uSK*N-x0BmkT&RvA?qw8uZ`oP01lE=;@5V)gi2F*9$pcW=wJMBS z0X_bDW;_azqHI@*-;O|8Siq$>2=!;LKz9#t8VZ-C4#*ZM(ND{Kpyn8~s9ZF4*MnJ-(<6D`K_k;GC z3E$DJ0c+0}Mzh;Ym!+9zhZ1kgzjKF49g|{fAQ1}Pi%O1}DW^%G{lTtJ4v<57$7`>D zy+_9&Y0F*z^31NzZZR(%L{z+U_NrY(nl~2phEglE9`NrCkenaUbh`nzy(NA!41GXk zUMSMfwQRjGtApmo0QbHhZaH^{#mXcuumn^De^??^qz~ea<4YEqO(1&ecq7u@q(SmX}$4p~W&B6|i+juqlNxUpX=Q|zGxwOw!A zXo3$C_@Y}vH9cG1YppmTp9HCvh^7Wq9cI87DiD=ZC4i@xGYdWaTH^0b8b8?7(*> z;}Jp3w?QKy6hjPgF_=WFB>on|yZ(dT98M?J&;0<8W<49-L3gYX*IQ3p4mER=T56LN zu#G-tiTy$!JOND>vmBu%ARGWdH6Z|i=zlIGf6v3G(mkD&M!ZLQ9G~q~D=Nro zmiVRmRJ*NGmLVT2liMdO%Lw327f`ww z#P6(P#IKT=$0WozmzZZ{4wuAa9^r7l7I2qHJH$ImN%b&$IyVU*4LKx$wKDf`x?XLj z&0KT#q^%7cuJk++{epc-js_oSg|(&buX+hUkO{hV`N)&PqZ;PCkum44+}9qW=a)dX_u~W_rz)!h_w9xg~tv8DM%vPWvd6!b=$2uOAmJe3Vb~ zlG@5nULF~E5&CM99Y0WHau*=WS-!=@%~`tr3FzIqf#vFu+`9+I%$;g~(bt*~MeeeG z%1_-O+&kK=CU|5-m4cBY25EIB#<72!$emW-K%5}sH7cVXFn#MZ&Zy37GlFbQV{R{r z^q%fnImyUrURSiE!fAb+4q{WDcCKjo4)QTIP0*pRtY1=9J$4I7y>n2NQSQ4V%!(|A& zp}uU(s#pfd{FAJ<=_ty@^Gth4o;Q9ftxenj;q$_A-qQ8nKZA6RIKX5YMNNtQ%-e*_ zyy&H|kbJ}<>nPA6T46Qk^o8rOdVdDAzluD5S!mj2ULDu;WOnS~LOz9DwDMqeaRpLz z=P7+{&?KeuGR1IOP5n%%mn}_Pd~DKhomc-zgmLx=23A6i$o1pHQED6%* zN(j3QY{^~_j;s1zU$W0>I@4MJ?iw1WAt@yk6${fLUbuCt;po%)zCs@nVeQ?zX_kwI z_<3sDS)(Fl*|<)3K9g+obsOP(5LY%;^))%x!cj9)y*a-pVT~r{^qQeMeP6!o^!| zbV;a9f9B+Pm|8+C9)xUD;tsjwVgqiOQcW7JVTsodhX-YK>J{_slX{1dtVy+NvEV5- z&II#2c#?bf(1wx`OeW@67gyxLD=+h!1m@FKBK5wcmdd(>A8w$RRt9pxpgv()l!`Xi zj-~Z5*d{T_DBz{pbmSv|q|%fUKP*`?nj)R}>w4#3bqN!!rqd`s0((SWTNOki z3{_SllO^IQCnm+PXf3dkDm>BUx+ymIrRE*udwQqtL5e-f#QkV(i7GKmh39)OOA*cV zI3IO5ADK7GTF#HnLlif9(Qkx-W%p@H+Wo++SZ+uc?Oz%S^8M)dslldqF@d924R$K( zfjf#GX{NDO1K@yX#_I3gwt7Le3VUI^V0GDM19X5z?RxwG)%E2x1Tk1|U_14Clb0!m zVLC%4!G`0OZ>53Z$Y2f_%y(KVeSyUNaBV$Eb61Lq`?vh$Wp=sxKv^cnT6@)K{p$&)r65HFO%+ ztzb4NUH;eLGHUPAp|^kt3m8f8-7Ly4uf;tANhR?b=EJ_UcOqMmO3Zj`XZAa0 zE2|dG+Iu59{40#l@*`-))}W5Ljn)k<;3(gp$8GAg{Th{qI%5@R&R$prOT`udyUsI$ znyT+OUdL`FdD-TaUcX9%b!kN7)cn{dk`F8mxvzi{o!K-^S(58|t(mK@{Ce9>ci+QT zwB*pjmCG@Sb^EM?HKnXvbfeqo->E)Vy4#C)lyjb`1feZ&mF364fN9R#e({-V7kzX2 zJ2%nym3BdB@4$@M;}Ncr`)1wf3bFqxK3ix#1q#;{099OOW?9S<9s8M<={I+hBC_av zio?4*!b-C0%`;aYWmIyE&|*PH@vNYjQ&f7-{mE z=^71tN$v%$hRVu#f@jSh-V#3j1`TdHrfW4C_v1|_dCRX?S>^fEYhC4QY>p^9Wl z}(p;RlMxW)}|9Mc9-B85MBhRO&rAhU-hge}rY zlwA=Id00;5yOojlQRi}!U4mqblVtgx6IyBrca+%!!iQsB(P6d2L9&l>BiK9bp9+DC z$4A<>qCD+7>QcLYOSgKmt9HndJsH%khLoh`~n|My4z^n9cdi7SJ z#szx}!{*0kIk}&?ZWTb=Q3(6PWS~5w^w=kbq)m?Fj(wC)h~09_JQ@lB@D!$_I^D~LIV+LlX>7K(nzMlPv4nK zt!UD^qmu0`UfG8mS|{aodZDR$B70QabwEetq)}lA34(tPSt*6eZ;}kl(JGXp?zbuy z)~T~A^@EhG$UlU`ya}Tvvj;QU1Hp$TxCwFn8W{>;r^f4N-otg%>4Zfer0nc{x4r-3 z+{96?+%m(=SR4Ic*TND^Un1{MlyhYCNRln-t z=Afu5avq(Gafda_M9hCr)Dta#_$jET`hLrlRjQev3!~^B=9{_!A>GA9zYjLXE77F( z1jE1@>k$dOOj;NTgS zP*K;fsQ}-q_6b6v?=T?#>%EKg5$#21q?n7$fZADAAts#>crCYNqp@ORlB=C|rG|L3 zoQ-~S$_al~AaB&`7dLjRNUJW<41K~e^TDe!)U$de+Du-yXYSM<_GWr#Z`GK)L+3B; zJtDaJ3xf0*-%WE{Y;nBj zoM-9ZY4g9y^S=@2zM1E~q36D-=f1J$zEe+h3Ex!1zD9(;uZ6ym^L>L(bV=WGkUpt} zzNzNE6Hk1fJcE5u4C&qg*`6jNc)YS!9q)1KLR2540yDp1KYbBCeUUzW5kGyAKWDbo1*p8?T&71d;dP_KmLsG}@ zr@qnJyY?P$tK_@Ihl@xC!h7M^jA$@D>HV;SHW9gn4!C4Yw6D$?-1Ru6qr6x!VliRZ5YE9 zrgK6A0LWtg8#fdDzvroc9eq-VbW>VF{konq+L}Bt24vzBFwn}EBJ-mV>jgoD$SuH# zEo@Yv?Vju;5hT0cqXCi2ZKkTykgv08(l7@_U;KpyavqFUVOG`QELfGVQl+WQo0xrX zvMbFrhc%J1={n;u!~LA;IP)`w>u##q6F_S47;4&4A7@(i1{<8tju71Pj=(O@KLSPT z!XMaDyA`D8a9073&T-d4t1nXZ?uK(%d#GXi{=x#UdUqFICbGZDT`h!{>IIouYh=I! zkM+im8=j5fJc_F$EF=nMYqCKzlO1A(sx`?^2aol(HZ5dBZGR)Ha03_W4QF-FAKjH| zl}gVtdPoygNteA+6iZNprCb!$;aE7bXaYow+4Kk7^z)Qu8mF$_OXkozQWa}q(1vA( zVVquT7e7JI9E7N$275Cf^pLY(ee&xdXM0<>oki;KcOJ>?A2rfF~j7zV7ZWiRP7_NljUvcbfA`BJYe8y zo?HalWh7I8b}o}(As#2c=6d0XN2Hjkq^QseP?QLl)m1(Oil+O(GgS=FH4B05A``!QrBrrr7)7$&^{7HFz4D#er$V>|QDyLZf9 z{P`w`9G_yeh19&5q;+?Dp+gH&yB)%#lm!O^Cx(J{;`CTUkrK(q)o+9}^kk2RT`yo5wu~f=0h|lgs>W4=#)x06}T*oO26xLZBQ=044M7IG}^_ zldDpGscTPWPo~rtxZ`Ae<>q?LO8i(R?NKya**|dw19g0>)o^vSPC$fi2L05aF$)wg zow6Oyq~(*RWFU&r7Sj{DhLfk7u!jC$ti4lorQNnRnxx{)*sR#LZQHhO+qP}nwrv{~ zRZ>Z%;#1!~-~QWP_3zd8+Gm}Mc`-(NZ|3Mv*XVsb-QpU>vDP2&Q7mwWfv9kwcJdJV zL;5)tiEP1?=J9fen!9q}HUOmamFbZ+=4$`)8ypm~dnlIl)mN=~6h@PCV2$}*xdP8Q zct|_7CPXqShMd|reD5QUizOO7jB3iv1wqzlU^VspSk*YWI=s9NPjCA-{3@00ATO2e zuvcWl(0u>?hp+h_B^m@9pj#CF%G~}CDsLfSxZkOMRYiultB(+^R~#zf;SKF6bI0~o zxr5M9<_;@S=8iH^=8pV;)|I~_)I~~XE`BXJH0drhMAuch!;X*iC8K5lYJB#ykL4ffrR_(DzPQ#5mrBd+ z^LpMaK(=KSa#RJAeI{w1QT?rT z?vZ*o(TW~2%Z@A=+O#-LdIPm7C4CV3ID_w3Makbb+~-BJ$BDjN^(I8xFOI?xnnj|YmAs71`60U zMD7g`If7r1FxqnVL14L(-xJV&kq5@L_Af!^+6I^*Y?}v|A#qQE%#r@Wfbpgt;DzzV z85q;r=K#&q56FVdwF)>x^ezO;h3A^7P%5|+3+9NVCi+!yyaRIa2-o&V;FdJe;lIbb zzc$0&xEL{B)WT;v3(DsknDpyHG~~TZLZd2NYjN$!Cww=hhuE6xs@U)m4n=hj{sfx6 z@-}GE3mu1S!F5*Gw;}U2IZ+kggEi4~Y=V54BKQ@P(!R3eY&=-IFnh3$CK!7LDhR{9_79aUrVc(t|EyG(O0axb& zFdbz(Hn9+L63MTjD;%Sb2EW+bj-bg~Ve3yG41`%fa9&XKl8!5!=#|fy#nL!VO&H51 z>fM>PS+p1w74fXa4;uW77b3DQ1n1iA$Dp+pj}b)5!PGH%%F-n^T_%%F`M&u*f_T`M=x?U=Be&cz#_>nK*XLpzA>SY(}u zZivm1=jUV$$UT}tQX5RyHYrMn4*N0OL9!f7nzt&-c$#p5w+hMx+c15HRyzk@0z4dn z7T0{J>m=z@v6)<9qA9ZZPwt;YUuE)fesD%kC`BD0$Q%#I2FJ^_>L%Z`)2H$HTD3BXp6USQT4yu$nAj@b++mDfzte<2!7s5qygj9QrC)%-` z%z@hWSfHP7r7rT@%31VtaA)j!v<_1TabFH7&h9g7i8kRlwPu&It{;1`=UAsqm55Xi ztn<9-ZJ3c0iQR~xW<#q&f>B+F(XYN0FbaLwmA%=RNIam^f5ke1T4sjsg)Z0VxcEvh zb0t9WzBsAkF|7mVMaou>4$+?wf%2-1DbCRH3#oOmfVR54d|fI;?P4rmm&0G5_6@p~ zr(8PwlTyO$ADWhh<>AFxt z@8L$?6W=f~wT7&Iy;+Ps_({aYcluNM!ojV0K|qOwp|peHxU~pedQQhXJ*l=)8i|~< z#DtZ>=~@c}%)p%Zd75doYPym~aa}kDjtJzH*QSYmQBoKJWQ0F>`q7&;kj7}m zd4=$7j*=oQk?H#0mSJieCA*v4BvukPitJ1OP>8#AUM1mG(BTSo;G5k&OIPbPh zf|os?2%d2v-y4(A)fDhY-2f5!zQz#W*pCiEcXwO}Di9I3(3q_5Q%94HQ? z2o>fyN~TJUFHCRq7}>HX9#WpQpX@YIrCHi4=X~k3h$#HA-HM}&Qmc!WJ0>NlS3S|w zt`S!JWHd?v9oodPgcetI5@?_1F+eCqc!sg9c~Edxt(9~=s-_%O89X-M$7k_r&$G`*wzw1eA-;)}bCjTS1CU z+5;u?$D#AkybLpt85ReyEiPj#(}$XVcN^iSV3^)H1=sjfiUvv;iUYW)P3cPZYiU2A zZz|g3z&<4{P;Jc3-0wfLrs);r%FfNovtWdhGqY*HVP_ZX$(laCF8Y?=w4#t4Fp_U= zS4Nh&gwi@r;{M1Fu;8ID)sqCd6)%PNdJ%QR=1Z|v$@GI8QevE^E?@3tEDLa!=|bTK zg6L;Cy3)KcCo@wT>%riZ3zw;xFK?ZP5rhBY1JyV60K^LF2~l%q{saw8NPHF=$`^Qz zFIZS`J!VDBN7R{V9_bs|fND3n)GB5^R3u=MqAwF_m72NJbe1-i- z6;n)kq+S2LiU0-z;`?`0>_3S;1|*005kfyJSS*ad2BdnP^yzK}q7G*Q5z0|Ed;2q` zx0YvQ$88^W{-Q)lZddTClE+DZHrqeTGT`Oi+XdD>VirX@A|Cap?`BKnkt?nSc=;Ni zJ!CG?BZ617Xv;;r#^N4quWfcVewW(Va2lLBanF>fkX}e1w82uS8nmaaTMeJ>P(6WH zd@n>-RkJ1fh>fQ%u3++o^c@`O<*IFc5ka6Uen?zd5E&7cL(sW=r-|4>t;nf*1WG z{UdY!s*z0OAY`^*{Q| z02UjA{J$Z93-T|J;{2a~^tb4hYz^$4%P^(&vWtt%$EcQ(kp{S90gYFjn-Y0!+MsLu_(PK6BQ&w z*4J*weN5J5ldRD8CS6F0V>G^OWCzV^&S;7 zrMiFuE<2=!2Al>S8Pg6xM(*U`QA@Wnzxy%xZrpy%HKAr@F#-jEtS^xtZpwr5QwwYu z0ENL(<<<$#7~o>T#qF;fEFDFxwQ%Qp`fM4Ets0Ec?t-2B{6R~SFe*aU^4Fw*FF-&# z|Egf54IIr({tyoFf9k98f5qWHimoMbP8LM~VYClxHOE9lbceKfR+>t5&PbE%QZg!guvtaqjOxyDSM|465*50qHReqVP&OD({cCRTmFwU-RaG zxyOb$Dci9J6{Axyo(#G1mD!w2f5^zHazSv#Jwc_krbNeF>Yqju0Bkxmb1$ z*+7>K^PI0f=DCKVvf1KerBrj=T2G?6R%T->>&jsN$&-bQl|!vmYZLqwd2+j0drc;a zF8Zo#ko2@kZXw5L6rxOfL3KNlAgOo|yIeJ8IPUqNRpugCOcKButWgGCcf1-;)#j3( z4hQ+TeLC39J~Kq$ER?P%BSM<9!q~v;L8Psg@o0~oFbl~<#ERKy1tUvW5mjXB^CIAl z0;`M|Mvq=3;r^QUk^TMtYkZx#5|QWJ$9RF05BK1vUR((2=&ueW+wWgue;q{~SB`Gr zJqfn0YHHf%2JogtI>bIIKBuJYu|sG|>*JEz!;m*gY@14sm(uH0TBQ$Adx3>@1Pqbh zCg;|WnT7kF_?bOLCGzp5TaVW{p20B@QYV|CIV7#^GliNkrz;#h@{am}{3Bj0{M%d@ zeq%-QcgUph{|{dN5hFE9Q;tiL2s}g^h;Y#Cz=L3p$RNNtm1PrG2)cq-gz-JN2s48tRVh6Ncnxfe@jvTeD3 z9xs4?-t6m;7#^_dVO`x112;XopGQD+5F0$hs|LEU>g<*VgM$nKEe)2$lU&F<&_Uv! zlU!#IlKk4J=Q2gg;7M&tDf0W>{BsO^4@=0#$)&ZqU;7B-tAz1(baftuTpAka%MLX- z#-6{dl#>QgG5*}J19!UUmXm)^F*jh4uediA>`0#$tMKPR4W+CFWt3>&bZ$YTX%E{ts=UMs}tf}xZ!*6C2eTw8HIZLS|pEs%r6=oOPoMDObE8)5m9%a>OrFD{CTS|%zNhx;B`i;HQB+u)hnb`zVc*@F4rMo=Qw?_Q*3K6a(y-QMWwY7?#qu*e z!s4Yj#j@|`ksM9V5Tm>59iQTv^6=+)uX&_*uJS)3_w|ssu>(D;q^xK4HSLr|7#=1;Y;W;LbA7YQa z<+OR@slT$64FF1JEHJp3$xItjN7X1TjH&U>%~Waf+*X@|??@|jWMXCx&+6^yy^K=1wG zXrp?-foFf~=R3szBBl8!`uQKkpeDxutrxCQo^#q#M)=6J)@Uh`R%)AxV@(c4vp;5~ zq@hVp29nUSw-=0%f$Qm6uZ!hR%$ zrS*=!L(<44+HSpkQ$4jkxuQeeB^WNSgI0cWaKr=pEg2;##K;fI1Qe>Zy_Bco%c=Y$ z*2M7HIi(xiIkl?BDp2UP?tUpW&}_-;pZ5bp5Ijwn%H9;#O7{ny=;bTAZbBk59S2ml z=&i+lv_x@vue08b7l@S;CG?QWR0`LqsAG*qSOMMGcA*jeIz{5m$5ZU4Z!?}$SDn3U zKYHAo&^rNbxVB)vp}TR4L|2GFH{|pwEDIbrc1B1p*kban4k%;RIAiTGP-t>Tn4K9hsMVY9 zFm2Y|F)X}(yP{vvZI~TKM!DMY?VtB7N^+r>x4RBEKl|W7)IOaQ0*D|Wi(|^q zN65dS9$GY6-Px(}7+c<_n7GE6t4)^m-%0+o61{D=E-PuyNF{H`$Q=au@Qj`xC5mNC z5L8XSnaiM9@D#Wtd?cj@_Cqz|;X_0{G&?z>4`%F!9!y&kok?eGjdLl5*rfN#Z}&?i zlF8#|^b5n2Y!~HfDZl$f?u;>upgDVE$?Y@e*I;ssEyFkA$waW@8TPBhgDIkUrO?JfRT4D`|{dyq`|O=?z=+VVYw_Cpr5YoaoPbM)U`3Cfs7NjCkd&A$7ho248_AZ~pY& zVg+xJ$G%ndv88Wcs+}H;s-wRHqQ{1#5(8>3{+WJQ9bQ9x{0`JDe*1Xkf6Io5I6B%n{`dAn=`SJ+44x(%ischU z1W902lm_d7l&na6N_1p#5@H*1Z=7@aRcbC%H>!ob;s{cZ2>4MmzvR2D4aJ69UJO0g zULK~i?2I2X-mf3eF#aCart=XQaOw3cXSP^P&>2(n+kr3Cm3v;5oprqMi|Ud`23S*o z41PREziSzC5b)NSc|^SD`{3KIz=FPq#J_03ovrjD_A z?KBmn3tEoc^@^{zFnvf9KU0r^-JaTS%Rj->0dY8+gDWz7X&+9ApxvaCcz&oj6Y&Gv z_uL0{UEGk%qHaUy?=|F z(XMMr1!bu9BuN$0l{e;mms2pV%MA>q8u^s1%kP;@aU;&sj< zZi5R6-8%g6wMi5Xbyw14S5gCT3#PO<9BrM?0} zuokiy&g>z;Y|@5^!EDWISL(e4s!$W#BG1g*BF)a_X-XJ=psE?Za7y{)2$5xt;cLx@ zeo5e8qK_+NWhMt3$sq+DM<}da$LI9@!)KF;0Sr@q=U_Cy{kH7CrEl^EE>8bfK%F@7 z7iG+7-x{q>t1AC6VLmt#Jb$4VJ|5)o7X-sBL2>Bqu$yLFrX2>ZCahY|?|FBJ6Tx5n z{QXewW?UH($|3ZVa-L?Mbba@(jQwc+lN-*0C8iOl{60|a$mF@=MVu+YEEhw9G zXsT1T?c6*~QLIv|Ou{-MUL~i7y(L=^Bc=}%npFYD+lU+dc+qTY)oFf(ZIGxb2<0N> zT1)5~vmHMWmraK-$(${Ozg%?6wr9JzxY&ek=_Hx)bkw~~pnstKeChc`j+M?I^ZoQw z>{M&9LF_u^l$~nWX|U_{MRRZgSDsNunX}yhIrG!fdY2Q1s{B6hBoDgJ+YdjuT2_6f zUG!3FYGxne+>3#6!fGdO(M);~UASA14hZoT9!5TxLYir`3X_|%AJJ3;?230(8}lx* zDz9=@+vgSb={dg+tewF&Z67)p#VW~%zIHGNjC+5=|B^|#?+*Y>)6hoz`fYHde;ZuY ze-8jAw#F8=X8*+G>il&J&C`}Ak6s|6g(!S1Bvn-%Sq@1kKisUkG(HwY=V@TK#WGd9 zu_O5=_o7e8eD~L+ImX$Zt_m3oZ+dR$8|RyBCa1aSkC*o&GJg^45_(Xb%&x`lq*GsL z^aghE-7glYiSFb?afF3IKxAwD9k)Q7S|vC~)SiDbZ$7rB?{qY+^(qUovM zy&##@q|!oK2leywLbKXahC4%HttDp*Ly<}`EzfwALQg(RiFqu-O)`C{>zd{A5K~eG zWoo~z!)BDCnf9Y@$0IJ(8CjMMBMIh=5 zVb4{HuqpH_IESI!mGOg3isY@)MM6oli%@vrEFDa2yGYhZSWlCU36AVm?$)%&zGv*v zAy6zU?~X$6CAw>Y(7ps2Atu#J3YtRI8L3jB}SuUk(ZYco%9LU!{+&ks|Th}1K zfPmEgJzaCOGjsgC_s^A00EMUNAt<%vL`VP_6`{pCK_vkq=ngnqLV_ip@OJ5DK6c|K zeWzylvp51HL>T!fDl@-t!riRXLcE3-SeKfX4 z@`EV{JcJ2u&H1@0T9rmS;8`5^yZsLnYQo=fO?(I47fe2V@ifYU__ zW}~W2dF$m=EM1YRSO>%+dM+oxdxQtE^V+sU>%>6m!GY#oz$j=S5zj@*V4OunJIZ65 zprT;$p45khAhgD{)In0=(kM3^tDriH26dP)ybH<@lLufz{c{-(9(%CtMp6aOy&y5S zim)xpRykTjSU^S=Zak?7g4Yh|VmaSY$7aHxR8a|65KqG9Y(yZYj`xVJ9TvOI`j}y` z{=*I4!ne2T8IM$d4G}xdo+E0D^+sQ2iDt7s3Nv))lNTw}>vLM7G&Q>Is4qkG2TM{# zWqw6m#w#Zd^o<25jPs|{1K<37iyVr{c>{x_ctD{JfI#FjoXHF1bhtT{a;PGn`&TFS0Gqq+-`C+oaT6* zZf@Fc^?E_t!^A9#}j^|N7!+^3^d56#%{O+c^^oTi~cm&yE;xxCUa+P9bJJo2im8#oxttqyM z=JK@OpreaEY3XvVno$*cKE?8tw0>59oKtAiDXx8!`|eBC7J%Zjj4ZT4z6uZodvN=? zSt9Nm@WQN)t}8Pk)NsPtYwx`|jze`3RoOMBBC`%aer9z0Hkslw^;iwJd5xDa@k@N1 zSLkZ|6jqWAPjt;%h*OyxRrRi8??$;<;)BvQYqmRnbIw@ZE45h+nN(G}*kNKARa-`X zW!Q&%{(E*r*f>M=hX)X|$JQd_T&I3nEa)nR>*wv&2gQL?iM9*DfjK+(W7n9DoA>!3 zK1Sj|vlN^|(X)Of6p1?z(CSC0`ShY!R^e0nE-?>LA?|m3QD>0U6pF{uZ?G^lU&afm~e zBb#V9hE%ANxyf?xumR1c6-_<@;V#ys;0a|+5Bl@A5-v2GnQ3QBF2Ov=GC^MAqV6(o zgO4zKQ@O3Fy2%OI+Pc_i_9vb!WJ?*N;;ofIuZff~i?N@`HQ<`hyZxj(B_^hHfAMJ2 zUP#@JR7fix$ew)c9m`%0^+~rvk)$A&OO$(Vq25fX;7ym02-`XpgbDl5pprVNnnXNK z6xicdv<)qjm_RZS(Q53E!(rT1(BBT0kFw4Uhm;pYvj=ZrPzBq~@sS#QS`@;w#qVnIT8_GSU9fu%ND4F0z`RD=Z#tz><{E58R9n z0GF~S(A`Is&zI;n&G0X!*MU@{A0nruHVs4L@>WV`Wvx~4ET?0T-4X2LwZ4|^i)Nd? zJJhdrXNpVn2G3)lE*Ql^%)3>1{-ZWFK5(2x@!NXpg8d7#`2I&^{1fB(_mCwmHw&6T z|EfUrq1EFJ$pBtsec#XqfIdAk;!s82%(IcDJUWHwH*4RV3Vo zc1MBYeCS?T`9c>jfnVfX*h7Q~sn@3xaM}ymGeEv=byrU|T3^ZW>k3oK%z>&PgAGN-;BHfCcBe> zZO_25mY(~~NpLf%pNWTiCb}DvY9CL?DRDzBtHY`z-p-fXVFmEo;_MHrM682vkvuq~XdOTH>uPioA;jU0jeTekWe+!pbD+%uF%2>Z4-}25 zx}_O*@(0-J)F{G89GQKqL;Vp-Wnv0TprQI;3P7I)477UV_UowN-Y1%+NdcI)%mvFd zf*x^~%n-NOJldVsFz&X<4(&VWKO$2@rf>V|H!_VN{}){q{~a>_Mq$d7;%^j&e##0O z()#ls6BhdW6Ob1L5(btBYticyqbPS+C6Y$VmR96Opis5(`dj7s$H0_KhQRL&MVKYx zrvp+`(w86hd}c4|;@q`;(^nz2J&FF0HWKs(?b?D)Mh2D=GYCG0o zJRSt56H#r0lk0JYQHVXL8piS?H_=RiqQa7U4r3FkvEB~ymAU{Zm+9f1wX2SGZazho zu?|urNJhR8N+N4=@eS)1M954tonvQO?HS{(sk36M8C8#(qf;a?o?~D>b5W*2m--5_ zWx@^6*j#3uimj!6G23qVu;JA?LZ37_8EASgBGmRXQgLeqHX#Y3l)yulyhdJES;`>= zT?KRg&iw)Bim-(kK>x;xRC`o|tM->7{S2EdJ8*Py33 z7}t~e1GSg@?JM8Fp6|strVl$|*OPXs!=!2S%MpoZF?XHdnq)(DNVJ>I!2sX>0M;+i z0kR6dN49o|C&{iJxqyD~Yj#07ra*I&9_dZdP1#KWERr6A$28gXr*co4TwExJa@}X0~s=&vH4QrhCqIy?$=`sr7!T2Pre57HEsM zS*JA!icv_nm#!)pnui++K#XCgFE9!w7w z0=XfbnZGg(n9khP1y-xVln1-#ViDRw!uzIHgDcr5o0*YQs<+^UDrJPH)_Da?L%eUn z23WCNNs$*P=`3BcgL`(SskSNzsK3}MyRhuXVQ^N0Do?c&hYd;2|8^N^5LW;Q1DEdd z+~5oV=_{dZ?c87t>qMQZ`v!u`k`swoFHN)0B-ESks$-)mG!LXv&`w=Xsq^(F9s@!(fJ#d(owGEX^`UjyVsH2zl2;X`MK+G&2EkuxUIYB11BpQl&wR!DE zmW^6XoNHXD6=pi}Wup#9-n-Kf)JN;}smixitJmr-W0S;*{dJmUXLGpknjF>y`TRM+WWNjIzshFl#Wa3QY3jaO2^jZVY z`-UaU1;TeOjvO8zHOnK8+2se>HlF@OEz@~Ioy56C3ok|N8IOjt9~~s`bnCU7tLlkE zhGs67N9>~?_;9#i?3$>TB;mF--hl$RxTJ0TWRiXf4RuOJuwT^73#4sAE){zww$(ly z?Nq3XE@t<|AVt9Bt8P)UqQtv0hrC(7$+T+G3bqQm z)zU0d@`U@ANx%Ah0YsN@>4xDUWki$`tbhzh%5Sn{Aj% zi=2tbG!keev%`w-sUEUlCKJFaufhB(AI}qjM@1b@O*$q*sjkWLZxe}@LzRycuF zRlJPA+&8EuMaiaVNMouHHF7hYJ9IE^=M6sQgjYNDG@VI7@AoTw`+2>^R)iOz_3$>q zIr#N(U05zY7un&1fv1adwh%vXx_1QGo+WWb7W9 zC-nyEKu1zk=}M!XlUM<#BQ+DJS4Tkca)`aZfqFdyXd+~;|A zG}Tz61$IkP`B$HeOTrm(Q)iXk5kX6MLin)rv=syABXZY$3>40Aa0eXl9Ec)ziJr3Z zGiKeAPbPO*vpde+A?$X4HU~^Q0}wl+K)3Hy9^J7{zi@Al;Jy9(?htL~q2Ge!zSHrd z(t4BL+Y6u^!YBmNjd**Ld~=Za^}R(s)}a9l*^sCgwabAelVVLing_*-XjQ=!Kw7*I z>`Y0JBO!i14Dd=z~0 z7vVxc%(^gC56!x(n+UjF%6(ON z7rP1FJ4Q}{215{6Lwqx4oFIxdAzR$Y4mAmOtK(WqoY9>!pWCg3+cbPn5BRl&-4biH z+=0!@>R6F#&Uxe^nstojWx0;XoW%>v9zqOjRBTkxxxLv^_s@MOW2HB)BJzYs+Cl3@ zJ`o$Z3rwd7KB08E?1p%EJ_AIDQKUmk0}6*x#=|ecC&QRj5%5T=h-7bn47E9$R|y~g zy|M=W7lzvWGruG8Pt%H=*ak}w0ff*`2G2AuRO)+3G>IcL3B-B;Bt&Fj!1Cpedv0}; z!CKU<>A{!df?=K|3Cgl`zh7rYAJ05r<$!b-;_fhtq|R@x$nsnV6qOZ`cJuT~J9a3P zR!Z-)HY;6B+Up@0RMD@NV|&&}sy6ayMf_f4cH*Ee7FTJ{B=(`?*j^V@KhH6E1YPHz z4Sts7Y^M{P_;sa4)W6bidi@L*NUDiWRh&`Nn*DO;I){uHFfXXIOv;^)TZ+cHhDQLK zS!iHLtl;>^)h!xnez5QFs22$AUl?}#&kjx2PSnE0+W7yPG4ppGhK`mha^s!`Hqh#C zof2h;2n$)-FgQdgakMlqyG5|2)5s;_bI11_I4qn8`;rxH))uoY=#6jddX~-MH0##O z;p8go=kpA%4?Nf9AT?xz>qcKYG%Q>$^Q}FK0+&JhvOO$0mYIJ*Zw)`qiTZ!B-+t}4P=c-7;C8pTC zDF3uV+cb`#;UEP}$WNftuuEYN{eyPTZJbg0yX5x9Q7_<(#z=6*xSziM+D76anQbp^ zxF9iiO8;0#?H4v2Jcs}u9o>j|B{JJs{#r<-$BB(@oOsR_r;yt`w3&LZHUW9mHOpJ# zdg1}C80YHQP%%KNi{$`D3EWmPW4k(7dM5HLtKtIRL~;!fWz_1JzI1X9Tjet9VfM+N zoE-WJerjMbj^*wj2JSLa7+PZAXuXe!XQj^Y9h3vM3Ov_vhW~3WgY`#RA!BqN!z5R1 zx#O6sb_8qO$ds|6xN68`8s_1Jbgn@?O-z-r$}hksq8pZB*&u!DtQqtf_c^sEB=PYQ zBw@ZwD3zJ*l5qP6}d9?{PH?8pc%_h)Z_+l=k^4|+K@hgU>cnv zV?Z17jDm)7g?lk!pGKfjS)IMmT&FV-UnMDrBbF2TUCu)&L9zTBshZh#n&}RDl7SXD zK>lcQr&Uo_E2rOa18$-T6?;N-NIZQnzwwBBqe9+Q6~9gnw-h#xl) z4k3}G@&aUZ#*({}%UB_QxnQOJg*rDVI+@Nr^z*i7o`rHOAMWK)thUIn`%7p|-+X;A z@jJw+#Jm(wfI)hEPNErs3@dU~obzdfw|-?C3=u{Y1*;yH^{ z<(EGKf3MSE{)Ne>|3u_}TmDoXHEa=#vCk|}SL9SQMajMD6PXautW`8im=F*!8SMN- z$P!JLakz=a8QL4$VPCM@?gwP|BbhkKxdo?(UHB4SChR3d~r zzt=DQu6q2;HQ9XmU?~tg?^qdQi2alD6I`ig}X)z zTc~+toV-#7v|NBn-SUCyF4`wG95hhw zdHVW;nvLxS)jpaZL-RkialNoY@42Sk@P<``o^J7;YjxC(_Zogws5Zsn zy3-J3xifX0o6)H?!!F9fh!IiMrg6pE?SxAJ zJJl&&Yk~#cd~Nzq6*n`96= zA{?aW3uLZ}3=5&RhJj0ExQAdPJ8MyN*zVv+S+=iC**dONaBOaHzcb3rywNFsfPSlH zEMwum`lg#Rso6`F**UG_YlON;?{1i5%jCiM*hz&>h?2y}Bb*u$*+N|=3=*nLUUaNe z3Y047ktSQcv_SohMD&7zJr09*pRk9@0Lxl)~JH1gRc$^YG0tcxS zvMx_}cnp zyj5Y&-a_^GNJI7f>z9Y&IPu{=zEOTwr)Yr<#adhE{^Y55`JiUX&N?q_Mv;h3bh%bvLdfMp#RV#Mx(T0yN%` zRtDP26-O$3vNoxfV;@K_o*I8Kl|N_?d-Y8G*-I$Pyu#x2+nN2<-ts@r9Q!Ah?XQ{& zvACV}?@xsOvT^@ePnnV&;z!{zdI`5^Zt2a#?y9Gi9*HqWEY?J^)KLaaTXJqzD#f%w zde!1Z3k>|aFBZYZ5FSqDg7&oSbjCZ2d-`~N0oIR}Dw;4_9RfIQOmEW{ZjT=!4D#5v z&bel@3IlM#sy*S72$8(omgh)S2#dkyEN!CQO0ZQg#%uYLIK@RU+= z0Y5RKTkbi8DoeQn3HIW1%|qW?F|zMk3&k4>bZTdx`9-;*N&{;jFdfA-7m70vc^O{U ze;^Ttulm*0K9tZ%vkj*f4Bg~AvEm8Vx2HdgFL*#oNZs^4-SU(-ZZ$}>`}uyb~tqo>77@C535 zRjn7KSZeUcM1d??WUiPo`oR51(LV8`ga4JoSOEVo+SdL%(f+-sXkuhy;rf3@c*io> z4)P<2eEJ{#Rv}3^enhO+d;&?#36KbKB=HAqCXAv-+RYLBHWUtiI8=kN3c)dyA7Xlb zr!!A;XXySEo*=jZVuAMAj=rXYKb9CQt>*DSOs zi1oFVrQL-h)Y)7p%2vV-e%B*h_{qpo-h_0Hbo#{q4Y`QVZiV{_@*TUZi#~LxN_Dr1 z3}9KgJZXIYe$;;vLEnY`6$z4NSp>KsCO=ct{ns_Yp`_6=W&n9~?LVH`u$Bcv?r&Ad z00#o%{Ws3+ZxvAaJ8PlYaqZGpxe3P?+z@Hi1|t~;B3K5(A|U34+X|qyb(3&|dD(}* zL;qeG5uP?Yj4u7AFv>I)T6i~*+?&m0=K4Evxy_!qn$y$k1x_E#js%D*GZSTnMk-i1 zgM~(dM^m)t1%x_arb9bIlcGp7GTTA!oxL7*)Ccpu0nX`U@au-kPPZdnb}i$Z@))J@0d0=$t?q|ABMh^2WwMM$;|{Vvz~afG?p8+zi@o*g9S zG&fiGjZ}x`49G~<3mb>OD11H6Vp5Hg*BW5?VA<}MhN?C* zQ0v}mO3q`3PJ9YZNYPTU>KyfZ)EJ-zVd3e=8`Q3HFf@x>ln(9q{J6LQCSa;wvHAv} zVi9`3!z$lyJfD`QO*2}bKE3p!OF7rc|9?1p$LL7+uHCm|+qP}nwr$($bUI0e9orS# zwr$(ClMXs(J!e1f9%HZZ?DxFuj8R|iyT)B#>bhplS@S=CGufM>QkIzc+wVyb7Wy%k z1zVZvEPqh>ZLoR*^z=iV-;kg1mjP+BGMqS$p7~Lgo-W_EPDyelncngbw{PJ@zKdQG z_;^xy#a%i)N>Rxr5s~fG;FW~q3B}E=(V$XU&-LW*NsM!gC78+(6aH*e17()?43V{z z308DABLP0cm4?UZ%UHmBiF(v&%6Jo#6U+4g7w$Vv{KM`s3ErRvXCk0^4%k##vhsfY z9OQ8!welBlmo3O#9HpGA`KFMT_j3W9U(EctMwx}N47)W7NSmBP`SzXZ@|^i77!sx6 zd%3lI@flQMK7>Kf-+lTk+dH?jM#@bF*QH7C}@RDQ?=VNXz; z=2#iwdmNpf>Yz~Ie9r`rwBOU^^C-we;qc5131{|EVxHPiY?S^biH zoRx}J5H8x*F&PlXo0}Ug=O|c+4s?GNiI_qoRTfwQ*zQWx#=@40(IEoZ=kn3iM@EbT z=a!#->gcj>7#KsZw z5V5r0^mtGhk21r-wD{bG`!4vJC_`Kt@*`-lIjSnZtkn6Vpc?M73L76f3z^18TGS`w zDZ8soyF;D`FgRYTlRD{%cGPYIFt857>L183qV6Jp5>=EAD4~C-53zp8_swXq?{Yx& z#E}J35cO!*f%d4}>R~8&3*hyr-TGk!_7YK)3c;8&JVJdAn+C}%9kqeRyeW4u#%&xT zomaGXaGvgII*9$qs#74z#pKq4d$-uJkX>RTX`*AmtY z0Y*|~fTZPh79YM0)T(K;mQ&t9J%h)oTDKI?r%SFSLB3zi7DtGOD90Psw`9|jRdhJ2 ztz2-{9Gs1I+{f|&RaEQh-P{X8rhc>m)HE2vRnK*h`TDu#8N{G!@7-}a%s1OE{fXnL z@!YBfv3lKrS*FViFlUuM`{$A)&$J4U(?B&!WBSb-^(9GwOA;Da}KTc>7jADZ>g z)UwsPbeLoT)-3gl1ceehnH}7c@R9+4>833<%J>(bA8iD@VGa=G|FJx8VTNinmh!N( z;%-#P$Ns~~`{c|mo){{#G#`N0Z~Lo*bas!YE}fSFb!SbJq2A}U7JE5<3UsN&IyRm1 z0mz7a?@*28;Q(_Am^MJl0r#TC9{}VM)NN2HMWFMde}n>?dGYU6YIWi44B&-Qxv&=p zo=sR{RhqNV7uzRg)58Za$u5yR zovmX~qNFWrs^TjeEN;))1CktRxbt^wV7GTAsl5{;W>L=(-`y*mlPD{O8^~R;mh*-} zIrYnToftm|oL~;A^zR`Ny2Oy^y!DJ7bm3MCL-`&LCKY~-cn)Tw$iE5YB`2<4X}MPfGK)}OE! zZ*QD#x??ymVe1&2N$0%)|J{C-&ZB-79n*QX{jzDUTmjf_O0W2kc(cMWk|FOnZ zs)0xl4<_VUzQ!L(r(n};PxlU2+r&mIjz;t(TXm@?@?KhAgU(*IC@q-K7rO6=FOUK( zjwyb+d|%-AsGb>I_NH;|;($^05HZyf(t3SSl(kL#_yTB-Epu%5@LDVfTh`)Kfny)q z_(r}+CR7kE3I4j)w(V=0JGFuhqG)XQX?Ke!Xi-U|<_8ZR@;^}taQgj2rziy$kA+qo zK97a98HN^uhIj{Lli394Vy;2@>nx1%Q7`(WN{6wfKUc!Mo9`*u3=?DzQO$~uTu6;T zX|Pq26>Net;2@?6Mf5|&2u$t)uNqmRqzaftcC0?ig_`>O`LI2bT>X3i%~x~#RBDtW zMit76HC&eO;!T2O-)$MNw9mOV1sS-voF`O=MKNj&uYUn+H%=F~?r9IwG0WVYE*8_T zBnKS~vbX*~yL~V2{b>^TO?ePJHI15<9J_^-5{CV|yVb5p=n`+#gLnL41~s!4_exx% zqTDrijR=_26{t=ppF4K;u~gcyyB3>{w@UIzN43iLF&QP9dgHnz@1g|y-yFS;-U^C3 zS+>YNRCaeR09YtCLD#2qZ^^=wQM+RjE4>kocLSa}=KT65_! zHg957tl0*Lxq45IPQ0*H{F*L8xxglZy)lkH?5=VS4=35=ZuPck#q;Q~&i5?0z9)=Ll7zwg0DlXOxOpWfjE4!asQJ)CXx;9N3u5L-|C~!4-*LQTD8w zfHy?FwzUR@B~ftoj15D&0M3$L4Z2Xa8a(GNNTfkMBJWzx0#;&1Xqow~VmGcBXc7!l zODNcwiMS{>BH8a{%ECJ<)AijAge^9I6L>rys<3L`;rt`UB7S&QiQYZq)@@^)Hk>CG z`=RQ1)sSX9$`t>dkKz;*7S1d?KLiS`3{6`&isLa4lR`U$Mq4y6WnZ2i??*RdOgAD3 zDTZam#2~%iJW@%-cEltqNA7Ge^xAANIAgN9y7p{Ddz!W4g&0gwvaGRvDuweemL^Wr z6&>ubWJ<)Av5N46(!XB4nEK{529$%`>xg8g8{0BiM|lz&vB4wFg!19}oxieS!CD)$o}uq&4xJiEXM~?fFwZL37G(6(=+#Y0 zder^0HCz&rpWySP;#ZM(!n<%03>t5iXRSaqk(A36i$pT9oFH)yvJ}9O@W6XGeFV=T zWvg6K`~BPAXmqvXhqgbM^W=c%rSxu^1?6fHCZZHnYMMxv%1|e_S#<&Z&8Y!37tnvw zM3lx|nz;FQ{pTV{_4&<>kmWJ)ZS&=WSBwNpYERWim+`}h+`yth2NZ?Mqz#>Wts7;a z+dH$*`h&x<;+TauBe9ypHimG#nBOPwz$ZUk-}>Mhqog)B$PRni&>n+#Ql@RBpJ{A>XS6$sLS9{w9 zc0O_Hz)WGfgw$=&A7L>{~GZF8|4t^h_2jNZTsgrwE}1_s|sZ z>vtz+E~UWaQ3rOQCG(;4`c!K&d)OnVpp;3=8j%9+d)wg+$rM#rqC5WYdLwDt_o2fb zIo~hmA!?8w}qL9 zyOZmGo#AQHa8O$iM*d#S@XLXWLE{#~zhV`WTmrd|G#{f-SDa=)n(aIE*&IN|P0_HI zXfM|V68&Qr=~jy8x+uGB|FtN|yuQV&<%Qobv#Tq&r~B(0bEqsl%x2QQCO$1I3;eDp zenD%ZFlHOK$Ae3>34csSnzXQ(NMGSkKiFdIMT4#J*5*HR4$!eC#irrKmg(IV?FdHJ z8^uF*rZdeUh6gdrht(A;ZO!Yp6;~b-fYKG_E%-h~w!&0~IxUW?_Muckmw}fMF>#BH zzYIQaklF#iR2|NVi@0J}6I#pq$nHe(A;E8^#le{F zio`FuW)qlHVy(6nWDblMmIBhy2imuIb(U}w3?$|XW5pq{Njh!iJMDG){fM6>w6fmC z#xg^!Ids}8D#LKH0JT+WF(er1?|>JEAM z`C^Y!SokO^d5E_QI4ZF`^*MxKOSVJ^SL!uR{S!zoueOC?G_6Sw2;zcVo?``-J~=?L zVc*=1yRI!2ECde3cU%ohEtrJG7kRmgv}*e5g{@lV$E7x{Y6z*WN#@zH&-$x7-&&^f zKY~UZme}Jd8-szm$X;JN+sdlEoiygukPXQPRF!FdGt3(fn=aXmEEw=sD6&Q75+J2T z_o7$^;oTzebC(eFvWrM+nUk>uKaNI_kjDeXUgeCv9eHlKy64JA_o+P#vmhzAQFhif7Wojg|DLQlXPChJwbIZIwRuy*h3ZC z!c{Ba4oe#c{Cb8KKUM4&S1*ijtz1H2Zta4I?CclLPkc8v@Kfn05Lm zw)x+t(L$3#|4tcVudN9!v)G((jkkduiDwtp1T2F!El?RO)V6-gBEd;$nxNmp0)8TV zvRv^%G-e(A=7syu}{=vH7a6A|oD~*nZZr{R*6jRH3Jd=eDGsD8*8Q7^(Ikz znfaKnF%!l~h3MDOQvyof@MNNl;H1bJ*Poi@sSGn#(n-1ZR-5qt6Py?&z0AsWxC!q; zbl8l9-Z_qQoT&&6T|>$l=PrG>W%&(Q z`w2V9m^RzB{A+vZjXjUO47>gZZ?Uu&T`!4ykH2!wrD8ho&!B@oEUt}CkUnK&Bp%<3^VybF2)uvI$=9(7~A zvhW#kJr(QmWA>+3gXMIN)C!w+Qc>M`dHaT$rfIymu)))I9Hy4{KC~6wjx>Lmhz`24 zao5Pre1~8*GtwH=1*W^u?i1!YopFh9xTD-4hn-VNmijvP+CO5Km9wtdeTKZoeq{z( zBp#@v9<3Gzv0j%QbO-tH&(<36lF&j<8>@>g^(tvE-j4RpXy+e$-?WYDYhE+iy$F>i>p1a7HkI(rf?e;r* zBPh+tg8Rv{*N-pJiA3`Jl6Llw@lF z$QU{Z4T5`QlV8|rM3Ui{G=5Dhg%%{q7)FvNU-U;~l65lURyu*m|3ls$d+qON3KzeL z_~zOX&Ulp<2uF{#B@x}-WbTg#RwVYs4M)%M!YADXqV zAPZXqp5yMtlhdHS7WsFwf!`>%jZMu=^Re^PQJE9+SXd&z`iM*lmQUnYntyILKAFzE z=e)c>Tz=f1th|6+0 z+;#Ll<2nau&8PIPv##_#VtGRGIszSIY@k3!u9w z0lBRSag)1LV2Y4s9a}bCWtHs~xk;*?>*`vQSa*8IqLm`#_D>WOo2TE;3-3XL^&b#E zn&Y8&xNk(1qIu&fmUBd$QK{o=)|xqvQ5GIS%SRAQ$PWrN!~sXTBNh7mjxjMP1Sg|x zZalQ?*S0n&uf{%4I`grIwun`pzgUI!u;^;~*LHjg8?`VqCydjq%cY zeZXQ+-C1n%V5UF`=%Rkr=*6`-@P6f2JQn&kY{>Ztj1U-bcB_ z06BrbS@94nE+NXG{}LI-QZT9h`M^=)!8X%Xu4JA|ukM%dj(nVNelG&=UrbvSs?0^6 zuvVhBn{;kwS!ZPU07jq-&C_S`xpOZkK!2?lwa(QxkN$NoUdMa$zq#+0);71TzTtrBAd?sNUGQOJBf9v zh8|3ix3gc2mm|v^?4RacAJ=BocTkfM=$GPRU{QvnSm8C$)EpPM0j=fEZr>TCP^JgH zBW6y%#EcLCnT$K#twmCN{Jje&%`fQ0@|54GuuM|C?iWd?xYtHqqBBy$;WrvrF6H`o ze~dxH`(`kZ6k-MNG+5OFNNcgo0#Rux+0#{#XL?-fq0k&8!wR5zbV95|Zlp`$*9L(X zvI9cd1iUGz!yb1$2k1(?Y8uHc0;xm1_aWo*a@cjgE#wkz+njfy6Ks50n^8vhKxpLh zZ9WWas=^~}rM+nE1v^VHZcuDll^UN8QFqL`gm1v>@VuR!w#?L)Z8_3bU;A;GT6mKN zr%<$(ptb2@lbZGhCPJE-pHCxEjg|nfduZ7 zHx9#xApdwhkr|I)9TL@C3<&<94ZbJ}fj3mx9V73ZVEZje`yC2}kOY!o!Q;v3KHcNo z3Nhh6x&XqyRDW(+RmSRsWQ%jP=e$S+?|E8h(?{X@Fu#s*(6*o=LXmx;O^z_V$gfON;Be9(pm_c zb-4J~-=+&ZxrZgIK)!uT{wHunH3t)W`~N?1MO6d4f6d`?=``5L_n6r^Ea=_>C7nfb z3yYA7(J>34X&A0H$k{Sz8u%=%R_1e$)cT-y7*3UFx3|dE$-|SLO>Rcg`A)J3u9u!# zZoV0sH9#WK`FQV}O-U_`KmzLv%(Aat>o9UcW{_YEH)JK!u1>WBM)PxI5yfYi>u2i% zOb{jVAHIY8o(c1bHaHZp6{u3Y{1Vt%h&V4f&c};ldwkD@_lfC}sbJRUe zumA&0SyxYM!Lo6*w5cF7P1j}syZ9MPdPdif-6JkD5;6o6CO_MRlPWfxEF)-?6Umex z1N*_x?$1wwzqMe5w!H=NfUxlaez_D#6B4*i*4fs?V4pu(A?w{cp|>APl+Zz|1r_a= zRZ+FnbWCw-$HFpHrz!tucZ{w&XxSMNi3JROiT*f^qUN|xSzfDdRJ%>tIvU;ccj2sk zSF8A$)1TbSGp)WJc2~~hnq3sLPHt_+YyM&O6aA8Cjm7kVgU*<;o&QrOu;mf&M1N_7 z>z_as|9hSMoklR`xS)(KFr#>0+!}{Tt!4w)7{~h~y@a(HnkHW&T$6saYdCg!cQyIy z$17-e5R>r$BuwexPo!NaY)pG>asUJ#r!@SFAeD+bDJHbecQ5bmlN_(>hlgCHToCT? zF~ZeVyg0=!x&v|%e~f6G|&rE4W%S6!FB@3_{Su#KBS}{ zt(3Egl4bCeH-)r7af!T(LZY`b8&}z6yX3nH(6+MCf|?cicVN4E%~XZA;~>0sH8yR_L`1NFULJ9hIz zeB4eodMiT~wJmRREd%~%I=!{&uRlS8B*w2f!gFde9M309>gdI^@@26)xFv2++cBT& zQxd5b`WivKfceJ%O;qHI&rT%{zgkCp2mO5!q)$A%y{4||G(AcYU=N2@*wiabr9903 zp`2Hnr%Ee#fm0@<8pr0}-PTM4|2mc&^N^35vudwSwMpMpmdNYpG^#f*Nu;=bI%JDy zr`%YFAtt^sOq12@0(g02wmhJh<(xKA-o4!!5lJO>ZnI0&e4xhqI>3gA`C`L0XcrnR zu}OJUhV%WXWG{3Xk)Z@V*wg*gZI4u^ z$q@K<@vM(3VOjUA^d%qQTMCMm6honatg9@+gsj}~2`k=htSK8}F&h`$e#NPX^vfT2 zQM$M|aM1OWS2uoX(mJbh~9wf5@b@ZR6f-r9ZwOR6n$4=}lmr&|ToQv^&R4(}y$=J2m=Y zw=M4wqrBEy#+PxU?C7gET1^fF@NVFuM`+JHK5NN{9pRGZsgwK82h=GJOX1RJlhNt8 zuE(L~;mlX>GHm2eQfXddh)NOGG(gR?K4+D*z&B+-Jp&$ZORerOF^r+n-xb-m?qHTKbq=OvZ!k+Q_9;)p84v%WoqPxaOMfj zf2t(u&V7S+;6BVtuzcWK2(ADk9W>ZK=Kb+XBn24Z%A8ySv=uh>E*~!D?xq%me$RIR)wX{^5XN z55cCO*w>GQ;LO&;T{C*_)etJ@-#cT43b6c=u2nbu_>K=>Mxa4-Uu~tmcPQu9ShT(r zk-k2!IcrVh)h<`%VM*M;sc4ZPwd9Y~$ZhMjY1vi#^F>s>H4^Q=X7LV2(0_24JIA%rXvAKl!o zAP6Fg&7z!_QeWXZ#$%fLgr$C+ET~40AZBO>7FsdA=!!fBNlV+PIvw|W9s0+3hWKOo zg4>I{ue4|Xd_NwY#vQra*BS1_ zv3yqf_Ra1WX>>9QW3RVtCpHc*^nCR5Z90dWazPzytzj-&RLx}ziEcNaXcR}@5rsZ3 zHmxwggy#V*P!3NY5Wsp;(v@8{~a>%-=LKu1Knm-Vd~s_5~3mqO$l{y6%mCD zbx~E({exaa_o;e2&lc2A1wm`lxL0HUXDOVUNk)u`^WZy+uA`cyBAM$#}p-s=nRJhNmHEbp+*9e=FIA3+*8^(F%^ zim%;d*l%_Hw9R|n07e;lkHdQdyoUpWx5LdY&|2hbw@f$g&me1rX4<=Odng+ z4o*{iyVHa(4s9`gF|{UYFe|z5-6uWhBE7NVTSrbm0a&cq8Y>uoQU-#BG27MnZetWi z9C&fA`W~0I&tAQKBAOi4o zfn4eB7ip|#4cO6_EY4^Pyvy*F6YjCKBxtGd{KIKMRNk_wGPe;X?_bYJCQrF&30D+H z-)AuNaCkLt${DlIRZI+KLS;U*#K($< z$0ZKdgmp2MnoH!V_Q-c(qA=1ZMfX{K>e#H{WGN+JGL};OTVdhIPN({@e_&O-RMFT*FO{bBU2Ji&}1m$I`VuAoAF>jny~CUBd7U z9*3u7IILTa>1Trc#uf3hzJcGCW} zLW26AAQJzhzy2d4QFTfdUj)0-$w z8*xEEc9hO%OlGtX>J~UyV@35d!CM)sxTCu~zq};9<6Wrb8)xmJFh&E3ARrBnMG1Rb zwaj$`Uh{z4kdI8=OMw*TfFXJOpfixMLCvK)J>51vX4Z;S?K|UG`2~#}HXlk`vJ4-F zko^p|D4U{M`jxFomHB7w63eG_g+ATJgn~P;QGQaR{Fk&j=2KBqK3##Qk#zt&_8-eC z{$GD2q18q6(q?OqMa}tyvTLll4?-Bje6`w}(HO1tbqqF4+8pjH$zGC$o;G_TyZy0J z^CL*$(Kw9+8F%7h{1**n5ZguRQ4zN<Oy$#LcFgcc0j4e*_zk{AG|AKrRLKCI)_2C#>Dh6-RLMS>`CG}5yB z-Pdl@y>80oH;se<@4mA&q^&%06T9EohTejFoaKARsiJEe#@|8Dk^aV-kK56m{41!^ z{Sz$WfBw?{dn}^bf-t&(-aKHLSh*2{COmSzSXy0Nq#Iw@Du3xrd$+G8Gz67OA&Wfu zPU!c3^ehh12go1lk&aAlzM_NRfr0I=Hm?~TzniU(kEc(l9}@gCCg2bKn^=}2*koZ7 z-f9*g*K$&u|eoff>YR14003tyVR`8^eIddNmqhOTfXXi^GJ_oqn#K zr*Wfc=bW|6$`x5AUS*x`nw4^Mz=S1s6;IA*^A>Myu)+6TRdS;Tq_&P3Fe!g35ei<< zQ`Q^CKaB7LCN0nMYwQXx9Z6;?QR5ufIzczu03uuuLj3h>+pH&SN=R}XNkveqdaqCJ zUS<425(@MQL>bnA!+Xl)6o+*cvVE1z51^|>6fOyAeuCtTFpb4?p{Ji@rroPUe&AU+ zKmqZ*?|)GcC3FS^OlbQLRZuMz2B?SGqu~-qq9Z*J@b-HZHs@<2H~>X~ExDBExT1kn zFn?%Dzt5SOY5#VTJ?CkfDFmUj;EA|%Lo-zd%hW5D3JW_DA1e}!o<)KxEEQO!y}!@b zYpj^>f%RoOOjkaIXRg+o>9sDhM)1hoSUhT$(3~`@ z>n;flkk36Qu1ZympDR%U{;`;v_`sdlrV2%9KP)z1G1E^CfL~}#dlV<3Ig3yQkWa|x zw<_Vp)159M0wg$eNN{gX+*_o*GIblpetFNSX#gwqdJ!g3xzLno=XMKe)T4Zx7DcMd z1I3QvQwOW(x0y^ygSFU0SHP=f;@7aZF=+Oi(NVUu=wtQ}uPI$0RCBnKnGBAjqZcVM zF|E)zDZeLz+mMeowwefe*Fa@m|D*%!vlV*%{N@}9ptQ%(I&?F+zfvH6$NNA1!>g}o zW&4+Z9>M=X`|m&d=f6cAs!llm%RmS0GKuXnM6;^8#KJ*~G#p5E!V>hlA?WDJbg9== zcjN?z-f>sTcS60OBqW9Nk)#;Q{^Amq;C1lf;&e`i3v0L*OgNl)Z@qa0JXpS2CxP4FGitN3Z}} zxwrkbydBIwL?=J>bel577f&Bzj~vXAd;uBx2fd(k2vYdm`8|QX*AI)<5>m*9vv<{jC4e88g;x=ke$$O#WCv;OJIto%+vWqHHRUU>ZrWHn6}X5Nk9KD* z%-Z%g4jE8aZB2QyIJ=l%SE7&N3A%=vIUXBAq+;eO6c@j$qQ`#<9cx+M(s~0a+ujU& zRoI@REpCkK;3=N#f9cyP>oRCx*r-LL62dQ*;uU2*Te&Ti!=WYkI^PrjkWaKhufObBY_$1ML|= zw`e-_kUxM&ma;ml<(>zH9CAxjI@3B^7AUwSF=H4^eqqT>cUR*CxM@qrdqz&`K`{gR zh?IgJa9;f(r_J34MuX$)8{g4?XALiaX;ux-qYUHfej@)iQR+tCVi_`0@==}QFWU!Y z97fg9j}(|oXj0#YIcis}!!~ZDn{|;`r@t3xd1uiy&Hy#ar_f)ClC><1>lFBhq z5zv2%YH$E=HoPOfT63DIqQyT8lmPvPmjHD5*-)$KIKvwy-P2?k$#6#1weep!r?NCSCMZ_f=mxX z*`HP5z8?*LY>W8Tu~TRB0o$p@2BzcCeojd{cPU49jLBFvMVIFai((;#{K;Z7z9a0) zX^3;d_Fl@8mYraXai&NjrP#KcVrz%rF(ZnW7sfW0o@bzy>^UFMR{|F7=<0+p zpf$t;nk>D`%;IfN$U!F2AR_FF$vVgi%7qYfxk($5tE(d-*T z#1-I2j)1tFbG<$(N|<=cwwT@MUMJ*PbX9T`B7EgcCA%RM*C8(wD#OUVAN|l?48kH2eP(vf+O; z$p4IN=+$7!p-@5jRADRB3#HH(`Yb~)XpMqtN~4f5-~DTCE?VAld{Xkx>PhAnD3m88 z>udE(nLKp<+2mT_#caCGD~*V2We22l_yO0H9;zY1n4?ekXGzF8o`rhdh%wtleH9^z zU~L=uWOH)-jpTsYS^K`WTk%|T0MM_$3^_K@g+)21_Cto-t@LV0@5sDoHkE*^`z?q8 z`e_pT46*Un(ABDCt7SmFB3|=5bNyMwJZlSWidd7*p5&2Rd($2+k+0%@@$Iq8IiSpIU^t#N}TQ2?6hSFQ|_4Z4P9RCyVtP7uspXL2LR=wUxiv059$=W*z_Di}S{cA29 zsfSEzA-X*)c1@{8b7i?kcxOBYr@3iXhA3V+mSwj6Y5 zs7pT21B6e9nJ*{f6s<7fxtP@C6_aq#qNPqD0O&rX=;r1Zo!LzPo6Cl~a0 zR&Qj2$%0;F?1-!lR_$(zfuDcw(0cioQJI-HBDm#yxKi`B z1A2UnjkkM$28F>JKp1+2YPi1w{qpz$>eDVE)9afap?13{Vmpj0(*S1!L(ISx9Pdfy zL%d}Nk4DNSYM*D9fwvG~pq%$x>zGqKeNCfg``CRFkg9?8$06OM zHcvwbtsdq*8gz=5S3Tk*vyu)T3}R1vo+h_}WiYjfOh6Y!?xfgDx_%rLe#_@9e9G2B z>C~ayYC+z~FuApBpy_esX)Mi)*Z@%EFQXx^r|ED;sGi)$kb5XylN!X$lD4d(lp#qORd;kox^~zyxLL`(ds(Y(Z;$zgy?6pBhc)pe?LUB`bZiza}6w z@ZQ1IZ{a=#?WE?9n8K{W@I@o3!&u3t?b)|8;xptk<};3Y zl=+L(kH4X2@h6sIIsS^rSn&Uojh{~D7WPd4ZZ6q4IV$|?`rlL2ntK0lPw8+p{*v19 zqB%%;oxBl7aelaKZk{|OMZfpgg>X`_$HF{qN&>Y@iBa8G@JJ@O} zps|XG%1}JHqjBg_Caq%`cgA2?>(o5~h8QiY0dwtoD5|_+CAoz5frY^k0F*C6VKW(d zVoF;2gzJ}|WV1c@h0fNCy;Xpy=u6{;y8pmk>Mz$NQn`&J;v@1wx6t&pi^pby1z%#3 zg;Yic#x29N%mu4da`*Ve6Q;^44f`26lyZIgOcyEP#q@GxGwsympL^ z&}mj9!A5SvY&?!(3b9fLCCOT13qghQmTprgg;|rm3#j85H4|RWlxtqnCqf75o_+VB zqs4@0lf4#axufS4qh7J!4owHZ#%GNIR%cqZI!5E(VWq8~wTQ^5c)LuUFA zJA6E>>2gWdER(cqJA?nX>sxZ1?zH|fvEP_~dl#}F9iKX`&J-tIzQzDCK+eDVpg_0W zYyjOUY7t)?&NN=kSzB{D!%|GW17(ulNmp;{jgSIQ3B?N6_!HiXm92T%n8VhDDx<xiw)k+Wbhodq{UhB!%K?6^N*;^1-;g-`qm|gB z4>|#E+)R5(4%P4(EpJ0%BA5K-KO{O1K7)^)1DT&ctBHjH>VpZEMVOjgXSNWzwy*HH z3+h~%i4P1jw+2f6-NgYh2}Ui_CD4LQl_*8lf)9N3rLP1V8m9V`4Gk#X_cf%iq!!MyzjeU-XIHiWoKF2o*VDQ3U& zo7>61DYhb>?OD!OniCtudh5gd6!ZmveqJ!Vu?ye;mEvP4!K{{135a|^&!9|v zvz8Ts{LyHQwj5y5@hsMXs3o4uVu{0oI>iJRI=-1uGRNIX6W=k%{q;23obbL0aq5`WcPwHtkhn2v;%pP* z(7!%a0_+SPOoyB(0E;;N+bH@rqG* z;EW;+*M}!4o`rDaut@vkM!^wj7Hu824O)g1YJt zdJTI;I;uj;*|q{MQb#CxB0@qZQ>D=B-*zUD5B*Ul`S*elf&W=3mi+6c_`h#TTm0*d z|C%SsPPF^ip)A18m_EV}5mT zayqbMR}$cid#94pIwoCtB%}^Xxh@Ihm@!#<)8!~ILD_SP^FG}X*|xwUVlYb_INn%Gb;-0(9;^*N9bk68!@iiDc z)^wP&4c0~Pm}#R?-L73Z3~z9zx2=3>o}GAy61_( z!gT3a5M6R~tw?(zl1i;84;FvJ)E821dYNxGE5?7aLO`PmTae0vST;sR$>^6GN3Iud zm)KqQBZ{y`*_#w8SL zGu|YR_yE~ahS@@!+I7Nj(@M_S+K zmVxzBv8J@bw*2s1@;v{XKG7wOgty>CVToZ4ccADk9A(D5)KZY+V7)z^s2WE0B4&fw zH0eA1{OeLg-P&0N>h&F#o|?ggC3l?WRF=b8ThdV>V}++C+aiV7#T^*+-TDHVRfu6qu>Efv>~Sn%V|BVA(9z!CxUXqK;#e!_?7~Hy6YgcVOYg$E@r2 z=`Ib!2frS(Q`ud}t+!gVXPl|R^lcB4SNX0i8#pZAH)ohQIR${hD@97c^dDvG-%tfP z;@Rd1nTNNgq)ygaMU8k~ zk&@{QKqXmKq82^mkocVIonR|jotEdD%K}{1=4Gt?_6;@Z+S?_fXghn_XL7DM$Et{f zRUquVbN7@v+~%1ZJ8h%aeyav~mQnIi)_aub(V=f~_+n*ihx*}2VXvQ~A6>}Py?%Sa z(QTHK(bM6GUTbb2u7VXDl!7JP1^zVimgeIv+%@yh-&LD*R+H_sYGvAUgD~2aJFm<> zmwA=#TX~i2Yk5`d)0mts^RE_LbJG_A{e&;cp$oukIV-|okmG3K>fFYD7J6DQ;8XXa z+n079F{^2VJPj#+2cRu;xN%e}r6AtH$o$a)*#< z?JX8!t(wL;voqK#ePt6)19YhURg&&;4UEwHb z0!dPEyrZ8L8sn_ABv+xvt+RpqoA036fXeIS;HdK?3AZQGDL{PGW1Z+ z3EJI?+j585#XYGBUo$de{>;c6Ir7Vq zgg+fnSt1QB{M$>s&9_v&YUAk0Fo%M%6oNDGqbSV_IZWi~5z~{G4tk{s2@{0OIAnvn zg57HEfdTt+DT|rGCbIq%xohA?>G_O3(^AH;i%glv+mr4El`+)l)QDABK*d|o)%1~x zvS^_8$Vu)|g&(3N7ZU+Wye0Hwe>}jevRJAIdGptNMG=R-_N6>P*f%^))b*|@74nu`>)99bg6PbgQ!xH#^Lf~&8|M}b4 zTYzZCpYWeDxBq8N`u|Y`{-YcG|H2gk(rl;%n_I!cdgMW*xx0@WfB4BJ&3<}P8-)^>> z8I6br4Q$32M7N#qksx$On3YskF>bUfTNfxAS+20V47!X zF+OU&V!Z$r2`;fUEmvtS_|#t=EIVU+4oaD5V5c|i^Pl*`J++y%^+F#K1swV>{E=}Z zzmS1xm-H9@c;wSEX|>tBorl%P#0*#IRAW5{Ss0mGl1ljte`wIgOuJ{5>FZ65_ZQTe zWLv|YO}L5zY4b;jnnKA2u_ci39P|=B)w)Dpr!n-K0+mM#Q}nAxwWlAKfR&b;F=MLq zegbDWOg}NDf9Xl%rrBduH_N0`QJAJMi<+=hk&VYV&8`~7up{^QS0OFbARYe@VR9%V ztuWS-9l>r(cZV{{*=0~uY20A*xM(*)`TcFChM&<)`TiI92*&w$gh>D2WAC4lrv~kv zw1V=p$859sd_|S4rbP}BvZy*Jg&b*a4h^=1nu)3^-!)%M5Kl@iQNW0o)!re)hUY|n zXvK+_RnAUwV|6xsN@kIgYp7 z-#iZwLvcXqbhFcA?q7*nWE~!nS$YmnR%n_J%t~|Z`(sVp+-Lny9mSzhVPRn&m!P(~ z&I(V6Y;;afkCr;6Um+_$ zmx0iJMzdM6!Rb$^zjj><*CKdve|AFr_Hj(Vmm=IUo^qk@j`XHEu7wjheq0Ty-hLbo zfp34VhFx#@oDGYh@eYhoaa|3W7(m+*w%4%<$3mEbbF#E;AF~G!;APP=g?VkH+qDb% z&9{*qm4;;)W)9i75!^;*2 z+&yLJSMg>I@RBT*o*eDU`ii<1uHNXLSaWxJDtl}|DZo0pylG|vup>>x`%zCu*NFFD z?VxO7Jq-ukhmpj|iXOy+_+|YVMQzNw^!j^A(s#voDDB2HfJV3AXm4;f*_V45)U`xu9Ee>kN zX-GWh-*U9$dRZI_#*!t~QbYh0bMo?XlhOyZVctd{4(;g}k}5I;id#}Gif}h7sV#>o1*hAEAOUN`89E-W;s7*T-%$wEqGbid%~svalXg5+~@Q2V6%r%Ift|_l*w=UeoG@f-_M9z*lQqNZW+p#a2;Y$P0gxm6)R7 zv~-0rbXA$AE{E9(iCohVR|YoXO~KE*4NpUUw?;cY5*20TqpW|28}KoxUc#8@`ZBMy zH}LgxRBtuO>eXqGQhG_3p*LxqFmYJ~(~4iTo`*FsXKJSSghCUVLb6S;nU?i%84gfO zh1M8P2s`>Ya0)P8)OY5a7b#7+5n1dM$$7-W6Nqhkwr0*nwxF-T4wfZDl~FJ$Wo@_) z(kWt}SU4JN;zvD~iy$%5SrE|JK!pn_FHYbBVngDpgf&~pC(lAvG3Cr7@n4pDCN97l zn2>8IwbNjbGza^7f{w0X`;=lmGl@?gw=$qUC5QDi=o6p7Cy_&@2_G#yD|)cTqM8tE zG0U3LTtrX^sNpZjC3XHeisejb+91OWWET^H;KB6l*a$BV3WZiDibxK{YS0?uX%`y8y><<+z_djqQxLLdkda;!W^r|J%IXi4a||;_ z*GFn|Y|6;GVHeY1bXXD@61Xm@zK#uL)}FhXgJ)tgv!e4nlx+du+WMq76%*a(q&^?F|*UUb*+N zwKX-E$quw$ImuM#??o)zhXd4OZtmrDw*7-l*?U!`By3-^LeXP+xwJ@`LqnA{Yr^Gh z%5tJRVIIH9YF#)~alo*9A?QG9l1M6B)E_C*{cWgS5do%6M1M3)S=nEWRJ)z2K6uNU zlcpP~b5M*tltJ5M5+O{D9o>|+ier#JYxmywje%gi-F?r`JR*WGS4ZLe>V-7XtM5sC zP~B+I!}ohxGi-$dIx3FJCV*Is|LH{Btx5KZ*HQj7thhU>0>Odom$QXLBYo*&nj#WN zr+jRLdYn@@ZyGPAHGACXPU%D0gGOvjDytFSVd6{Q8ZOI$7@TO#U*2^bLs#gJSe3M@B8YxFL zBD9J{Rlyb#dn z6eX>WU#|-Ngd8g({#Ov*Js>%SQCRt)jMajQ*y30VdP6BtyH(ONbv_UsC>X~kT3)!> z$!bNbr&#?T$Y)i>Eow)Yz_entbM~>7FxeaSSP->m==NIVH0ZZiVB3tKXNvY8d6T18 zBt7Afb0+&8_BDgQLj%yrw#+ilZpigszWbhB`oEp6hOLB~sa!g)qnABmX=)aIQ5TLSmb z;zAm2>{1;k6+c9!PO_~}plMR<7?aVG$lPm-S%VBeo%A?C+*oH(NV5@v&rE^G>Y~X> z{xE5u9L^ zE_5jXPA8cG**m71(BJM-|Jfn+DJ$^nD!5blyxuFcKGCB7^P6V7AUSQQ_DgWmB;Ec7 zmXhKP-FG3tmM@gg(SV9KiO0Uoq<^Xj*d?t*z)eF>_hjSj26u78DSFC^Uq{zX3sW({ zX8ccTsQ1=pe5ADyE^$s+tiiad$+%l}17%YK7^KxXx_TDMDv#*!bXKF;*{1K5%uU0y zxJj!RZj*BFTBoSY4Z1d~W}{ONheo#axrRy|@XTpz_DHjdKU;X6Z)E2o*b|hjOlWxx#K7?MHb;1 zOrRDQms`(ES=_;E7;cwa4(4<&#&ofu4@Cn&g)(tV0)?_z{k+k&b$C>h`t%AN@*}Pr z0H~{NSm}n*^P1-LTatYX&X2iymLKZMdu-DK4^Q=Of6?x6759kByD8;Py@Ious&tmBV1^OH6jyAc84b3+xcDhT6>zFPp&>oE)+mmv105?gIr2Zk2@N@!akH!WG!QHVB)B~$Zncs@n32E`B8{MfdH0jOIWjO-Dg*vp$PWsS-Hu_MWm zG*GpNc30E-#0kO`HSz|>6*Ubb4JKS!20#)+Leg-@<#4EJ0<5%f33UR} zA{k|an)ERl5QxsP&DO-v?z`RVH}Y!mWrKt-m^c8Hdzkx-tNd7?Mtk#8AMa zOv-Z&{3wGK##(VaxQf4b!l*9v^#8H^jFk6*d%Nk14y)36peljoW(x<{AgC!a7{lk> z5G1__sVb&Y)~i*`NDk3t$3*h@6QQ{&io>iB$LPRFIbyvG{R=gm!yMUZf%eoOCp`|< z5Rf%ODIOWxA%cCy`OgjgVIweKlEVf?!_CmMf%y^-oPnpnlX`E#ucDzy8L=lwBHE>6 z%;$h6JS%cIE4<(@S@=?+`fy=iTB9fE&KeF*)=!8a?jy7XwB-?xkDtF0y5!H+HrapK zaFG93gszgafwPO#zec+{=Gr32-==rpCT>aAoun47OPi#sY!MfmtC}noFNKk>`+-~WmUX)91E9Vj1pD+(1nZv>PON)+K`a0(GTVMq~X zPg7UKv2;q8!HtZ&>1-yZGcGe*UTtnCxPDfc5%@tHgl$|Q03V0zVH|{KCSvche6{Pt zWt~_fhI)d~PlK^n@155%mnuVZV_YNi*BqWwlWW&g>!}5)qEId?)Dh!s0!7yAL<>2` zafrm0D=ZSYAs82tvDTPEWf1g2leG+I*tsM1B3Lr&GIpNp>13KAG~OT>g0=e{VC-NB z^xCWTO}u6FL6e@t1SX)UL9ZEEa$hru*^Anlu|5Xosl@bRSwzpwAnjQV3((8Vs)Wx~7^(1Hvk;rX$uki%)FbFlwDUq9NIC$3S zrgnu$)7i-}4$Iuh4w3(o#qf-1-sq-}*%%f2E@zHgNxg2!<|v$ce&wuHpf7{H>Q^+L zaI|{eo8u|=nj*tp>bc)%p;WI{BtO*B7Y;v>j06^2+_Xb8H`ou9m&U3OeaC7^KIRjBie$7Y)b|Jr zp9~A16bqji3!b^U{&N+lbn=jX5+}b=O7B^4N7>v#_6`)h<(hSi*>wmP{fIUF206Z> z-^dxy95D3u)f%;j>4xWkmh3Y`)VZRXUaE6#^d&+rV@)c#kSn+5H<4q4e@9#;?|WuA z7kXjYrk?N#(z?5EcJ3YgKwt~{*ue8Pep>ZwCa>kgZaG9zhtM}Cv-a;L;t*E0eMA23 zI<5EFEin)P01D{8^PKB{Bt2yVCo2JGJDdNytNC{hv*w>1CSGwdO|UrueAWCvNz6-A zaM%AqVn&G@XKZb}ahuI%WaRbregoVi$3@aRtPS@NGPdgl2V~yjrn{RPE(r$>tS9tF zzy5>6WDu&Y(jKVaPU~e)j|L}XKLn1WKIwIAcbf*TSc_mli!mP8fAQ7>(TNKy$T#V_ zD{r`&h#(tU5Z<^eCewDg{Ey9nG30@!w~2Rd2Hb~xA2P+G%_LT#2}qE*Vc-1GI*)yb zxP$!NvtBIni%rVrvQ<~31#;veh?QV`m?{eWP!hdt*Fb+i&F;C>Gq?ns5j5jyA!G8-T!BAhutdBcn zcv?~Rqa>RfbDj-*plK{3-C{A?X`YSy<^r}e0PtvytgzFr& z8LQhWA$R`s8O`sw7SReCO&*SYH!6pa6=ecAQ?pdd__M4m$q0V*09 zs|O9-W(p4LwE|hS=tP-|9R*A7SbDtbLuMJOsDEXAwPDDz-oVp#(GhcFs?X=bqXDh^ zuDic%Y<>sAaltx&jJebu#)&Cl!CJ$RIP@&HTO#m@jbi>#x! zYjdk?tZvG`U7UaEjwO5k$e~JFWRv#k_-C0O)bo;2voMwP@o0IuSMgXmZ_mN?2!!IZ za~2!+WUQ+p*>ZSq&W$4BYJsA^(ooT^d*dac*4tlIQfBy-1%c_ODhsj@y*-4!Dj^V!;UZB7!IBF8Hu=-3&An|F7l3fC(zMK4SSFAY33vxP zsP6SdFay47l&srKAU|>*Fsi+5xB;NWh+FUmJ)zV! znnGX`QhGFlZ3Saoqp#@9tk}cDLW8FGT<-_?qJ~E?UO-UbybPtjU+NBW5*H=%eZ^ikTm=iX68faT-^bt4G_4 z^G*qLVRh%QFGYWMS}TNuD~||a{)jna;NhK1*Cw%x9XlN|_l|gH-zGK!dj1Ud|5;=I zjRmGxfqLC`4oT2ifQTCIRo<^%BdYSKhe`CzsV!~t{kLwQ&(ok{fY9O+HSq8LLeAP!9Xoc4(+Y~^A z7%qWnVijYyxJabdqq{O~z`h%a<~$Vmg~s(h7tE%gzwf`FM*Afnak!<`(@Je&;5pv* znBDQ5Ir(m9_5FPO`2}D%AZ-8w3Th<*W0W((gZif7-G3+$DV#6@7WGS`ZQ_uCj?eJH z0ZNFx;Wi1GcfKtnK1BLV+}WEjUw%WnRBvsU+L!PzP_cwn%$ zx9-fcQ)LEaC)7gajCdSns9*?kY-OjEh(Kitr|q0BnP+FQ3Tz{j{9LufAS)$Xx9)7! zW^J2ws?%z7HM1>5n&ebw${CH=xas4lHrA??b>dH>4ncEopasU&Ob<;_LxG(~y{kr@ z%_VHoTCbw3oAjXOUof^ud&YWI+N{jttaT<+q2X6`W{q03=q%LyiS1=9!thMjC~nxz z^*T7Sv6S?J6{m>ip56LN=s`Sqh46u~l*a?hLbaN6+V)t}2RD_noI^SZ2UT-KqiqW8 zq#O0rl=6!G8r+f_0oMy6q;%5ABbt@x&M!7u(nk~n`Q#NXm!#HnmG&);%tY6rDmJTM zWz{d0ewpxumvpRNT%nB%EQ;gfk>`jb9N8oogK>Np*fUGTbReAM7MxRD#&h?B`OT$~ zu1yN8sxqz~td-nM(glY=rX<=vwk2=n9+n)eEr(P*eUzj2sw3=COw_YSC@4kLwnTM@ zsI?XI^hJl*elzv+_6j2^-8G9PJ%xrqb(H1h^z}3b$MvozTaK_(Gc-@{B~mr;)~qNh z*W&120wpBWUwz*x^M1f!mM)4}74Y6Ow81(pVJq$jRQD2fOC6Mdqa>nQ5sV71GSUpUNYM~CU!W%EjeJP#f`=R<=VS;Y+U2KF z`az|ITV!_6#)B0jpeB^~z%!Ai4o72j4M$TL6_?CDXsBLb`(3RxvvyvjO*bcSKIS0m z(GkT^4bIiKbsd$Zv6m7|SUZKTB09P+wdoZ0Fkt@XXvDqohOQ)SOWcdisg7@ zj^o{i*B$L~!lC;^c$b*&aN1?=n-R{<2iL16c<-W)E`9TjLJ21H|U#t0wnLI5I2-FcK3FxZZZOE(roVGut?JU+!7 zo&=^*&J0c#0OLi#)=)hw9cl%${WGz?Ilg_t(fOs8u|L<~)6U;-#Xsw23bKw_DN_ zL@0a*7#JB^20Crwdd3AYY|d>%8Tc@Gi$CR__dSyLfdF2lV|61`)fZgf;A5++ zTN#sfRrNjn*|n3F*G||}C`cvZpj|FNm2ieRAGi|YhLcx@SkJSVvR__U?7|&dL!MqxC zcI266iuX?2wReT3I}4LKSMj`RV=B&2omc5#Y?*C#dLAG1#7+g|RKu4<$npMsV4&-E z&HeUi;Ym8v%ZkWS78|O~tTjca$&fBRx76rD@oAkpO9<0QV^?NdO{dL@>ZPskMB_}P z*G_{@k)h|uDZrzWHWxz83^PqO>rLfFg8Zw27+a;)tZ80WTFZLURB4^PcRl?xUw#}0 zOA|)pepc16q&fX`7`&dUTr!{dQL62XbXLEtc#?^N=*8_y#Meum)5{;|-^2@t2ew+Oud-j`6K5 z1-0~aoE>_l`$)U#vCWXi>>RBw!xV2-5=DngopmHLiYuR1f!9fQtS=1tGdGPP4qd+3 z*p$1Tfum70=m`o=5qtF!BJcbI0WHPHEwu+_4FwcuRT9Nu?yga&sNXzOY$tsd7$xvKIY`omh zP3)43Tv>G;wRlt4`82;C&6HE`A!<3!;~86OU#<8SHF~xv1AEr7*7pRwdO37{qUWD8 z$gG@`7vMmzM>=Km;l*#F362zh79~fx_^T4u!!1f87IEcQvnbrgk%w7%)Q(tKr!iBe znsXC=v&fk{M3^}WaoM7JqUT-1&Hm zb7|~?pb@Zm&t63%_Du5Z6wz$U7|e2hH_4vm`8o*pjs=<9@jMtS zgdc1v(#C=ul=_OPWsa@jn;<~Acw@Hb4T?JBmozk$KP zWMu$BfJf|40H}ykNzZ)`@Jk+fSS12m2&J1uYBMHs5=uOP@ndqB=jJ;*@39cdEjWim-mDo_>1QH6X` zk2g@jwZX_u+F%l4Hy;nC3L-<2VtnWpejI@sh8nRvwPy`83Arvjq1NafEK*{rQ*gL0 zH3E;4sbjR`Qr*#V#hI(t@*Q~*^xCb>D7fiJ8Or8Dp23lkmbR=`D2&~x#fhbo{#A!} zJ(~oT0a<5D@hr1Z>(acD-t?v6G<%R0qoh0IESuR&Gq*4$-EIyJrF7MAFbO9(wGwre z139yqVc{epwjkJ>FRxxdI3Ye&agcLWaZ1|cyCTfejH$hCuYydW8&I=~qO5{y17_yP zUZ$@s$E>sFie~yDimOAbKgbZ&Ur1@RR^~nrW2k!QCx&RPe6-g#dfF;QNYgui)0cz{M>yaOe;$CZ|?vJOw}Ii=EO8QNkpv;KWr9TR21ye}_=3?# z?^vLtv5q>F7>S9)#xsSL!>AP_bnzGYc8BW07EL&q?U)qQmfAv9tPxH6?9jJhlR?J; z5uLc^h0fOECACnDDLkA*RoH1YLE8oU7RWIg7}&!Qwl3?vRJY;2+IvgD-hLaHX#HG2 z5xez10IsPC%RQxU+Rzv=tF5h+dViiIKx1a&3>HwME};~02gEQfzC&y zc+y{AGBDf`Bd}K^JguG27T^$`HBhO~x=-m^H7EJ?pC2@bkOwTT5vU7;iHh$7;m(<0 z-UpZ3ouw3J?sDq_6l#tt={7X$H?RBi`P#+nRVbt# zZEw!BaTXNoU$dSBP^&M!%34$hIwaO$pEClpzuG8OR@*RlHKfdIN!H#h$Tu{X#aN|= zLoe7H`IsV3-ByOJ8xax_C`?)(6gm5&80;JsG0bfWeYir|ZI6_IEp!tDXilW$iGGCd z*2H-_7`U$WD@0UsY~nJ_&C0syMIg9Feb`lGmhS0_*$=!`m;dx| zFJY%MaQnH|FTbt(it!POioDvfFQz=-4(tv7M)%q97wbN+Ws}+%hNZ!X75ctg7e+-I zRr$S~h-6)L+(447&)W7{&=Y+dX>)x9lSmJc_sO>0rN^((J9o zF45B2@aDhe!MC;?BZ6K=20q0#4M=xnHJqP5=nHLt8O-M%+KLe0t9 zhXt_CAU3zpis;+Jo-WYO#JtGs0f7Lxj|r<^p&m~ryW2-%OoLepcsQj*x}22rJ-*Iy z4->yZI``z3&H;U&1p;sn_v(`6L48_+aZBqSPOpG?6a|~k75IFDdMW0Oct25nw&a}7 zxx7!ibU$&)UfAt=?@I9QPw*a3A$gyQ^L&NnAfKDlavzk!b6*zYI>7iImgFut0(?)) zMxLE!Up;oa`#t#Pve4cK&_F*!(tIc0z9jSYepf{J9+m8Uo|Am$@b{e^@jaZ*>3%}< zJ*(}0#ms%>u>I`ce6Y^s0 z-cmV&TojQ|r*yMs%w$3y{iQ=wwYjNUXSv}IN>G8`wM<@0#rR8!du8heRhK zwsv*KO0A{YkeHK9^U#rTqP*HBtXm3h%%q0TTE<|i`N3&s0L6P#+#=`opry0m8Ou{L zioviao}#36d;zdTN7f#t`iMd)CTuP#2{?WD;-sT#2E&_EMrh?Ti_w(z^+vwX6zPom z6)+qXhx3Mk;3*kK(Z+IdICj3h!W1oroUb&);H+K5j+2xHUd=E|DUbPT5&Ea4_K3otrANK5zBfRx=uDw5q}n(+d3r{ zB_3B2t`mRADb;4-r#^da>7k_~eo0tcl>Ywk4GOI3-ke1sjiv+ zAO+?gfQj^qb^LWhRyxtEq>< z7TOUoA5$yGr`;Ki^{sFnjl!~>v9sj`taU~*=x8e+Z)PKt$o0W1C`30;N9)BDrxP;R z(0x~ZS~B9bhE$>v#R*B_E(LVL~1DaMu> zky3JGzj8b$!!7oer}p7y%C% z>7EEOjLR4kK0Xv7krK*;RVCM=tP%In#$zlKWK2QDSqQTRC(&DS=gB8&W8c`T*fCpR z{HqbIPPF3Ngi-aCIEt5qS#wf`AUv8%VgkkQ%BVy-L#nu^B%%|W#2Ax{O{A=dssL12 zgOYk9Yf;rp#!VY3l|!0M6Wp~g(vHT{G0YiC>r!MmcK2tQC3!q0BPTb3lny5(7{QS# z;+7;TNm)#f@JV2B9*NODOTs(wEpn7wbR4x~Bs>KfjAiu#FNj$vMpkkpy~P<_?j;3k zl1r~8);oh>sOiTqnx}+(BAG!VT&FT8+@5+eYgvd>f?*;j(UmOV-3TqZY>gqS&|eg} z7R!;9q%~rs9P@G+o93RJUK9tx+~oI4>}k7Jaw?h0ttf~~3q&pYnUN+&?c4QOz!iO< zZOrCBU(Wrx(;>{5V4j+exQz*dK>$iCi92r03dB!U>84`K8a9Bkh!`VOiZGAqaI=TC z6LMxPg<0d+o;oUo$eb0ZAT;07L%Rhq1l?0ACv3KMJ_#E^t5MMkASZLjFV*1}GLIi6 zFN_kMT9DMmjbW_|`Uj&;%}xiBG2>ROZFaUXHr5+zOpY>FW$SU-P>Jl#hdSK=aa+S_ zP&W`;*D2vOP8NX7Db(I!a68Q!O$fQ7a%Rp_qpA~BqN*cUqL{@oi%#1d$wqQ+XG{!` zH_3g&`)6O**XrZWd?FueMq6}q5C%oC_Z_e0v@@Qy!29``X$QzX zDtbD-0{&`w{SjpUv67I5vsjR+;GLx`bRqBR0=t)N+!H9n7a@iwjw&XreJTq>pYo)m z_A&Zy1x31Fsjy_siDKJmIT*eR)cu~Hby^A5*ZszB^Se&ZJTWrjbCbqp3kg52Q%0dJ za#p`3%YZF=9u+UTJ?Sz|(W@vs>lzn~5aa+`reqO`Xqnh8V*WVAn#S zs41k{e}n{`UUB&1(r6CvERKW?*@ME5$+X6iP9J|LaW!yko1QyKtzvC6lvrFwx^1Y8 z2)X9@@EVbE(p74Mg+TKUz{v4Aq~>Cvkz=vRXQa$$wImAw`hw+;W<@Z#_12up1HNsC zzG`3XIXSaSt9V_I!E6308T)$ zzjD2&M*)Kt8%N?672yf1a1RD??m7Py9nZT>1rZ`51`8@u<`le+r<%}yEYtzKlo}T^ zn`iC}KArEP5I<8)R~39wNliXs8(ap(SmJ&ip&&qx-8mRS$! zFGPRx3L5xS$Yd4-9b)#tn}Gl;Mc$D!;Rz|2#r*|d_XGhN*gXWxEUEM>f08YF(HTZc zwBn1P^1Qx_2{TraB(k?`(J9%KaZ@a%JFM$ch`Fkvyz!hoXY{=P0WEI++K9Q#ES(q| z`IpiQ`3w(8gQYnF4JbS=bp8r6=nbboQo%$sZWWF?A08JgP_2x7Yf|PxDvi7+4?c$f zC8zeHKUXgroCisE{a#=@`fr}*C|BT5K=w~u%)o?#PUuVB&h%Xq3_rT;Z$$qUK`Z^} zD0@QKXI*e}uNxlqF61H$W#uJ;d6V3=a>e{9(9S~?^hANsw+;Cq-3FIlPnd(HC;V#; zX_jp+>l5I2M8gvF1VvCnMAM~R`5P$R8;IQ3T}!cXDH=H=6?T8M5~Jq|eD&~<-O4}A zSxvsdl#JF~zglg=*reM)a!_HW-_!#;1sU5TjCv}4jU<+>y0X(a^6t`3HBAz;MDq9 zd^qmA2#4SUsnYoI3gS#BNZ1`69@V(s$Lw>lT-lw21Amu4qlb6`y@XX92tYqX>gyN8 zxSJ;r7Bz4IWIc}5p3!gm;6ppy}rfRIe!-tyO;*rluODUU?jf4N6!hN zUV&GS)tDn^aSg)^d}ndotQ8L|?41hQEHhBYle3-4gZMLcn zb3){n^e34-$6S9lLN2sIh+8ATtrHvG^*`^16xlb$zqe5TP;EcA2@jhCxZWbzH@kr2 zYm_!R28_Q8g&S`00Axn@~{h(Zdc#eo1QHreht+ARn z!-<;{9CsRD?4(9lzv;K}XzM8|>EHEEUcJXYg+(P~WQv)`6=bx71$=A4s9(4BMN3)S zfj@`e_Cx3J4aPi&peZX77kVq$-2G*a>tDrp-pL{Cq;lt~yazziF$jtQgRN+>R$~GTk+p-?^;G5py&ueiJURBfN$fRmJ(HFQ-rthd# z9K*eP{~|yP2-joljp55pl;}+h!TUaCqmgjzr2N(&Wa}2L2PTQ#9XVg5JPa53<#CfO z$K#oB`x#WLGg+hj10pIHc%xLmxHJwsXS}a>&{*qlUq~WM`i-*Tkz!@vFVZ(9 z(1)Dc@Qr}T4L+{qUPcvEbL)hmN`n003`)`FQ{B=1$ne)WF5sS;AQC9|Whte_h4Q zQTh)RvhUCx*DaF|1QB_D0gBcWGnL3f^q_!pnM!SC3ID1BuK9r*+a^AAyg~4Loc0H> zhzMT)UnbmKTkpUz3bv=&AEvWzy-udHZFhNnKr3&Jy7)WjM z(*?%)*7~sozr{TnJ*V?gq_SW>Gw&cm12Uh7r`lVn0@b|NNQ}!*+1k4%fHSVS@^M*A z#_#J_@3mT~jMPGB*4y5Ssjz=)&OWyh0&pVt!NsYyA)PDNVyU2$A77!Pm}NK zwjXe+gcT@Pufn|(wCUX5Y`u`j?|x5e7>gwdJbdR>E64RA(-yO1%Y-M~MKVKufiYfmWf1o;aJ4M^-K==| zy01BsuZW<$D1{R^+!bu# zk~?M+EiZf+lUPP^2USbi^31~(v5ORxOE2TyzaF3Z0pufPB%gNH`H>AX8{pU-Cw9*@tvUwpvqp>&Gp z{npT~MzU~Ej_>#(zY>z<)K2VcP{8eZLa^S;LqbD{ZCQ_0p=#dMdwXfZbXuqgA!e^Z%wIZp4!LkJv7l=HyMGao>PGm zX0uS)hBJ*IXZCG5?`5cXL^>xLZxP!fw|TIEc}C}Dq4$*#M4NR9n2+qJ zzbfoy)u|x%c|+c$tq$AhXU$I?pAWRkOir8X&A(>CU37ke6YBI7lVmB&g4E8M_+!AW zI~iaF+Z{E zDLe%rnU2(3p5`^3(H=Y^%rusdyc^RJ)q0-t)LN4K7SW~02|Fx|^e$K5`!)Eu!m`w; ztm7ou7NzadAtpt?+)Z_z$ibjR0k!lXwqmW@Lj|;Qz&wCP>DJw!VnyWzWi#YbRa&NK zFD-?8Z_r}yP-#|aie7n&-dwo&r7{E6ZoEP!5yv@*5m6nY|7p&$4dwIlVcY*(c?pu{ zckW!30u)US?%uJk9tD7vRB11n->e0p2I!P!yR1JJe8&T*wo|&AhkvA zDhwk85 zUOx|cYgtK?*81RO7@%WDmy9A@*&9dP@-?}K=Uc^jQzti}C#&nSgkU5( zS3~nrjccGX<4#L4dv-ex4 z;OVENsoe>(3p`(GYKhR}wef>E^z5H>HDIhfd1%7J2Z7wMKdXxWr=-5`A_%uAT#|kX zBL>ux#*Zg<|4(IbtIT|=zO9ioCXH(NrRHzk#-CTd0mb4HL8%Btrnr)|Y%KLI6qUpQ z>uP=0#GMU6u5^utOvR`idM8at~l~BBun8H>p{YHiTMiAIz@vt#O9+`u|t))%YkvO=-i2JPh z$$6OxiW&Vw9JNnWwUS^R3g8zgq~#FfYI9B$6Fe$K6dfp%ifWRx z*g27F+4&s^##4ingD-;NbEzbXj5%T|YbNW|N zIqlmQZ3ugWKLc;IV_ZlA8c8J{H2?@9!Ptl%fEv3`V!usiottIH-4xF3Y@!sp`lZX3$LgwYj zH^&zy7j9dGXdql4u3nMv0-7r>Vh2JFcv~AuDE9g$ffln@M?o+WGdL|D8ZE!Hhn5Yy z4^VuqGxs5j%n2Qn7duaMM-MMM}~Ox|LRRS5(o3-8aGR3D3t)cKZP9$m9 zSFf89o3WKs|fexpPlU$|I*j50E zRLMn-Lap}Fjwm8eCGzcR*t$^0wdR#-7~AB+dwa|DnG3QhBC176o+%mEKDKs-T|kS|f?9%d;8`OoBKEa}Msi_N)ni37 zSFtH}L3VT0vJ35@%O#%vd!#4x)27g@0X4-{rHK4+2g=d`QHbM{(-c9IrsQ)NMuOvA zj8pRjA_|HlXMBTmf$>aNI%Ab)mC3@%5^Tf9uXhYv=#ivFclmc2y3)d`4D9LYXVQgf z3$k9JuFN7)!t;a%sFeJW8SEetGQI%`|TTWm?lvKlsC*X2q%^G|KK-Tm!$OdI3ZssgVg-0j)r#;3ws@vshsI^} zB_g0_PZ;L?u~V?p&BI)crpi?1>Q`MtJ1=$vc~ff3=S>Nd;41QZYGQIc!3nUx;8NE8G=7%t+rCBo z@ePqOaJlR*lhO2m?iJ-r`NCc;anjxmJ`tL{)CKWtpUP~!N!-;`Lz0d_k(rXYi(9g| z(%kk@$^Rk?;)|HbM|QJ+gJQOOgb5bA@R!%+2_|4NF4%*L8_5x!<|-^*`=*k)HV7Y% zKVt0VT1U@`;FuQ%Ji@Woa7}k`0M1rCDVu;~Lvc3X2%7=FcG)J2P`kfS!_9m;`^zY7 zw}V7N{3V8aKDs%`*Y=FgV%K$!8Ff?K%oQc2u{OI7u}sWn>VOIE*w2JXrJ3&PFZ+#- zAUdz=)TDy8&c+>1m$b@gqpo7Jvp;(rlh!6&)}cvTzGMv<4^;;W&YX$qdNygY8_?bN%5UMdcn z4);8>KDxwho7$=K1r1M+dS{r#N^@*jKt|mUCJ-NYd$hxKhwgjhvEyfr^)RY#(AlSm z*tH^g#YbdI)fc{;afQj_D(E}}WUIl;O3K%*m1z9vGd8CVDe%VfyF{)r3TFiXY7!f_ zRK;D_AJW_A1TT2bD}k7bR}70x-Sze9f-|cA#A-h3t!d)Klh%Obn7RX&vvphxAw2;; zolQm$nB8c&P#vL%%K5b6#h*glP$1m{`c}al>Ff@EWM6YKsj_$;%psSCZ3wOyyVkC^ zICcJ)9idI@f>mnWq7jk0X|&!auJ+TdtzBTZu*pY~miIejoGowI$x=uUmZm2u=<_*_ zZyp=xNJox{XV^QcD-n+?Bl7h*oiIS3)CE_}+o$%<^I4$`(3BR8ytkPa^CTiBX3?jP z-kR3lKfy0cZK>nZ(C42)&OZH~*sJeYs|AsZpOF{fkr#|&E|I7Vsv;|gqK&}>@NdLi zBp@M-DDW#gVAT|$RuAB8FQCp~1R<@pEO&e}K>#p55rGUpaxf5a`x!*H7!aPIfj&R# zKfS7?eifg7)SrGaC^w8?e0_O2Bs-K~e4@Q(gM@kDATbPEe7%Iwz3;dB4EhOht;G;G zko@`ygg5SB-2%OsoDb3vUTJ6HxYazeE0$oPFuSMYix+89Ll%LSA@=e}M$ z>i#}N^tEmZKUYcz@lV>iPTGx0Wx<3;&nLO)lfksl*m$sZ)&}(7lo<~K+^M$-dW^L3 z?6%#*;{09P-J6!TkRBbEm&O#T@QZcxo>|*(Rn7OvmiUN^b-?y+%XfQa*C}n|?|0e8 z?TeNkttFo|cfP?Le|O~%%t?$ZP~^c|f~Q3hJHNwCnrjnx!f_}K0wYSYr<&Co1mB&? zaJy%>0ZRGX=LpugfA_9&nUcA0LxX?}VE&&_3o(&@)#jB=?Ec{tP9_otHpW)}D@#-T z-4ksQ+sCY7^nxyd1_De71sa0{Q(urG)Zd)0xRT7@l-S&yI$@FoJ9VOxxdG-Oze-A* z*7{V`(z>E*EuXe|PDp@O%J#wiE#|@Z<|K^UVk$eJG{VYVR5JIOc?xGbC+-Os z!rehZp}E3UntoPjDt)4ZH$8iS&0E1)X1K7!aBJ9r?Hd?$LNpktI|kx^$hp7(fFynyp(GFhq)H{s+%e%Mq_$9^uVGtmwKWI@5@s@Jk-E-`2X!VEPDl*xOkV%oUT~b=0S*O7@P-!o?QL3F;cjDMClu z-%WqDgp{P8!^m&(c=Gi?&9tQP;9?=asS7o) zI9~C{062=_QVEt%;-p)^Q9qPbQyFS{K>=?|&S;p4HJ-KRWvB-&Z4idcXy4YHlmRv8 zG9|&eIGgYJywsNkyyWoC@uu;-fzT-n8m2LHJFaR$w$yZBfV%a2uMMVmmXRjf;qr;n z#Ru$5x-&FZ3FAs0VwFMc#VQqAm+Dj0e1}`XWLZ#CRTzH!8P-GlK=&J0< zWUJAj9nfaL?{GSE(3y5sM46@Ao9MrVqPG1LwV2Iv$roxNsxCW?mkrTa^)}r!e=oz5 zR9TZF&7}zdNy@A>`s3m5Bj~J)F9FqSg+p1CqXV-j)AezVhflxGihz>N-iHP=r8V{m z%=vooBVmt>zgDM)A!!EU^fZ%5m(Y5Aj1(-SS+lR+VLd5ud|Vn%G`z&1^5z#ZLHQ10 z&DW++JI%Q%@Y~$Nx#XYrUAC8m9PmYU6)s=A!>R><<0+E!gv#~e;tvv8;0=JZx6%iMaCG1-ev1jke+3UW zMurfk%ytFL^P-_55BG8QL+4IjF4yLN5>v?Q3SX*9T;i)ME_Z)Y#V^;@d;hGU3rV*U zKv)-E@WN$1?Z=VQim|a+*srs`1r;{U0KX1ZBz%n8L5@z+HzjYPcdO1Rn4YoVYa)0; ze#*Y&K2q@gsBe+BlW?Q{40Y^@ZCl#L9+R1o0_5|K*(Y{QY#X7+sZR_0ME(Vr79;4@ z_w(XlC=rlzvC0`pmnL$ED!HBgjf-CJb9O(Tooh_75F$sEtJgR19OmiV>*EM$F6=BU z8`#OWgp?yJ+=e3``voJv6XZ*S)=Kx!K%x-C1}Y}8dt?%!J&KKRls}1$aF*YS$=l^z zL}d?B2+Kvv+0p3=WlV?rJ>~W8*b8>p|Fj&hx>Jd(+9w+2=oW}8YW9I82cPl&Kru4{ zbNYEcmPB~$Gdb{RM2oS5QBa0XxuqMKDAoN)O-u)y1UXIO<`EF36r3$R!PV z_+AZWZq)W>mJC1kYzX4vTNaW&#@OQkb$!!^_3N;o#rcPG%M3|7C(E{wH$!_^R8*%; zhD}Ks*LAO>M)0xw=9H?0EKpo8viKC9AD|{^LAl$PEj4zuep47H(aISz*9V>){MTjmsTMcX4v@AysadXo^* zsb`sny<3EE>VVy}%oFP3%UDQe0NJqBJ_xdY4U=fMMD2*u9ZLVBHlR==qOnI0`0f!m z7Kg-+vLp4vgifn3;`KvgrZ6`bo%#(!)!h?RloWW%3_2|A4|VVqZTYg$S$_LdvP)Y; z;wQ|gpmX$&=Jka7EpDi*bWlx(>&>}&rma7mTMgM4|9>S=tY;`Id;dI*fP#RS{$CI% za{~txfxamY;x$FJ%+11@e|w?f&dR`G!gfiH zio^2CgnpCixU&QK1PEc{1W1Dh{ZtT}O}v|ZJ>PG;LG8j4P*lT=gtj}%T%#AME&C@A zbYC$IWG!WNnss@w$Jcr|&x?+J{SIkT#2c!#>7F;G1V7h4Z9KGd{*u7*P|qm!0TReK zv{`uJqD{{U^sjDzVp6vylLCWY`Iv^?CA$WEK|7SAT!UtNO8fqd4J?ddaiYjI2pJT4 zVjxDS20$;rOVC0G{j7IxKUF;eqa?`xi=L?W1s#Y+ZQLB$@KO5)ce$TwWw7qVa=1b`L ze%+S`q2GIlUW{KZETRUj9GZ!gjMR+ePGkeSE3(rMmyaaKY#N-3dZaBh zA#R83+N_Vcg}V3oiw}Cw28r;;ZC${pFmM#=l5@OKlc_IDQ}{Rx-qFpWx0$Be6KGAT zz&e)&n$Sk)irz@_iBK?M2)Lp+!Joa<*(DxGP!Pv>;Uh0d8dhraF2V6m1xWmERZs$yUsc&;eOG@ohep(dzjZCi4L1I~KXZ=7+Tsz~Q6=^$egn~wah98uY4LaGQ%4|BxU0|Q2%SQN zS!-3&Y@3ccF^N*po(lbq zo#I(=v4r(}WJS&$XAkY!OQ+!kg5Y5fU(}XTt2{xur%RzlW)(9l2^=aE{~V{C$}Z`J zSCm%T_-v-1|xjksmM zYYMp)dv(}iJxYHw>)$`qb!9%pFdYI-WK?2;?_;$0rL7WFPX-c0x;zzzh+F|LB17JI z>h`cDs+l8x;qpTP%fV0Bbfv8ngV18Ck-JJrITbHpdP)(icGoKQ*tVsqgXrk$!5NhB zKW+tvguROPEWHZ$wBZ%GHzwYZ23;R=zeng!!0{#Af&t|@dow+JIBT$RZ#rljD>4*N zOOMVC{`VBVFD%$s@k<0$O;Jk3SSV4s-bp2ibbPcbwZuz*W^3qWr;&K6785GswTbvF z8d^##3n1FD4no}$X#_bWZN9D(Q7&nl55F;@nth{=-K*#^W{FG7;Bl(Ep*<{&NWY?!=#TEZ=5o8{)f8x6Um-fMFnzzaW4wf&^Mv0GVq{ggxk-wpW^pXf`tq5hmqq0dL;qi ziQ-DgbhwAb#B-BVd&a8>&LV@7RBi^=p+=Shcmwu?hN=0;w;~=sqMLaGaHZd6u;<32 z3voSY_5m&w`DSmW{PCU7A+vMHf>>jltg#E>d4`BG4v3edk=9*|uM^;g867vuL-y z3%RJ}#ms7fQ?>Hq#F*5=!M@c2QkBT7L+J`}7Nspqe);4LkPFFYAT>3hqKGw!&R&4- zMT^2ybVu3isviDpbzjU&M4ll6Mw;AHN-gh8dX|>?B6CeExJd_Lob}i|X+~vx&h{~t z4hFh1SXzIW{Ds29+= zIEQqv-QG=fJ2a9nUj9b(nzO9RPd=VKbNu6Q99+5>*<|@8Ti`G5Z`%Cdoi@ETXCqANyz6WPAUA8NY-;g>VH^MWpW98#q*Z9Grr=>-Sp#}#*8b19B$&P=u zG+F;(-NHA(5c|9#;GnM7iV6$teh)sIFPihp`#a;g?qcm8LX<3}j@5pz8zq-XxmK<5 z6W6j|@6a+@!JjvR8~tkCVjHsKupOUa0+Y7JfXn4%rO)FeZQ4qFp;LDG)=l=s^w$T% zI*Px0%FQbq-|@WutpJ@}%Mo;r@e_L+VW_A&tU6O=VYu-vZ-=RtZcrNSyv&<%JEX}D z-kz2cH1fmR9;Ooo>M?H06^j^MO)HLSFd>DmHepTt=Ag zlh8KG*r45GVY}&~H^U799rMKJ_w=CMXRUU#>O4(L;bohqWsMRfY-`1Cw*L>_SP+ zs+s2`ci|U*CTrMw4t|or+SLcIw&Pnj7B`{KdiwmvCmju?0d>f$g3_}FV|{E=;OM*; z3OMyk`tFhMLs18ruthGlczFTMo&W&It)~ILom*+J*bA=0!ozYyTfVU4Ok`G-eEh1? zKA*wx!X|b})Q#9C>;P06YN2LL@EK&VH}uGBL^ON$0|__fx&MGn@uX>6P~?o^zHvt3 zUFcJPR1UcNv%7#4ZL!v${J=S&Q8HkQvkf=l9h0Uu`osst8|(;wYf7=6cZV;8k4owN zG4F6U$)(i&W0ysB0HHKy)#^yKmDa;eOi7$`P3(7@U1Zo^Y05<}IGe) zxfdqp>4+WW+K@S~gZ{QWv~mqx)HSN%+=Thn=!IWbXtYjV9Xl93v1Gw4mjK$b`PBf_ zOYLPRC~dtgiD8b9ZZ zDwsR!wo5Lq}hIV2p2zv0x)EvACHpryBVMqSFl(mF>V(D zT!<3Yf+SX@QCf_mGm2f>R|Mtv__yxHPnG3`+{hpx%jEwXDRckr_e0je#=z`z({~4=AOtN0V8Eh_jvqXs;j1L)GM5+ z8|hpYhtz5p&!DyRs#MQy)-Tsw-dC(IZ3x$|p6Z$|%W<8jU#}*N@BBdG^&GBTdqy~q zxsQFPT)Q)tw>;lCK_X6F5If!a1Igns?h?XqY@9r9*TzH6i_3ZaGd5-(<JX4pe3?} za~J>n4TFtwR~`F2NO#>Z1%c>-3^S{v(z|JlYUmmlm_$;NpkoE@Fb2XKnUo6C=}3kXU|z#^NsvXUf?uk%k{>D8yP5KF*a za44M=H1O=wGp95sN&z8lE!d!Q1Te@{)IDz`EdT8w70@HBMZ@mBH57qAhj^ z>A%Hzl4KCc{k2}njuDmKHEKt*Mh6FToCW)yJX_&L7_2xCZ;fyKD>XuEnc?2%NsfvD znLKhGlG|WL;;F&Sy;80bxIaOQLHJvxcHlR!*md^g?aEbanuJp@l#I(Vr_uZRz^p#Y zs4mm*%UuZ(9WCR+_&QosCcZ>Xl?}{@=X7m{WTYNSBc$Z)JakPdjym2A%q>IRG{dH} z5)4yA!rFW_12>r4Fb)~qiz=LkmyE9kL6hpL{rCd>8B+8)6nGg zZ;Vzj_i~gH=U8veYq>lZfnri~CDOd=;#j{9-Qgg5)%fZ}6KgDoFRed}6*q^rt|O~Z zQz8nZ;w#0G5-=BN>r_|(lh@&-2+7yUMUup6QW}<=YWTY%3?#*ePGeH?(y5~^M!q3w z|3GwIhhhti>00*CRq!-rzF5xw0dd`I68IZ>+oHgvXIt1N3qs{3* z6zH7Ux^eWiB|%k)qG@0|$gt1(#8^_sazFJ@W53jR|2vUPQ8~YJRveyGX>&Xzx_b2Y4qJ~ zSHC^o*3e9*c$@-XhO-;TqN&|b9Nofcm?q1seiNE-=4_Gs%0-(iMxIqMFSI)KI}2mp zU5-nygtSqm#Kg&8PPQ>~w|X8{OEQ(%&~+(@?lD66W6bj_o5=U7HkQ#~vvNMTaZIwp zSxcDqqSuFbm;HDBJdq`)>EE2D$R08h2Q6nU>2nQy>#N z!sJrs==j2?Nrs);Bk7h$k>-TExL~gS7V?qXLt66Urs8EcguQCBlEMCrsrLx-rSCLD`3X_`#$e)~`O#s>7vG;B{9q8-&xH ze1t4DawwWroj~y(+4|;Tzku+7jE@MLZjDxG>;(_CDi0qObVog4VJ5pbrv*&v z%|TE;&N;u9B>kL2jix$;o=6!KOVb42Iejn!wtJ4`3Rv$%Q2 znRS=!krMl|bMTjIQ6kPWc!(GAfsm;^VzV1=--)zT7220vh7`Y3@r;Z()9_L;tW&x= z4VeJSq^YvJ@ff8bTmKKH_M)jiw@zqlmbLnx!{Kr z+sfpp=C0bC?U^;W<&e$C_|2>KjRWRPk6$G7T|Oljw=&DT*P>nsZd26rxZj&!9-2Fo zxLX}=FW3qK2%Nu`v)48yFE*TxY>dfAPbr4v?NB%}TgOt)EE|y7hwdH86*_G4$Cb)d zY>lYCD4S5_ob9w&2L;ekUzE#hq!fMfVHg@qXAsufK_2`OcuKDo}f^`x-dXg9mT1>ETl%!g2U4$grI?dF!hI9||b>dlY4DgWr zOubpg_(e?y?ZhxyWQ*3usF~bTUix5re(A3{wrf*l*BYnNS;06|Yl3ygg%7i&rg>SG z{eZJs`OxYcB$3Ow8sTzIGgDd(kC|)+<=)IK`qB(ZxGY+hnQ{>fU-o5X){X{;rBDS# zyHU>$_B%5chJFq1dznq5(5m5KC8f&5Z*kvY>N-Bp17H5e3R|-v)e;@`>>J1A`3>8r zViGxZ`Mvj1H_6WIy$}jIH@q&Teg}Ou$K?IrR+l~n>}jtD@#skKx4PpNot8HsT`*3S@}r4;Y(0A)QwZN)KQUFQNjm2!|PRkG+EI>mPmShStt{8k)w;Nc?? zqXws0PxEY+QsW)89<71;BFV?f4|?bnLE$v7M$nhlKwTed6h>tjo*gQQ?|IbAMZTfibr$`l8Dh9^Mrs_TtGhfnQPSe6t$d+fJfSPg?6JTszx z(H<+W!VzIrPmKcB*xRWlZdQSTXEU#KAj(rbL(ZSOEuw|;WEW^=)d3giq@~n-B&Wst z?HJEOMde-2Akf{yEio)J-L#fz?OjQu>gjcbtYMynY;t!4^OOB5(L@Q}2L?iXCn?H8&QBaB(_e?ias-NeuLDeX>=hOPT z(IvGK8`S%nZJM+j02;Lio}A_6;n#3F13L5~C01aYc zU4H+RsjQJnuqB(JE$?WeugM^t}+LOH}3&w99tXxHLpUzCFFC72q*WkC^M1|DB*uDh2!|cvZmoB+ z@Du0HMO*uw&MB0wo!&RnkR|QTJ?p{0QG)3}>M|UA3xRkHB2ntPm?Z=HANH)yJ2+>< zO~!j3X9Kb<`Q>P_JKiOq%_)Gdq$lIu*0J$YAX$BF8O?DlZUNk?nQ*5LLG z_e-PcNLM;s&TP0{4jcZnrH_|fMg&wNB;FFnoM5U_?IE=BH{MoDrA4p+bHD*V;UZHcJ4+2A?SUx$`bXHF*$(SZWQib;902aT* zX9Fm2$~i_aT|#nfE?ZLFsIORB+;AveV&$1G(^}r+lCzv^&wk&4wxihWz2}Ln=(s`N z_zP$Wdwx{(g6GmL>DeJmR+F&t0A=6DKvQJJ@2lES?^kQ%DY%c)h*@8GH|exQ78#$@fJ0d6#$DVZoKA7Hy8dH2ef2SYbCK@PJCzR{<({l^KOQ+L<;8xBJ$eoFADl{sY%x7StnB)F!d9cy4xE8h!} zZ?iJP^N&!A_?u7(%fTd8wbWay>Ke8THnMkudG^HtiWpy;Svut_cXj> zUcCvGZ-srnk&pI9N{8fYLHG|7uA({-=*Iy~GzE(^OX?uGl;Ul9viM>!??EAa8QeB{ zMo*EZJi)hU8jclK1fh=sS>gxo45!%erro)GsO|Mq; z1%J(ywX69^61+3r*a;`CDSENMwhmI?P`SUSD+jf$4q6n4ke-dO5Zo}SZwS({nLo=Z z>KwOOKJaZtDmT&{l`MxPb#-Fxl}NcCL9eL)TCZrilh-67qy!ojCw`8^2@jMi<%zm6 zv>Z|}Bg3i5H6BL99NDRomB)hX{+uy%$V=>W=O~{j(@0aE%?KgJ{HqiwPSC$C|2t!M zQv4;3u|7i61!kPiWL0@e;mLp}GpkI&f;j$Bq&W-N3>aCBNdJWX^wE{6n3X(VRAaL%oifyYE=M)j zt#-Dl9@746?Ns3atH;hk5_3}ul>2Hp3X_c3v4d|&7`Li6m_Q4}8!FhpYfUv2!{Hvr zX}N@O|5(x?`2L-tdH0gyK)^j=IfUI;9thuGf2AntO1_@e)%xTI|A)!uZ-7;EW~EY* zu`WUOxX%x3(|O%USh}*}Ikl~MwoK{uy3p~oq(;>9(|8^c2uCR>W{$5yDWbK7(+wY* z6t5JM*orIE5&N=86WLv4IVa8yTmQ@8ACxkz@1gP#Fpo z1my9bsrG-R%lxaxN%B9vcnS`-|15F**Xw`DHHv*w0|H3i>&0PFvlfVZsyDd=6MYF9 zosG~!v4(}u)=YCr)@m*ZPe=UjC_FEqK8YNXju(;}!R+^26B+m`*E!SlAnI7a6GNn( zU%h#L{7S)8wm;gYv%PF1xu z=N8f9#UX=1MZ&9u5;W5e98;{!ap zES)})+d%X$sIV2R5!-bRdA$BsX9@_(?tSRNL~8xIm&nW=&{HJrOTjdLNE9bmh`Ocw5xGyFX1Fc7HP@x2tvz^k*N z%ng+(R_6T)45jHpW!cTRzIr8HefpZhf;%-T$7?IWt>Xi=a(z(;Blxzkcj1vl>Hux^S57$=1mOx1P3J9p}$iUDx3y-|sI8AWM5Wf;7RjkmS&qtG}Z6G=7Ba3ug9u z8#*ghW|Qx~3aaeHHWHy%RWBS7Ullt z-aD_Mo5-+dphocXsGBb*->)DqhEUT?j1WSUfsmmsajF|d9MqhwepI~=BmOY4wy;4a&lG}sRNlu@;2u;|x`(0Eejm`NZvFW_{$|hL>#bS$^2&qYl#Zgy>y=m*>hG=rD zfPkr08Mh_AyiUEz`S#Kla)W3yZpJ0J8tpa+BT?IQVF|htBFvY1FJ!U6Vo+hyiNq93 zON*5&9&Dg`Uy^qJELoDkU4wP8@#a~}>G>d)(#)m+LqNR0Uo}D8VUF-Jo{%K|#IZ=%mn=-dC*l(u zjc}eHHJ5Cmw|on=YOtcU*4E5(y>0Xu`m>mpT!DBdsp^MfqMw#dWZ<4HI%)j7OIdP_ z%>F4-n3MMyLf@p(NI_nD#i6M6c=Pr%!UK##YBozquLzWWUd$wtF)6JVg^H#@*->Ym zOK>Q;O%>D0vUr5VSD(=uqRGsG!NA0NuRJ2ungS)zQluBzYRkU@(US4L^y&mY9$(E4+)I8?@#>ylpYln3?QS}_USCRV;*3u)7?*dZgKCv$ryp&0 z?feoX@jJ_-L=Kxo$z&nf##cR7wwfIj7l~E3)*qj`$0o{`aJ#lcDvOMuM`oq-6!oQ* ztI`^+)KAqP+Q_OmtoF8g>ao4-Xz)8A$|VfqcP8GZ1NGH5BJI%~&F#wEeH!T%+)z;W zdDE%tH?m&R!!4rvUgCYOx4fqQ0oVIbOg^PMBfk}Vej8{Cdf85%iCG+ORd=-6?Ss>zlrrfNy-wJsq4TU67aSE=`STc%lpz744(Hk^a%sUxWSu z*`s>H{h`}Ocq5MOt8`{D@3xq7heH4lL&JL2S8N~vzj#F8p@ulfwPP^fbJKM#=dI zr6-Twe0~tQ4lS|4<)UO)1TIVE((DFhK3HDrO-pJuub0Wo&Sh$U8aH&13-pvbcE)u0 za_&W)s{L(KnhwcBJ^wAZTz`OqmxGU+03pRjj#6$-i8aa`bpo(>Z9l1*mZhN;U|B_8 z(RU6Uu5jHzVMoWGipeD47aLV_ zk{`4jzO#_BsC)^L{DG(0zlx6ssb<^m^($QwrJs!*q;e5Ovw!Cq^5Lg~bq0wJaeAo6 z(O8CWsP_E?Tn4$=E=9Osw^vZo+6Qc|+I8nvQ~fS*w@{NbpU6`h#Dbv~ZeZII@}49y z^D;MT}S zNf4!npZo7EmS=(U(8JQRT(-4Jri*bXH}IbxH{Iyr6(*Fc+v zIRf0!=CEU|I^;=yc5qU0f(_ONHjt!0;x#n-IXSkv#!oo*8&O~j@8C&|C>+rqFec`R zxp$gC^hK0j5C)?>|2)d>&%Y5>dDI*1^tn@OiOfIZv5+swUUv>&zi;CO{@Bo6A><2L zlP)C`9dKv4E3k)%n3_p+pvkX6r?{2b2I54YBllYK0EE%wO8dwb3bLGBV;z{24dB#} zVi@8yq+MNN?+K!*vK)~{yiaa*Z1X2f648!ZKz0ieg|J-nF*{mYGW1lTH)!{#dVOoP z#Psl8QCIf&Ge}(h9J3g@O-AS7H1GscqiJDy(#1Q%Ed=6V-^?xgmGP(QUSWsM=q?^3 zO9%Kap6zOc`PE5v8lIo7jq$GwBhBQ-m7y~MWnFp35V9G`nL-xu`*oEox)w*7(|k;jJMw*c|* zmfYD%K_P}g#TLicgwo97_1QLMzc&9}H)b+-FflMzu(h@NpXYMUebElleaJdSNycLZehJys<_grqK$?pl#-qfCYA2JV zqsdhE*K$h&C#Gl`8i?vtwTmn+H<#3`D$upd(zWVP0#xee4Cx8q=^t!Qpu*>lCobs1 zVDkC-jgL0(v!8Xc?=$b^zFu#+uR&i>zK{h;nW&=06ar*^jO`{9Q`^cDaH8)c;|&CT zq$Z9CBlC4DM%$LVaRi9pm_uy$w@|lwRN}>m+u>~^-=ZS(gq2|IcDS|UZAa*%chkoZ zhGr0sZN&^u#T*{XtMCwe@}u8QkKI~9@Q=_NA9K3%(8i$V-*i^`P*&)P-dJ|#?hQd3 z{tZpprkL5tv_21^Ets~a`QZ$+Dc2UAW-;zwyttGzyIDEA+x~Xo@&oCX^;SYd)q!$hWusko!udMyB(@;KF+(__qT9d^9A`r~)r@x{SO*DFJF%lvHqLvN|& zN!hRBqd{bE9mEe3eC{;IKLbx|)n!idSfiQ8tvqG!{tK+YNthpteTvd8;%jfb%Z=it z4XyKa4cRuH@6OaCD&=$U4`IDpB?%3@KcsZ}=A66+U33Z@7bKz)QUSyjxmF>74Bd_Z zJLOJye!VO?DR>f@^^?&eMBFRCgI_*bg*KPVf0TWWgAHsK3ge#SN60N(_f6;iHgAf$ zgBDn}F@2>s^358#jo`Uj$t_Sf09$N#X~SG41OZGh*x1Xo4YlgKr>k|I4nToAV~hnD z=JVNgSx4ox3A8!QZHy}34WMNcO2nVdP6;^5j&A(83+RoEa zH)ft!&$gLb$)wbFc!s3ajfuH99R9oTRr{NR~LnZDY}+d=s|m}Kvv z*<+>gvw-9Uqyk(1GW%kAe%LQ=>fv;YqGE-m2X$}K9)NWQy$IF?YxEm%s07qF)ROo3 zgzrPl9*ZIdE*sQsQ%rZ9Qvn4n)Y)05$rV=a=JlQ_ox;|$84X+cwAm&a?0F|8dJ-HH zfDkpgKD#b$s?ip$s5Db!=dv^ixc1bNY1epBs9)naSG||8E?#lEs<-vP?LAi9u|!(@Ch+H3{UFg#UF#?Uws;RZTyt+FQekpMX6j}c zZk%f=rxr2hZtO*Ir|?Gu6vlFGwFLwzj3nT+nDcUO49nwaN9q3DU@J4(dqV@` zMh5d1z$>W-c;N)MICMC}!C*FtBtI1E=<zy8$V{3TF=`F zB6$${&fb7d0a`*X2HuYXTpdi3|li@_h%(|H0ZfhH2Ji zS%z)fwwYnuwr$(CZQHgpY)1w%Y+I8xUDea|^~^KX)AMuR`~G;Jb}+b||wZ&{vspSwD5Vn}|uZOUA7d zZKXf+*xX&=Q9$2GnwQL|xo4;|42Eik5V4#$P`KDzgX>)zNJWk~I$b^pwnPxa)x3))x-zxq>iAsR&$V%j+OKzM zhyt~e58M@mk<67m4`$E8273vrJW`1swk>i9Qz@wQ$gJLYPfNoSpwe)5rWgq>)X>&o z4mSA)J_LK0Ip8Qsv{-%`!HOdI%N>rL(jBm+;SAN_TbTe7PI&|?UBW$5cF32it08!H zTG|{s6{*t%#EMiva|A%EydmY9J3|nBXh-T2(D}E3^R45>Fyci(P}irkkpR(%bDX2z zg3kE(uMrhUT5Cb}E20ap_Bsdp_$?WU?8FfW+O9yC2~=yvTNT@D5hA^+Z+VfaYnzPG ziM8Ec_;lCwbIq^i7Tq5sU$#B%w}Jiw5}yl+@2-wDcb`biyis6%*=6+{Y~l_t2!7e7 z!iO}9w9_kv1AbxN!nPwsyvWY&aacU+vATuxVUO);8c#`vz{4k2!}|b3I1f#6cQixP zrhRE;ts6JFz3Knt-^M06n)apgb@;>=LXR3@vF?WP~A6}!+ z%jRErRUfUpgJrPG8Z_??xjR`e?u!Xkd&qVreE1VHZ(vrAG>F3N(8`H6CAH{RQgtB! zPD~JXcYMEju>I?h{lUv`2>>~MGT{-4a|v)nt76b>QYf)xd?gsZt{Sl#tj{hxDjop< zBFKkE=ELmq<{<%%SO)V7vJ(;@s7Zhg2zP{vW3EiZ<`g`Q zh9<31@%{N*wpQw@ta|{ZHYF`3Y4z2u&RFMi`U+Aq>ZvYcLK78L-;pi#%W~*l1fdXl zn5ACHpSy;jjn&y>h)Mfj9GDl4D@noUgnYkTN1H;Y{rHffl&V7QAMFp6lQ7}s$s(Q) zk?F~Y@E^cekQ|TlXF~`F!w7lf+CBn;X=lL{}6n3mQ&IAN=!wxPU&=jMHT(Nfh7Be2@81 z_UA9$K}iZJd3z?F}IWjAMKs<4nrkb@xd;@QOU}481?m`2B*z$TIy zEg}nsL_I43ONw8R2&~Z|oeQpJo9Wfs=lBKx&)hN%ZPl>nk3|Xy03huY zJ8Q09OF?ASeBBO6HFkY3OAsxwbBqqXSEB=WRo*TSnf$~cS)zXc5STpo@jI@xLcdrbsyyJWAryil${a+N5U}3d6Go7p$`{T zV)%`D;)ol~j5$XYA$|R%gHKB#&7xYZ5(RX4U_XBmW1lHkY_kWgPPesfW~dEU)o9{1 zrJ0K$!QxN!d>y{WN7m5ME>8!j>&$S z1ev%U1PGH|CWX&vDa2CCk0z&|=5(8hlTNgYz51S!#|4Z>brq5RuC0|9jSuCOKn*?J zHmX#KXr@uAUAAkLmQ@p)%dD!&w3AmVW3Doe>{JVz%Bj^D%(didJZ)#mX=kO~=hfxQ zL4;|%26S2&r&t$h*7v$@akeI#c_Pn^QzrB-@MwBRgf6zNLSzj{stkqD^Ng0qiFTT5 zN7FI+zXG*bYYij`S`Jisq-H2=2YGA pF7WnGj*VtLl8_JO_2jR1nUm}o+85@HQ5 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 literal 0 HcmV?d00001 diff --git a/mcinabox/build.gradle b/mcinabox/build.gradle index 26daf723..056a195c 100644 --- a/mcinabox/build.gradle +++ b/mcinabox/build.gradle @@ -1,19 +1,14 @@ -tasks.whenTaskAdded{ task-> - if(task.name.equals("lint")) { - task.enabled=false - } -} apply plugin: 'com.android.application' android { compileSdkVersion 28 - buildToolsVersion '28.0.3' + buildToolsVersion '30.0.2' defaultConfig { applicationId "com.aof.mcinabox" minSdkVersion 21 targetSdkVersion 21 - versionCode 4 - versionName '0.1.3' + versionCode 5 + versionName '0.1.4-p2' testInstrumentationRunner "androidx.test.runner.AndroidJUnitRunner" } buildTypes { @@ -31,13 +26,17 @@ android { } dependencies { - implementation fileTree(dir: 'libs', include: ['*.jar']) - implementation 'androidx.appcompat:appcompat:1.1.0' - implementation 'androidx.constraintlayout:constraintlayout:1.1.3' + implementation fileTree(dir: 'libs', include: ['*.aar','*.jar']) + implementation 'androidx.appcompat:appcompat:1.2.0' + implementation 'androidx.constraintlayout:constraintlayout:2.0.1' implementation 'com.google.code.gson:gson:2.8.6' implementation 'com.github.shixiuwen:colorpicker:v1.0.3' implementation 'com.github.MasayukiSuda:BubbleLayout:v1.2.1' - implementation 'com.liulishuo.filedownloader:library:1.7.7' - implementation project(path: ':sharedmodule') implementation project(path: ':boat') + implementation project(path: ':plugin') + implementation project(path: ':assets') + implementation project(path: ':definitions') + implementation project(path: ':ckb') + implementation project(path: ':jndcrash') + implementation project(path: ':utils') } diff --git a/mcinabox/libs/fileDownloader.aar b/mcinabox/libs/fileDownloader.aar new file mode 100644 index 0000000000000000000000000000000000000000..ca953eaeac8a688b72003053fba0560bbfc80542 GIT binary patch literal 285825 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

  • ?1E2d+ zP(UD74uxdhFVcLfo_Om8(kxRzM4Xc_Zv0J^UL`%6{>2~tg-2fW&x&jft%z(4Pi%>7 z3~X&J3|#mpBBp?#i6Fd8Gwj8vabS(u<->bof`ko-fFKD0d&?%Wc2dfW+J65+)}W*K`MdwXl4U1xoBW|l^L%pKl&mDX*n#>Jzk z)$a=>{A8jlD>YW!l&26x-5m|7wI8ij;av(AeCaL<1w3%k>t-L*2eF4ammYH6dhNfD zFi7&6BaI1SHhrmEk#N9{tNd9gVgLY~`KNFBGgK+IJ_(_T9wP5SnOTzQx~nKzG}NE~ zAwmigt0?QQ-f1=d%)a`mxK*ed?|zxSntrwGl~K(?%LNn z$U_W5d%%mjv+sCAve})7#G!43PN5bvwurzrSUu8g*==k!?pT!ab;@)px_Yr#Y_+;* zR!3IaYF3!qXB!1uwOR%WL|m<#g+kK7ZP2~o(&g?i0Z0K$epXk*XL->3T!Nif?sPy| zxbSf)Zx~J3F1X*MBD@hB88E(82;RqjhK1ti<%?k!4PNOMfk{ocsnQ4eHVB#;b_ zA0$!5#Enx>Wz6ejHBqCbVk?(_KlR3?R1z1IVXn+)UYmL*ExL_$Ic6)Mo#J`90AnaP zVq{WQ%LujY5)+=@I)1BJVu3fggeGdr&VibsgL&Y`Y^KQ(r|T&3Y+pm!iRGZd)y447 z4jRQDdSURY;sp6dA%LYN(QYuFFo>*t5JoOObUu4O4{K09S+zL_2wl_tlf?`rWlI*| zK=UgqcA5mYjfg z)#bis)H_{>)|)Tjc^rAooeq(&qhq(l;ZT;<(ci%~Z`o4tEf?7pHmI|MEl2gl??4XZc752Zi90~wLQp98EHsl*$wf(%Xq3Ls#g zfDM~d;(kDk#yi$#p|I_DT)7QkzgVlnhS>jx4wQ$`vL$3ll$SXQnCyPgv%COA26arFq5Rl(jafR1Akvj<=c!*xr)tTi>5)_n@ly#c@F`w8i;Ah+yC?}Dd0N55m|x=d)Kk83-sOQeCSD;0^L9y{;Ue2+W^!zBDP-L* z>zfGNHk_Jqf%S8N<0k`SkHCNShMSQm)H&_DI`=|2Qy}F{dE)SX%^;xAO(7@K<Exa~vxcRT=LiJf08gDm7vXLY6q!t`Sf;nuRfp6?+1hSX4V5ru z+<6K~#@4{;S&6t+Zak4;~J zjy6}W2uuU5zyBm7T=0I7D&ZzkR>#Ho`Ou)Iq3Y~#f@}<38vb^~fPFF|9XMR*)YT}_ zYHJyP)0x$@;W@tD5;^N#z)I{N2!5mZdbnuC3Hq%&RYY2LCzUj%V={~Y#@%@VUgdBh z{*OfK0)h^!%?+(}da4deS!gZ+**&;4$;$31g6^ zH$LDUdgR4Q<~2+i9b|-XQ!FJe>Wsn{gDRa&DW5mj_9b z6a@wY2^zr=cdtaR0jW!jx3VM1$GF{My{Dw@l>GqkQ_%5~l)Of5RMCU`0(?k)Kt`*b zT5T9sgiev6ICSgYJoA|~b^Gd@+5Q4GhzG3rNl&SF=R__A0H;C<39nC;s! zhFvlejvy71j0G&_YWeM1(Ix3HN-bJN$lLy4cEOFp9c^0kTUgrFqe)1<)ubr^4aAL6 zy_UOP2-m?i>??YXh}1;BX*zSKN$b`nlj#0JnJZUDBoBZA<>Lb{I6s7dp7r`jUIf{Mv;o zeVD_#R3N=;&8pVo$A6PqGu62&v1WO?7_PjGU7k9xS@7+|0uA;Zw(IRRq*&};F5JPX zK*@Ix6>zpO(0Fo2jo9<cU@@r*-1 zgSt7E(V6@T0AG{Y+g2I9%$r}+8^ybXSV}{dnm57|-c~5Qv4vCF zN3Bq|Bk)K~@G9xM#JP`}`&=iuX0z)<%-(;1W~Zr|0`7_Kp)lZl}>7W=#8Kh$h10>0=QIYC}b zIUFCZ(=Zv9Uzd`5(t|J(VA@{gymokFdlKHQu-eUU;T--#NbfIB=H8T=yv>G9bF)#H ztR?oXpN>{hWHYQ_wh`qV7ck&s{)N9Q+Vqc2oYlXIaDTh8zpD1{_+Fl4|2l+4CWT;_ zzY;9xHM9!V8#nJG0l_?hUthvoX9eLKdE!f-Xmf2YygvpK((_=^cuS1;-T9p^`2#;3 z+=fL@Aq0BT6%boyNfHLi^3ur%_8{u`nF^{Pa#p%gMdi9!NisDt!$6nBWkJ-{sLQ1k z;HTCNKGaz5UPd z0?`q)e?VHhKoOFeR12n5jSgd!>R1<*TI%hghP^`(EDuEy@k8E(m*fxaH5Xr&qAEfK z$v|h#mpj_GdgROT_suNa0UN;5G3Ib2j3M42kq}`bj}geu5joBjL|R5Bj4imqqa6s~ zI8TP+ql!{8dKl;ztfuukLa85D31>ld3frA>tMMA!-6H9{Xjy57SJA;zQ5NJG0DZZq zIQt7)?i;U$Nd*0lRN)KO3%SR|*@78dwxrA$br39Am}*U_5?$rfLA^1k*<+hDthd<^6KNFYE6uR0ERT2u~vtn#B;!PrL30E>2F=vXQc)>{A^VEnk?;OsRhlqpgb1%A^D|6n6xVZ@Q8QSii5Z0%g;T3_7O7^6*hiR z2eNukNrNM$Am|OY8bcPpR;L;#pymGr=n+u#hy*=B*(_R-6thzYmQ@Y}afGX0mF3$M zgZBI8$0&3l;*^syNx$&j(`J0YytHvNlHNC*F}GUZm*oR&_5=nyBjDnxh4CC4Tov@> zgjbaDkM1bDO9Nm94L@5vfeB$0`S2iofd1=TWDNXL5J3k3*bo2!p#OK~;(vx?E@*cg zm6fwAvWywihZ|y>O@EfxtW$;DJM3k&MhiyIP+&MstEvn()q5Y)Q? z>|r1vD*2R3e-c_{0m{I9qR88}Hvv(3zvtg?)QYq1jGXD&SvHC1ziD2#+hZO(kKJ47 zyPjVX035i#$}oW1*dUl%9?h{?Y_^-ESNpy_!PxEmX<4$iY?AJHuR7b#PE8S6Gf1|O zLZrEK_*xwolmog~(2M5Sezx?Z(Dr`-+`uaKMwso+PK6-%5Q96~v$CSx#bEdG_)t&d z!~s}uK1p#P1}iwmWs=kAPcM3qMg!;lYqp0wB^UH&9Qfy=LGBc9=%EKi-8qrpWXXPXwzUz5-HuYWwN(Od2VNieGQIG1X%AQdyV)Rc zrM&_6=4QZw-UbMKA?lLuJ_wu*tN`rxf5cMnWq3Lx+IFUAXkmU-ZEcU{w$gXu!S7wa zAcQ&ko!so5$l2ZQxBqxJv*)${8T5j_fI5gg8jJhvI4Fs`UmWXr2l3k-BVO2^GxYL5 zgL^15=bM-*YkzMJhHrG%d_R&$;19|>Id!6$411d&n!Y8T9y|knD-SM0ij{Cz9~?tC zo)r<2Y8_ctmXsn)b|agWv$CjBlexZ*h95yFe(SghE+9n|(lOxO#fd64T3FWCw7ZEL zZ4T$l4!^Jzkz#Xuz;v>M28?vGsz~O_;KVx*-!ID+BzLNYihHlVZ5A;tM|Hv<9W zMyx#gTLc+6k1B(Sbw9*A_*5IU;$!Kw89th+l_cR3Ty~-DAm>a_fOSz!cAya4c+~{q zqkE>BlfLL;DQVTlmvIidA)uv-yc_7Qmq?;%5*Swz5paq}j41;%uW8^NWeJ01Gb|x3 zRqg;=AT-@lx>+PaYkfX}Xy{tjju_)WM8nT0UzbC;8n-Po#4jn31;%F2c?!q$_>q&)H{8*A$7mvO0J zFy=i>B&~!GfkdbIL0($ZJg$s$pCDfq9)6K+8OLe6c=X@=hn-!v(gm5$s(@XCKszq)iR!Tpg+DzI_ zv48e2H3XC{qR5-2&famUS1PZ=ENE?bszzJO#>ss(6F^4s6LuU8ksPRb*Gw~(x-91J zF(pa-)?INLlr#3>4R#bl-mfqg-Z@j3+~_hh7?Aoh+sK;ijO2)POK+Rq#%w0apu#}v zUEuXON@1#e$1i{-yu~bDT`PotVaBWZ%CN=C zA2|-&ZG$J>Yhho%=R;!XYx20@MM31XBHN$=}11#kU_5NFvfIa;zM?-lhHx`G~J`bYkK{kV(%xqDxhiAqhcF zo8pr#gc8qkdq}^!s7{hZy>M1wY4N~U8g9EOH>gyKmDAF}IAL2e>{_iWH3AzOxjzCF zX4j$ENWy|c{)SGa(+HjC0nE`burJfM`$e)%MaswHm9dDk5Ko!Sk@1dT!U@(gc1JLq zx>INu3+;M;#A^pVh^Ew3WS<+qgKP&gSSY?oIp7oX;xF>?k5g^eiGj%r>@t31xoyX@ zjXy}TN1rf`WJP^^D~7oZr8a4Y+9f|wVv0W0V8RI~V%mma7k?AQ>>G{-ukjSuNKd@C z;2|5DiT)&O51`YQM_&Ow13`wHc!T-U356fJHXeC^4IOGx1gpO*Nq|PhBA0PnDi`@oLFBE0se%+n z^i^a8V!v{7F`&TKRjaj5*qbnR>t4(jf#F#7`NC*EW_ zVZYEEB1SNh?@TcJV)hd5yWV&q`{TzIjLT)&@2B{%pc6q2Kcg`ZhL0*0Zzn13rT$0Ug<1^Ty}!dxbh zg+O7F7An|B)F_9CNFcKFlw*0zp)k_uVIUz|Teqo_FJyZ&p&+Ou>osIg>z zrE=|9wF!4=Og~T)h`(TZDF=Do&oa87=yAJ)dz0rz?BCop`8-1ho|JEJ@^2$Vy0pVU zn7}+#q8g)2qt9N|$qku*mLO1O_gAob%b4Y;QqmgW%%tA1!b17S-?)C{N7>(Q;*_37 zmmDIZ{f-6H+Zh^N2}y&a%92}&s(IddvYFN?O=+RIww4Kh3dodDjeXdp`BIh0++QY2 zXOR%;*F!mph->6pOaD$1{aZSQ7tr8pYxSu@z<9Z z7J9p^9>GA0FO5pZimYyoCh6=HJBHbyIez6cC&Mvw>uQ@B5!j~YlmDV8OrueueOU(Y zIZvB01uv1ka*dU=eK(4MXegi?tSMKfOxWqvFB@y~+}PZp({S&R()@;*Rdgux(|t-L)Uj~r zu%nE*K_>>w+04|S&$N=hSA!n1nqKL7DucXAs5Ini|EXd_7GGxGBEyj*@+mk^}mpGCPrbkMKd@xAMIcM2etTddt`CH71o)xV{k!1xD zpQ*gO&gIY?TRDjr3saJ)8d3ucd|gyAv)``zIjONb=WFq5dA4BiY-?brFL+_%MJ>zHP&ZyiqobFeAElWF9qnI zoz)I65q{{K5|7}xh>p0WJ@RUwSB>v)!#z#kA%s2f5jRwR)$kvsLcOs$jOEwGy&(H= z0^d-vzCfUTy^T-dumSXkxWK$DAX_M5)C7fiA=Ci{iqi-JcG7MAbBb~9^I?kQ2RDs! z1C+@za_U&2lUVt4g>nuUm7Ri7h4NF=&7r{FImIqKs)}o(D>Grn>HsG55KD7%Tkd_7 zbpYsmWV8V>^M@IK)Lt=l*qwQ>tn)q7bIEk z!Fg^H1z^7z(-`2YBG>?Q&H#zl0!Tb`;l=`gXa!yuAx%p{MmQf4%Q*p33Mw@~<>Ix! zVR`@PyPD5ZEYETZwD}h?oDnD|OrPDDbHKP5*+b1h$bJF6^DLVA^U6aQBnk(Ua09q7 zh(9_&1i(=fT*T`}$*4z(V#M_dU>yaKn`=Y-XrP*~e3S5)C}0y>W|V1`s!qs%vXQqO zEh{g`0K*_>BNm=27M?nWsax7ywcLp|BB5}6`!|`tk$zsTs;iNQSZXltw7HTB_EE*v z=e62ir?b}|;^?m-)LT6Qc#Q(Rn7FS3wTe(+?zoS$gFS9z+2{BZXK~YTK+FxOb(3)N z6HkDWCmzp;?9!4cP zIl@>zBj`zT?~9s#vP~DBwb1ssv@UkJQz690WAxMm^I?_oh3&l|{nU@Wx+OlnnIry0 zkFZJoX5S};Ue|m-iuPU8`u*lq zeL2GfS) zZ|0HX{0bN23m`f&Vb^?0-JlrVf5L&GM+~(~tnir<^vsAUfbq5F+{s(F$Is`j-j2dN zb+U(YDdFzSW9uuHKWYfWio-1is=Qx6ETd^QL(t?0tRkd61JI%V;F2V~yvnK|<^+_G zBtn}EZ@3sVe^Qh1>_+V+4n;>mAG4Sh4g)aFGM&v+kH`rcXF#+ z-1%mk+xZ@B%v0+QKs^QU%JJ_>0AHu4)$a?`)9Rl^*mGuM0W;$RGb6+av^IM~4`YVe zoV{be=Zg3vu{3W%Sp$b7T_Q20c3}S%!i3Mkb&V6 zQ?*Dma_#73eg;Zyf=KhIkoT~HdBkE$;Nn%_;*BR!2b1;M0$wy1%vKTAxxs1*#`JUI z_R-LAh+?;51wJ{f4M;g)Cmpzy4P$`Es;wKTEgoR8hq$7y6p6Y>@JF0*=Ovpc=@3zV z7gUoTF+rK2W!0%LV=t`T>i>g}r=@jP69eQd_ps zhe+6qL#Mf|O~Tv$rgw0R@Dqmk(XM(S5@g5G&cFy5(2-W zwAR_P<0BvNn$&^kEKoP~;+jlXh!1@ge$ixT3wCOz9gO!7nU2!k-5%ZE;k}+TRp_m4 z*`aNTryYx!78WrzCO2J@94AGaHdV&c0pos51|;MsYa2M{E<`b!&mPR$fsp$;Eu;Iy zQkMUD7nPexC%AEx3AUa2)p&NG_*ozIA_&4BeCy??XS#F~h%j^VL!OH;*)SON`EL7E z=guTg$As84%J8^sVLC&V5Re?M=>kKCS2rlFUdM&BYT-J_HB%|8(MKXF$rf%OrZQ|` z8@>M5^hWO82;?{PoVHlKHvZ?7ve=?^&q*-+Om~@|hfw-88qJse<0#iKH(^c^i4*1x zif3W&Y55-L^}tZ>iS_-s?5vRfk)=V;vyk2yzxGAo_UN}8Bx7@c#u$70<5pP#)>UJL zfFBG-A<}(bc(^QbfO-ek}(CCnTs!U`BBHX8yU*yY@p?yWBGl}xSqu_LaGvubD=0XD$v%B zbFQ#+?Mtyz21zhnVEr!g;1Tm3)J ziZm-d7QS`a_TFDYtC;NU++*Fn9uF)H2(9*Y`bm>OZjVnQ0aS(n+XIE>y~=<5>=YQi z5$HnT6@ICn`$~S8+ELII{Wz5m6AJtP@1JABkY>4NfB*ny!2g9)!~f?8d2tt8XA?&f z31I_!XBWr+Kkl1{k71Y%oss$I`{fMrlqX(uh}K&@5<2x=e~8q>3dCVO1ALfedov z4M3|VmjAEgnop;hiXu1w0BM2%0IdIh8ULelEt-(t$}21UXQpI!OdceJ2txk*{xk+i z5M4;|q=3c@2$Jd`f;rNo2#A8%|bPcGtLFjmIR1xmQ|~(bgP>q zt2Z?**JfLFdR8eXpLwsl(qsk%!M=NOdN)0{wrAT-UvnL9?mxrCamWiiE){7nkMFv< zfq`Oo%RsrKOT5}8_t8MnZ#~*GtW0L5X=V;J=tE5>PO+m-CIdY1b7`IdVd#^A&`=k? zz4h@wvr)xewejeWNSN*7ktL1J8EI*cP=p%vKCp|Llr<`gnzS`h&>pbh#p={PY2tcC z&8retJyr9vM_cBv^^#VsnDX_H?ziq>hAX%qc$nCllOQ}0le zwaE+l(XHdX%q8?BHL8>_^lc7ZY1|w%BPw{iB@V^$mz<|2Nk@v>I^&SCo*XA7-Zv4>)vH)YM@ovx7^3w1RiWWVU zBgcx}wTGXAn{!c8druF_SbR5!^j;Tr3*0#UhNNu1qDSW}zp_X7mfy6n`ttAHGM)s4 z8FDYBF|qn>qRVMb7HY#R~NZe~N3at&~|wN8%>0pJ8d&)u4OdX zPfDAA`CJ`(!}uJt{8>d)$~IY7ZezD$nbFB{h|x2iY}=B43~MRrf#OCJ%bHmk5b;ry zd>XVWF-yvT63fmlJQpKQIfokCWDhA?P4=%x6lViNz78!1)7dgnA?R2TcNJq)0_med zwZ<<`IaLNSBG53D2|3lwBC2_T8_Bs})t_u1W;mqgiq@xIDy(GA1MemYx)!_U>avXm zJ(_@HZgB^5cVJDgX|yonFs;6gZpDa@X|0tspdJ`c)hD9alP#lOK^*Nkg;^7`N0M74 zoNB(?UJuFXZxrfU1wDe}7X2<%$7Oug7b<5?U@)v`2K6)=WzC3#@_ON7Hed;L!%V0J zW5$ZZpadqWZXU}FQjn6v4y=GX@HH}{F{PBSV^`F$br)QTc5)t8xDQ5zCyQ2z2+pvV z9dE9sDl>x-Jbnsv3>)4uxPNK*0Y=^cnwi+fAOS8CFSHEx)0o}W7wV|Ty?|*peQsAo zOJ2^+F!f=uFwTN{o0Ze-Tzmt^>H|SwFnSjA;uuX+K z)#j$h+$Ai7*>=8P90{-7H-+p}lFG;olV6s9^P*~w+J`#)KCcs98t1yb5;rkoK2}GG zEtwwGH=|i@7+@im2QpSkujdtYpMMKO8fJTWWq?(a+^8DKMF!}kJ9ZOCsOJr&_&98h z8DjA_0=1uSE-EV9)l6d1k4B|f3o+n`U%AmYZn{2qB*U;&5g2AB^UQRJyRu|&pq%#( zc22j+An@O9akXz_v!40z~g1)`K*KgTfj)7zn?GH4A~3d1(b2JqPSE6%sSx z;NETDL;|Cl3Ba}A#tOZRx=Jx8a1Pt$oy_FUy z)NEu%X$)rKG9*)iC3{Fg(07($Sj9s8qrn5h!Dgt!T#O5c8H7HBtGoL4C%(YJ#f)L` z)*Cv^KH9o}#yw3vlss|62qI{%1JroI+LcTwmS;-NrC)?wuU#SNTls z9I+I(K;PPP(rl=HZX(*d0M2~+uEqJ?mC*S;5NXuPTj_pnG2@|x3nmYFjEQ zSeI#i$mIjaNB1c2;>*cb<%}`A?4JJkD2?kk(ywL-9zwlyfBG$shJZ-`fXyJsZ>Y~i zvxRJX_W(MhfkjW%yFw5(qM3l?^H8iBwbckepE&&qlsI+jLlY+Nq^xFN=WOp@EyeVo2>sR#b_mJJ0 zF0p~nQ{=3#QL8Mh;?G&1#9xMI^DnoY-z?q5cYH;Z$>ky@l`}*xUdgzNFMjiTeh&~L ztB+#G%X3R|WnDJbjwMrE4exedHv3_8Yxqzju3zZQ1NQelF5Kd}bM0BXi!V0uMfhSD z>2Q3rxLMHbvL(dJl?xETA@Xz57`e+xl)sV{JUSi0BVz-Fj#b_|7W=Xu?!l!{&L=7% znTsZD>HMXU>6b4c$c$NC=@(NVqI#20q|xz+yRb84ufa+Ma2Jls(1Kd0=p1Q0hLZZ! z;&7KB-p7}#Dh*T%%i=mIhsu`8R7=YkIw@5R(kj3cE24uoV&&8*jF&X#4>B^5fB{N6 zD&a7rg8i1=SXEV!jou#?X<6drjcRH_fR=?^a%z06kQ!RC{dH9n@=;uRGJ@`(a*hBx zGAc%_tTM_hI%+CV3O6P??)EbHwI&tIlYqbj5EAe(^JP4`Bj$bT(U>c zj*xc}k>rh=$gv{&Vw8FuXy|gRK8V!pcOwZn{o^oJ33Jv>*&G=!I)eTT0DEfWc-5wn zo~KaRZ`LxlvLe>_iOSm#8O`liH!=gR7U!0!=N+mut1CFH5@$%BtTnX(1FC9HqWOD8 zw^o+9;hw#&z zZ;Oizg@c+($Ko`;BAPvAL{!H}Yxz4cz|VVU(F1Z;-NQwPiI6!xm#Zr_?2;5T0prZ#ptujB1=TglBQvY%d zXnZvop?{mch6(Jb4hNIGUJcZ_No20hJq=Adc$KmAdR1WtClzpIW!Z$Iuz3%@iqjp~2Qou^oQCN3hU0FkzS>c6!e3WQ~8wS6flz|L)}8k3(g9=3Qi*$w`9< z(=NT<#%~;U=BxCF&3hJ|zx4eqQA6`}r@BqvO@)A!|c0Kg}Tn% zx)bB|$hTuW2hU9xBwn_t0yd$blJ9eucBq{s_Ubkv4dic%y|fB}SLssR1dQ0*S`Vzzp%~XxhRb;jn3s`lLfkZ$2KJs9<*7^+cWjOG}+Vd z=Ui^#)Zdg^6B>U)laMylNYqM=PUThIu%zJ`F{K0r3{0+wElJyh%YKwUfh&9I^f#`*#=>T?6tXEHPJ3__m@ zavTgNLN&X@DXoEh3UK=MF_HdYrSIuD;JNG&p4H;i#>i0Pi;duhztRdOcTJG|MPN+U z$ObaaS|H^2ZJu(0v?%S~k(n!4!SRHHd6rKm&I>xMLnOzE^=wR|YYmZy9}-=Uwqarp z^*)f-%H2IP&HJul$F*;E5fFRN`nSE^X|h_oHO$t00Wq`F{;W~ z2i-Vmp86raLY&!o`wiC>J{v)U7B#gl^3kzy^#%2RvvyAmU;LHt({E?E=4m?9>IdJN zhHh^zW7Y?Y>kQf8| zTq}4n_Ufr<&ZQ^T?um=&+&Y~MPE=Us9%0q*d1 zT}=EZNRD?Hw@VlWnCL=Aarewfiv(4$xYJGw5~vksN6DOnl9BiQin+Cfo`mfiB4{oo zvJmG`o=p=ImbOz+0LT3{z;8wTwPZ$QVlzF3bvfZAt*>Jwa$u}=I8axl`=BH_1fUxHOQ<%yl7M%1~X5d$ufrj51ZLGm=@t0@)cKH6bxCFT7lN_pasx@KQ{No`0i2^dez@Om*385wTAc~X~Z^Us-vcG{;@ln&e4H%=#r4T_Op(~M`X6d@-XB&4>`4ZjVx8uU!{!mL zjy*n!(__f9W828ZNBQEx8{8+_<_8)J_X(HmQ-(*Ngo!q0DC;5V1Orl8#mzrO7?=1n z>Z+}I+hvVv|T5ywXQr=0Ydv z!Rv=f*TRVcBDV5`*n(=^Lk-@s$V_(-hBamHI1OHnH0|+yvN8A%C8F~qB~#U zXGV?QUo6bP&+oh}qL&rCEU+t2TxubIF)M2>il{=z$3CUZ+G*_?y!L5O>DT(Q!!;Wq~{PjigLGvAB{!vXU?9kK$*N0 zUuZN|q@bCRMAtyIx-Q(=dq{`SU*?IYc2w@5p#{8E@pm$7c*UBt3V@y^* z%NOxLND8{ePw7%L-glDo+8Fw#byEFEOUFDdG(4kDpjrJcBBPHljbqRUsh6ys@1=m- zRnFWvH|3~FXzK!yd=f7|%LT8*o+M545thVy)$2(&*GM5@db_~R1r7s)Ty zFus`!SFrVu^qx3f7tlMx;U2_2!>P{=az%J~f@1HqJ%iKc6?Dbo?nj=lV+d z@A58Kf5^WTES@qS7V}gnzg1F}_Le=K+*osd3Qm{!SCBlFYV!RmR-Wuo^;NetDsmtQ z59_$g0m$1y%sisCzjVZ}OwP&hKX01*)qug_m*VCfgKj>r6z+GL!-`CV6&frH@t5TG zFN#()KPX8|hn``m_++_R?)U`x#bB|%r$5nDq%%EwEBRu>2gbzjx01b+#0--1ma5>O zb`JAb7Iif{;;1|k)4&CnohvdTRz5*R;O~r$fI8sh2lj6C)=i}A^<|Y# zw~r%JYs8G;ddem6ljV)*K8qf*aOF%c))NnyWenmR;fnV01Ol<4&nnm7Oa{&-NnPDD zxy6o4FsZQp5oO5Yw6Ba^H-V)iST0vx+YxjdCO$Uc0Z_RRDzx3x>-JaB^+ZboM-lVGo zx49qu&TKmX>V9yKw_axwJt4V!T0a(AO{AZAi+TJ+)`={=hZKzbuS$F8`0^`Z9)3*7 zqp<7BdvYs^=&O{jH1yKQ%a?$sjiu4FY}p z$-I`yIH2d*Y$e||^0cL#n1VvwVu~RsLq{?MZS7yt;!i>)u^l^^_~LqZ7giqpJkS0` z&bkKm(gS9>DOdHPYq>ASAM?B*%M0-SPW*dsW;W(Sqay^*pR==I7|fqqkKg%=vG88) z6oOZHXFrU(`PF)lW8AXv0>{LrfG4&w_b2_Z4+35pl(mR7T0Dp7h!gSF`mX>9HsCy} zGu{LUnqGmrXqWZ)Aj8bvX=IAyHSl1=z+V2l0zj_3sp8i$LHZ^mZ@k|v2jMhKbv;t&#oEgs6?_$b&TB?c;0qJw(2B)~jGg3;H-+i9@+;H9)U%wHP3k(ST&W7PI?$ z$BOtTC)$@-T`z7NXjYeF2AoDrzc%ZiY3OL(DE^Z;guc8kA0w+uhK2bWT!eP%V$;9MJeNt4z)2TAA z8rntoJL6(fUpEX{=zmbLeo*jSVeNbe*JoEjV;G` zXsc{CZbyDwll9<6tnk2XY{TG|v?U|t6zkDFcewE&_F4ON(rKRhQ?QsXXLIDJk$_#t z0Xq$TlS_8Lb^%Y61@xIkTQsqYaSK`}X6$8AaimA|1Uw~Z%EmVJNAz^MmdE<$U22d{ zyVoYQs>*&h9$MJ^#&moF&NzZM32AL!#LP35`IgJ*_|3VtTuE#8Io)R;MoYE5M5-FN zlxS5JMKE2*8t_UG+pCs&%|4o z7T`x1nx=GeHaow{*L)oGG{%QX{S{$+Jgo#6Y)bpn0^~{hy9LGm>b6Y@9*-cNP^|h% zOMAB&UQD*d37E#2P{>BllUGiGEhZJLefks3BqJO_ie>4=>8JesqjQx?Z{Ah?`B77< z3~_wgtc$7-50Cj0+%0j12cuZE-Nu`r44U98nqq*aaM7Y+{x8DJ*iP3JO;M*MN6q4M ziwMj7qc*oX6|{rWmekB8k|rS*MXalFFL}Kx*4f9(3|qylQ`_c{r;3^;Jsn9f1-^3H zATw>)nYKh+B>_*(=2c&3OBV5hv<2gf)a%e0odKhS#*TQ(I7za0@1I6bPVH;A6C#_ZFGr5LLnz$Sw-X-B zh3CLBvYopxM$Bj!*CeXLRj;voq~Xz)0mDe!gr79ybt8S|?n)$b&fHF7S8BQ!!wR1O z7PYpHM~^2lEm2ofpN$hI4RrV6mBVyq`hCQ=wz<-IO#stU&javqhhC>rA3Sf4zCUmT zKk?5^b*26IKiw9;V>)un?2#Y49~^vfAIaqXupWK7(tDHi`XIpFoPB@&U6g>#UffF< z5CFg*1OR~d|JIfi{j>Z>Yf{M0*4D(x`JeTunw59t7UYq?Y&UAEk<)kSl=YQDwV)P( zjiS*F8Rz1m^-9xUmYdaFORQx4Ccg*RzJK`K3d9)h2hFK{6B|XB=?EwYCG)3ddrgn6 zaqPJDY`h=6hs6P;>RXT-sEWu01-B!H+BXCnEVA5TRxl{1Qyyc8dQJ5`wyC?jSc}|F-W_&oRrD4_nN#_dBxPbP-J;ys z%J{@wIAp27WCBVKwqOfuz%*0kW%rj_Rk9D2LJ%) zzr&}9tBI|%yq%r(KYou+k>P^u=ZE(xnlne1wlOjIy?+Ag+b4+3{VTJY)L<*X8u8ln zFR8RP0VyoA^k;PUypxMB0D7^Ruy`z1zO?SytyBLL6MJcNkl3wSa@61)wtu#Q61x&^=pPH{0|5XC|Ie%- zZfE`HrqExO`2XxtqBtQ5#DL7xT8A;BVCA!-hNja*i>(J<7_NvCq6i{lpCMZmI|$*d z`ALHZCGZRGrf4vWGdvv23bp-t^YCyp`|$VYD@q?DB#*e!qyXpvDk(N`LMy$6L8Lz3 zVys+?Rf4v<;T)d23+@377o1O70=e%YO5+jxXdJ`+e znBr@4eC25T~S=I{q$Tf!TsDMVC`I{979|m?#?`{**F1wE26N1bnYdMABu4Kow1{CwK02i z8H5v=dp-CbqH^LqfmeR?q#9nu3%|%4v7NF@GT8dcq_G^AzX1N(&k50u4}O3A9Q4P} z?EfP_|Hla*r3uLaeq^4cQW=?|8kLLp5L!*NQcHxW{b4Xj5#S-8%vj6}Q(}w7nfa9c z{=ZzyWx+3uAPwkr)$KIRld*UFdGH9+2YM`XnoggfB88g-S_&yroO)ej+r zixMJ&sf5g3Z2Mi1)7ThKu_Lb-%x&{JN0OoiBbsWP>uMV^bjp%O zC(4v1#MZ+`3rEGPJjscZC&+`esP8DUkN%O$?s2%?i8`HJJzXfn;PYD-TFWo8jc}dM z_|wX!m;-CT7ILjMgAr%t$e^uDwazGklnLt5IKQG3V9J=gDOwl5^A7rV1RzXMQ)X}< zcLXZEaKaK}qr zs7Midlu1fDA8b&)w1TWn+TBCi*#pP%-^AbQr|Abgmuzx|^@V`1$+Q8Awk2?{W?CxMEsz9K~d6E}a8?%z2^ zR9gw0IP~ZPINf5-0C>+Ex2jv`G-w=z8{*!$8$}B9TyePG8WwALpWauxgPh|y>O~N@ z!K2_iA+(G*qCjpQHFiha!L|HY0iDi!<58_XXbhqdnOi#TOoEnJg#At!JZ!Elt1?lij@%Oj;0fo97sUJI809!0uWv*#@>5MBjO@@+pr>Kk5|KX7e7%RNpVh#*;XiWt=z*{>HY z`-LZ;a641v7b_rL5j*S`nl_tXQ021oh}+FahjWfFOFSDR1;20w9!(`H+X6;w%rR@cP=rQc}0xtqrwY+t-+Y^EF%1Gp!V1+lE z4ry}fRnI6zitH8$P<{dbGuiGJ@3CZm$j$}+7tXZ(6WJEFCjS|il{Rb__~Ci5!q_1~ ziwS6uB`M(X9Wpx*x>6>D@(C3+aU<_~8d}FxW7+OXK2XJB@NxfA>twi4FO1}em&#qk znBm~!06##$zZ!WzIBC5G$Su?gjCfz?o;^0e5Mds74<1>+Om{adv?v^sXFu^3@`SFQ zkzW$XH}s&?!IeUx-^9J?gGzb8=FQ?5N$bIZXU`oiZ&Uj(WBp&BT>A6`9 z>r>lADsU3tyP(D%gm@5HF(H6nBr8Z9$RdQ3rj&dLU3~s4l(+Xnp zoyN%nGdkHijfR9!;#H71g`66x?~(2-LvT)H3%IBf2R$G{kV`fzv@t-#fm%^$kRMio zLao&(H(VIZ1p(7cK#}9$r(+wvv1CcyHUuOaBX<;%NHSA@7pnb4A<{DIYDA z0?fSg`HTFpT@PV=FgkP0Q)ksWwTPNGJ{Lsaq^+l{euD>>8t@<5SmhL*qyW4=!n zb8Cq8mHTQ=oYh>VC_7?Esjymy{OfON3r5z5J;fjL{QgJeG5&+RwLj$jiITyq5TzRH zjmeG3fW`$bS@qn>M+8m%Dw24CcUSDT`{TFxWU##;hyjscy#8^5*%H*vk?#1Z+)U4t zJZ81mw;x~k_h|m0x~BOD0hqX^2?7*RV(!(UG$A}=h0&3rm7$rTWq@Y}BTqzX{MZcX ztG;6w4E5;IVB6(QRQfI09Lzp+cinUNiN_Tuojk7`Hziw6Lih1|o$S^g0iAN^RCG7P zcEFfNB<-ptMDdp6xK!g5heFJk9eZM(7f2K>#YXQqTo20FK@=)w{stfcSgbx?%#IjW zG;a14(~V5A#i2~DYXQa@DuvHm4x4$+jwLRpa@Gs2K|LPxJVt~ZYc0`&BPyPN7g3E| zk-z9Tz_ImWyYl@mW5F8B3`YDTbbvSxVYCM#0{~f>FEPrC40b7@VP>GYN1&ek#^?}6 z=};+eTsabsyO4gDb2$pe!Ga@y1=!G)a9*2f;jR~#j;n_BYX9yca zDR;I!Dx{#nc%Wcan9j|HtWJ%i&8lj7cF0>H0pg4%MjS`L&r{Q#GQ}LZNIlfzPtd5+ zX2~dv*KTGFDYunPDF5QWqbdMiW-rYspI_$CB^y?rW(!!8l(;+JLuEDmwUUg)^vkKZ zawq;JmP)CZ4)`Zi!gKXlW(4N_gSzrAE2~ijC(}}{Y{mme6CIQYj^6$S178H!&+5*$ z5ssl)>pf645kt;nxztlv&F{YnHR;kw6#dWHWBLbs6aQe3q12=4NMXDPzE8q@iJ5Mw!hWD`snXE*clcOy)AILov9GMi3u^a% z;Eo#z8OAZAo0FSUnp3z_%V$5((76H+@&;ubEo~75(FU1c%3f>$n$EzImYxjfa^Z{w zcwBl;)4yDL1+X{^-s23gS*$wwn8huk)n1F%0k4aS+P2Q2kvj(xP*F-93UOnw?Rn0Ti0F~Wh8NfV24LGRDH7U%Yzi>%R%?WT1-+R&wUe4Tb9#RL@u(%_J`xFjpg zIebL6?Ln=D=m*zNT=v+N73qGD*CBEmMej{~dGA5-&)BsQ|l$*A-jFw6&>q8KSrR@`2@ zZ7#%5%q-GX`vvGjA@*c$GWi!RG1KPr)lqKJ{ngm}=gA2jz_a`WVN@35X5wB8B#H?N z)vO8mn5M`OjxtI$B|Y*ciuiM8Db^aGVbWNivy^O>gbqGY5)jiR?`(MngThT8HhXx z>$I}LB`?mDNage5tleJ%|R!{G& z3(aT6$*k`2)kjGKkT%oQ8mW?uI9$?Nvx|x>`Juo zOgz4G?_hCVzS)3WVB&1g#*YMsYD`*;8t4lBn1H;pa`z9zWX@K(5g#z(E}&7u6~kw% zP~ClXCe|7`Fc+@rL1Awa(Em!-bfHv@%@DE)HbtK+HGFNd^T)G0>Xj$~4oQC84w&GW zE2YSHwtqVO%)%2qR|1{C-Qo!dxjSwJ4G~H0+RD_>OB{h@7nWJp2@CFHdZ6oq?DXwJn;8Ve2g%cQjs1eN*G#*U=>6}JF*5)+2Qny(6((_mTsbyJdHW=zR^vsJ zaz;$(_HEC4(@xjfW=`l!3NcLuE_$C%n^#6ubkeNc3r$n@V2os!z>iWR-~bf*>eJGd z1#B+IaPqq*oQ(#~?c57@(UH4m7D%-u`BojPFS=nb=!*A6(U*9GW>!`$pDY1OPn@WN zJ|$ccp1{`V79nwoXX$}8R`0A42=Wk}ELcVHHfJtynzTIU*Y8XYqWmC}AcTX)r|>Pq z8rje&-@{=mOU@lgnEThzTSD85%Uslo+9Q!33kQzSySz%N&S5Db0R$Bg3}ci-dHMQ5 zAs7{mRt(%|7wAyJv{~!{pHiC^H;brfY{5996&&<-?&B>6X&8&vj-FPw-Kq2-=_{?_ zM?tTXrN{$%>aQeR(=(D$eQ}}uxURx7#eLT~y<&wy;@_#}%@}3?AdleEC~)}YF+kxy zfxyy3CWuq-%)KOqZtP*t>~focGdlCO%SZIbg($P^pW=$Z!a+V5siqB zL5RIo;On)^HWF+ZGb_R7y)Dho$>94l>-HtDn(Qa6$5m^PE`r6X_@X_pi{SRtL)tD+ zH0REy+`7&v#Ij&5B;DknYikeLL7s^9pCBBS1Dz8?a)~Ooi4iS(;^`lIF}Q<~P-RN{ z!svLQ#M+-1c0b@f|8Sg!I145WM$QR#^ju4iSQC;wPETF=Hx*n*CXzf@Pym2Ln14Y- z{qIKmkGEM(!wFdhohL_nUZPAWksz2PaH>$YKbU|zGMI+|eUgw^6e#>@l37Bi%NX2}n$Od{Nj@_VRq}Fv@z&x>5FO{-G+vV-}2#KuT=H zoZ{%@K=S!QdSmPahVpz^Ax3GCD0}5$1`sLzh@pW(6Ds?7g&R(71$V{|Mq?Ceu@2yU zs@hEgblfzC!d;5&cm~RY;%GMF#U{=co8pgc>v^em(|LQ6avW?&Et;)+XgNWZw&H~c z?*UXO$=39iGrJ^tY^&2Wcng<#&=r@=mbn}pQqjEJCU(T%&WasNb)BWBVL=Ffqr{el zOh?dU)J#?x+w#j2*bFp8zoS=Ei^^cw=B916R#Dn$2A{pR9yf4S(4BLtb5iT6m**-r zELIp6Ab64_oVj{D2Bpt>&Q@sxH4?^D6v0#)&7>vN@4h#P$+w}kE~%rBE4d~m`o?wj zJ0L1B7VELI@!B3zg+r{W$sdTb@g(UN+u%q)sH&)t;yYRRa#aHSvKYAxVe zm@oHRqOaf}-nSVh+7Y%MNScOlGurF(g?rYa8E{(c+H6@5u+Fx~6h%p!G*m2Yqpkhe zZ<7FMqVMoU#f-Zo@*X%f*i6E85K$+$xqD$w_F{TbGBYS`hv4uBr1%$cA7dNl+1-i_{yLKN+ zJN~vLvd&&%Xr&E*F9KuFTw^%j_7SFCRF}Yrl9ELG%0=6axppeqvQ1O6m8BGj#)6~5 zD3j0Fe4xYPCjtGw=Dhfs#tb-Vm%<(9vb5X+&CFceQez_bMDDUx+sITh!d+QgN-U4p zq`1{UDBodmGk|w$G7DiBEknT8yMDzBs1*q_im?*J(n2}USW$8R!b^BNfB%PtyygbR zSXtu|Tr?HE@o`J+9`sLb!sVOYR|4@ug@r7uo!u`E{DP`J_?uKcjd!HRC zB`TH`TiST?A&yZP_}YTUlkZT5Ze!Pjlq|A0!Z+4ewA#&`fT?62!et`&kQL&YuAEKf z!68f$mow`v_ICA34Bf8VPuubJZjaUY`uO*bQYJbp^`B#3)?4>Qi`}O4`>`X!r^dqU z%JYUg+{j6vAe){ejj10g?0@L_jZ$67s5}LCwZy9?hv9v}d=o;{qbR;ls=qd=8`wP9 zQS5*{@4^~cPpb`Vt2v`MMb`&vZA=p(MYQRiT79lX0sRfWy47_WltKs`iS-S;z~ZJ67bT(*hTK@?ImYfdmwDxw}l zE25Q#Kcz7HSO&R~Q^?=2m3F$DnUc7(0&G;B zEP@VbhDoY$oYDum>K-wUPo&ccI@5_+TdPf^{YJ9a#!D+#c<(9nv#30B%@KJX7Qu5b z2a#a88K4xXYFtqd74PgP*lW_4(TAQVMhsj1B`EHUKxg1M1T|iGE&9lK)~#ms_}*Av zzI7~h>><2W2gy2#Oe<>IW|!=$X`%(ek)-095Q5i@xBSVH)<_Y+cI#1>6_o=*bDJ<% zoWrNd)kmtA-|p45_@`Iqo0#*#c=EWG#m&hq0{IS8iML!nxg7n{hLnbf9gXmq4fDil z^4t8k=nUUtJ2)LMnKRxN^=a~5m?F@Ai3ztdjCv4bsN`1_Y#VEDE3>E zam#>&#Fds;`Nq{Ar)PJZFk2I(uyL{_)azTG+HqikeZ(u(&?zUMDp!6{CBQge7M>CC zPYie{^C;Ud2ZcG|dQ-QxT^QhCp~BCDmr^8)+9HKPsD0kJT=NTKG@l%r)2W@e@jQR) z<<=&dZW?o~hxg327xr4W-?kQX8=2>D#?eFD>KXsuBR2rYnp%jHOt0}vnID3rnWjcR z-hJt@;o;Bi&~wiOvss7c;iZMQ%-z;i)F#w}(ln~qw}{Tr_kkvRiJl(;^hvPJn9ZlD zPUzMqU$lo%^WUF3pJ&{sL?x}1+eMB(N6UtY6~6>QDD91~6M$tGIX4J)QxI*ICi5T&)RvW< zm*LcNKb6hI=j;0ky9>c;tu3-OjI${-3#@nkQ1#fcjZPWEd1KK!o z@|;0oHxNc7f3I4>aRB``Ydf72+mH`}kNg)YN`#^9zKzY`=&3LW^n`8QjEa5}G&gUC zI~Qjv*!)SuqUF!-8TokRAx~$>#}U+l`Q8Qe%AoZ3Yu#Ik>2=)G!56|3kqkeRR)@j3 z_8<&)R882cg8(2j8!#5<)2=kWtMwven=Jt}I1F4pTz>=Fqr(vGn68xpqP-F53$$T` z&|jDlZEU&0(778u?i0ZUT-9Ud_>&C}L#d^&w?+uYL_hs>7tBjtx4tvtocPT`6+t*i zLP1);-(6jiO6Fyiuru2P;fOvV^)2`$RLAbcndXnCDOOLc-!aD|TiU`k5~no)j_q@p zb$%S*AI2f85pTT(_9G9;l_x4(%PLUj#6Q9uwdQy}Bd1VQ??Zr~GTmqagI2@mfeNrf z*rt5Bs#ZIIrlU#KV6|l+m@8}p&UNPO)q60aG4)8*OKc!3Pb=R1tvtx8qfJ`%XY~c} zZ_He}Z6v4jFPv}v?+Hw$r{g(HlU~qW&pdk1 zVE!O)(9s2A;jt~WNbL%mh@vqyms93c^Er-7)$nQp=(RG1HA zHQKsbzE4XJS}7#oBr?arzn0N8Xq)Y2IR!WS+EGal!juS-BI!S)FyaKv_n2&YZ}j|Q zp8<603VKJ)${_~#{w8yf`tkeruMRdl(7zz%{@@C?n~KWw$jJql zzYH}Dev||lhqOkzYy5C@hz67s@OztwXUj@89(-3Q-nOUaV^d_USAknalXcj00IZ0X zYnM>yJA-w3xfao(t8#uvXRx!!V|IK+n2p3Jn=*b@_eSbvc0}s2cmu+lU|v)#BRi~V z#|kAOG;T;{U7ZyIgJWC}K4_u=jfO;to|}V5?2QkGNQq^MV0o$<(zDt13+L4=2aFev zUM6w>%g$yDmIIl#dc6*GA3-%)B4aT~|5I-k39>XuF6yroxA~3)-<5tsgQ{$M|D{Y1 zaXJDBlrKGwFUw#ICg7)e@eB!jg6*wqU}z&?@>Oy} zX408QIsZwd(*nA?EGwf+vC_dt({?*?y;&&6nfwvHXq08#Yc=`+zzsq#jpL*C2M;0I zRlUFEeYM?^Q-5;4U4nl*?{jkgkKVO9gg5fh+V_m9o7qo{+IV2aI&xqkSinMZh{9lC z36dYs;&bbqm#|~$Q??yUSm8B1zfFFd$emhPm4w;+q9oN-Uszc0Z1%P3#ntPzybjt9 zFa18rSsNo2rjPh&yq@g3@0xk%{yzEUzGmXSo9u=IRIi|kE`n$sbYR#<88O@}JlJvw zc93Ey+aYqhPTBKe?CJ%6uh$EOJAILdfc91ojT^n0L-dAkJ%3S$;Eml7enVpP>6FHc z-%GlCq42o1zyTtBgz$Kg#&+9PZGX4M&Ko!}VMiY!*rXUhi*!J{iruS^_1Z`8x5s|o z?_npqMstBn-W9;6_$BmG2n{zuk2sQcW77UE39W}RR~K=*Vsead`-pY-Vh+8N?6#8_ zW;gNFI&_1Bv$J%|10(9iX=AcdCOy)CjkB{N-^h?8`KE+P=#ynVvLxSg#_7~&J=yMB z>7c`E1v~EiGjyM}lgp-~y_%$>cC=){wZkjx?7{Lh(|RmZCPG@zXneZFx{NH%V$-Iq z+SpW%Gliku!YJxYz2>XPTtmCO(SwFFK9^X5%DF?D*) zxU6Pcdxw^)b80hXU)nh)r)8@dGtx3ux1zvViPWI9micE(*ON)VZJdlaW?5I2EtieY z=T-i^FA56B(_^ZqIaz;%G_6eV0L$+?bXOF2rhW;bQCZ8`a$D6jD^gFcN#7%&_L2iI zPT$d~h@w!bwzEms%HmwA>R=N%bsbgLK3Vmf?SD21m@ymf@YIsrc@>y;raGmcs%RNrEe7j_YSG zEhg!>8knsGrJt|As#l#e?0M3(q6cDTqUJF=y(OmRtISdl&}Phe;xJ*LlBnS|+;lkC zwsWS9YnHYB#%0rMNmL98qZI>SyfzIK6PvJCjwOuD<`ZjY=)@Zhn5`a7K+WZBMJYV) zntf6a(zjHN!rXpKW_`-a4XZ>{bF~ZiHx}F9SEviuIJX+_fRL%J>y8%1elS+>dtEA@ zLmsJG$rBsK_Ev?(MUK`GD?SW9Z6UT0W3aX;w;UbnR4GlK8r9QnN3abap#9)>+YjP#aMKjXkiynHhCi z)Q2?>MV;^OKxJXpiAvB8RjnR^sSyShin>^*7RsubVrXjD)E>zAQdMQm8e3K?VX{qW zPBSo1oT^F+WtC%2Wi(#*zCAPT8k!xSm0--Os5T)5tMZhVd3IpErEQp;aQu+t;@;e=}BZ< zDOEyVC6q1_Wtfv*<{r`LGUQ-lF$HT;T|~|e^1v%jGfn2K>7J)ATPmTZ)95QZRvI!h zG?W;*bmw8WvRiazg$s8Xy3}Pg`)$khiOtJKdT#x+?Do1v+v)SvdBj47S=G@dJd0SH zsahnAL*iR^)NG9={diBl)3i3txilcYm2<6r)!{9+z}UuOc0>(Fs;ag%Rc={UP3?n!%%zgQ-@~H4{nmCqcJu_N25$p-qv4+%WijAY-eCI-9=Rh_YSgF^dVb zK2VmHPoH+(l=j;T-OH>3{)IxOQdG`IE16--Sn{)`=CLG;RWDUeC&X?dze(}UKVw`Y z%S}pYNiiMuF4J`qE6YNzGj+T#a(AK3KDU1zAg)Z}RFi(;$kYR!MGn>5lP%8sVPa5} zDMxzD)@hw=x|#ze^LL^&)@zKl37VYxR<#urvo`bAku{Sy(x;{K9)*oZiz?ML(8xAV z+rVULNYTP2AcST_S-DIs!}iqZVutYbo3x(axTA=H zXGf}Rt5fzh2lF(n;#8)*rDn~RDeV!ceUo}6Xxh4LScZvM8*N5Y;)%yeN=sPA?8sUF zSmwz%M0N}*H7Nh@`G(t$SUG~~5pLw4WfljMpwrpYRUc4r1kUnfdczErrfKrITlsWr zfrKnvtxvefOWR>L(_ZlHSaU*>b=8?N5c#kMi$<`RH-fwv+nCz1GM0F(u{}Na?kR2! z>z(jC(4VpVajoxnfsYOPJYLgdDh%j)!%p;XWWwC~<;meBHLYsh!_-xQQ{N0tB42l^&4pmFfh zKX%a8#mE@FhWTU^u{kwIAKh-PQg}4yldgxGgY^v_?dhQ+ISLoOeI}x9Huy;N2-g0I z{Xi&#G(TEtrT$Akihaa}*_Ml>mKd4~{UnEYM}_%&Xf-CSf4F(nAT99Fd)SL=oWqMo zM_bhV9(xtZ|K|u8Stzu0Efm4t!bXw{+PcNHxT;d=Ncj>Bnap5358I>#wM4qz4_$GC5=qma z0-@AIV|S<8Ncm1O{?kuLvunEkvPbUDsmkfIIFg*XbK6zm@jT0OG`I$WZ!tP9oo!S2b9>GEB#~h&> zFZ|qid0x*E=DFQS;cmO2yM`(Ti3VEmEdD*N_%o|=Xhh<4!q}wE3FFfiC6nU0ruYoo zY&o0a{*?KkOtqOE!J4gUM^B7xZ_fNR_OPA-Lv@O5;wI>_GuP_L;gFV-=5jlh?5xQMVGN!=pEt+$lQ) zKv_v)5gpW^_ut*sI}80(ms>8MHp}Vo#O};}#9|*+Zcjqg(?@ecOS-froi=EJ7_bJs zGV#7LQob@n#?{~7lw0;mKyXh-u>iK~Ps13hQyf@ndqa@)1%lhpdV$o+sXO3uN8TBN zyW#l&kJ}r;_8SnrhU@ym;8So&J2w7-@jP*+BW z@R1<0tNAt?IrC~20&}5o2d!!`9~`4dUfH-C!?`_Jr^<&V>VbxlRkn;W(jYjJb#VK_ zkehF!?1V%WnKnlEESDYH(GRFPS%&hFj~8`BKb>?Lv6Lu51qX7fN-pO+t^JA8{s}xi zlw>{Zr)5vd0<6ngE_l?y87;pCsB1Tk)!%|&d1n}(l}o1;0*7K;pY8uHud3xKup0LT zuZqJ@6+*YTE2Z5uaAJLS&QQ7>^Qe*Jpqj|NtT97LLctq15+p=~t=I>Vtu3+-;AdjO zJ1%;Gm;6T7YxE@&_BCL8k3RN<9M^Ebou6wu#tG|dXh0W$2V_7GU{DVb{2D$OcYqCg zMWKD(46@hWpWgcROQXiq9=~4>-{!J&gzII7auyHbLCjsWONYiQEYYt_GQp)BZi4Rh@Pw`%$NjT~@A9XIWaOnGQgQF6m*@6!LI+_CdFU-dLdv^F=`uxgkibw*; zJUP;c(bSPtwZB;K5mD?3P~rU5DT;XG_kSG~BsI-4p2&gkv<0;CIY#4%sN?&`uac}yD8hP^|tjVMZV_Qli6Rx_iUxr4bn^wYXQHC@kjhh!0NnIP0XLeKx zPG$8ctDd%HV^=XY3PLEA?ivm;z&6D!imuy$sv3;aMYSNn*oq|Wg-27K1HqXrTzCz| zTR|-)Tjm(FwDDaK#<{9naj#RWaqG}FZo1!ifq~pSHW)J`!=g)8FgGa{?q%fRCbz%k z`t6p)S3S;GvLySys$|RHQ|q}+tsU^EB+n(Ps#e0fL@NBgOVHgjb=ZJB*Vwk47&zqT znY|DdHilgi+FI3~uW==(206~NW)a?ytSQ9Cr8kbQ5A{^x5Qc4rDeANhOw27FL>;K; zfh8VAQj}y_bJVPeZ(yY~ZkggrU}Ee?w}Dk#(^1r0qh*Vn*IU9_fVU0C7=DwvYZ5{i zM&$^FlHBMARhyDW{)%=9sQN7^g%!!yBK6exl^aSB78c|l>=D`t<{N}A`!M&#R~(zN zw_~4q9Oi;?9JSn^}g_ z76BmA81QQqLToG$44n`T>?T@2=Q zk{S>60E=ebfoP%M(sM1`su&zA7T;ynHz^FiG>d?y*F(~|MB<*M??gqJ4`k~n@9(Rz zy2G`r572*palXh0^csHv0A&8VB{LZlCnp0l6D4N@XA3*q|7?0F?#M0j!+)i6QL9B} zgGKhj|MKc%DnMt}r{{II6m%2^3o0Sz6!jC+ff_Q-JBtFmXM*e5mfp zSp2*a$6~ZIC~M-IbZKQhRsGp8B@#GnbU{-c2~$J+_xGhAX&Moy!#ssm2iz-43^N-w zTa@JoQdSuP3Id?jH|%ESXvJZrUZ(hlbjBP(dqWIQHAq|3BLMC(VAJevJ;E+7C!n0= z3i&MUe28YIf;)4z{9zjp+N^`^WZl!{@+3ihWi*lRYr9vi%|oqSl9Nm$$*_4c{V@e< zGIf27WHY?9Ia3;Ykeo<^I2VtVcko*fm;fly-a}dTyjLhGAgPiQ#@a^PeN5GQ_3iuF zLUkv;zv=z5lf&o6{lOvp4-OLl4>pgUr*537o%bv* zfQ?mZ!Z?l462IR9x4TuR%0$~g4s{m1cBQ!n^hsR%JMi3{zQN{DCp`{L?h0TWtpSfMs+orIeyoE@M8Ze{`*GIF=p@Hj-%)owGM4*5=ezq4 zy9VfF8|52X5<6lt{wv4_E(DM1=7u|BC8IU>_SVs_LaW0s|Ko4^%<4~Ghx$my5lAzS z4GoO`F_uw9O9@*9 z`ODL;n;Izqh7AT(c~J*ELk66*EnL)aG804@anb#Ej*VLuG}GdwHSP6RMAy-fBt~7u zJOD+r_Y>dCxnDh{2{#WHH6p8K^V@vd!pXyPj@EOX-}XC3A2aVBdx8L-DdVVNDHPpq zF|Mq`q$^Pf8b{=tJ1tOX+5>%_04AN=0ZR7rK$T`ozKI#T?g9IRLo5MH88*r!)1cF< zO6XvqRthwa$*M9ZaSzb;Dd{JVHM`1!cmX{S0TS#~8&H;BOoih+(P zy=1JAm)1)Uamu~Pgbtg{Qhkb^UE6Wlc&f^CrBP=gCC@#z&5ZDd$k}@#sTv>x`3lC4 zn_I#jKM%4!aB)O1Z#u16t|(?CWJ1p}Awspu1vF zfY9vc`Y5*xlri1Wt})tzpJBZH;b6Rr>Bv9rx<_ZR5*tF4n9``M<{{a6P1zq>eWRp@ z-E8JNCoXI0O87kq?JJT@xuz*}+Iknxaym587B#Ac;R3ZZ7V6dpnkq0oAFB3s6LcqH zSB&K~cj_yq9baXsWL7fjsS{)5(8`TZIB7rXFBd9N$^;0T`Fw*%F8cKnR|0QT%GBuh zg0sGGKD&Ld>$wWna^BEfWrB)Mga9mM`XLWvo&#mPyRpxepQ~Zgy~2iMnCpIQwvo)S{HD3 z&*M1JdRRvGC&HfK@GbE;qaz+UZjyiEg2Zs5+)I#?vAAJ&5jWZi#X3LPOeKkSoAdw| zb|x3Ry;Hi5HH$4*Z+OD_&4I#`1D3I zNB5)Hn6Y6)h3XXSNW-v^2nZGWO&c0E0|J{JlH>s0B1_RN%*2oh-QB!RT?cJF&f~)wTLS@cZdblJA<{$!*ujt4UVeFwb$}E_2)GU~C z;N0Y-Ga5-qZaN|tRXLY#$kj(U)6C=}r7}pcsAZFv zcnT=`io*P=ifR^|9$lNdcl8l2(MQkcajuUXU@v{6z3}CZaDI=2>jx0;p$hLI?)xC| z4?WKTEXH%gHK_`-+&8Vpf^1BGkrA1Y z3}cE{5a1@juDf*W%VApr4-Rjv9h3R0N7A_Jbm;Bev`l-$;BC7jOHo}yHUvegn3;yloXn+qIXbj4ve8K(^oV)VASw9>T4w-C=6q+x2tFWv4fe8cM< z(;*#r2|r^?d$UEX-Id*~O@fD)*!Gf03zJe2^w?lruCwFTexbHWN&bWe-b%X=H*0i(7u*WGMi zth?kLi=gfM8gaGG&SNp< z1RObk$~1Y7j<5R*EfT^i*^TU`8(u$tI1baoOar~WW=~S|wr**rw>*aiXO`JwO>#6I zc#+dvH#~%2n+W3cn?8@QG6^tGHMua6f?TZR^U7hM`Btd5)J!rMJrkqc>~U)j2d($})rp2#Q?sUy>CRLL*wOM~<`T4D!L-OLc%Qc2m#9KcF({ z3~MuWgk8a;#RNBEyBVj4?wJAf#Udq2SNAJ^)a}^%aWB-ln zr-F)KE7sP-NhQ&Yc|5=Lkvd*KZA>s7<4mYL=iH>n*p#O>(4BUKC`n0u+O=Gf+en9HfflvE5 zv_4YRbmfA% zyo9}n;Z74pu16E=1(|ajiU?KPIYC$4w%^G>v7PMpZ}Z+TGu|NPE06^ zfgTilIG%;vc&bXc;lwbVuE1LWcv#AJ zgK{%w^TSHL%K(N|sPL{;r3Rn-XhQb?KAw(X$7ybD6oC|9`jhJ4XZWs{-p=41TRHce z65xqh#lE%dfb}=5n)2fC4MoKb^g2yXC}F3m&d@?#ako@wEaZ2F2Q+$4u1MgNbOrXa zPZD04R|QQN;wK|=y`v8S#sm8SHO;77okeDE1E_AEKX)VGY8)GF38KT%_yMU(Tn3`| z!jz?Fn^`d%`FFO$0~G$t^yA|srgBk=BByiF1B?|~j#xsj7I<*%u!7t$J4ei<`TWW~ zL{%8W3Ebv}a`)!$tUQaEmn*>6wGWU%O6G^hfgf0HN=>rV(A#l=o2DaR ztSn~t7n}xjY-nW^@!iUYS#K0A@i$FqScAnUW4_bvY5%Er&&yoD;#q&1bQQm`<7-QK zctb|!3*$O zxOY<_=O`KuVd8!vp}ZFZ9a*T`@)^JS-BzYvHgCSm>0@c?=~QyHjA`n^siB+4d6QGH z+f>5b>I*5I>fXt?{0`Ln4xvbX@KeW4AmD&+NM1>dv% zrw9!d1^K-o0?i6S+KL~~Hwdx6Oe zTC6Sku#aLH7B#^HK`pYWTHiumyqe!~w>-k>U6^T}yMSuJW1k^SX9OquV6+9C&PdSU zS7{Pw>>C5EGt^FZM!;Kz+r-u-11j{kY^0NtIn}Xzp!>qL%Jd5yB*O^c*-7%^=RbI1 z0m~|4FES928`Xa)So{~#Gqp4S|4kz_;eF6fGX3*R*qb+G0>GfakTHQ z1cQM?M39h7n=(m3o4J2q(_w!74cN32t!*{Z-qQ2d)wZow1$o!4U)l6pdz#&>UbFVD zUE93!TJ)zhuZV zCvm4~nWud2ZAk5SmPcROUwjvS4hhqXB=$Cn^xY7nS40qcG5*{X^W}?WTka3FAb03GCZ)c2*7pn+AZSmTK3{-o12q7QehpIDau z)YDj`?{K6q-3UK|B6i{DaHMbZ4D9px#V_@Y-J+i~SNre_`RBNX4}#FY>K#9t`@J}2 zZ|C%jU-}tl3!hAG8d->F9}FS{l5Y`0;=(e9W^^!1LUa)52qBykWQ&wA;Zqfn(t;_& zFzKla!8KFTokJu6LE=)()H1X>M7>g$V!u}z7h_V_s4d4PlO6d7asMLv3U z(PWY;eXEg^|JD%6qFT%$GFC2iFJoCU+0ul`$2-ho813K~SrUbxm%6L7jg{K84GiO+Z$uiwyl2HSZ2-M$HVm9vL zEGss5K4eO zJ`X#htuz&*F5AeJ=}D|KDNJNojLxvD;6%sEYf>t!H-=%+%uR4NsZN|%H$BAb+NpER zz^t@sHOlIgYlioHg8;q22QA~jd#_19Vjb5)E28Lf^$xst`=Ug9g2zD;9bkh7*t)#X zt#rqNDLc-%P*(QP#*zVAOUAplb)6&g&O<;lu;mK63u%aj!j*P$mbT-?N5?@^+_b_C z#k=lgF@i`>V`A=+w$$2VZydmWvk?~J$i56S?}3C~Wr}%6G1acOkpuErURrLe?Q8Se zyaz{pwd*&a{i`tv_xVr-6CV$02fj!Nsncn;4R(_zlZSUo#Qkc%UO1ewYhbZ<6MKMmr-_JZaNJs z+J=^|?R0x8RwPPYNpn%nvW3#E@j7rwQ#}yGJZX%#yohs?$xJ?YX7M26c`lIgE!Ab) zhMEa|e^2=Z%fybC?+{b>P$o-Uy=H>G(g~~xa;bT+Nff6P1Te%-Rk~*y4oi_=>)BmN zCrSR6C^@zCC;A@&^?`8&HkZPqarYL&E zO*vPty)8(DABRn_C}5|GcXb&9LexF+=fcBBT1GZ3?G3xc<0aZEoxOO|pvlC$XwGQ! zhH)8{5@I`N2R52hvNOicB0M#LnGNm;E7U!)*a1B{NIDgdqT4mZDf>pukam|7B_xbX z0Wc&PQR`g9j3>{gnF1LZOWEfb0z8lo>!oOVg^#1#RgY4azm1#70^b90r>i{zr>aXk zL)PA@Xq!+cM>F*SFjdcDu9Hl3kQr3r8x zb`EDvc?9DI8j$VrBdo{9aN2oPFFpANlCpuoBvi)f!IB5H)b_@xlF>)h6zf7!s+?3- zyR#A-@D!z|ey!_Eol{hD)h_kN;S1vxj@0HJ;ZkoCK1bvA*3@??XpX5Yy*<(=)uXKS ziDl{as(-k~lCCP{PjEykaQ={|+NW*c{J}_d{~gEs*rko(AGB8C1MpYMlCSj1zV6NC zuYJU8x<$}zQXjiT`^n>(FgqOd3LHFzn`+^v)lTx!9bql4otu9=f$7|EYZ7$OGABWS zy-6Qo@qQndQF%D}wMpcLw+A=Q8^KJ=H=4|`6l18U@J?6uhu}?Mki~laEXU83-Q5PW zx6;*sR?mU>a2C3N01`Gus5&bs)e-?A)&25pb*6yW=@@~% zn}~niu!nfXX5DEZc=H!ywUc*w}ibv(xM7L2E zRtkA3=pbS{KW5vq2i4Tss2fMB-F;Tk5-@r)MgSeL9E)UY3 zU5PdlukJI&{ki{m4*#^B81m@6rIt*|kz~gXeH-{JAL?XYpI3~+7B8H8C(``Ks=w(p z1NghKQ{@yzD|_XnT*SYDVVG)i`>o(9tU4bZAR;W(N*jmEnUKn?F=4e1rXLpoY?`|!;gNH^GJQZOH0I!hXYeqWAEJ=BiQHF5l&iO0%Rad0rN?YF$)O1mjFPhKUeEnKQ1PGSk68=e@^9bZ?D6OpqUyFVv) zM@~pNv^T?-Pm7;lWpU#NBXaes%U3@ff}WYGbJ@x0c6;s%;E+Z`>7(n7-o~mYVa0)pb@1@Q+DYbCEPw$ zdSPuz^I7r(?fu5l?TN$19tV41{Q$^f{8k!xpXpzJVY1~g25y8wE3gp)0FBCe=Y3@-tU#1igv+BCyL25iRS4+~vrpcTS{zqRSt>ARjLlrX&Y>j^P7?Svup1 z$CtiID`JqG$s%s46S(o_pnANx401pTJ#m&lk*+?s2!n2S_=+e5q)4@n2(@zBMOvJq zlp^3a`G(;Y$KjNF{h&Y0neY&saXQ@t7W67U<+4CRS%8L&p3@i2FN{8L56}4Ydy5l% zbyPvp=tr|asDefa3;;{!VQ#0E<4&i|VGgJCMsJ`Fr}aPs>Ic*M+?wWn<_VT(oIquw zfVo?9E&WE&WmdEzNWohii4Q~)JbxU$KN7%2o_s}~-^eQkpBsg$O3b*aJYhTW!eo#I zNx}+~s1(&n-r*1oz8pY#gSY0u`<_7Wd_Z6O$3SS4{?Hyke9u7FZqjnG!NyW8OqW?@ zZShuk6bJ?C?g?hcO=1h*0@>{AoHF!_HNh(W{IM?K=1hWw8>K#-`M8*z0?o}VYEfD@ zL|p9=s{|!aMZPQ)^!g;R0-wSmkJ1w&^ulBL1B>*(x#enm(W!ZiK z@(;4tZ*02PY!JNbSJ#Ga0m#yl<;9LD#RC|cE<{RQS)QBFKOaj7i`%{}tF@g^8MozR zcK&=z&dUJ}_Rm9lMttQ32L0Hv1#d5`)KeTv$EMuDLKgmz8-DV|7qaWOh!QgP3)DPo z^IH>@ckhAtf%bcd$HX&U`dKf}o*zLJ@Y8R=wa^JAe;{=fL0|`gd7{K33SR@;qiq9& z`&DTi`Y=&o~q}0LliPOSPjocHF)Np@3UqHnB6QTV87`CVOGd4vyf`89^=RNN2kJA@#eFTZE zRjV4+R^NAbBxp73RB70^CG)HPuy9TLdsx&>Ds4ZR7SV1B?`JJ4q@wKZuASz0ee+7O zl`DzV#Uj0zc5~#6Yx>HP=%Sl;JIR9&nO2v6va)S#loxA(7eLlt4 z#Uov5H}MG-HmQ)+I|t)70fPdbw7x_ z8`R$&H+*G~EkLwj@)c3OfHKOcgq}mkEojvd%GM~vOjkmzNiZ9xy(mKlg`;B%eGyL#Znh$d~Xxkb0$4EE%e-k?@3OQZx@KYo0KBqRAgEoU1#+ zt2?KV=tQ?;d2mD8^3EM*^8C6H%A1L1T%C6I02fnx;ITXU(-VmE?i8aNiH_G3(cL(8 z4C}#7e}H$cKm7Y$?0R$f_aCjbbcQOaBO!f!B{wsAJ|Iy4BSI6I|_IsR~hwS~o;?H{ra(?lyeABvL z$nJ;Nd&(-)TTw$c7^zQg6kYV<_+5~lH`33h=ls8QD{A~n#M6tA^>X4*-V`m#tY!E4 zi+BBiH4T{hZ**v)4CBjlNCbe?JY)W*^~FUY9fea$?} zZhs~?#~;WH<{Fhi=3jLGy|GGnkIAJrL1K_svJo~d*S@scK`Z9Z?q5e==IF~p>x1a( zz@XT`aqR1=+>ha0nTt^VzFJke>pD^Gj>Pnt{$-x(j7U;NCv$EWsRW`4gLX!*TxZ}7 z16EDfK?Cln*(IRzBJ_D0;wfyzfr&emhL z=6Z@CMvt_VQW_onAq>}%>`5(8EUb$fgw9vUwHp?Y~sWDK7lu$wq0UK~4QR*rY zWYBC$y3x_~A-Sn;#(N+hv>`bX1EKxFJKzQeO9T~7K? zTIlhkYqzZIa+OIb$v1_}XFY1V>1Z`EG@B(@`#Bu$)H;)ySC_jm2adnI9LTo-587>G zyh|*+=a64Ys1Vlbb3@=nnx7j{wd~Hy8#%)ML$h;?bg^lrji1tuD2!qu$^7>7BJRy% zNL+hO`Ii0LnJBZ3Br!tYD$u|Qg zA94)OGDud>3=v)V{~^O#GH)OHC#3VBKtOE&hp_&SO_B7!L^glf9F4BC9&NHwC`$;D zD^%1^R1}M(1Pdg95ejg>ig=!3cr4Jm~nn!S_PZM?d! zs5g|Ecy27;G^iIA@_kD^#ldb7I=3pbgKD=6?3mE@q?xSY{#0iHf z*&^dUv=vRbD0}O)dJr1(!(%U0lG53Wn+XI{2qWK6@0?O=H>&v#P&0mR2v80RGlp2_ zM^HMqRaql)Wl#-cs5d3+T$2pH8;^fx@;0 zQ+Q0>o2kgT3}Q~GZu2`LZki88WA5&FGpn3mpr7+DLNL-c!I+>*CmkJkmT2PY{(!&c z#^B;7(~u7`kxOuWgUA>~wS-zum(1X3KFJ^dW#1|Z6wT^!fi2+Q8?s^RO){YzSNdn+ z8f1U~Dstg6zt5JOjv$@(nlAa)RI7Z#76-H*&c4L{!jwILi~YTtcdNhWDNJqVXONmE zyI>ka0eOa9@MyNs1^wSyad+bk3=Itgbb|R`s#+CYON-@7+!*Hk~IE5}LkwA15!jn}_J+<$rp>Gw<2Cos4WOzRt2OxN^^C=J*23Mm!W{D2weSBo2e0ORkg z+PD6?k^K9LCarINVVQ>TbcA!_0Wk-0j~jP?NngxXH4cvq}p8zZgV@N$iVbNI=n zAy&a-fX>pcf+L!twUuSKwGsWYB4v8wtq>Ah0+FhT_~O)sc5P$M^fmjkanCRg=M4;V6@}8ysB9R z$}LeH-?2@x9T8wz&MvZp5T^Vo;#4}BV~w@wVnrhUqW4U|6?R{ZS>JDtO%v1DgjYdz zu*R08vAdx`kXulcAsMK{wz_^lmH@61Vl~ zT@f6ECgju3$khDmsA^=myMllVm!=GF_H$~>hGsvZ;T@x$K6J4aAXoItcP1xVolI(A zu;)Nl%2qA_pp-5h{{d;;NYkC#GBB92j})@l$Nv_z+W8X@}97}cs#G;CT9TcHl~ zRO6P$kiKfr3k}Y%(1@#6{X*j>!B%*1*7Jif2UpXbimdVgKU1+8XrfkM=@ZnxWt)jfGMAB57 zbZQTXt((t5kXF-f?>SB>@2SnJ88sE*Fyt)MSH3rbQEh*{&lXtv(Z%zjgi-Vyzqh-* zocY6I@yGk>Qi!@S9iX-Gd!x^j!dz>7sD}U4sspL%JK#ytsx(oN_{5tr-H(SJxS%M4 z8&y(tJLgz}76^nO^-=1h_?6hyirPu%DzgAc8?x+55nr|790UZ$4&zW)if8bxu7mzi zAFOtsgMRc^p+{dr8)+EKZmMwwPjG>XYMh}Iobu6TRY;o^+#qJzXzL2JZR@gJytOsT zCU&HQrVckrVJ=Z?tK-cya|UrMvvCJcT@`mQ8P5oVw1KE3Z6}-dKI3vDi}<{1qhDx$ zTgNKFu#VP0ugT5QeE?S`l>@Q4;mHTh!f)u<_k1hNlKJ)x6Nri7k?nubi)wNFelf=% z7Rq~c#t@SEj9d847vQxm`nmbJ50UCcO%M-_c0R4q7f0*wP<#g6iF%XdvW-bbvmu#*r?>47cW*u@#QT-#C z)0Dw}kRq&rTJD1{3-eLF)W7ekLWSvp2)|UuoDOw}k_9L*E>DlM?x|Afn8qeg(G;lC zFDT*WBDzX7Sp_8Fca98UJ`Zg2GzgqOqC&+MF@fH3kX=MVdjyi|1z2n*cnGKLYu-=v zSHblxg}gZ-^k7&)#+aXuRL>4@OMBEG4`^QSh0`PervCgV@y$ zd2>VPi3o4cuAqx+&pBlvNDYe`yFbW-YvETG>Lpn?>`}cegkG178O0CdKPHKB1nXb^ zYdU1*@6-y)uI)85?XZ8BqW3eAsJ9);nM3*NWe}`4mpjbjkk)iXiebwi2M|{r$2NLC zwSoI<58|DE{DTslKR39qqw~;q6}&IkPj9|BEgvuRUXhG;#*w0y$s#%e)?)?+DA5*G zSuyPx(+@MZ_)6`+{tqgXvbEYd_Yda&1^!>^7?lle9saW~LT<9G{gMDu*q&uh2|O)9 zXqbH#e!?bhLjbV~df;+VkpxD%Sg-vx*@oLu>?#{Fe>5rzq#qDJ3}ZJVF5xn1S`RmK z_gynH_v;&hem}5BTrP%{$MT39DxT0$s+8*AEQPHdZW6F@^28A9M5&WcBc6mddWbBN z?8L}WK2$Z%emICf5~d-+lx#-|)k4)aDjD~|i%g75DmaM}IC%}9Z7%Yo9z~`lO*&}B*#(ZhOk<~hx>P`}VnwK6%8U(c24I>9a-3E4a6O$}U) zX6C12W?}=`9!47-GtYEhnnh7vE$c>0`3|`ABZ!^FbhWH$4t9!0&UJjy3NbDiuH$Pm zyWHN5Bc8Uhx~JG#(b-Oz-*|GGQpaZGW6EJM?$+b|ql_yhbc8-mgQ3hgw* zIGsJM8_*wTdepi12k{(YkTa$b~leIo!7wY zyj*=T?{fiiT!U+|@3w2k+|mYiM`}?%hn7wa2)u2&(f&rlH>k#*s}XLljD||1x#PG? zUE}y!KQ(;fZ)MWXj_!`~s)22{OfezS(I(#y-1)zw{_jk|79YRv_-BLx{NHAZsgs+f zv8jTSy@%)jl*n+u*st+HKtLEn*ttQtxk1Q@LDcPkEfyWCv`^=#h(Tx~oh0e!r6=cS zpyX(&q-Ew{E2QWvR;H(Fq)ki=+-0TbB7afPj*KqJn}kfD(Zwj1LXKlxSkE2arM{IRmdS1ffAW0R4wFWcV^FDB+)Qc>F_H z#sAMC`G52U(v`*$MB`=G@2<0sRn)d_eIc@V9*j*P9#u$aDHW1{O%x!Y$X29~aWi0l zIMTQLB&7V8jp-uy1+mh-DL10?T_>~oY$mt!kApMhKJRLo!UzD7jE2+WhA7??(jK=4 zX*<~M%%OkhOK9CT)C|*tb(NYED|=tUa)aGGk*$dSXdf^g(tkXxuYt#N_d`}M$`IZ5&CNAs{=N~2Bo zkS0Fo22H&T3miAn*zpRx6Cmew?@1>cb(L|j@zV`V&j6XCtHO|@BujRDy{U3akgImMf5dsJ( z6&VPK`~SM=|K_A>Kk8_zXg@unrUqDGl2BiNLs6D>ChU`PU6oE1pc1G0JP%bR(G;qy8QkL?L^IbI6 z?W*kl1e40rj)Pr()uytdiB`kST1Uc7{Lt!XsTliWvz!YeQo)p>8UpcZz(sD zTvwZonkzVCL7a%G>oHEn1!X+j=Zh`x64w@!B+R*G5DqeNtf1C~#U*6dm8-W?cCYao z6F}I_1rxw1CP@5>+IGr8@{uBT8yzwbMsWt=!fe=eT+0ICGQ7_~o6Na}y{h9q#$JQp zex1UmLntXY=fU#}-m)UNCHgjJe*DGoMknqZ)r-F>qQQ z#gm<`Oh-}cXn6*Vc*aVS2B0cK=edw#KRY%@oR{0Z-3enP&XrV3zmOxI=@hmUbx7?x zGAB~5#ao(jNlHE#fUDHC&1y1ob>=5)vc0(Qh;l8%c{}6cWK3Ny4vj6m0@E56jQYZz z%_KK(gY4mXiC8CT9fcKmSvzYs<(9gG%;EH>uL<2} zG^bzf0seI{^r0pvo($onBv-8w@`f7WFd+&Ip_(Je4;_>S!ck=uY5dF;u3DlAbC40k zzJg=4m;E6PCXx}|5(3klaS#Iw4)$7W5lg9wm#(SU*nCnqa7WsED;?<_-Mx*6x$ z6)Cy0%aok5HsHi%&0iAwqfc|5=j_s%0L&XdTB;TE?W;g8SZ`$79 zbigNdTl7pX;xC}u_d_vd2iq3svHDvu zTl|l%3erBPi2SbbwfP8sL6X;{J!S9F2EUk{I2Bg|vaUy_m=%85>xLxlT`NLjxJ7_M z!*5i?4FY@-3CeX@2o*WL_dg87b6+>I_H(FR1?Qt6s4# z7@?A)x5`@zm9birs%o=F8WckJ5fb%$eKkV$NIs@Ad%`{*pN3(Pn954eese`#6ak#a z`PH*E^!eqW>Z-e{{ZGme6Irl+K45PfQA{kSN6>v0zA3rRifR!+B))nfCYVCHNP{`Q0`s5<3d=cY zw9OR>pgRr~uEIi2IpjRh&O0A~A@iqe&ZI#imP|NNlXN{rZgWePPOiDorP_!jUQt@p ze-TO3ANrW6BX5imZU9U?SwpV3^voRYSY|y;E(&wwX~?#x2sf;k^$>}&i(msL%Y^9z zR0rYukU`4+VDaF?v~fYXStmMWKmo#82c6#IrVc(ml^Idfrmce~zl@Oz!}76r#Lo-T z+@lw(iEnufw^feiTK478%o#5-v35VGyrctCT^4aXyUKE|R}a7!Qxu7MRMZ~+!$n+@ zJbE<<76`})_rL6E`0tZU*}~At)I`O}(9YS`^536Xdo`goa9_}Wz6}ixu%L(pIAr=X zEJ+h0#;~&kGQc7)T%E$yc?mkmEIEWuO>eENpqb zD{9+X%iUWy)og98c|UfiuN%5?2TSz%`*J;huD*A_{huE8x7zoh_eB&h#nI{JM49`j z4q*71atGVLo;w!f?T@JO{l?>~9pMq{O)s^|>Wr-@l-HPDd6n52TtSuDnOsSf*%@6? zmAf-GM|14W3ho|{FreF+hV1yM8^`0f8q|mSaAO`k{OQIV2_f61InF5_y*oQV-K9FV z;=S*M{k|dy-k6>~GyeF>?945H%kT~?gUawuEC8?Qqj{E(82RzX>B+vRfAx={`mr3c^E_$e|CJjeAmyPtpn{f%Jr396>IRji#mUxM z3lRcw)@BE2r*u^mAuh9uqW`Y?H34r4+JzFGT_xc7;Uz3fVoSw#>5%bK_SdnAhO90C@P@WrD zEGQB$s-l`-$7Tz=D$?Sq(hPPiuG5dMLN>0(XHAK)TGfnmQQPStI!0gHpei+ zgU{YEj6%~bE7BguzREWpMN7U$t(05jL}O<4E%1Aku_r`2&&6`dc#bF&s8{za>~n|i zq+qra(=3CB-gl^i|t7cZW`V1&-C^GhB=@ym4&x>671eZCFo2pp(DyTh^SO}Fe z8w{yI|3!s=^2IUNRa(h9E*EIh)Wpzr;HWSrW*IydlasAxghjZWjCwxV48%o9E)S_9 z<1YtZo6(pAQ%-$XdL~BZWkaJVe3=7v^Rh;E6K%y<8}_NfT7l%ks>ry+ZB4_|ETXvT zs7XB=fKjwy9=|)ztxSrw+IcD{)BIdgPhZ*Bgf+Hxf{~YC(o71NPKLV0?uJ&D*0z`= z^0AG>_KxKxqmB%EE=dx;SF?EtHS3rqq}a~&B|L_MjJurXf!9QoCoa&$g_!gRt_5Z~ z`_L<4A*>*V!w4lWxe<8o_xS)M=~pBq{RCzRxiOR?7X70!W*1yA0SSkA*yJ=VQZ_Az z`dI!$QcU^-%7*dfM5-h9YO{=g;=MYS|1iMCcIKQ)dppgRQJGU1ul1U#xpD8QJ4XE> zE2RJTJEXOS8O17i_<-Jva}-9kvRhJ*)6AE~jkdrz#hW-R*S zaZ#Jv=m|SwVUwg`XwgEFDNru6Oy%U_W~r!IwozqEH)7c} z3PX&hOZ2Sxn$m;~Mq&_wR2&IVTjzPZE~G2PR$7xf-divC8JaiLSy1sntspS1$RM)e zvl%R7Dp9?c9eS~G4*m+f-E5Kd%V8vp<3Hs@SEpA-3h;=fEJU0-ew0lW4k@It2Pr_^ zpA#y?DrV_3mrU*-USnJj^K=pzPcm7ASW~X4B)$^4halON6bIy%r1;Ih3uv#ykTIIYp2SptCuZh6$($8*&u>+kH?;G zK%UAQ;dYoUY2($o)#TX9trI5GteC>Y;c_bqn5KKvZJ1v)P8_q3VyVl`w}02lq;M#z ztM{5TF3)RxG%>t`;9Leb>ADz;pCh8rsUqE-Bbhlx*Q z1wPp8jX)}Q?(fvA(&-$T#>a1)lfC?r!`WOA4k?*s5pIEinEa69YSd>GdwCG&K_CqN zT+p?0;j@9P}YjQ^D<$%!({*v2Ex758~&Trs2gW2Rhpx^B>$Wfxp>YXTT5?N1LP1-F&Jx4W( zCtPR$>t?z|F)D(;0R=@3`H-sQ*b1j|@8Fb}(UpzQqL_XxJYuS$5;1u*ldTmw+eR+B z5GmDE*;mALOC{q~k_|mD3OD<*yi*5mJt+djNcOwAT86%Hu7TDBkgUv!&|fQcg84{p z;!d+Hl(Uv-3evV+Ix8rDi(*4gB?1x-FG1TCy(F(ZZPXW>tljN`+hpC$cw9~b4qb`& z=U7Ti>lpVX;nW)=>rQK8bh=#f12aRfJt$ju=X5(KY+X3QJkid4PL17|JZA`OcH1RK zHl!Fy&ZLdwS(2GoPH{;6X_2-9dDiT{eSyYNhTgjCVrDG&Y+vGta(9Nom~!K$Fl95* z93@Kh0Y@0WO)11)dMekGE-N}wJo#Di)Ci2iFy+>X;k4ZPQE})U^MT*qY}YaVO)K4< zkGbbpl0Ah_CaO;J&FCDt<8S%Hw9uHI6(2uXs^fd^RD`BKC0SaGVNH=;2kqtbgmJ&f zH8me=XcBqF4j8!COka6U=*;bZ7QLykUWucJ`h6fx(reB+Bc|Y6y&abQXrNY?1Xeh9yCI`t0d+!(H%*KxZ`UPYBu0{RA^mYA zupsG3uj&kt`l48Lr7$j7s=fC6CN|)WD{Bl%{o*Oy7+_SRzZ|wbA9}s@YOiY^`o^>L}-n&y;NV@(q+?DlslTpT}lb}cZH5=kA1Y+*VHTxa% z1a!c|vc=?*s2=9E%|hqqIOb>+uN}UdemfWreTvL+|^F(qw{=g@A&~F5T z(gHL9iBT$H^IH95>L)^hpurjUT-;Ggu*G%*Wcj9NqZgdD26sNKc8ju0yWh!r4l zcJotfJDy*JN3=94_pZ?CeSzRDewk;9ZYCRTlUoc96=)}zc0G@=ggk~OpLy}uH7uPW?# zl4pK0yJ3GIe%xym(Q4>^{sZGvafdekOQt0L&z$D}0pqJmin|&*nUMZJ9{q2BlU8M2 z`DFn#-sY4WrK-cKfCA#K%c4kMLS*=nj2fe?8iK}wPaE!r;-yU4a`2xtdJCU@$ot}$ z_8oNJ1lElazUfTwvpi?}yIjuihi|X}E_{!Sv7m5K9r|>#U+g;DMiuswv`=Sn$~UdN z5aq@wgASE|RuAnG-o%^xJYxA~YooeX4{~YmW0%Li7P#MAN|EWO5`f`k36pRp47@s( z`0;$qF9qvFSG0CDg?l@8Hp>E&!jhX`;g3EUml#9^K3ZW%>>3a#mGnQdax(*)nk1>XCfqPL?Si^SCpprmyuG7}{Y zZ0-e1$bXsh8hCI?611ms8aW_};Fp1ly0)#6XNgw|GgnIY>QmXttWWqe&fTG@9n2pA z`mt{;dJ4S7)C4A=$_f0yKb7$2=C$f`?)Dch5kVRLKi1wc$`&Q-5>4CAleTT!wr$(C zZQHi3leTT!IGOL(>-u`Uy01rnRXzIOj{R@XHCM!1u~*C)6&3tM&mg8i@(yYcQ-2TJ zA~u%(G5t#ECv4$L8S`$iC0?|pBbwA)JGVp7EqS_1`NB<$z*@zaM$smhVP`m!@ecW~ zJUaaJH%*2F0QkoEKfC?^Cy)NwB&z8+E32XIkTH$RnA!q?2|_}~^9>z^MH>?E1B8G~ z=qC~)_ls8TNZTetCv_}(-Gaz#)hL#?sx;4`L8<#`RtHNiEeu;8i|9zz_$-3^rP5sl z`N3Z}R#esO_P$Q#NI(D068C^U|^UN$A zO6M3~5G$3Tcm|S{xjzsq$uT~oD9JInWL7Ln=NMc_LsIijFE(-WOfGSh&M>&-R?yLx zo4q}Xd~*-y(NR2^g!B@YTZSbpbxjFX6j#8Gx>!w#pXF#Wa^#c1K`9zlB-^@>vTUx{ z2#91wC+}M$qJ%SFBcog~gS!Yocg7^|WMSgW)$rQjN2EO1G8K@#TBHs*bznG)!kn$m z<Y^&r2*L@RKuWFU@OXO>%RH&7HGms4psZeR zNG{S6(ga%bBHGrpoMVg`D7O$Z+Kfg?cH8Q2MT|M#48OifHqF;<;8C1ASZ9XTG(R5- zg$3X+lM_C%x@{c}XVU-kMI_I{tafnSBQy4E!9FYX#GJ>57rlO+03cYxKDCN_#eq5g=XJV7M5~KmhvgN`C(-#p9&46vn5nt;(w7iRf-WM0oGqJ-VKm#VpV11nhKR_@TuG}& z#arHZi-|mVqr6$-;aX0E>N28!Zr73f-Z@&2i(e1SmmU(6{`XlwPSVE(?e|ll| zgv>0q0Bdn+u3uoEJZa(%p-BTW}V$jf=O_u$JcVtSlz8BJNk>4Mp{@ht`@I?w(wxNSbz7x{Xq;xYp-Y? z5>C`GB?X{hYPwE8_jVc(=cA%& zi&rx8>}?jDh0?UVl#O$3S962QSQ+R=WL_PRy%K&wC+%)vPFP}z+P+-ChP4^bk&5dn zSzh!i+GXK-NNd7z+GTn0rOVNQTwq^djv~dD-NKOFr=}kMT<%zuW7V==vCe6-_ncjG z*2j$;@u!|I$E7V38iKB=2nC*allx6Ssc<^fZ>~!W5 z8vB}QCb%&Mo4e{ZSfuGoEbTEL4BfUkn9s6*qrJ#hQW<4PoX4Cg82|WmyBKHIi%rP# zlDtbnJisEuDxLWK+;#AC=+PLbhc=v`yjk9(V`gfDua< zJ=mJC)Flck>YTJ%EASVbnpOo(z6IJ5zV)-Rryc%Qb=|ARC|iJw3Q|1u!E%1fX240SP|u7l%j z7U;vt|C_rVeZUV8>CoR3a*pnYuHbN+pg=DepUQGdpwEcAo&&t6(VtZ>-;j-^a;y&c zO9Y?~XisUc7v`HP{ta&7xoe4E&1a9rgJR(f*zPHSPNW2W8ce&rzhf8XGv_DWx{C$Z z-Xt+qMtn(0nPg5QvP;X~1IW>!lc;Wj`}Z#R5njH=7s3`^(2tV%7l_6WWq#j@+qHEI zWZMV#@5ZO09wg*keWXQ&h>DppWu6-&O<->z4GRT2Am3bf4-n-`1#8s(i?i zly5SYb)IOcv?1Pt&>7ne@xo~+FdZx~KB8vUmHl1}+P*vw-@+OB-7N^x;Zi%jPG;@T zdnM@u5{H6&3l1O)`C`H1TK@$6m47f@Y#kB#};96RqQ1Q9i&84x19KLcP;T03$_~TkboH6W?|8qqPcsk{HNiW zFgt5$VDBNaV^^+WW+oCZQPE8&Lp+Stq6C%B#5kji!RErNRElIs{a>X*Et^t{igv@! z!(agok=fuuo?$L-IFSK9_)tH~6jH97NKJw99sw>QCGz2GyX1TljT-ic51l&^kcB?% zW$?8hub3b&<*4G|wT2xR_yQaR7V;w8sAKKKhQbbmz~y*8FS~N^#jdTfAZ~ARHeHb0 zLh6iyvwU2~k73`g=wL1fi@>>LV@>(I+m9M6^<&cV`!f<+A?>~jQbf7R8spgSgADgv z4L*^BV06eM59zpQs`i;823LN-Hh*uhHU}~|+E`crC9}CQ#PQ=bm=ij4)^yg7li7H0 zzsM!@Iku^6f@%KG$foyiDI#?YapRshvC1@iq_d#9ChLb_w^?6Z6lG0)e;b@Z zLatjR2Lk|Df&~DO{6D7G|M>8aujK9QtpCX{)k`I0HIyG6q_z5Lf5Zm;`L)1N|I(F8 znsOCD64pQ@N|7p830h-=rl`+7gO=6}&Ck}`g%>Te3o|a%23aoOOKHBRxU;yb7_K02jKyPwPD+sA_>-a$F^U#I$49H@ zqOe8-NCz+zq8TB{Mv2G)q{3juf}|BNJFPLhgvQ(>x@gCA#+HgDl_ogTL}AG`)7dz% zkO*^ohIaV&W_~=Q5JP zY%42mMc$N|h}lxmH=1u*X2VO(P*(Do5H~S9LL$Qis1GX8glWNS4*l4WlKOXQ2L)q2 zYT6KMs8Lsdw7aUEMrQi*P$8@se^%iCA4ayFUrTHfjTfWAM}JY!|23C zeFgFk3sytT9^nARLQuW?HN$k3DGy6_lwMGMTQE=|&kIabAdse8;$c9>Y?^VX8CfQn ziNmOkX!eXP#1llsEpdI}0&2GhG!)6f_^O%8NrItbk7$Ra0ktzo0%~{2n6kZ1Oyv%K zOKC0w?NGJHldX2wEB^+7$5=i2zL5+SVPq0U%1owX|KOhFBRC+|PPlIbnzyF}nztVa z@#e$(cLyg=ilulm>natDI}5Zj-xgM>LvP z`Gb(&+KU_yla=~DODHG8?2~k;^3KpqtT~r4%52I3NkfA=ktVk_X6#1H|8%sw$qtT* z{$jBvY7YQPK()X1nixB(an02mvFJ#JpK4ASi}ris3#?{-BQe=gti;3w(J`d8_&DAwK@)bM3Jp`-OHPnlD1S56U z1F47*6D_pFLB-8uHXedT^~y>%Fx#ZUt2CNgIle3Qu6dIQf9EW8urs8JWv)QJAHfbo z_~a#au6BPCMLYM-3^gv7&^|O!E$dI@gn0edE7OsNvUV4!$sSlL4w9*<{CdwhX(h(< zG`UPArmc}jRo{#s*7wRnr{V(J9-(?4`jr5P1-C?%QZh!0 zxU>PP&TN}u_#l=j*FrK7tk~JZP8f`AKmPe5vB|ufNp`gK9+&iim$ZlRHR&%+NCWg- zF^Yof0o*H+CyPQFE}}#zW!)0tX5^46dr+J+;=A?XS zH+jY07rEs5FE~`vA?T1sr}6Ic;_xwLAL6yW*Yt^pK2doQW=LAo`c^)@G~T#KmUwe+ zDTvehz`&|9Ghm;&Ec<}SFGGbKQAa>$kIw3V?r3!FaHVL$a$ZMh0?F^r%XmVQ!GJyF zCie$UZ|Jx|66HCce7LkI>7`TY4GgVK{;TSdl3S8T`L^A(2+Mdt5yb}4D;E;OOb8>z zFbc$=FA^po?!25*rf}B068eM5ix!#Lu2|$CL`cwXe?Ew3!u=|XDT=6YPa_pDv&e3Ntj)s7Ax?dbBnmc!YYh7OQfP+a7DCO5I04olr`cCi%(6FbY}6 z`EI}dQUe9tHJz_pufx^-n?7|Dc&nc~h;d(qI&`J*T649?a{S?RDp4pQwor{V$78Xr z0}njKegMvWCVJ}uXsjEv!>@8tK%pBujy-yv z3u25+{DPn=i8kGXz=h2GvYbMg&oi6Q1EiXoQO@)Py&&V?R`F^g0%YrOajKGODb z5Em4kclZIl6DI|DphWqG26iZPI7 zkm5V(99Et>Mr=+FSuu(F;GRJjJa*2m;b?Z4n}0898Qa7Baezj3%%b+huA^cR{PbwC zBO`W{3|nZ!2ZK& z*Z*&3{4)(wtmKddP(pVttlD%`BUSpP5+YTk1X}(5<%0<n(r_Bxz%M<}M%iVidu6?rag_mIVGD4~ad z>$L$!p>Fox>3DS)tYUhlCY*bA>y?nU<(2H34z#q*ttJ(&3u%xp)^V*f85omQS7CXZ zo5f(Xs6!s5#6}Yj+c{C#lx!Ce)m4qv;pmec{Lh#hOP_a5$O ztH~a!@vd}BOpcbf@Tx^nQdlf`6_>^)T+grtqwq9V=`3h9N|x1NqZdu@=Hy4T&F!U> zklcqWa9KDJup5B9uLw_7JFSZ( zo-{Fv5~x5qV>0MD^Q?AyQA0y{BFF*I;NjyE?UJJfQkpaHGw=vnaprsAFY-eatiYQ) zTGNv$9wsN!$M@$Kz&(Tz;)Auhe0`<>8rb>%Q{**Md8-)H%W8!l{k1x+oBsG0@eNUC_1kL3ADFRv+cz0yg_6zk|VBH`xHXW%C=0ym9}d1#h0x_zlsFJ+-Y_alE+tc zq9$2iuK>cv*XqqaVJfK96x%9~cnNw=*a;9o;?NP5voD1Ym~Ax%U!zJb7%@s70=p_u zr9w9?WZaH42=nQWe3{@szH%?c`Ii%dN9)`AF+z*{ZpPvv!LSm!+(uo>=&A{%IU595 zO@D)Xl1CCEg%?Uk#tY;o#NEmwU@9R5$f{G*s@LzERj#_?~kfys+$-v zKINRse^FcG)pE0-X|){Lsw{;LVW`!j+3d2~xqSR--SXjc^U<-i;``&YJDJ6n6pwIm zi@wwK+UqpyJHzt|6Zhw{2_A9Y@>{~6at&FZ?h{CRcm!}|t;|8fKhl_^zvN+#h4#_O z!(Y-}(|@9)Fu2UAWK_jBx8QyXz;qd~Gu13bo@Mss5!+*S**zCv7G7Vm=spl&df&pg z7r$RXm)wgsc{WPYgMlt#Yyp7oP}74N-X3RlvZx?g&EAND?OxJDyZHV>vGO=d$^%u8 zFy9K~VgW#JG;PwThI<9noyRU79?Rqt)wh?ie|n2BNwr{|RQ~#x9n_slHwS-OgnF8T zIIb3meieW-M5rvL3uK24;|6U}6{vC8)pcqMuEr+C#U_bW7mII1_bbGbuE!O!f7-<1 zuZ&)4)@!=sv?hWgU60_96;#GZh;Yn3-kVkT{#gY~-1sqpckHCG{JcY7+28aP_bq@I zCUK(`03vHjf!7uu#>_Kd=KY$OiDLvY@ZjX6^+STkoEqLCqjkoV+u7kFQ_5CT;$<06 z^4zv^($Z3m7EH@qcB4$vDLCNK1Vt34!=G85OcmzcemIL)@@nN~Kg(R3Zmn*&yIWh! zEAzcZeq*gGHSc$up781WFng2Wbu*b7Og-!2Vuq%X79wKo3~MM+rbhEm{H*g!=rI`y z!v*ft2L4s0^0@2>AgBYeHrqU(T5T>aEp0E&ZKw#j9BT>UW}3+H#Mul)a1|~|@rgRy zrk3QtSfSa1?C(F!xii;)AJypeMvbp#hNnv}auzx?QE{zVm3l_+q*EA@4T@T)B}7ha z={}i&6`o6kYzJFpF@a7OHfM~JW}K|L`o}2~{<44~JHSjYs!-VpW4a7Rr?HkvKgmXo zwWt+rrP;}r9xXH=LY5hB8_`lKO+e%jM5txSnjr?`iU}&L3F62UWn4enXt8}CHY}#W zDa{f!Ilq#F{3u72ct$$LZ1sJOAAt&l zSoH-j-3vvc8NTH2f*)5x+iXE@l1 z+krLvv{JngJs5$c$~9DQkB!9`Aft|zSh=$BMbeBJteBKIs2tm{(&0sOektdA8}682 zX?y-MKWm}bi*+bEY9cc%KettxumjT3z{8X{6W7j1m3h0CRT!!dU-p&IdZ;z5Z6(&I zHKJwCuo#Et3FACyE{H8FQbOA_8l~FX;<}@%fhaSyq+qINFqO|#E<-gB91cIcG@+`{ z5CE*Vuo&>wNYjZIyTUs)z(4WF&G^vatW->9RZd1AYP%~$LV(gZos#<6jA>pysd~@K z#kUk&Hr8~q7HAE9WMtIkSD)meS`b!A(FulfshBpW{zm=nh&(?_@q9QcguR;_imx6@ zYzA1gmJZghv1|Q$C{)@YQ(~xFl&U@JX8a;Z6B2TA06L+m4Lzr%Yf)1G5}0^$%6RcN zb0$WxU=V3H!=yPh-&TOha{K}aOLFK!vINB044QsSq9mEHkHZL*Se{~VrDO8-tw5mu z0DVnXS&$eaY}fb1y*ul{LobI7(Q%qzePCsB6Vjv6_3Qf}BPaLfIbmi)xL&gn*N?)! z6vEtnIVC;w?!&Zf@uOSPkxmlC<^4}(SD1>2?)2H*a1_I4S~!IbSCdyUoiR)}Z(EZ@(@L&X?mz4>peVMZ^gBy%~xO9x*X z6jSu3SRy@KJW+cz4_D8>Jbi;kS1-MRxAX6@SbUMS_xQAeEWb>1c4qD7-)p{DOQD?{ z5F$sWe2G@FFJ|EiA#C}uS(8+yX{KS)2aG8hP-4;(@_l+B;ead<46v_Qg6^%UTM-QJ zHeEV(-TM?y-R5$npOwh12V%^r)3qRRBTc~qB}jg6>?JaP>wgbMRnOcWWjXtz`|zK- zEz(FsFRt(8>x_aemK)LNf+q+DW&jf5YF9jZf!r-PozyN$mz9vulrtACf}e-a+?H%+ zq{@X4;e<+e9i_AuBjv=V<_y#$>ZL+fGH(F*gqAQ*gxN3Q$xzwU!QLdP3E4|bvi$0k zJAGvu{=r8P_$fAH0rO&eq~Y`nx0`=cWq1#B>5YlC_(IIss(loDH!2@-{$}3|2$VjR zLqLmrAY=JPiH&-!>v!%=x?MP@6>y8zr3t=Sd0P~GX5!o>nj9P1zFmIjefQ?$%YTGa zI1Wtqpb2C~RxUB9XR~@w^T3dVpcUwGRvgBje@F3Cg~(ocXZ{0vzNS-Q@x_sYcNFIA zt1j+?3(pD2`9wnS0{UGz6E|1H=@-#gy{KmLR36`*r|92(?P ziV6KvBHbiFLpIgy?!E;AM#PI9O~Q|e_%oz>{Eh}baR?qW1fVpAeB#Ipx*U;=jt*fg z^c})9Pk_8MHDromX57t}u7HRZ1ODg~HDpQ3g3bH^3xMH6{vISs?dr-bNW`rv4uVV} z1^K{(_gOgK6;0$9BZ+>Bqy8$w^%PLeEuXf>_W8Gyv zXoHOHoMe-eU%hm0_T-eqn4BYt%c>Oh$XR^+evBA7xFrbj!onD#ypv#{;>8~3Bvl@W z6jq(-yQ0AEq{SZpU?_G5=&9;g)yWDbfTciO`zu}*7qewA~u2zTH zGCB5%X>NEA9mP`x+d_kS9XC2FfO^<$BSqa)wS(vQJIeA^X2j`A$l8n2!QDMF_i%@j z&r5i*wpV8T?7nW|b6n7>3wFz*Sh;htCim^E8EFEi1d4zrtZH!EyBgkn-uY9XktsV3 zoLH!Qp>kvWP#0ZJx@x7jP4$g{W_u`Evv7Pa!51Wm%g$?+ZGpAbnie?34LDw|Fn5YVS7cL$mxoIh zQ;wR~qCC5M6%VRCUS4rXx^-VhlsE;STG3k#W|{bHOANwl_3K8NHE3EFukKf90X%tn z0`HJ4R5q~HHL!hN%Ep@ocX#{&?2cGT62;PH|9TSjOd7m5^{k390*Kc&KxX&GdG2@2 zjC{#1KA1sV_$3?Pw~q^M#nO(y5p~MD*B)BB=$k1MT8PkGKeu^y9l4niiI#|sZ&&OF zAOzWyWIL!;-itCfXrQubg zDp(NcS&l!p0A!xbUyUJ}3p}*aUp}cnCF%Th>igku z6Y@U6`^GDnQfTMuF^~oLF2HFhREz79-tnrSQZT>=1JriRF+J@ZMfgkrJ^(kLU~Y3$ z(>lx~Y?z;=QT}o0z5~6y8}|-O+pOYTC3s2R4U#Oz^C75}d=S|WG0k}cVdU^e@BYEP zXXmtszHuj#>(Gw}3?2vkMdbXcE;G%mnqP6d|E}h ztwZwaE^&S=g^gibAg^9wI}+z$r|NQ6-bLq_JMSUqoroE)R_Tz3^#?+w-vn(buMnEs zIeFqrVoqobJBJq3vd|2FzOG<#m%pq}H2DjDx^P#hl5fuOgQ#YZ9bKjhr&JaAoD6lb z>Rid0Ox?E)X^5+ekhppWloPEA{vb>Eyc1CqVzny&@u(!ZD6s7{sijR2GyG;5puHGN9CINKfieHsA&dYkz>uW0i)-3 zffQsB6c-DTm*y09*YD;;Z-4Dd>rIPU_zp?$Rc>Q`%b92kLUZuPxa+~#?es62Bg>T`sBw&{n@dqtZW~HzfT43q5V@Mq z66`|PnrF@I2h=M#N^)1==hyl~h+KXZi>i@ykDdyt(K%G$OEIjftcq=U}1Y&h0> z5IHv-Yb(`b^V1m|JMyL_vm70Q9-Ts$X9lfxA$XxFVbK*-c~Cst*BDK*rqR4|v~G#z z3AGn-7u^79X;Kxn3NN_Jt~Wk#P`X~dwrb-?4__p1qv!ScHh@%c;8H`g^1Zr9Ew#^gn2)AGd z%C_~Zah*x-h|+Wmje9V-r^8Qk!=QR1+M_;!MhhRXiXE_O8Djb%uJLdw0bZNsd_+Wf$JZWpL_e8-sMvzfZ&V=hEqu%jDHQ!&cnp? z2GZ&Apwnt%(`t@6CIF&q*fW68hRzO-oRaPzFckYlMY*{CTD>^AhqUBM%^Q9PQ$t$C z2FjH2Keu{v!BT(-@1Ed&wr_n2b%@_SI%r)IP_@j1VEhPu02BC>!Md)qsoOEMlE{9B zNzwA$Xuc;`VOQ`(T^tP+voM&RR%Q~+5+ipGHjU=&aJ)N+JY`!!!N&BaO1TTG$hIru z@a9VFA4{mX$)|clUYZfJVA?Hd7X{&m)%{3~Y|>6moG)jyYk1d_jIwD*vTP;NrKZp8 zo+U~c0HN#WB1s_-@eLaxzR3QrGib1-g1lnzb+zO{_bjq-)sYNv_|LtWR(um;QIVseowsx{HTDz#V z-1{Zd{?aDy3qpB%JJ0PqI5Nc;mSGY*n6}RNaSl{sYBw`KNh9_Xki^$YrGr0>?`Peo zfun7oi0telpfM_!Fe*nB^@a3)gQ-TEVaueSW`YX!32$?yz!iN0>53gyF6&yKOo@iM z1hG8^9sGyu>`J@;*hbdVU^zi2k5#TNJg+KzJqpnny6D%ENZZAyD1}JhV!m7bQRRE7B}X<1Twg<|&B!t`&LuG%Y`ao4LV@aER!!qVJ zOfK8wQ&&YURp&aVM|!eWZWTBilsGl0{Q7?vK8cMy=h6Q#{TW$N$&+aqeYnc9(9}7e zv{^W~DdZ;_3!H$a(-L<9=**WO$3s~nFIl(Qr2s2BE zcs)DkIBTb!&D>e&lbP&+ZvIrq8k6g#+A;Om{;7WDGi-Y6D9>Xbs=6ZuPV+*a0sLa9 zZ+8dCDNiPqSM~-edF0^Pf6yF|DW1t!wX~U&^$j8W10wqaBl`m+`y=U++c!Uw>(|-d z(;dIbiQeYBH80w9dpz;bo^|Jw%pGGjA~9ILi-|L}-KK(8+H&;x6+OYzM-ta*>SZ4x zK}F+vuGwEqPdS)!P7{8usVkC4OZ)ye(Wt|X`|bI^REF^%+uCmcKI9gJ zoo9`14l~COIl!-{j-0^mB7B0_1ybfV>vfJN$#d9p#0F<;bc{qXrw92@V!4#FY=jt- zN^VvOod|)uATfs>%?3dw@m<*l!@wkfg)F zkgo=1AtZ+|8SBe_k9**63ZuGB4EN%Aos<<9Vm>~8-azX5mGr9Zq%ev$hBCiTrrnfQC9f1nMS{tPU z@sSA!IH$OjF(Qk?=I!Y0N!0UmdiqUxKmLYOH5gBP^It0#z<=W&|6g(XFCNLj0SX|5 z=)Iq_eiLdB$QB~U@)IK&?t|ErGBnd>FlFQK(Y?UqAmE_}`(*|HfskByrky@gFHQhs0*FSPJ`d zoJYF>>OPO^98eCeSVAZt#Ba#fVwY_}#xx(TlZ-Pv5(vImfUx?)ObHYKrTg~SbI9>J z)zIhj^MKmV%1XEuV=t#aza|J<)|E^}MBmo&tdPI?w39fVJPw*`i(Bl9ZKYy)ELIW| zCaGk~hiPLXN{gHH%2@X1G8B-2%-1+Fv+|j-k{@52FRfovfoug+;$p@j?ZoOvjXwvU z+AJf7#FcAKX>R%y55qsA5JeV=6Ze+V|YBZh2eX zSBCAi$X$AQHezg;LNRI_2?4L}`%}*x>f}N8M?&R6K)bNy^@xZYMV&`pNV2q|RM^so zSjqSDQ4eV=CHF;8kIuhD6sr*Eo`Pgw7rQvr=9O(dBjPjXByCxAvrvQAxF->2^& z!!iXqBYP{!$b%BJ_2=yLRf}WC(y6*+{E$s-4BI|f3~2V72R-2Q2Q#|=5SpSHAV8|T zc8B|iH61)XZN3r{loq5Fm@6PEKq_Fn|F}P;A6M0?7W5CV?MgT5#j|CO&sOcNn|(~j zsGOQTo|=}8w%Lw(i{IboB&oiAsh0kth3Q|k;Qo(j@&6Z_icyrYLuNq0Nn<_-w~+K# z%m>-P?d+)+7uR+ytf52;30w;w+R1K7>U6pO{nC1_ci0bq7FUVE1*R$}ay20LIQqEb zZfa-S_XFVHR=*i|jdq2g-W>Z&%%3EP$x}i}Vwre42hnojCySzynhLC>SG=UWxV|h! zc1+N*v@Urm*&#{SeAL7<`bdG8&pz)A{S$OU#=?XnKs52ap604fi(F3swy*OpMGE=G zk*CzO_SsRa|NKE<9H$c(rbXtt<387O_M@IEHNxmwxnBOx(M0T zu^KiHLx;k;B+an)f@o7cCcwb8a1ePXo`Oo;;j(Z-Y;jM+Myu- z?Qr;gh2b$kHp4FvR$$%`Gr&Btyqa*jLfzR*eKWdyZGSbszwM)4iuvAPf3XDv=--f~ zmyot|a{jNEoOZUhCPvOC#{YD#|L0Z`Hy{bjfDroA;9|6DskO_0mk+)jMD~o|tf;My zpxv-Xb2G|nBTYQM;`X=){3dUx$n8#9?v(ELjd@~pa`YP~;xUtKo$TB+YAmN1vC(a5;!b1DdL*mu zvkAfeCeg+23Biw78PO2cuynB7?=_g8dK2<#iN;lOx`Mp0z}$*-*iU$M8sgB4;z~iq zz__0`5%rOIsR`-Dcq%2!uH`k%2~dECm~r5lxy?N@6m7uI{`097e5gl51~Ld{*t`*p zhJoM=os&{JANKx2>6QQ@GbD<|V@;a#w?VOqa#>N_zaXCZw~ng+SApE=UqJPdmysIc zN6D^fXm~E#Sow)3Ob^;CA%swb0Z|6R?XDTO+G@1bZ>pNhI~l;+i$h||5-bOQeMo0} zJelsj&6}kIKu-_F2ur7rwi;^jXf{3%u%acA2%RLKu4+?;YajJh0_h)O3u z1`TekciO-r zI658bL4<2usJx{v12eBTq7p@-W|B=VR1)QUJtpdMniIkDz6~jqt~Oy`fDuS;u>jvR zagm+5+W{egbrM@8n8<6lg*o%xGx-wEC5C?fZ6eZf&P4w-*X_IKh!3E>y}iUMsP{^5 z-&vsaTz`892gdEUXa22zk;I0?3j3tUS)Fs+}MilfaTtc@PvunVMN-ol?$Gcxw&?6u%X zV?D-yWQ+jIeL=>d$5kW;JYiVkl5{{y#4!(*Ebrh>jjPy3zP=i!6`)!~wwG$vq|h2N zMOW`<_t|UNpRXh9RgvUDU3?onXnBQRsF!%QRu0ZNKTrlKlNQf9VIk9mR$afdQJKjW z@a-+2dVG$?NlYgsI?LTvn`d*_PHf4YGD~4p|7>8wz>pk`kuzQ8!x(STn4>U5-xM?& zqJFN6LbfdX_zy*^9BH~R$4sFAYlvi^NH&-MT1f-`8{+)`5+WsM14rlo85{Y3IA9=r z(-uo${n{hISOA4qF*E>C5w2V+2oIPp1}AQBtv`IQ#c>C~g<7uVrzfy&|GDk$`h45! z1x`O;7fUE2hS8?8kz+3>bqh|^>rsAOd9GeZqOJ5WS`lo~ZMj*;x?iKz&0wpE)^0#; zLeTXK*)5+O=P6MCWrr2(GAQ9gwLKZL%Cp%dYik@!H29vE6|X|ly|!}R4a)&gg& zCdoNQYd_o}DDj6F4IYPWzxbjL1T!EWUotUN4IeZR2R{n)$ctx~eGRC=EqKVf`ERn3 zfX_o(HGiRm``1xU`yU|n&k9#@^RKcFfk#TQ%OZ=Fzd)Wggq5F?n0gO1q76+xCNMHH z9DJwse%PVwUev4LqVB#Q{7xbKesn81cp~U^Dm%l;)Mj?oF0T*3JywjN)o?4S0jG$n zKDC#~%0w2taS8=9Af=gl{EEtgW*q|_1Z^=OX;fuoxzM?j&W9tjdsP#X*|Q4|1kH3o z3u;{~Kvgytb!M~w%3(X6glw*s(vy06r=!T@`8pfNl1yb<_1(&-c|EVo_Q~~=>>)`y znflR~o#8_om&%i3ZhwZz@uZvl(SV_bM#;Bk5En73Nhqa<0ws%DCHh(E1|_@-Qr5Bg zJM6U|v$pBp(cp98hNj!UbJNG_)X*XFuMP}&(A+E z$ax-ku$P|?K@f=pOzdBQB7nqOAcg_}utNJcw)_9KdTCL&a7SIn^d;*UCuR$Z$CuL9 z&mSOVgLDY8>?h%m7e`vcN35Pa+L2(S&*+%R$pWp=M76K6YLTz1v59GQ1|%WYL@BA- ze)Xx_-rV(ZZ$AH=)^SXlD;D>0XFr|d*!}RG&uWVpsAb}! z1?jr?hol|HE!cs~73vQyrt9Rnj-Z=cdgd*~Xis|`#B10+AUFO{5F;B=9r4N;0T!t zcM<=k1snCQV`pYfaGk#FqiWG=xztCh&g!1WsK0fcy!@7_3rA?)lXN4qPKq;jqctXDkNjUs~P^{Dyyl<6dcRuT_RY1{l+eTUM@l_;!N(!Rz+&JN7` zHX2P;-bT17+kRVyZXGI%T9-4$MOK4LC~}jG96-3~OFOIgZn$e58#oHN3?U!DL2*v3@4p@2PSuJPdTsYtnrQt?GPNORG#E*a!yj(^xTE z{9FOMagbvwrQOzj=Vca--gOaINQFz{&ZOw~Xx75+nvrnu&~glz1=fK?<$G!=nGvTa zPE!&`!6HT(9XZt~$LVI9rpbDWSvIWCBGaulZ8K2l2zJc~QZww>H09jreHAV9q$8oO zOB=1pCvJ-X=~qQgOtvrcwyQblIMdM0tzvYRRZS!!pU5K}N_O*h6j&%zyfRjnr66^0 z$)U0axgoPV4b;5FJC7?h`G$tgr7`JcWD3;Il)0vSIuqYmft~^*DmNDF{>NXs{Q{t6 z(Q?qRLgxDPEZBqf=`4l&BHhFBmTy3CR_>VKD&2#QKA-s(?1YVaBUZm+52Akc2G^Cp zRfg6XsE=I!>W#HCe490`(=5xEp!HXY`Ja@tpB9+D z1ag{eQYTdF=c(Xg0apB+(0-*N_;!h&F^oB!#ps9%%+BZ%knmI4h5Bp2p1MtEAhT%q zY}%J}$etinGVdJfLfTmwP6pV%kw@#xF&Fh)*55`K5@kZ>&#}f(b^SVROz45Zw(g}j z?Y*`y!+!t?3#{I9K)zm)0{Qmp1ECi}$S<1GADd<$x_~>9lpM|%N>EDnVI!{aK-c*y z-kL)D_Ue9phxS>W@h2zl+Fs_xs$9?|g<0s1J1!!wK$qDLC{@<*2E0sr*;W6}^j>80 zUY%6-iWkG`;%TE>o-ISmzKnxV?UL@RAhV?^ud2@MjEgZd0nQWIfpnFnGG6F$o=H9m z80(14+NK2+`F~h@r|8_CZrwN5j4|V6#^xK_wr$(C@y51o+qN}hCo^_3qx0Wuue0|4 zzMH-FY3E|JR#k1>jMjct_0*`|`%@DWV{K=#~Q#^am zY(a+I2&N*b;8|)dbp#z#^1{N0<>IDQz|57|EKO{XnYx@$za*c8XYqyJU+=^a0J%?_ ze0cH3R8}cH_}HsiV`r9IR)ZK(1r|m6+9&_|;x6dKG-C$~hR$c~I8kPv1Z!D`eax>qNV)s3%HNVUnU*kPFm+UH#SF9sPNIHc;7y-}jzg zmSwVKOrJS-9)pId;jJk}qU*T((!Z6H?htP7s_gNH{P4DpTBq+ybajsigDg!qikh@)IUCS>sJPi|+fJBnnu*^p#+vUzc9M zkV(E6lEfKKQ$YMN^n-+I--J%uqqs3i@@Ndyj*yebrN=jYVBVlneiJIxoly3b1ct&G zGOaq4l$<>!=DEh%tQC#A%lzL)zZSn9Lxx; z;t+{-^i{l@yU$WST|7YvZ%ACsAi{$=(E}EuHt^g1_`+!RzkJhM{yo1w|$E^d@|B1SK5xQjTp7HKU}|a3xznL+y=nqpHL$ zeF~yvbt)~?9c3Bqpmqj-VrVD(7kDHSA(cp!KjBbP*W#D>zG=4pLfXli38wJS81E?< zNB)V|KWKg{U?-L=KKY0YFmnE4{E1-5bhtQrDdEc#i5tvf=^3+I@#vv$RcTQpTQ>CZ z+lDQK)JvK)-kvdVR!IRZq#^&r!gGKoaM2yDvpc9=)wh zSRS}^{!6e%;4Z7&RAOha@K<71-2U_wc8xKmPT4`2G0Z95ueBJ)#g)F$MbZj6c|n~f zOw-0n0--B{@&dt-`iS6c_f*vEF)=}v=pog2s89wbstJQkoV4{HK&e=;T#MT ze>eg7$IYE3SE%iUtC>YDf=?+2@U3{3+|j|DrUN>YP*5<#Zc1CgC9GVytwiI6#A;D# zC)&)oZpA1`vddH%M8YCTIN^9GVXBgFqhib>*=@b_4H+5VI;2H+!Q#tHmES65S+ksQ zjhsH$jI+3dZ`kOt7OwI6=P{;N1(`+fqdqYX_MA+!=E6M*mY`Z_2q$tH1KIaJ7;^*l zm`z#JgE^GusC2{ht1otL8M>E@?ttTKqN|?j`}eb_PnlF`$}1xBp;03v|n3qHvZfWiiS+G8-Wa%le8&~7UJSdbV(-<%CNhnfOAH#rI5D`!vDS+bf=kKJVH*#gaTEc_^4=_)bpTw=&C zaZk3{Z1(03F0jQN`6=y=7wlG-r{~vnjg=KtaHQ{9!>tw-}Nku1kfZIfPd%`$Az(8On*=c;5r&_^ps?_rm7ZE}FTf!%TNC zh1u~o*jl(@{oC&q*Z#6UnXyV`oC%35?2;CIli|U-u#+5;U)3Qwk`DQ5JS|GIXeAj% zpF>n=o4$i}E07zT2w`sD96l-R^v*f3Wyw1T)}B>rqKKUN%Wh)f7EI6Nkri)}d0Mz?-?Y1UU!9|N4+G)TBSr7|vz}F-h1smn5TWG=8ZLDohtq7aUA*-PkFl{f zXxEA(FbM}Pk^OdGI84!^Ixy@m|xHZ+I{A*Ltk3_v?2f|fY+E*+MSlaVT0P1MIVHfODgL+4#&5oNCxR{;n z;B*Pg2c&<>%&vw4YAj|Ey0n&1YHpZKuSpk`{}omwqjWgow>@j9CEn#y|DH}lBi4w$2>%k7zgdaE03%WT*eMl4~v%T1ko-v7=_ zOCZy)KPyg5@@4N}ahKmAwT~q;ZZWT%9AaEJ1$#(5rvg`*U15<;2lS?v8he${sIc?H zHN##8iuz1sEJi;MzsA+bBh6oA@0WxT&lsYVFz~}dpk-9h$zA^ve<;$;AKi1DhixE zkx&||dSUZghoNNp9%FTKsLrxm55W+Fi6@weqjcl1sBjPv2!;x%SAGOtib1Xd^BaL( zMy^bBk3TDC4b?dG{O%z74$EakB@PoF#_DoA6f0H&mp7CpREt$arE+{VGkL*_P9YAA zl_S(kJXjgEyiT!{o(fQwlO+R{!YSx|3h3F`4eYT}xa;8WZb#56;9BpZ9tzOPhd+Bc(eqdma|a^C`H?fr4IL_nZQ@oVLJ78ixkc#~cMTIrqCA87 zMGQcx@I!RA*@AzXynL(#S^%!muj<0Hu$RA@+|0K{P)u!aY&E{dLx;h1$3}7ny$#{}C z6jTGTHCX%n;}kg!Fr;xr0_5-n{f-SEb6^e{>8_mAAEFaqP{GtLM5fXu(x0rs*M-=E zNrmgxLc`ZR&PMd?k@zKjO;r2mVE=EE#xq{77x+}yk^4^?Bbso<3z|N<*2$Z26aERm z{<(cdwLDSX$)xcugH=jFx9ZfMU%bm6q-qRrKEb?MaUMtlTlQxlv~ zV=wjnL%CA3YBpo1SR#@4_{;ioGv5#On5l;NLx*rkq1{Cm?i5$JV?}*^q3>h_YeGFz z;3NbQ5&1bH@!{m9M;IpPJTgbRLWkk=lk^2?ko1~t@a}?8=SvC2jO%imi|GpdJi!XdUFE3O@&R=jtOo-%Ax{51VTLgTGff`sTpf=*btGA7(Fn zFp5xh;Pc^AT&Iita10eE%nSNmoU?Q>#(r@#-kU>MR>Fb2oUjGXI4!^^BxT1a<# zdObGNaa5J0OcG|cYBk#|XBolnPY-S|Z?Pcs7g%RY6SbKQtvbVDvljFfDGRysjAqk6=jE2-(Cut27t_@x z73a0g&x3&>wioqD4LhsVkh~=+uh;U$({JSkr|{dkGZ_n(f0Ni4OyQMft<_ZGMnl7W zA*Fm+*iK;ctN+;X7IE{Ub`ILBOT4#3_)p6KiV>y(S6Yc~bOqPH zlM5=;7P!8fvrM?t{Zf@($P6|shsoq7E5Sge{1;!RkJY35MuX12uu)572hKgFOufJ(4jp}%M~rfH{Y z%~B@?%IMB3*?2Kfwug2Hkr~R5OQ)|gJIbJ_A2bGGCX{7e9Kkv2dpEdhVO&#UVIFwj z+F>(Lwa4f$Zry(*+%*QNi|FJIRl)g%+QE7wRwIfo);tzlVM)pl1yZ5>)?dnQHnYHp z!uSy5XgZXu2{vW#>|CHc8%lF`_GpXLpzrOEU=lyggJl`Z~uj_6d2e9_Hh0ujUhLzjoqql#;+HFIiBX+HlAc z=*e8drP8G%Pd~(tH8GSYzS30wq_%>VT~$krmuOGI*b$Pcz<5JIoh{^wcVGU}0}L~@ z(IfSget|PD2RhS)r}DI>wByzpS`(9ox4w7eJh}qujK_#&xj@l=BD{3S;S1xB1-tw~ zwhVW~^#AdApy#wbC&1gU=Zyzto)p-O<&-7pA5`#jwoPd?*vBq!Ky$JMc7}tz{r<24 z4C}^q=)@mQmYJMe2Ky98Cw~@m&^Af^z~>Rltv77elm%%=Y|3PSzq6GluFGx@e{f)1 zk1}=M3ypi?yW3-+i!X!{vbi%;4I1{Zpb*`qG9`C}uLo8fy3L&+mjo)mASAe3*B{V~ zb>#4iYk>B6wHwj_#Qg$sJTP#s#0@=w)W%z_zkL(jc#azWCk+tqgd<4nL^=dpiDfa4 zt-K@v@>fqJ4EShLMdE#Qxl_t6W=D)Sxv+QI?X31XrYGq8y#)y!&w0&eMn{77*3 zxtuyRkK;bMoE4dFF+A5(HYppEJPVqUPexl1{EE^OsI%dHFwRo!FzoyD^(kN6Q^eUE znJ2sHw8XARiI^mH6?^%LQEw0DR6Uq#t9@=7VSkCyP--qd^{6$17gXFqwyicGw4Kqn zk*M7jS@=GbJpsR~cDRL&;YV@j$-n7?37TZnntysv|2)k9Cw=fQF)aVDeP;|%@P7nc ziuyB6W1*r^)Yqdfpok+63W;Rr&!C$vb|%@)Y}4ZP7l=fsu7k5@KzvNW_2v$Xr?-G4Q{tx^4t(l)$H zWAt>8QlWnZ(4|*ed9-fnQrshCsl}w{>z1wrFjI9KyC6T*6C<$rvH0%>@=S=m+`CfK z)No{$I^0VEr(4b^b}yUzrwkz1hV(!-USR-oQ{r!!XufgV#ebdsdZQ4moBb{T^p$ zI!`W%#_!5kA4UYHVU+MxRlkx93sg}SJU0#N&sHR2)fH96jBbf(WK8qWEK1Q>P-t(R zj!Zt;G3u|aB&{sdn*v+VSShsH2qFbcH`AYzLRd!T75lcmWpys9O!+%5-jNu=df$!D z&H`|hLtUI}HSHoj?K_8So{q3%1X~aZ7+dki?^LV z5Oa)F#!-fU3uBN6Sj@0W>DQ;=7f6)#Q`bU_rqWHv^@}~R!nE&_2J)P)i|Qtx7IRe% zmjF3ZnDUr1FA1Fdgt`Rk=!TjTIx#o>~D*TIy##s4%U&!THugK0`A@_)0 zlCQ`m3@ty7K_|=OEG|nnw4?Z<_NV!LG75NK-7QbVvq$Bk`jNOCCCd37GtBP(+UX3i z_RsvG^-bn(=tZ@?)hnweWVdu#FXdt5Txts!IO*vkyCx_!{V5O+8MiQwfRj-?0u!?T z6O}+?1sr$UC*T`|J^L1A0Q}KoLtP>nl24GYBrkAuP;x+rrlqhAxUS@gt}`6Wo?1 zF$b#mB*3wDqELr1(1_Mguz#IYDA*3tdaxiMYZxFPV*g(z)qnQ>)l#BF1J*@l1^esT zgqZ>02}{%{Nhw2Qzzk2iZpB()1Ij`MD^1L@uBOM#kOU2|AMC~!x-4vM@wRP=hO8X1 z!rcr4OB4_o4iYU{>};{Zyeur4;@p05*802sLJpW94Oqfse%XHCb^m^P|9Lk&rrI<8+xa?84-2*F?Ob8-Bm_BZT1l zW!^^FUV~innvX;{81CDSPk6Uq^qP)II7Wf)(+HBMbZhxGiXYmJk$1P>)V?$}(?xpa zocQcX*c-qwxql7jBMG-lG{JrRqpP@5KXr&V(X9^sHU;c574JGJy6)$m-W#JekIg7*3IP8MTbk&r?Rk$N@TzDEHg~fW!%~Dk|G_hhSrS@Z6w!zX=iBVV3 z7C+rZ76ianp{DlHBFmG9u1FK@Hmb!WS9g5@@6VbjtceIiS8`)jd@&KEkFO#b+Ar~nMri#&lSFOXaR~sFAcH@W;R>4kIWb4%} zY8@S~^c&fFjrf9L5>EI2_$ z=N!*Rd><5AB~8_&Xp)V|$X*V|PC!%rYt~${Sl|*JRggnP;v3(i;HpY|Fl(kce6t3tjZV41$O;3)~R8>{vNlHilJy?6a zX-BL2lp*LF`&inm$cQvp$mMU}Ooaz9h}0aF2Z|x+c*=KJu{0h!BW(p#90doYxyTyKs{u^Z_+b^I zAE`YTdA4un;Tq2Xdd=-tO?&zBS46oA4^(+753LbPAN3IcN6~@zYj2eKU3So^YIgvp z>IVovIwcaeBf&$su^%j(zjoX%knH1%2~dDtdOWUphw4{+F!mZ5l{Xn+mnfWtH+!Ip z!9S!I_*PmQzUX5X9`w~}GPqkZ(o%lRPMc+`vnIsLCNDiQSEAL|&tM7Z%$6&G@4}`( zqy^<;QbRq*QEU)lFLpvvr9R3|mvg7lrkpcsTK@dWJ{>+2$#FPY#Li~Io%+_hS16d= z0f0$@H=|Gk9;tNb4P11)hTFw}xY*Kj_V!avZ|7vvl4|ixC({$?g-EsmRUj+p(35FQ z1v~iKtm$jzOOe8b{{DVQlozI5Jr*f;vfy+dU$*^#A=YhWwIrp-@X*dMT!=#vf|R9EqwT9O zd~&_?W8=c9j>R<`BIUM9D%s+}!A$TH@GP=);9X~+E}7)-dqQ zdCa;%fo)f#cGBE&2ER}aBQ4sL*KNcgKc^bc@&U`W$hwTH8u|vrx&m8D)lW>$1(4am zhCTM^%4q4aWB$8cNLoJcxJ-!NH0|?P13oa1Fi83BTrSV`I?Q9z8T)#Pt*?X={t^u7h3j2nXIM+H%#R5 zzPD))s5;buV;}S08<9gl)SDi*qooifQ*IoD(;1_TbRZ~%{ljOExHM?q1 zQ`B&gr!XEFk?xHwdcA!B#TN|@U4Uqi-S4|T=DA~--24xiGe>4SAfsKk98%B@83O#| z5c1EB#nAGz+_P7M%IPG8pXnZOOG-_CGH@_lqKK7vKG2Mw(3w(Y$$Gi|@XFc`q=ys* z5qi@z;|?&&O(ChU@CKOz&Q;ofys_-9_<-lvyr3P4j>i`t$4I#r@Q4Os0@h2B27l`H z8Oue(?@kQ(&8`JnYNlDJ0aJ?P9N8^1>pkblI@g{QFB~$I{S=|?>`z5LAWgdK{V|-h zQ!Zh3VGMfLd^^$Si%oA`Z+85(XCoXPkC$PCrlHb;jmr45c{BoA1Hp>cp?<duvvMalV^mblq(s>q76S82v5f15dDMA4Peq;g41vf`t#H-nTq^|Coj zm7H$vJhpSL%7GJcaOg`4f4~X8=0k^^`m2yF*Z*cL*}oT0TL5#Syb>nUq7~wZ=P%3u z8Rqaw2j(+7bi+v4H@5N$9{o%R`^}H?*WZliE2!p`=6df#?juLxTO3D;g}!`Wp5(LKou{vtBu+U{*yCeLaL?mWToxBQm?7 z30WoBiWrH8?r-PQ`}H=Znru``S15}U18o8(RDx$my5ti@0|do9%>Gw5RpAZ5s0h0g)Rod9yMz{)Q(+; z7Dr+Tx1|)acDPF14Qh`b$6nzfjl$BcI@Ynx z3L1mff?YW^!J@%t>fE{oZ>=~WD0Ju6Z0K6fAt*t@1^ez3?&Qf{db8E^#cQ_>3mk6N zszim_(siv=mqu}u&!8Bui7AB{3Kt!{RlBEkzf`$2NOg{;o$sCOeEDxQo6XT<2RA#r z+oi4j&QEKb?afsm(Qq)bQiIjf;;Z(st7}G7OMn0l2BfG`tEsm0L#-K8vN$JabC0bJ zV}8B?Z;mTFHH-+gJ0*;rl-p7}XHBYYYsq`pv`Y9w%ASOyHM1S58|mazxH6SwEQ9BGUlK-Jsxw@jAYC`x5v1C@HLo>_53X@-J>-O;0z z)_TwQjaj;7`4*WCWA1=6afk^5HE1*7F2DjFF_??~= z+Oj}F>{;st8yY^&mPoQ9@h%?`(Imh&>(_hX7D@r2D(B?VJY*75g{S!7AB=#o3?b*9 zJh(fuOZhE6lj!?{nI!x!k0mli-0ZxgMw{>CKo_SJM*K1L3cBQ+Ufn|s;;VUq(KfrphakwO_=o0*KFbG&zw(_s!goIr|YcAv-sr$ec1FUYcN zby)fQ^6n|Efu9Z8c_w+EoJy7bs&g`v>*uG;(vjee3@Y)0@6KJlnU++C=~Jd%wSR!O zxNfnNS4u9KOW^*E-64D1Pdh;X2eTYsXlOO97Foj94K_ON5$K>Lpw8)-oK`NU^^$gc z{B*fA40F)jNXLBEuyC7&vO-;fyN51m4 z8%<_5H)w6N3?YlCnLZwGa*T^m{G}PQ+R0eVvJByVYDXB03`Fob=dYN^5ioE|^+aY! ziG#`G@gZG4q{^6D_wqw31_4qCs0J!icPz-)(lINt$bk&ukA;LKlA{{rpHv~SyK(op@g`DnJ7|BxhYa5dR%5LsGY6FPY6Dk4T@8vNdF>+bvRr^A0|W7P;+c2_<#;#dMLP;*WAY8Q(HH+Yn(c@7p5^oxvmnBrK#bFg zNm~}C9&)+{M^JAC7J^G0xf^p*SIG;I*F@wet1*#6k{&EIyuQ@U*$$BwrB6B^Mc3O~ z79R)JAoRp|&kig!fW@`aUP;XS(+?vgom>i{+5EP!ja+-ER zI7SOOCdZ49S6G&!^%eP&fHd<4%%vEkNWNHIz z&I=H|aIz^XcuTgYp!8gJCg7^ip})S}z87n6xE(>5xuXtpY8O6wlYHt?f7BwW(a|BOK?8F0`nP5eJl|f5+5rmNJJ>p0QEyj8 z8jL}qgLj6>+5Lrb3mSO%f|kC5&CLc_=AzQULzK}_VhzQA2q<%&{tO-TsQBn;Rq{E( zi#`$cN(&>QHu1pkG1iu-t{sTIJu`NP>;xDpNZgnwy}pUqFfmb?Ggkj{Iz=gglCmYv z$%@>Ovl$^U!lE$q9X1Kzz$cbtN5c+$F#9Vv*K|g3w?H>+ed{!fex^s~i0F`$Jj^L^ zg?WgvE{*7x*rz^d&~8%yQtYNAWuPD3|6MO6nilYl&V{0cqP}nySI(&VSbhfS?Mq<^ z1f#)S6Yubezi|e;n1WCn@|dvIpw}`T;_wc(pv4aRLjKvJx&quQVW*sIP?nD>N0O+Y zO;qfLZnCg}ozWFjR&Ue~ra$+=Xh}05c%ER?5_5lEN&(qikr?+m{LRNQm?3n;8_jb} zNi5N}}?k@$aLpU}2jpGUrC{N;~Y}B0?%&?;%9NDSk3QOB7+qF_G zHOZA40cR8AZho@f<^zL!l!Y=YnP)}wuXlI@i>Pu{PmLMO1HkFZJq3emmzvVk{$Dj5 zB1=fdus0brcUI(stiaU^i;pLnhAheLr{YVPqSI9yY_xULt!7_#QR!l(T${+`ALFaP zo}is6n@y>YB{krXX)9KKzF+o4`FF#O39Vk*hP%%T+mcK9a8HLkK~{QS$WDS95)^4Q1|ImXMV>_21D z|0i8-{6909EbZ+WL`=;LU2R;1|7%3p-qp@U(8SQ;zj6X=RCNF2(m}XQS5ttRm^j}j zLV(5%ji}cEXhzkjp``@Jmso&*c2K`*WBwHPdM1AsElWUa2}Iu2-W)=Z(;( z#>=(7NwXG5{Z+ebV89JeqKEE=fwV%D7MYI_)7H|9YlgG=Tv^pGC51HcI{s0gBWW*vl3D0%i_Fh~hKRgQ2=4dcQm(FyKlCw^lLDrnr% zn1ArPlOf4(`(i-vpO31VmhAyJ`WoNqI^|KBC23s|)CViV5Y=tNh%l(=X^44NY)tg; zPP%k=B!9R*7m?aU)d(boT31n?;|;aPIELN(cVLEn5bm}d0;1|0CT~xEFQH*bsN?R) zwAd1H6YE{385iyj*2{ZcO72|2{awHKPQ-Y?%I7N>GBAWAX_xd!?lc0yK6sPnk^WdE zvqK~78iqbM{p)4fEgU5cDB{%q0DImDkvVe%9Pnp zXZ-V%JLfH+USgV13Fc!#gHK>g;WNt$>1flns)@!NDGv%N>=PP6VmoFr(4B+-y^uh@ zBGQiwP!Ny?a1aoY{|jjU_W~6Ei`@T7tE;lC{gME3j;)jo_-7$Y30)pt@=*{HUNm*V z@=rlo-4Ru!9+7DGM4Mxe7yFLJ2a4;p+InN z#7lq%Hv*I|1J4gRVf%U5SYD{=DT9t8R9g=tdJmfhF&u+>-)N58cR_pPSHH8IQ;1Q6 z$RBsG9sR(8&D9Bv@6qja3KDjf3>mR-_k?H2U^*h#Nm-UJN)f`A90Nu?D;D@n41&DP zGJi%v-^guro%qXjGZ3Z)J}q%ai14cFkZ#GkRiwIj(zKEIaonPwGzBU+Z=C;y+T z{5iAPe&{ZJeei3eT-RM?{D)0mFk9u75p z<&8!lYh;2H{g!U->zFvAmWN|XVoC_Kj}aqjzMPnxixRKZx)f;GRiX83VNB~4YSY=H$IdF`}6qEFfn-AV|^9*lH0C zQo!sEv2iY*!nPQphxCJ)j&@k>(0kaoT}pSDjnFb@y}7+Ny!#-Ix4!4bTkofTTLC4r z_t07XSphkqKtNRgKf| z5B^O}S~oBH`bZ#KBVve})l|-+8C6g&=m%VF-$|8)6W%3Q>)-Z zpsfO6ZMBLbqgSn1@ytlNQ^n;W+17FW@z#F2lB>BXFn%e!z+YMMAR^iQ88u$-Md~3O zD3hMfYDftP&W_}qz9>)E7?Z_s!^))K0r}J{0?oX_uQb%a%Ze1-J+>pw)C~*bB1`Uxl)iyH4CGkh(K zyX}j)UZc(7J)wBbjdMLo<6`dokZ(>=c$Dw%0UY5E#@tV^6)0AVay69jkqmnW5DjiT zcYj2fxWm%#(~P{a%MJ|BR!0$NNnUXO6;oTy?koL&Fn#z3Q~CdYFm*CD{I3M=mXvKf zR6+EyZ*Z5kU-PL})}Q72k4AI3IS+ZeoaWER{~nH`}bi! zR~?IX4yK%m%dtC_DU|mP$Q4v=9Khl+=4vLamr#liX!v~@w`d}zWQ18pWfTH`oaPH1 z+uyEfYDyUA>({9@A$|n3Vjs4Gt{I{uw))gz6iMavNJYQd0BH6aFX;}W@*55=VpgY` zrH#gYjdXGEYFDDBbl%mEMO({4918S37moD8mkYSzH&(J^!#R3oyrI_Kbk;-agVwUd z-YV1!sCu$%@qgLDR~m@Gj~x&UH25Bo)gMJ>f@XYM4^uXAs?na*z5=Z|l}Bl6)cayZ39k4kk@9?pg~;RO#T${Sfxu1?G-3 z6npk_$JklO%Myv6X_(A`0F%#A+n{-v!;i^~7&bIKm%d9O60 z2?d4&Q;=N`XaLZQGWap;ygg;O*fUt7-XRxjfG7oF$>^80uarudWgmbu0I72nJ-Wi# zd*;LRns_=D1Oo^{)c6=ZNhC313X;}9b<`ZTCf38e3kw)U5uPj8980!cnTM2+)HOee zAlLrcB+^YKfX9?!gIgNl%E`Q%q11dSqZ^NT95Q=3JZ)0h4fvJsr?8^xEg?Xz#=x_64JcK6u5Tee3Cz_5 zEkGfefnX_7$;okWa-PmkJ!M&JE`=9eH8WK{e#vDvnX5_-NC-y?9S=iLo~h)j=xBRC zQ;JHNM9 z>31A-;_}VDlYp?PTcKx_4|U-b53SZtW(}{!w_KT=YGvlnmXl|mnrMiW88vDRc*co0 z<~@Z8+;B?OTDgS}Wim=KbyJ$-X2WLY6mM_HJ#bu+cx8()=gyF8gbdeoWBRL@VrePm zH#Lberq%*M7SuMLoVjAU$wakm^7OT5m8~0`Y_-8k8+H~q=p0;sui~nPE$V%R54vfU zQlPfRrcD-fIGxMBSd|>Fq?zZ8Akr;z+RE#*<4W^8@QIKav5q{IEM}?^tobQ;AtNCGRa*7~$WyQl~T; zZYKA@W-#(q4;zJ>I?#j3sq*aaq*6oNsDd|U)C7!B&DGVfFF#Nzn=5F8$s6BuW?lwG zk~tTDvBL(dqTH3;bX;SkbsfW|=%xuCW;VOKq|TYfY0^5n7pikAMOW`u4yR4)aOp?~ z=xDWh)} zx4W6^a0AcZ4Mr+TjodNvpNWunJBG{@pJ+Ym&w6mI;*=r1J5;O-TU+Y)L zkRD_BwjZ(405_S}({%$H-?{)STYw=FTfixkP*wk~uHLBI68^6B-T-F(S2*=F6{a%v zZ;$jZ(wGAc+hT+j33IDo`0loe#kkrCWi>dbAK;F90+Ulqf{VAr;oFVq^Lhv@rxzg( zRJw+Ba9}-k@*YGpo(j5ne~?_ZL;z`i;?VnUVb|>`ls~&yYGlK3=%s78<-d(}A3M&e zJI)6~E=Fk_#i=SN&fVdXa!-3wCeA9a&v;y~2mO;Hdf9lIC6Q{1hDrY1Q5qEGi7sCe zg=f>EMo;lU18SkK&+&9UePs2tF>YUNLzLWgfiSYovKVijLY>ydJyN-K z@7=6#-H|ZB==9?c`7TY4U<%y;kQN{Im`%pq!V9&K?|-Z6wcXVZ#smWbGK~7)uwDD# zHYX)h6HBLm+W%VRMcvvN*BrxdwX>Sm9%pl=L<%NhlOqM6LMm$>c~ka^tC5a)v!c4# zRmggE@%N5N%SEl4+m?b-ehJ;0lRf2L7|8yj5X1a1LJ$0OGXS12eIN6mb0=s&{E4SK znRX*95i)?_q9@0B$Juk1^XBVL-@fn19>@+732*{R#*hm_7ieyhjX)AG!H8oxJ|1o` zSwEOQaCoqVSOh`=M2>n&AISzf6HSM6`U>IYVcO)`_0#iErRKrz2Wjw-9X1*IAm(B6 z%d_uc`xJoA9dtnP#4$wWF-*KVffv3;0qdgfteN$Yfpf4_`f2k#%kSeJT#hUma*w8? zfQf?PatJCaL*YErpLi=Sa+P9=4-1v`AvM7n(|30=MrW@Qo$S1=)8oeH0&lM##JtPg z*;unG_=L&Gm#ebdoWui|*4$JByXMC%u(-;d6$qFQXqh>R6!6z9W!2SI*($cW)zVph z=2{FA9NCjvZ|wz`2tACt%?C-H1;^E#OZCgyW@AmMmR6eLZPOlFQ|D}_!Ic>RmM-Za z9%F6I8Ud;_qYA*EY8(cxP832V^G-W0D}MRdRJp&YZC%vEC67T%D{fU_WLtLDahNSZ zfO6PWKV5(m?ZQ6goTbR;bDSn5hgPh&CRu0+_=I_ z#cR3o#R>WZTS`fZluK?u!toU_cg;f0*>hXna5~irZ+b4dfl=WqT=7g1G=n%lJObd-7x-&_3HPXRd9;0^N8s8OWDjH;@aO6j5!1dA# zS_S~-o?n0g1LBum^|W@Z0v(%eZID7RIBYw&^fv>!niOZ&%}$*o-kO9y+&ZcgJWxQx zPxPfTT5y52$O}L(UqCw^w%Qto8hg9-Bt3y4`$K zA*x$x%dZY7i6@aIIvfdC1&`9AR*ei}^|`__UD$-i$XY#C7N_t}76X-AzfYll#0H{6 zbMW+AQsWVGY(b4%)K9g6f}e(M=`{@v)^n}-mEbZJo7xZ;aLrp*aKTZ3aI09FS8)G| zJ@m`;`kvs)=)dYN0_Tw^+Xsz3(T2+PHW3xvcfzBY+(`;GU@{|h=-uI~=-ok_+7#%Y z5Pjq$Xx(8|U|GR7T57i(wVL2&*yAw%l<_#4q*DF7CO@s#pVXe1Hw|2x&;ZAyl|LFQ za%~6WNia~hldsj+l8ekip@{dM^#f5 zn{g;|6>1;?>}WYxogsIlUp_seOX$v#aTLhn|adkBEMn0m!M<-siy(9ov zmUAr53?NuLX8z$Gd`KUN>dzyErynELH5Kt1nb4V8r`^XU1Ss&XJJW^MXx{v6#f&G5 zX_bf0c~Nbj%{o{sGu-yUxhORo`nJ(6HE}Sc!kqYvYp_TzElFBK$>3!ivIOsAiMJdg+;ocfGirwEfU3#71m!r?WYHhmn74#h8R?QQL0 zI@OQ`t@sv%$b>2_`W?GMpCf;8INT42rb(;qj_En(1^B3?VyI>=qmmV%vXNDva2$A0%;W&o9{M=XfDf3|YFD zKVK1lFFJ}J&;(>tjbD|HxRKBJJ0m#0Fo2~=;Q*MaNU0A|0kNh#iD1vIpQu)063{72 z^YuvZsO{LqL~pUwz%~G0k^QgDtl}QnwQ1vB5O?QD#ytcCeAr(Hjz+-72#|*1mwh08 zH|Us4v{+LbMvi?pEPCW2w=EyuuLP)w5hw(VPH56j-#D#TUa*@H8<=;<7@L8S7YGW$ zNqZy$G&GpM5cuBwqJ;zJjnhuS9R$`a~B zy}6Hh&7)M)$@6`5qI>;Cgp375pg$-iiTY@GE~1Qwsw`?oQ4>pyH$Ho}GiGw_XaSOw zDC|%gtg6-%Pl$qwGQY>~1y5$!{sLnO2!!0hDL`EO>jY7o7CJs=U?89ZkbfgPV`l7X zY+~$U{$FIW*grSPGR5ROXuGS{i6Zkk z)rmSnsKJdH?U(n9m`fiKerH&tgoj!sSgmf)*lY=V=5gWFWJ5#oS4@+ERrK+eO=IJv znWgx%OX=6PGoC67Isd1X7lwRl_MC)#Ik>&f{0 z>uLs5iB=rlwmqf$Dn>biFNUNnrmYn}r3bePwEkajUO0ePeL-87h;6RS@en z!vkQPSoI@)1Shpx-+$>Sh+@g+$NvW^=-@y=LjNsf{+TRO-L(G?_v~ zpKw{sC`d5j?qcDMa&;P&yFb~PBrK#6cUt#|sCOY(d9TB<^7B;n*N<B%gAM>=t`;Z{Lsch>Jvq=#GSDm`;# zP{!D3u=2-Ln1@9k6GeM#qVUk9u3eIoaRqQEAHDM%w)rK}L4TWxTUx%MH^qV#d0xi^ z6|uAE7!K*nCVz*Xafx4RAeqZ!s!{C!v1UkiuRA%enI5y`!mJ@WM?Vvf+3d->5?G>{ zpTaV1xsl;_ac$8kxA&3wGasdK;!36ULGr}f^!{O9qk0~@a+hgjVAK1OSPF5WH?Ao+ zLWSfo@;Wdb8QdqwYhNO2y*7n>c|4MPMm{)S1+P{qIfblzr~aw02^#eBU`bXla3vbx z8C@p&`@@ii3YDlH=-Mj9vGg}cpeKAKfsK;n4~sXZ5%_9VM*#c^zx^M#gzUN7wNP9F zhrgb%t$g-_b_pJPwWB_cyN95jr+3JF&+VX!d;-%~v(9k$-SnQGh#nqG2(w zX%owW|CM@0jbH@s|DawZ#J|xY_Mg;KaQHt6CvE3w`@b9qB`Ld#sKQ92eX>>wD=_Ft z$N>d~DTO%_d$zN4-=?N!w*0>y&R_!}+w;Y7+MLJsT0=|_s8jIdc-jw*qKQ#g&Dq=&j63xf z;Wfug0m?lU+w2vgb!{Le9gHHYC(L#CQtjwH8FW1(y6mE%+Sp^B@%v59c{3ZdH+zrwdz(uL(jL*cv_e|rhvQK2-yG#6=& zJV&KyC&Y@6naV#F9Ef>^I5@Xq%N~12<+wJ|I`i*2u@=|UjM7Yh^8z5qYq!Wz7$^qJ zNi#D^J%u4BExI?^5$1$SndrcZ zt6_eh`^#b4xDiyxkYeP`-WH$ck{H$af*KQu)~Wl_A9{=1VjJ6wa}H)bO)xpukExbQ zcs&wjOCk&+=!Kt@U1B)YslF$`#AUO>J(N8Pe;IYj&UI4B}Har#ikXQ+-NvZ_6e=&x0A zyy$0ZC4CG|E@M#Z?i4R^Q;TSB5g&LNf7B^SjncSp=Hx#xc|FAo=%N_hLn zZ5Q&7J^BAWv87$jo&V1SM~&*_e+-`BPaa}t4$o?B?j|Icl8$CVfeI?85vEltW}}Pl zG*Y$#z)h=}BHkC>D$|{UBx>CP`@#f+<8nwv@}h=BhiHk7;k@m*+;G1b&yEt_2m-Z7 zRk$x{v9>5IBaR96iAqKCmg(M3A9e^{c)qU2AA*H^^)W4!hp`v+r z0*c~mi@0IyQF&E9|KOczW)1U}odV_jhDCYJMS)Sq)r8jLeK{k5vbzo{^Wq#>bCWM= zgz-<7RhCJ%-Uv2+k}FHntsEtsKP5$g{v8{7%3@|^*+?;q{CT|R1}Yb@ulCye7Fk%dQ8A%EsXbpBmo|JmJgB5K&R}d)iigiZp4Tpm7=1i%vzx;Ic=&pkx-7eXrNJ!53hD{qWf z=>N*Gr!)3N+kbHE2ju_Fz5Ty%%;x_RM#&BeA^8AXK%~FnE|$hURXyo421lIt2YN3o z$i}FZdn(DAKvgj!X2`{z~9fboEpTX;Hw#Gxurg&*0phXo)f_m=duv{ z!D2#%cV~mlqJ|J66iPo_B!#qn>b>ESB9{{T9_7wZg2L~INj2?5;_A)!mmwk4rFyf& z=XAIHNzOLE{~18F;*Z0^c7Yq9#!J+j`yjflcBMvHK)IkBzVU0k2DtASU5kqO^7~{K z&gaJ=)tIN|hKfLsoAO%7vmp#Ue5MW{O}8vnhhJbX)-JH*;D?X^v(#%I;P4ayq7@=t zB^D#Z&UpL=QJGm|45*jMleP?gjMf@*Zums_uSo7w_?~t{0|D`30Ri#+e?;=1M}y{v z2ih|JkK8kJ_H=kCP?CHigqZ$4QDLOHC_u#1ZVVJUc>X=(QUMS)ZJ(1%9@uJ9HHTqa zGrOQsf;il|0ni9e(y7S-J$V%kIOqPteWy%W%<{j^9lx|~G`6x3ezj^3C^n zj$su1h7J6wMIX{`1WidZz~~1mn?S9r!F*V^H&{U!dQE^m~9+Ma+;Ld|FQ@->Hj1l zN6CzGr70qJE#gd`Q|;Mk5AGzO&t+m67qgj>E7gGK#%nrT}I+D_1bqTLE z`Uwu!^*P9FSW#n1m$8s^$z0htlbNlu#z*bc@o;jA=%H$9b5jzw;}hjQuwY3}i{T%y zrnZ9L7TYwwDz~7Az0+OTQ7;eg40HckG2^jvr@9qeAynJDI>-yIB4;&AJ%LWI=9>0&ZGQ<*CXc9>Gzz>=;D@>MaUpo)7YScw~jS2B>4k;+a@&%eN9 zgfspqrR&kgrXhcUDx&2Y@5LfEV-XJCI6IZ0Q~77Tb+rFUGlxW@EM2#sgheQLMyhd=6M_uQWZa8smd?yGfVk}N3w6d?=y}$-&3b7#G*=GZJi@r+-cudRYM(kOw>2D! z9w<|-^KNgvDz4>0ax;+^B8l?V_3QRX5TSF?K4{f?r~WX;{5Yb&go}bt4|KhuZuaz7 zUQJlChaTYN0gdlxfB_E70q}0j;Bb24Pl!JFeGgB;P{i90r0>8Ox(g(VyHTX?P(<{t zkG_{IBnIduYCVhB8YB+5<0%O0t+}0@#F-Km8&AZehr)nUCSWyRv;j5&1Y_C_QBSm8 zIO2F8uw`QK+!)t$+eC4ox|I7%5T-V~1(T>!qn96P{vVUJYAO1L?IX|}%9zFvB5V3Y?nebQQ*Oq7VncBy`*+QdX8$GR#svh3IkeQ%2Ah|2+h@fRFN-YE@GQ5z&}-x*mI7Ywdu~3~o}K z!=ZdGHFP`vda`ks3PlEo_*BMj4(*E*rJCpF^Eq$PZ}ulwzKIE{uK zKF^yd%;y~`aXs{l3*D#%pV1)aZSgCtUQoW{x%dov)N#6H>%*IyZ9~aTdKOiZrd8Bc znzeO}ylz~ExO8Y9Cj3yiXBtbenf_tKEyA-uL-;#2n1HC)!*Yz@w5F~=Noe%(rxk?1 z#>70S8~r}i<*_}YrjI_)1zxUO>kPt7x^QN}Z%Og8!UNnrQ{1-JqL>J<%mC*{mskVg z#1+j)8o#4M+*ogL#{6O0CCq1op1|nx1k<$_t4Ve>wl=wAsb0@yQYAn-R2zfeU)yL%$Apjd(c-8iR=rWpRca<*?E6mNau*h0>apqqLGb##mx-=G? zy%P>@Z@r3VEDu7uIDyA_C6HBBs0^jxyXKOyc!zwy;Wf>1st3U2|~K zb9kS+q7?+KCEB)u9cs0R9{EMBiQmnM{!HgK$o(h~ksnpbiMg>pWvKaGT985@0;efh zrNE@IvsBj-0I~Q)_vjsbmjg756mha{mTk-F%{YO_f0|2iD<7bcT^_|iStpzRAXW!t? z1SP?Bs#AI6Wp>+)!Ay38905tEb9dtroX(=$`YW}~>kQ-LKiD*Ulm4G1Hb3MmuahbM zVKrCkt*xtAhn#CxGaXZ#7a47<<_7$}>a5*ge>XKL=#Fek?e?v@l$S9LaB3xv{rbep zypy{elCC!CrXCn9o)DVeb|x9D!Kx06%ND$tmDqMp=*tuH z@@M$hy|R=BMv=QN+l$88DiPg4(q`Bb#SvS4D7Ly738SyjXp{GdIV5^ilM(9=)wDip z7&#f_+z;dH#uHJ&JOc{9DsU3l#MR_w)Uz)`hSi|8WS6m0y^rapGZRc94r`;IFjO5Y z%!UQX(Wz|ZwQ=c266&zlnlJ9@5iA;;I`E6?C*@PlY4TH!e)ZGXrXC_l(l#wi{C!wO zI3^BJ`7wn4>VVa7Gg61tXz{Ds^RyB)pdEKwg5Xttuepgqaqv?-)a4lRd)BpmLuZ4# zmv^5Y=2i-DIS%N6R}XiXJZWlAKGeZEI&r~&xjFD`Yc{1P!OP$O!nsTT`Io|?T>10h z7*HUf4ak4Qh5vR;sA6ts<@%owrT?@LDp8+xK$S%M9&ztpql(_!ajdTKNMN8khZ4;}$kd!jI7Gu^w=lo8yaHj|v$9XCY@J2@nOjMbEs zjRt~?wr|i|@+%4^x}J)oc0Y(HPxYp-ahCB8Q&0HyT9PT`)7WC0ourn*q8pz*v|*d) zSQQ`AJO6zBU`Z<_aP3+xzJYmrv0E5Z>v$rKSDMi&tF5M5p@jM?ZuhwonS&>V2Sq zTtdkd>y&Lev7R16gQEK>F`Ku_m$O#0pG4GsJH}U)Zj-r!lw6MgD1pnV?<^}GbIsmP zJ=AShWgZd5trk{=MuD_$&jx*!sqlcuo{FkMYd{`-vc1Fv+#I}3-4|4Jn1+UC#Zj_f zAN{4i)<|^NZ?1OAgPclKfn@>zdgZa@T+}!mrWI?ZmwZEpuHBHzX|w{M0Y`~2{XMwK zdEUEfYv-+!3`riK=f#6K&4VayYM+HhBd54%#o*zE6-OEaYd=4Naj1p15pVBZi~ZK? zD7t+&l`B;C(9uM2b?q&no*2KSe~lU@e8m+{_ftQl9e&eE+W_iZR=7*YPP$y)n~rnC za#FBbFaPEJN!3+Q4xO)o_pv+PoE=2eqoVU>r*2_hk={l71T~if*7@|E1J4T;wRR@z zg$PBJ(2g3_Vi!(KVvINWd(}Gu1lh`7`z9xD&zV2(!>DdD^w(Xl*AW|CG*yR3HpTe z{MKOXn!k#)vvc^4zz7=>*3i zS8=fZhl2n3ccuvbKm6nWMZoLJf(WDW7gbeRSZ#RpfC>CUq&H(Uek}|QLRW+0kMB~A zpS~XPU)rstEci`0mk@oufrE`qJhjF8vej`igMYpG@jx5M)9Nf`EIsOs5Cx^_T79l% zDMctF2_YYD*0N$cr&CLg1*3l!xj1(XdjohuXD+F=ab7;mi~Y=43J!Y2R-ydV@PvCa z9Yr>fb=t)gjaFkwM?Z9liPu~@XSF<2Dcg6)-GzPWb=k}X`dfi2>qz2{ zy?1C(aGg9_2U6bug+l=KTWY5d;kVXKA2d_4gt*XCG1a*z=*pp6aj*y{Tuer z0;~jxTS-2QKU|;E1PL~tB0GxKuP#8Tud+bNw<&Z1onW(j>n40<`)@!7e`0{+e`o;T z6etEL=Qkofd@w(M1SR(kU)%V;i}w3izM|#&Xf6$sOBiEl>R_K_fZ|^Bl^n)8IYYfw z%Q?fmWy{+_y?FyY%=9aifRVMLJ;DGH2VH6ez$Kw7B5$Gh(CS2LK}!AwuNlQKR`lv< zN?9~3YEe^QAl4}h=IYe*6)f61GHce&Q*lZASOp_6?5&|{9eg9>j@_jczbZuv9OD|M zV`)!o8ZxjQ;&GxvGnJ@du?uP}Jj0UMTCt#2_cK}(m+@mIyo-{CRt#v@u%oh!FRHbc zSOzTku-q{rHftX9R<83-Nm$~uCD;Zn_nF>YbFkycrtu6mG)OVxVYcqvq7mRoGAy0q~Q@NMEK(qYVYmROr{Mh+|}@Dp$zsjgz3 zCK8RD3cjq)0*vk>%A_mkXfygLO({Mg94S)ORqWMFtTw7+(P7?)PONEgIMP+TC@>6d zhG)}T8>T~THM=rhjy7Hx0haN!5)OREZ|{rQn>uN2`8%zxZ(@}Tl}a17!zj|EX}m3Hjynt6959$D3uLnyAibl({20`OIZd{Th^-LX+ErL@so}&wk<1ScC(RXH9XAo93+X9att?;*hDs0u=qJl<>i-_ z$R^^*Hfr1#;qtdcla)8!P~K`s%9yxn*1Sm@;(QLp&Te9dpgy(yaS>uubM*EVO4$i1 z>9Sm=xfHnm4tv^sUq&ty;&OJ?Tv_}@HT@+*md12A&d2s}AxR<*Qe3~e&s4C=VM%aO z_`b5T{4Ao=&zEiB^k8piX*p0FHklJgIb2iQo=G$^;B6^NWbB4>clZHNIlEuu)a_{~ z?pcdp97tqka7IH*h?_DTsAkLIcN?qZX}*ZTTOz|VgqkV0k}`Mgt&R)V1xT!JTv_mK zP0l7?=r+;FOR~%?wETLq))l9>$Rm$|)FAbM=idB#z-vWbQf*;gYg083YWs_&8u!<^ zufZFu`!tK)`f#D|)G5W9%BqV6-IVwgo@Mup+{lNsx^Zs941lfKE0t_f)Z2YdUCd?# zrTR&meEfJ9B|&$o$rxO6;;(?F@xxgA2`iz=_mMvDRnvi>bqBRpv`U9i)*g}nUoGMl=nZuwa!j~tvz-mH*jM3qjf0O_s972ZC- zD8UmCob9|?NG;B?oQ{EaE>4$6t+WpNK0P}tl(QVg`Kmp42)c@DldD^CR!!A!>xDaR zz2ZY1y`sa1cCArzt_b?D+P~!;m$a_ziuff}Ma#@EF1sJfm4`8}fZD%R;GH}g^h-_x z40FpQEn1_Rjur8=x9a$s#u4##`#AFS^9{+cj`#;Wy-^NluME9qhZIqbH;0g&Ix;f& zWf(TrnYC%O7_(laOa--BPC=y_r5#X7NTCgo%psObcj zv|W${=mb%F6v$CzJ(Mm;ow*3NcD?iz|AGa@kuyhhafT}E6$f?Ela!?G=S zw16&4XCQvyke!>{2*2EnWR)j?mC(xM{N)@+XU|bMPjCBP5%5Ly3E2U(T-vs#bkfaP z)uO$C+|t%uy$9}yeiP6w7(3k+wXnN+%+TJN+=f`!Pw1$5tfBEcY#qYYdX8v%?eC{J zNDtS6xTm<^vvg{_?}bSO^7=**YRazIs1G-hko%W zsQN=^CUZwS_TLbKZe`kL`2ou2nxeL{(Z;&a`v~BbG&o0G@|(oY{!BvQLpmhut%!k_ zq$r8$A`GHb7_3+*`T(atwk#RL<5U-*-CPt~TupJmh%bzk(_#y!zArCIMM5*&FLSha z%Dk?)#>I=l$vD0E%eiTEMtCE8xN^u;{h-0baLgg3AuDOJ^5%DS&gUCQg)Cp3D8r;o z`tha2h_fT)r_Ta$(tVdDl03i3hiZ}V1mkQ**4?etB72QpSW|};6ySXydj0aij4_6oPyds zheLsg+<5J3m=i(=%x*>Nj{2f%2CtG!W>$LD$8c<*EK~fsnreaTRB}v&QDs$^Qu;bn zXlG8QYGUgsm%qiy6-dLFke1rIkhKbzH4(xLUM}pRO6McXLb@pow>g~haew)}k=nit z%u7jFx(fimkFxvE`l%Lin5lDY;=rfgzNYdk!h)viD|-Z*f6EEDCYJ+F?X3dmW97D# z*4)@=1L&cVaqXiGHY6`|o<|Cefilay=9P5a$m(63++!T2*Ht15COk0s zVTUZsl~d1?(|kYAiM_)X)x5fTBQmvK3|+Jp=FGcp9G%*Wv@n#vsOfOAkj~DIJ2+&N z2L$qvKD?&z>&fZOcgEk6Gzw;7qIrC?IiA*+p4=^1?E-c7&}eVIB>e z(b(oD*H|OrL5ixt9od_(7N!Y4pizT^%?no z0Umqgwm%RuJ2_cx8&y^*(_J-R-)dWhKXT;u!Fpj;e&sfzCa-hUTt_scF6UTpwiDX8 z7ij%?WAQ9q=>G%C)?cTs5Fn~fSgc7P0!mDr5JiC{AF=rz|6<7b^kAcI>5>K9EAkR|*K z7jmgBaqE&1b%OoESRdqrJnac>cS)_-FW6XU+*G!2p*T2gFTgcgaU;)$=^}7k;ht2r zaoKEr@ent=o{VV!5rBFX5c%Bq_*KO>WjL7R$q&13i}*jk&4b>{>aB=PJ*`PI7=_7S z>Ek_Xd)*wRxBFYyXEoI@XRWcO(N4Uu5rg!n7+WHZwv#DWS0B>iuTKUF7ND_8UXZ5dOG)`cqWD*6vTS%XM*P^2VMhEW*@2BL1f9o`ge z{~DPL5G8~u?x-7vm9R|=xmIZ2Xw1Whn7$rpmoWlthqCvcI=}nq66&DF zG>`A9gX^eYJA+T4)Jtn6Ax*Qmiz12!B^D^y;A||GWU%IyCO8fX8n~xr&Oy^k^e>51 z;;>muEz0O}9X;jyclM=BIM6s%oJg@{$wd|=^b#m$vhPAMmTTs0Nh(K0MW^@@&EuiU z%JR|GBvjH$vfbBK=%*F5z&=!Z{j!vy=*neD`~NteV?s@Y6%p%;y1+H=Ax5TS;wu5!|hV_xaOEgVa5 z5Msbem*TO<>3N~IFP_zvyx|w?KcM~kp9Y&1khVf>aS2zMB<tzxTz& zVibR+5kJr^(vP6}z8Rq+>_oAerqAqzQ`(fhZ_pn2ZOc$H&d~FAqIExr-~G%oIE~vJ zMOQJb=>+O2VH9!dx5ru6$z+J;B#y7$N1^BmH)kfpNdZXO^ z;*$BzR4^dSYrWQ>{MF6$QadXy!3sqVLE4@?qMAck;aJ$>*5{?Z`z8%J?J+! zF4QZA=BwJ@mP7DkCn7(pmn-L2w$yR(MuyCA^l)OoNsL74T-k(Ido)rS7I1}qf-3N@8BlEi zB}Vr-b`lf`mAu(|BAxJ2zZ5BpW+G5_0^3!-)90((14rLQor&?39-j0Jt1{uAKLRtP zmQqr{o|pH_CfHkWyl0t_#KLK!AIwp{^XslWfbsu*z}{VZ5RsvIN6LH-|C!Mg2ik(d zkY5_A|Kp?Ml4=&K%p4lQm9G8?Ca8YL`l&a}D0Y*rrF19TU3j4BDLY&^L`F}^;R!io zEDnVrpKCFRMtA4uX0sMHZ?IAi(qm%2{}89WrPASWY=@Pg9rciT5tdEbMwyQhbt>(T zy*6G4I=|U5=AtR9KyxM)HbOwifb^GR(b)!o*G=s=!Zb=hEoZ%scbhZMh)`d2ZKO5j zF@4HcaXfx|F4RO4)}@}5Gmr% zyN)+CN(#`1sX;>C4$oYo=Lk4Wa}9tppe?J;FG^wz>=&Cbdpx%qjKxS5cVi$5!%Rn6 z1Qfl4Z;r=H$2XqISqF2%*F`K#Q$CZi7Uhf&IWHY2>bX$s8UPOrcZt{My`bY=YfVTG zpQW&&Z^zbhy<9(O!f`x6szL@_+MXz4_BHF4dfbm{LSG*ea!QtdEd;^7`df{3cxkGq zK0248e>*82rwWu3gl203JLvMxqsU<3o%#E}hbpowm17{@b~BKU@;-wikb55ehQH7H z%@2ur2s~|f730`K-@pBg>lx2j;EF7xJ4#Zu-W$oHeBhk2)FArXJ7peXNeKwp`Varo zDV6P{&@mdv2^t4)Z5me!*V#Z&PEez}p?yuvDhn{z7;i_A1^kt=CyOcnsxH^a-9)cio}o?x^k_Sh0zwg(~~&dPRASh}dN?M}QM zQ*2sYtyKB=d~?kcJRoH`&T4C!QA`!*+e2ylY9{*4=CkE`xA3~X>Ws$l)@q4xx<=_w zt^`qBxTy$Rr=h6I3YLj!8|9uCu6$^^5>EnUTHDs)ZZnMB5QmFS8idU5NKfbqGRiq= zsK?w^4H#O`4q#*j4-9-Q9b=v+;E*w0_Sd%rW1Ux>aZW^|4OSAi&*sUw!-gmLL2A1E z#)tv)g28Bmj>pP~P5CU&I}43jKn?GnG^ywMaC^X5SS7n;%k<#x)wCk$&MxCEvu(-f zDH-H9SuP-HRvqC6yqU=XmZlustr} z&zZ4zqL(P!Kr4QsbVH(K$S4=SJBl^Ju_vayC)!{RS2|N1a;!7G>pi|dRD#pW^$BOp zs8hz*dbpr*tQWZ+rY`eLN_LO+*yV2(1sQF(r0f?wWNzs}+sc)BWjUq5P)!q<%>tu=J?{=7P_}KtQ&iUS#y-X#?#^46Q zXw`N1g|ie0-1_>;cnTPAsAHL|Te7Y(LWntMB*`_eq{{IljS{%49Klc6zqpd6yz+%v z3TQ;DM~OC#W1~6vYSTw(B--eMQ_j$lOZujg813~}xd-u&#h~5Pq?w@4+$W+4Ruv9Z_l1!M zo0wnl{z3`#;tAhCKY>5Phj*TqT~>>wL>hv&EG{S4F8Lo*xx62nhJs%(zwr%a$CivS z4U*<#Sy38Ug1JcP{8+Hw2eA_GXduGO%L%yQU>~%x6-~v~X2w0?i=Ma=U`?Lfn7v73 zV^|pWr+Lb;U`3M?)2+q^u@H-hj7i}1N5~jpf04!(g0aHMQgl;8Ym%+O$(gRDsZV#? zoxPbExGgg;?~kjEyVG?g3o~=iBHk6UPqTW3OS!A$Y9y0uassrsoyLn8$}r`Y>DO}# z%$J>454M!1MOaKbyZ>Cx93J4;m~C#kf|E@$g>FG_ulMBd|I%oRmKJ5i?qpSN1RQqu zKdi)BX<6rOPJTLT!fhY(f3vCPut2ddm1KAN#B?~o!Q3~ml%1E#BDS$Iw5hL>c%{ZlKcp1!AW-J_x;<>@$0=aT zqE;@>)^)p1|4L?#y9@Hctsuh36nlWPg_?qU|Bbn5+4LN%D01e70 zY@k~fPUTBgx(lDGE8}vnu1tgU^bns^ZX64^O)P4FyxEnSrSU_KP;^jCT${8s6uwU2 zxYaPiD;GJ>(5&NN#=uQ4^EN7qk=Cqs6~P$%5dfFYFfUT!)^>77<4b4Tu=A#fc|3=@A9>Ye*F)lcUY(R|ltGBQ@6O*F9Cb<=9caW!O=j3-3XxrS>EwlxnZt z6WvmBM5RRA5`h#oa*!La11H=!h4w)64eoLkk%qXw*MhwgGHY3Y5g4|FYalRT&oMY! zIvASCRX{8mCR!wnY2&IPGZ~brgo{{dB2<%0f9wwRfe{$Rgy|j9gwxgR&2Bs`wyL#P z4#W2iCYt>Aj||MybVL(-pZf8Xs+g&&at*j;iavhmxO0{hQ|L7J@?GsliHD zP+rV?c90?)%#r%wOnq_0^p!)-#N*K~E&Di$9$ZGD#yeV<(q3^lBO_4QTyE~(TDz=) z$frS+;8P-?9dpjSm9OxkH-V5-NSo!!I&pT2!_D7|H4(KaKlgpZ^@>Avn5M6`eNTM$ z8gW27sw)c?Wq6E({#@BZy?Oy<@@Tvym#^P-wn;~mMeWxqE{;i|OB)9&H7B}_7AYq7 zLZKU(NA{dN3XEg*Xc74BLB8=9Ns3QM{=gDUlJK`XLV?&ONb#?X=^}fC`xk;eVMZ|| zqvUea!?h^}Q%cs;8023%p##L-V4kGN0Cy0{xqV2!qiJC7JJO?wa?4kHXihSXwUmew zI`20vxkqlog8XjroN^(pK!AMnwCNxo&c-z(G5hau0~+Ef3nb$v^vgm4lZ^T<$0<`6 zJWAioRUXV^6v8{mTP)Gfd!vaik{`b!G;dfi{fZSynNMj6{BAMZN=5niTX`|itQwyTqr z!ZLy&!Fh&)6GT_ZPAlF8e}Hs=s154FnpeQG!CzXm%BOkj&xOlj>YE=n1fNQlO3ZM~ zpuT@mkx*f3FfPDAK#2d24c!0!y#LR1aEZ#e0*Ek@-!unPAys+1z8qg5B&9MU1&#>_ zbK-9TCNhHTg47WU2+MiK`#pI@vaDBN|C9y@$U_X%+qtJo1CO4{^QDK$LDWF{>eEP5 zjlrCFslW%EdmIdG6rTlvK@_nL6$iG7c^5qviYQUeoBkG~%D0ONn&DJ2o~l zZ1<6?-1pDjHMm7#!tjHY4yUbin8n5VDWxybNM5vx4wVnU6$a*6r=K0+D9#pBGV6b=Z(fk&hy zWuRg=y+^zLV~XK#$Yv275!3^8Ud%kn#p!=Q(oiZi|0}2!UNI*b1)IdN2{|!+8 z`5vGR?Ww2fCSb`{^up$?!)GumW6QlG(TFx~V>@1DHl9{EoMy%wEqa;sNS45#rMxrc zDLn>49GX_23T6UATta<~5`rIWI~pZwB~9c?Ozx%)V;3Z%`wNz>nVe1f$7MI0lU1ji zs*Lhkd(pf&g`+lbTXeW5Q z=u!Mus}N8&|HAg(s}N8(FL?Tx;QtQ%rBp=tc9wrS>i-V?fBdOg{E_;(5b@6SFPi^( zuMk=5A^yr<=ne~qcFt@_!T)QYkPaG1M8I5Gmb<3olJ97b=@F&JNw|%Y1;OD`7 z>&TEjDncvWv+~ax0mhbJ^$NGmsaRCy$z3{YzRV$4ZF0*ia+;fU>5z+DJ$r1PS^e3!Y9W)S&51S56cjbPhkIlW+Zbp7 zrX|2G$A+RD^xF^BPHrc~kny?@Xhf_rph4~Vm+pDq zaF$k!=>ee$yZ#hB-$t?kMre~xaOzC57#jD_GS>5BhfJdh%R$74#b~gjR+`08q?zvE zH=C+z!H%)=Ow=ajiVLNUN7Q)ozN+;c2ymr+n!Tnro>Y_i8VnAX<-oU-3beQ~8~?PK zcc-bEO|wn2L>xv;Poar8T9BnN)f{nM?4V^uqd{k8Rv^Ew;Egg1E-ft3!1~^ndZB$^ zD{7}<%eo^VP{?Iu>o%O$ld(8Xdw`Y*63CjQjsXnJy$k(8xa02B;B0*pi-sOIci&pW zQMy!P^o%vw66H;FSeMDh+LTF~-VqNcpCfba+hG2dV@vSN)@!;+KxP5<3uXpO*@=$n zv8=HT!F6?0J9Vb`NMicQkO|Q!dd>K-Ayxq24HPuv%(+qBwNNe1@s|8~B!KQxl%klK zhFc~_^vzFqtvli)MUgk5j*YtCYMQ~6|V$}K%NWiI)W+9nT4uGGL#l9S0;cp=H(1n!9RajQ}Y24`MLS9h*S z`YGHXLGRa7Z)GT*K4iA!Q}k)*0vdvEQ!UAaW45ZqQO>Z2atzqyb%LD9C14f$`pMUw zg)r;_yu}hv`oU-H)FC8CapSp6=BGbD?REM{bYhKqo!v4UDI4jf7PJDk`SWtTlF}i zl7VRkZ|+Czp;(Z9X$_7`grWv}Z_ukHoxSw{ zO-E02cY9?+ua`ry*W6oKJsFlQ#XiWKIkl9*9HxW3N z9iuzZnQ_xRel#0ycMuMX9jiMv+d+^8klBvetvk)Zn`}yTb4|USqjQkiVx;BxVrk(3 zvyD(o&nvyb0*LQZSH}zo4FcX-W_^?}v^NX}nI>E2fT{75 z%D6`RX30Zjc$<*MaLs3_X%ji3Mis(0O^$)JH#SCYOlxJGQ-rVI_L2Ilk;7JKHj~f&;N_Vv@j}C zezf@Uvx|=9q68;nX}~5PRWhmyGgv*W?odU`)79!41bD&#cC_}uVX+SDvXJ@qu(#dT zW~RPA;~YKJ5>pF?1sjR@V!|WqMdpn&tIKvG)e=fi?R|VUg;M=>COt6I&q?Qy9JH@H z&+8C((%qBr3>p<(kPl@YO{Lz5qm&U(7H$hwS|vk33?>Q~t!+3bpYOgF2Glz`tg;Po zPVekdhGtyHt$Y+(w@X|4ZZYkA}z1PW@*P_hGj|8anbbFHDki#YB`au%SF z$Qh{5w8Sig>?O+_pY?M;Pa>9BuFRC@%)&sMK_lFhcRGXYkR9NZNo`@>sZ$}__QU$} zC2&^o{k@b`n=B*jv@7vTOwY&i!>ZO|jeDU}y126`LG*ok@+Bf!CIF+81@J61(Efc{ zC8&*qHmE4%iX5_*nhN%@V=^v>Q<7`~{#!}eufC#-C|}Mfrc}K}v&7s}$BzwxpWS3j zG2$itr9q4Inyou`4D5C9f$dfPqL7~74>r?|a!!0<-Sohz2IfJ4=V!@=T?ts3d)d`! z6>Jos>ew`u(#hayIJV=adKJe$btlYp-RMu06e@d3XYyownW*pai_yx>{}@`rcIt;T z5-mY6bl5}*5BykBL_`p)48y`PhF2xzF0tm0Q$-Bi1yZwsM1T@f_Rqx`W&Inhr@Y~G zib!^Ro&~ZNPjb#myI@>RzOrYS&lzRk8;zy8gnhLRn-sV{$($vru-hCF{wBnu67fY# zs#Ha$*%BL9(J2Z%m(1XZWoujYG1l zMt2x4h!KCgI-hV}z}_1V>gy?ZRHt`OVA5@~%B62!*~@8aZmGZdmq77buiSRo zLa;r-ulXM=>Wp3SzEC{0{cyuTpKE|ap4mW0^HvA(7?SfalJl5$QSoNu@W2zw@Msg4 z{k%4t)Eaot%1YqX+yW1LZt({mR;iPy)_#H=!lIC*pB zZwuCIt=rAjka^$_=5vn%>Fdjpt`kyLPRU&LZuRw+%+maB9MD!gs&9iWziMHe-Ovf*l3_s4%`F;t%fiX9f1{j+{|yr2nikc#IyV zfRgIK~ zF|70+k&)CuIM4By=9Y(+<#XBMmJd-aqM++64VBbYZL_&Ww9-%LMN`)y%l4$5hwhqppNznzOAJ68j#x=)I_(#^=2 zdE!?aMDRGu2E$$$hJ_0+@qHT}`HXi^x2Jr^c~t74KbVTY%+tKN4C`Jh=bmE}?UM74 zS>q-?fP8D_SQQV3tJeT(^XNDV%RI+Onme}JA1izvJ%wdx_gcdEQ@Ef3lOJXj{Curk zSp@zvkc?cE!6xs-d2Fjn%#!=Fm6?^CZ7S#!(`sTo4{`}17hGJ$;-0SjslscHP?%1E z*H_YTqi(gvomKxX?8s}KyzIIuFHdQMs5lwpWBJ@!qdf3U3blso)hADm(<>(gZ_r&= zEB@QSuK;y@ORN%i=+sF(_Pf8WK>c|f-UZATLm=`SI^~@i>ho8M2V$Kkw3JV3+R{`@ zT5ny-dWDl+ZuKyidZg>G2Ju)qVcdEw-q=KV9BWm;gz5pzI2iV4j|TBCI$7Z{OEila z_X2NF+21ZeFQ-7Q^o;)CZF@lT>Ojxg65s00Nq&_u4*w9PuOcu_KoN)-h;_;=hXLM5 zdqo>jmxz_7# zf&4@c8I?9+D-L*GUXI*!e=TFE*_*9Yg0#!^2uoK?SjC-t5h>|Nz(3^0l-X@2rx9l5Sr z{zf+mgzhv5sv8NO?Kn#R%g_YwC`HA8N|#q|4NS&h1 zjN)_S+G{6l!FPZoR{Z>1b3H5bbDUy_uB7Z*`;M=W#a#Inrj%LRNP}XliPBf-V!Z4b z#?+SWG0+s#ops-cpxr+gzp&$*vFb2>iOeshbN=q|$R&VZ(EZW)8NojZ?@WGy(l4iX zI=?La9oh^0r}{gyroXG=w$p=XQUCB)246e%_!C+l3*Hwl(T_Ll=TrNz@^8vHGRI0e z|G?U|dTW*KLnt);_}GQ)CZpx>PMCb7C-%iZQ=2i6n931Q1X&-2XfRCGTKrCt+&i@V_EZ>bC00 z;wXM(^fpj}gb`Sxx}vs1^A@dEf(r>?F(D$!K!@16O~Mg$U5@%dtvCJ)^gr8v{duqJ z`1ANHOWe{D9`;vbQv*xjr`Mf*K7Z-6vs0o~HeiDYoeX?ZLJMK2!#t>?%iO14@+f#GY(X89 zA1k6^ZM6{^Nwq7xGu19*SwO?`m^zG-*DcSPU#cphlImJ+n6gm~ages_Q z=u9nUf1NB!FCh>CX}-d zHBc<(=a)6@w2q@ta_d=B>4fE#3$dWVrNfNX08n8E(}F9VRB=Q@>wl{`PkNS)t2!|T zNmYaaQ6V8G2ztf}gV3EY!&Sa+cn%lnwhoZoE z!9ZQZxb>0U+)C>hw|SObLh*2D2?5gVWaR)BqTzMUO(Vsm&iwW=zT{_~^|`6NlYAshRj`xXQ`q$s@}{CXO0))UQs`#nk<7 zG#xoJbIF#^ZZTysq$Ar-EHqnTwHCCg*{3b4ww(KIN;?-mTa>n+J$T7WnUTjbbu{|e zZlLIpZKmoQo;ul6@wW*`3J{> zrln%-U6@M6U1)>c-R2xkOEe+y?}>DOhv+X?TS*Sc7c_8}n5LmeXhA^v0p_IDPn`zJa}^Cq!N0UO0)q0`YTQe8dQQ0tWJc zZn}9&mw676LfGPLo!8_c=Ho|@I(tw&8xZ(ItXhRW1p9{j=WvPM1z5r@s6uYM+f4xq zJU$^~>S|&H`rbW6lV5~hwRXTR?7*GaKq_#X7oDc)2o6KXpnv2!5c#+cqs1v|6#(YL z`0?+OSm*B{y$P^jpo`?&-^d3abLZF(qCN-4d3y_efky|(Cg^;a52D|H=p&}R zhsvd%_^{X+cG!D)0gB&tJ}%uRy8v@ha^a+Ljks%+T%P~h;^|4yyczozv6 zg2z`ebhiGFqSjPd>0g5k2)+weR;bsAIsmp5yg~{90=idV#;9KmG)wL7Oeo~N!eIoI zU9KS?{O;L9_YQCghO zQJ6|cGlQx*mA;!Cj$}?(HLKidC*q#^H(&-iY$D4b8S|p&73K9eg4m{z4Ls`uMpB>e z5hjM$yGlM*2ng&s1jgcTOQORDcEaEK|5*SvcPHEwpg=%lQ2(8pzyF;8gj_9cO#YXN zP1XLl&QxQ6m$uSOJM_EvQ5B^X)kH*S&{aw3(MlU6c8z z>q`K<)uqFDv69ran9fosZGxAz(( zwPa(t4?)WKaU@*SAWdK&((_|Pa!ZMa0;*x@P`n4D9Z_1!dKI}6nT>TaGR%?`QS3vT z{>wOt)TtNHoqkEOk#u3b5|})RD9mwbdVU49UX&Db8lK!UwdOimb(=g4A*hE$G|kL;IRD7_H48sCHb)@=HFdIH1CFjW1Lf!a5ci z1=3ot7m51*C$i;f78$#NMd%So4zkRTK3;)^syeAk_9`0extxqsJ@?Si$*^4~XCg)K zzf;dC>HkhiwC81b40%myM8G^lR+Q?CBJd@WEk8!eINBzgQ|jwTQwpmU32lIfEiEfe zFg5aZLcb2?u8O&i-}uBbt5AC*JEXCJw$c~vX!D3Q` zHdIHX1cgQ!=tI4}AY^d(0$+)=pvX`K`4X?c2^;952qDH=18xWM7NDc^3eUN|w=4*V zZIwk<5!VG@&<3BfE4+|F zOtWaLI!ku0FZ0u>_1VwS3!DIYmuiZFyJ7Kx!IWTfAyf8vjqC6{?ywgYMJ9EotP}3G z1nH<(9>vTU5nQh!!X*jf1I^)vZ~UOVDUrEvSn@0W;afPYTg6yVAzMNuV7i<*QOu`g zTnYa?qnc2@bfGV%%`&~vi}X+w58^IJ0E;TmG)TvM>TTh3LJYZMjZ5CxkxrKLFZ$Je z9KQp+sR|Frx?980{FgXwSl9#xMcy{V0?EqLNJMGdN7_*-vvGWy^-^BuT{azD(Un2y zE>$5P4OhSxrw7DUcfS|OOptVwl0$xjR8xn+fG`||LdU)KJQ`1Ilb2AQJ>uRx;Z8fbec)V0?saCZC9EsA1-umX|S5teBwYK;AlvL^7 zo0)rawn)l8zAWFzO!nSa&)$pQ+VO=to;OH8jv{tH(ls1G0Qa}f4&{I@(l+gYI0;}Z z-uJx%{>|!L1L*DG=+U zi6`D`A$tHH57|Y$#IrdI4_?2BdMr5zM-;j5d(HNT4p9CWy3c!22`^f|^1BjcZ%n!L z1FDZ|kU5J_4@&EMSeX6fSv!kQ7Yd@}Lhzl${SHuX_}$liFc7NWYB;_W9sjTWvG+)l z?@BQK_0fMyc#0c_O4QCkv78sQB8-Rf5ROzT2F%mlxZX(-Q8xk%IxD=PHFr&silB}EP zp&FN6Dc913L>DT1vyTk-Vroq0!}u?vxhaC|Wx=NT&YO}FG>)@lo~EgBCv|1&OpZNX zDLT9*MlLY1^;1(z<`WjvWvmOTT(=qzlh_4WA^+@^M24Ie*+6O-cXYTmhWLUJDNbPp zmV0%B6x&gnY^lsfI5(Z7Un%e$GEJ2A;rKnB<5C)O!TmR^LvE5!)tJfwn7gGj>k{Gg zXLT+OsSMgny4tedJ&mfnMxxS8R>SOAZKQk567frxrC_HyS)5m~%WR#+R6DrLIL-;N zCfdzXmr8j@h}v7bc}y2RjZxPdUbSe&u*i(8?8oU~Ohfd26JXJ^j797N1 zBiQ`DMh7uciUXI|ZL1VUFR;^ePvOd_&@7%0w(ge^&m;=M%cc0DOWtUpyp_8y93dyS%F{3P$>Z5Hq8 zaq0K?xb#OH$`cmuGTcL?DVRE!*^^|j=Vz$9>bPcMnCzDEB>@Jh0bBiG_*>_h& zgi??r(jka+lO6E3w11CNk zSInn!C-L^ML+8q5h2y1vI(8VA7ZEMPcanzV9+nuN11kTsa+_q&!HZbn)veZ~#M3tK zuTXFnqcyY!}{OdX&I&*5>>qN1n8y6hG)(R3#PoWRNg34^8tov z3f71++w8^!Tv&O(XsKqOxfYTQ@{!+xpIK>vti};eJ_`m!m46~E4luN`oM5@jllEke zPghqBvA9eT#6-a$tJHVasq%$AY#e8({^ZCdzqGQk<+)2vZKk^5Lc$vM{P~tH&oNnh zG(nff_*qGD3D!CSn%`c*O`q(s8woQaJxi~!Me~t`s;S2;^34CUCUDX(X&GudYFuek z2ACKIoGXx3HG11}$FH!Q!RulEdPHXAG`?dgw%iz$%R}<~G#%?CBSws-RuTDYV$x}NY^&HCb-F9Sp!(?hRkh}SdfVhP@_84rIPNfq{T=yk= z)a*oB(`3M{y?N}<&K0Xt-LaIoCv~aFp=xd=B3P&r+8n}F$M$h?a%5EeC3yKl^RF8dt+_+|XhV1b5sWx(FH6nFCL1Q7kh4W$xQbyT6+=oh15W#bNGO==mnL2XDDN> z!Pam_wIC_zs=-#@eW2~&0woV4fKd*6wSy!5XuIvJ18T`7vV>=tz&jL~9be2Po*ogq z6|_)K#&S_y_#kRBB;HvgGdM~xDCZG2LsA23DQun-#FR$ZEXO5JXqREu&N#K^jP!_b`OVOc z@ipJW?r)^G>AXkEo|*y50h^wC4xWqwOA=HO_L2jp*#jpwcP2sCdHd8wEA@ORwc!$T z`@zk6bhRUT-2g8@@53G!^qwuu8$Ebt4w-tQK05~v;>eUrvy&mbd`z<%_9zZ@@L%?8xbHz3TZMZ_EZxJ;%V!8msQO^+9&@ zSrzML6#BG-KYY!hHOw90ja8?JLT|VT?L_Sqsq(PzUX=|VgC4)=Ru`jcPp19lkQT1@ zHXic&YBZ}CQ&XEkt)H?-s(M2>eI>uhTyhBhk4rVy=Ev#{mGHFG9`gUkjs@z9sT1Da$z~tU+ z;!h#}=Q!tkBJ`2kv_M~8AE2a8C0j5&!F9Ul%g!?A=MjZJElH_};*H|IQ#$LA&eKCd zrB9T2SET$Yo0!3+i5zFx>GOPmGcb-#zjo`*>#b1(4-;)tfsX(Qq2Y>d{AuUqrk}Un z$(lmOF}Do0;)hQ>8Ja!=?d}TpEbZlT z4`1mJQ>)EVQ(Oi0qRYUV95Cr(H4c-FHSJp-YDK;b$}4zd7#;v#l~FFr(&@~h$fdl9 zT738;Gq;RsWcSZt@z3xu@NcXKzMAWc8>u0DTIKOuQ~X2ucDdJvCk+#v4;zwdbUmTw z;TUN5w*S!I|Ki%U{waW{|A#{c{vX6wEbZ+Sob3N?(SL-Qa${wG0}CRA>VIH|4cFAr z{^ODf)r1ZUN#qpFuxM$iGuZ;NLqR!GDk3#DDy4pUd^}%#cJP5lEyN>;TA&`%qIph@Mo%6YVui~qnIvvvp$z+uIsLi6yh8Yi34Kw$8j&U(} zeAZo#IWrKsq!FDmmkTolCZyP>Ed421?Mj{xnaIDD#1Hw!rqQq;)fVFrEyOBoh z;q9_{qBnNg*^+EOk#~ZpomaeiP=*MLn_oDeAat*{FX4DR(R=h5oOrYeo2lM%$Eq{+ z#`%KV>h-wnlACz-K9tC!T29LkqprpFHtlFBchF`Avy8dgRdt>~?OqjLs8=~lEqOiT z->~)AN(w=uxF`$hvmX)XLwJoz_ewP*YD4o@0tJB5(t!;k1htm4`=Sr}N;PvPoFL_I z=-zMGd-E)Sjp2!hjadVyC4dVWUS;%wy8gq=G@nIecK zMa8SSmk1q$z4_}cfax?@da<=_@#8RI ziPqjwmb*LZ6=8`?CdXOMFoI{JVou0^;T#K&I@;L9Eoe6BTI;cWH|G$80Dbdq) zwSfZx&A|RQde{Abf4lz*j|Bda6$rIFY)Z5YImscOSiSU_2+G)O7J)+50VfD{=l z&`ltrrRi?l_*i~1e+&H;=v#GuF1WG$>gg-sFW@gOcRMxP2q@wW%}MTXKb!S6JMCb0 ze~b6``vWJy-mC6_Ac~euV@EA<=oVt8-(R7&7?+B5@w^6sx#DP z$NidQcp1z(L?dmHiAAxC0loY%BeXRLu5C2MIQF@Cd_ z8>1S8zYCDc9UeHAj>^8V~JEB}XVcYKdmHL8AFwL`)Q& z2}zD6j@UlSOOzQhN6I$VYnopa)0&EAoodxn+`-1gKx32`^>+nh-8Cbr)%A#ZonFtb zA|E;7E|js8V<@aCfXd2)<|s0%+(V2#)P7fxT}FbXJIekcH-t^`;Ej9Ie2Z%`*LD|t z(JWd!co}B7&)ZB-$g$p=--UN{?*TAIsfU}#BoxH@WsQ;8VtSi{?1?e3+@tv-DT1(&86+yql+EVtgle_ z=r;ScE!v{gsp+&^365r%Svt?zqFlWlNw1SBjvzL#BDvCXvK)~d?yOTsJ1fS#htU=c z|u2ndX(p}Ma^w&GFj_MKss%7l--GkD?> z&J=wjvs;+RoX*9Wzuuh3KRA!Sah&{qbJ9cRJv@jyXyO^GgqEUy4-zv4omh+L5t)Kmt{VO?0{b-E@Y z+c!#%%wNRoNYWzAi+;?j4WS!ZY`(Xz0R$%`7Y*7YTFNLGs!)QJTLhXxCUt9o)cj29 z2~VAYY+@48hI4a88uebG?yIG?5N@54BKEwh&iOzQbU=LLe*}<;c}pgeAY(tz9|~|E zd`jVN&Xn`n>_+vlFyD7BwB`JBtgaosZxaac5ioCRsC8O;X*krm3eL;d!{R(fP*o~W zY;rxzkDRIO49r)K;J^qYF%aX)pn509iSUF=h`BxwxN$Hp`fbFg6SIGrid>9Utu7Zs zRjbFz*mQUAb}V{wZ<7O}AOh6h4Mf#4h>G(9vL4dX_2qRS=KH3&=ez8V|FR?g&(w)u zMlMSM0f6kn8i7Qn)0;QA%mld*HQx814T3~$`;F5-mpTYgARw9lzCmzxcCoh=wzqY# zw==bKk+A=_)ESA4p_ix3zpwn)B}QpN3RDomH`f(M9Qg>Z=VHLa0fL8&iizTvFb_r0 z*lfwl?_A4F(S>>^PN-jg0r;e=F^+=WBYew$s`OZ2K3|_f3~-}~DU4P{pq)*pv&YLj z^+rL08~6BlHto8&VX^b-zuJ-_lNLOSZj>uU)b+uop6Z}(e-{@Tkf;{A@ zrPwj0Xfekkozxgqd9Whf7w#e+!`x9stnyzvxK9dYe+V=p=1hkTyuMF2 zry!U#z61$`)E_92Qns+e_8#4hi>#dX&=p&*IerhVN*RyO#HQ6lbY+KgLHjmRFO^>U zgRFXeCuvg*H86lA7jh1}gzfzOKn=5+oKoZAXolzFJs5L1w~=xYY>|{oui?i& zGEX)uiLQfNwqGcI2fSXs{~z0B@g zJU5=tQ*;mH_6D=BFySI*0HL}_*&<;>UC{^npLLs`4uS>&4+IoS`u{5*^S{&We;{eX z_$aS={`GIFp`KWykAY(fiC89SW5gJwUhlT)H!w1ef`((5q+13r*So62gH?s6>z`{aLknfD*LQN5zuHe<#i_pPlRcIn ziU{!^UEgmFR(|M1{`-8Z=c=rC`ju~%fVKNQEWgvSIo5A^g!&`&sM*%~gLJE*zf_EW z%LTrrY=8V$x)p=kkGk>uejkGDs-#3)4Un=06-0Odl%tl**XTzCA0o>l^^<|hyJFmN zZku8vGLg=6BSSK^u$dPvnQ19v$%@>TBWxL!#B%nmJ3nhYoN2f)qRSv5YEOL^GB6u| zlNrsvp0;FiA>1%8&0I0H-2PE9=L=U8l+71K^mSX7s%eElcGDh~*ff($COBJ-<0L=t z?cNsT#}=dX6fwn%NU>Z;J4sLIb|cYja9k|Xl}phwh1;AE>{=ru z<)cwQ6PY`Q9w@U;=7FG}d=-b?TDLBd9f+EGnxUiF@1YYWDNnL636>;wTu4uv&m@N0 ztcP>OgP+W3o0H1?q14kVS!<=dbk=XtZ}|L0+hA-1aeSj)7~_>%P|<7H)!(%mr9gS2 zyAaah$(kz-T(c{v}hgm9AD29KEC9F;}sH6O`JDlZh-S#jOpsf8tEM zQm<85L2W!OP-R1XwwMdqa!cab@uV|y`eyRGIqJKakZ{arC8Ui<&>~Z?jdRSEmu;-q zmgrS||9gqDaEqg5qXk~8@@EU8Vk{yVJI7(Zl1Z=AoguSD$*tb<*1dwegVu=2aTt?G ztOP|+*!RrB8$))ZBm=V9fSVYEa3GuI8dywWt0`6^J@Z^$zey5-X!aq=aISUt0C3@8 zRoHR>=7I|bM^0dxWL(x!XPwIAR;0|vqGw>})@g*@DFdyH$X*1U{kN&CT9TB$om-d{ zcSUv(`O+yT2TD5&@0z&eS&i9n_yS5O`gzNYXXC)D&$cAx=-xQmSZ)AEP+^*a4E(5VANv^aC!L&~rV^Ybr?E+vzkVi6`M&={I3~%4$sJ<_Q%H*Eiyv2^Chfn#>#!m0DVi zo$dN;)D_omSRSYQPK(?1u*Jm}67E_#N{Ac3KV#Gk%}7S zF}1Ts>9j>_^?b2xcD`=5L2VVW3kfqer1-*N56Ckku^|--8CfPx^tFss=Y&2?3fJx1L$x1-q{z=K}XM`syD`sW-+aX-ZF zWK6@JW24J%APC&YxAP9<1v!M7LP0uHdTJzOR#J62RPqHP{ez>GF?!y`Z-?9YxVUPb zt~@qtR!iLCdC1(OE^G{wJNL};#vuz){=%FgwJ5sMWd}EQWVtzegu~j{wqL@Y4W6;k z8(EH>b&8GtHPJGFH39o1H}|H78fD~?0g5zXR@UokOEptkinU}1%G3YP>y(UoOKuJlG;tGmAqRE*^m>lu%at*-J{$2D^4PLoktqJ=7b zu2X4avF25gBI@6wuU|s>og5 zNhb~dUG*vZ@u@PbHZ4Y;1~k8~$jTv(r%KMvJLOnzE_(Y+Gnt#`+OgEUX{HaXSP$Gr z)|a&b^L047lu({y`nCRvbBOcYys`t1A&}xLpt_ei!<>uR&kZ&Q{hHM7&bWn9Gd(#s zFx7{$1}Od-89h^IF}}6*kXNe736W>bvih!qX36E1OSj|Vz6&jf8jH?e=&yydaQY+? zAD6vv?ul)l@+?AADMoG82*hqga@7d^(6|YxCxmpBLhr^Rec%R5J@nw>Ngr>L5Y`H= zHAE;n==Xd?!5JpJRhd_BR_BqbDBRy>rg+#NhT?5Ki=@ItQwN?A_^%~F|jzv}3q22a@!OGoLb)`K3%C>;i)mezOWa-Lo2wiJro#R6@11iHo ze!4_gkd3XwRy+50(1$oAXGTz0s@V%YpA&lS3)zGnj!M2=##H$g#!w1Ww-?$46utcS z#;|g!%fWnsT|j=`kzD8UK%EfWlponX!7ICSNWygZ&Ig^IoX(&juny>h#g& zoCE4NBHsA5e$EEI3Y#YcYfvK2HP7z>!{0u&<{Tm&a+=bdoHE%9EcK(_5KF$EHj_BK zct#kU(+`BwB% zuKdkpDAa9vi=r=2^0`mDIzaZDGyL6|-tL@lcm7xXyC2UbdLm=a(%Im%so|#+gE<2U zTK}``aSlAfWU$Ty-=I$f0>3~6e)q44e+-GSz_Lz+7FtnSFh??Q7f=x!;;?vuA7s_O zs_c+)$h)GD&o>nT-()V`F!6DAsK&Jr&8!fO8iJ}9XDoJx?k@tgc=*QA#{PKZNpiqp za>$!`$lEdM5KL8mvyR8EbIT1S%NuK~IfL{(ss#+q6GYlan8Oiei1xQ|Mh{JYfPeCS z1&>ZkOUO|>RBuQp8gEJdAkH4+GI#KyF<=4HBd%~1(<8rMg%v=0UpR&cdx45B-(iid zB_&)+Pq?qE<%C0?FMJfIaA7%ZOX=LEs^bIlwOm1Y9FajToZ*ksGt1@2UR`=p_^7OL zkD(Uk(FYS}Bv~P&h(=fIfz^&TGNX(pt9k8>C+&u!st#*tdH1_s3sB=O-l)}9;||qs z%BW__;70>mK}YNjHHANwK*g-IU0-yWR9sO?qy-jB7?!67Z`CbmocYE&QaUz&*`FhtQ5~(DQ7WtM4) zmOh~%gQ<^`tXQn{HJh~LoP+Y#qpQeE6SGeJ0OTIcF$ws_wY{FT%=a0n@Cc51Wf5Lt zrrDA!#w$-p3fF|p8i3}RcKXG2+{4rW>lcvvXNGP>!=CCJ=02&8uGBNH`6kD`FzsAx zyUe6t!0Zu@-7V7eg*$tI?~T4a2!8|d8~^37goCKnd^&TdKuj3>1@lpePbb=mB zQYN7(lg&$lxGIv)OsjHIu{g<>j!`R9)lI{`la8L0P9DZp;`Oa~OqpholeFZUr|)Ub zJVLkkHDy&Mqw!0_W*gVNamLR3$TgaH2MYA$czNRa3n8Q`1CMxKb|{GDko_k)w5SxV zK9O-!3-$0!bT~#YtrNG0&K+{J%Hx^Ee4@5l=bU`7@(sbDJklP_;_h!<=8SgZCsj`J zLc2?eVS|@=;N)0u$7JMj?Qfv&?nKB&0X%t=%Vl?hC!~61We1jU`EOo5Sb2uPKV->G zVaZQE=n9nw%iuW64ql%r>vb?4Ew1ZV*+{7Q!15lrQ1R{iH;A9q}cE z<-9|a@H9=VYJs^blC*6R`?bA5ZH;}wKe^ZL4gTC;yw^vtHPCps#4LmHpCJDgV@AVN zS)}71jtKa_Q{nR;PWFHF_?9trwKKL*a<#KFH2QziW2LbJRv?TBVSg33)@=*D-wp?w z1-(-Bv_geM=gG&-im@@t8yIi8JkLR&3riALwe4pa{!aJLz4_z3C)EA)KLXB{h ztaf&oi(_<$$sZV8x+f2_Rg)M|xgF(xFocX{YW!Z9ay$4fTY>s(uo=#KhOaSR_Lo;O z=L`OD>!;J@-+^N2g9F*&R(cyFmqdlUW)|#?OVd{8SAh&YWX0ct=lkuQ9f^H-c8|9Q zY}WkpiM%dsDL?rCr8#|8waFh)ARt;;ARwv#Q_=jV|Fdh;6qS+HQO5pe+cZryK}Dh= zqKs6*DN0nNvmGF<+PN7vSHCa%mAaLsTIO2rEoS;9_yzQ?U2tZL zVzD)X9uuBz_i&!M|9!jeVE=fUsqX^@M2=A@Wyl&K!BH7`mHXM^95uMm^vgozhHk)XNStHwi?z9YE9-y2q!&Mt} z40_gOlMa>0K$l0)J)e2aF4t8z{N9YxFbSWtQpd)f#9DNoIc$3qFXxqnrQ3 z(B2nabgQ{i+hnde-G^jgi5(f{AYDuLPUqZBmvNq&Mq;V?>+|A^I2szO%G_!;Axj}& z(&K}Fkn7n@o-}n(_Yccb;f#0NIR$OjotMGlv+enC3-l&G6E8ALgQrIiFw%k_Mk~5) ze6SAS^$4??L1D0GdLksT;16oLmGWYH@KAN#Iv(ZmY00CjT=pS|B_Ki?YmuY&0CsnY zA*2~A%u#L#DqAsU%^`3GV^$LIo!@SgRaBP!mYb!Hp7v$XPSvJ6)J8I$XTtmo&&ngj z6kOk$!Z;M%kJzvf-9B!2Fz}Cfs(I1mn{9>Tg%lHwyDU5JfqrgiTR}nQIk>u3ad5vY zxXa8R*JI6XiMBI{cT(<~c+D`CuF}_=-O%8dn|B)}2buEz20OT>L2?HX@ zUgb;4gDraSs0dS>(Wk!AhYZe(v85Itq%11^ZzvA5 zf%1E0>P)m?0P2+;_J+I-e7N5ZZaVCs1e|*x!d1!-_nJqJ6w(dK;5d(KOI7NsJ z#5AsrpOth~g9D6;Hoau3GJeE{t4cn#^=+C&|8`WWK112aGmrUneQ|VEdh- zgxHA|k(~FLy?=4vKqSSYf-Zj~4EtK9f0b>{X_x7VN*3oE(!ISAeeDi9KQ;_#@)=Z#pcNZ-8s4y1%0%*rZaK&SVmU_ypsA~z? zOQObVcqezqHkT@R5-e^*8di)d`$2q$tU*$kg?Q90C&Pn!C1QEuJo$$|c>2Y=Dt;W& z-B3KX5YK7Sp?NculKhCg5{9TpS1tcN zsMDg;pM2^6yJ#voQ6DtCe|M``f&7%@{j>OZa4%EOzz-HFC59&hE3z5f}QoxxnS*#BR^RLotSy~M1Y%}rhZ*MNb+y_VIw z&o;@o)rJ0FzyxCE|5t!5MN-$X1{!-@SFL#2-_Dn;!0x7|{dgJq2qR#9cr<5TKzD_#(#o!W*6E8I* zNuH+GyiW7}MZ1{^LczvLM`vts1Z`r8$xXY`^ig|bnl8KTRUx?Ve|bnSB0ABdX8!Rb z&gI7sk^hgx{yU=+Ul?CC^_M&D*SVP-IfJc4NRgi*kkTPa=&_OEC?tvC(m%m4Bh0|b zQ?j^Ni#GIqwCU0Vq1MrSs3Em6@r!RRsxNEf4T|jAQB@(q=-+#N z{}y0>-F@Bd{j=-ykNY*A@$=~|Mkb zjCY(wXJM_}LKp`f1c?C3Yw9sUO+_TIyh$IiceT|uYD zh!|q_k4dm$5FFbsWsuyP#C-NM(9|WJ~|xI0ZLSq2)6W&U{-hxhI}bc zp;GBRX9X2BWu$A8F?Loq&J~KNSb9i)gbmp?Fr0hDiFt@r0zLzxJX#s?2sWHKJBA?N z4-s4P;YbVU%$_94i}m+IY2Xu~6K8zXGru7+22M}z*dwJQvo?yxop}{Z-2@|q?lglE z(HKvVXf&ZrkDxBW$-EB_v~XdLX!v=`BUY9XQ@b>dk@^;=Sw3uw2ZHu2uq!si z7l0z}s1`WadbKAegrd5)fk&gzL?BwmQ?@TBo)DhluJw-ykViSy+#$`p`@r)d!R|L> z2bU)LAMSk#iJ`bdUm$S*Py`4(JTw6U4-Qp;z@x(qJ-s<}{Xx2pWbGST79jZqyETHsu{|1x1WM`1+SB^G&7fy@aH!G!hPfW4 zw=-tj_ZxWA5W{ONBGIC5*A%1h>o*c8qa!EDDM56H?q+%9)BRqEtcRY+H8Nskc*i@G z`SB-qg0)EvgaNibQlq>pwNfL$G9S?0>E3p11Ks`J4E*|vrhCI0TalF^|G+xm98tg$ zd;YP_V{;V2y)oy#e}dOb8oj?UM$x@uwT#2@=tFVUK92yq63f(q`2xm$z|I3wj!ZMJEFiqYRU2pKR| z>hi{p1BOIauMwyX$>kO8Y$bv{8`rk4QcJ}ekhZpkn@6HQcfVJvH5cu?akIL!_ZCvE zuSpdf=3HdDsWI{|K{at11oTX%B%+Vu7BIo``CVt!I`1qZX`C%1+lMD!uzpWVyH`lv znq8tqq2~}rvsW9YL)xdZ`7Av=Qp=36kiM&6{hS1a0J$B(iK*~iQP?>r$4b((XSVs5 zU-d5UnqD^G2i_hV_%`=ln*Xe_Xl#EAI5wLEK|9t^hbFSN7a0#mcSVQA&|cuvTGUn2 z)nutQ7MHgfi~DJdntxtRHD#$|ic#+bGc^^p71i2|9yV2rW75&uYNXEVtFac0tF5d9 ztLf?!YfVs~eMH%bbRdovjs;qALPwN*bahE^e!Y4|E-#UHSJ}S4d-35I^m?Qfcrr)@+Pq(~q5!;I9L%;#ESc8Bd%o0}x5WBL<#^R9 zVHF%J4TR&Oz>~Z+u9LH?x0dl6;ucIR)`S2KMsmmtI7z*ePlP#SY3(>~V5r_eywU z%RN7(Y(ZnsHOMe<)H9Ez^+Tw=%r2stov43M7v5f@WruIpI1csw`zzzbCQV<6FnrM0 z=Q)1M9x_23%;ah zEmCCj>a7|_-P*N2ZkyN-2s{mrS+s8OMU zWzi&M#aXR~y9g=z$LjO&9^M8!PmMa3y{6W^y}~M~bx8i;yv6rrp+ZIRQ(hS`y|oaS zj#qIlhtJZzUIQi<9yF5q!hte>DzXGErSDbDvw;7zx;Ab-DC$6H1m5pfmkIj#ZPkTOiif`F*?a@D;M{tjvK>Ld(IJPc}KszHq?m&3P{ z$?-L*3o~qJv*J%Q5ht;%P}e_7j+NPZ=8m<7E7f$$r1dUR%@Jy>RaT0`Gb%75S620c zD;7X~W~=_2!NQ&0r2%IvgqD_2K1f>14HuN<>E*34AMJe$Xa%J1kQ%;&jhGez+4YeM z*tFh1++wIls{rlm7tR!-$P%dAS;BewjmWND`V} z4Jq0pntWD5dC(PQ&#|R;b}Dfq*4;bD3=*`CrMHIHr+?XgOJIE`+0|+KUh|w)nU5%f z6bVEr1nz_#r{fP}g?X=v*XQ1UN|lNUxKH&|0?Q+R@V-Lt#BSyxAHPx4^vsrhlN@Dx z4p#ksJFlt4Y?g{WDH+@{_jcsLnMvU(leISqp35lB*yEIV`E?P58(|O)Y#nBfXY(p{ zGQpVvZOOs+R?u07Qbo0qH-#9--AW0EP#2IAa_C{?=RFBmY>6Q7HyQGsmM_kxw!N3g zdJ}%Bv`CXF8Aof9aj5I!N;@MK=Dy;VoMc*~#Y<%W%O=y6?M8J#x)pTDt`k@`ijjmX zwfkc(>#4lO2DBiHanfWtTF3w znUXPA?os{}w@RiP+v6hMYWdAY>YVuX5mTQLx|f z6d4ti#=zjL`VsxMe)(qrKtR90fD|K(F$v&BckiFM`oau@FD90E=>;$D?J{s1RmK2) zZ;F_c_GK~eEssc5b?^bk?P6x&@($SBJeSfTL~0*}`p5d(&!JdqIUh()1WoP4#~i3L zU}#K%`O*r%rBZxOhR+ico{2CIYk$WnemB+iD;EQ)#+Wu|t)+eTsRc4PX_g$3!!V;Y zk(_<}&iG@>jMtO+L@Y^$Oi1Ne7?e--B_5r^NAxAeMaRnWljfNDr+VdcdnxQ56J4eDUBU^^CMZAfO8*}N6!*MB(OY6yH7W%!aDSCd;F<=m(? zn! z`C4_wmMV;EG8aY_xHf7A$J={G15xRuqEg^sp?hYfKWxcGS}|o^?A(5pu8JzTh<%eSJ5l<|1={v_{u%Pu~h`vZRE1_Y#l{kk?;f**_KH%%$xus z^u{*hrtyo}J3fM#)U#K-b}8hkE?LCO(FV=3}-K`*#)&d;r%rllZ$v~s4_Q>DV9 zYaQ}6bO_}-S_#5Ma9BtR35?By8>-ned@sR76r+s*MA%b28oke5c1CN&2_uOyT2xrmlwEqX_>;IidIdTe)0vGGQzu<~2Kj~4 z=qK>ex=4&zYbVl6b<=50(iyW$!w;)N#s6uoG8r{xni|Iay-Ehe-$Ce=22@XQ9 z+YVeuv7g){Y`~$?kOXw=#hy^r4p3$5x?Ee z%nzju%LXcL)qHV_Y122n&)WJG_HeTC#?ODy;c;ebRJ`YouYV;-6LWCQ((EGT3P%am ze3U;3EKP^`b~jcxyZ9u(M8+30OD0|1yz==9axXti!L523juRs^x<#((#&HitJXIfK zv!uVzAHeNakHcbr#khJg%MMaLsOTF|1w=8uqm%}MUvFVyc8zO~Ry{b&8wk%e^r&QL zHd=lt>Kn|`I{{cv+g%GE`TX2zbg6F;D@DBc+LS&Oa)r+X`~aq(DrbJcVr;f`*;x6$T4jqkci z%4zM)+Nd}3yWai1m%&WJdFu^_0z+jkmHf-NcGJ!G>g28I;UW6pKTLK^fUM2sX?>;R zPg{~Y-;y4G*#xY5k&8r3& zKT#HB6ijd8HC1JV0yfw8hA${mu5ti*I!#5 zOu(+Hsxq^+xY`{_eu)*gLFRr&r!QP*dkCjGRW%-Q%ZVl?kwWN+F9A3e=}y=AklQeGutwDPvd+d+w<mGU-I<_b zUd$`c9||b>ynj0}4U4jFw~6Y(NoDgf1pP1k&G7*x4%I6JCdbLkf8v_RM|9u+Ife2J z+MT^p$;l7&u=zX%**5$C8Zo=IgeQY2;vZ7>U0^1E4RrK=PDwnF4I@Q=Zv6x;8wXjK zXs}h%p|C}P{<8_7cRHd9See`8=Mn5SEs5R};EY~vLGaIA%C-#aCb*Ri>Z&5A+t1V} z>Zl&?*qsWYK==6yX9riVU0V3-Ae)-$#Wjk{gUR~U*GS;*F3g-IIqYDTE$x6QG`yG# z{*7EdWvxfm64_OS({dL3Ef#*l zvsZ!Xw6U8YcXb4-YdkAuh?@~I>Go35@c_o-3MNgzmxuM@e8bt7Tt*zu%ySlEwgT?C!9`CGj=@Tj9M=t=Fsf%8+uL4s_K*Ry)3g${km&dN%M9`%I z#o6cUxHgyUq##FhhUvQH`<-aoKYb*6z2T({=Bncfdfn2pd~S}()xF?#O^-a@;?pr& zx(PL61jt&>B1E2s?N!zs7x}w1_2$&#MOn%N>fNOEIB=ulwYA*Bcz|)RnzJB58SBJnBDQY z5_l8Ho3D}I@Y2=O+$RY^GXXi8{%ILDfuO`-@yQR?B(yA(77SOx8q zY{t`(B}kzQFugRpDSD$kzTe}QesAOo*F2y3Zq2=y{Ikq=7ccjHxgQX3>MXI~_;TQ2 zf&)Z2U|+E1J-p(*xj!%kd^7xrGnV;D%a#IuSLESb@}6!mV@iTYW!;i1u->G+?52I5{OvgemN$;4y5Ic+r*K1*!p;9uV4sS^J&n5U1uF z?8BZu5b+9<_5fM>OrCUz%sSe-##Ub)b%}We!jAxQrD1#omMh$J#7hpGMobBTS`FT~ zsnJB?lPsekJRNg%ieXwDT9`qpEF^9g^oL_39Aryjnq0v65H}OTT$l`3f_DKjzzK{# z1fd8Q2rj6HNZJ9(F<|aQqZcoUx^fifXG%jft5$~f2vNP}dI(#jBj;14GmhfMP|Y5q zqp@ld-&lq97+bD0zNFbbbPuA6$G0MI+1eCDh)2L3Kf;J-4>Nu5bILVWmQpaHzPM%%8 zrqbebw&)A1dc%p`5_c`HMu;z*+J!3d2yU$|L~yP~XdlK2MZyt@BS&=~+Q|Evq)0*ibSYJ&K!gt#4LlQ4|v2|l$i-KvUxU6^^tp7Ru^hBsU| z3p+8$Ekiw9MxFQK(1R=ONP8|%s|EcDOM^GJ?DVy8YmFVLzNjB|o&{nHZet4l%GFQo zCVYTYJ6TqEIG>#W{@lluZ9S9=Yp#IfoEO65lboL)cG@V@$g~z>Sxo(=W`{N{rX$J3*CHH zAN*x;n-a=4PWF}fPZfKHd!(wSQ+va9oo#ie$v0!MdI$RPL4VuGzmam-869yOOg(PS z#`F~z%k(JpZ+3+q96qP;tiT%cuYNbgs9)rrD^u6>wvHbj1Ia;co>GOZ^yv(R+B}0I z-recD>+Xpb752b0HD^UrY!&r!baO5EHeo+%P%vGHn!hMDBqjjQ3wCvyC*ULUa!J9e z_TT2&Kw@sG|EcSj=fV7_W}cF!4X+xT4SbvqK?nV|D)KNS3#Z3`zEZgMFT81R6p+J zgf$lt(+K}-#HIrmdw@_2+2cT@1OIa0*jc!J7^Yw7ZtOud_ye~G?z^bnaF|*x zK*8xt)TwX$uN5hJs?-=s3}O(%<)pPiB)68N!ktMj_};$STaet8qS>z`d0vg=ZNmr- zyG>d-tS-|KhXyNk-s9tv`Mk6COANpl12l9C;%&w zPdtRtX)Owaap!v~1=N56>qCA%8Q;jVL(^QKK*{U(5N_}qm6iQ}I&1sn|GRUhUz;S; zqnEwY;szw7NE&C+4`(@J&80np@@q>#zB@^cd+#r!G*=+?hY+CnG7 zAXl5BUC0@VCpXJw7vw$bD}*Fa#M$hOD&#)ESSt6pgt$52PY^0c#7A_0CIpKWf2r8y z5oO8unTf1z_%ZFoM>ZSJsoU}hCkWj?(S$71vD>w5r$|WZ_yk^L?6_>DhkLMfXY^H1R1mzWFiK;#$Svl-L6S+j`FPQvlLeRji zTh-q$TPp-|Wyx)41MgN7>vwe06w3k#a94!}ffK+DBzxGrefrh~)8P9|bJFD@fh)9V z^T011HTx?MDjKc<_7(}jMj8B46WFCjLWx72iD9>v^=BtU2NHE(+L@tcBVaz#swZ?- zvcpnDlav}1v z?q&G$?k!>DDNcZadVv1*pVJSz37B!*QO^3zDpt;%XPI+LB`R%el8;+==Z4AbK7o&j zHg#@pk(<(hobHxck5#PcodYcPHtQ83Mobk_h`W%FX}TMJ?RBu*iU$Gm9F?OTFD?+? z2{Vus>UTqs4Z25#%5t{S81gS57ehhrQcj7#0bz+3y4USJ(epWYlb!aO0~a~gKx-ln zgn{gg8)4Cl_rw@J3AVHl2wiS))`?&j60;PO4utTRynTq}1GD3vqp8YcK&J;`ZqR2R zyayRL4pRg{95&kla2R&*glr#n_a!hGA-v=D6(RlSOm-+nW|{a*)#zS&lF&96*9MGh z`xVoMHE4&Jb?|Dd+~_~MFwuY;J?jtGu)Q#`A6mf_D=s!>cSfeGD;7FW>C>M+d~Bs< zIS^^Jby9d6#w^pG)CYO`;Pym}Li?ihkICQ!_u zEtCg32B|F>{Sh|+TH@%o3H2_zIF+Y2fLI#~AAO}k%A9%wjWvS_GXWu1N_~$*XYI!H zsBE|u1oRi%;-~GgBS@a(O3;dW1`e;IGS(P)rg~Xpg|CxF97Qhe<8A;di_&gE66d3crQrxe%=YX55e-t@BsdU zS1;~6(Dt6S15Pl)=U#Rr+EAF&A25FqZ~*m@9(v0A#y>ey;KbOYSpFg!bf~t^!GC|=EIX}j*NH*op9EvHzDfX_L7z3C<=95btjt+%s#wc$H$J@3~ z3=*o{Vwm2GCneNJf%|G=9K4%=`_ob#1dL)Nk;sS_ZZ>tC_>caTGIj3CRctBeZB*H}LU>WjEd0WVofN7IiTX^~pb3##%-=-DY9qeY6fuSw zk|RS>ER|Y4nCD_51r$Jo3_W>#~!iG1{iWvwEWpnilkJP|>mV=Z``73RlE za9^nX#;p5j;M4ogO_T3Zv}z6_FARwt5LoC-x0C?0iwb)uLpfHitV|Pj`yJVwmqDvV zyxAGF+Os9+)W2e@UCFUEk*sMS;d%p+*m=cO?9LW`Ns}U)i+ih{ag!p7OPm747ji!v zV+s8IZKD`WPOp6L8UQzp@`2f*S2Q)=~{8IYF zwDMCjQw<)2!)i(X{uFdHDL9A9CEl^sBft%r3qfmMSGY7q{Gn@maEwy4X)mO!9UsDa zqmD@_+?NArWOK^ctDstQ452{SU<^_fBx9%O))C4}QpsHCutUU5vN@_&C*Ta$AK_Lm zV!RQk20cAkx>50cOl(mpJ$TFL=}6JF;j%;c4hcQD_Q;w81yG!bH@?^06~LYXC>3ft z;l`=ce4y2n-qT2d16JqBj~a~3!c#JG&h|H4SB^^hdpDkQffs?MET=IDc=7w(&Upw}v-3gy`$#zjJ#V-dzEc+XwA481)VKQpojq$k9lO65<$y z7-E4PK_e+nR2;(j8*)?cRGCx`;aMgK^dOCRdBggk~8v*VqUf!a15eb!Fa(r-xF?n}!p5c72mW#Cc5)qz6DWgCF3Imb^3r-?Z zgAuqxN_ter6w62a2Rr{5mr*({!=7k_5!()}o_L~rs(kvdK;wIke41TS#y|6(ou1g7 zF|T(-)wkFIgTQ;R8#LlW$wSAt&NtX^27$5qQ9;OP#ZYlyTC`D1GJRhl%Lukf>6=O{ z>Ni&Nh-R_Ihh&S&Z>l~l()&0S8eU_R1C2xZQt;$`1J7YQKS0L*EXGI~%GgjxSgbrP zF!26@0tlE3xlJ2dyeG#g-=&PwR*Gy_smz#RA$l$tl1VDGS;a3(*E02%S7=0YR4vlT z&rE2qQL;_WjPg*DC5JCP%3~W+aFrTUct|7YKp-0EhBYY0k#0M3usN3zPnu-=(?6aY zkODs!`}HdEz9;!fx2nBcNIW>YJ8Spv9km?qW==72YRc}52&dxU(}!f!`O4sD#BqKS z?q`L!GPZLH5lQzn*dD}{1Yk$C()%}2X7NGDq>pqb)e|eU(NsdNvTiw6il}~nNb1U2 z&8@KpG5SB0PyX11OsW-0tD_py%f=O!2wo|d23Nb4}`WCDwf=YX4qfG)$!l z)gDi>*}v*}Yh~YlG=q(sZy}lXusirdW_HGV#F>ium{z?Yu0!eH?IzP-Zz@R9x2oou zYa+G)^2797TJ`UmssXX9NiK*FunWglQpwy*YVkqJYJVmgnIuj{gXjaJno!E8K~8+D zbjOfZN$AEQxsZRRCXYMhgJH~>?NTTkR24!r&8*q>q^)92KGl7LpYW>J05UEh+Y;w& z_z6GnWJm9x*~ftlFfRkjQeYbf#rg8mPa#vx-ZEu;{eSehzrV}n#ylr`G?g{)*!1?m z%Aj};{#^_K-=+~EX1#{hp~I3=+u)kssetslq_acP3&xzHEMVGOobOrl3Wd4Co;+Bt z+R)Zb1QJu)PNlUZ#yJ2=XQTrw;7sD`VuNUe^c$jpY>g}gd9nFRUCd!AQo+%1wA8Mv z#1_c6{=jRg8Jd-6pu_O+6pCnA)5GG)Wcu~peEQ=|A8kxTVU}z8)G{H)8v|>N>4p9w z<7=z)H6(MMA40_{$IU41c|S46Dkny|f}Ye}OQyB~a%|dMi9#`S(itjsDy7h%%eYDp zj#>&imqNE#w_yJcB`F+de5 z2(|58I@#1LXk(VaEkGt;VT79;7$HF696a!C$T#dc2%u-EE!^Cr>|gr(>hLyB#pMh` zZ|~}Fa_zG>`q$$qd$d9kmwai0_;P>Z#pR*z`>z@zjbx=R=O2+^K4g{SzZA&W=qY+X zQjSlYYJ0#>Cu$DYI5=-o0}t1v&y`EM)d&x>E-_yrVB`bwXT;?b%&r$~WgJ>@moeOj z`z_2|3iE*72Qf%#g*eH*gnewH^LA;KJ7Ck?bZ?Hkb12d5{b)va--gZ2nQxnHZ-Ov9 zTnW&+v+kvT?%sT@IDPr~VqD!jAm)^<<&qm!XIH4&|41z5V5PZr(k}@x1M8azza)jy z-LNq%wE^S5)6H4KJlWc324ts~nrN^zmD|dTujYCkB~uDF`IAM{Vk@p3-Yf?4##+EY zaHyW-S<9CLG@PjGdt&gn8iz02Qj5QlTuul_?md#8_8{m^AQq^IgO-m=oceqbff?KT zctclIoe(#P{Z!=lkaii0gRIWfxKR}cgntoz=?lW@k6jux`vS2#@g=9RnHBp&Rgb5& z$P7o1j&B=f`l0}8j46&ql6`Stf2s8t_hLMmxUvy>c<1rzUKCDi&%KrW+r24t}(GTCh#_Iy0Au=GL2qof$Cpl%Rr6;`pwZCi1K$HB0+D|iMs$F82Y1~lKAi0a}_j@v>zz#av zOhPx}MeKzz_1A8X+4%_PtZcf%M~K(tQd9sNqc+by!((z8`X0xBa|!>O`(4UHzw?i^ zuLc;>hpk@j1uq~J{MhaA_NDB3Zya`5SpX}L-If-v8W*5E?N96vF7Viz@>~?4a($e? z1uFxNx*m>r<5}(1$eBEN_&Qr0ZNuwJZ-CVwMz0KqoXDAW_g{-Qf+zwn8vipw0sHa4 z@bmqDm0|o>k!fBWKm3poO4y#2t0{(@siW~VS@6a?1QyvD9LHof@tXbwl{Y5>@_x|> zW^1EsxECvgV_&D>FU}vTuDCd&5hw(5`eV*{bkaEVv*L8*$$oXMk*NgOhxD+YY4K@| zoeJ$uQ*uKnD5s6wptN<`c5VB&MbzZ^PWrzd$NdwFp$pqq4AWs~YcjI1hK3zzJSW|i zi6HUJPZ;C~61Kbea@meq(P=ki`-;Arf&T!9{iOb%7b9^|5z7$j#}7Ny{~g`!|GTWT zHDgZ|Umat-KLZjgouOYxNp=-W7a)wE^c5P-K+{^)q6WUA6kwlBN&ow5$qZuU-}`HT zX`XdabY1*hOMJtROOHq;TH4QD3@UV(IGdGOi#`Ul>hB#Foxinq{|4pZ-Q*aQify31zEA+ zF;BL^!Ku2zie@m!A?%DNE=HR%$ibxx$UC zNyj?FkJg?HEV4x8=TB<{Pw6Tet>a#9P-8)+=Y$xRoarkaR$C-pJ?W?o=tUHdV^(HdeKx z#aVGRGnSxDyXpRH$+PWe10HH$8JIDeI9r-n|{2^(6W zTdDIDiA8?MZ8WBmGF{Latjgm|q!@RIl^|}}1gA^5RP%U)R8;f0`cpJhTAn2KA$#?R zsJC5Mk5}b7$!;2Grfdpfk5ML}o~=1BI(pWmw9loPhb3~*=q78UhcRO&fScNu-JB{l zPPQ<9=sATdS#*KXQLBBf=p&i+V&NNzjN+X%3zsz*V{l}Q5eQGUf|BT_vK!?TAe}tW za>gMnuW^|~YYRi7o+Ul^3P4U8NjFPP?#Kw+O5eUAV_hT&IS`+9YY4a(*u2 zWeYCPvx)7L-N}BipmNOjgEKa`q`TlVxRlI8R-|<-Y6sX$15_f_a4X(_%A4U2V>5&`XR9F(N2>#@qDdBs3HmQs6O6 z1XHT=PKQ(ZDqJR^%waqzg7!L2|A}x(&X8@@>Yzuaj#i;gL0)>LiY9=Ey-cYZb4oFF zwCZVDRgiB5Jo_UC<%?2H9P6MH`gU9)0Z98d2Ko)wKyR?bA)sm8bOT||4UF%mDW6QX zE$u^pUFo{N2_BRu=6^`C)now-)}_z-1%5V$4x~RDy7<&Qus0N%?Iha=tQ=SnH3-1e zRxtMXAvp;mrGmRN2+>0OOApjf{XkA;#r3SDZ)n5u%n3Bi03&h_>OG@_sHKDUmmRpB z`jN0N4YQ$$pp5qu8={|jAK5%m5;OybbX>02F!U_mKx`crK-)Y-c;gzvbu$F5mwDyb zk9309hH>vN!Qel6G|8PGE1c`(sd!{Y0|JOQ7)tLrnvdMi8EL^*=xtyhW4EzPx~;Z5 zF{(eeFUYN?>z2OJ;yIMKz{Mq{muKT!#d~f53GSQpxm0G|4=$~=N7m*y{~~N~w1lon zt*f_y{y^<4kMeIgkji4mbR@9*5X^2Xi=N!JRD6?2eoA+JiC_efOFvH$$ax@DSS1LC zkS_UW=l4`@4f1{=hX3Bob+%k?s~tRwy|Lcx)WuM#qqIL{z%gxx@L9KRLYYf0b z=HlUBK|1o+sdjHs(T{lD=&5@7FD1pz{ZX$u5r6!6BK+}#?|(ah|M$Q>s^#UYwuO~6)MP4z7)m)P!~{mKRKv*1I2kf2m-`x?xK(XsU*}V&QN_@q zz9OSr3%9?!Rotpk_DE=+sDNlyc6aFibu6mUc)ymi6C>%sFn#!LWNZ#p$~mpM8@7 z_C*tVZA9rF-)U@iGhnwLArbeL?<)wp9{>f%J?J_l2iN^NG#{?hefRE;a^BL3OBy8y z{rn-FS}FF@kNu^)D9@A3>M7nSHW?=&lKFn3@|W%#LnZw5R2ww)dPC~F96oaHznvU> zrQC&Z9;QCNlNR(3tf2U7Oq4&C@NkEiKRcXopGz@M=Q)_Le1|UWPmBBCiWS}?K=rHL z6$cx_Rk}51=2u49lvm}z`!f{ME8s0g=A%p?jQ?e}t6Q9z1!uh+zJF0#k&*y3GvFe( z;wbZ@-NuR^;dP3hJ5*9NTlEDp){2+R>SThSBB=~qi1F3tSj06aitG?(uTm*#^-FIT zhZXD8vags?#%j^^pWvTrOT;Wz7G$uYd5a0zq2R0)>mIaGW|x&U%o822O*dsIceIPj zW~)>R&Z8%GLBldmK!rs`N4j|Qi+pL2Mo%E zhcnhn5f7wmMY2SvG|4n(5bnzrV;Pel<`666ws))moTO9noXQ|V_0A-Pr(>zMd#cmD z9Z`*H>*#c`*LqCE9H9lA;z3m>^ag~px5OGQ$yA=_mG|^m^sYvhdCarQ{iz{RzC#lY zzV>3Idy5lNu5n;EhsmtgT^#SyP?1&+(jFgM19pnA`)Nw25s*e^=q0L%FR>ICc@MWt zu+uY4ZraTmaZIlXd-EEGwlCF6<7+VunDfN?jnIRrXsSx?_f6moJDJM z84l9H``7GyfFpnQf4W5)aDuw7&wtfbNU`WA<0j9fnx#`TQ)ZDXu|E->k;&hik=0K7 z6cZCpvdHI4jPm4CPIA*`H%N@?NaHOQnn2AdDJP`S+9+3;q~+?yv10aAAEI+b+)KrX zqk+iLqI0bEt2_bqbZ@=Ug8K>ZU!{lhR%PFnZ!tRufDiT2y}R<@{+c%!Je>Ag4*tZ( zr?``(W(bCRu|hr;cB9O5MsErw2WTEZ4Fd^z!f`RDnL|mD7kVeghw7;ATSj!ik$uqO z%WI}Xm<>aXslBP6yv6`m(W|K{UypXXH+jr}I&Pm(4Apbq7WW`uSP9hjZ2GU-W<@~ey^y3@ z1vXTzn5K~JYU~CZ=Iy>d=Iwz#)NRe%5114CPf4RMkeD83gp(F#q8Mxjt#ha@CeeX< z7@2SN1g5|GF`PQ)uvlNTh1YgaY}aM6a<6&}5Pq6&en~HB)?`G~4WQjTodBn%$oc|D zJsrpJZ!2CR&wC=7txqsi%(h8C!TgsZ>ae;pi3F@22YuBOgU(7MWGz?yjD`(;a@hl- zsLK+3C_2wAlMyya8q1XWl#i?3KwqB55IhAhIO-amG2K=gORTdhW|*fgrnpHdJbF59 zw0IP)L{w5VmoR3TNek^*Bnvc9J@==A$&<>c7OD}f>L?ep0Vev0SP(8TKVEe)fn&8v z^3H>qa#7@DHEeLF)!afcv>#8&;mmPQ(HKckn5f>C?j(`!KwuQVeX8Gdgg~?H7TW#X zif~PM{+rg^%dCU7{{O+*Hw9pGIXwL1(dF_Cmdc~PNQq$m$&RulS!xND(f-gsw1Vr9H#A7!>$@IOj^Lv z*8F+veD>~y7;A{6r=}EOdX=@^+q$xnFSX_I+YgrqZSgGYl7xhs+#*$-cD;SNyjrE~ zB@N4))fnFN_vci18j5ZyGtD0xb?EHA3bbG_-)0YkTcxG7I(QZp^~q7~mWAEhZW?H+ z#-p)g{k)tDzjgZxOk*z3t`*dQ^4LkiSuRb;Pko2cXd_Oh2fttq4O>qA!ofF6y`6y{ zaUAt11Pn!qeu$6a1vSBoKHq)My=@HoV?q-75=kW`o*Pqj7 z8SaZC(4Bkb2+!jI7);udG6fx<}*LYq6`TcHIZ!C+Bc)sB|)r9n7u7fl)0x{qzJpwJc76^qy2#8GM*pOzi=fWug@YsxK)} zcNtq|Dp=HdfsgNSEfKBsfkjjU02w2Ev=ZoV>=#AK{Av&#e&fruYt7C>nzR}j ze$!R@GzLANJO_hT@VnQ^B^mghXsSyS+{;}_BObCgjM|+H`-7j89lP*Hu7fDFZXSa; zw2$s0Q0nf37_?8WBp&hI_fb`mW zCr~&Yt#IDkWtOQ(v)$4)-j-Lm!RNWy=_?IM)o8rPwkD0ET>Q@BYS|v?2sueJm%8Ij z3h`9}{A?S&{kxFhS<}~x@LH7D=gWubF93~x_}9thU^VW83L=5WOyH$*Jvob1#)!`% z>Sf_}BRp}PiA7Vhnl~otk?Z4PD_lwLoXjL{^PW>Vd&wu7&)J+np7JTCkA=r6%r<`` zG7Eyq+iw@sK>O$FBxR6K4y7Peh1+>|H*@L(|GVRyevID&-{>bH==rm;Zt5QaTkQzl z)!>eKJ?c}5$7!S2^ z5^ov4cc&l6miiv#+}j_OKT5#!jF_dgsS!YeUt|h}P=j*Lq-Sv%aeU@P_W_cGUjLy^so8S)Vh!a63jDf*Ml4Qf0K6y{8-SXmd94( zRrEBu+yoS&)KcI3s~ho9RzIRQvy^}#3Z%(7b(Gk!Q=Zue)6UrV9Wec4c#3*sy?k~9uHqgu)Wy!Mq^iD~#{Bne; zrgu&i$)Un~R8%t*x<vyq+4|K+8b zw4WD5oSyDl%rHm07t9oII-W8ou`V6{n)uxpcO0q5EJZu<=haW&=jiX_69X7v##{nf}; zhUd2=vR~}+>+B4iDth?=XY>XM+L-?XIV|yPdV^11N4&(iKJ^^!X$0X3)c4`YPtJ;R zGG;s*jvNtS_DV7oJKklCpQamh?968@uIT{W;OQBP599BKz2>8~Rm{JFh%k-K9T;W} z4EdCHN==%JV6j%kanbCwy7fvzi{fytq3nb6-xip+xbp#9Jc<4j^^XiMZE^^+B^27A z%NtbtS^hmqpxShdbg_G&m%7?mHHS|Y_3>Uh!9^9(7d-Sz_W5jvNHR0q%kB|P zk4`UW{=C{V>i6Hw@0ldD`EH+Lj4sx1#xPYZqWr&m^NH`O62{bYvxyqLqUKPMrWB8S z;gK$5#qIXI6Dduwt7J8gaI3Ya5_W&tqeoEtWuOkzfEQsdIaV32WH^T`!-R2t`r$1* zksZr)I1!{Pz5W}|4&Q^vvj#Q@$R7LuhG*wrJ@7w$P6z6r!gx{O*sK+nf#_#Yh?`=X zX%gZp+G^vE-?WmTn237`U8G>inT+=X#_QA8de$v&m&nyMGH5k4X|$4?I<{3cE!mrP zHWarU9!TOC68s#n;zTU$9azdQ{5=N9tX3dk(RCMdxtFDzG?YUUeerV z_o`L^FRzY#-X+Pr^!v}0DIqVa1b|`|v6cBtd&YE{IiPFm?#|Y0D$%?){rHt?l$hBd z%cX>CSpmlL_ruivys-(+x(Xn&w%^kCVRhMoS+F)Cf z#v7Ag>O-Yz_1ZL>?)l*&KmYcm&4=#jqd)at%fJA4W`lkfOo>&38jk6w`0BlIqJ45Y z$9tPnn-&dFOdo#SC7N-Sbiy*NG%R1IO)afe3MH*n$83V#D|W2Q{Z!11mb@F@s#OLh zojh@h+~dttg8TYF&wmSu@y>L|l=Xx zJVrO3$?#v@-Q)KRD`b1t#P`xZ*rzfW+}>*V`DQcvb*5h@9OoLR*Nv}rmbB|gUOwLP zH6G~`1n8A?EBv~~*dn;O5B^9o3s|FBb2jMV2Oo z?dn)J0g8uM>8q(!cXJ|N#e|^Pf4ISyIIUB-wT7n+mkSDT|T3>vocY0{A#GreYs zm|MzF8ZpxGGQ}PY{V<)l6jGcx!5p(%lp0&z+#{{vW-)aqpAb$QOH-V0r2;!Zzq>5d zvw>yl>Ez#_PZIG!rKG8-q^6_NS=7{MtS)NkXaqDg0(y*r9Z8iVb75~$+_W^&VkqX6 z*0nHV+_9{js4Q~){T*i$m6a3RnJ4DhDk|%m%JVaA-g1|BY-nz7vE!judlRzzS+?%| zb~d;d>fyzyO7judko}YnD>h+UJQ!o;nGLY)1{Ok;)>h|;{~l?naswSp+NjX&&SFMm%e8Qs zO)hr185c;pne$e+0#oeHVdtOdPsnpL(c_+@#}BkHCUN7#7GN>U zd864(j2}PzE-?bzU1!Uq%(}jX#PnAcc@Vii#3Y~PPI-R|U%d*;fTC=sHbyjNNm2A; zSki1`J+Fk#no@aeqX5j~ACnoHtvV@9=KgUu<4>Te`pi(kf;2+8&2FySUI{H=+AkPY z^~43om6*lP&HxaT~K0Y5!5I zL#XZHueQRP<|a;z_8G?CY0xCUCu19LXnc!!PZvzqiXc>eLNfa!-)KmQ{02VH0Kq<; z>Q$T=^i1SdeK5sCA{oGP&=uj@TCmh+KdX(7OnG}pMB$b5H#!i?>Jmz{h@w#Om#r4e zd-3E1ZP6Vuap5dpQOk61L7vI z`7S_%_so^TPp+&p7)s;kZ(s0sL??EK@cT~XT;r7Xgj=$D16!RU=>1W<|U=HA(=0gI& z5-)U~&4-k-18c`(IKA@w&X2r{Z;#yX zeumQz1@G0#@446QkDe)$(9B&(&@Yf*hu=3wxmyJsZeNQ0rt>t+?xM#^%w*yE^Ijo; zCyOw;eN~quyfd$2aMpPeb;07a%h-9=tfR?FNd7_?(^;33A+KXu!jOR$M!;Ufvli3A zUf9B97A8Lc7*P00$Xam@DtlC+m+E;@DOO^$N?`RI<{? zAUi?9CHJfrx=PX$4Fta8*t8>9K${~S7q^uS%1)P)^*uS0tqZ696}{_U>in7qyo3u> zNA?X)wuTDEgoyr;%Lcp|I99~?7Ko%~vTqnBH6U=Ng~>QqcPNQn9jDA@{|EHiPpoW7 z2F4l&m`Lm2v||NPza~IR=Xh;Mj2H|qmrKk?V&fv1BV&Ixl3HKDK4{3@FoNN;N%2zk zsp<*Ls8+ZNffm^@C8=h|%c!VNAnRqrPA^O?ICfD|HE|{FiO@ky$}xLl5mE{mj{NGB z%^N5Ir%I|Co{B(h@t^;VJ~PYY$Jg`2$5^q*V&g zn1R@uJ3qO33|UDE`ux0!4S#4LTh?%OsF!$U1_i4R91hZTf;pzOu`KG>HNixb0B4}x zYBIdL*H$~&RkA|~dEm!=p7rpvvKoV01BC6=zK_>LEJo zpr2}zg2S3d1w&yg@M`GPhO3b~k&!x7%I304G}1}Q*3^h`zkWKx{5a6J`z^TTrEgbQ zOE-spzJ_c^CEaF%0!;b3n_1olV*A?T?I?^{H{?F;@;L;fMjz*D1C_%}@odruFdH!0 zGzbA=aQZL)WV)GFQu<$1`e3k9(BTn@1*u(GRjSVha)vIqQm1(bQ4ZCi)>3d}(mBPH zQ=nWG6kJsyilf9B$kkkend9DsgY2GneyaLkipz>9VYF(c-Uc{m6CG}58cOOqDsc;p zRwt9i2fkeQSq)i=tmfPB)x7$rxRF9bd(_Qtxp;UDZB*fDioV(1?0iNUZcqJVbgee( z&t$2AHS-$GDaJ-|F1vdZD(Q%W#!5~OZqLTA(qi2kNw5olV1DYa-^%*i%3r_v=`Z3l7w9E|F@rAmN%beaXw6L7na$bW?d!voxv!T~$4J zxId`uJLr{nDGr6qq<#gQ!8FTQfDIGd6~Z?s3R<}`k$JTS&2Ujmc-Pz@yd_4_%v_G4 z8$^so_=)n|c@ZFR#jX9~OjluXI4!h({v>7CtrKO;&ulLiaVa8%J21>9MsW!CkB)}x z%}%qr7bK5%<)F$UV6olb0MwEw1HlJZZNX3 zb?Suuw%CO~t8eU+u?q{GQP-3CpZwOkeNNpY-#OkYMbz*$A$5tbG9t}Jq5TodwV%yY zu%FFZp_-5)Hn(Gm7wP@W>hJA@yJlUlhDMLHzrGMOCNEw)r^Deys)%zjds5w5?Me(8 zlZ4?PV*EOF3>9_$MnUD;`pb_4-CygKXT4laF&7PI(ty8Txrg>YBT=9Vt#=AuR^{sr z4aSEBnH_fQiaV&H?N+&OI3RS44BXbc+DxpH{ze@zC>0+btrDI2YG~~= z`%@qhxi**wY-W}A5wy_C+8GohG>N)iozldg(>=+$MW1x7rbn2>H_2Pw4LR8xBv3F_ z(L;mSM`unF-@yz>?SK5N+QmN3n_7FDVQ&bZ97;Yl)IU9~_zrlzzc{55I!keE7Nfc= zk$1&Kem%EjHdA3@^2-!2d{*m-g`8eLg@5cy?g8X^%x-$dm3DhFZwB{>Kkt2>Q(Zsr zetxAqL)2dhwb1L>lP#_cHY@NE6gre2`=5<8snQ!SHpRo29~WEew{Emn9-BP0t$jmz z&lLvnkK`-wuR2#%_Mq^IY!AdZpxm-LCw^cJJsC2Tg3ou1qsd;Ad)yFuVSA6S%kjI; z8S!9;p1Mb^v3EnWko`LVW^qK|i zc7~5y;O{en)yZD4?x{967)kY5KGKFldpIFIJ|AmqbQgU@j(aajri5ITitgDGa<0j4kFs}#n}Ygll7pwhw%wWJ$|Q23pvN=l-04{=m^zGs4b72U^swJ!M%DP* zDOM;AZh)$Az%G@u#na3KSW1}^VqStn`z6t#Eq!y1p%G2&?-p`JQnRMWxElY9i~6Z8 zB0|+B-bS%B2v!JN)CJ2Me7u{?OGHNbWXi-wiN4i+iU*ZyM2qQg<}S?kDPqm~zT|T* zQLpwq-3ZmTaB}>TqOc3BtI_f{BD!U@<(-Mgg~!>|Zq|D!S}qe^1YlCBz08ly-}qT{ z3R?UUZZ~H3(4)U~HEQ2MfcJ_sbd3>?#kD8JubZy$9p2dJd7VAm=J%9fm+}$K(a=^L zK!D5%Z%4|+2{Y$+nPJ$Z6^b5|QQbgw)vY_6UtF!4F+*6V5Ua$+`H4jzjCyx^0lVCz zKfJAD#TLVii%A*HY5Iv*%Awy-xK(SqzgX``cAFqlUawP3GZsyVF@BMkkjRr)cXNHV zGu^drNW(CkdH~dnsTD^oj&1ch;r3(S42~uDW`=P!Z}|E4+~kwKLAX3=eR^PtgEB&@ zE}^toS#$h^ba1jyh3>$<)}2XHRCiRY5npq4bQr`Tn69N4L(PfC6)U7nGsGnwYmj{@ z?#_^A;EO4UCqAJsx}y=3;l0)&Ul5uMZfn}ib%8LdI%>&waXMh(knEE2u-$p)6Rg|# z{!{9NS?(0lx9nN5bhs3s7IRyM=2^LQZ;FGzrXXA$&d{+r>6u@1_Xp>L2xN{#LD>~* z*xO@@L_mqaYR7vMX!~)>a5EDqAi#;1eSL(QBSm%50lwEc98B}ZG74)0{#E0YExXV7 zZ%TWfp%8-_0^kO7iMN(Arq!Gal@~s^E*Q%W#L+x3GmGB&a8IP#8NAaVBBuhSA6U?wbyM5%k#%h(AMId3+y2 ztsh)_^rOdr1i`u^gLa`0WAf4rgemA4@pi$ZjgZHT?=`hc;A~A#~bVb!XArrtOJ3s3m zXw>^bX&&v%wm{e*z?a~EUvq#bc21BHadgCY@Fc*3>G&qT4`3) zAP~G`U>K-@lv79Y-m~kN9_{<#;n|g8&iyH}TlavkoN$+O_cLAKlM&7%weRy_Vws)} zop_EEeADo^kx0wqMt%4L|5{r<{Y6nOxWX)e{)|&H8wc8_q9L6AtcWhu50yHXH>x%8 zxaIVIbG#0wt6l%^3YaI|n7w?k)!W#Lj6arL=Cyx_cGH|gSxzvjeZpe#=FLitnva#} zwr2M%r9BC3oBmHn%iJgLusa0MqA0S-$L? zbFzPoYzGD&jih;g@1+!cD(10jLYz<6*)(V=UMaexY;v zq>Kb_`*&EAjq|x3&I{9enayQ$qvY#xo1y!VwA%hK7mlvuf%~meCfO%`l(a_E{NoE4 z>bzz5=4HKdMQJ!;j3jTAZ;nVNZ`Q~SCO6Eq6)!y5iYIqEg))~y5jK2Dfl>{L79BL1 zoK$PhJTB{AI57j#QV&%-my#>~m z-*#DK&xfCUE8-C~o}i%)?UlC|91eD|O5PxY7A)5mEGJ!;FJx5eex<%WL#E;W(DoHf zekhG;9iRLv?mKz-kxc5x+;v4+-U$(K8t#5%RK0HGh`9~}YX`F@xQnc)&-%p=-c!=2 z;>)a2%0xw?rj&p()Ev(zMKHRLLjAcGp7Y6iikM3l&;KTXioixS=a1lQi4_R$pvaO69@)u!HgYz|}y%w<=iatQn91k0=0fYh;*g37j&U$NbX4ZZb; zb^@TVa~*KOHs&GO6c!A!BG(Z1kOxE<+U$)=^HBQNoU{*l`yxjO(3ie73*Z;X=#gg1 zdz2P#{B)#z8T-d7=0+!FrbVN|kw#BBOygYX6vv(ypaNvOPT3zs0*CkN(9S%-eM-6m zOuGF`L1+~FHK>CPAssJ_g!{b|-L1r=$?kHw5wB4qkFjmJmDGWByB`|;F&gD4{o!B; zc&$SaC(;;joWvl@L0SYs8mT6=XUa=|FNzfqxUp_2#)i`se;GjQ8Hl^QIA>f-Q}0(< zk{RRw3g-IGTz7(lWunf-E4 z)yN7M+at2u2q^zaY|7Je-t8WuCfV@3ip_No0_3Mq_~0=2b%}R#zgvYM^zGW3V3qqddWJ#BN6262spLesG4#=tes|r0Hv2w}je`TW}6HX127u8j=WA5m8?etA)6i zFs6mGjdva}O1`9=JhA4g%+*q(8w^N8rg=4 zi$55O&0Oa}HrffeeG%n55vV#KXrDnn;QOoyL}vJ+4tx@*U$b5L1)wgxqS)`}X#BOW*9vVIXI+ zNYWKs9WDQQ$rT#x8~2brzMg~hhd;gZ61;id6&EP+_D5>FC$T=t2XPOOUVkM!PNGbn zQ=ERNENTT&i&a|~!803LoQnbSZale(@Y#%7HAdyR!F+G~MQm2FP%E06ju7rZXuQIK6OrWi~hpay*&+#DhM(T^PlaY{-ri&mTHbRhpvf>) zJ`CpAUh`vi$CoQy4%pOtvzHN1r*3Hnw?JIdglZMthH` zxoJ)8U_Sw8DHs9*sh<5Q_E}PVEi{Zu6k+6Lrt}!kpwW>QCe}5*FskcQ0xZq4KBq zFf&dBaBX6eb5aufGAkZ$bXXbw$!jt*_ZmenU+{?bvbGv#3M8p!EfM%qU1;;&cHOu7p8sMmdL{dYDT0jJIo?HO@wh%TU43* z6cT5(2Zr=3)foEyy?Vy=qoV&RR}!gF_00Y8`Y zxSzWGYhCTytF81@Cl_*MhIhD$=-_Bup%DlM8|k(n-|0}6(_u_*1EUzgY9Vq9XKi-4WhG$r|`ZT{3|oVc8~ zt%8tjNOaz;W%q2^GKma18xEa2z{#4jZUpe^+)Yg%XEXaoHLl4Kj2D+b1^pfI%PFy{~E;>)}Lp&EGtisL%;=5nYx}^w=7?X^~ z5#~?#c>EZTpn7B+J_+Jy3#;Ct5t3;3i6au27zaW>-_lgC@2J{NaLbFK-p}*eANz2I zD`l8fzib}+g@2yc{n*ztU9ouR(E(pN3f3cCF@(b;03YNZ)k9!E?_W4M6qxasow@I# zfsCrM@U)IB+ruZ<-6924M#8)qijdOlir|hS4fgc8vN_?6noi$`No@eJ_iFchCVdo> zmrwU&k+0R^^jG%zTrtMGwr5X&?b|<~rGVNeL!mOt0!jmIOtoP!N$1rC2{NZZKksPD z9cEvDt&Ko+eEA1o!Q~CBoIp1&+dR~3%u?3PP7(qlP#zj~&^2zzCZHjsn3&?IoDiao zK^cZg-OCN8lJy*Zu(-AmGXi!R){C{Jqchyn2_#Z%BfN>;5LkoYPrCNDb^`u2MD1T= zqlO`ZfB=a>K)C*QA?iO@_-Oj%EG)WxZ*BAXvo!Vk!F9p}@4-_#dFbjQ{m@I;p)U}@ zSgH>s#^&jKU*Akz&2&2A;Eg#jiUC+j#w-GCB1Tr~i&~@&jrt*&)aI>iY<)@D>`a8M z?UJlb-5iw+yuQuw~QC``H78csaVhr zdI@Jp5XLJ3BcOH3;nWu{A;*i}x9=&e2mzK6cAe=t7k&+K!{Ip*Ugqa1F8}^JviEWK z8nk@$+4Q_=;ISR~gYT<9{`gjeKp)caYZUndk|E2JDlq*vDv|(#5knyH{VVyxPi&?R z`e7dVgXK$%|D&q@Ju`9{R5RrI<;LapE*b=WH~sE#`=_^_ORDWl3qmi` zZ9cR*Yi2VGU8E+vjfGrSg(3U#UL-wFvEp2p`D$ZnRjpmTev7J*7@D+>@_03h47ZI* zWX>fhb-~Vg3>h+B!xS9!y$+9xUu>i&J<{~kk#g+jZOCToT8eCm@xhAbPaKBn67Eae z)>6SXK_bNu^h;&RYgwgAd5Sz~@npRx^QhJA3GOQAanouNBN|=LpkrDp5HV>k%aA_< zd;9lTt7~mB22mT@VY3Gs=+pX0*Ku`?b<@Kv?4cSON-nC(BUa~EQ)}={lV~6Aja6;* zWCo-1+%@ivqo-<)WhTtvI(5-@F>K_<<9Q?Q6etQ$vka&& zVxzr+>JB(0zU!3Uch3Nm_Uees^C+%{IL)**y%(f4I$PX9cc~v##Pbo!L?9wzIQk0yVE0i9z92*00_8J zvQ(KUhoPp+c319Hr!~85q~XoP^DFYvM<6uX=3NTVU4d82H9X1FIfWyJn~-a5Oopv+ zQ_Zz)&OMx43rWT%n)w!;q&D)K`Bn!d-+Y1XmK|)kJ|ZUiTW*>pdgwy{HuhcZF({;D}oqV!Ys7+H?z zWOSc5jwJG6>H6H}xOk?#DKCDH1wqc;DB{=rswFu^^FfqKwl?%$E?Y&b>T+|EFQCNw2f?+#V+I4AIG2H z#g3;=rOnawOyYAg`#6_ur)sUqtIQWH&@{RFJSO4$s|Ty{oM{`#^rqd8bFG~N^3=Kq zIPzqJES=`S3uuQZo^GQgv_DhQmf>Xaj06qFL$qt$wZ(~9FMR__-T>u^0{@g~2G1n( zDU5|gYd*3Hj#M2?pD}MtuBIw|Bf?~b``ygdu6h$@FT7{g5FY2ap5P4TWPeT*i}@I$ zrq;sso!i$DS<6 zW2(kiO1vp%S)B=0ewf@7W5|{i18`Y2V=9<)G;CK&m~%*4XlrPj)G)7xuzK|j#~r!@ zKpM508G!naYG|cuh70o67^i&&VFouj9?80KVnDw80 zYOEN1P#l_8JlV>baOq{pw^Orm^|c9p170?1K4E1Bych5!D`AeaYt7~ZRJjKa{y^dl zq6!DpHRZC3c{w(qvPHSJOz5Jk3=r`|w*C9cyi=u;7WqWuul+c8tACH_1l03^F)y&e z&Odrq2qm&>@k})p?s_iQ~J*mvHI7;i*s=K>a z)Ei3_Z=(P;8vVs2O#)Z6WLv9{;t6Lnlni|g4I>|B-{w$>ncpkEzIWnnwp)REEe3eY zS@bQGd%g1<5iOg3P$ZGENRi9i0oQr)t>{TpB_P4X(oLH%n7L@kwKU)^yt(aoL!qOM z8;*)}LH0t+4llQ-FJ;w!Nc0sbg5vT&8RNQb7|S3*Dl9*&wYpqfGct8G zzKLQJ%UBYV*t>Y;B5^m-YNm#Uer#^^XM3J4aV$%4or5Uw>~UkGF)1)M$5mZwnV%+A zg{vWb){y7XnF3R(%IK)RCAGTAfG*O?Qc!46>xtiTx*tgXx4Uv<&YvZ04W=68XxG-V zW;p9^=(bWNq8ZLSNHP|ewQBCPM8ND;z79pfgGQL#ys|i5%LH|LIv@2R6sXtlU^Z@w zTc85J?yQls)m6QOz7oba^j3$Z>UM#4qoa}ox8snevLW|T0lFX=z>sXMz>!Pi7ys{q z2Z)g1Ij9paIV1D<0tU#3Pqt&B~>fgjutYYEixE=>=lZ#?hN-B*j- z*`-{&7p1hzMqr~qH82w7q1gBELu}HI=0}TRPdH0k)hl7K@h47-}C~ z)Sf8;H86R*Ubrpix*y8iA&&3de`cUqLr&ir_X*QgK0G#Jb*#ZViV1YMG!9?o;PMXX zm6u_S05jFNeGfaMye2bQR%%Yc{7<&|TTC?Hc2Qf06^qFpn&>V?v~0l2@#3tmH@Wkp z@wg-l#A^0y;nU)B1B{Z`92Z96W(P>P^DIlGrb?iHN@$23&_CyVz+-kLzCCfr%Uns? z=H;xvi&V_3g)y`Wh<7?NPYK#wU{FivoHJ=~S>jD>y7 z{}*HDBf&#}-V`CSW8nBl&Mazzg4$p{s2o`#av?142HIVSuaDC#Z$QiT3wjsW3jSS~ zZ>@FS_JO!5UTEc001Cj@!_r{)f5ypE@AB4}aXt>{DmdSdl0acY=!=o~lY6Y7b? zAtL>i#CWl0vpoU7zvIqHs)+)#$kDC*L_k{d#7Mp>J~hTfV=$QJvMN)Wjam7fr|x}z zsEs4Ut`N0mH_?rsRjI*WGJ6vb;K*7@9hkMfTN)v?IM z0~sOh;<>YyIn!R1PJo7l7j%>MhM@D%5#sJCEDlVa_MXiXj#ihR)fMv#!Y?9|_=fm% zyphkwk#lMr-eH$K_AX`|4Qwku0gEoft}#CcOb09n7ym_0Q(U7R$9B+K<=S{mg0VHv z2~Y7S7Dgt*%E1@bUH4y^Y_KdgPTV3(TCiqFVP)h;v6Gl3YnUmTSM&T4haZ<@DD&l z1jM{hFqPyH*OfKM@x|Abr{AbOnrzg<@4`Q#_tb7l^m0dChGFo;Aa6LR?g;ga$rocI zV5;2KJCVC%xvki-8Z#JJ#ykD^6&nr7K-v@fau}k4xGnx+4U46bu$aww~=y=;{I|4S&`fG$3({!!Rwx?s5 z@5xALNxh6Z5b^h3@|jUj|LmAkavl2)JB>@4Vmb0@ z0#J**idHJQn!uNT)YlX^fmV^i zX;3#iz#BzE^4bWbHF{~Y2F_=1)QWXXK#B)V-jOMf(UA=``G*l+w~`Y$xL5=9+EvUM*~Jz zJ|QZP^d9z~SK^*qgfSWf=_tO}PY3Cpv#LL5xTRPWNF5xnXw)rth z*t#^9S6NyDH(xgg-8>U;@7z2Q4Hy=7g+9az;SrRFeDUyy^g_9LBOFlAZV2mg>js0n zRAtw75j|KkUdNAh-adR*VIY?b4f+g1r)wH!7xJm0`Gq@}V4T!+huxK+r9v;FB%-UJS>l2Vh*(gjZn{Pm{U0wFlBiq>aF^#}ca!uil4IG(UWN?cv< zyx{z+YKMnyZf5^cE9pOfg8x6&nz@_VyZ#q2MeILbiVhC8Qg)8E|JCVNv9m!DLiA^k z3nm0qxt;MFY}is9*XCcH)sO7=9B! zh_v(An_JlDS(saRe0_XA;`IH>TW|!Ql;3z%8s;PLsNdV|30Ffvz_d0g)N!Vjo2Z|K zxn!K7o~On#Wq&DZj=31Jq#?$F@KT-G%=2>3X&+aVgP^wRHudzudI>o3vvKp_oQpG) z!Ak8h!K}e3qf-2y7YUOd6;CSMQW3v0AMA-i5H(0HTWuFmkFnvKrA!Ut-jMY zXOg)V9BITCuXdltcmxiMBX}jIZpnGX#_a`LKm9f=rcOrDIIK|1$Biv}u@O1wDWtT* zL_$_2y`G4_Vyb*IE_b$51(4`WE5mYeRVbr9(I8iq-}ETEv~)tqQ!Ou}sl&Wmkd<4I z7;G)UY$eiyCzHIB62Fqma$1>qh2KyUlX%5|g*uIi(cHk9zKW-isj}%kvYUkxx5}3{ z+rs3sG$ZFG+tks5^_#Ah!6EYa_ankh{?G5Ln8XGMQqMJ>IH{W}w$TW4wr(3J3+f6j ziNz9m8A^MA>SuzF*#KD8qH5VHBUSW zvazetm5e}xBXwaxhT3(NP2z=ww{`0gw>e#psZ!QhQmLRuD+;PKGO|mBpM#5wW}CXPkHe5hG1p1-m#aoAcuV( zXl|s`dO&p=)yV)m*0$OWAFeU7Ia?1PzE-*p|F3_)l_5u3` zD&Q2INDy3L)DFD2k3lTHC+O8~z+pkLzs@oG^bA=CUU;A*1dBchm!qbhGG}+gare`% ztJLtP1lD9(N!O&ZL5rLFy}Qs*o!N(Yzr!sLxW|nTRA=QlJ$OK0z2}G0NIvQYTI7rl z9X-@EpA+CHZl@(WQYh%}sxF_Mrv4$BZNMHlDR1u{E=TYXKGoDj{<~`V?2P%d)qZ91 zx`YfpEZAkk9awqs9i6e0{{<(u$(x)BrMz|4~Bqm;ILKL_`JS;z=V(*rE(E7 zs~Tr|=w|ZLn1&AcGG3~6p@7Ls)-c`r%9hfp=#wmu>vAXaTq^p_4SNHuoe`%3d4Rpi z{azAKcWHx1AqG5)DS{_xsP}Z*wN~~2u=b8Ywl>?=VA-~9Ygg4S+qP}n*k#+cZQHhM zmu(y0K7HQX-RHd>eb0Bge>^K9pS2=Z#K(~S@DGSEs2ON) zF%+lu_O+V6<6YC75TG1RbIjln?wzzzZn3yvz0xCYx2+&H2mJ0i&zm0TSNf|#ZLjJ* zJw4pc)n7|m7eBix+fGmV?yb_0+z5{~IA)5B)@?pe{WR5(A(uS9qjyS691pk`h4J&h zcoOI2KDjGB5Zu8Xj)7EsLxY7@1RolDOd4n2V~n53otL80HaubU*1Q+e}M;XhB%5L$sn1xG}&RQuIlu4Zg~7g@RXZ5Mia0VBwpJL zgjkD+uc7l;4gNg1jWD`pp-sTCX1t(=(U3#TgAdLq5qNl;y`Faj?zjbwZ-uQf0HBW_ zPPtn=qzP!e$SZ>W8h#UX;~&<+d=EB)@rHS2^!<7<%7neU1FStw_XrFy@JBfZ_f|_o- z#BSX1G4F8Nv(H5Aa+{djhA>{S1kmzU`{ydNl21~s*YE4_IWLHgyMJA zJp^nr6vpXUXUOALhmBW4s~7{iUhAdsWUF-<(g@@;h=yH!n{RlUSGraVO*`N0 z%nF>iLMX!rmgt{Gc2U{r%-S(y zS{w9Sh%97k7GOx*@}zUqnf{=C{FtUD$N^d)ZU$_&_kYpKubA05`^+6VKD}jo&G51{ zw5(_u>nV`6Ny6{<1X_lay&g8HzJ-o-7 zn>OTjw>G3*^UE0gDXXJPUd%SSpE2}Vn?2VVZfHXpicTEbu__8&^f4uy!;Xh3T=cDZk4;UDjA()N} z7@P~3jR;uu!C+=);oyOl2pBVL&cTP)XXfO5=Hy=Fyw_*rWaeVx$6aUU$6(?j(dT0Q zVkeTfEP81ub*N<(=Fn&_YNoD6V&)l`()4KVFCzTRRL$6gvjlam`1BNw!jvSn`ke0`~XG`J~9S6?cKf#Di#iq!~wX* zGJ1wadPaH%0DvNBB48$9Xao^qeyCFQjCO$LbYQVqE?_dOGJk6gdg9UxUHJ#PC*Xgh z8|MEA-(RLnQBoFJ9_4F#vTS`k)@Y2VrVmJsw5&Q&v1@A8An?GICGg>DXUOF^w%EYeWQW5sqs4@;vJ>-Y zn&!^#S?%45QCWW#b|tBYo9qaN3YdWN>=RwY>~G|nBbY6n%goqt=D^>a56DLxgfX@e z_WiUgw`4xLcon0R-^TA*l8mTucdHJu!qa_3;ei3~+>pC#-?1;hmwje42vV0c&}Cmg z6hClZV2Hx4Fs+VvYcmb6Q@sP6tG^JHw!Z-OwY3!W)PIdR{CMNr>OSM@0Lz z8ZJjUOiz|-3TaaIg*S{&BW&@GECtL~Tg6s8*^>EVAJhB_kjhst#YaD-HgF_U*Mt+) z@G!P@N4#?jis{zwOQ|zEYue{;!33v2w`2(f0B{2e0HFTA#|A}X2N!cgV?kRR8)HK! zK{I_DQ{#V9gygSx|77^bZiT9XK&o>tbjmgC>=SKPU$tMxQhb&ak7x*?Qn>jWnchvbn`{_|@@hF|=(Xv*N2%Hq*8Y zW&B8s$3IsnW|f}9)z4$sVbhblkLr4ppE5G*%#qs{nsE>)yU@;KFT;~qvUCVuYqxvN zsCDfBY*`Kyq_$Z6xJl$kIWtw6VZxy@O!cGRRB2-;FX%x_f*nOMbV zF%#kJNA05<=>I_j9}c^Y+Xyu$-sqIycLOsgoFya!Np-Jp%X|uYP7TT%3SCOW3 zvhmRr+pqGiZJ>>`V6TXm35u(^s&eb!mkGd&E9q9Y&x3c8Dl9V6$)awAF~7gBAG#5J z9Pe+H$IjF~kic9nLS^|Kgg5YXA{hne@!D={pQ+te&)*Zn^68l540le}5#f zkbXy`FbobOTdz9){cnXHvToRoI_=G?JspBC6kk7j9y6lUmz@ImFN*!NQ?#NVbKn-~ zSrcp5nb(}A(=t8ZFL$WDw3{pT-T)DpFa*31!Tvbmn2EKCeXxnnsT?*;Fv{F3s48mE z?iipj!(`T<dMc&5U@%jzk%<>+woI38P|v3=r{n*J{HtL&s1&=bsjSiASill5jY z0&g0%7{*(Kc->-l=Vx%J)!{yRx2G-k(34;#Wd1>aM|(S)Tszc5O*O#|gKZj*H<0O{ zynjWnX)U#85db5VYoG^G05%-ERA)82;;T7=3+!qilXnNt#LCHGFs^|w6Rc0P?HM!L zjB#4d86Xo?Kc#tg1LfQ9CDLL2pdYb<=-O_ceQ^~B#33@d@X5xfYKX+lz#!D2zfO9R zlC)Idtb!JMah&9x8H)mw(3njm8F551WjJKD#~eR2kJz|3kEnpJJZp~1S7483eqaZe zLUCeD1ROPvh;D}{M=d_OD4{?$3QkgPh)FJ~If%37fD%RtNj8O)K;`5A#1BYft$`^S zUXDwGs>qn19rK7^uH}dGkM?vLG9zLsCqIL~(AuBiH14LSn;h*K7 z?cWOr@qbzW|4IEMg$7UF`F*&+Dz^fu10I28Cvv#6j z#4+u`9iW>7!NFjHTXo#FW}LQ|<-Y~r2b;Mz@YUbzt~Uf@t{IF1C*<0c&PDTXM3u(4 z(Yiyk8EDv!CjePMroXBH1MXPtehSu6dwmgQ!??dF#7ngQasqduIN+3~np4AJwsOtV zGjJz*8oXtPt7Plnx3N3(^t-&9-6P+OsqB(TUrUm`Q|RdL_j||%BWz-<1r8qa5lY}` zi9r%h*Bu}e%o~UixLQRl;a@_Gc{-_N)l`krIsvyoxiJ;M(n)u|<=b;US)Gp?@s9?o zX2h`3d*L^VwBCMfo!hv+xWaD!o=ycJ?6GAr+nd+T+q#M6j0-M~Mw1E-`RG{4B@<=aOZ}%fKBB1bfWqU!(?bfX;(hfIhj-t z86g@ve>g)V5;UFrfHA3eG@5++S#K(C8D{_rHKZI)Ez}?)eNG`?%xW!|h9G7WpG|ro zsg!VV9Y_2#mq)Vu4bZqDpJF?=d%XEwHR!6+ewD#Dm>GqmF;4_Wu9G!GDze{;Cbn&d2~UB7oi4+8Kiey6vOx7{H6rX(a`= z$|FUB+ZuE7iJOZ*!{07(y#Vl_*he7jA$q2svgrDTyl#2>0JaK}4?9P)=8+~zI3+h2 z%etMBQmaeo7ix!^Uo~mNBrH}1%>~V^)!P|V!&0|24T}%y*p0EG?}rRb#9=*cL*mX@ zs@{dguno~L1oB_gJTXRkHc&UfXUOU#ix zP%HlPaQtr~_pg>cE0$MwfB|7>yUAQZAg>4*iCA;u7dV0>A~Y?M0tj#^a7F^g+1|Rs zSK`c2;9xKKjv(Q59yapkjm))c$#DX2&lWF0rXEH?lusakAh&>9byYPT#O0iu3Zorn6#=g7W6XA_FEFU4jW6^yMcQ*pfg>U;~LGwZ4@umwxz7V^& z9A-#he8R{^**#Y6@=7SUxjo*8C7@TU<=CtpnN3bn+uRisoVs9GF20ne=Z0UjgM56e zCO{^fQ%_fH|BCB3Pb(zWA56FZJktLou5O0Lc24HDHuNHYzW6VAMa^A|mF*OaogCbS z|LX^TWk+%yG6M`K+;l}jvkIjkf@v7BZem7yG-v$<0#GotPOb@(76+@!dnhk7WF%lb zzhVS71A%~np_`rXk8yH54_ls7Q~^ZIJk|IrqMJCDK`lncDOQkIS7EOXq~0{rSMl4G z(po#%kV>;xLqRnBn4FTx4JB$0)tKkutSBDEipx)q^_HZS$m|dUS#O)ho5so79&M9~ zN4K!8jfKi&;R&U)>W6tv_nc%NmLhG6fgMiw*HUt+XCp_&i|8pQjI^ddn@WDMHM(Od z=#$spr=08W&hnu~0DbzdE9KrdtPrrtkUmHoV55FL?m={Or5Z+c;O(PMH+=?}hLTrP zl{!91G!C@W(%3h>mi03+Q&ga`NYt3Tnmqokr1(K?-UKDp=Ln(iQkJx^J z`q<-S)d8>0-A3qsBxK&&Ur7VGkFocYw0U0rJkGx7JkEBk@A-aQpa-zogT}uSSA!r3 zdk5s=qx$7T^Jb4H38<0$^AS&XE2S2R58#wQ<(47z2N%>Hu+ht%T7Loo$8BC<42jp| zm@J7G79Sf*bvGR$wSGXKV(JezC9q_p6ROHmS;_KCn$q!L3tB4S;ONEV`T`P(=wk9v z#<3k)%b$Yw5@=cNs`Ob@w$4MNr1Q~5m~CTNL5U`uv@FG^0|-RhE^{naO~Y-j63i^7 z>AMmnYrhKgv9%5DQixB*%!AvNs46R#%j>I=$rG6x!n=#ru(nlGZOCiZU|bc{8)9dh z;;YwQO7OGsk*10Mz=?qKIGT|CX^v6; zqk_75O7>y-9TQ2TQ&UQE!aNw@xCK;;AO17Nh=Hb=$uoShxdfNALpoV#Og#6RY#=4B zfhv``!jEsAMqNG06?dS>*Sg#CgMGlOX{x^yd7#`lZCU8$OoR&uLN%Q!6FtcYc>`^8 z+z*TO_d8?y;Un#jbFtB}QNe^-QbX+a$O(#3H&kGzs54C_x}E$;20Dc$JkjRdRd=Wy zYV1TqOtNsK?D1MX#eQRUim}x`=HM%|XKKTg2o7vT#S-t0`b6$*0ZdP=j$<_z%QFuB zk_S7G8Dp>D8B7xy&Xe-1AIx!D)w|6rL3~xtow6L|MeN1OQ_&D)=Ij z39C4w1mn~aoYN3FcrGdMy`9gNxaKe^YgQ%Cs)@C@ioekWtvrb4Oa@u%%xHLa?k7bD zv1G{weXZH>R|GI!>V$@eiKd!mrbUB<51q2NL;%nQIw3=$ZqWc9Ddwy(3cXuxt_k0m zsu4c1?7IWdZ9KL@gHoSO8;!Mq!R?BeuiQBHF{SZ)yWnN5c0fDpUH}WxZ!} zHR$>CADun!F-7pX=?Nt83>u?%IQCj4=GE4q#X|u3g&}B>l@f27AgM$WBV_z88kLO# zMC}YAEezx-hO{(3wG}H7ubG%SqFk2RJT>S&q~q~su7%sPww(0 zpH8`eMgZ;8_PYjD?@4zGmmDDsZeS2^F=(%|7ekQe4RRI&)+h8gQq;zc|44b<=AO^_ zIgigZk5BTs(a0In%sWTC8y&dDD^`%X`15TF`izcDIN9taJ_xer8~D=DP!#9YU^MrXKQ6{_}|tq`H4Rs3x)geM<_+OeOVcGUr+;s&0y;-e6k`u7bw=DZ`z5wUpKipig2QaC|E>WAj+o@usK8dWMfzcNZ{wzY5|x>4DsB?XG@8 zt{qikttrTwMwehL=L)xs9Aw~LmD}dwk)Lx>g%U6>)0)0W;YUYmgCHW}CP*IMyTYJ? z(16;zH=(;MxrD{?{_yb(VUAi}lJ6lF`gRmrOBibbC#^7hhn55uNKtdN^r#|j-`BM$ zT+V7DV&*2*&jKllEFmZN4msfT?l=v!s8W?^yY$fRT#H@dORN5g(E)a*+;W82=&HVe5_tG)kbdNFy;I640$U0q-R08;mr*qYSAYs41sa6W50@t9+{hK%6sr$C}hN)?~A+xx0Q z@|hB%5oEuepsSo0-h}R8>zL`>Eqfvc#rDkwXSf zi)rl`xz6IW0q^o5cH4G6Is6`8o5QmH)(fqKRJ!Gp-&GA|B-#T9eCcX*FqX4^$DqRT zz)Eo=$U7^wXR>1F^FgPBJlgbGC_1`O1{3z#KoYs+w+R!YBpYW-3*&s@_yaM``bD37 zzI^``xTWP%)RRevQwhfR06c7R7KzM^gbUKq950G5Zk|2*bv zTzhq1d@VxW9em# zn9UQ)g8ST-aHK5y*;7?D4Dzm%WT7wF$V(Fw2iv%{^{Hv>qzuDHv^DBwNQbM<52-7V z*KOD>;dtiJxX!6>_LukvpsV=K5c9h&wmRYQHV}*mOh`kiO#kX&~eF29mTZ`b53BYM;m}$V&J)ZL*h;z>dgswLaQPta`foNKOJx+}J9(QI&V2 zkr(-AO!07rf_zTbNPE{W4CE`RD~zCqW>Vl!T2!A9pk)Xn?^0v?*?M*}b(}_;Crv2! z#*Kw!yj=&CY43pBZ7}P*;nzXFjS@(2Ge66+A>@Lgsl~nXvZ0{4z2A#_*kqQwy8jxa zp_OZSkbjhP=+7hZp9QI+v7xhrxzm470=WN?Z+XiI0_Dk30QEs2<0Ii=M6}Cs2-EQY z{ykVI5*?LU*gIn&V6X#zQ-F{nr^jc|pFHh){kzNaZsUD|`WN#9vC}Mc9il-3A-k%G zvS9G#z>CTx=t}yBCfj_#@y(}RKWfwHz#Q3sl$v>0!5*(~y|k|I4{PkLFr zK2AyVj>eKkQp5Tkc9F5kbyPD^Li9w4(w6c#77v+0BLPy{vW#*}itfd)JjF!!hO?9( z!4!2(lEwwSb~h!n=FD3`F{HtBzU+ppZ}tyS2KacN){Yq38lsH37GkZUwsu~3Fi%2h zA+ZLF`5lWbA;#k_JRP+HFzZ&Rzf~-&vedu-wi`vL^Y8@tM-?%_{*6Ay{}{^TAW0im(n}#cnx=@)Nr>K z_9$(E)4>MJ^SM{^by2^`&NjwHd4#!y0PDpW8)uqP)TQanG)9UiujPc ze#}Pn1B9MgL>}yt=fX-90h($;Nmj7TPMVk}hRFz{F2@w`$(KhI4PjQU*)Bitbb3D+ zm~&Jj(ks3E?{{5C1&%s%#5;g{<<`N1@5a^cNXw5X+HQOTH!&o;#sBY8CN3xVe|D)CGB(k7w)(63TcjW@i^7lK{ey;cqP;y7 z0?L75w-&(wKN8D7uGfEz>|Auv?mEkSb$H8$iM!y7hC9ve=8vd_E_L7v5P19&T&eKT zzAh?XFg@=125^f`A}hY37}`gXq)di~22u{()7x*MNgz za`Z-*a3qJuu^3mGBzOsVn#~cPLztF(tk2;##@=mJ}+{3mGML7 zs2oA#VT-8&J#A~mMiq-Wb}eP;q*d6=D2~|599(3mkwuoc?#&uM!d zL$6*_JotSQZ2R~?A1!-JT`b}-8_153)={oh;%Up)fV7@}CBT~@fp!0%$^QTc01*5C zKmbK2XM=y-Rp93S7YCFzU6GYhzGRp$3r}a?g%JiN=U5;yQ9&dvmzq(C%(291wCPeF zjU3Wpq)ggP$k4vReSfKTB&+Q3Z@b;FwQ2be}Vs^ zZmrpufFf??2-WvW9&AFX-oH0XjS0r4q|uWfK^MdrRDc4~h0{mT6*kp9S6i;jH&o`c z{jEq#uLP7Je7fvCQ=Orshn8&JQvCr6NUWyJS$`QAv|LThpxfA)e7b5q0+((*vss6$ z{QRUflCa2T-B2qsW}&J;QBx^4QYL;*m!ifVhE2em zc!ei9q|A3u4=pN4ect5bw3hv$&Fn*eDz`T$gz@Up{*WsOY`ZDYicE+&Qp-70A`o)O zwt8}R5l(h?S>S`a_SNw1ti9q$I^Wq5vE*fN^D!8QjlJ&eI!mY;TI&r*^F1OhP=qZK z4X|RXwI0kq&C!{oKe7ss8;wRy%l9U}Y~$ zJ+u@UtG(vlyNr^|-jfQUwNh?5l~wmeb34%C=%E;XZ)g6dQ%}#Vd=6K!h6QYoTNJUv z0xs+ui@e6REDjBTuEEsR`%Ae;s@yYfrMjov&6u5d`X=@9Qvs4Tk8~$vo?$-a>qFp} zr?hI(h)gsZkkr>QL zGTu-~DTn2kjD8kb(^id$AHS52Tpx_W zmW1;ggm0#w+fz+C!QYsBh;Aj}Z3xg*3^57{W`hvj@bR6Z=v||b_t$-;Tj0{jJc=uk zE#{PJ`)&%h6d!7ihns+5jCA#AMuM`ZNa13={Eb-7;|w)q%w}TGM&^TZ81GR8l@3$A z!3yBpfHT)(g2@?d%;xqgpN@I1=V~L7t|{UY6fQ&$wwcnvx{pucjf^rTKgF6!rwe3M zTt>x!@68lygomv+_q@RA5H&~!hrHcxH<*MN!d?h@!rQjbZaafmj$SmP-Y|_$#iQpD zAHJjRIp{1?mYog~SfYVwZWvK{!cN~4WquK!MJ()E)4m0m?hBp$&H5%5o`(y80sxpm z{~J#1f6$4)6hg&P5nCC$znc zP^&jM@*MGDhZxfWf{o~Ae;}QLHo}ALcfy?kLP6#KAALz!qTQ5Rd=D2bFnSc+^#4KY& z`R|qaV3Xv9pDW8#cMyV>!%VoU%)f=FN*#i$y6#Zs~v(KT%)} zA)?QUuc8@W3~z-Ua_S@sQM2Zxc~rHj?Ko>tVdyf|3%g3!+EZ81NnM4>oeY_UEorS! zlm%T?%2hnn+1$o7*kC28?K!JTmdrKMDr-ui)1+`mav_rWTFjy?+BbEU!;PGISPRlf zH|8bHC&Vj|+r?Ex_Q0J5o<3FdlcMv})YliC6LwFsr*K*JgdFMA)0U`oW|@*P1kx21 zO;5sxGBTpnOtzM#M5)_h1R0y;E%+NEHZjcW3x{nLn^Raiys~%iG6Z$@qYIMUJ(`z~ zrKw|WW=8Y9{Q*sOwP{E=h zF?^q$I!~liYrEG;+JNT*vteLDu_WrEkHWQ{E|2gOteFF5ylb!O_%L?*J;fDg!pW9G zt6&B|x{+Dl@6-h@T;xv1`QwUP)gib!RGY%M201==xv#x9G}3u|9ou-+RX*~i(YmS& z#G7?F@N^G$_87XNlLCUN@f}I$6CZ9P##s0xydlK1JwqT_W+7r*P#1#9>!ipRKkEJT z@sYouF|&6p>y;A3Tna_tQnQgsBt6oD^cJIAC|_`0WCvaL4yMT(!S;o*-T{Z!$W=~k z`QVmyD~~6#A#};wTXvr3%rLA6K~K}@0@9yn5{6sU=|pyvmw@E~=5ARr&?c_q25sz( zo3|?vDo~t=lm8Bh^t{XH8)XfR$J4?EQPls9A`ep_zBBtC;l-ccPD&&kZJu2hoVXcO zPS?PaJTtc?-U?zs6+R&BT!wkxs0w11AIO!XaF=g;2BAk?7A<=^t*GsT<FJj?S9wE&jN@XoS7K4cQ|c4lPiF z2n4uQ$c#=gcc76+qQJ5>8r~il`5`WaKiLGxGnwa{O#B;&PC<&zOa&Y9$b-wkX-u*M zLwgt%{u8%TmbizlU7`c&(>A__CtMB3m>h_nfxu9R=M{(tv*3G{U#kE%3?^z$+?P+! zVnnliMf#iAiA(fc(P``K#3S;G7ik7j<|7==e4z*1h_>f^(IyvHw*Y!uPT5=XeESDU z0scM;1s4U9*QNelY95~@-a9wuI$?~a4wZ}ITWo*EodS!rOAs&br!h{_AbM@i8L7bb zFluVw&EGomY{m0PWBxJoKtKQh-2b^o|Fr`w-}jHQZe|FzF(Rrw9oZJw$q*hFMt&Ih ztPygQ2-0lj&pV>9RrC>GEs5RJf6 z-9%skV*BX>?Fs<~e!Uz550g>}O#}-KbxygrpxK{o3qDlVD(f_nlJp^IKgxU^mn#+z z94rLnh>5S!S6wa8hPzw2yvY`Ax0=#W(_F3WdONQtv@$eR2yjRpFKCnEM{HbA-C5;p z!tHKrtjWGD$XSko=Be1?|4?eKQ%=BB4mu8d^hWU7ziSmTGMPm0?81>!%5dAj2}k-zyZx?`^Ed zfBbVl)W30F_P=BP*BP?EmiW zi9dI?lB!^ZhcL3N6c&_4q~PeDFT7~e9X32(YWxVoj3glo&ATVG z+o9A1X#^xpI=+<&c|T~MneZLm8nE_!VKlqVbXl5db|~?-{5yA;)G;Zx1`?sry{P1v znR1#0+8^xt=yIVK}5wnXRq2tqjD4X z0Ll3gO}86h+gsu%!_Wsr=7l2tT+7xAvpQ&Q3~=xJ;g)lESgcIq0!u(e@P{QrMfxBv z+eXrS72%VD2TV3BM^h=>2(%=`J=eG*LX;t#qb5apRIoT#c)>ltg+=Z_?~s)gDY9qK z9beo z?Me}`em{XWY@ZAW=6uh;-WSl-Nb?ZLNUY;7lTQ(O5$%Zyz4*c&Ea%n{oD`mXx6jQ z9dySUalQ4lsiiha0o&+Pme?=!!4uGAG0PF!;z1 zWf}6ZGP!-ivWx)UbOEJ{LHy1tM*J#?c}zllbBTFI=5R?&<`E9(YXNtOv_rh3lvEG1 zr*o44(vU*}SSxc6r|Z>b+RQa)PukkR;Y!aF(J$DSQRFV`r~K3n!o8!-YJx{bR4EuaVvts6VjTOoiQH-R4a5mDUZXPV z0n@im`>V*~mxZQX=GAdc zPiDs+F62|lMJo?h7gr!fcb?MM22D~bFH;Ps)zr_FdfC#%#m6T7)_L`hL{4Ouv&6C% zZ%IOgl`y-1xC!c>$&w&_u7t45z?SR<;kc^b^(Fh9rZcSt;I5%@8j?~%QL!)`;)PqM z8je1#?<@2X5!T+Vn`XIah@YpXoi!>_mVGNYG95c8-q?a(d3<)pt}CBwW1ZMwf)z^k+_vhp8pR;z7tZCGL<*E;itnDb=Lm8kTtdaClHw zr(QA7KB;#Y$(mHV77LzY<4iEWgD1In4{azJ!DM27b#X-=yz(-yNnk!*B~tH8YN@PC z_~8b6X=NZ64C)h>MX6|G?O0k5gKZL%yh6ftn2wBmOGiEeNGeS!@xziOqbbsfzpi)w zRhKZqYC4VLBd|y0wN*hR!cb);GFc*?a$-^pi`D`wslpRouA5?WUuxblzNdHU9;Dc# zOx%ywmZ%c5RCvDkvJ}xwkMmK7^O1R@tmXXJJVbG$7yU*USazSLq}>n9isgoM(f*~O zAm5LEpBij>7ZW&Y)nKQh9=N0Ek!BieH2@BHW~~0+ZL1eltFRZw3s#qHHb4hh)UL-5 zP+eb6LlA@Y2DVeLH+h+27^X8+5^Okb`BoYjjtu62!F;E+(iceF57*X%GHe;%n8*-~B|E*uc4CZJW z>qg|H7HZd{{@iV3Rzs(8-3n%d(&bP8pQds_<*@kW><{ zVLt3jdnd95sl<%8c4oh0wz6u`ti3m)!@t7#EI)!)Yz^v|+i2a;0*>+pke+ zs54f9=In)4uvBaTuGi8LSeHgLPR);fBKg45koyWK(V0!t zlqI>Y*P6Nd%CEQGboV`cMN1AXT)7;RShvqQSX0W%MK`*Q{+;S`rMta&M>*%2N)X!e zR#|=w44CG;?H8Y^cF{MNzjG6PUuhSF_72R5Js#m2xo_5ut`PgL;I66avL-i#fRQGjnXb{Wm*ig1YN)J?CwSKE;Vt3QZ_wbTW4czOaX;Qd$1!aX zB~tj4XQ+%212TJ9Lf9gWMA;SbkcZ_&zFQe-A9XG#*(FG}I7yc8IiaP7a7URvAbdF1 z6&+SP93=ZFH-f#>{;3eSczmR7E6UTZqb{}Uw{)u~yK09V*^@!tYDnp7OjCYFtY@t@ zj=&#_w29{w3cO1HrdMwjYFx0#Fl>HomXrIL>sA4@9fhzzOa{s`N{@X~NZRB$?$}4^ zgxD>&%%hYPFhut z$iyuiJE*gy@tO%O>27RdUQ#~|MRZ_Xb*|P)g+;4m{w$_#bjDDg1?Tp-fsY6Jh`Fm) z=7f|cI#{_&j%6}`$W*QnM!l&tw>;4w4^}inn-&9cpT!~x%|=n9H2Q_uPmCd7R4^_- zA~X<@Hkk)*B8_A!{Pdl<)QTppJ1W`E;+1{4p>VB(YVVyd=Qa?z^iu^-3%$qP;GJ7ziJrI0of}0T6uaThuc51wS z<~>|DolaQvLCVhFcia0f&b_QwsrUCrU$J-5J^iA@kkbZHyAp+P!q1)4ePdaC`i{5Q zWkA6L_N{+ho6Fas_(Z~En*NyHu)9>QRN1bo}#1|u7yvb)ZU_S#TfFZh5NPei1cT%}I@h(YjL2`>c3TME{& zky>T0>0RD%lUu?@=E|qK${ge8uowmi?qL0O!^VZZ0tuOplLuv#Srt^Kw-XIau0pA3 zkA9AE9vr1Q-_58`!fe>5irxg5fhb*ZgDx1hDTw&a)Mystd3>;spdzYK4CVls8G>r$ zcSmvpGkbUobZ4Il@|8VX%9YRwy~dH#5jD2_Ro68iVK% zAL35)Te2OhUUQlX6?OfZ3h=FJpCA+2}W?obYD_@D$lR*ktkbpF!bBZ8~HV3>#wMQ7ym40H)^CZ==m*S>^&*7LJt&bDK&)!HrQ-i>bW zcQ%1;G0y8hj9YsYi1&uP597{3FCGY4@0+|4P#O?{zeM`1d;qE`!Zz)tzuQ6A*4X1c z@8>PtaV`5m5PZqA-1!FG{U+V@4Y}!&eDM{2NrC+K4E*-)|Mu+v#@qdd-TkI*S6iN{ z=edPv7kY=dB)KHKjRC!}{Cz2r;?JAEvw`Qe5rLHqzU{ONPx(Sj_u=tE;?)JvQ0SZF zS@m=F-88qw7RP(ed6xd2HvgME{~K}cn|baVdhVNg?i+jVJM~1D@J%)BYeeY#TId@& z-#6$)m-H62RMn`-Vm@x=GZGuQ{kknRnT?P)TC$17{q@gAoxMD;N$F!LMs(-+~> z7wOX%@zWRib0+KyUFcgf-#6-{2H}%F>`PVX+w!lGZRppJ{2qaa9>TX3(>(ar6GdAL z?{Q)LiGm)ogGoUjlTJ)iu8D+eL(zk3Yp3X-dN+$as~gdek~%H^8U@Ki2Yy*8+Ayx? z(ZhLFRfOvdDD;`!7B?_@<>NV90;?ObR@uXlHbt(BylqxidNm9knk`QwS-xHUPtlcFAN$j@pE~w@czw0S~T;a(T4WGMd#f&9D z8~flGmHAhmvOsSPs^jRe^anX+pLJ|6182xc5xkuBlSg zyWX?Is$B%7cFjKm=SYwz*4O0El6?HGsld7m{XL?+LAY!&Ya5V{)lum)ze%&3*_ zh^XHXTD!GA@=SF#kJ=KkmhQ8~_vFU%bl=%1K6=RZ-{!F>Dnz4v47K!qMcC3eg5w#n z^_o%f$ZBmnbFDR9pn$0gYj6WMy_JEg!mMaQTePeiYztxMq-a!WG`n0ay3Fr=vIBG7 z30)2YTqkZ+Y{acPhrL*f{*rmJBDXoIm1o`7H+=lQ)E7J_JHhkk;hXg?U549pxx^c6 zddFajVKBn$C%a^5zVqR{)@*#Alj%r!@>%anf7Rr*GGm8)6}$z88M-^Rmj1l)4$=Ke zf$0M!{NVlDhA~`WIwv#$fGp;}aWldHd!G8&(I<6CH>D-iuj?tJt;qvpKqfu`1Fd{1 zGCvBjUJz7>+yac)!bSz!?#WIPL9+Wj8W6eMW~wR;`8t~>4RcWR#a~z;=fP+dW>p=| zf>rq{RhrtoiP`riyV6W^SQ9Cmt}_lZ+|QYgGe1+f?xvbO0i*_xp{5=6ai&#ou)*o< z2*EAy2<-CwBT%$1{DCdCTS0mbcNOsH9CsbG`XW{DZa9avhZ?r;FD&q?cX#1sBKw=% z)k1iwUXYo!Mg~0aSa0mO;n^6@qqsW4LZV={CL1&}*&$Y_T9f>A@K|qa(?T}X_BXN$ zH*lfea8~#H(Os!lsq`$PhcrQzblEFKu>>_(%0)pPj)fzOCP1{9O@FXWKTlbvaq8;5 zWDcz(Rk0QZZCGX)#_6?o@e}mSL5Lb^us8ET4>|kQC%-Oaq?fQYzZ|jBhM!#anMEF0 z(1!#^Jz(XGj*_Xs|_PP2IQ6AD7lUQH$tGfa*PmJ1n3)jkqC zS>BdT2Wt7n0|uVv$wi=DMluCx=Q0Tv;&Jk8t{0AYM2eY8iVCd&MTu}(UFAcdXu5Aa zsx{0N3#T4oh*>fkXoQ-}0J?rVGt#25q1wfjRSoJbqC=#$A45iB+O4mFVbTj=fu;(h zQcM{!wln{{d&lg>pKpT5@hL`INX^Ub`JF~+o`)iv_siRY0VfidG z$kAWFi*jqJJYjMAgv$>7?BvG^hbVEH)bCL zq%o)Q>i70fowU1`rfNYw^cy}vaO9BsN99mBk0l6K_; zM2k?PozndXNI5qT^$Hj5-ijcsx?Fd8kdr04dEApAX!J`rxyC$v_mPD`6mV1FuLmWdmz*h3Z)A zkN+SZxWh}r;wx>_(8u_tmaq@Ne zc^#hK_OAq0s@p+cs@q{NC`6(8{{8n~@;yp42{*vDDE(D<{2^6eL&EUBQ~#=p3~|>O zAzrUIRK&+0+Ed|)?W=MJrKQRpR;J1wWv0p<`2nM+a7(0zoX%4GQgUe0U1*4*r+SMm z?U!TrF^ogCJ8X+)cYA5mU394Lu0G=Bu5WN}@F+FXcN-9iaGMYrr#VYb!wAy&&P=t;c- z2~RzF63iv#GAFYnDIHPI_L=-4Et?@Y=myM#pTQj9c`!0~hTsyrlN}#3VSLlG{qDN9IefLaadiAJfZE#-d1lniW9Jx%WZj_wKPWn@Fhn(!#1bOnH$ z+XhP*Dws-Vu9d*nR8NaN?6<=vybcWnUro| zLoSWUyk%HNO_YmYGy7Zj|HynPUOuGIGg^j{Q#ajpGJP`S1NW{BJ70cOZN zQ=oHXzc69FX$JUUy>SP|wD&o|@(cp9pmMDOPLaF|!E+I~XDXBnZpDK+BWZ|#6&&w? zo^L0{ z)+x*$tfNgvv_ZP^tgHxVz8NqF$0pP|kf%}>)>l*U^jaEg$V&G=!DR9P44~x@Xh~Xj zn!}DGgl&Cu8rudl^@<54Nde7`eYr~lk* zKm~h?#&0PpLdg$2*S53#+!3!|bkDoT!gCDwRgo}HV|ke=>+5L@^~6=sRBJ;sk=51DOMkOVEu1Y??&zFUK{7EhSDkE3++&gq`x!SZ7ZW#AK zmMRm);`Z5VmnERox8&eKDfEyY9|}C5`aaRR z&)+VgyM5;09y2cclPBOS)n$?>NwRiSGqe&c28UN6%@j}LZy46rgFCv7EJr(RwD&jC zJ7Wz=b?Neh3c12z7eb_wMo+@`Er;trIc!IhwxdlsK+fiejluAQr!1d-1aiGJl_&8- z&Ka>jZ1)Y?zGh|~JKbW@_2cVMkkFyS>kx?@C@IEHjR>|YsT@!-f~!Yaw2NhjyA*=2 zLG!OhnXD72?Rz%B;EZgvi)M?{FSeYar2&)L;j=~{?jy1qM6CyN4&klQw9i63*{{(M z_W2r;b_L^%y4d;Tiuy=Q=#NF$iRp*f9eICF#(>_T1C!cdySB+tJ9IgY;SZAKVbi?TP{-3m3cOWO zC)kG>I<(t4`4bS}3AMTBLtQ7y9*fQ73lmLI%zyIyB>p0skNblwazZ)k08#dMKrT35 zzEv+_pE&A~M|Lu(#Cy~FWG<~Q@XohQ0FC@xK{^&95G)?w_;B6sW_Hs zzaeTo`J}`hNn$r!N1c$G{DEt!!_6X1z)SF*HliYh@fAs|b?%^QnFETfPPF|PdCB@o zhI1i&Bxgvqw?v{H>&YCLZI1=U*R9k=0b6;Ceomf@J&)F5njoHw0j1e}7HzR6T&LFT za<=tjFOD4Rl&KQY>Vb9MSN#n$3S#kVQM7CrH7IcEb8&{%*8(Qt?|O3A8xx5K^ad~3 zC(z3*FugG4njPm~7-TO6Dc=?+RXwJ4;l0S%>oFkv6CzMwRInr%TYe$84i?Z=mzS?g zhp3;A#p`kU8_>PNwDOkAWS^Ys4{};(+QVzQWLu z;Tp#!xob<4Q`Z}&j|pL})~#B>&wmDjswr(Ap&#fhFFp!rcmX`}k{Y&TjA1 zJ~+>h{RYS|{9pLX(8pYC=P2vN4%05mOh)au`_P~2Mj&YtQUz3h6fmH#$V~FVj)Cbt zT`907kvVGHsPTtK4^R^6$WL#ASZ6TQ* zEe|Eek4>W!;UTd?jEHOps6~0s z#vc46=H~zUQ|8>kt$0CDnUt}#gYmev z2tsB~*E>C_wowL|f~&-YjnU~!8x$O9PVzL(JX$qf$*Z(35(7^R`od?^#IYzP@+nI$ z$jD?wAb9%0n=O#mXvKMj=yZ;XGAxn#>duyNY8y4Xo5Cbk3NPg>zDo~rT^gZt=%E7Y z$!X0Pl>Wm>7JU`-@iCt7LEb%Fc2f_%SVq7idWy;5+VaSe5&mn|$8+K;#+;EGX$`%1 zAx+=KE2ls5L4`H4)Kru=pb@;w-vbk19G&5 z7N%FfAtwp}0;2IhLC(g+$q8s?LN8=(XJjR8_ZLr?vx)5gyGiojZT=V9*1ukDC?dYg z70}ec3L$~jQ9D|E(oBvb2w$v}Od^U9MHcer*ukG1bZy(<6@6nI<=+n?qY^3VeaY*d zwoQxjA7t5d1Mr z+fk&E8cZ#QS_7eh;y}t!5zeDz>eTqc^fr%?Eqjt7m0A1AP7^iSrLA(V=T3`=!XMkM zxO%9ydg!@h(n9*x6Fu#kp{1NlY$rTJGL3xU%P_)5qm(eAO`J>UaaAXQ_GumiMAAg3 znA=(hwdXg&Mn&5UyrI|4Cz#q^ZqUG{W+R2BR@&|85nlQD)4M)KZs@ujJIS+eGrPV| zT6c*6R6wi0INDL&$O_eHSp~wK+dn5ubzFZ+&obo5tY}|qNJ>nSR5@3K8dJ?6&T*@* zA;!t{G4PTn;O!i5>5SOOR7n_!jj-M`$>h%ZZvxNx&VuIK(^}TVmuPL%?yF5AklWC= zm0D=5pT36>QY|`Lhk68U1t~G>43x|tht9+BG0s3`SRBB$xQwk#A8PsCZiIgY$MVi8 zxFVQR0xDxF4d9_Qr7PR7rTu`pu4s<~|B$jkvoSYwzx&9VW>AzbJ2NZKf)!5A%%+8a zn_a9YZ+ic-=v#i>ib{IGM6tD98Cl{IO6NF<_ai^Rf|sFGUkda_q7=dFSac8D^q;Eju=6>E)A!py_*_Rul)ICve zNV8rzI6wbqI)SU=2bh9SZ|0*QC)mY4FkBOqfTiV_{3y9D%O`t$41a+xiC#dO1bJ@X zIA`I0qtF1s4^?wQ)f^IHEIdzy2U^Mm0yAX;T-f@ROyTgESAA9hK6DWAWEOEkQWz02 z&=_njs0D$St5Kz}_DbvP40&e<~+5Tx3kdJR~_mj>M zix~0|$*4a=H+v$ld~r3v%h&kyK68ly38JD!M?Ts$7VlttZL_oSyY$9})8NdBd!}TC z%tHF04Yp#{pgmpPYWQr2+6jWvTOo#;x-Id0Y&=bI1+y=d@8C!;cWvvlD2gqDRy~3M zhZWMKd6!yK8Le3^!w0+V{aOCx2{Ld_L|O$?%T|8=qOSfy<`TSW|lP`)ku z)iG_laQQefTdJpexKTt5qUay#A6fDz{|o!$_VVH3@V$x;YECo&l%VICGs5Hi`CU>| zKrml58XyBe>>uw3kYr$L{LyCyu-F(B_zeL((0_px=l}epzeTTX3$%AKxBI)jOjkix z9+VL=hp7IpB;32a4}|V|!2M2a87wHXKD!&Om4{B)h1?hCOAt>bAK)3*S(YQjA)ffPJIU$2CMQ16)0L=4kz+H6D zoWeXcxN8_LfDDFwx*TpUky0LuOQj>1A*XDdqYDG{Q{^>ar2TD-k_krDd`V~^y)szT zQE!lN{+QQrzWm`wKvy1 zQjs;WBlAVY?0&qtltWug|3N8Jx(g)WqC-Y_z-i!tDeVAsPK}(V_DoWn+*Q9{YARxN`s$gV*j%Fr*2#4f9_0{;l;_x3u*OE9Vhbo9T+K0WG zW1=bg4g>lP8=;*{u8`YgWFcLE!O^N!yH)mv-w}+dm^ZT?fd2^q5#)i14+HnSzqEj#*4S5Ju*quv%$jYg4LvqJGLZ`H* zL^5Q2lj)&*4x7A+5FW}oUv>@Iz>o{`oUcCSy@IB;+2UuTQg_^1Polk2VP`Mv%Ha6P zn}vd%L!(@46Z{x?ag4d4paEQ6^#UX7=2b4gE!hkDrlI@rxIGsMs=oUSh`N|v+2)WGLKtfQXsV2_h9 z3&l*#hSg{VD@R`uRb=Y(Ea;62r-Bs5fKepr{*w2e{r&Dse4V*6vFF_Tc!84-&)}wh zTnO3duMT9}@1J9T9Yq~ij&9&T3bn0jY1!rm@TEjL#6BoJrKId}Kx)Yt;E~zGQZz|! zn@WwBGU!%Xr4P_}froVj43XU==hl#$h5MfPnLS1&^7E%#kJmY#!ZQ=mB%7f-B(3c; zhnldYD;_-XjrxK9BVH{0+guobV@2wB$fWrH4_^KeBQ?rXj!ROAyu=$w@Gu;o2EiRs zKtJJPA?oY~n*mh7aU+Q+(J#qX_n}ZJNhcJ%KkfBn)CYj83RG%*|MUv+xC@ShugZho z-6`J6I6M+)Sdej@d%k2Q*Ou$&@eJta%f1SU;RUZA*3)|jy6MyZJOZJI+~6Hv1?t6W za99Ed2N?re8Z1dBxlwjtf+RdAxlbXb1a#2OWQ$ZFlG>D06!yCX<{0_!mr#t8OKWq# z^by5ZiQw<(={^X%G&C@j9cprpJ$+s&Ckvux`nh2T;dI_Duke;)4rElQxHA>%NS_w3 z@aIJfrK$yEl5F2}Zb7GQ57>ixHSR^~SPM^HE5z)ArIIw(?NG&9TXFu{TtAvxAP!oF9i*FD5(VWaNO~-OKsC|F_!Gf zAP&3Bra1+?wg{|3H`|e=wBRf`D)R3PIxK1%)ZK`qPIAL8v6tE*+WMO?K>=^)Gh=u-VKDoV_(^@WA+-+738HmTflk2s+q&c`oby| zHBRI4pV1l;^;{*hyu%frFRY)@-~jd6#&Gq8&D!@5N#ex9sgNihn^Ci+q)=vOi~zHH z#_2FFx0>0hh37!qwe=&pLl$9U#Ef;qk`UYVWC{P)Ox zeUxpSK+h^^>sf=%WpN6o%BffbSl+>YwZ@M?hmFB?_0XpJ7@23r`$BE6NNd}uPU1N z&XR2P+I4glaM<((W3Id~dw)3Es2+$(k3T^NNU^L3q{Dn_w=mS#R{ZyC2r4u#_*jL2>6V_ z;hcW32s_;mkTm7^4*6YN(KQb@$pH*9^w!<2<;C^U>!s#?EU)hkejj;N8gocm6nB&- z%8EwMw4pyhUCJG;u0g}NVYv6gddI*aY2*TZw_c&Cp2nU+$)WB79Pg8Zc7Aej#689h zITab?$PcOnRO+?8l*i(Wsr)0h#PHcU z-jvqLcL$vqP>gpHtX&fRzAO7vCkMbEDj^1-0cMRPkR<6Id{5Zjy*Tq zU5A?=eej^_A5Mw^#E?+MG393?6yMMeEt;%u?bLaVE$>oHTw~1DC(HV8rG8q8-LzYm zl{9ChQZ!`b4g!35N6(HD#WN-dtEOMgWl=473tST3lhOnGp&RiDAfxV^og6U+Gj>A{ zrmcxjWiqzLxs^j~()$#)`y~^}6$mo=MG#20i*mJ9-h3i=##ltroxQQ;_gV65uy{ms z)(urcTQSw;w4DO>QRAGlbXd(EwM@>#2p zyD3y~@eR4ft9~UucH*x8m2pqF`h}Nd_#=SK& zUa@#ayh_%P27ei&ui%llKzeVnqPOTn->Syg(znmmPWMLD(cb~lW5ZDig+T-}=8w6W z%#d_+_XC|iax(ZEbHdHuO>yW>0#i=y95UscGG}cW!Fq!~uxw%uj>9r+=#M4|HZVy} zeX*t937MZlreROR=wB&_H~OQr^hT13rBRO_?@%NEOh2p+uOQ!l2kI8TeZ0!QWkW@`)0n)F(952J3*7tVjYX3=|1c5*rC`+%tt$8g5fJ>V>`H z2r|$Jgi$lUF>Gdn8w%AQD8B_Dy zfzLFRdtQ~Db$kem8d66<>?uHo0KTK&l`I7)MC;5v68_U&@J&}>LEn91-`Ccuo=n{i z|A^(*LwC9MNd}em%~)OLj_xcn<2ic%YWW+@vAz)?ITtFTliIEWU8nmQSM0rF2ty zziy( zHs)4B!F!wOS4-2Q>S0pG>z+p31Q!yyb@&nJkSZSPt)$7Vqz2#>Olfn;C+1T;8-B%7 z3Ztt_I1|9tZGamqvQ0C|i8qVgwC1DB#cJ_E>Cs?Z2(d-s9cQ9>=e7OTWJSFY1A!T0 ze8@(&=x%I?7AMOypiF9=p)urwaY-|FfQ2IdPSbAK1e5n(&hrg|RLZBY zQoSW|w7K?0z%GI+08EL+wC2Ex!Rj70G(|p_=vFc5<>8Q|-!tA&(-?E2o)3U%OPNjL zgbC`*8jX~wn$pPPTq2VctT*%!S|ZDAsXF-#cI2~EDjPskRx)EQD4cl!A%=5IiM^5y z?6v~N>KJ0ne#Nw9v(a2)yDbReLAUaPJ*sJqP}_>o(C%D^BP;VqVfk8pIL@gg>T<^1 zT*2rN>TESF+T1|t++YEy$D-xMUdUoRwTA?^NgE;ow>7U_srM4BLQ8CmJT-5NG&@tE zEn)nDrf&GmCGC?VOrAAHpgkY@IYD5FA+C^(g#vsehYV~Sv9NZXfXnv}pG__fFiiQK zgVFx>+j9Swz9|4*oc^zXI&t7H%9zo>xH2Y`LmDLIJkC7o`R-jB`|0WGfUfsPae+>U zxnmnL4kH(|)+n9qHfq?kY+02B8?2EeGVCZ;@Jx%FF>#}tW#(+eoOPx*D=?Tof*`!KnvR!Ke#wSzg}Jo^*= z7tA7ke*j>bmM-GgZ-X2C+u*AGdjK%8HMX!d`zIz>_pe)M-nKjii~><@B#~ob>8k3; zawsB&;byg^@v$I!PoUiv>s0N=j?}CCvjGvy?O&7Tm}YyrDr7CZ8F-wpov*W*o#v+B zpWlwi{Y9-y7{GKhyB4>TzWTyoG;m1lezr(Wbf+MWQ*w_sIpZJ+EUlwi;xU>AID2$F~c|%ksO=jGfC*vC(cPjq=I`yF951 zn@zCIpq;wUq!q8rN@d74+H!0s)On-mzfiqq6G7Op{=laG@d9W_G=d5}sI-V$t10?? zaDDeViYTMfX}regI`hsCGx|w3DbvI0y@vtdp3_EtcOoU~iopnnTsO_Ij`$us_lB+- z_w|&$fb0_K?Bg?ow5~r zksf;O?un>NNnH~j*okxHG>2HH-7Q$W;ro4`mW_5GcByc@m2w65f_#1u@;$;zV<%lAG^;&jxHA;aT57g16uA`3@|0IO z^yH(Igx4b6B-59su30`0DJ4}%w)WdPTt+FnX+PR_Jkp|Vc&{XZkUYuE_>{!P8Lq;+ z$$a%VHL)P4K&Ju^c#(dv?*g0Q9x8`8TM6hv)W!xBl8;4GMB=Uxj$Gvkn?k>WGgzu!SwFa>NWL09WYjdf2*rD@(!s>G z^JLA0^)$Jd;K**3ZY_J9JEjg@LZ!0u?kJ32;@cKToeR)0?){A3ePep}I(m0>rygE$ zFE8J%HnYtg#0klLikuE1hr*bFLhCnFN)NL0%akX)h2FA|eK0M}gaDvau{2a{$$Oql;#LIISkrwOM2CmBxE#P1-5 z%cXR!Ek(ee1Nr)gd#Bug>l!3D2#ET>r)!ROW{$u2{<*RVqVhJ~2c?#r2n&8fLu|25 zP)&dgy8RR_Dajg7bhC6lAG>j#zEd;&Q5=C8B7$-hm6_i+;cnJxAyLDJ`Nj2gw!>*| z!|VF;d=4QGq#DQ@hg*Bf5RIdmd~eE$0BM3(b9QEmUZvR%c#^>TZvVrChUj-(6W>Aq z8H?XQB8_Tm>IG0idjcJ5s0wi?S*D9|fM53#ETf_t^zy=!?3w3Z(M}p+;YqGCqad-V3#y}N(T0h_yPyrR zcmXCfKbPSVa0bh+rBw0V3lejyh}xoTRiZUT1ZCym$CHX6`RtI-m-8KUZ6^H5l$7y= z@Fi_dM+9T)_>Sn?;c(ilj~NH+-`x-_e0!^&@W~9;kZ{uMIit4Nt_@_DXgAxVutIk} z_>e=rKBgs0Q={9C`ZC0RuqIVh=2ygJyl~;dTw8#_I)6Cb^Uu$>$fKH^H84s^1QhB5 z2t_Z#nY}>2PWOemh-kx#dSXyOcMD>RtGuEcHD|G}LybDXGc0(>AZ5fh`-|SP(2?9z zH-F1c@mMjM!8~5C-`KGp6l)rlQ98#aBe?1gdg!eCb(C@FT=yILZ;irljd_rhi=+}% zc}iZL1BJ@D+=7+WD{%?ekH@eJJ|(}lu;e3onwvlsk^)ZTt=PJ@9`w zlK&6t?|*U=@Hf)mYPas-gcLt1N=MO9m4_RGTGCKTn3MLxU;Tyi%#E7hkK?Eap~E2l z{x2roO*L?-E0C$=_EZoUv6mknulLGY)@|7JtV1ZHq0sUQ_!{Q)hBQRc)vq)4yyQ_B7k~Bknj} z1OoGE@EW#k@nBR}vH(LSZKGG8Ym0kt0u}oxDL>A7SGSOI$8ZV{zq{!zJzz~I9znI3 zIL$4oUZz;tPBofrrRp_ZX^AhQyF9Kp=;~oiTDqL6WmJWpO|gC@YEmrXy>xGVH@M|2;b*Y@D(B-2;ThV{4IVuG63_7Hk#M_2cI9 zo$|n`M8}2jz?_5Up=(Un&HHSS05fr*SsLD<=*gfGn$(>aWc9t%e0tFmxPx% z^6;KLfsjNxL4-yC0;VHl;tWdzNb?hGR6Gy>m}iZGYRDs)V2d}AXOvinNeB-lj0P2C z5v$Ndj4=vK=jx1>6bX`m9W(cX>8Pz1t>XJa?HzbqK#smfumvMBJsVI9HRK%Ey-tdg z;QMvTNv3G5c&u^CTh^2)VC(Q6i%7J_H`2Us3vYOXuEPhdIO|+twxdT(W9*8ClNofP zqjs2W$BIOoA~&Jukn)i5ZCgBAH6FMk0PG$*qcnElRWL{&i}78W@LjSKlEG=m(y;>u zuL2_zHA-1U`%Iq8%l?eM@zUiWihoDn0iXZf8#8sFqwPO0e$*)GO5^<26ZTroq|z2& z7T*@t0tD;<@D~*tzGWhkYND0RQ%P4tF*0VRCdF4xA7tm4 zZnGV39euug+n~R~SEz_+g6lDlY@*#5Q=w1hCd<9U2DF-1wD<`{y4aF}CseRJ7|z;C zxY2E9rkyRhh4P@vg!o8`y32Tg?_u_)@>^4NlM`~ab+OSLkGxqZma<00TPuTJ6DeaB zV?R-9Ahe!#`^j`mOibzj;?bl#m%bUPkWo62J9*zbmb)10lWBz}O+hM`Ece_(yPi_T zpDrH}v2`j46Y-%%BXd$SiFlYOu*a)t8(Jncfnp}6)7&42$Gom!xEU-TWt$rgDKCiT z2;RV?4z`=)Cj)+16e4ioyOVT1=+n)-&?58kcCuC*Mz8!@khUk(+ecH#m+Usp@GoW1g;Hl2qM)KN4MXSlR!(PQ zt5x(Yr)QMg5$fZ!zLM*UW}m)2G^llFj!W}~$YZ1_7{x})yHR}lqc%1^aGXW?+j{DO z{|mGD{zqi|6XW^!kR@$53)(>csz8k8N*kodPqHkS`2Fe0sMbpTzc`%3T&G>d9s?QQ zNx$4zM3B9M_$4vsZqyDZ$1tvh@vd?1bxdcx{XF`i4q~N2J2dDboQk*2(*13}HHaJD z67UnH!nj*dsHUSwm*0TG)wc1=-#43JW)M6?a#jtb3n-@UT(nLb{UpvbqdhZqY=zfU#bYcEvK0L8Y| zZ9VyDeI@6w3jp{zb3K_b=b|{zwl_u=k98KHA=V=vYg;Rdntyrm(fPQ=V;yav^Sp%s zZ6)`}I6XE=;p)6qp;v`BRJ`SRFU7BOQb~R|Cw&Y$#c<_YmWr-8dGcun3vqY$+V?m0 z*K~D;kVL}TAP8ZvyIT{R>`p@VJ)mPP1JA3I&}LFUGcV6fbYJH7Q{Cg`KEAM1;)Z%w zhgCice=d9C+`XpVlLp6j&at&0s)+s?uSVNER(uT9F%p zO5MiiZ5VKc3C&YfxXC(PHT&Wf#O zG<_P*PSM18&Vl*NMcD>DnoFpb2{%AvbD41}j<(MEY`fw8hF9kZL(=4Apy`>YaNEyF zrL7gXge1sPLJv8L8U;NSX@?XHRjm12_j}yW(n^U9sO(Ns-#BHpv@)xz8BDW_c{(M< zj}MER?*?a4+kwW%bm~9CTJycT8x#jw&8%~Mx<()6-R!YDDQ#?3goLp)NtP3@Mef^8 zINn41j*tKb41uCFoIUPfQyK+D&N`U`Gu^2yHVGJ1fyGDZwJ$ylGVe>!ukU2~tly^`=q2FropxWw(MgCR&m6a%>C-Jm&D0&lksM(%UJ!+e)? zcj8lx_dOc^QTr@RfE$Azu%|c}&y(dHt(W5U3;)2L@A){E4+l}#qfV*Aq-pf?5vgY} zPo2=3R6})0w43h10RR2~_Ajsj@(TV3_IAiesjeRRfPRQ84k3BwKy%U_nN6`xxlKWA z(jK8r$xYEs*-c^3l;*U1Y>O}FE{izDZ&2@ll(V_9y;krcKtRe7|AnU0|5T(utvlo2 zyhrM~)~Kqe@3vi+%}ZBbY$!`;b@PR^wNm+?C`$ya7BT#8rvrvX%iK%3D~$q1`LK|WY_T??<)_Ah+r-3a4t3Gq zVxnS%Mfze$Mgn5cM|@Z%(Slee(V5YXqi;-9ST0zqXES1Wp(L2dGFY(lIU&GNvyO&# z=!tX$Z6OV@&+zulL_n3n^k8AoYqFX7OVfbq%uT&d>Qz_@;CI}t!aK|3w{RxDRi6eLJHOPB26pPXr{tqKC_&$r6XE&Fj9ot2@> zQ|%<+LXz{pT|@%o3IJgcGF_efOnAkqSJ^s*k|UoQcO zo5iDt2r(@u$flM=L$jPfODTKmFUcT{^DbD#${OFIMv>w|o>*iZtj)xm zf_15Q^#k1NQKv|FP6vRv3HB=a+$Fc%9uuWx#%-2hg}FD1OP5@3-`B@Tc=Eob^9o1S zmT{SiYiUO&&NQwF++oP9HSoS|ShAiYe&^=Q;q_6sJmQ>PzL#s`?N8J;ohQ;woLjW; zQo@<>Xej&9LHb6&Uc0%fkvL>%=3;roG5SsbkN4TGiDpR(ep~YmB!HV+#>P)J>6h?O zr&I*TdCk0F+9uRev1eji?fubCg@)MTBL=6XGR_F2DWo5Mw?7=HYLdD{S8bJ`XxY-Z z+LqYcxB8k42%A>PDEzI$qk7WnbC$yXNVO3SV=s%P`JF<~t4}Llr$UcEt9(gum3n|i z^Z5il4OVRn7Xwiovop{LdV`XDrTXX^8M6W328hjn7{IM6J;m!K2(!*EQ>zS8228%_ z6(uW4zNv63nB|*Hs}-%_sA5$TVeYhh>^H37ZaoKslznr)Nh!d~GC(L#q>spDXsCNYJn&q&96dqzEJ;8M5<(vk%e6a%)9%mifMo{+wIdF6`%dlA9qaT9 z@8$@>+rRG?$#x#*HAwzDJs%pKH`$%NAnGBkVj%s9w>RlG2gzUGTQp)F8n96eiF?ty z99T0c*A$|8QLTtq6-@zT#S6jCRD?N_5~nDOC&Bm1LY=ws?@|)%*AhY`#ofUwDe>P> z>=a^0f25U=RhI!~QFhEnAtrwjEd<1@i$M3_KHRcvjXUE@@!*WmHbW`y-=c0m_@Q7S zYdM|9<8TQcc}28|LfEC;Rh4&fn9#pr<`if$25~pUH)F*Kp;{BM$BpdJkm9sDuBF5o z-Ky}r-AKAkBlPq@TuIt3u~o|-*gUU}6{+Q%MINGC$5>vJ>x#}7hJG-5rg5Xu+(DsB z9-&Jj)dQd)BLf4LFLvB>tDAspQ8%UspN|WMd6y)q%F_LQof^GA@qUp9(OZbS#VnFO zyRjnAa~)7pQ9|C$(=YAVp;TTez02CHbTMhKhh$X4xLl6yStG65$fFbWdx_bJgFate zr8||}hn8o5Sy1~p!{ilmoqGcQEXmnUCp_`%N{gs}Vc7Kg87!Do6P>Cwqpm&s`POv~ z1u0-&NO_rzCm*jAoofxB5H7P2Xh@>y_{Y^PI$3_O@9(G=1pHqZcKgo`P0mit!o=G6 z|C%xLcOHg;o+^6no(4Y9>TjJAWrzd^RoXB(L?n5%G%vSBxTV|3E$Va2{}ebZk_Y#k z6>ZiQvn=FIVC#CC&FM7j*30SSD(C0(1Yz)LuFFAs$Og}ip>}9kq+Iq}dlV%eqs&En zSaK{26Bl6GJbi^>Y`%p`w_+7juLKtIHC!9sttz#~`&`W_BvHK$cf;OT!OC4tl&kQv z#|bYkEyQj`6!Cjyy&ikX)!k73*9sleIKqa56mVfb!A`?2#XXF7x;?jXCYA3}+Z#u{ zfKyr{p%vqPhWaZT$%AC}y|m$i#M~)^V_o%MIPeIdg820GBj%MT>|^B)16XAUTd9og>R_3f$kVKfa{?2o zH9(Y6t7H1o$r)Ug%czIhhd^?2=nKSGpv5@0yMGvj%Sd5piG8E>J`%o_2IF@yPPi(F zT*DcGFS(4??`efh(RqxM+_B}3V`@4PY;hw~#)cAVA(LrXhvzc6zce?owSJiqVoPzUt+UW;wXz!%XasE*&Z?q>08aw-f7%o@(K=!vWA+fR zHHAUnFJ2+?MfdXQ5N^nCiaQg^F>x~wH`j%u9W}W!GP*_of<|^_l+?Nd({*i#V!6WH z`3ddGC;TD8$OxF{2qlTxgT6&g`V{~;NB1?1uQo-&5yp&hG@E#_943geYL|mz+zyYo zH4HA6v+8l~fh#)wV_YKv<{@41Z@U2Z`G3)3`6tYkoq>-3w0A3!TmH9o82j+rCk!Xr ze^E@=$QP?qppFi~Mj^sPiGCZbsWc`yVhG6IR2*TEoK7eQ%ogoXP3wc6C$GpTlpRi9O)U2$|UTCh<9f+@zlE)R#3H>hb zA)KI8{*6rCY&*?#2O|ln4FOPoh<_=tw<3aamtN-e#cFmLkFRmh{r-sd8=fzgE2Y;Q zQesjNR}$Q(O3>>1UQ$l#zvRl?wz2wY{N(AGH5N?_(5UiNPI51-&bhek<=Xd9E3G#h zipLaQ$;RVtBjU$_A|a$w)Lwv$&R7a}3Rx?Z&*yA(ztH9e#U|5vhJN1k%(GIB<-6@<)CV7MWDmgFB8vso2*41E<(9F3B+(|Selx0JyigW%N;cZaa21|?? zMakxfNgjH8r>|k9s}WRfX4v!EPn9nLcm_+qY+5~HRpqwb^A5b!@Qfkc&}&C%fU>+~ z5jzT|v1O0C=l)~HS^33}z~AdM*neU2=|2(q-leixyHj~Qo)MaGlo z0M~Ul_lcKzZtJ+N&+p}PKO6^T_87Tj_E2hUVL%q;up$$K)qZNg7Q|P;Hfz0s!9qXp zXKA7PCDhi2q{3aJg)Ou^axOk;Acdh%?NLQ6y|Z`45jCF7kUgWZ?|6+1K3Mf&6dgC9 zQm=eqx{K~n9Ty#pXP%+{pk`ycL9LJW$I$#w9Xv1W&^zvFH~Gt$jZ_HQx`H`)nCZIj ztXl^xKSY9h8(TV6HjAZGM*2@_?!DpEVWwNW=UN^0;=P7nncUWMhsd!(ov;%{yAB)c zuTjiTXBK~iG^$T=y6!XtS?)|-CAm&9l3u>Rt5ukiIeJ-u06quVZH?dZF@WKXWNyMsEcwfwK0H>@QpPyfdlA~s0D`= z6Q)OuCY)Ccl|=UGyr!^i?)Buf0Ayhol2)3O-dN5^QU={>+Cl3iE2$=N=#b^XU;FW+ zDG*Imww$LCLi_(cHorR8KS13*&X4 zFjcVF!k$;_96YJ8^LmOeXYN$x2BX&ML5%vY*n)zi`5P(=RY?-gK?Q8|dT61n2_vBq ziqRGtS7hj9n@zHa9T5&P^98b(MTUhiTf?79WqF3+B0FnQb=hy>$ym29P1!pxRdH>u z@xC+3&b-nqy@P$LW-4Rlx%{S=GpW@}o!L39>uZFz$lz|6W6SKp^w3F-L4=yb#4C~- z5!pghCIT9&LQ!q?m zkv|jwQ88nfX}Vjsi#;<^E^DGEG^O*5)_|dOP30qx1cynuNRc=^y??R#MpmmX*GtW4N;2QCFl<=b;1RkU(bBtzv?oh`rorpiO4vvn z-b-fKTJhl`QU~K88_^zukOHL}lCDT(dlZWdEJt)p4(FVvMv_D`RE%if`jntVcukE2 zi#NSdCUl$ZM;=s&fY@x_(((b{LAP2;W&xmKK@YwHm7L84W(K6zJB@J_(5NK$iyA z-eWn6Yb_LK9`Z51tp7kJ3SafBsl6|urEF=xP*SQ;s$fuAoAle*tnQ@R*s?sg-;eB! zM$dd9^eGy%YmcFk!6~Z8Z1v+#KiKEr4J<&EbVPlu&0cbqZ~w%0USxbW$3P<@HNiYi z-eK%Cj4LFTuID#Aj>kz{KVf>f&onx|`2`wt3`~JRaoAX?8+8w)!mEDEeSA#|MLEw% zt-{XPagKowKfx2E>qV_zh;pgH9}5+#XpyC2#^@dIA4U5pfC2GW4rB4@f6=z~---6` zJtY$(6ARb>Gr~KT(RNS(QS`(A=(h?tz8#U zkBx&~dT(%LKnCj^rHD2_)+^SnTbBk_&;6?h{Lqoh6m>?du7h=-#_crk783Z)x(kn- zrs;X1KNi}i<5PkDeIV5!aj42u<7-mpyjsN4yuK0?dxt@nYyCLlTo+qP}nwyjR5lT_HTU9oN3wrxA1Yw~cV_C43na=VDmEQ)dCqPd>#Q6>R34a-oHY>x48r6SqOGiX9`vNt@iAgp1O2XsT*;QqPEN zU5u2lIgpGid!JukpK5OQY~owe)Z17uH-6iB*`6dfhXf4XOmw>4@Vw+aO?_m8Fk^`-Xur^jiM&T|LQkhk7%%hGv!NEco6rIabh4Cme988PPUAXUpuZc3mr6E6p2AiX*^23|aY zhx!ofhkW0R2Kz1tL{A)9AO%s6W*umc%B>!Tg0}!(kJ_ytMqn=yMX3;sIm08==dfvz zywXt{Xv~{(2V>mEA<}t8dk5#~o~DD?kE}Wcl3Yw~Ex31!9ZTM5#X#}A<}s}Ea>UmT zus_mPUZuVTLU}D=%@ANDRR%~}UT5*)%RsG~Mr%3c4b(GuoT_z80e!mUS`y^@#cXke zc!+YmQGH7`Em=i}quR;^XU)OcXvcjl4^Tz5uHMbPAY|%C8$eBiAzbxb2br&*Tb@A- zs`lO;r^9@+?b4q(o*K`sS`e$(4VY!Ryb#m%5%^_>-F0ke2fbsY3qi8l;DQyHQpwR- zP!B$MgST~R=Jugk|4c1gy-SBl7GTX%zerFhp_AFcEeS6f@Rx4dVxx?I@%hn4z#HZO zQT`vx^A={PMq?=tJ1g!+g?#KkoV-uY+~SF$GE4ITX#KXoI!I^tcBHCHpFhxv|6P( z3w^PDQZ_w&0F&$z$?`vZgA&qQTB+fD3nvbeAkKbgTM*qkV^j^5}`{BiOyTk*g+R=r7)E5@nBNn*NEr9 z58ox!*ftodB)RY}WbO+x=3M4g; zhDn8}GFX2oYF*7GV-H}W<;E3enhN1ONI$+5u>xhM#Nw)P|M=3U*3^^0!X?yEynYqh z(bK%D>+WdW8e#njd-3+h>83k|^Afg>!I^a43-I6VSLrm;Ki~+Y=6E>( z(-go`;uqbWRP!HeT%{U_1o2=(p5<%&k#q_+&GvNfaJ5ZrwBl$)PqI~)dLr+on#TKXi&xVDVUJ#o_Z7$5bbPpWhnTl#Y)%)9xX zg3T~N_7K&q=*WfC2$Tj}C0W5HI0Fu1novYPM2x`X9`LG>B}%G*S!BoRqg<$|&z}$5 zBgxgz2he;qw@;-;DPmNitXRWk`7YihSoYnP0ZaRwYg3Scd&_x3byyUm#_;+Vuy*5g zaqFJ;ARV*J-RWX6{YrAs!619<5479&;@+Pof!~w|!Bf+yY00r$NGW01zq?!Qii9rl zMm>1PA7)T9TXC<%B`V5YbJvJ~IbDJ3bn>}lXCF(Y4ZCZx>3FLok91V4d>@lhlBqYY zOY$yCp#RO$>*%eZs5AcFLGf6Op5rNtWfG+FC;TkGNnAhOqw~V+6wtDD>7%2z7KLO3 z!(namPBua;a`B^vNY%JK%U)8S*;z6MeYFHcx9Z@@p#t-CIg`sZVMK3@{m^o7V>=C8 zt=weN=NvL7NggpXpdaIm^CMX78lUwLBSUAc2&c~3a2LmShrj0R^+DXhqF&F&B%$qW zM6v$hXM~lv5v?_s9%J(+M#Y+KfS9ZItD(4W{4NgEthL9#lYO+|f>hQ)!6 z$vl)#BpqCl_!VW(stI^Q)N5O7P*@TLSI^imqzm9I>D8bMWvjt+?t(-b)Fbk)_8rbYVl3i^ zXO-yPGj82B#%aTOVzD2pj#mw7#-mK}-}xv`L1E#{vhzcr(8|!Xg`+qg^Drs2Luj-` z15@_p>G6JaGsbiyf{&+vTL~KV)qH^TU21BpS27@yutE+3zMzp6{D_)4f z1SQKF+ow`E|6*z4L|xIr4ojv)Y#FNvKPdg{)r+ZbUSmKx$i0q8X1cL0gLRZAp%EKA z(o85Hp5OT^8%92Mgk{cO6Z)}Ffj$v6VeHr~GD%+G`_S^NI2^3CG3y!ne&*1rfpkXr zi3Ibkf^9)YKaF19l%z-9FI&SU5%~!|Pbz*Dc_+LJ7r~(MW_i{ML=#E5OtDBL6Uzw_ z=O9Y~3<(dshto&!98$K*6}8{L?TtoPJAP>UgE>zQcwS2Hrdd#~7GWYvL8YdNWT^~w za+_5b(BGUIP;&wOCrw0Y+@*<|f7gF5l2o7H+z4476W=ypK6u4Qu%z}>07O8$zkPHW zKa9u?EDCf$QK(GX(7D&TQ3krbGdnE_-btfBI2`85A+hlEUNryZpxAH3P|`&mkhZOvVR6RY zA-P87rtI2U#Ss~rM;(->UU!KFU(4iUQK2XovfTmif}^QJugaKG#!7j}e*ED}SrCiU z8o|?=P2W=7)-P)+Zj2t2VLEt*@}C!i`yAyCqY?_ zMeDd*^-8G{t|!jph@n;&h2o!?7PV!{;yb9i$*5@@YduV0%J2+};1!{`$-vkzV9Ixm zk-97B0`VMC;nK7E>(i8p5c%Cj7+<)CJ6dWm(Oa57Y-Et`6s;zq8!)i%AwIMV|AUJh$k@u&mZ;A|)=dF)H=MtJz7rqlgL*B5HYf{W zS5%YbpkCBL72JN+)!lNnw_RZ86Q^G8Q9B(Dgv+)Y{kYbwE~Y@biHt?@$abQ=&W+4k zd%{Jo$PKG~p$?APl;{QX#IPzl;lXlb+d-6mK`Qm@hl>2(LqIgsG!u@V3UAK71@rIn zpG-;5WU+#@t+IWJ5L$2#O##1tcVgyJ3QQh#UkQFSG{L75?;tEyi9n*cxwb z{xjzQ9cxl-8eVLf-fhv2U}U{fJY;7&(;Q-W5VL$(U9r;Eylz`@b&cnJ{`x7hg0;PVEl9q>!l;heaLD|R)ZwX9#R(oDw+8;_XSf>uf( zJsqouoH(QuDhKdmkv0!n-`%44@ZM4+$j%~}-R;!8eT!FT2{*w&Vy-Y& z91@$P(^kIIUZ>xW_*p_L>s@RtGsK!hr>&wg3?~avTcsA0<*m|bH&|J2_G}e7%f5!M zdT-u>eaXyeV58<&h6$+dkcXcy_9%sgkD`)?c)Nh363bJcLkPBHON4NxUgOk1f#mXP zTL?zen)HAmF39CMR#54a10);v&E2@`+ET$n;6QxG)u7aZNmzW5m#avtrmtSus%3s$ zYSXHQkm{Obo*nzFzq<3SWh(z8XtZI8J)W{L7^sWv^|iCDtjgO-V@?g(kbFQ@ndUdc zyy39vlFi710dIvOTVyT)Qd)E`ie(VqEdoDx2{A9bh@_S|8B6fvXaos)JW%Xa&e%KN zJP96zAXOR>A}X;pnoc-RMq2Vl1HJ`BDDIa&OUe$^hSVW)Kw)SMGJ*&qfoS|^4YynP zD#|`d=SAETRQIAYBEFA3RG}?gwF2(2v~j?%XK3+L#cq-1yfx;t0_j8#&?>4ZDQZcx zzt`L_Lc%vWVBfwW!2E+*r+;Fb|7{vAG%57&lp*%on$R+f&H2`N8_1D(c2P~hGFa0B zmBB)7>!&OdoP?$c`YkNrC&DMo6%RyX*1=!S@#$=UAx{{Gnq^}1yV-o-eCen${CYv{ z#o)&ghBc}a1 zlzVTr3GY9_iBZzatXzki@E$~m%}D5-<2c8eiqJqFFo*02EOlSz)f{Pew~eWUsHQ7) zx`v5!pLEhSq?~c?(sx^y-+;BBu!D?gvt7%-wwK=6^VrL<>woYTOMB7vlDPNyE7x2q zrt|&`I#`9ZTTe(aGEbW##HwWP9!1V}IY)nWUQ5{jUfWE%No!OWkx0+S;mG8=qUxTB zqY=-n9%IA1peF!ZwUgjcH`Xf)pApwnu^vBWe`+;YPUlFiuxTe1)t#5OZzdtX$ZPCZW{^eVfja8ZYGDxTb=g68kPrWCt?@1iE#$PZy4X^$lJ?^5 zXzz@6{;~H>+o-n97TYKE%kHoe6 zKK(0E+}1ES@MX$}w1ra&A8xjGg)O&?>g&?)7~ zlx>{;K8)qLi;VgBoL|yzzoR#T(u^#)pFDg0_!3P{uN;df?|CU6&AmkRWSF9v*gl>} zB+pOj4laRoIh3V*(P2SJwg!NVp@YyMxJNemg`Gwu8IDQg*R)b-L6VGNBx&+Re>5gp zCo^uP6NvmjzIU$dQ zCGx9}$fRKTM1H0D=XT?h>CAi1%lpIS$L-0=3&dNKt~Pynqe> z-M+Gm?Q6;%V;E|&ybG>aPFB$x!18D&%mTUOB0Hy8VJ1CN8>0no>u3LR9(ROp?{k?k zne4xU#>^T+*2TC%k7*IFrE_dvmCvM{NWfK-c9!6@W+P#P6^^I_G4d#vgC3_;i)86` zExz6?+pK|4*LD__!tijdG2%JZ`8bbOugwm}y2XVQhVNF-ef&0Hmc#xKTy4iCNMPaz z6`<+MN>xQSzu=;o*IpUeE|1P#N8dB9bAZ--O7A-BO5Y=vCls$E&@sja3S{J(Dc7)K zka|v~lq}-1k6ABVwA{+F$z>6c+nNwJxl0A62wB##Wz$tw*=~`Wr0Th@t~H5ur*|w` zDMD`lL@}{>`u)7{9yD100pX)L9(srSMnox^H=bfSN5mPGI=*JDnd2B`;Ssca1i^&- zpin~`aHKm@q0jFa6N5r>r|s|$u#x7LfAC3Y35@>Q{|kT#Ey5=wt6`>*Q}kkzp(alj@%j93>uXGhO9M=DGCh zehKf$$NA>>BJlpjv{j+XT;vIBC2G4#=Vq35Murby1iH{XeHNcP_i_UC*LqRwTy68{ zUsn_|f}bzVjx2G}2NOSS3%(CE%DL|5kJC4>FV=^=g^jnxIO!r1oh#4z>Xnx)w&^EO zm;%L>w>~Gb>FkfBdVRl>SeI((!323b`^9)UvfRP`Y2Nj5ZAN_uH3@-!DJ}*UWjKlz zUIR_dae*7qTJG%jok0p^deA#!=HyGv2mz4ExYONQB*n+yyKvI{f=(dV)GA=KNUFX|E zF5$M#c^5jt#+S7jWpodOMlRpx!@#C0JknO$i^g8CvjpP?#g z+u3Q$Ol{egBW?AyABU-hH)(JRMQaIKn=Uq~X>VX6)O!C_G^fx;>ZMt_F0^6^BfQ*& z-=cIQ?fUPHtm)K}1(APE*co{a9(JhV;(b21UaE`j+D2lZ5q$@{SUmC~ zA1%w2SaPx@HSH6p4-Y1VvP9ugM6N0m$4ks6x?%@r&@9Q_StyHW)JY3(qMMsd!qswa zfc*jPUhXaiz2~bmBR(aqg|JzNi+}xXy18a)Bo1s|)BodvE_rBSb)WQfPu)e@7``Wb*BPV1A3C3_k zRwC`{R6AfaKSvf(e1^Gxwl2T~Q6m50JGk$eFrR3HLjhZXD#gn$ft`hj^OECyyeKxV zS{fkXaGmVBBzKATN9#h1im|(8Bc3_uYvHeiXMRpi>16PDS4DqK5iZo>P9jdTYO62x zb;_hha%E|2a#}ap>t8-c-O~gMFu;^`^|Tf&8%Il<3Nq7lZ3eK5pRuH8bPd@(;xZ#4 zLoi|TvrRauV#CQYf<`%!O!+aeAN=h8{1o_G3r1+$TObbz8z118OMx^Yf$L{j`9kg0d(SBJKRZC6B6sLA9EJJmg@_%;6=&FO3oe_~(z|fcIkJBh> zj_Z`=wdzK-+mx-N(LH|`&f0giik~_C$-O+&>g!>51; zLhF3@^6oy#@w$F^$W_V(;SL`oTwT@crETrJJa7&~Lfj>03ghOV+(t2s(dD+>YYjyM zy)e~KO7aqHCxDE9O!DeOO8U`CIh!b122XiYNDCB~$h#;cdONdml})xwzN-LjD;q7S zS&@GSwyW1nRd_2-y9Io?t0(tq;Jo8=CA7KEQI&R=l{TZ7s{1qm^<^;&)O)K#fRQDj z>ExRZmhHGpo4qwq-|MwwH!sA;?Np<;GGtNP@;28p;D4smTbus+6C_At{F);?rzXSk ze6pmDUQ8=r7OR6>;`X#1^Qk^1k!qo@5!4HqZ~WgxMZWm#RO0Zfb;Nhj-xopp#IxIL z>Y7f|qZ9%5aA<{1y~0$=!|Wf*d9`_}v~m|XWiqO9Z2sMC%{1_@W63cO`M5c&_Ucrd z^i5@nynarjdh?P*itDFCws>~Rjdd7e;tRtxS1dIHe7>tp}`WHlt*Pa-;YY>5=x$>Dz)S|*bXy_F8c-3)Pz;Zo-~E8 z?4a+O@txl>6DlQ~h$P&lMjuY2@YnJiEO7d9{NV@I-ms6w3_287?*70X-k}P3OHkL; z<*+JhhJo0FHnyZ20tK$Etz-Q%lD2;KNserp|E3%8pFN)|Vsm1z&c5PwhEVEO@kx!7 zuOCqKamHz@e}Enq&~AGlO;?ILNwddN2NOhVFfo~Vj`lu3?b(n0)LdniYzye?RnQZQkv5zP+}6xw>w-(Hm3xJAgbC~7^)zj80kwqRvT^Dbo*5xpf!m$j9`EI0REk!|Y^X6aHF9Z;TJ{@gB$ zx~4LvyshM!uijgxMs5gap1}O4N|Nr}H)sd$!@LB`2fl^i3LrwhLHpdU)4p;!PK;gd zahIDhy9(IBOtY;h#CYF`MEsX^4S@C1Se$Km?`7+ej^nLGph4-fVt^~|`whb+?{u%W z>XH&v@HcTq{oZ!8QACVv`{H^JCxh*kRO150K^XZHjH3(y5v;tsy04k=)Y!Nwp^pTw zc+-L*z(2Y5C2^{cH7;ryI2rcp+Z$ zxLX*kmgdPkuuqy(kdE&k4hZ%TYzm5f{YVJTY(3mHqvu`?p>qDcGghbo%P;9#b;FPE z`0!-}8btTiR@!@qa&C=9>q`;o>+_nk)-+!2a#bFd#0{K^770>I{z#47wqBc-U9~@7 zMAcg((a%#FLJyFUPfACtAD53>9*kaQ)5SXDisFIJqP#$XkB-mrn!y)teeh%6Z1AIQ zbvq`M_nKZ0e&QQK$RhF4&D{!uAfnhT%6TdE6|Q4Erm0U@>etDFYV-(VhIU|~71N8Z z$YYSSw2i9MalhB0e~f2{Kb9}Jy~z7Yd-l)w-IA6~+#Q8*d>EbGr zN~77M0GXBF7$$ESjQe<<;Z7XOXO(Z??0%6(C!;X-ddqfVzbQT|7cmv!cOg{{B#O|E_&zM2zqabw+`t6&>KS3t`$C&ZoArt=%S}8Kn zZB`Yg&b=ogDuU3IPzP5LQOHmiRTbSo=tXp&s<-oOLH$$^v?h&vHTHj&!nv7b#F#h_ zzOy)@oD&yjaifYpm>mjf`_ezm>_IpAETtH96J zGcsFuq?1(GVcB8Y;nT_Vu|@6RG{v_&P59!_7Sk6~YoZ3TlKb9$(t|G28!NtbsslC!8qwd+$lk}1dNYpoP|2SU zy<;2k1u2AVjN@9j+e)t(D-ESxQ-cvT9sX2q)k>O(_al5BfqafaufgElWy=orzCXnR zks`gG9FA)?Dh#q3xFHN808balmEL}l#(LI(9ev5-jJCkL3|~3n9$QO-mI}{5oEAjo zEt@KH8)5SP^_*n#l#7;dMRD|f215^rSL3FfG5cJ_#9&s=^YUem10XxcRx9vu53mip zhI6E`6p`#fgJL37=0i(-tax}_;$Tf!7gMRZM4oDod>1APBaKpYpVg<1%?eJIQUWGp zDaF4Pwtk+|Uo{{W>frLEh;S{i2z&GF1H(;(CCCZ~)X6b8Fl46Cfd$x67z!CjW$wS( z8j%>%qrr7jWgWz!_7~x~m?O!V-sQ(Ef@jv?OKOz!Ur)2R(uq&NBJv>*QcG6zGkoimF zCPnx|!l5u+%rQ)c{5lq{Jx{X{7X)NS>3qgyM*E;{frB+xR6i5Em7$6|y36y+OVT^u zg<8IG)-DQTG>`}a(%@K>u(wsqTsPn~54a8a$ke?QNMQ~blE)7^0~s6CT&mO4ZPR0B ztw`0rGme#C(8yu)p|mB-@L>qq&v1*fDXOJk*_u?Df7ULsd`eg7(``&BxC0yICpF4{ zNt|%^+ys~T{JIkw)R-moKGmb#+v&egfYxltGyYG(Mn&( zV8f)%;l7gWC0XccvnR6KA1gIKf&?Co(@2nUCoaZ+(NG4lU6dXbar;6JhRP{C!6twH znk|F*U1;y3qN6q%_Dkar%T+2c;$)R1zeOISKdx&!LZ!`-x(^20dV@^t#{;&a9o@;lf-2oV!6N?WFa5vABC0J2qYLQG1D1)E8!>3YBiDM{xsWjvYKPMU1T@@1*MYD>u~{ij1^^Z<`g`?^`|@ zMZ`&y2^x)U%>-w)i#ZX;gAZ-L(urB|HwzzDzP@~0A^;PpIZy`ixl91*n zNX`h;SUeYc`blQmy*lIvo`nMx5YPMm7X?v5XF$M&w*OEC)ly-AdYC;LE^#C}(gOi+ zzgJ;%zBYmbP!!mbOL>kf8b}56homq9ek39e6UDCBI{#yB6 z41Ka1WH9E4iyx20qh<-sNwd1{lE47@+;ifpRK@tY5+&dti>ZkZ+<9%PP=xlwV)GR< z{nP;Xg~qf;aT1!d2vq?2gnWLh5>7nb=@KG9f=-_EuzG%*$&@r$i#>D&yjmuH4SO4dX1^I7Wjl*L zW)Jb2()B?#hdY_c;5a&Zks=e*3XPNUdm^|E`DkOSiI8^$$S|I6XdQEjlPH^ZQccpwM)C)>NQaB$;im~jEz8~YDqXA8i9Cf!D zHpA0>@-{MafcDMHr6d|PMGkwUiM0CSP!h+Z@^o}wr67EX)R8qwZ0V?P_(D1azH&_2 zn>YYRz5T@DMNhm^da`h!5qmKkdc4T3p$4& zh0mSe6WDwGuxKqIg={!`CtZE?#n?6;bIo-S|azkk-D#Y{ZlqZX`i}`gW`Y4{DYnYkiu^~h%X0AeU z@vAC&{HM^dmgOz2H;}UJ&9GO6?K#@w#<ⅈ<^5pzMWF;ZUwuz4$`^LyQLr+gmMo1 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 literal 0 HcmV?d00001 diff --git a/mcinabox/src/main/AndroidManifest.xml b/mcinabox/src/main/AndroidManifest.xml index 57af3ed0..92c55b7b 100644 --- a/mcinabox/src/main/AndroidManifest.xml +++ b/mcinabox/src/main/AndroidManifest.xml @@ -20,6 +20,10 @@ + + @@ -29,41 +33,28 @@ - + android:screenOrientation="sensorLandscape" + android:excludeFromRecents="false" + android:launchMode="singleInstance" + android:alwaysRetainTaskState="true"> + android:value="boat" /> - - - - - - - - - + diff --git a/mcinabox/src/main/java/com/aof/mcinabox/DataPathManifest.java b/mcinabox/src/main/java/com/aof/mcinabox/DataPathManifest.java deleted file mode 100644 index 4cfde26f..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/DataPathManifest.java +++ /dev/null @@ -1,3 +0,0 @@ -package com.aof.mcinabox; - -public class DataPathManifest extends com.aof.sharedmodule.Data.DataPathManifest{} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/FileChooser.java b/mcinabox/src/main/java/com/aof/mcinabox/FileChooser.java index 0059bec8..f33a5557 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/FileChooser.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/FileChooser.java @@ -25,9 +25,10 @@ public class FileChooser { // filter on file extension private String extension = null; - public void setExtension(String extension) { + public FileChooser setExtension(String extension) { this.extension = (extension == null) ? null : extension.toLowerCase(); + return this; } // file selection event handling diff --git a/mcinabox/src/main/java/com/aof/mcinabox/MainActivity.java b/mcinabox/src/main/java/com/aof/mcinabox/MainActivity.java index 7e32cbb3..d5cee14e 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/MainActivity.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/MainActivity.java @@ -3,161 +3,88 @@ import androidx.appcompat.app.AppCompatActivity; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; - import android.Manifest; import android.annotation.SuppressLint; -import android.app.Application; import android.content.Intent; import android.content.pm.PackageManager; -import android.net.Uri; import android.os.Bundle; import android.os.Handler; import android.os.Message; import android.util.Log; import android.view.KeyEvent; -import android.view.Menu; -import android.view.MenuItem; -import android.view.View; -import android.view.animation.Animation; -import android.view.animation.AnimationUtils; -import android.widget.Toast; - -import com.aof.mcinabox.launcher.dialogs.CreateUserDialog; -import com.aof.mcinabox.launcher.dialogs.DownloaderDialog; -import com.aof.mcinabox.launcher.dialogs.LanguageDialog; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.launcher.uis.FunctionbarUI; -import com.aof.mcinabox.launcher.uis.GameSettingUI; -import com.aof.mcinabox.launcher.uis.GamedirUI; -import com.aof.mcinabox.launcher.uis.GamelistUI; -import com.aof.mcinabox.launcher.uis.InstallVersionUI; -import com.aof.mcinabox.launcher.uis.LauncherSettingUI; -import com.aof.mcinabox.launcher.uis.MainToolbarUI; -import com.aof.mcinabox.launcher.uis.PluginUI; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.setting.SettingManager; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.lang.LangManager; +import com.aof.mcinabox.launcher.theme.ThemeManager; +import com.aof.mcinabox.launcher.tipper.TipperManager; import com.aof.mcinabox.launcher.uis.BaseUI; -import com.aof.mcinabox.launcher.uis.StartGameUI; -import com.aof.mcinabox.launcher.uis.UserUI; -import com.aof.mcinabox.utils.FileTool; - -import com.google.gson.Gson; - -import java.io.BufferedWriter; +import com.aof.mcinabox.launcher.uis.achieve.UiManager; +import com.aof.utils.FileTool; import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileWriter; import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; import java.util.Timer; import java.util.TimerTask; -import static com.aof.mcinabox.DataPathManifest.*; - public class MainActivity extends AppCompatActivity { public static final int LAUNCHER_IMPT_RTPACK = 127; - - public Animation ShowAnim, HideAnim; - public Timer timer_tipper = new Timer(); - - public PluginUI uiPlugin; - public InstallVersionUI uiInstallVersion; - public GamedirUI uiGamedir; - public GamelistUI uiGamelist; - public GameSettingUI uiGameSetting; - public LauncherSettingUI uiLauncherSetting; - public StartGameUI uiStartGame; - public UserUI uiUser; - public MainToolbarUI uiMainToolbar; - public FunctionbarUI uiFunctionbar; - - public DownloaderDialog dialogDownloader; - public LanguageDialog dialogLanguage; - public CreateUserDialog dialogCreateUser; - - //UIs includes all switchable UIs in MainActivity - public BaseUI[] UIs; - - private static final int REFRESH_DELAY = 1000; //ms - private static final int REFRESH_PERIOD = 1000; //ms - - private SettingJson Setting; + public static MainActivity CURRENT_ACTIVITY; + public Timer mTimer; + public UiManager mUiManager; + public TipperManager mTipperManager; + public SettingManager mSettingManager; + public ThemeManager mThemeManager; + private static final int REFRESH_DELAY = 0; //ms + private static final int REFRESH_PERIOD = 500; //ms + private static final String TAG = "MainActivity"; + public static SettingJson Setting; + private boolean enableSettingChecker = false; @Override protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); setContentView(R.layout.activity_main); - + //静态对象 + CURRENT_ACTIVITY = this; //请求权限 requestPermission(); - //检查目录 - CheckMcinaBoxDir(); - //检查配置文件 - this.Setting = checkLauncherSettingFile(); - //初始化控件 - initUIs(); - //添加无媒体文件标签 - setMCinaBoxNoMedia(); - //删除tmp文件夹 - removeTmpFloder(); - //Life - for(BaseUI ui:UIs){ - ui.onCreate(this.Setting); + //使用语言管理器切换语言 + if(!new LangManager(this).fitSystemLang()){ + return; } - //执行自动刷新 - this.timer_tipper.schedule(TipperTask, REFRESH_DELAY, REFRESH_PERIOD); - } - - private void initUIs() { - ShowAnim = AnimationUtils.loadAnimation(this, R.anim.layout_show); - HideAnim = AnimationUtils.loadAnimation(this, R.anim.layout_hide); - - dialogDownloader = new DownloaderDialog(this, R.layout.dialog_download); - dialogLanguage = new LanguageDialog(this, R.layout.dialog_languages); - dialogCreateUser = new CreateUserDialog(this, R.layout.dialog_createuser); - - uiInstallVersion = new InstallVersionUI(this); - uiPlugin = new PluginUI(this); - uiGamedir = new GamedirUI(this); - uiGamelist = new GamelistUI(this); - uiGameSetting = new GameSettingUI(this); - uiLauncherSetting = new LauncherSettingUI(this); - uiStartGame = new StartGameUI(this); - uiUser = new UserUI(this); - uiMainToolbar = new MainToolbarUI(this); - uiFunctionbar = new FunctionbarUI(this); - - UIs = new BaseUI[]{uiMainToolbar, uiFunctionbar, uiInstallVersion, uiPlugin, uiGamedir, uiGamelist, uiGameSetting, uiLauncherSetting, uiStartGame, uiUser}; - } - - /** - * 【Toolbar 菜单创建】 - **/ - @Override - public boolean onCreateOptionsMenu(Menu menu) { - getMenuInflater().inflate(R.menu.menu, menu); - return true; + //初始化配置管理器 + mSettingManager = new SettingManager(this); + //检查配置文件 + Setting = checkLauncherSettingFile(); + //初始化清单 + AppManifest.initManifest(this,Setting.getGamedir()); } - /** - * 【Toolbar 菜单按键监听】 - **/ @Override - public boolean onOptionsItemSelected(MenuItem item) { - switch (item.getItemId()) { - /*case R.id.toolbar_action1: - //ToolBar菜单的按键监听 - break;*/ - } - return super.onOptionsItemSelected(item); + protected void onStart(){ + super.onStart(); + //初始化主题管理器 + mThemeManager = new ThemeManager(this); + //检查目录 + CheckMcinaBoxDir(); + //初始化消息管理器 + mTipperManager = new TipperManager(this); + //初始化界面管理器 + mUiManager = new UiManager(this,Setting); + //Life Circle + mUiManager.onCreate(); + //执行自动刷新 + this.mTimer = new Timer(); + this.mTimer.schedule(createTimerTask(), REFRESH_DELAY, REFRESH_PERIOD); + //启用检查 + switchSettingChecker(true); + //添加无媒体文件标签 + setMCinaBoxNoMedia(); } /** * 【请求权限】 - * App permission. **/ private void requestPermission() { if (ContextCompat.checkSelfPermission(this, @@ -175,6 +102,7 @@ private void requestPermission() { /** * 【重写返回键】 **/ + @Override public boolean onKeyDown(int keyCode, KeyEvent event) { if (keyCode == KeyEvent.KEYCODE_BACK && event.getAction() == KeyEvent.ACTION_DOWN) { backFromHere(); @@ -185,214 +113,62 @@ public boolean onKeyDown(int keyCode, KeyEvent event) { /** * 【界面切换】 - * Switch to the UI. **/ public void switchUIs(BaseUI ui, String position) { - if (ui.getUIVisiability() != View.VISIBLE) { - hideAllUIs(); - ui.setUIVisiability(View.VISIBLE); - } - - currentUI = ui; - uiMainToolbar.setCurrentPosition(position); - } - - /** - * 【隐藏全部界面】 - * Hide all UIs. - **/ - private void hideAllUIs() { - for (BaseUI ui : UIs) { - if (ui.getUIVisiability() != View.INVISIBLE) { - ui.setUIVisiability(View.INVISIBLE); - } - } + mUiManager.switchUIs(ui, position); } /** * 【设定返回键的执行逻辑和顶部指示器】 - * Back **/ - private BaseUI currentUI; - public void backFromHere() { - if (currentUI == uiStartGame || currentUI == null) { - finish(); - } - - if (currentUI == uiGamedir || - currentUI == uiGamelist || - currentUI == uiLauncherSetting || - currentUI == uiUser || - currentUI == uiPlugin) { - switchUIs(uiStartGame, getString(R.string.title_home)); - } - - if (currentUI == uiGameSetting || - currentUI == uiInstallVersion) { - switchUIs(uiGamelist, getString(R.string.title_gamelist)); - } + mUiManager.backFromHere(); } /** - * 【获取全部页面配置】 + * 【保存启动器配置到配置文件】 **/ - public void getSetting(SettingJson settingJson) { - SettingJson setting = new SettingJson(); - for (BaseUI ui : UIs) { - setting = ui.saveUIConfig(setting); - } - settingJson = setting; + private void saveLauncherSettingToFile(SettingJson settingJson) { + mSettingManager.saveSettingToFile(); } /** - * 【保存启动器配置到配置文件】 - * Save Launcher Setting to file. + * 【检查MCinaBox的目录结构是否正常】 **/ - private SettingJson saveLauncherSettingToFile(SettingJson settingJson) { - getSetting(settingJson); - if (!com.aof.mcinabox.launcher.JsonUtils.saveSettingToFile(settingJson, MCINABOX_FILE_JSON)) { - //TODO:Save Failed. - } - return settingJson; + private void updateSettingFromUis(){ + mUiManager.saveConfigToSetting(); } /** * 【检查MCinaBox的目录结构是否正常】 - * Check floaders. **/ private void CheckMcinaBoxDir() { - for (String path : MCINABOX_ALLPATH) { + for (String path : AppManifest.getAllPath()) { FileTool.checkFilePath(new File(path), true); } } /** * 【检查启动器模板】 - * Check the state of Launcher Setting file. **/ private SettingJson checkLauncherSettingFile() { - File configFile = new File(MCINABOX_FILE_JSON); - Gson gson = new Gson(); - InputStream inputStream; - Reader reader; - SettingJson settingModel = null; - - //检测启动器配置文件是否存在 - if (!configFile.exists()) { - //如果不存在,就创建一个空文件 - try { - configFile.createNewFile(); - Log.e("初始化", "模板不存在,开始创建"); - } catch (IOException e) { - //如果创建失败,就退出程序 - e.printStackTrace(); - Toast.makeText(this, getString(R.string.tips_launcher_new_fail), Toast.LENGTH_SHORT).show(); - Log.e("initLauncher ", e.toString()); - finish(); - } - //初始化模板并写出配置文件 - settingModel = new SettingJson(); - String jsonString = gson.toJson(settingModel); - try { - Log.e("初始化", "开始写入新的模板"); - FileWriter jsonWriter = new FileWriter(configFile); - BufferedWriter out = new BufferedWriter(jsonWriter); - out.write(jsonString); - out.close(); - Log.e("初始化", "写入成功"); - } catch (IOException e) { - e.printStackTrace(); - Toast.makeText(this, getString(R.string.tips_launcher_new_fail), Toast.LENGTH_SHORT).show(); - Log.e("initLauncher ", e.toString()); - finish(); - } - Toast.makeText(this, getString(R.string.tips_launcher_new_success), Toast.LENGTH_SHORT).show(); - } else { - //如果文件存在,就读入配置文件 - try { - inputStream = new FileInputStream(configFile); - reader = new InputStreamReader(inputStream); - settingModel = new Gson().fromJson(reader, SettingJson.class); - Log.e("初始化", "文件存在"); - if (settingModel == null) { - Toast.makeText(this, getString(R.string.tips_launcher_init_fail), Toast.LENGTH_SHORT).show(); - Log.e("initLauncher ", "SettingModel is null"); - finish(); - } - - } catch (FileNotFoundException e) { - e.printStackTrace(); - Toast.makeText(this, getString(R.string.tips_launcher_load_fail), Toast.LENGTH_SHORT).show(); - Log.e("initLauncher ", e.toString()); - finish(); - } - } - Log.e("初始化", "设置载入成功"); - return settingModel; + return mSettingManager.getSettingFromFile(); } /** * 【刷新启动器设置】 - * Refresh launcher. **/ - public void refreshLauncher(SettingJson setting, boolean auto) { - SettingJson mSetting; - if (auto || setting == null) { - mSetting = checkLauncherSettingFile(); - } else { - mSetting = setting; - } - for (BaseUI ui : UIs) { - ui.refreshUI(mSetting); - } - } - - /** - * 【立即获取并保存配置信息】 - **/ - public void quickSave() { - refreshLauncher(Setting, false); - saveLauncherSettingToFile(Setting); + public void refreshLauncher() { + mUiManager.refreshUis(); } - /** - * 【定时器 定时保存并刷新界面】 - * Auto timer task. - **/ - private TimerTask TipperTask = new TimerTask() { - @Override - public void run() { - Message msg = new Message(); - msg.what = 1; - handler.sendMessage(msg); - } - }; - @SuppressLint("HandlerLeak") public Handler handler = new Handler() { public void handleMessage(Message msg) { - - switch (msg.what) { - case 1: - refreshLauncher(Setting, false); - getSetting(Setting); - } - super.handleMessage(msg); - - switch (msg.what) { - case 4: - Toast.makeText(getApplication(), getString(R.string.tips_runtime_notfound), Toast.LENGTH_SHORT).show(); - break; - case 5: - Toast.makeText(getApplication(), getString(R.string.tips_runtime_installing), Toast.LENGTH_SHORT).show(); - break; - case 6: - Toast.makeText(getApplication(), getString(R.string.tips_runtime_install_success), Toast.LENGTH_SHORT).show(); - break; - case 7: - Toast.makeText(getApplication(), getString(R.string.tips_runtime_install_fail) + " " + getString(R.string.tips_runtime_install_fail_exeable), Toast.LENGTH_SHORT).show(); - break; + if (msg.what == 1) { + Log.e("mcinabox", "Updata Setting."); + refreshLauncher(); + updateSettingFromUis(); } super.handleMessage(msg); } @@ -400,11 +176,9 @@ public void handleMessage(Message msg) { /** * 【给Minecraft目录设置无媒体标签】 - * Set no media tag for Minecraft floader. **/ private void setMCinaBoxNoMedia() { - File file = new File(MCINABOX_DATA_PUBLIC + "/.nomedia"); - File file2 = new File(MCINABOX_DATA_PRIVATE + "/.nomedia"); + File file = new File(AppManifest.MINECRAFT_HOME + "/.nomedia"); if (!file.exists()) { try { file.createNewFile(); @@ -412,64 +186,76 @@ private void setMCinaBoxNoMedia() { e.printStackTrace(); } } - if (!file2.exists()) { - try { - file2.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } } /** * 【移除缓存文件夹】 - * Remove temp floder. **/ private void removeTmpFloder() { - FileTool.deleteDir(MCINABOX_TEMP); - FileTool.makeFloder(MCINABOX_TEMP); + FileTool.deleteDir(AppManifest.MCINABOX_TEMP); + FileTool.makeFloder(AppManifest.MCINABOX_TEMP); } - /** - * 【重新启动主页】 - * Restart MainActivity. - **/ - public void restartLauncher() { - Intent intent = new Intent(this, MainActivity.class); - intent.setFlags(Intent.FLAG_ACTIVITY_NEW_TASK | Intent.FLAG_ACTIVITY_CLEAR_TASK); - this.startActivity(intent); + @Override + public void onStop() { + super.onStop(); + mUiManager.onStop(); + saveLauncherSettingToFile(Setting); + // recover Timer Task. + mTimer.cancel(); + // 重新创建缓存文件夹 + removeTmpFloder(); + //首先要关闭SettingManager的自动检查 + switchSettingChecker(false); } @Override - protected void onActivityResult(int requestCode, int resultCode, Intent data) { - switch (requestCode) { - case LAUNCHER_IMPT_RTPACK: - if (resultCode == RESULT_OK) { - - Uri uri = data.getData(); - System.out.println("URI=" + uri.toString()); - String path = uri.getPath(); - System.out.println("PTH=" + path); - //Move the method to LauncherSettingUI. - uiLauncherSetting.installRuntimeFromPath(path); - } - break; - } - super.onActivityResult(requestCode, resultCode, data); + public void onDestroy(){ + super.onDestroy(); + switchSettingChecker(false); } - /** - * 【当Activity停止时】 - **/ @Override - public void onStop() { - super.onStop(); - saveLauncherSettingToFile(this.Setting); - for(BaseUI ui:UIs){ - ui.onStop(); - } + public void onRestart(){ + super.onRestart(); + mUiManager.onRestart(); + // stat Timer Task + this.mTimer = new Timer(); + this.mTimer.schedule(createTimerTask(), REFRESH_DELAY, REFRESH_PERIOD); + //重新启动SettingManager的自动检查 + switchSettingChecker(true); + } + private TimerTask createTimerTask(){ + return new TimerTask() { + @Override + public void run() { + Message msg = new Message(); + msg.what = 1; + handler.sendMessage(msg); + } + }; } -} + public void restarter(){ + //首先要关闭SettingManager的自动检查 + switchSettingChecker(false); + //重启Activity + Intent i = new Intent(this, MainActivity.class); + this.startActivity(i); + + MainActivity.CURRENT_ACTIVITY.finish(); + } + private void switchSettingChecker(boolean enable){ + if(mSettingManager != null){ + if(enable && !enableSettingChecker){ + mSettingManager.startChecking(); + enableSettingChecker = true; + }else if(!enable && enableSettingChecker){ + mSettingManager.stopChecking(); + enableSettingChecker = false; + } + } + } +} \ No newline at end of file diff --git a/mcinabox/src/main/java/com/aof/mcinabox/VirtualKeyBoardActivity.java b/mcinabox/src/main/java/com/aof/mcinabox/VirtualKeyBoardActivity.java deleted file mode 100644 index 6fed6357..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/VirtualKeyBoardActivity.java +++ /dev/null @@ -1,585 +0,0 @@ -package com.aof.mcinabox; - -import androidx.appcompat.app.AppCompatActivity; -import androidx.appcompat.widget.Toolbar; -import androidx.constraintlayout.widget.ConstraintLayout; -import android.content.Context; -import android.graphics.drawable.ColorDrawable; -import android.graphics.drawable.GradientDrawable; -import android.os.Bundle; -import android.view.Gravity; -import android.view.MotionEvent; -import android.view.View; -import android.view.ViewGroup; -import android.view.WindowManager; -import android.widget.AdapterView; -import android.widget.ArrayAdapter; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.EditText; -import android.widget.ImageButton; -import android.widget.SeekBar; -import android.widget.Spinner; -import android.widget.TextView; -import android.widget.Toast; -import com.aof.mcinabox.utils.ColorUtils; -import com.aof.mcinabox.launcher.json.KeyboardJson; -import com.google.gson.Gson; -import com.aof.mcinabox.launcher.keyboard.*; -import com.shixia.colorpickerview.ColorPickerView; -import org.json.JSONArray; -import org.json.JSONException; -import org.json.JSONObject; -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import static com.aof.mcinabox.DataPathManifest.*; - -public class VirtualKeyBoardActivity extends AppCompatActivity { - - ConstraintLayout layout_keyboard; - ArrayList keyboardList,tempKeyboardList; - Button toolbar_button_backhome,button_addKey,button_newModel,button_saveModel,button_loadModel,dialog_button_finish,dialog_button_cancel,dialog_button_load,dialog_button_cancelload,dialog_button_save,dialog_button_cancelsave,dialog_button_cancel_colorpicker,dialog_button_confirm_colorpicker; - Button[] launcherBts; - ImageButton dialog_button_colorpicker; - EditText editText_key_name,editText_key_lx,editText_key_ly,editText_key_sizeW,editText_key_sizeH,editText_model_name,editText_model_color; - CheckBox checkBox_isKeep,checkBox_isHide,checkBox_isMult; - ConfigDialog configDialog,loadDialog,saveDialog,colorPickDialog; - ColorPickerView colorPicker; - SeekBar seekBar_corner; - TextView text_corner_progress; - Spinner key_main_selected,key_special_oneselected,key_special_twoselected,model_selected; - int selectedModelPos; - ArrayList modelNameList; - Toolbar toolbar; - String KeyboardDirPath; - int ColorPickerTemp; - TextView buttonInfo,buttonTip; - - @Override - protected void onCreate(Bundle savedInstanceState) { - super.onCreate(savedInstanceState); - //再设置布局之前,先设置Activity必须全屏显示 - getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); - setContentView(R.layout.activity_virtual_keyboard); - - KeyboardDirPath = MCINABOX_KEYBOARD; - - configDialog = new ConfigDialog(VirtualKeyBoardActivity.this,R.layout.dialog_configkey,true); - loadDialog = new ConfigDialog(VirtualKeyBoardActivity.this,R.layout.dialog_loadmodel,true); - saveDialog = new ConfigDialog(VirtualKeyBoardActivity.this,R.layout.dialog_savemodel,true); - colorPickDialog = new ConfigDialog(VirtualKeyBoardActivity.this,R.layout.dialog_colorpicker,false); - - - colorPicker = colorPickDialog.findViewById(R.id.cpv_color); - dialog_button_cancel_colorpicker = colorPickDialog.findViewById(R.id.dialog_button_cancle_colorpicker); - dialog_button_confirm_colorpicker = colorPickDialog.findViewById(R.id.dialog_button_confirm_colorpicker); - dialog_button_colorpicker = configDialog.findViewById(R.id.dialog_button_colorpicker); - - checkBox_isHide = configDialog.findViewById(R.id.dialog_key_hide); - checkBox_isKeep = configDialog.findViewById(R.id.dialog_key_keep); - checkBox_isMult = configDialog.findViewById(R.id.dialog_key_mult); - - editText_key_name = configDialog.findViewById(R.id.dialog_key_name); - editText_key_lx = configDialog.findViewById(R.id.dialog_key_lx); - editText_key_ly = configDialog.findViewById(R.id.dialog_key_ly); - editText_key_sizeW = configDialog.findViewById(R.id.dialog_key_sizeW); - editText_key_sizeH = configDialog.findViewById(R.id.dialog_key_sizeH); - editText_model_name = saveDialog.findViewById(R.id.dialog_edittext_modelname); - editText_model_color = configDialog.findViewById(R.id.dialog_color); - - seekBar_corner = configDialog.findViewById(R.id.dialog_corner); - text_corner_progress = configDialog.findViewById(R.id.dialog_text_cornerprogress); - - key_main_selected = configDialog.findViewById(R.id.dialog_key_main); - key_special_oneselected = configDialog.findViewById(R.id.dialog_key_specialone); - key_special_twoselected = configDialog.findViewById(R.id.dialog_key_specialtwo); - model_selected = loadDialog.findViewById(R.id.dialog_spinner_modelselected); - - buttonInfo = findViewById(R.id.text_buttoninfo); - buttonTip = findViewById(R.id.text_buttontip); - buttonTip.setOnClickListener(listener); - - dialog_button_cancel = configDialog.findViewById(R.id.dialog_button_cancel); - dialog_button_finish = configDialog.findViewById(R.id.dialog_button_finish); - dialog_button_load = loadDialog.findViewById(R.id.dialog_button_load); - dialog_button_cancelload = loadDialog.findViewById(R.id.dialog_button_cancelload); - dialog_button_save = saveDialog.findViewById(R.id.dialog_button_save); - dialog_button_cancelsave = saveDialog.findViewById(R.id.dialog_button_cancelsave); - button_addKey = findViewById(R.id.keyboard_button_addKey); - button_newModel = findViewById(R.id.keyboard_button_newModel); - button_saveModel = findViewById(R.id.keyboard_button_saveModel); - button_loadModel = findViewById(R.id.keyboard_button_loadModel); - toolbar_button_backhome = findViewById(R.id.toolbar2_button_backhome); - launcherBts = new Button[]{button_addKey,button_newModel,button_saveModel,button_loadModel,dialog_button_finish,dialog_button_cancel,dialog_button_load,dialog_button_cancelload,dialog_button_save,dialog_button_cancelsave,toolbar_button_backhome,dialog_button_cancel_colorpicker,dialog_button_confirm_colorpicker}; - for (Button button : launcherBts) { - button.setOnClickListener(listener); - } - - toolbar = findViewById(R.id.keyboard_toolbar); - - - layout_keyboard = findViewById(R.id.layout_keyboard); - layout_keyboard.setOnClickListener(listener); - keyboardList = new ArrayList(); - tempKeyboardList = new ArrayList(); - - //执行完初始化后的 - colorPicker.setOnColorChangeListener(colorChangedListener); - dialog_button_colorpicker.setOnClickListener(listener); - - //SeekBar 圆角大小 - seekBar_corner.setOnSeekBarChangeListener(new SeekBar.OnSeekBarChangeListener() { - @Override - public void onProgressChanged(SeekBar seekBar, int progress, boolean fromUser){ - text_corner_progress.setText(progress+""); - } - @Override - public void onStartTrackingTouch(SeekBar seekBar) { - } - @Override - public void onStopTrackingTouch(SeekBar seekBar) { - } - }); - - } - - //键名称 键宽 键长 透明度 X轴位置 Y轴位置 主按键 特殊键1 特殊键2 是否保持 是否隐藏 是否是组合键 形状 主按键位置 组合键一位置 组合键二位置 按键颜色 圆角半径 - public void addStandKey(String KeyName, int KeySizeW, int KeySizeH , float KeyLX, float KeyLY, String KeyMain, String SpecialOne, String SpecialTwo, boolean isAutoKeep, boolean isHide, boolean isMult,int MainPos,int SpecialOnePos,int SpecialTwoPos,String colorhex,int conerRadius) { - GameButton KeyButton = new GameButton(getApplicationContext()); - KeyButton.setText(KeyName); - KeyButton.setLayoutParams(new ViewGroup.LayoutParams((int)getPxFromDp(this,KeySizeW),(int)getPxFromDp(this,KeySizeH) )); - KeyButton.setX(getPxFromDp(this,KeyLX)); - KeyButton.setY(getPxFromDp(this,KeyLY)); - KeyButton.setKeyLX_dp(KeyLX); - KeyButton.setKeyLY_dp(KeyLY); - KeyButton.setKeySizeW(KeySizeW); - KeyButton.setKeySizeH(KeySizeH); - KeyButton.setKeep(isAutoKeep); - KeyButton.setHide(isHide); - KeyButton.setSpecialOne(SpecialOne); - KeyButton.setSpecialTwo(SpecialTwo); - KeyButton.setKeyMain(KeyMain); - KeyButton.setMult(isMult); - KeyButton.setClickable(true); - KeyButton.setId(KeyButton.hashCode()); - KeyButton.setGravity(Gravity.CENTER); - KeyButton.setMainPos(MainPos); - KeyButton.setSpecialOnePos(SpecialOnePos); - KeyButton.setSpecialTwoPos(SpecialTwoPos); - KeyButton.setCornerRadius(conerRadius); - KeyButton.setColorHex(colorhex); - - GradientDrawable gradientDrawable = new GradientDrawable(); - gradientDrawable.setShape(GradientDrawable.RECTANGLE); - gradientDrawable.setColor(ColorUtils.hex2Int(colorhex)); - gradientDrawable.setCornerRadius(conerRadius); - KeyButton.setBackground(gradientDrawable); - //先执行清除操作,再添加按键,再执行显示操作 才算做一次刷新!! - removeKeyboard(); - keyboardList.add(KeyButton); - reflashKeyboard(); - } - - private void reloadStantKey(GameButton targetButton){ - //给各个控件重载按键的属性 - editText_key_name.setText(targetButton.getText().toString()); - editText_key_sizeW.setText(""+targetButton.getKeySizeW()); - editText_key_sizeH.setText(""+targetButton.getKeySizeH()); - editText_key_lx.setText(""+targetButton.getKeyLX_dp()); - editText_key_ly.setText(""+targetButton.getKeyLY_dp()); - editText_model_color.setText(targetButton.getColorHex()); - - ColorDrawable drawable = new ColorDrawable(); - drawable.setColor(ColorUtils.hex2Int(targetButton.getColorHex())); - dialog_button_colorpicker.setImageDrawable(drawable); - - checkBox_isKeep.setChecked(targetButton.isKeep()); - checkBox_isHide.setChecked(targetButton.isHide()); - checkBox_isMult.setChecked(targetButton.isMult()); - - seekBar_corner.setProgress((int)targetButton.getCornerRadius()); - key_main_selected.setSelection(targetButton.getMainPos()); - key_special_oneselected.setSelection(targetButton.getSpecialOnePos()); - key_special_twoselected.setSelection(targetButton.getSpecialTwoPos()); - //显示dialog对话框 - configDialog.show(); - //刷新一次界面 - removeKeyboard(); - keyboardList.remove(targetButton); - reflashKeyboard(); - } - - private void configStandKey(){ - float KeyLX; - float KeyLY; - int KeySizeW; - int KeySizeH; - String KeyName = editText_key_name.getText().toString(); - String KeyColor = editText_model_color.getText().toString(); - - - if(editText_key_sizeW.getText().toString().equals("") || editText_key_sizeH.getText().toString().equals("")){ - KeySizeH = 40; - KeySizeW = 40; - }else{ - KeySizeW = Integer.parseInt(editText_key_sizeW.getText().toString()); - KeySizeH = Integer.parseInt(editText_key_sizeH.getText().toString()); - } - - if(KeySizeW < 20 || KeySizeH < 20){ - Toast.makeText(this, getString(R.string.tips_keyboard_config_size_toosmall), Toast.LENGTH_SHORT).show(); - return; - } - - if(editText_key_ly.getText().toString().equals("") || editText_key_lx.getText().toString().equals("")){ - KeyLY = getResources().getDisplayMetrics().widthPixels/2; - KeyLX = getResources().getDisplayMetrics().heightPixels/2; - }else{ - KeyLX = Float.parseFloat(editText_key_lx.getText().toString()); - KeyLY = Float.parseFloat(editText_key_ly.getText().toString()); - } - - if(KeyName.equals("")){ - KeyName = "Unknow"; - } - - if(KeyColor.equals("")){ - KeyColor = "#80828282"; - } - - boolean isAutoKeep = checkBox_isKeep.isChecked(); - boolean isHide = checkBox_isHide.isChecked(); - boolean isMult = checkBox_isMult.isChecked(); - int cornerRadius = seekBar_corner.getProgress(); - String KeyMain = (String)key_main_selected.getSelectedItem(); - String SpecialOne = (String)key_special_oneselected.getSelectedItem(); - String SpecialTwo = (String)key_special_twoselected.getSelectedItem(); - int MainPos = key_main_selected.getSelectedItemPosition(); - int SpecialOnePos = key_special_oneselected.getSelectedItemPosition(); - int SpecialTwoPos = key_special_twoselected.getSelectedItemPosition(); - String colorhex = editText_model_color.getText().toString(); - - addStandKey(KeyName,KeySizeW,KeySizeH,KeyLX,KeyLY,KeyMain,SpecialOne,SpecialTwo,isAutoKeep,isHide,isMult,MainPos,SpecialOnePos,SpecialTwoPos,colorhex,cornerRadius); - Toast.makeText(this, getString(R.string.tips_add_success), Toast.LENGTH_SHORT).show(); - } - - - private com.shixia.colorpickerview.OnColorChangeListener colorChangedListener = new com.shixia.colorpickerview.OnColorChangeListener(){ - @Override - public void colorChanged(int color) { - ColorPickerTemp = color; - } - }; - - private android.view.View.OnClickListener listener = new android.view.View.OnClickListener() { - @Override - public void onClick(View arg0) { - - switch (arg0.getId()) { - case R.id.dialog_button_finish: - configStandKey(); - configDialog.dismiss(); - break; - case R.id.dialog_button_cancel: - configDialog.dismiss(); - break; - case R.id.keyboard_button_addKey: - toolbar.setVisibility(View.INVISIBLE); - configDialog.show(); - break; - case R.id.keyboard_button_newModel: - removeKeyboard(); - clearKeyboard(); - reflashKeyboard(); - break; - case R.id.keyboard_button_saveModel: - saveDialog.show(); - break; - case R.id.keyboard_button_loadModel: - loadDialog.show(); - initLoadModelSpinner(); - break; - case R.id.dialog_button_load: - removeKeyboard(); - clearKeyboard(); - reflashKeyboard(); - getKeyboardModelFromJson(); - loadDialog.dismiss(); - break; - case R.id.dialog_button_cancelload: - loadDialog.dismiss(); - break; - case R.id.dialog_button_save: - if(!editText_model_name.getText().toString().equals("")){ - getJsonFromKeyboardModel(editText_model_name.getText().toString()); - saveDialog.dismiss(); - }else{ - Toast.makeText(getApplicationContext(), getString(R.string.tips_keyboard_config_filename_notfound), Toast.LENGTH_SHORT).show(); - } - break; - case R.id.dialog_button_cancelsave: - saveDialog.dismiss(); - break; - case R.id.toolbar2_button_backhome: - finish(); - break; - case R.id.layout_keyboard: - if(toolbar.getVisibility() == View.VISIBLE){ - toolbar.setVisibility(View.INVISIBLE); - }else if(toolbar.getVisibility() == View.INVISIBLE){ - toolbar.setVisibility(View.VISIBLE); - } - break; - case R.id.dialog_button_colorpicker: - colorPickDialog.show(); - configDialog.hide(); - break; - case R.id.dialog_button_cancle_colorpicker: - colorPickDialog.hide(); - configDialog.show(); - break; - case R.id.dialog_button_confirm_colorpicker: - configDialog.show(); - ApplyColorChangeToGameButton(); - colorPickDialog.hide(); - break; - case R.id.text_buttontip: - buttonTip.setVisibility(View.INVISIBLE); - break; - default: - break; - } - } - }; - - - private android.view.View.OnLongClickListener keyboardListenerLong = new android.view.View.OnLongClickListener() { - @Override - public boolean onLongClick(View arg0) { - if(BeMoved){ - //nothing - }else { - for (GameButton targetButton : keyboardList) { - if (arg0.getId() == targetButton.getId()) { - reloadStantKey(targetButton); - } - } - ShowButtonInfoOnText(null,buttonInfo,null); - } - return true; - } - }; - - public static float getPxFromDp(Context context, float dpValue) { - final float scale = context.getResources().getDisplayMetrics().density; - return (dpValue * scale); - } - - public static float getDpFromPx(Context context, float pxValue){ - final float scale = context.getResources().getDisplayMetrics().density; - return (pxValue / scale) ; - } - - public void reflashKeyboard(){ - for (GameButton targetButton : keyboardList) { - layout_keyboard.addView(targetButton); - targetButton.setOnTouchListener(touchlistener); - targetButton.setOnLongClickListener(keyboardListenerLong); - } - } - - public void removeKeyboard(){ - for(GameButton targetButton : keyboardList){ - if(targetButton != null){ - layout_keyboard.removeView(targetButton); - } - } - fixArrayError(); - } - - //由于ArrayList表在多次执行remove操作后会导致不连续而抛出异常,在这里写一个修复函数,每次执行remove操作后都将旧表copy到新表中。 - public void fixArrayError(){ - ArrayList tempList = new ArrayList(){}; - for(GameButton targetButton : keyboardList) { - if (targetButton != null) { - tempList.add(targetButton); - } - } - keyboardList = tempList; - } - //彻底清空虚拟按键 - public void clearKeyboard(){ - ArrayList tempList = new ArrayList(){}; - keyboardList = tempList; - } - - public void getJsonFromKeyboardModel(String name){ - String jsonName = name; - Gson gson = new Gson(); - File jsonFile = new File(KeyboardDirPath+"/"+jsonName+".json"); - if(!jsonFile.exists()){ - try { - jsonFile.createNewFile(); - } catch (IOException e) { - e.printStackTrace(); - } - } - if(keyboardList.size() == 0){ - Toast.makeText(this, getString(R.string.tips_keyboard_button_notfound), Toast.LENGTH_SHORT).show(); - return; - } - - ArrayList modelList = new ArrayList(){}; - for(GameButton button : keyboardList){ - modelList.add(new KeyboardJson(button.getText().toString(),button.getKeySizeW(),button.getKeySizeH(),button.getKeyLX_dp(),button.getKeyLY_dp(),button.getKeyMain(),button.getSpecialOne(),button.getSpecialTwo(),button.isKeep(),button.isHide(),button.isMult(),button.getMainPos(),button.getSpecialOnePos(),button.getSpecialTwoPos(),button.getColorHex(),button.getCornerRadius())); - } - - JSONArray jsonArray = new JSONArray(); - for (int i = 0; i < modelList.size(); i++) { - String accountStr = gson.toJson(modelList.get(i)); - JSONObject keyboardModelObject; - try { - keyboardModelObject = new JSONObject(accountStr); - jsonArray.put(i, keyboardModelObject); - try { - FileWriter jsonWriter = new FileWriter(jsonFile); - BufferedWriter out = new BufferedWriter(jsonWriter); - out.write(jsonArray.toString()); - out.close(); - } catch (IOException e) { - e.printStackTrace(); - } - } catch (JSONException e) { - e.printStackTrace(); - } - } - Toast.makeText(this, getString(R.string.tips_put_success), Toast.LENGTH_SHORT).show(); - } - - public void getKeyboardModelFromJson(){ - InputStream inputStream; - Gson gson = new Gson(); - File jsonFile = new File(KeyboardDirPath + "/" + modelNameList.get(selectedModelPos)); - if(!jsonFile.exists()){ - Toast.makeText(this, getString(R.string.tips_keyboard_model_notfound), Toast.LENGTH_SHORT).show(); - return; - } - - try { - inputStream = new FileInputStream(jsonFile); - Reader reader = new InputStreamReader(inputStream); - KeyboardJson[] jsonArray = new Gson().fromJson(reader, KeyboardJson[].class); - List tempList1 = Arrays.asList(jsonArray); - ArrayList tempList2 = new ArrayList(tempList1); - if(tempList2.size() != 0){ - Toast.makeText(this, getString(R.string.tips_load_success), Toast.LENGTH_SHORT).show(); - for(KeyboardJson targetModel : tempList2){ - //这里采用了逐个添加 - addStandKey(targetModel.getKeyName(),targetModel.getKeySizeW(),targetModel.getKeySizeH(),targetModel.getKeyLX(),targetModel.getKeyLY(),targetModel.getKeyMain(),targetModel.getSpecialOne(),targetModel.getSpecialTwo(),targetModel.isAutoKeep(),targetModel.isHide(),targetModel.isMult(),targetModel.getMainPos(),targetModel.getSpecialOnePos(),targetModel.getSpecialTwoPos(),targetModel.getColorhex(),targetModel.getCornerRadius()); - } - }else{ - Toast.makeText(this, getString(R.string.tips_load_fail), Toast.LENGTH_SHORT).show(); - return; - } - } catch (FileNotFoundException e) { - e.printStackTrace(); - } - } - - public void initLoadModelSpinner() { - - File file = new File(KeyboardDirPath+"/"); - File[] files = file.listFiles(); - if (files == null) { - Toast.makeText(this, getString(R.string.tips_keyboard_model_notfound), Toast.LENGTH_SHORT).show(); - return; - } - //每次都先清空列表,再修创建列表内容 - modelNameList = new ArrayList() { - }; - for (File targetFile : files) { - modelNameList.add(targetFile.getName()); - } - - //设置 Adapter源 - ArrayAdapter adapter = new ArrayAdapter(this, android.R.layout.simple_spinner_item, modelNameList); - adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - //绑定 Adapter到控件 - model_selected.setAdapter(adapter); - model_selected.setOnItemSelectedListener(new AdapterView.OnItemSelectedListener() { - @Override - public void onItemSelected(AdapterView parent, View view, int pos, long id) { - selectedModelPos = pos; - } - @Override - public void onNothingSelected(AdapterView parent) { - // Another interface callback - } - }); - } - - public void ApplyColorChangeToGameButton(){ - String color = ColorUtils.int2Hex3(ColorPickerTemp); - editText_model_color.setText(color); - ColorDrawable drawable = new ColorDrawable(); - drawable.setColor(ColorPickerTemp); - dialog_button_colorpicker.setImageDrawable(drawable); - } - - private boolean BeMoved; - private float[] buttonPos; - private float[] touchPos; - private GameButton.OnTouchListener touchlistener = new GameButton.OnTouchListener(){ - @Override - public boolean onTouch(View p1, MotionEvent p3){ - switch(p3.getAction()){ - case MotionEvent.ACTION_DOWN: - ShowButtonInfoOnText((GameButton) p1,buttonInfo,p3); - buttonPos = new float[]{p1.getX(),p1.getY()}; - touchPos = new float[]{p3.getRawX(),p3.getRawY()}; - break; - case MotionEvent.ACTION_MOVE: - BeMoved = true; - ShowButtonInfoOnText((GameButton) p1,buttonInfo,p3); - p1.setX(buttonPos[0] + p3.getRawX() - touchPos[0] ); - p1.setY(buttonPos[1] + p3.getRawY() - touchPos[1] ); - break; - case MotionEvent.ACTION_UP: - ShowButtonInfoOnText(null,buttonInfo,p3); - if(BeMoved){ - ((GameButton)p1).setKeyLX_dp(getDpFromPx(getApplication(),buttonPos[0] + p3.getRawX() - touchPos[0])); - ((GameButton)p1).setKeyLY_dp(getDpFromPx(getApplication(),buttonPos[1] + p3.getRawY() - touchPos[1] )); - removeKeyboard(); - reflashKeyboard(); - BeMoved = false; - } - break; - default: - break; - } - return false; - } - }; - - private void ShowButtonInfoOnText(GameButton p1,TextView p2,MotionEvent p3){ - if(p1 != null && p3 != null){ - p2.setText("按键名: " + p1.getText() + " 主按键: " + p1.getKeyMain() + " X坐标: " + getDpFromPx(getApplication(),p3.getRawX() - (p1.getWidth() / 2)) + "dp" + " Y坐标: " + getDpFromPx(getApplication(),p3.getRawY() - (p1.getHeight() / 2)) + "dp\n" + - "宽度: " + p1.getKeySizeW() + "dp" + " 高度: " + p1.getKeySizeH() + "dp" + " 颜色: " + p1.getColorHex() + " 圆角: " + p1.getCornerRadius() + "\n" + - "自动保持: " + p1.isKeep() + " 隐藏: " + p1.isHide() + " 组合键: " + p1.isMult() + " 组合键一: " + p1.getSpecialOne() + " 组合键二: " + p1.getSpecialTwo() - ); - }else{ - p2.setText(" "); - } - } - -} \ No newline at end of file diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/JsonUtils.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/JsonUtils.java deleted file mode 100644 index 79f259a2..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/JsonUtils.java +++ /dev/null @@ -1,129 +0,0 @@ -package com.aof.mcinabox.launcher; - -import android.content.Context; -import android.util.Log; -import android.widget.Toast; - -import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.KeyboardJson; -import com.aof.mcinabox.launcher.json.RuntimeJson; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.google.gson.Gson; - -import java.io.BufferedWriter; -import java.io.File; -import java.io.FileInputStream; -import java.io.FileNotFoundException; -import java.io.FileWriter; -import java.io.IOException; -import java.io.InputStream; -import java.io.InputStreamReader; -import java.io.Reader; - -import static com.aof.sharedmodule.Data.DataPathManifest.RUNTIME_HOME; - -public class JsonUtils { - /**【读入pack.json】**/ - public static RuntimeJson getPackFromFile(File file){ - if(file == null){ - Log.e("JsonUtils","Json File is null."); - return null; - } - try { - InputStream inputStream = new FileInputStream(file); - Reader reader = new InputStreamReader(inputStream); - Gson gson = new Gson(); - //使用Gson将ListVersionManifestJson实例化 - return gson.fromJson(reader, RuntimeJson.class); - - } catch (FileNotFoundException e) { - e.printStackTrace(); - Log.e("JsonUtils","Json File not found."); - return null; - } - } - public static RuntimeJson getPackFromFile(String filepath){ - return getPackFromFile(new File(filepath)); - } - public static String getPackInformation(Context context){ - RuntimeJson info = getPackFromFile(RUNTIME_HOME + "/pack.json"); - if(info == null){ - return ""; - }else{ - return ( context.getString(R.string.title_runtime_package_name) + " " + info.getPackName() + "\n" + - context.getString(R.string.title_runtime_package_releasetime) + " " + info.getReleaseTime() + "\n" + - context.getString(R.string.title_runtime_package_platform) + " " + info.getPlatform() + "\n" + - context.getString(R.string.title_runtime_java_version) + " " + info.getJavaVersion() + "\n" + - context.getString(R.string.title_runtime_opengl_version) + " " + info.getOpenGLVersion() + "\n" + - context.getString(R.string.title_runtime_openal_version) + " " + info.getOpenALVersion() + "\n" + - context.getString(R.string.title_runtime_lwjgl_version) + " " + info.getLwjgl2Version() + " " + info.getLwjgl3Version() + "\n" - ); - } - } - - /**【读入mcinabox.json】**/ - public static SettingJson getSettingFromFile(File file){ - if(file == null){ - Log.e("JsonUtils","Json File is null."); - return null; - } - try { - InputStream inputStream = new FileInputStream(file); - Reader reader = new InputStreamReader(inputStream); - Gson gson = new Gson(); - //使用Gson将ListVersionManifestJson实例化 - return gson.fromJson(reader, SettingJson.class); - - } catch (FileNotFoundException e) { - e.printStackTrace(); - Log.e("JsonUtils","Json File not found."); - return null; - } - } - public static SettingJson getSettingFromFile(String filepath){ - return getSettingFromFile(new File(filepath)); - } - - /**【读入keyboard.json】**/ - public static KeyboardJson getKeyboardFromFile(File file){ - if(file == null){ - Log.e("JsonUtils","Json File is null."); - return null; - } - try { - InputStream inputStream = new FileInputStream(file); - Reader reader = new InputStreamReader(inputStream); - Gson gson = new Gson(); - //使用Gson将ListVersionManifestJson实例化 - return gson.fromJson(reader, KeyboardJson.class); - - } catch (FileNotFoundException e) { - e.printStackTrace(); - Log.e("JsonUtils","Json File not found."); - return null; - } - } - public static KeyboardJson getKeyboardFromFile(String filepath){ - return getKeyboardFromFile(new File(filepath)); - } - - /**【保存mcinabox.json文件】**/ - public static boolean saveSettingToFile(SettingJson setting,File toFile){ - Gson gson = new Gson(); - String jsonString = gson.toJson(setting); - try { - FileWriter jsonWriter = new FileWriter(toFile); - BufferedWriter out = new BufferedWriter(jsonWriter); - out.write(jsonString); - out.close(); - return true; - } catch (IOException e) { - e.printStackTrace(); - return false; - } - } - public static boolean saveSettingToFile(SettingJson setting,String toFile){ - return saveSettingToFile(setting,new File(toFile)); - } - -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/UrlSource.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/UrlSource.java deleted file mode 100644 index 48c5da73..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/UrlSource.java +++ /dev/null @@ -1,71 +0,0 @@ -package com.aof.mcinabox.launcher; - -import android.util.Log; - -import java.util.HashMap; - -public class UrlSource { - public HashMap> SourceMap; - - public UrlSource(){ - initSourceMap(new String[][] { - //官方下载源 - {"official","version_manifest_json","https://launchermeta.mojang.com/mc/game/version_manifest.json"}, - {"official","version_json","https://launchermeta.mojang.com"}, - {"official","version_jar","https://launcher.mojang.com"}, - {"official","assetsIndex_json","https://launchermeta.mojang.com"}, - {"official","assets","http://resources.download.minecraft.net"}, - {"official","libraries","https://libraries.minecraft.net"}, - {"official","forge","https://files.minecraftforge.net/maven"}, - {"official","liteloader_version_json","http://dl.liteloader.com/versions/versions.json"}, - {"official","optifine",""}, - //BMCLAPI下载源 - {"bmclapi","version_manifest_json","https://bmclapi2.bangbang93.com/mc/game/version_manifest.json"}, - {"bmclapi","version_json","https://bmclapi2.bangbang93.com"}, - {"bmclapi","version_jar","https://bmclapi2.bangbang93.com"}, - {"bmclapi","assetsIndex_json","https://bmclapi2.bangbang93.com"}, - {"bmclapi","assets","https://bmclapi2.bangbang93.com/assets"}, - {"bmclapi","libraries","https://bmclapi2.bangbang93.com/maven"}, - {"bmclapi","forge","https://bmclapi2.bangbang93.com/maven"}, - {"bmclapi","liteloader_version_json","https://bmclapi.bangbang93.com/maven/com/mumfrey/liteloader/versions.json"}, - //MCBBS下载源 - {"mcbbs","version_manifest_json","https://download.mcbbs.net/mc/game/version_manifest.json"}, - {"mcbbs","version_json","https://download.mcbbs.net"}, - {"mcbbs","version_jar","https://download.mcbbs.net"}, - {"mcbbs","assetsIndex_json","https://download.mcbbs.net"}, - {"mcbbs","assets","https://download.mcbbs.net/assets"}, - {"mcbbs","libraries","https://download.mcbbs.net/maven"}, - {"mcbbs","forge","https://download.mcbbs.net/maven"}, - {"mcbbs","liteloader_version_json","https://download.mcbbs.net/maven/com/mumfrey/liteloader/versions.json"}, - }); - } - - //String ... {{sourceName,Type,Url}, ...} - private void initSourceMap(String[][] originMap){ - SourceMap = new HashMap>(); - for(String[] couple : originMap){ - if(SourceMap.containsKey(couple[0])){ - SourceMap.get(couple[0]).put(couple[1],couple[2]); - }else{ - HashMap tmp = new HashMap(); - tmp.put(couple[1],couple[2]); - SourceMap.put(couple[0],tmp); - } - } - } - - public String getSourceUrl(String sourceName,String type){ - Log.e("SourceUrl","下载源:"+sourceName+" 类型:"+type); - return SourceMap.get(sourceName).get(type); - } - public String getFileUrl(String originUrl,String sourceName, String type){ - String convertedUrl = ""; - String Str1 = ""; - String Str2 = getSourceUrl("official",type); - for(int i = Str2.length(); i < originUrl.length() ; i++){ - Str1 = Str1 + originUrl.charAt(i); - } - convertedUrl = getSourceUrl(sourceName,type) + Str1; - return convertedUrl; - } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/core/LaunchMinecraft.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/core/LaunchMinecraft.java deleted file mode 100644 index 2dcda4b8..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/core/LaunchMinecraft.java +++ /dev/null @@ -1,448 +0,0 @@ -package com.aof.mcinabox.launcher.core; - -import android.content.Context; -import android.content.Intent; -import android.os.Build; -import android.util.Log; -import android.widget.Toast; - -import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.ArgsJson; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.utils.PathTool; -import com.aof.mcinabox.minecraft.json.VersionJson; - -import java.io.File; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.HashMap; - -import static com.aof.mcinabox.DataPathManifest.*; - -public class LaunchMinecraft { - - private String runtimePath = RUNTIME_HOME; - private String minecraft_home_path; - private String minecraft_assets_path; - private String minecraft_version_path; - private String minecraft_libraries_path; - private Context mContext; - private SettingJson setting; - private VersionJson minecraftJson; - private VersionJson apiJson; - private String keyboardLayout; - private boolean isCheckGame; - private boolean isCheckFormat; - private boolean hasAPI; - private String apiID; - private String minecraftID; - private String[] commands; - - public LaunchMinecraft(Context context){ - mContext = context; - setting = com.aof.mcinabox.launcher.JsonUtils.getSettingFromFile(MCINABOX_FILE_JSON); - PathTool pathTool = new PathTool(setting.getLocalization(),true); - minecraft_home_path = pathTool.getMINECRAFT_DIR(); - minecraft_assets_path = pathTool.getMINECRAFT_ASSETS_DIR(); - minecraft_version_path = pathTool.getMINECRAFT_VERSION_DIR(); - minecraft_libraries_path = pathTool.getMINECRAFT_LIBRARIES_DIR(); - preInitite(); - } - - public void initateWithAPI(){ - this.apiID = setting.getLastVersion(); - this.hasAPI = true; - this.apiJson = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(minecraft_version_path,apiID)); - this.minecraftID = apiJson.getInheritsFrom(); - this.minecraftJson = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(minecraft_version_path,minecraftID)); - this.keyboardLayout = setting.getKeyboard(); - this.isCheckFormat = !setting.getConfigurations().isNotCheckJvm(); - this.isCheckGame = !setting.getConfigurations().isNotCheckGame(); - } - - public void initateNormal(){ - this.hasAPI = false; - this.minecraftID = setting.getLastVersion(); - this.minecraftJson = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(minecraft_version_path,minecraftID)); - this.keyboardLayout = setting.getKeyboard(); - this.isCheckFormat = !setting.getConfigurations().isNotCheckJvm(); - this.isCheckGame = !setting.getConfigurations().isNotCheckGame(); - } - - private void preInitite(){ - String id = setting.getLastVersion(); - VersionJson json = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(minecraft_version_path + id + "/" + id + ".json"); - if(getApiState(json)){ - initateWithAPI(); - }else{ - initateNormal(); - } - } - - //Get the state of API - //If this version contains a API, the method will return true. - private boolean getApiState(VersionJson json){ - return json.getInheritsFrom() != null; - } - - private boolean checkGame(){ - boolean pass = true; - //检查API - if(hasAPI){ - if(!checkVersion(apiID)){ - pass = false; - Toast.makeText(mContext, mContext.getString(R.string.tips_gamecheck_jar_notfound) + " " + apiID, Toast.LENGTH_SHORT).show(); - } - } - //检查Version - if(!checkVersion(minecraftID)){ - pass = false; - Toast.makeText(mContext, mContext.getString(R.string.tips_gamecheck_version_notfound) + " " + minecraftID, Toast.LENGTH_SHORT).show(); - } - //检查完整性 - if(isCheckGame){ - if(hasAPI){ - if(! checkLibraries(apiJson) || ! checkLibraries(minecraftJson) || ! checkAssets(minecraftJson)){ - pass = false; - Toast.makeText(mContext, mContext.getString(R.string.tips_gamecheck_file_notfull), Toast.LENGTH_SHORT).show(); - } - }else{ - if(! checkLibraries(minecraftJson) || ! checkAssets(minecraftJson)){ - pass = false; - Toast.makeText(mContext, mContext.getString(R.string.tips_gamecheck_file_notfull), Toast.LENGTH_SHORT).show(); - } - } - } - - //检查架构 - if(isCheckFormat){ - if(! checkFramework()){ - pass = false; - } - } - return pass; - } - - private boolean checkVersion(String id) { - File json = new File(Utils.getJsonAbsPath(minecraft_version_path,id)); - File jar = new File(Utils.getJarAbsPath(minecraft_version_path,id)); - return json.exists() && jar.exists(); - } - - private boolean checkLibraries(VersionJson version){ - if(version == null){ - return false; - } - VersionJson.DependentLibrary[] libraries = version.getLibraries(); - for (VersionJson.DependentLibrary targetLibrary : libraries) { - if (!filterLibraries(targetLibrary.getName())) { - File file = new File(GetLibrariesPath(targetLibrary.getName())); - if (!file.exists()) { - return false; - } - } - } - return true; - } - - private boolean checkAssets(VersionJson version){ - //TODO:检查资源文件 - return true; - } - - private boolean checkFramework() { - String abi = null; - abi = Build.SUPPORTED_ABIS[0]; - //TODO:架构检查 - return true; - } - - - /** - * 【执行启动游戏】 - **/ - public void StartGame() { - commands = makeCommand(hasAPI); - - if(checkGame()){ - return; - } - - //输出测试 - for (String arg : commands) { - System.out.print(arg + " "); - Log.e("StartGame", arg); - } - - Intent intent = makeIntent(); - mContext.startActivity(intent); - - } - - private String[] makeCommand(boolean forgeMode) { - //java虚拟机的路径 - String Java_Args = runtimePath + "/j2re-image/bin/java"; - - //设定JVM参数 - ArrayList JVM_Args = new ArrayList(); - String JVM_client = "-client"; - String JVM_Xmx = "-Xmx" + setting.getConfigurations().getMaxMemory() + "m"; - String JVM_Xms = "-Xms128m"; - String JVM_java_library_path; - String JVM_lwjgl_debug_true = "-Dorg.lwjgl.util.Debug=true"; - String JVM_lwjgl_debugloader_true = "-Dorg.lwjgl.util.DebugLoader=true"; - String JVM_ExtraArgs = setting.getConfigurations().getJavaArgs(); - String JVM_ClassPath = "-cp"; - String JVM_ClassPath_Info; - String JVM_ClassPath_Runtime; - - if (minecraftJson.getMinimumLauncherVersion() >= 21) { - //这是1.13.1以及之后的处理方法 - JVM_ClassPath_Runtime = runtimePath + "/lwjgl3/lwjgl-jemalloc.jar:" + runtimePath + "/lwjgl3/lwjgl-tinyfd.jar:" + runtimePath + "/lwjgl3/lwjgl-opengl.jar:" + runtimePath + "/lwjgl3/lwjgl-openal.jar:" + runtimePath + "/lwjgl3/lwjgl-glfw.jar:" + runtimePath + "/lwjgl3/lwjgl-stb.jar:" + runtimePath + "/lwjgl3/lwjgl.jar:"; - JVM_java_library_path = "-Djava.library.path=" + runtimePath + "/j2re-image/lib/aarch32/jli:" + runtimePath + "/j2re-image/lib/aarch32:" + runtimePath + "/lwjgl3:" + runtimePath; - } else { - //这是1.13.1之前的处理方法 - JVM_ClassPath_Runtime = runtimePath + "/lwjgl2/lwjgl_util.jar:" + runtimePath + "/lwjgl2/lwjgl.jar:"; - JVM_java_library_path = "-Djava.library.path=" + runtimePath + "/j2re-image/lib/aarch32/jli:" + runtimePath + "/j2re-image/lib/aarch32:" + runtimePath + "/lwjgl2:" + runtimePath; - } - - //注意加入list时的顺序 - if(! JVM_ExtraArgs.equals("")){ - JVM_Args.addAll(Arrays.asList(SplitMinecraftArgument(JVM_ExtraArgs))); - } - JVM_Args.add(JVM_client); - JVM_Args.add(JVM_Xmx); - JVM_Args.add(JVM_Xms); - JVM_Args.add(JVM_java_library_path); - JVM_Args.add(JVM_lwjgl_debug_true); - JVM_Args.add(JVM_lwjgl_debugloader_true); - - if (hasAPI) { - String jarPath; - File jar = new File(Utils.getJarAbsPath(minecraft_version_path,apiID)); - if(jar.exists()){ - jarPath = Utils.getJarAbsPath(minecraft_version_path,apiID); - }else{ - jarPath = Utils.getJarAbsPath(minecraft_version_path,minecraftID); - } - JVM_ClassPath_Info = JVM_ClassPath_Runtime + GetClassPathArgs(apiJson.getLibraries()) + GetClassPathArgs(apiJson.getLibraries()) + jarPath; - } else { - String jarPath = Utils.getJarAbsPath(minecraft_version_path,minecraftID); - JVM_ClassPath_Info = JVM_ClassPath_Runtime + GetClassPathArgs(minecraftJson.getLibraries()) + jarPath; - } - - JVM_Args.add(JVM_ClassPath); - JVM_Args.add(JVM_ClassPath_Info); - - //设定Minecraft参数 - ArrayList Minecraft_Args = new ArrayList(); - String Minecraft_MainClass = minecraftJson.getMainClass(); - String MinecraftExtraArgs = setting.getConfigurations().getMinecraftArgs(); - String MinecraftWindowArgs = "--width ${window_width} --height ${window_height}"; - String Minecraft_arguements = ""; - - if (minecraftJson.getMinimumLauncherVersion() >= 21) { - //这是1.13.1以及之后的处理方法 - Minecraft_arguements = ConvertJsStringModleToJavaStringModle(ConvertArgumentsToMinecraftArguments(minecraftJson)); - } else { - //这是1.13.1之前的处理方法 - Minecraft_arguements = ConvertJsStringModleToJavaStringModle(minecraftJson.getMinecraftArguments()); - } - - Minecraft_Args.add(Minecraft_MainClass); - Minecraft_Args.addAll(Arrays.asList(SplitMinecraftArgument(Minecraft_arguements))); - Minecraft_Args.addAll(Arrays.asList(SplitMinecraftArgument(ConvertJsStringModleToJavaStringModle(MinecraftWindowArgs)))); - Minecraft_Args.addAll(Arrays.asList(SplitMinecraftArgument(MinecraftExtraArgs))); - - //获得总命令 - ArrayList CommandTemp = new ArrayList(); - CommandTemp.add(Java_Args); - CommandTemp.addAll(JVM_Args); - CommandTemp.addAll(Minecraft_Args); - - String[] Command = new String[CommandTemp.size()]; - for (int i = 0; i < Command.length; i++) { - Command[i] = CommandTemp.get(i); - } - - return Command; - - } - - /** - * 【将包含JS字符串占位符的字符串转化为转义后的Java字符串】 - **/ - private String ConvertJsStringModleToJavaStringModle(String mString) { - String JsString = mString; - String JavaString; - String tempString = ""; - HashMap ArgsMap = new HashMap(); - SettingJson.Accounts account = GetUserFromLauncherSetting(); - - //需要转义的键名-键值 - ArgsMap.put("{auth_player_name}", account.getUsername()); - ArgsMap.put("{auth_uuid}", account.getUuid()); - ArgsMap.put("{auth_access_token}", account.getAccessToken()); - ArgsMap.put("{auth_session}", "mojang"); - ArgsMap.put("{user_properties}", "{}"); - ArgsMap.put("{user_type}", "mojang"); - ArgsMap.put("{assets_index_name}", minecraftJson.getAssets()); - ArgsMap.put("{assets_root}", minecraft_assets_path); - ArgsMap.put("{game_directory}", minecraft_home_path); - ArgsMap.put("{game_assets}", minecraftJson.getAssets()); - ArgsMap.put("{version_name}", "\"" + "MCinaBox-" + MCINABOX_VERSION + "\""); - ArgsMap.put("{version_type}", minecraftJson.getType()); - ArgsMap.put("{window_width}", Integer.toString(mContext.getResources().getDisplayMetrics().widthPixels)); - ArgsMap.put("{window_height}", Integer.toString(mContext.getResources().getDisplayMetrics().heightPixels)); - - - for (int i = 0; i < JsString.length(); i++) { - if (JsString.charAt(i) == '$') { - String tempString2 = ""; - do { - i++; - tempString2 = tempString2 + JsString.charAt(i); - } while (JsString.charAt(i) != '}'); - tempString = tempString + ArgsMap.get(tempString2); - Log.e("StartGameCheck", tempString2); - } else { - tempString = tempString + JsString.charAt(i); - } - } - - JavaString = tempString; - return JavaString; - } - - /** - * 【获取用户信息】 - **/ - private SettingJson.Accounts GetUserFromLauncherSetting() { - - SettingJson.Accounts[] accounts = setting.getAccounts(); - for (SettingJson.Accounts targetAccount : accounts) { - if (targetAccount.isSelected()) { - return targetAccount; - } - } - return null; - } - - /** - * 【将ArgsModel对象序列化得到Intent】 - **/ - private Intent makeIntent() { - ArgsJson argsModel = new ArgsJson(); - argsModel.setArgs(commands); - argsModel.setKeyboardName(keyboardLayout); - argsModel.setHome(minecraft_home_path); - - Intent intent; - if (minecraftJson.getMinimumLauncherVersion() >= 21) { - //这是1.13.1以及之后的处理方法 - intent = new Intent(mContext, cosine.boat.version3.LauncherActivity.class); - } else { - //这是1.13.1之前的处理方法 - intent = new Intent(mContext, cosine.boat.LauncherActivity.class); - } - intent.putExtra("LauncherConfig", argsModel); - intent.addFlags(Intent.FLAG_ACTIVITY_NEW_TASK); - - return intent; - } - - /** - * 【将MC1.13的Arguments对象转化为MinecraftArguments字符串】 - **/ - private String ConvertArgumentsToMinecraftArguments(VersionJson json) { - String minecraftarguments = ""; - for (int i = 0; i < json.getArguments().getGame().length; i++) { - if (json.getArguments().getGame()[i] instanceof String) { - if (i == json.getArguments().getGame().length - 1) { - minecraftarguments = minecraftarguments + json.getArguments().getGame()[i]; - } else { - minecraftarguments = minecraftarguments + json.getArguments().getGame()[i] + " "; - } - } - } - return minecraftarguments; - } - - /** - * 【以空格来分割MinecraftArgument为字符串数组】 - **/ - private String[] SplitMinecraftArgument(String Str) { - return Str.split(" "); - } - - /** - * 【不加载lwjgl和glfw】 - **/ - private boolean filterLibraries(String name) { - String packname = ""; - String[] libraries = {"lwjgl", "lwjgl_util", "lwjgl-platform", - "lwjgl-egl", "lwjgl-glfw", "lwjgl-jemalloc", - "lwjgl-openal", "lwjgl-opengl", "lwjgl-opengles", - "lwjgl-stb", "lwjgl-tinyfd", "jinput-platform", "twitch-platform", "twitch-external-platform"}; - boolean result = false; - int a = 0; - for (int i = 0; i < name.length(); i++) { - if (name.charAt(i) == ':') { - a = i + 1; - break; - } - } - for (; a < name.length(); a++) { - if (name.charAt(a) != ':') { - packname = packname + name.charAt(a); - } else { - break; - } - } - for (String str : libraries) { - if (str.equals(packname)) { - return true; - } - } - return false; - } - - private String GetLibrariesPath(String name) { - String packageName; - String libraryName; - String versionName; - String filePath; - - String[] Name = name.split(":"); - packageName = Name[0]; - libraryName = Name[1]; - versionName = Name[2]; - - String dirPath = minecraft_libraries_path; - for (int i = 0; i < packageName.length(); i++) { - if (packageName.charAt(i) == '.') { - dirPath = dirPath + "/"; - } else { - dirPath = dirPath + packageName.charAt(i); - } - } - dirPath = dirPath + "/" + libraryName + "/" + versionName + "/"; - - String fileName = ""; - fileName = libraryName + "-" + versionName + ".jar"; - - filePath = dirPath + fileName; - return filePath; - } - - private String GetClassPathArgs(VersionJson.DependentLibrary[] libraries) { - String cp = ""; - for (VersionJson.DependentLibrary library : libraries) { - if (!filterLibraries(library.getName())) { - cp = cp + GetLibrariesPath(library.getName()) + ":"; - } - } - return cp; - } - -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/core/Utils.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/core/Utils.java deleted file mode 100644 index 91d799d5..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/core/Utils.java +++ /dev/null @@ -1,14 +0,0 @@ -package com.aof.mcinabox.launcher.core; - -public class Utils { - public static String getJsonAbsPath(String versionHome,String id){ - return (versionHome + id + "/" + id + ".json"); - } - public static String getJarAbsPath(String versionHome,String id){ - return (versionHome + id + "/" + id + ".jar"); - } - public static String getAssetsJsonAbsPath(String assetsHome,String id){ - //TODO: 返回资源清单文件路径 - return null; - } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/BaseDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/BaseDialog.java deleted file mode 100644 index ffd17dc1..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/BaseDialog.java +++ /dev/null @@ -1,29 +0,0 @@ -package com.aof.mcinabox.launcher.dialogs; - -import android.app.Activity; -import android.app.Dialog; -import android.os.Bundle; -import android.view.View; - -import com.aof.mcinabox.MainActivity; -import com.aof.mcinabox.R; - -public abstract class BaseDialog extends Dialog { - - public BaseDialog(Activity mContext, int layoutID) { - super(mContext, R.style.NormalDialog); - setContentView(layoutID); - this.mContext = mContext; - } - - public BaseDialog(Activity mContext, View view){ - super(mContext,R.style.NormalDialog); - setContentView(view); - this.mContext = mContext; - } - - //This is Activity. - public Activity mContext; - @Override - abstract protected void onCreate(Bundle savedInstanceState); -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/ContributorsDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/ContributorsDialog.java index 9ff9a2fd..83d3d87d 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/ContributorsDialog.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/ContributorsDialog.java @@ -1,17 +1,17 @@ package com.aof.mcinabox.launcher.dialogs; +import android.app.Dialog; +import android.content.Context; import android.os.Bundle; import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.R; -public class ContributorsDialog extends BaseDialog { - - public ContributorsDialog(MainActivity context, int layoutID){ - super(context,layoutID); - } - - @Override - protected void onCreate(Bundle savedInstanceState) { +public class ContributorsDialog extends Dialog { + public ContributorsDialog(Context context){ + super(context); + setContentView(R.layout.dialog_contributors); + setCanceledOnTouchOutside(true); } } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/CreateUserDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/CreateUserDialog.java deleted file mode 100644 index 2bc0ad65..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/CreateUserDialog.java +++ /dev/null @@ -1,156 +0,0 @@ -package com.aof.mcinabox.launcher.dialogs; - -import android.content.SharedPreferences; -import android.os.Bundle; -import android.view.View; -import android.widget.Button; -import android.widget.CheckBox; -import android.widget.CompoundButton; -import android.widget.EditText; -import android.widget.LinearLayout; -import android.widget.Toast; - -import com.aof.mcinabox.DataPathManifest; -import com.aof.mcinabox.MainActivity; -import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.launcher.uis.UserUI; -import com.aof.mcinabox.minecraft.Login; - -import java.util.UUID; - -public class CreateUserDialog extends BaseDialog { - - public CreateUserDialog(MainActivity context, int layoutID) { - super(context, layoutID); - } - - private Button buttonOK; - private Button buttonCancel; - private EditText editUsername; - private EditText editPassword; - private LinearLayout layoutPassword; - private CheckBox checkboxUsermodel; - - private View[] views; - - @Override - protected void onCreate(Bundle savedInstanceState) { - buttonOK = findViewById(R.id.dialog_button_confirm_createuser); - buttonCancel = findViewById(R.id.dialog_button_cancle_createuser); - editUsername = findViewById(R.id.dialog_edittext_input_username); - editPassword = findViewById(R.id.dialog_edittext_input_userpasswd); - layoutPassword = findViewById(R.id.dialog_linearlayout_input_userpasswd); - checkboxUsermodel = findViewById(R.id.dialog_checkbox_online_model); - checkboxUsermodel.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { - @Override - public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { - if (isChecked) layoutPassword.setVisibility(View.VISIBLE); - else layoutPassword.setVisibility(View.GONE); - } - }); - - views = new View[]{buttonOK, buttonCancel}; - for (View v : views) { - v.setOnClickListener(clickListener); - } - } - - private View.OnClickListener clickListener = new View.OnClickListener() { - - @Override - public void onClick(View v) { - - if (v == buttonOK) { - CreateNewUser(); - clearInfo(); - dismiss(); - } - if (v == buttonCancel) { - clearInfo(); - dismiss(); - } - } - }; - - /** - * 【添加一个新用户】 - **/ - private void CreateNewUser() { - SettingJson setting = com.aof.mcinabox.launcher.JsonUtils.getSettingFromFile(DataPathManifest.MCINABOX_FILE_JSON); - SettingJson.Accounts[] accounts = setting.getAccounts(); - SettingJson.Accounts newAccount = new SettingJson().newAccounts; - - - String username = editUsername.getText().toString(); - String userpasswd = editPassword.getText().toString(); - boolean usermodel = checkboxUsermodel.isChecked(); - - if (username.equals("")) { - Toast.makeText(mContext, mContext.getString(R.string.tips_user_nousername), Toast.LENGTH_SHORT).show(); - return; - } - if (accounts != null) { - for (SettingJson.Accounts account : accounts) { - if (account.getUsername().equals(username)) { - Toast.makeText(mContext, mContext.getString(R.string.tips_user_sameusername), Toast.LENGTH_SHORT).show(); - return; - } - } - } - if (usermodel) { - Toast.makeText(mContext, mContext.getString(R.string.tips_login_wait), Toast.LENGTH_SHORT).show(); - new Login(this, (MainActivity) mContext).execute(username, userpasswd); - //Must Stop here... - //The Online Account will be added in the OnlineLogin(String e). - return; - } else { - newAccount.setUsername(username); - newAccount.setType("offline"); - newAccount.setSelected(false); - newAccount.setUuid(UUID.nameUUIDFromBytes((username).getBytes()).toString()); - newAccount.setAccessToken("0"); - Toast.makeText(mContext, mContext.getString(R.string.tips_add_success), Toast.LENGTH_SHORT).show(); - } - - UserUI uiUser = ((MainActivity) mContext).uiUser; - uiUser.addFormedUser(newAccount); - - } - - public void OnlineLogin(String e) { - - SettingJson.Accounts newAccount = new SettingJson().newAccounts; - - if (e == null) { - SharedPreferences prefs = mContext.getSharedPreferences("launcher_prefs", 0); - String accessToken = prefs.getString("auth_accessToken", "0"); - String userUUID = prefs.getString("auth_profile_id", "00000000-0000-0000-0000-000000000000"); - String username = prefs.getString("auth_profile_name", "Player"); - - newAccount.setUsername(username); - newAccount.setType("online"); - newAccount.setSelected(false); - newAccount.setUuid(userUUID); - newAccount.setAccessToken(accessToken); - } else { - Toast.makeText(mContext, e, Toast.LENGTH_SHORT).show(); - } - - UserUI uiUser = ((MainActivity) mContext).uiUser; - uiUser.addFormedUser(newAccount); - - } - - /** - * 【清除输入缓存】 - **/ - private void clearInfo() { - editUsername.setText(""); - editPassword.setText(""); - checkboxUsermodel.setChecked(false); - layoutPassword.setVisibility(View.GONE); - } - - -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/DownloaderDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/DownloaderDialog.java index cb354f39..34fbe690 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/DownloaderDialog.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/dialogs/DownloaderDialog.java @@ -1,6 +1,7 @@ package com.aof.mcinabox.launcher.dialogs; -import android.os.Bundle; +import android.app.Dialog; +import android.content.Context; import android.util.Log; import android.view.View; import android.widget.Button; @@ -9,12 +10,12 @@ import android.widget.TextView; import android.widget.Toast; -import com.aof.mcinabox.DataPathManifest; import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.JsonUtils; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.download.support.DownloadSupport; import com.aof.mcinabox.launcher.uis.InstallVersionUI; -import com.aof.mcinabox.utils.FileTool; +import com.aof.utils.FileTool; import com.liulishuo.filedownloader.BaseDownloadTask; import com.liulishuo.filedownloader.FileDownloadListener; import com.liulishuo.filedownloader.FileDownloadQueueSet; @@ -23,39 +24,26 @@ import java.io.File; import java.util.ArrayList; -public class DownloaderDialog extends BaseDialog { +public class DownloaderDialog extends Dialog { public DownloaderDialog(MainActivity context, int layoutID){ - super(context,layoutID); + super(context); + this.mContext = context; + setContentView(R.layout.dialog_download); + initUI(); } + private Context mContext; private ProgressBar downloader_total_process,downloader_current_process; - private TextView downloader_total_count,downloader_current_count,downloader_current_task,downloader_target_version; + private TextView downloader_total_count,downloader_current_count,downloader_current_task,downloader_target_version; private Button download_ok,download_cancel; private ImageView finishMark; private FileDownloadQueueSet queueSet; - public com.aof.mcinabox.minecraft.DownloadMinecraft mDownloadMinecraft = new com.aof.mcinabox.minecraft.DownloadMinecraft();; - - - @Override - protected void onCreate(Bundle savedInstanceState) { - downloader_total_process = findViewById(R.id.dialog_total_process); - downloader_current_process = findViewById(R.id.dialog_current_process); - downloader_total_count = findViewById(R.id.dialog_total_count); - downloader_current_count = findViewById(R.id.dialog_current_count); - downloader_current_task = findViewById(R.id.dialog_process_name); - downloader_target_version = findViewById(R.id.dialog_version_id); - download_ok = findViewById(R.id.dialog_download_ok); - download_cancel = findViewById(R.id.dialog_download_cancle); - finishMark = findViewById(R.id.dialog_download_finish); - initDownloader(); + public DownloadSupport mDownloadSupport; - } + private void initUI(){ - private void initDownloader(){ - //初始化下载器 - FileDownloader.setup(mContext); - queueSet = new FileDownloadQueueSet(downloadListener); + queueSet = new FileDownloadQueueSet(new BoxFileDownloadListener()); } private void initDownloaderUI(String id){ @@ -107,7 +95,7 @@ public void startDownloadForge(String id){ StartDownload(7,id); } public void startDownloadManifest(){ - downloadTasks.add(mDownloadMinecraft.createVersionManifestDownloadTask()); + downloadTasks.add(mDownloadSupport.createVersionManifestDownloadTask()); StartDownloadQueueSet(queueSet,downloadTasks); } @@ -160,12 +148,7 @@ private void ChangeDownloadPrcess(int taskId,int currentProcess){ } private void fitness_attribute() { - String homePath; - if(JsonUtils.getSettingFromFile(DataPathManifest.MCINABOX_FILE_JSON).getLocalization().equals("private")){ - homePath = DataPathManifest.MCINABOX_DATA_PRIVATE; - }else{ - homePath = DataPathManifest.MCINABOX_DATA_PUBLIC; - } + String homePath = AppManifest.MINECRAFT_HOME; FileTool.checkFilePath(new File(homePath), true); FileTool.checkFilePath(new File(homePath + "/config"), true); String config_file = homePath + "/config/splash.properties"; @@ -178,24 +161,24 @@ private void fitness_attribute() { private void StartDownload(int totalProcess,String id){ switch(totalProcess){ case 1: - downloadTasks.add(mDownloadMinecraft.createVersionJsonDownloadTask(id)); + downloadTasks.add(mDownloadSupport.createVersionJsonDownloadTask(id)); StartDownloadQueueSet(queueSet,downloadTasks); break; case 2: - downloadTasks.add(mDownloadMinecraft.createVersionJarDownloadTask(id)); - downloadTasks.addAll(mDownloadMinecraft.createLibrariesDownloadTask(id)); + downloadTasks.add(mDownloadSupport.createVersionJarDownloadTask(id)); + downloadTasks.addAll(mDownloadSupport.createLibrariesDownloadTask(id)); StartDownloadQueueSet(queueSet,downloadTasks); break; case 3: - downloadTasks.add(mDownloadMinecraft.createAssetIndexDownloadTask(id)); + downloadTasks.add(mDownloadSupport.createAssetIndexDownloadTask(id)); StartDownloadQueueSet(queueSet,downloadTasks); break; case 4: - downloadTasks.addAll(mDownloadMinecraft.createAssetObjectsDownloadTask(id)); + downloadTasks.addAll(mDownloadSupport.createAssetObjectsDownloadTask(id)); StartDownloadQueueSet(queueSet,downloadTasks); break; case 7: - downloadTasks.addAll(mDownloadMinecraft.createForgeDownloadTask(id)); + downloadTasks.addAll(mDownloadSupport.createForgeDownloadTask(id)); StartDownloadQueueSet(queueSet,downloadTasks); break; } @@ -207,7 +190,7 @@ private void StartDownloadQueueSet(FileDownloadQueueSet queueSet, ArrayList adapterView, View view, int pos, long l) { - ChangeLauncherLanguage(listLanguages.getAdapter().getItem(pos).toString()); - dismiss(); - } - }); - } - - private void ChangeLauncherLanguage(String language){ - Resources resources = mContext.getResources(); - DisplayMetrics dm = resources.getDisplayMetrics(); - Configuration config = resources.getConfiguration(); - config.locale = LanguageUtils.getLocaleFromConfig(language); - resources.updateConfiguration(config, dm); - ((MainActivity)mContext).restartLauncher(); - } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/DownloadManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/DownloadManager.java new file mode 100644 index 00000000..790344ae --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/DownloadManager.java @@ -0,0 +1,219 @@ +package com.aof.mcinabox.launcher.download; + +import android.content.Context; +import android.util.Log; +import com.aof.mcinabox.launcher.download.support.DownloadSupport; +import com.aof.mcinabox.launcher.download.support.DownloaderDialog; +import com.aof.utils.FormatUtils; +import com.liulishuo.filedownloader.BaseDownloadTask; +import com.liulishuo.filedownloader.FileDownloadListener; +import com.liulishuo.filedownloader.FileDownloadQueueSet; +import com.liulishuo.filedownloader.FileDownloader; +import com.liulishuo.filedownloader.util.FileDownloadUtils; +import java.util.ArrayList; + +public class DownloadManager { + + private DownloadSupport mSupport; + private Context mContext; + private FileDownloadQueueSet mQueueSet; + private DownloaderDialog mDialog; + + public final static int DOWNLOAD_PRESET_MANIFEST = 0; + public final static int DOWNLOAD_PRESET_VERSION_JSON = 1; + public final static int DOWNLOAD_PRESET_VERSION_LIBS = 2; + public final static int DOWNLOAD_PRESET_VERSION_JAR = 3; + public final static int DOWNLOAD_PRESET_ASSETS_INDEX = 4; + public final static int DOWNLOAD_PRESET_ASSETS_OBJS = 5; + public final static int DOWNLOAD_FORGE_LIBS = 6; + + private final static String TAG = "DownloadManager"; + + private int currentPresetId; //当前预设id值 + private String currentVersionId; //当前版本名称 + private int taskCounts; //当前任务总数 + private int taskFinished = 0; //当前完成的任务数 + private boolean enablePreset; //启动预设下载模式 + + public DownloadManager(Context context) { + this.mSupport = new DownloadSupport(); + this.mContext = context; + this.mDialog = new DownloaderDialog(mContext, this); + FileDownloader.setup(mContext); + } + + /** + * [启动预设下载任务] + **/ + private ArrayList tasks = new ArrayList<>(); + + public void startPresetDownload(int presetId, String id) { + if(! this.enablePreset) { + this.enablePreset = true; + } + this.currentPresetId = presetId; + this.currentVersionId = id; + this.taskFinished = 0; + tasks.clear(); + String pgName; + int all, current; + switch (presetId) { + case DOWNLOAD_PRESET_MANIFEST: + tasks.add(mSupport.createVersionManifestDownloadTask()); + pgName = "正在下载清单文件..."; + all = 1; + current = 1; + break; + case DOWNLOAD_PRESET_VERSION_JSON: + this.mDialog = new DownloaderDialog(mContext,this); + tasks.add(mSupport.createVersionJsonDownloadTask(id)); + pgName = "正在下载版本信息..."; + all = 5; + current =1; + break; + case DOWNLOAD_PRESET_VERSION_LIBS: + tasks.addAll(mSupport.createLibrariesDownloadTask(id)); + pgName = "正在下载游戏依赖库..."; + all = 5; + current = 2; + break; + case DOWNLOAD_PRESET_VERSION_JAR: + tasks.add(mSupport.createVersionJarDownloadTask(id)); + pgName = "正在下载游戏主文件..."; + all = 5; + current = 3; + break; + case DOWNLOAD_PRESET_ASSETS_INDEX: + tasks.add(mSupport.createAssetIndexDownloadTask(id)); + pgName = "正在下载游戏资源文件信息..."; + all = 5; + current = 4; + break; + case DOWNLOAD_PRESET_ASSETS_OBJS: + tasks.addAll(mSupport.createAssetObjectsDownloadTask(id)); + pgName = "正在下载游戏资源文件..."; + all = 5; + current = 5; + break; + case DOWNLOAD_FORGE_LIBS: + tasks.addAll(mSupport.createForgeDownloadTask(id)); + pgName = "正在下载Forge依赖库..."; + all = 1; + current = 1; + break; + default: + return; + } + this.taskCounts = tasks.size(); + Log.e(TAG,"创建任务总数: " + tasks.size()); + for(BaseDownloadTask task : tasks){ + Log.e(TAG,"创建任务: " + task.getFilename()); + } + mQueueSet = new FileDownloadQueueSet(mFileDownloadListener); + mQueueSet.downloadSequentially(tasks); + mQueueSet.start(); + updateDialogUi(id,pgName,all,current); + } + + private void updateDialogUi(String versionId, String title, int all, int current) { + if (!mDialog.isShowing()) { + mDialog.show(); + } + mDialog.setId(versionId) + .setTitle(title) + .setTotalProgress(all,current); + } + + private void updateDialogUi(boolean success){ + if(success){ + mDialog.setFinished(); + }else{ + mDialog.setFailed(); + this.cancelDownload(); + } + } + + private FileDownloadListener mFileDownloadListener = new FileDownloadListener() { + + @Override + protected void pending(BaseDownloadTask task, int soFarBytes, int totalBytes) { + + Log.e(TAG,"加入等待队列:" + task.getFilename()); + + } + + @Override + protected void progress(BaseDownloadTask task, int soFarBytes, int totalBytes) { + + Log.e(TAG,"加入下载队列:" + task.getFilename()); + + //反馈下载速度 + if(currentPresetId == DOWNLOAD_PRESET_VERSION_JSON || currentPresetId == DOWNLOAD_PRESET_VERSION_JAR || currentPresetId == DOWNLOAD_PRESET_ASSETS_INDEX){ + mDialog.setCurrentProgress(soFarBytes *100 / totalBytes); + mDialog.setSpeed(FormatUtils.formatDataTransferSpeed(task.getSpeed(),FormatUtils.CAPACITY_TYPE_KBYTE,FormatUtils.DTS_TYPE_S)); + } + //反馈文件名称 + if(currentPresetId != DOWNLOAD_PRESET_MANIFEST){ + mDialog.setFileName(task.getFilename()); + } + + } + + @Override + protected void completed(BaseDownloadTask task) { + + Log.e(TAG,"完成:" + task.getFilename() + " 模式: " + enablePreset); + if(enablePreset){ + taskFinished++; + if(currentPresetId == DOWNLOAD_FORGE_LIBS || currentPresetId == DOWNLOAD_PRESET_VERSION_LIBS || currentPresetId == DOWNLOAD_PRESET_ASSETS_OBJS){ + mDialog.setSpeed(FormatUtils.formatDataTransferSpeed(task.getSpeed(),FormatUtils.CAPACITY_TYPE_KBYTE,FormatUtils.DTS_TYPE_S)); + } + mDialog.setCurrentProgress(taskFinished * 100 / taskCounts); + if(taskCounts == taskFinished){ + taskFinished = 0; + if(currentPresetId != DOWNLOAD_PRESET_ASSETS_OBJS && currentPresetId != DOWNLOAD_FORGE_LIBS){ + startPresetDownload(currentPresetId + 1, currentVersionId); + }else{ + updateDialogUi(true); + } + } + }else{ + mRunable.run(); + } + } + + @Override + protected void paused(BaseDownloadTask task, int soFarBytes, int totalBytes) { + + } + + @Override + protected void error(BaseDownloadTask task, Throwable e) { + updateDialogUi(false); + Log.e(TAG,"失败:" + task.getFilename()); + Log.e(TAG,"信息: " + e.getMessage() + " 原因: " + e.getCause()); + } + + @Override + protected void warn(BaseDownloadTask task) { + Log.e(TAG,"警告:" + task.getFilename()); + } + }; + + private Runable mRunable; + public void downloadManifestAndUpdateGameListUi(Runable r){ + mQueueSet = new FileDownloadQueueSet(mFileDownloadListener); + mQueueSet.downloadSequentially(mSupport.createVersionManifestDownloadTask()); + mQueueSet.start(); + this.mRunable = r; + } + + public class Runable{ + public void run(){} + } + + public void cancelDownload(){ + new FileDownloader().pauseAll(); + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/utils/downloader/DownloadHelper.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloadHelper.java similarity index 74% rename from mcinabox/src/main/java/com/aof/mcinabox/utils/downloader/DownloadHelper.java rename to mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloadHelper.java index 42fb2c90..8ef78732 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/utils/downloader/DownloadHelper.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloadHelper.java @@ -1,9 +1,9 @@ -package com.aof.mcinabox.utils.downloader; +package com.aof.mcinabox.launcher.download.support; import android.util.Log; - import androidx.annotation.Nullable; +import com.aof.mcinabox.definitions.manifest.AppManifest; import com.liulishuo.filedownloader.BaseDownloadTask; import com.liulishuo.filedownloader.FileDownloader; @@ -14,9 +14,9 @@ public static BaseDownloadTask createDownloadTask(String filepath, String url, @ Log.e("DownloadHelper","Url: "+url+" Filepath: "+ filepath); if(tag == null){ //filepath是下载文件的绝对路径而不是目录 - return FileDownloader.getImpl().create(url).setPath(filepath); + return FileDownloader.getImpl().create(url).setPath(filepath).addHeader("User-Agent", AppManifest.APP_NAME + "/" + AppManifest.MCINABOX_VERSION_NAME); }else{ - return FileDownloader.getImpl().create(url).setPath(filepath).setTag(tag); + return FileDownloader.getImpl().create(url).setPath(filepath).setTag(tag).addHeader("User-Agent", AppManifest.APP_NAME + "/" + AppManifest.MCINABOX_VERSION_NAME); } } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/minecraft/DownloadMinecraft.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloadSupport.java similarity index 53% rename from mcinabox/src/main/java/com/aof/mcinabox/minecraft/DownloadMinecraft.java rename to mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloadSupport.java index b2ee04ba..e19d4512 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/minecraft/DownloadMinecraft.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloadSupport.java @@ -1,51 +1,28 @@ -package com.aof.mcinabox.minecraft; +package com.aof.mcinabox.launcher.download.support; import android.util.Log; - - -import com.aof.mcinabox.launcher.UrlSource; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.launch.support.Utils; import com.aof.mcinabox.minecraft.json.AssetsJson; import com.aof.mcinabox.minecraft.json.VersionJson; import com.aof.mcinabox.minecraft.json.VersionManifestJson; -import com.aof.mcinabox.utils.downloader.DownloadHelper; import com.liulishuo.filedownloader.BaseDownloadTask; - import java.util.ArrayList; -import java.util.Iterator; +import java.util.Objects; import java.util.Set; -import static com.aof.sharedmodule.Data.DataPathManifest.*; - -public class DownloadMinecraft { - private String MINECRAFT_HOME; - private String MINECRAFT_HOME_VERSION; - private String MINECRAFT_HOME_ASSETS; - private String MINECRAFT_HOME_LIBRARIES; - private String MINECRAFT_TEMP = MCINABOX_TEMP; +public class DownloadSupport { private UrlSource urlSource; private String sourceName; - public DownloadMinecraft(){ + private final static String TAG = "DownloadSupport"; + + public DownloadSupport(){ sourceName = getSourceName(); - MINECRAFT_HOME = getMinecraftHomePath(); - MINECRAFT_HOME_VERSION = MINECRAFT_HOME + "/versions"; - MINECRAFT_HOME_ASSETS = MINECRAFT_HOME + "/assets"; - MINECRAFT_HOME_LIBRARIES = MINECRAFT_HOME + "/libraries"; urlSource = new UrlSource(); } - private String getMinecraftHomePath(){ - switch(com.aof.mcinabox.launcher.JsonUtils.getSettingFromFile(MCINABOX_FILE_JSON).getLocalization()){ - case "private": - return MINECRAFT_DATA_PRIVATE; - case "public": - return MINECRAFT_DATA_PUBLIC; - default: - Log.e("DownloadMinecraft","Can't get minecraft home path."); - return null; - } - } - private String getDownloadUrlFromSource(String url,String type){ return urlSource.getFileUrl(url,sourceName,type); } @@ -54,55 +31,56 @@ private String getDownloadUrlFromLibraryName(String name,String type){ } private String getSourceName(){ - return com.aof.mcinabox.launcher.JsonUtils.getSettingFromFile(MCINABOX_FILE_JSON).getDownloadType(); + return MainActivity.Setting.getDownloadType(); } /**【创建version_manifest.json下载任务】**/ public BaseDownloadTask createVersionManifestDownloadTask(){ RefreshSourceName(); - Log.e("Downloader","文件路径:"+this.MINECRAFT_TEMP+" 文件url:" +urlSource.getFileUrl(urlSource.getSourceUrl("official","version_manifest_json"),sourceName,"version_manifest_json")); - return DownloadHelper.createDownloadTask("version_manifest.json",this.MINECRAFT_TEMP,urlSource.getFileUrl(urlSource.getSourceUrl("official","version_manifest_json"),sourceName,"version_manifest_json"),1); + return DownloadHelper.createDownloadTask("version_manifest.json", AppManifest.MCINABOX_TEMP ,urlSource.getFileUrl(urlSource.getSourceUrl("official",UrlSource.TYPE_VERSION_MANIFEST),sourceName,UrlSource.TYPE_VERSION_MANIFEST),1); } /**【创建version.json下载任务】**/ public BaseDownloadTask createVersionJsonDownloadTask(String id){ RefreshSourceName(); - VersionManifestJson.Version[] versions = com.aof.mcinabox.minecraft.JsonUtils.getVersionManifestFromFile(this.MINECRAFT_TEMP + "/version_manifest.json").getVersions(); + VersionManifestJson.Version[] versions = com.aof.mcinabox.minecraft.JsonUtils.getVersionManifestFromFile(AppManifest.MCINABOX_TEMP + "/version_manifest.json").getVersions(); if(versions == null){ - Log.e("DownloadMinecraft","Not found version_manifest from json."); + Log.e(TAG,"Not found version_manifest from json."); return null; } for(VersionManifestJson.Version version: versions){ if(version.getId().equals(id)){ - return DownloadHelper.createDownloadTask(id + ".json",MINECRAFT_HOME_VERSION + "/" + id,getDownloadUrlFromSource(version.getUrl(),"version_json"),null); + return DownloadHelper.createDownloadTask(id + ".json",AppManifest.MINECRAFT_VERSIONS + "/" + id,getDownloadUrlFromSource(version.getUrl(),UrlSource.TYPE_VERSION_JSON),null); } } - Log.e("DownloadMinecraft","Not found version " + id + " in manifest."); + Log.e(TAG,"Not found version " + id + " in manifest."); return null; } /**【创建version.jar下载任务】**/ public BaseDownloadTask createVersionJarDownloadTask(String id){ RefreshSourceName(); - VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(MINECRAFT_HOME_VERSION + "/" + id + "/" + id + ".json"); + VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(id)); if(version == null){ - Log.e("DownloadMinecraft","Not found Version " + id + ".json"); + Log.e(TAG,"Not found Version " + id + ".json"); } - return DownloadHelper.createDownloadTask(id + ".jar", MINECRAFT_HOME_VERSION + "/" + id, getDownloadUrlFromSource(version.getDownloads().getClient().getUrl(),"version_jar"),null); + return DownloadHelper.createDownloadTask(id + ".jar", AppManifest.MINECRAFT_VERSIONS + "/" + id, + getDownloadUrlFromSource(Objects.requireNonNull(version).getDownloads().getClient().getUrl(), UrlSource.TYPE_VERSION_JAR),null); } /**【创建libraries下载任务】**/ public ArrayList createLibrariesDownloadTask(String id){ RefreshSourceName(); - ArrayList tasks = new ArrayList(); - VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(MINECRAFT_HOME_VERSION + "/" + id + "/" + id + ".json"); + ArrayList tasks = new ArrayList<>(); + VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(id)); if(version == null){ - Log.e("DownloadMinecraft","Not found Version " + id + ".json"); + Log.e(TAG,"Not found Version " + id + ".json"); return null; } for(VersionJson.DependentLibrary library : version.getLibraries()){ if(library.getDownloads().getArtifact() != null){ - tasks.add(DownloadHelper.createDownloadTask(getLibraryJarName(library.getName()),getLibraryJarPath(library.getName()),getDownloadUrlFromSource(library.getDownloads().getArtifact().getUrl(),"libraries"),null)); + tasks.add(DownloadHelper.createDownloadTask(getLibraryJarName(library.getName()),getLibraryJarPath(library.getName()) + ,getDownloadUrlFromSource(library.getDownloads().getArtifact().getUrl(),UrlSource.TYPE_LIBRARIES),null)); } } return tasks; @@ -111,38 +89,33 @@ public ArrayList createLibrariesDownloadTask(String id){ /**【创建assetindex.json下载任务】**/ public BaseDownloadTask createAssetIndexDownloadTask(String id){ RefreshSourceName(); - VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(MINECRAFT_HOME_VERSION + "/" + id + "/" + id + ".json"); + VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(id)); if(version == null){ - Log.e("DownloadMinecraft","Not found Version " + id + ".json"); + Log.e(TAG,"Not found Version " + id + ".json"); return null; } - return DownloadHelper.createDownloadTask(version.getAssets() + ".json",MINECRAFT_HOME_ASSETS + "/indexes",getDownloadUrlFromSource(version.getAssetIndex().getUrl(),"assetsIndex_json"),null); + return DownloadHelper.createDownloadTask(version.getAssets() + ".json",AppManifest.MINECRAFT_ASSETS + "/indexes",getDownloadUrlFromSource(version.getAssetIndex().getUrl(),UrlSource.TYPE_ASSETS_INDEX_JSON),null); } /**【创建assets下载任务】**/ public ArrayList createAssetObjectsDownloadTask(String id){ RefreshSourceName(); - ArrayList tasks = new ArrayList(); - VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(MINECRAFT_HOME_VERSION + "/" + id + "/" + id + ".json"); + ArrayList tasks = new ArrayList<>(); + VersionJson version = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile( Utils.getJsonAbsPath(id)); if(version == null){ - Log.e("DownloadMinecraft","Not found Version " + id + ".json"); + Log.e(TAG,"Not found Version " + id + ".json"); return null; } - AssetsJson assets = com.aof.mcinabox.minecraft.JsonUtils.getAssetsFromFile(MINECRAFT_HOME_ASSETS + "/indexes/" + version.getAssets() + ".json"); + AssetsJson assets = com.aof.mcinabox.minecraft.JsonUtils.getAssetsFromFile( Utils.getAssetsJsonAbsPath(version.getAssets())); if(assets == null){ - Log.e("DownloadMinecraft","Not found AssetIndex " + version.getAssets() + ".json"); + Log.e(TAG,"Not found AssetIndex " + version.getAssets() + ".json"); return null; } Set keySets = assets.getObjects().keySet(); - //利用了Iterator迭代器 - Iterator it = keySets.iterator(); - while (it.hasNext()) { - //得到每一个key - String key = it.next(); - //通过key获取对应的value - String hashCode = assets.getObjects().get(key).hash; - tasks.add(DownloadHelper.createDownloadTask(hashCode,getAssetsObjectPath(hashCode),getAssetsObjectUrl(hashCode),null)); + for (String key : keySets) { + String hashCode = Objects.requireNonNull(assets.getObjects().get(key)).hash; + tasks.add(DownloadHelper.createDownloadTask(hashCode, getAssetsObjectPath(hashCode), getAssetsObjectUrl(hashCode), null)); } return tasks; } @@ -150,10 +123,10 @@ public ArrayList createAssetObjectsDownloadTask(String id){ /**【创建forge下载任务】**/ public ArrayList createForgeDownloadTask(String id){ RefreshSourceName(); - ArrayList tasks = new ArrayList(); - VersionJson forge = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(MINECRAFT_HOME_VERSION + "/" + id + "/" + id + ".json"); + ArrayList tasks = new ArrayList<>(); + VersionJson forge = com.aof.mcinabox.minecraft.JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(id)); if(forge == null){ - Log.e("DownloadMinecraft","Not found Forge " + id + ".json"); + Log.e(TAG,"Not found Forge " + id + ".json"); return null; } for(VersionJson.DependentLibrary library : forge.getLibraries()){ @@ -177,20 +150,20 @@ private String getLibraryJarRelatedPath(String name){ libraryName = Name[1]; versionName = Name[2]; - String dirPath ="/"; + StringBuilder dirPath = new StringBuilder("/"); for(int i =0;i < packageName.length();i++){ if(packageName.charAt(i) == '.'){ - dirPath = dirPath + "/"; + dirPath.append("/"); }else{ - dirPath = dirPath + packageName.charAt(i); + dirPath.append(packageName.charAt(i)); } } - dirPath = dirPath + "/" + libraryName + "/" + versionName; - return dirPath; + dirPath.append("/").append(libraryName).append("/").append(versionName); + return dirPath.toString(); } private String getLibraryJarPath(String name){ - return MINECRAFT_HOME_LIBRARIES + getLibraryJarRelatedPath(name); + return AppManifest.MINECRAFT_LIBRARIES + getLibraryJarRelatedPath(name); } private String getLibraryJarName(String name){ @@ -205,21 +178,19 @@ private String getLibraryJarName(String name){ } private String getAssetsObjectUrl(String hashCode){ - String tip = ""; + StringBuilder tip = new StringBuilder(); for(int i=0;i<2;i++){ - tip = tip + hashCode.charAt(i); + tip.append(hashCode.charAt(i)); } - String fileUrl = urlSource.getSourceUrl(sourceName,"assets") + "/" + tip + "/" + hashCode; - return fileUrl; + return urlSource.getSourceUrl(sourceName,"assets") + "/" + tip + "/" + hashCode; } private String getAssetsObjectPath(String hashCode){ - String tip = ""; + StringBuilder tip = new StringBuilder(); for(int i=0;i<2;i++){ - tip = tip + hashCode.charAt(i); + tip.append(hashCode.charAt(i)); } - String filePath = MINECRAFT_HOME_ASSETS + "/objects/" + tip; - return filePath; + return AppManifest.MINECRAFT_ASSETS + "/objects/" + tip; } public void RefreshSourceName(){ sourceName = getSourceName(); diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloaderDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloaderDialog.java new file mode 100644 index 00000000..81d6f2d7 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/DownloaderDialog.java @@ -0,0 +1,147 @@ +package com.aof.mcinabox.launcher.download.support; + +import android.app.Dialog; +import android.content.Context; +import android.content.DialogInterface; +import android.view.View; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.ProgressBar; +import android.widget.TextView; +import androidx.annotation.NonNull; +import com.aof.mcinabox.R; +import com.aof.mcinabox.launcher.download.DownloadManager; +import com.aof.utils.dialog.support.DialogSupports; +import com.aof.utils.dialog.DialogUtils; + +public class DownloaderDialog extends Dialog implements Dialog.OnCancelListener, View.OnClickListener{ + + private Context mContext; + private DownloadManager mDownloadManager; + private final static String TAG = "DownloaderDialog"; + + private Button buttonOK; + private Button buttonCancel; + private ImageView ivFinish; + private TextView textProgress; + private TextView textProgressName; + private TextView textCurrentPrecentage; + private TextView textVersionId; + private TextView textSpeed; + private TextView textFileName; + private ProgressBar pbTotal; + private ProgressBar pbCurrent; + + public DownloaderDialog(@NonNull Context context, DownloadManager manager) { + super(context); + setContentView(R.layout.dialog_download); + setCancelable(false); + this.mContext = context; + this.mDownloadManager = manager; + init(); + } + + private void init(){ + buttonOK = findViewById(R.id.dialog_download_button_ok); + buttonCancel = findViewById(R.id.dialog_download_button_cancle); + ivFinish = findViewById(R.id.dialog_download_image_finish); + textProgress = findViewById(R.id.dialog_download_text_progress); + textProgressName = findViewById(R.id.dialog_download_text_progress_name); + textCurrentPrecentage = findViewById(R.id.dialog_download_text_percentage); + textVersionId = findViewById(R.id.dialog_download_text_versionid); + textSpeed = findViewById(R.id.dialog_download_text_speed); + textFileName = findViewById(R.id.dialog_download_text_filename); + pbCurrent = findViewById(R.id.dialog_download_processbar_current); + pbTotal = findViewById(R.id.dialog_download_processbar_total); + + //设置监听器 + for(View v : new View[]{buttonCancel,buttonOK}){ + v.setOnClickListener(this); + } + //设置控件属性 + pbTotal.setMax(100); + pbCurrent.setMax(100); + setOnCancelListener(this); + buttonOK.setVisibility(View.INVISIBLE); + } + + + @Override + public void onCancel(DialogInterface dialog) { + mDownloadManager.cancelDownload(); + } + + @Override + public void onClick(View v) { + if(v == buttonOK){ + dismiss(); + } + + if(v == buttonCancel){ + DialogUtils.createBothChoicesDialog(mContext,"警告","你确定要取消下载任务吗?该操作不会改变已经下载的内容。","确定","取消",new DialogSupports(){ + @Override + public void runWhenPositive(){ + DownloaderDialog.this.cancel(); + } + }); + } + } + + public DownloaderDialog setId(String id){ + this.textVersionId.setText(id); + return this; + } + + public DownloaderDialog setTitle(String title){ + this.textProgressName.setText(title); + return this; + } + + public DownloaderDialog setTotalProgress(int all, int current){ + this.pbTotal.setProgress(current *100 / all); + this.textProgress.setText(current + "/" + all); + return this; + } + + public DownloaderDialog setCurrentProgress(int progress){ + this.pbCurrent.setProgress(progress); + this.textCurrentPrecentage.setText(progress + "%"); + return this; + } + + public DownloaderDialog setFinished(){ + this.ivFinish.setVisibility(View.VISIBLE); + this.textProgress.setVisibility(View.GONE); + this.textProgressName.setText("下载完成"); + this.buttonOK.setVisibility(View.VISIBLE); + this.buttonCancel.setVisibility(View.GONE); + return this; + } + + public DownloaderDialog setFailed(){ + this.textProgressName.setText("下载失败"); + return this; + } + + public DownloaderDialog restoreStat(){ + this.ivFinish.setVisibility(View.GONE); + this.textProgress.setVisibility(View.VISIBLE); + setTitle(""); + setId(""); + setCurrentProgress(0); + setTotalProgress(1,0); + return this; + } + + public DownloaderDialog setSpeed(String speed){ + this.textSpeed.setText(speed); + return this; + } + + public DownloaderDialog setFileName(String name){ + this.textFileName.setText(name); + return this; + } + + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/UrlSource.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/UrlSource.java new file mode 100644 index 00000000..36f3b153 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/download/support/UrlSource.java @@ -0,0 +1,81 @@ +package com.aof.mcinabox.launcher.download.support; + +import android.util.Log; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import java.util.HashMap; +import java.util.Objects; + +public class UrlSource { + + public HashMap> SourceMap; + + public final static String TYPE_VERSION_MANIFEST = "version_manifest_json"; + public final static String TYPE_VERSION_JSON = "version_json"; + public final static String TYPE_VERSION_JAR = "version_jar"; + public final static String TYPE_ASSETS_INDEX_JSON = "assetsIndex_json"; + public final static String TYPE_ASSETS_OBJS = "assets"; + public final static String TYPE_LIBRARIES = "libraries"; + public final static String TYPE_FORGE_LIBRARIES = "forge"; + public final static String TYPE_LITELOADER_VERSION_JSON = "liteloader_version_json"; + + public UrlSource(){ + initSourceMap(new String[][] { + //官方下载源 + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_VERSION_MANIFEST,"https://launchermeta.mojang.com/mc/game/version_manifest.json"}, + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_VERSION_JSON,"https://launchermeta.mojang.com"}, + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_VERSION_JAR,"https://launcher.mojang.com"}, + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_ASSETS_INDEX_JSON,"https://launchermeta.mojang.com"}, + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_ASSETS_OBJS,"http://resources.download.minecraft.net"}, + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_LIBRARIES,"https://libraries.minecraft.net"}, + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_FORGE_LIBRARIES,"https://files.minecraftforge.net/maven"}, + {SettingJson.DOWNLOAD_SOURCE_OFFICIAL,TYPE_LITELOADER_VERSION_JSON,"http://dl.liteloader.com/versions/versions.json"}, + //BMCLAPI下载源 + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_VERSION_MANIFEST,"https://bmclapi2.bangbang93.com/mc/game/version_manifest.json"}, + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_VERSION_JSON,"https://bmclapi2.bangbang93.com"}, + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_VERSION_JAR,"https://bmclapi2.bangbang93.com"}, + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_ASSETS_INDEX_JSON,"https://bmclapi2.bangbang93.com"}, + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_ASSETS_OBJS,"https://bmclapi2.bangbang93.com/assets"}, + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_LIBRARIES,"https://bmclapi2.bangbang93.com/maven"}, + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_FORGE_LIBRARIES,"https://bmclapi2.bangbang93.com/maven"}, + {SettingJson.DOWNLOAD_SOURCE_BMCLAPI,TYPE_LITELOADER_VERSION_JSON,"https://bmclapi.bangbang93.com/maven/com/mumfrey/liteloader/versions.json"}, + //MCBBS下载源 + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_VERSION_MANIFEST,"https://download.mcbbs.net/mc/game/version_manifest.json"}, + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_VERSION_JSON,"https://download.mcbbs.net"}, + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_VERSION_JAR,"https://download.mcbbs.net"}, + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_ASSETS_INDEX_JSON,"https://download.mcbbs.net"}, + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_ASSETS_OBJS,"https://download.mcbbs.net/assets"}, + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_LIBRARIES,"https://download.mcbbs.net/maven"}, + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_FORGE_LIBRARIES,"https://download.mcbbs.net/maven"}, + {SettingJson.DOWNLOAD_SOURCE_MCBBS,TYPE_LITELOADER_VERSION_JSON,"https://download.mcbbs.net/maven/com/mumfrey/liteloader/versions.json"}, + }); + } + + //String ... {{sourceName,Type,Url}, ...} + private void initSourceMap(String[][] originMap){ + SourceMap = new HashMap<>(); + for(String[] couple : originMap){ + if(SourceMap.containsKey(couple[0])){ + Objects.requireNonNull(SourceMap.get(couple[0])).put(couple[1],couple[2]); + }else{ + HashMap tmp = new HashMap<>(); + tmp.put(couple[1],couple[2]); + SourceMap.put(couple[0],tmp); + } + } + } + + public String getSourceUrl(String sourceName,String type){ + Log.e("SourceUrl","下载源:"+sourceName+" 类型:"+type); + return Objects.requireNonNull(SourceMap.get(sourceName)).get(type); + } + public String getFileUrl(String originUrl,String sourceName, String type){ + String convertedUrl; + StringBuilder Str1 = new StringBuilder(); + String Str2 = getSourceUrl(SettingJson.DOWNLOAD_SOURCE_OFFICIAL,type); + for(int i = Str2.length(); i < originUrl.length() ; i++){ + Str1.append(originUrl.charAt(i)); + } + convertedUrl = getSourceUrl(sourceName,type) + Str1; + return convertedUrl; + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/gamedir/GamedirManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/gamedir/GamedirManager.java new file mode 100644 index 00000000..f11c5e87 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/gamedir/GamedirManager.java @@ -0,0 +1,45 @@ +package com.aof.mcinabox.launcher.gamedir; + +import android.content.Context; +import android.util.Log; + +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.utils.FileTool; + +import java.io.File; + +public class GamedirManager { + + private final static String TAG = "GamedirManager"; + + public final static String PUBLIC_GAMEDIR = SettingJson.DEFAULT_GAMEDIR; + public final static String PRIVATE_GAMEDIR = AppManifest.MCINABOX_HOME + "/gamedir"; + + public static boolean setGamedir(Context context, SettingJson setting, String gamedir){ + if(gamedir != null){ + File file = new File(gamedir); + if(file.exists() && !file.isDirectory()){ + return false; + }else if(!file.exists()){ + if(!FileTool.makeFloder(file)){ + return false; + } + } + setting.setGameDir(gamedir); + AppManifest.initManifest(context,gamedir); + return true; + }else{ + return false; + } + } + + public static String getGamedir(SettingJson setting){ + if(setting.getGamedir() != null){ + return setting.getGamedir(); + }else{ + return SettingJson.DEFAULT_GAMEDIR; + } + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/ArgsJson.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/ArgsJson.java deleted file mode 100644 index d7307c50..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/ArgsJson.java +++ /dev/null @@ -1,5 +0,0 @@ -package com.aof.mcinabox.launcher.json; - -import java.io.Serializable; - -public class ArgsJson extends com.aof.sharedmodule.Model.ArgsModel implements Serializable {} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/KeyboardJson.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/KeyboardJson.java deleted file mode 100644 index f08c9001..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/KeyboardJson.java +++ /dev/null @@ -1,8 +0,0 @@ -package com.aof.mcinabox.launcher.json; - -public class KeyboardJson extends com.aof.sharedmodule.Model.KeyboardJsonModel { - public KeyboardJson(String keyName, int keySizeW, int keySizeH, float keyLX, float keyLY, String keyMain, String specialOne, String specialTwo, boolean isAutoKeep, boolean isHide, boolean isMult, int mainPos, int specialOnePos, int specialTwoPos, String colorhex, int radius) { - super(keyName,keySizeW,keySizeH,keyLX,keyLY,keyMain,specialOne,specialTwo,isAutoKeep,isHide,isMult,mainPos,specialOnePos,specialTwoPos,colorhex,radius); - } - -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/RuntimeJson.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/RuntimeJson.java deleted file mode 100644 index bd6cc0c0..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/RuntimeJson.java +++ /dev/null @@ -1,67 +0,0 @@ -package com.aof.mcinabox.launcher.json; - -public class RuntimeJson { - private String PackName; //运行库包名 - private String ReleaseTime; //发行日期 - private String Platform; //架构 - private String JavaVersion; //Java版本 - private String OpenGLVersion; //OpenGL版本 - private String OpenALVersion; //OpenAL版本 - private String Lwjgl2Version; //Lwjgl2版本 - private String Lwjgl3Version; //Lwjgl3版本 - - public String getPackName() { - return PackName; - } - public void setPackName(String packName) { - PackName = packName; - } - public String getReleaseTime() { - return ReleaseTime; - } - public void setReleaseTime(String releaseTime) { - ReleaseTime = releaseTime; - } - public String getPlatform() { - return Platform; - } - public void setPlatform(String platform) { - Platform = platform; - } - public String getJavaVersion() { - return JavaVersion; - } - public void setJavaVersion(String javaVersion) { - JavaVersion = javaVersion; - } - public String getOpenGLVersion() { - return OpenGLVersion; - } - public void setOpenGLVersion(String openGLVersion) { - OpenGLVersion = openGLVersion; - } - - public String getOpenALVersion() { - return OpenALVersion; - } - - public void setOpenALVersion(String openALVersion) { - OpenALVersion = openALVersion; - } - - public String getLwjgl2Version() { - return Lwjgl2Version; - } - - public void setLwjgl2Version(String lwjgl2Version) { - Lwjgl2Version = lwjgl2Version; - } - - public String getLwjgl3Version() { - return Lwjgl3Version; - } - - public void setLwjgl3Version(String lwjgl3Version) { - Lwjgl3Version = lwjgl3Version; - } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/SettingJson.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/SettingJson.java deleted file mode 100644 index 919726d6..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/json/SettingJson.java +++ /dev/null @@ -1,101 +0,0 @@ -package com.aof.mcinabox.launcher.json; - -import android.annotation.SuppressLint; -import android.text.Html; - -public class SettingJson { - - - public Accounts newAccounts = new Accounts(); - - - public SettingJson(){ - //默认模板初始化 - super(); - - downloadType = "official"; - keyboard = ""; - localization = "public"; - language = "default(system)"; //default: Definited By System. - lastVersion = ""; - - configurations = new Configurations(); - configurations.javaArgs = ""; - configurations.minecraftArgs = ""; - configurations.maxMemory = 256; - configurations.notCheckGame = false; - configurations.notCheckJvm = false; - - accounts = new Accounts[0]; - } - - - - private String localization; //存储路径:"public"共有目录 "private"私有目录 - private String downloadType; //下载源:"office"官方 "bmclapi"国内BMCLAPI "mcbbs"国内MCBBS - private String keyboard; //虚拟键盘: ""选择的键盘模板 - private Configurations configurations; //全局游戏设置 - private Accounts[] accounts; //用户信息 - private String language; //语言 - private String lastVersion; //最后一次选择的版本 - - //全局游戏设置 - public class Configurations{ - String javaArgs; //Java虚拟机附加启动参数 - String minecraftArgs; //Minecraft附加启动参数 - int maxMemory; //最大内存 - boolean notCheckGame; //启动时不检查游戏完整性 - boolean notCheckJvm; //启动时不检查JVM架构的兼容性 - - //Getter and Setter - public String getJavaArgs() { return javaArgs; } - public void setJavaArgs(String javaArgs) { this.javaArgs = javaArgs; } - public String getMinecraftArgs() { return minecraftArgs; } - public void setMinecraftArgs(String minecraftArgs) { this.minecraftArgs = minecraftArgs; } - public int getMaxMemory() { return maxMemory; } - public void setMaxMemory(int maxMemory) { this.maxMemory = maxMemory; } - public boolean isNotCheckGame() { return notCheckGame; } - public void setNotCheckGame(boolean notCheckGame) { this.notCheckGame = notCheckGame; } - public boolean isNotCheckJvm() { return notCheckJvm; } - public void setNotCheckJvm(boolean notCheckJvm){ this.notCheckJvm = notCheckJvm; } - } - - - //用户列表 - public class Accounts{ - String uuid; //唯一用户标识 - String username; //用户名 - String type; //用户类型 "offline"离线模式 "online"线上模式 - String accessToken; //通行令牌 - boolean selected; //是否被选中 - - //Getter and Setter - public String getUuid() { return uuid; } - public void setUuid(String uuid) { this.uuid = uuid; } - public String getUsername() { return username; } - public void setUsername(String username) { this.username = username; } - public String getType() { return type; } - public void setType(String type) { this.type = type; } - public boolean isSelected() { return selected; } - public void setSelected(boolean selected) { this.selected = selected; } - public String getAccessToken() { return accessToken;} - public void setAccessToken(String accessToken) {this.accessToken = accessToken;} - - } - - //Getter and Setter - public String getLanguage() { return language; } - public void setLanguage(String language) { this.language = language; } - public String getLocalization() { return localization; } - public void setLocalization(String localization) { this.localization = localization; } - public String getDownloadType() { return downloadType; } - public void setDownloadType(String downloadType) { this.downloadType = downloadType; } - public String getKeyboard() { return keyboard; } - public void setKeyboard(String keyboard) { this.keyboard = keyboard; } - public Configurations getConfigurations() { return configurations; } - public void setConfigurations(Configurations configurations) { this.configurations = configurations; } - public Accounts[] getAccounts() { return accounts; } - public void setAccounts(Accounts[] accounts) { this.accounts = accounts; } - public String getLastVersion() { return lastVersion; } - public void setLastVersion(String lastVersion) { this.lastVersion = lastVersion; } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/ConfigDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/ConfigDialog.java deleted file mode 100644 index e0ead190..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/ConfigDialog.java +++ /dev/null @@ -1,28 +0,0 @@ -package com.aof.mcinabox.launcher.keyboard; - -import android.app.Dialog; -import android.content.Context; -import android.os.Bundle; - - -import com.aof.mcinabox.R; - -public class ConfigDialog extends Dialog { - - public ConfigDialog(Context context,int id,boolean isCanceledOnTouchOutside){ - super(context,R.style.NormalDialog); - this.isCanceledOnTouchOutside = isCanceledOnTouchOutside; - setContentView(id); - } - - private boolean isCanceledOnTouchOutside; - @Override - protected void onCreate(Bundle savedInstanceState){ - super.onCreate(savedInstanceState); - } - - @Override - public void setCanceledOnTouchOutside(boolean cancel) { - super.setCanceledOnTouchOutside(isCanceledOnTouchOutside); - } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/GameButton.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/GameButton.java deleted file mode 100644 index df611e6d..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/keyboard/GameButton.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aof.mcinabox.launcher.keyboard; - -import android.content.Context; - -public class GameButton extends com.aof.sharedmodule.Button.GameButton{ - public GameButton(Context context){ - super(context); - } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LangManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LangManager.java new file mode 100644 index 00000000..c4fe4720 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LangManager.java @@ -0,0 +1,59 @@ +package com.aof.mcinabox.launcher.lang; + +import android.content.Context; +import android.content.Intent; +import android.content.SharedPreferences; +import android.util.Log; +import androidx.annotation.NonNull; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.launcher.lang.support.LanguageUtils; + +public class LangManager { + private final static String TAG = " LangManager"; + private final static String spFileName = "lang"; + private final static int spMode = Context.MODE_PRIVATE; + private final static String sp_lang_tag = "lang"; + private static boolean hasFitted = false; + + private Context mContext; + + public LangManager(Context context){ + super(); + this.mContext = context; + } + + public boolean fitSystemLang(){ + if(hasFitted){ + hasFitted = false; + return true; + } + SharedPreferences sp = mContext.getSharedPreferences(spFileName,spMode); + String langData = sp.getString(sp_lang_tag, LanguageUtils.TAG_SYSTEM); + LanguageUtils.switchLang( mContext,LanguageUtils.getLocaleFromConfig(langData)); + hasFitted = true; + Log.e(TAG, "fitted"); + restartActivity(); + return false; + } + + public void switchLang(@NonNull String tag){ + boolean included = false; + for(String str : LanguageUtils.LANG_TAGS){ + if(str.equals(tag)){ + included = true; + } + } + if(!included){ + return; + } + LanguageUtils.switchLang(mContext,LanguageUtils.getLocaleFromConfig(tag)); + SharedPreferences.Editor editor = mContext.getSharedPreferences(spFileName,spMode).edit(); + editor.putString(sp_lang_tag,tag); + editor.apply(); + restartActivity(); + } + + private void restartActivity(){ + MainActivity.CURRENT_ACTIVITY.restarter(); + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LanguageDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LanguageDialog.java new file mode 100644 index 00000000..1ef36037 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/LanguageDialog.java @@ -0,0 +1,45 @@ +package com.aof.mcinabox.launcher.lang; + +import android.app.Dialog; +import android.content.Context; +import android.view.View; +import android.widget.AdapterView; +import android.widget.ArrayAdapter; +import android.widget.ListView; + +import com.aof.mcinabox.R; +import com.aof.mcinabox.launcher.lang.support.LanguageUtils; + +import java.util.Arrays; + + +public class LanguageDialog extends Dialog { + + private ListView listLanguages; + private Context mContext; + private LangManager mManager; + + public LanguageDialog(Context context){ + super(context); + this.mContext = context; + this.mManager = new LangManager(mContext); + setContentView(R.layout.dialog_languages); + initUI(); + } + + private void initUI(){ + listLanguages = findViewById(R.id.dialog_listview_languages); + listLanguages.setAdapter(new ArrayAdapter(mContext, android.R.layout.simple_list_item_1, Arrays.asList(LanguageUtils.LANG_TAGS))); + listLanguages.setOnItemClickListener(new ListView.OnItemClickListener(){ + @Override + public void onItemClick(AdapterView adapterView, View view, int pos, long l) { + ChangeLauncherLanguage(listLanguages.getAdapter().getItem(pos).toString()); + dismiss(); + } + }); + } + + private void ChangeLauncherLanguage(String language){ + mManager.switchLang(language); + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/support/LanguageUtils.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/support/LanguageUtils.java new file mode 100644 index 00000000..2920cbd9 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/lang/support/LanguageUtils.java @@ -0,0 +1,75 @@ +package com.aof.mcinabox.launcher.lang.support; + +import android.content.Context; + +import java.util.Locale; +import android.content.res.Configuration; +import android.content.res.Resources; +import android.util.DisplayMetrics; + +public class LanguageUtils { + + public final static String TAG_SYSTEM = "System"; + public final static String TAG_ENGLISH_EN = "English(en)"; + public final static String TAG_JAPANESE_JA = "日本語(ja)"; + public final static String TAG_CHINESE_ZH_CN = "简体中文(zh-CN)"; + public final static String TAG_CHINESE_ZH_TW = "繁体中文(zh-TW)"; + public final static String TAG_SPANISH_ES = "Español(es)"; + public final static String TAG_PORTUGUESE_RU = "Русский(ru)"; + public final static String TAG_BRAZILIAN_PT_BR = "Brazilian(pt-BR)"; + + /* + * if you want to add a new language + * create a TAG for the language + * and add the TAG to #LANG_TAGS + */ + public final static String[] LANG_TAGS = new String[]{TAG_SYSTEM, TAG_ENGLISH_EN, TAG_JAPANESE_JA, TAG_CHINESE_ZH_CN, + TAG_CHINESE_ZH_TW, TAG_SPANISH_ES, TAG_PORTUGUESE_RU, TAG_BRAZILIAN_PT_BR}; + + public static Locale getLocaleFromConfig(String config){ + Locale mLocale; + switch (config){ + case TAG_SYSTEM: + mLocale = Locale.getDefault(); + break; + case TAG_ENGLISH_EN: + mLocale = Locale.ENGLISH; + break; + case TAG_JAPANESE_JA: + mLocale = Locale.JAPANESE; + break; + case TAG_CHINESE_ZH_CN: + mLocale = Locale.SIMPLIFIED_CHINESE; + break; + case TAG_CHINESE_ZH_TW: + mLocale = Locale.TRADITIONAL_CHINESE; + break; + case TAG_SPANISH_ES: + mLocale = Locale.forLanguageTag("es"); + break; + case TAG_PORTUGUESE_RU: + mLocale = Locale.forLanguageTag("ru"); + break; + case TAG_BRAZILIAN_PT_BR: + mLocale = Locale.forLanguageTag("pt-rBR"); + break; + default: + mLocale = null; + break; + } + return mLocale; + } + + public static void switchLang(Context context, Locale locale){ + if(locale == null){ + return; + } + Resources resources = context.getResources(); + DisplayMetrics dm = resources.getDisplayMetrics(); + Configuration config = resources.getConfiguration(); + config.locale = locale; + config.setLayoutDirection(locale); + resources.updateConfiguration(config, dm); + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/LaunchManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/LaunchManager.java new file mode 100644 index 00000000..1498ad50 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/LaunchManager.java @@ -0,0 +1,78 @@ +package com.aof.mcinabox.launcher.launch; + +import android.content.Context; +import android.content.Intent; +import android.util.Log; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.definitions.models.BoatArgs; +import com.aof.mcinabox.launcher.launch.support.AsyncManager; +import com.aof.mcinabox.launcher.launch.support.BoatArgsMaker; +import com.aof.mcinabox.launcher.launch.support.FeedBackDialog; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.tipper.TipperManager; +import com.aof.mcinabox.launcher.tipper.support.TipperRunable; +import com.aof.utils.dialog.DialogUtils; +import com.aof.utils.dialog.support.TaskDialog; + +public class LaunchManager { + + public final static int LAUNCH_PRECHECK = 0; + public final static int LAUNCH_PARM_SETUP = 1; + public final static int LAUNCH_PARM_MAKE = 2; + public final static int LAUNCH_GAME = 3; + + private Context mContext; + private final static String TAG = "LaunchManager"; + private TaskDialog fbDialog; + private BoatArgsMaker maker; + + public LaunchManager(Context context){ + this.mContext = context; + fbDialog = DialogUtils.createTaskDialog(mContext,"正在启动...","",false); + } + + public void brige_setProgressText(String des){ + fbDialog.setCurrentTaskName(des); + } + + public void brige_exitWithSuccess(){ + fbDialog.dismiss(); + } + + public void brige_exitWithError(String des){ + if(des != null && ! des.equals("")){ + DialogUtils.createSingleChoiceDialog(mContext,"错误",des,"确定",null); + } + fbDialog.dismiss(); + } + + public void launchMinecraft(SettingJson setting, int i){ + + switch (i){ + case LAUNCH_PRECHECK: + fbDialog.show(); + new AsyncManager(mContext,this,setting).start(); + break; + case LAUNCH_PARM_SETUP: + maker = new BoatArgsMaker(mContext,setting,this); + maker.setup(setting.getLastVersion()); + break; + case LAUNCH_PARM_MAKE: + maker.make(); + break; + case LAUNCH_GAME: + + BoatArgs args = maker.getBoatArgs(); + + brige_exitWithSuccess(); + mContext.startActivity(new Intent(mContext, cosine.boat.LauncherActivity.class).putExtra("LauncherConfig",maker.getBoatArgs()).addFlags(Intent.FLAG_ACTIVITY_NEW_TASK)); + break; + } + + } + +} + + + + diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/AsyncManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/AsyncManager.java new file mode 100644 index 00000000..50916d4b --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/AsyncManager.java @@ -0,0 +1,544 @@ +package com.aof.mcinabox.launcher.launch.support; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Handler; +import android.os.Message; + +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.launch.LaunchManager; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.minecraft.JsonUtils; +import com.aof.utils.FileTool; +import com.aof.utils.dialog.support.DialogSupports; +import com.aof.utils.dialog.DialogUtils; + +import java.io.File; + +public class AsyncManager { + + private final static String TAG = "AsyncManager"; + + private Context mContext; + private LaunchManager mLaunchManager; + private SettingJson mSetting; + + private final static int DEFAULT_DELAY = 200; + + private enum PROGRESS { + CHECK_TIPPER, + CHECK_SETTING, + CHECK_RUNTIME_INFO, + CHECK_RUNTIME_PLATFORM, + CHECK_MINECRAFT_MAIN, + CHECK_MINECRAFT_LIBRARIES, + CHECK_MINECRAFT_ASSETS_INDEX, + CHECK_MINECRAFT_ASSETS_OBJS, + CHECK_FORGE_SPLASH, + CHECK_MINECRAFT_OPTIONS_MIPMAP, + CHECK_MINECRAFT_OPTIONS_TOUCHMODE + } + + private int currentPorgress = PROGRESS.CHECK_TIPPER.ordinal(); + + public AsyncManager(Context context, LaunchManager launchManager, SettingJson setting) { + this.mContext = context; + this.mLaunchManager = launchManager; + this.mSetting = setting; + } + + public void start() { + next(); + } + + private void execute(PROGRESS p) { + createThread(p).start(); + } + + private void execute(int p) { + execute(PROGRESS.values()[p]); + } + + private void closeWithError() { + + } + + public void next() { + if (currentPorgress < PROGRESS.values().length) { + execute(currentPorgress); + currentPorgress++; + } else { + mLaunchManager.launchMinecraft(mSetting, LaunchManager.LAUNCH_PARM_SETUP); + } + } + + private Thread createThread(PROGRESS p) { + Thread progress = null; + switch (p) { + case CHECK_TIPPER: + progress = new Thread() { + @Override + public void run() { + if (mSetting.getConfigurations().isNotCheckTipper()) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查消息管理器..."); + paused(DEFAULT_DELAY); + if (CheckManifest.checkTipper()) { + ui_thread_next(); + } else { + ui_thread_create_dialog(new DialogRecorder() + .setType(DialogRecorder.TYPE_NORMAL) + .setTitle("警告") + .setMsg("检测到消息管理器存在未处理的重要消息,忽略这些消息可能会导致启动出现异常。是否继续?") + .setPName("继续") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + ui_thread_next(); + } + + @Override + public void runWhenNegative() { + ui_thread_send_error("消息管理器存在未处理的消息,用户结束了操作。"); + } + }) + ); + } + } + }; + + break; + case CHECK_SETTING: + progress = new Thread() { + @Override + public void run() { + ui_thread_set_progress("正在检查启动器配置..."); + paused(DEFAULT_DELAY); + if (CheckManifest.checkVersionThatSelected(mSetting)) { + ui_thread_next(); + } else { + ui_thread_send_error("未检测到游戏,请先安装一个Minecraft。"); + } + } + }; + break; + case CHECK_RUNTIME_INFO: + progress = new Thread() { + @Override + public void run() { + ui_thread_set_progress("正在检查运行库..."); + paused(DEFAULT_DELAY); + if (CheckManifest.checkRuntimePack()) { + ui_thread_next(); + } else { + ui_thread_send_error("未检测到运行库,请先安装运行库。"); + } + } + }; + break; + case CHECK_RUNTIME_PLATFORM: + progress = new Thread() { + @Override + public void run() { + if (mSetting.getConfigurations().isNotCheckPlatform()) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查系统架构..."); + paused(DEFAULT_DELAY); + if (CheckManifest.checkPlatform()) { + ui_thread_next(); + } else { + ui_thread_create_dialog(new DialogRecorder() + .setTitle("警告") + .setMsg("检测到运行库架构和您的系统架构不符,可能导致启动失败或性能损失,是否继续?") + .setPName("继续") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + ui_thread_next(); + } + + @Override + public void runWhenNegative() { + ui_thread_send_error("运行库架构与系统不符合,用户结束了操作。"); + } + }) + .setType(DialogRecorder.TYPE_NORMAL) + ); + } + } + }; + break; + case CHECK_MINECRAFT_MAIN: + progress = new Thread() { + @Override + public void run() { + ui_thread_set_progress("正在检查游戏主文件..."); + paused(DEFAULT_DELAY); + if (CheckManifest.checkMinecraftMainFiles(mSetting)) { + ui_thread_next(); + } else { + ui_thread_send_error("未找到Minecraft JAR主文件,请重新安装该Minecraft版本。"); + } + } + }; + break; + case CHECK_MINECRAFT_LIBRARIES: + progress = new Thread() { + @Override + public void run() { + if (mSetting.getConfigurations().isNotCheckGame()) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查游戏依赖库..."); + paused(DEFAULT_DELAY); + String[] result = CheckManifest.checkMinecraftLibraries(mSetting); + if (result == null) { + ui_thread_next(); + } else { + StringBuilder tmp = new StringBuilder(); + for (String str : result) { + tmp.append(str).append("\n"); + } + ui_thread_create_dialog(new DialogRecorder() + .setTitle("警告") + .setMsg("检测到运行库不完整,缺少文件: " + "\n" + tmp + "是否继续?") + .setPName("继续") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + ui_thread_next(); + } + + @Override + public void runWhenNegative() { + ui_thread_send_error("Minecraft依赖库不完整,请重新安装该Mineccraft版本,用户结束了操作。"); + } + }) + .setType(DialogRecorder.TYPE_NORMAL) + ); + } + } + }; + break; + case CHECK_MINECRAFT_ASSETS_INDEX: + progress = new Thread() { + @Override + public void run() { + if (mSetting.getConfigurations().isNotCheckGame()) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查游戏资源索引文件..."); + paused(DEFAULT_DELAY); + if (CheckManifest.checkMinecraftAssetsIndex(mSetting)) { + ui_thread_next(); + } else { + ui_thread_create_dialog(new DialogRecorder() + .setTitle("警告") + .setMsg("未检测到Minecraft资源索引文件,将会导致Minecraft没有声音和多语言支持,是否继续?") + .setPName("继续") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + ui_thread_next(); + } + + @Override + public void runWhenNegative() { + ui_thread_send_error("缺少Minecraft资源索引文件,用户结束了操作。"); + } + }) + .setType(DialogRecorder.TYPE_NORMAL) + ); + } + } + }; + break; + case CHECK_MINECRAFT_ASSETS_OBJS: + progress = new Thread() { + @Override + public void run() { + if (mSetting.getConfigurations().isNotCheckGame()) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查游戏资源文件..."); + paused(DEFAULT_DELAY); + String[] result = CheckManifest.checkMinecraftAssetsObjects(mSetting); + if (result == null) { + ui_thread_next(); + } else { + StringBuilder tmp = new StringBuilder(); + for (String str : result) { + tmp.append(str).append("\n"); + } + ui_thread_create_dialog(new DialogRecorder() + .setTitle("警告") + .setMsg("检测到资源文件不完整,缺少文件: " + "\n" + tmp + "是否继续?") + .setPName("继续") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + ui_thread_next(); + } + + @Override + public void runWhenNegative() { + ui_thread_send_error("Minecraft资源不完整,用户结束了操作。"); + } + }) + .setType(DialogRecorder.TYPE_NORMAL) + ); + } + } + }; + break; + case CHECK_FORGE_SPLASH: + progress = new Thread() { + @Override + public void run() { + if ( mSetting.getConfigurations().isNotCheckForge() || JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(mSetting.getLastVersion())).getInheritsFrom() == null) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查Forge配置..."); + paused(DEFAULT_DELAY); + if (CheckManifest.checkForgeSplash()) { + ui_thread_next(); + } else { + ui_thread_create_dialog(new DialogRecorder() + .setTitle("警告") + .setMsg("检测到Forge动画没有禁用,是否禁用?") + .setPName("继续") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + try { + FileTool.checkFilePath(new File(AppManifest.MINECRAFT_HOME + "/config"), true); + String config_file = AppManifest.MINECRAFT_HOME + "/config/splash.properties"; + if (!FileTool.isFileExists(config_file)) { + FileTool.addFile(config_file); + } + FileTool.writeData(config_file, "enabled=false"); + } catch (Exception e) { + e.printStackTrace(); + ui_thread_send_error("发生未知错误,禁用forge动画失败"); + } + ui_thread_next(); + } + + @Override + public void runWhenNegative() { + ui_thread_next(); + } + }) + .setType(DialogRecorder.TYPE_NORMAL) + ); + } + } + }; + break; + case CHECK_MINECRAFT_OPTIONS_MIPMAP: + progress = new Thread() { + @Override + public void run() { + if (mSetting.getConfigurations().isNotCheckOptions()) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查options.txt..."); + paused(DEFAULT_DELAY); + if(CheckManifest.checkMinecraftOptionsMipmap(mSetting)){ + ui_thread_next(); + } else { + ui_thread_create_dialog(new DialogRecorder() + .setTitle("警告") + .setMsg("检测到Minecraft的Mipmap等级不为0, 这将造成游戏流畅度下降并产生一些渲染错误。是否修改Mipmap等级为0?") + .setPName("修改") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + if(FileTool.addStringLineToFile("\nmipmapLevels:0",AppManifest.MINECRAFT_HOME + "/options.txt")){ + ui_thread_next(); + }else{ + ui_thread_send_error(String.format("发生未知错误, %s 修改失败!",AppManifest.MINECRAFT_HOME + "/options.txt")); + } + } + + @Override + public void runWhenNegative() { + ui_thread_next(); + } + }) + .setType(DialogRecorder.TYPE_NORMAL) + ); + } + } + }; + break; + case CHECK_MINECRAFT_OPTIONS_TOUCHMODE: + progress = new Thread() { + @Override + public void run() { + if (mSetting.getConfigurations().isNotCheckOptions()) { + ui_thread_next(); + return; + } + ui_thread_set_progress("正在检查options.txt..."); + paused(DEFAULT_DELAY); + if(CheckManifest.checkMinecraftOptionsTouchMode()){ + ui_thread_next(); + } else { + ui_thread_create_dialog(new DialogRecorder() + .setTitle("警告") + .setMsg("检测到Minecraft的触屏模式开启, 这将使游戏难以操作。是否关闭触屏模式?") + .setPName("修改") + .setNName("取消") + .setSupport(new DialogSupports() { + @Override + public void runWhenPositive() { + if(FileTool.addStringLineToFile("\ntouchscreen:false",AppManifest.MINECRAFT_HOME + "/options.txt")){ + ui_thread_next(); + }else{ + ui_thread_send_error(String.format("发生未知错误, %s 修改失败!",AppManifest.MINECRAFT_HOME + "/options.txt")); + } + } + + @Override + public void runWhenNegative() { + ui_thread_next(); + } + }) + .setType(DialogRecorder.TYPE_NORMAL) + ); + } + } + }; + break; + default: + } + return progress; + } + + private void paused(long time) { + try { + Thread.sleep(time); + } catch (InterruptedException e) { + e.printStackTrace(); + } + } + + private void sendMsg(int what) { + Message msg = new Message(); + msg.what = what; + mHandler.sendMessage(msg); + } + + private void ui_thread_next() { + sendMsg(0); + } + + private String tmpDes; + + private void ui_thread_set_progress(String des) { + tmpDes = des; + sendMsg(1); + } + + private void ui_thread_send_error(String des) { + tmpDes = des; + sendMsg(3); + } + + private DialogRecorder tmpRec; + + private void ui_thread_create_dialog(DialogRecorder recorder) { + this.tmpRec = recorder; + sendMsg(2); + } + + @SuppressLint("HandlerLeak") + private Handler mHandler = new Handler() { + @Override + public void handleMessage(Message msg) { + switch (msg.what) { + case 0: + AsyncManager.this.next(); + break; + case 1: + mLaunchManager.brige_setProgressText(tmpDes); + break; + case 2: + switch (tmpRec.type) { + case DialogRecorder.TYPE_NORMAL: + DialogUtils.createBothChoicesDialog(mContext, tmpRec.title, tmpRec.message, tmpRec.pName, tmpRec.nName, tmpRec.support); + break; + case DialogRecorder.TYPE_ONLY_NOTE: + DialogUtils.createSingleChoiceDialog(mContext, tmpRec.title, tmpRec.message, tmpRec.pName, tmpRec.support); + break; + } + break; + case 3: + mLaunchManager.brige_exitWithError(tmpDes); + break; + } + } + }; + + class DialogRecorder { + + public final static int TYPE_NORMAL = 0; + public final static int TYPE_ONLY_NOTE = 1; + + public int type; + public String title; + public String message; + public String pName; + public String nName; + public DialogSupports support; + + public DialogRecorder setTitle(String t) { + this.title = t; + return this; + } + + public DialogRecorder setMsg(String m) { + this.message = m; + return this; + } + + public DialogRecorder setPName(String p) { + this.pName = p; + return this; + } + + public DialogRecorder setNName(String n) { + this.nName = n; + return this; + } + + public DialogRecorder setSupport(DialogSupports d) { + this.support = d; + return this; + } + + public DialogRecorder setType(int t) { + this.type = t; + return this; + } + + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsJson.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsJson.java new file mode 100644 index 00000000..11810c30 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsJson.java @@ -0,0 +1,7 @@ +package com.aof.mcinabox.launcher.launch.support; + +import com.aof.mcinabox.definitions.models.BoatArgs; + +import java.io.Serializable; + +public class BoatArgsJson extends BoatArgs implements Serializable {} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsMaker.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsMaker.java new file mode 100644 index 00000000..c9b68a3d --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/BoatArgsMaker.java @@ -0,0 +1,296 @@ +package com.aof.mcinabox.launcher.launch.support; + +import android.content.Context; +import android.util.Log; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.definitions.models.BoatArgs; +import com.aof.mcinabox.launcher.launch.LaunchManager; +import com.aof.mcinabox.launcher.runtime.RuntimeManager; +import com.aof.mcinabox.launcher.runtime.support.Definitions; +import com.aof.mcinabox.launcher.runtime.support.RuntimePackInfo; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.minecraft.JsonUtils; +import com.aof.mcinabox.minecraft.json.VersionJson; +import com.aof.utils.dialog.support.DialogSupports; +import com.aof.utils.dialog.DialogUtils; +import java.util.ArrayList; +import java.util.Arrays; +import java.util.HashMap; +import java.util.Objects; + +import static com.aof.mcinabox.definitions.manifest.AppManifest.MCINABOX_VERSION_NAME; + +public class BoatArgsMaker { + + private VersionJson version; + private VersionJson forge; + private Context mContext; + private SettingJson mSetting; + private RuntimePackInfo mRuntime; + private RuntimePackInfo.Manifest runtimeManifest; + private RuntimePackInfo.Manifest[] manifests; + private LaunchManager mLaunchManager; + private BoatArgs mArgs; + + private final static String TAG = "BoatArgsMaker"; + + public BoatArgsMaker(Context context, SettingJson setting, LaunchManager launchmanager){ + this.mContext = context; + this.mSetting = setting; + this.mLaunchManager = launchmanager; + this.mRuntime = RuntimeManager.getPackInfo(); + } + + public BoatArgs getBoatArgs(){ + return this.mArgs; + } + + public void setup(String id){ + mLaunchManager.brige_setProgressText("正在初始化启动参数..."); + //读入version的json信息 + version = JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(id)); + //判断读入的version是否使用了API,如果使用了就先交换变量,再读入原版的version信息 + if(version.getInheritsFrom() != null){ + forge = version; + version = JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(forge.getInheritsFrom())); + } + //初始化运行库的清单对象 + manifestSelecter(); + } + + private void onSetupFinished(){ + //等待setup完成之后回调LaunhcerManager的方法来继续执行参数拼接 + mLaunchManager.launchMinecraft(mSetting, LaunchManager.LAUNCH_PARM_MAKE); + } + + private void manifestSelecter(){ + manifests = RuntimeManager.getRutinmeInfoManifest(version); + + if(manifests.length == 1 && !mSetting.getConfigurations().isAlwaysChoiceRuntimeManifest()){ + //如果只有一种可选策略,并且设置中仅用了AlwaysChoiceRuntimeMainfest,则不显示选择对话框 + onManifestSelected(0); + return; + } + + String[] items = new String[manifests.length]; + for(int a = 0; a < items.length ; a++){ + items[a] = manifests[a].name; + } + DialogUtils.createItemsChoiceDialog(mContext,"请选择运行库加载策略:",null,"取消",false,items,new DialogSupports(){ + @Override + public void runWhenItemsSelected(int pos){ + onManifestSelected(pos); + } + @Override + public void runWhenNegative(){ + mLaunchManager.brige_exitWithError("用户取消了操作。"); + } + }); + } + + private void onManifestSelected(int pos){ + //等待manifestSelecter的回调,然后初始化清单 + this.runtimeManifest = manifests[pos]; + //回调setup完成 + onSetupFinished(); + } + + public void make(){ + mLaunchManager.brige_setProgressText("正在生成启动参数..."); + //执行参数拼接 + try { + this.mArgs = new BoatArgs() + .setArgs(getArgs()) + .setJava_home(AppManifest.BOAT_RUNTIME_HOME + "/" + runtimeManifest.jre_home) + .setGamedir(AppManifest.MINECRAFT_HOME) + .setDebug(mSetting.getConfigurations().isEnableDebug()) + .setShared_libraries(this.getSharedLibrariesPaths()); + mLaunchManager.launchMinecraft(mSetting,LaunchManager.LAUNCH_GAME); + }catch (Exception e){ + e.printStackTrace(); + mLaunchManager.brige_exitWithError("出现未知错误,启动参数生成失败!"); + } + } + + private String[] getArgs(){ + + //初始化各参数 + String JVM_java = AppManifest.BOAT_RUNTIME_HOME + "/" + runtimeManifest.jre_home + "/bin/java"; + String JVM_mode = "-" + runtimeManifest.jvmMode; + String JVM_Xmx = "-Xmx" + mSetting.getConfigurations().getMaxMemory() + "m"; + String JVM_Xms = "-Xms128m"; + String JVM_java_library_path = this.getJava_library_path(); + //String JVM_lwjgl_debug_true = "-Dorg.lwjgl.util.Debug=true"; + //String JVM_lwjgl_debugloader_true = "-Dorg.lwjgl.util.DebugLoader=true"; + String JVM_ExtraArgs = mSetting.getConfigurations().getJavaArgs(); + String JVM_ClassPath = "-cp"; + String JVM_ClassPath_info = this.getClasspath(); + String Minecraft_MainClass = this.getMainClass(); + String MinecraftExtraArgs = mSetting.getConfigurations().getMinecraftArgs(); + String MinecraftWindowArgs = this.ConvertJsStringModleToJavaStringModle("--width ${window_width} --height ${window_height}"); + String Minecraft_Args = this.getMinecraftArgs(); + + //对参数进行拼接 + ArrayList tmp = new ArrayList<>(); + tmp.add(JVM_java); + tmp.add(JVM_mode); + tmp.add(JVM_Xmx); + tmp.add(JVM_Xms); + tmp.add(JVM_java_library_path); + //tmp.addAll(Arrays.asList(JVM_ExtraArgs.split(" "))); + tmp.add(JVM_ClassPath); + tmp.add(JVM_ClassPath_info); + tmp.addAll(Arrays.asList(Minecraft_MainClass.split(" "))); + //tmp.addAll(Arrays.asList(MinecraftExtraArgs.split(" "))); + tmp.addAll(Arrays.asList(MinecraftWindowArgs.split(" "))); + tmp.addAll(Arrays.asList(Minecraft_Args.split(" "))); + + //过滤空的元素并返回参数数组 + for(int a = 0 ; a < tmp.size() ; a++){ + if(tmp.get(a).equals("")){ + tmp.remove(a); + a--; + } + } + String[] result = new String[tmp.size()]; + for(int a = 0; a < tmp.size(); a++){ + result[a] = tmp.get(a); + } + + return result; + } + + private String getJava_library_path(){ + String[] tmp = runtimeManifest.java_library_path.split(Definitions.RUNTIME_CONDITION_SPILT); + StringBuilder result = new StringBuilder("-Djava.library.path="); + for(String str : tmp){ + result.append(AppManifest.BOAT_RUNTIME_HOME).append("/").append(str).append(":"); + } + result.append(AppManifest.BOAT_RUNTIME_HOME); + return result.toString(); + } + + private String getClasspath(){ + String[] in_runtime = runtimeManifest.classpath.split(Definitions.RUNTIME_CONDITION_SPILT); + StringBuilder result = new StringBuilder(); + for(VersionJson.DependentLibrary library : version.getLibraries()){ + if(!Utils.filterLib(library.getName())){ + result.append(Utils.getLibPathByPkgName(library.getName())).append(":"); + } + } + if(forge != null){ + for(VersionJson.DependentLibrary library : forge.getLibraries()){ + if(!Utils.filterLib(library.getName())){ + result.append(Utils.getLibPathByPkgName(library.getName())).append(":"); + } + } + } + for(String str : in_runtime){ + result.append(AppManifest.BOAT_RUNTIME_HOME).append("/").append(str).append(":"); + } + result.append(Utils.getJarAbsPath(version)); + return result.toString(); + } + + private String getMainClass(){ + if(forge != null){ + return forge.getMainClass(); + }else{ + return version.getMainClass(); + } + } + + private String getMinecraftArgs(){ + if(forge != null){ + if (version.getMinimumLauncherVersion() >= 21) { + //这是1.13.1以及之后的处理方法 + return this.ConvertJsStringModleToJavaStringModle(this.ConvertArgumentsToMinecraftArguments(forge)); + } else if (version.getMinimumLauncherVersion() < 21){ + //这是1.13.1之前的处理方法 + return this.ConvertJsStringModleToJavaStringModle(forge.getMinecraftArguments()); + } + }else{ + if (version.getMinimumLauncherVersion() >= 21) { + //这是1.13.1以及之后的处理方法 + return this.ConvertJsStringModleToJavaStringModle(this.ConvertArgumentsToMinecraftArguments(version)); + } else if (version.getMinimumLauncherVersion() < 21){ + //这是1.13.1之前的处理方法 + return this.ConvertJsStringModleToJavaStringModle(version.getMinecraftArguments()); + } + } + return null; + } + + private String ConvertJsStringModleToJavaStringModle(String str) { + String JavaString; + StringBuilder tempString = new StringBuilder(); + SettingJson.Account account = null; + HashMap ArgsMap = new HashMap<>(); + for(SettingJson.Account a : mSetting.getAccounts()){ + if(a.isSelected()){ + account = a; + } + } + + //需要转义的键名-键值 + ArgsMap.put("{auth_player_name}", Objects.requireNonNull(account).getUsername()); + ArgsMap.put("{auth_uuid}", account.getUuid()); + ArgsMap.put("{auth_access_token}", account.getAccessToken()); + ArgsMap.put("{auth_session}", "mojang"); + ArgsMap.put("{user_properties}", "{}"); + ArgsMap.put("{user_type}", "mojang"); + ArgsMap.put("{assets_index_name}", version.getAssets()); + ArgsMap.put("{assets_root}", AppManifest.MINECRAFT_ASSETS); + ArgsMap.put("{game_directory}", AppManifest.MINECRAFT_HOME); + ArgsMap.put("{game_assets}", version.getAssets()); + ArgsMap.put("{version_name}", "MCinaBox_" + MCINABOX_VERSION_NAME); + ArgsMap.put("{version_type}", version.getType()); + ArgsMap.put("{window_width}", String.valueOf(mContext.getResources().getDisplayMetrics().widthPixels)); + ArgsMap.put("{window_height}", String.valueOf(mContext.getResources().getDisplayMetrics().heightPixels)); + + + for (int i = 0; i < str.length(); i++) { + if (str.charAt(i) == '$') { + StringBuilder tempString2 = new StringBuilder(); + do { + i++; + tempString2.append(str.charAt(i)); + } while (str.charAt(i) != '}'); + tempString.append(ArgsMap.get(tempString2.toString())); + } else { + tempString.append(str.charAt(i)); + } + } + + JavaString = tempString.toString(); + return JavaString; + } + + /** + * 【将MC1.13的Arguments对象转化为MinecraftArguments字符串】 + **/ + private String ConvertArgumentsToMinecraftArguments(VersionJson json) { + StringBuilder ma = new StringBuilder(); + for (int i = 0; i < json.getArguments().getGame().length; i++) { + if (json.getArguments().getGame()[i] instanceof String) { + if (i == json.getArguments().getGame().length - 1) { + ma.append(json.getArguments().getGame()[i]); + } else { + ma.append(json.getArguments().getGame()[i]).append(" "); + } + } + } + return ma.toString(); + } + + private String[] getSharedLibrariesPaths(){ + String[] paths = runtimeManifest.so.split(Definitions.RUNTIME_CONDITION_SPILT); + String[] result = new String[paths.length]; + for(int a = 0; a < paths.length; a++){ + result[a] = AppManifest.BOAT_RUNTIME_HOME + "/" +paths[a]; + } + return result; + } + +} + diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/CheckManifest.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/CheckManifest.java new file mode 100644 index 00000000..b3bd8e17 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/CheckManifest.java @@ -0,0 +1,153 @@ +package com.aof.mcinabox.launcher.launch.support; + +import android.util.Log; + +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.runtime.RuntimeManager; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.tipper.TipperManager; +import com.aof.mcinabox.minecraft.JsonUtils; +import com.aof.utils.FileTool; + +import java.io.File; +import java.io.IOException; +import java.io.RandomAccessFile; +import java.util.ArrayList; +import java.util.regex.Pattern; + +public class CheckManifest { + + private final static String TAG = "CheckManifest"; + + public static boolean checkTipper() { + return MainActivity.CURRENT_ACTIVITY.mTipperManager.getTipCounts(TipperManager.TIPPER_LEVEL_WARN) + MainActivity.CURRENT_ACTIVITY.mTipperManager.getTipCounts(TipperManager.TIPPER_LEVEL_ERROR) == 0; + } + + public static boolean checkVersionThatSelected(SettingJson settingJson) { + return !settingJson.getLastVersion().equals(""); + } + + public static boolean checkRuntimePack() { + return RuntimeManager.getPackInfo() != null; + } + + public static boolean checkPlatform() { + //TODO: 检查架构 + return true; + } + + public static boolean checkMinecraftMainFiles(SettingJson settingJson) { + //先检查是不是api,如果是,则只检查主版本文件是否存在 + String tmpId = Utils.judgeApi(settingJson.getLastVersion()); + if (tmpId != null) { + for (File file : new File[]{new File(Utils.getJsonAbsPath(tmpId)), new File(Utils.getJarAbsPath(tmpId))}) { + if (!file.exists()) { + return false; + } + } + return true; + } else { + return new File(Utils.getJarAbsPath(settingJson.getLastVersion())).exists(); + } + } + + public static String[] checkMinecraftLibraries(SettingJson settingJson) { + String[] paths = Utils.getFilteredLibPaths(settingJson.getLastVersion()); + ArrayList result = new ArrayList<>(); + + //先检查是不是api,如果是,就合并原版本的检查结果。 + String tmpId = Utils.judgeApi(settingJson.getLastVersion()); + if (tmpId != null) { + String[] paths2 = Utils.getFilteredLibPaths(tmpId); + String[] all = new String[paths.length + paths2.length]; + System.arraycopy(paths, 0, all, 0, paths.length); + System.arraycopy(paths2, 0, all, paths.length, paths2.length); + paths = all; + } + + for (String path : paths) { + File file = new File(path); + if (!file.exists()) { + result.add(file.getName()); + } + } + if (result.size() == 0) { + return null; + } else { + String[] tmp = new String[result.size()]; + for (int a = 0; a < tmp.length; a++) { + tmp[a] = result.get(a); + } + return tmp; + } + } + + public static boolean checkMinecraftAssetsIndex(SettingJson settingJson) { + return new File(Utils.getAssetsJsonAbsPath(JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(settingJson.getLastVersion())))).exists(); + } + + public static String[] checkMinecraftAssetsObjects(SettingJson settingJson) { + if (!checkMinecraftAssetsIndex(settingJson)) { + return null; + } + String[] paths = Utils.getAssetsPaths(JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(settingJson.getLastVersion()))); + ArrayList result = new ArrayList<>(); + for (String path : paths) { + File file = new File(path); + if (!file.exists()) { + result.add(file.getName()); + } + } + if (result.size() == 0) { + return null; + } else { + String[] tmp = new String[result.size()]; + for (int a = 0; a < tmp.length; a++) { + tmp[a] = result.get(a); + } + return tmp; + } + } + + public static boolean checkForgeSplash() { + String f; + try { + f = FileTool.readToString(AppManifest.MINECRAFT_HOME + "/config/splash.properties"); + } catch (IOException e) { + e.printStackTrace(); + return false; + } + return f.contains("enabled=false"); + } + + public static boolean checkMinecraftOptionsMipmap(SettingJson settimg) { + if (JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(settimg.getLastVersion())).getMinimumLauncherVersion() >= 21) { + return true; + } else { + String f; + try { + f = FileTool.readToString(AppManifest.MINECRAFT_HOME + "/options.txt"); + } catch (IOException e) { + e.printStackTrace(); + return true; + } + return f.contains("mipmapLevels:0"); + } + } + + public static boolean checkMinecraftOptionsTouchMode() { + String f; + try { + f = FileTool.readToString(AppManifest.MINECRAFT_HOME + "/options.txt"); + } catch (IOException e) { + e.printStackTrace(); + return true; + } + if(f.contains("touchscreen:true") && f.contains("touchscreen:false")){ + return true; + }else{ + return f.contains("touchscreen:false"); + } + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/FeedBackDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/FeedBackDialog.java new file mode 100644 index 00000000..74de22dd --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/FeedBackDialog.java @@ -0,0 +1,31 @@ +package com.aof.mcinabox.launcher.launch.support; + +import android.app.Dialog; +import android.content.Context; +import android.widget.TextView; +import androidx.annotation.NonNull; +import com.aof.mcinabox.R; + +public class FeedBackDialog extends Dialog { + + private TextView textProgress; + private Context mContext; + + public FeedBackDialog(@NonNull Context context) { + super(context); + this.mContext = context; + setContentView(R.layout.dialog_launch_feedback); + setCanceledOnTouchOutside(false); + setCancelable(false); + init(); + } + + private void init() { + this.textProgress = findViewById(R.id.dialog_launch_feedback_text_current); + } + + public void setProgressName(String name) { + FeedBackDialog.this.textProgress.setText(name); + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/Utils.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/Utils.java new file mode 100644 index 00000000..8419fd74 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/launch/support/Utils.java @@ -0,0 +1,293 @@ +package com.aof.mcinabox.launcher.launch.support; + +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.minecraft.JsonUtils; +import com.aof.mcinabox.minecraft.json.AssetsJson; +import com.aof.mcinabox.minecraft.json.VersionJson; + +import java.lang.reflect.Array; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.Objects; +import java.util.Set; + +public class Utils { + + /** [获取某version的主json文件路径] **/ + + public static String getJsonAbsPath(String versionHome, String id) { + return (versionHome + "/" + id + "/" + id + ".json"); + } + + public static String getJsonAbsPath(String id){ + return getJsonAbsPath(AppManifest.MINECRAFT_VERSIONS, id); + } + + public static String getJsonAbsPath(VersionJson version){ + return getJsonAbsPath(AppManifest.MINECRAFT_VERSIONS, version.getId()); + } + + public static String getJsonAbsPath(String versionHome, VersionJson version){ + return getJsonAbsPath(versionHome,version.getId()); + } + + /** [获取某version的主jar文件路径] **/ + + public static String getJarAbsPath(String versionHome, String id) { + return (versionHome + "/" + id + "/" + id + ".jar"); + } + + public static String getJarAbsPath(String id){ + return getJarAbsPath(AppManifest.MINECRAFT_VERSIONS, id); + } + + public static String getJarAbsPath(VersionJson version){ + return getJarAbsPath(AppManifest.MINECRAFT_VERSIONS, version.getId()); + } + + public static String getJarAbsPath(String versionHome, VersionJson version){ + return getJarAbsPath(versionHome,version.getId()); + } + + /** [获取某version的assets资源json文件路径] **/ + + public static String getAssetsJsonAbsPath(String assetsHome, String assetsId) { + return (assetsHome + "/indexes/" + assetsId + ".json"); + } + + public static String getAssetsJsonAbsPath(String assetsId){ + return getAssetsJsonAbsPath(AppManifest.MINECRAFT_ASSETS, assetsId); + } + + public static String getAssetsJsonAbsPath(VersionJson version){ + return getAssetsJsonAbsPath(AppManifest.MINECRAFT_ASSETS, version.getAssets()); + } + + public static String getAssetsJsonAbsPath(String assetsHome, VersionJson version){ + return getAssetsJsonAbsPath(assetsHome,version.getAssets()); + } + + /** [根据某libraries的name值来获取对应的文件路径] **/ + + public static String getLibPathByPkgName(String libraryHome, String pkgName){ + String packageName; + String libraryName; + String versionName; + String filePath; + + String[] Name = pkgName.split(":"); + packageName = Name[0]; + libraryName = Name[1]; + versionName = Name[2]; + + StringBuilder dirPath = new StringBuilder(libraryHome + "/"); + for (int i = 0; i < packageName.length(); i++) { + if (packageName.charAt(i) == '.') { + dirPath.append("/"); + } else { + dirPath.append(packageName.charAt(i)); + } + } + dirPath.append("/").append(libraryName).append("/").append(versionName).append("/"); + + String fileName = libraryName + "-" + versionName + ".jar"; + filePath = dirPath + fileName; + + return filePath; + } + + public static String getLibPathByPkgName(String pkgName){ + return getLibPathByPkgName(AppManifest.MINECRAFT_LIBRARIES, pkgName); + } + + /** [检查依赖库是否需要被过滤] **/ + + public static boolean filterLib(String pkgName){ + String packname = ""; + boolean result = false; + int a = 0; + for (int i = 0; i < pkgName.length(); i++) { + if (pkgName.charAt(i) == ':') { + a = i + 1; + break; + } + } + for (; a < pkgName.length(); a++) { + if (pkgName.charAt(a) != ':') { + packname = packname + pkgName.charAt(a); + } else { + break; + } + } + for (String str : AppManifest.BOAT_RUNTIME_FILTERED_LIBRARIES) { + if (str.equals(packname)) { + return true; + } + } + return false; + } + + /** [获取某版本的全部libraries路径数组] **/ + + public static String[] getLibPaths(String libraryHome, VersionJson version){ + String[] tmp = new String[version.getLibraries().length]; + for(int a = 0; a < tmp.length; a++){ + tmp[a] = getLibPathByPkgName(libraryHome,version.getLibraries()[a].getName()); + } + return tmp; + } + + public static String[] getLibPaths(String libraryHome, String versionId){ + return getLibPaths(libraryHome,JsonUtils.getVersionFromFile(getJsonAbsPath(AppManifest.MINECRAFT_VERSIONS,versionId))); + } + + public static String[] getLibPaths(String versionId){ + return getLibPaths(AppManifest.MINECRAFT_LIBRARIES ,versionId); + } + + public static String[] getLibPaths(VersionJson version){ + return getLibPaths(AppManifest.MINECRAFT_LIBRARIES, version); + } + + public static String[] getLibPaths(String libraryHome, String[] pkgNames){ + String[] tmp = new String[pkgNames.length]; + for(int a = 0; a < tmp.length; a++){ + tmp[a] = getLibPathByPkgName(libraryHome, pkgNames[a]); + } + return tmp; + } + + public static String[] getLibPaths(String[] pkgNames){ + return getLibPaths(AppManifest.MINECRAFT_LIBRARIES, pkgNames); + } + + /** [获取过滤后的全部Libraries路径数组] **/ + + public static String[] getFilteredLibPaths(String libraryHome, VersionJson version){ + ArrayList tmps = new ArrayList<>(); + + for(VersionJson.DependentLibrary lib : version.getLibraries()){ + if(!filterLib(lib.getName())){ + tmps.add(getLibPathByPkgName(libraryHome,lib.getName())); + } + } + + String[] tmp = new String[tmps.size()]; + for(int a = 0; a < tmps.size(); a++){ + tmp[a] = tmps.get(a); + } + + return tmp; + } + + public static String[] getFilteredLibPaths(String libraryHome, String versionId){ + return getFilteredLibPaths(libraryHome,JsonUtils.getVersionFromFile(getJsonAbsPath(AppManifest.MINECRAFT_VERSIONS,versionId))); + } + + public static String[] getFilteredLibPaths(String versionId){ + return getFilteredLibPaths(AppManifest.MINECRAFT_LIBRARIES ,versionId); + } + + public static String[] getFilteredLibPaths(VersionJson version){ + return getFilteredLibPaths(AppManifest.MINECRAFT_LIBRARIES, version); + } + + /** [根据某assets的object的hashcode来获取该文件路径] **/ + + public static String getAssetsPathByObjHash(String assetsPath, String hashCode){ + StringBuilder str = new StringBuilder(); + for(int i=0;i<2;i++){ + str.append(hashCode.charAt(i)); + } + return assetsPath + "/objects/" + str + "/" + hashCode; + } + + public static String getAssetsPathByObjHash(String hashCode){ + return getAssetsPathByObjHash(AppManifest.MINECRAFT_ASSETS, hashCode); + } + + + /** [获取某版本的全部assets路径数组] **/ + + public static String[] getAssetsPaths(String assetsHome, String assetsId){ + AssetsJson assets = JsonUtils.getAssetsFromFile(getAssetsJsonAbsPath(assetsHome,assetsId)); + String[] tmp = new String[assets.getObjects().size()]; + + Set keySets = assets.getObjects().keySet(); + Iterator it = keySets.iterator(); + int i = 0; + while (it.hasNext()) { + String key = it.next(); + String hashCode = Objects.requireNonNull(assets.getObjects().get(key)).hash; + tmp[i] = getAssetsPathByObjHash(assetsHome, hashCode); + i++; + } + return tmp; + } + + public static String[] getAssetsPaths(String assetsId){ + return getAssetsPaths(AppManifest.MINECRAFT_ASSETS, assetsId); + } + + public static String[] getAssetsPaths(String assetsHome, VersionJson version){ + return getAssetsPaths(assetsHome, version.getAssets()); + } + + public static String[] getAssetsPaths(VersionJson version){ + return getAssetsPaths(AppManifest.MINECRAFT_ASSETS, version.getAssets()); + } + + /** [根据libraries的包名过滤相关条目] **/ + + public static String[] filterByPkgName(final String[] originalPkgNames, final String[] filterPkgNames){ + + ArrayList result = new ArrayList<>(); + for(String name : originalPkgNames){ + int a = 0; + String packname = ""; + boolean res = false; + for (int i = 0; i < name.length(); i++) { + if (name.charAt(i) == ':') { + a = i + 1; + break; + } + } + for (; a < name.length(); a++) { + if (name.charAt(a) != ':') { + packname = packname + name.charAt(a); + } else { + break; + } + } + for (String str : filterPkgNames) { + if (str.equals(packname)) { + res = true; + break; + } + } + if(!res){ + result.add(name); + } + } + + String[] tmp = new String[result.size()]; + for(int a = 0 ; a < result.size() ; a++){ + tmp[a] = result.get(a); + } + return tmp; + } + + /** [检查某版本是否是api,如果是就返回原版的id] **/ + + public static String judgeApi(String versionId){ + VersionJson version = JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(versionId)); + if(version.getInheritsFrom() == null){ + return null; + }else{ + return version.getInheritsFrom(); + } + } + + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/RuntimeManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/RuntimeManager.java new file mode 100644 index 00000000..7a1dd75d --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/RuntimeManager.java @@ -0,0 +1,152 @@ +package com.aof.mcinabox.launcher.runtime; + +import android.annotation.SuppressLint; +import android.content.Context; +import android.os.Handler; +import android.os.Message; +import android.widget.Toast; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.R; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.runtime.support.ConditionResolve; +import com.aof.mcinabox.launcher.runtime.support.Definitions; +import com.aof.mcinabox.launcher.runtime.support.RuntimePackInfo; +import com.aof.mcinabox.minecraft.json.VersionJson; +import com.aof.utils.BoatUtils; +import com.aof.utils.FileTool; +import com.aof.utils.dialog.DialogUtils; +import com.aof.utils.dialog.support.TaskDialog; +import com.google.gson.Gson; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.ArrayList; +import java.util.Objects; + +public class RuntimeManager { + + private final static String TAG = "RuntimeManager"; + + /** + * 【从路径安装运行库】 + **/ + public static void installRuntimeFromPath(final Context context, String globalPath) { + + final TaskDialog mDialog = DialogUtils.createTaskDialog(context, "正在安装运行库...","",false); + mDialog.show(); + @SuppressLint("HandlerLeak") final Handler mHandler = new Handler(){ + @Override + public void handleMessage(Message msg){ + switch (msg.what) { + case 4: + Toast.makeText(MainActivity.CURRENT_ACTIVITY, MainActivity.CURRENT_ACTIVITY.getString(R.string.tips_runtime_notfound), Toast.LENGTH_SHORT).show(); + mDialog.dismiss(); + break; + case 6: + Toast.makeText(MainActivity.CURRENT_ACTIVITY, MainActivity.CURRENT_ACTIVITY.getString(R.string.tips_runtime_install_success), Toast.LENGTH_SHORT).show(); + mDialog.dismiss(); + break; + case 7: + Toast.makeText(MainActivity.CURRENT_ACTIVITY, MainActivity.CURRENT_ACTIVITY.getString(R.string.tips_runtime_install_fail) + " " + MainActivity.CURRENT_ACTIVITY.getString(R.string.tips_runtime_install_fail_exeable), Toast.LENGTH_SHORT).show(); + mDialog.dismiss(); + break; + } + super.handleMessage(msg); + } + }; + + final String mpackagePath = globalPath; + new Thread() { + @Override + public void run() { + File packageFile = new File(mpackagePath); + if (!packageFile.exists()) { + + Message msg_1 = new Message(); + msg_1.what = 4; + mHandler.sendMessage(msg_1); + return; + + } else { + if (packageFile.isDirectory()) { + Toast.makeText(context, "Runtime packs should not be directories!", Toast.LENGTH_LONG).show(); + return; + } + } + Message msg_2 = new Message(); + Message msg_3 = new Message(); + msg_2.what = 5; + mHandler.sendMessage(msg_2); + File dir = new File(AppManifest.BOAT_RUNTIME_HOME); + if(!dir.exists()){ + FileTool.makeFloder(dir.getAbsolutePath()); + } + BoatUtils.extractTarXZ(mpackagePath, AppManifest.BOAT_RUNTIME_HOME); + if (BoatUtils.setExecutable(AppManifest.BOAT_RUNTIME_HOME)) { + msg_3.what = 6; + } else { + msg_3.what = 7; + } + mHandler.sendMessage(msg_3); + } + }.start(); + } + + public static RuntimePackInfo getPackInfo(String path){ + File file = new File(path); + try { + InputStream inputStream = new FileInputStream(file); + Reader reader = new InputStreamReader(inputStream); + Gson gson = new Gson(); + //使用Gson将ListVersionManifestJson实例化 + return gson.fromJson(reader, RuntimePackInfo.class); + } catch (FileNotFoundException e) { + e.printStackTrace(); + return null; + } + } + + public static RuntimePackInfo getPackInfo(){ + return getPackInfo(AppManifest.BOAT_RUNTIME_INFO_JSON); + } + + public static RuntimePackInfo.Manifest[] getRutinmeInfoManifest(String infoPath, VersionJson version){ + ArrayList mabifests = new ArrayList<>(); + RuntimePackInfo info = RuntimeManager.getPackInfo(infoPath); + RuntimePackInfo.Manifest[] originalManifests = Objects.requireNonNull(info).manifest; + //默认清单 + for(RuntimePackInfo.Manifest m : originalManifests){ + if(m.condition.equals(Definitions.RUNTIME_CONDITION_AS_DEFAULT)){ + mabifests.add(m); + break; + } + } + + //根据启动器版本 + for(RuntimePackInfo.Manifest m : originalManifests){ + if(m.condition.equals(Definitions.RUNTIME_CONDITION_AS_LAUNCHER_VERSION) & ConditionResolve.handleConditionWithLauncherVersion(version.getMinimumLauncherVersion(), m.condition_info)){ + mabifests.add(m); + } + } + + //根据游戏版本 + for(RuntimePackInfo.Manifest m : originalManifests){ + if(m.condition.equals(Definitions.RUNTIME_CONDITION_AS_MINECRAFT_VERSION) & ConditionResolve.handleConditionWithMinecraftVersion(version.getId(),m.condition_info)){ + mabifests.add(m); + } + } + + RuntimePackInfo.Manifest[] tmp = new RuntimePackInfo.Manifest[mabifests.size()]; + for(int a =0; a < tmp.length; a++){ + tmp[a] = mabifests.get(a); + } + return tmp; + } + + public static RuntimePackInfo.Manifest[] getRutinmeInfoManifest(VersionJson version){ + return getRutinmeInfoManifest(AppManifest.BOAT_RUNTIME_INFO_JSON, version); + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/ConditionResolve.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/ConditionResolve.java new file mode 100644 index 00000000..f449a916 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/ConditionResolve.java @@ -0,0 +1,69 @@ +package com.aof.mcinabox.launcher.runtime.support; + +import java.util.ArrayList; + +public class ConditionResolve { + + public static boolean handleConditionWithLauncherVersion(int launcherversion, String condition){ + //>0 <1|>2 <3 + String[] conditions = condition.split(Definitions.RUNTIME_CONDITION_SPILT); + for(String str : conditions){ + if(checkConditionWithLauncherVersion(launcherversion,str)){ + return true; + } + } + return false; + } + + private static boolean checkConditionWithLauncherVersion(int launcherversion, String handledcondition){ + boolean result = true; + for(int a = 0; a < handledcondition.length(); a++){ + if(handledcondition.charAt(a) == '<'){ + ArrayList nums = new ArrayList<>(); + for(int b = a + 1; b < handledcondition.length(); b++){ + if(handledcondition.charAt(b) != ' '){ + nums.add(String.valueOf(handledcondition.charAt(b))); + } + } + StringBuilder numstr = new StringBuilder(); + for(String str : nums){ + numstr.append(str); + } + + int num = Integer.parseInt(numstr.toString()); + if(launcherversion >= num){ + result = false; + } + } + if(handledcondition.charAt(a) == '>'){ + ArrayList nums = new ArrayList<>(); + for(int b = a + 1; b < handledcondition.length(); b++){ + if(handledcondition.charAt(b) != ' '){ + nums.add(String.valueOf(handledcondition.charAt(b))); + } + } + StringBuilder numstr = new StringBuilder(); + for(String str : nums){ + numstr.append(str); + } + + int num = Integer.parseInt(numstr.toString()); + if(launcherversion <= num){ + result = false; + } + } + } + return result; + } + + public static boolean handleConditionWithMinecraftVersion(String versionId, String condition){ + String[] conditions = condition.split(Definitions.RUNTIME_CONDITION_SPILT); + for(String str : conditions){ + if(str.equals(versionId)){ + return true; + } + } + return false; + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/Definitions.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/Definitions.java new file mode 100644 index 00000000..32ecf3ae --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/Definitions.java @@ -0,0 +1,23 @@ +package com.aof.mcinabox.launcher.runtime.support; + +public class Definitions { + + public final static String RUNTIME_PLATFORM_AARCH64 = "aarch64"; + public final static String RUNTIME_PLATFORM_AARCH32 = "aarch32"; + public final static String RUNTIME_PLATFORM_X86 = "x86"; + public final static String RUNTIME_PLATFORM_X86_64 = "x86_64"; + public final static String RUNTIME_PLATFORM_ALL = "all"; + + public final static String RUNTIME_BACKEND_BOAT = "boat"; + + public final static String RUNTIME_TYPE_SHAREDLIBRARIES = "shared_libraries"; + public final static String RUNTIME_TYPE_JARS = "jars"; + + public final static String RUNTIME_CONDITION_AS_DEFAULT = "default"; + public final static String RUNTIME_CONDITION_AS_LAUNCHER_VERSION = "launcher_version"; + public final static String RUNTIME_CONDITION_AS_MINECRAFT_VERSION = "minecraft_version"; + + public final static String RUNTIME_CONDITION_SPILT = "\\|"; + public final static String RUNTIME_CONDITION_SPILT_STRING = "|"; + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/RuntimePackInfo.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/RuntimePackInfo.java new file mode 100644 index 00000000..d61a9406 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/runtime/support/RuntimePackInfo.java @@ -0,0 +1,88 @@ +package com.aof.mcinabox.launcher.runtime.support; + +public class RuntimePackInfo { + + public String releaseTime; //发行时间 + public String platform; //架构 + public String versionName; //包版本名称 + public int versionCode; //包版本 + public String backEnd; //后端名称 + public String description; //描述 + public Manifest[] manifest; + + public RuntimePackInfo setReleaseTime(String releaseTime) { + this.releaseTime = releaseTime; + return this; + } + + public RuntimePackInfo setPlatform(String platform) { + this.platform = platform; + return this; + } + + public RuntimePackInfo setVersionName(String versionName) { + this.versionName = versionName; + return this; + } + + public RuntimePackInfo setBackEnd(String backEnd) { + this.backEnd = backEnd; + return this; + } + + public RuntimePackInfo setDescription(String description) { + this.description = description; + return this; + } + + public RuntimePackInfo setManifest(Manifest[] manifest) { + this.manifest = manifest; + return this; + } + + public class Manifest { + public String name; //清单名称 + public String condition; //清单执行条件类型 + /* 语法定义 + 元素1|元素2 依此类推 + */ + public String condition_info; //执行条件 + public String description; //清单描述 + public String jre_home; //java运行环境目录 + public String so; //动态链接库路径 + public String java_library_path; //环境目录 + public String classpath; //classpath参数 + public String jvmMode; //启动器模式 + + public Manifest setName(String name) { + this.name = name; + return this; + } + + public Manifest setCondition(String condition) { + this.condition = condition; + return this; + } + + public Manifest setDescription(String description) { + this.description = description; + return this; + } + + public Manifest setJre_home(String jre_home) { + this.jre_home = jre_home; + return this; + } + + public Manifest setSo(String so) { + this.so = so; + return this; + } + + public Manifest setConditionInfo(String info){ + this.condition_info = info; + return this; + } + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/SettingManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/SettingManager.java new file mode 100644 index 00000000..5f716eaa --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/SettingManager.java @@ -0,0 +1,100 @@ +package com.aof.mcinabox.launcher.setting; + +import android.content.Context; +import android.util.Log; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.launcher.setting.support.SettingChecker; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.google.gson.Gson; +import java.io.BufferedWriter; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.io.FileWriter; +import java.io.IOException; +import java.io.InputStream; +import java.io.InputStreamReader; +import java.io.Reader; +import java.util.Objects; +import java.util.Timer; +import java.util.TimerTask; + +public class SettingManager { + + private Context mContext; + private File settingFile; + private Timer mTimer; + + private final static String TAG = "SettingManager"; + + public SettingManager(Context context){ + this.mContext = context; + settingFile = new File(Objects.requireNonNull(mContext.getExternalFilesDir("mcinabox")).getAbsolutePath() + "/mcinabox.json"); + } + + /**【读入mcinabox.json】**/ + public SettingJson getSettingFromFile(){ + SettingJson settingModel; + + if (!settingFile.exists()) { + settingModel = new SettingJson(); + } else { + try { + InputStream inputStream = new FileInputStream(settingFile); + Reader reader = new InputStreamReader(inputStream); + Gson gson = new Gson(); + //使用Gson将ListVersionManifestJson实例化 + settingModel = gson.fromJson(reader, SettingJson.class); + } catch (FileNotFoundException e) { + e.printStackTrace(); + settingModel = null; + } + } + + if(settingModel == null){ + settingModel = new SettingJson(); + } + + return settingModel; + } + + /**【保存mcinabox.json文件】**/ + public void saveSettingToFile(){ + Gson gson = new Gson(); + String jsonString = gson.toJson(MainActivity.Setting); + try { + FileWriter jsonWriter = new FileWriter(settingFile); + BufferedWriter out = new BufferedWriter(jsonWriter); + out.write(jsonString); + out.close(); + } catch (IOException e) { + e.printStackTrace(); + Log.e(TAG,"save failed."); + } + } + + public void startChecking(){ + if(mTimer == null){ + mTimer = new Timer(); + mTimer.schedule(new TimerTask() { + @Override + public void run() { + SettingChecker sc = new SettingChecker(mContext,null,null); + sc.checkIfChoseUser(); + sc.checkIfInstallGame(); + sc.checkIfInstallRuntime(); + sc.checkMenmrySize(); + sc.checkIfDisableFileCheck(); + } + },0,500); + } + } + + public void stopChecking(){ + if(mTimer != null){ + mTimer.cancel(); + mTimer = null; + } + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingChecker.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingChecker.java new file mode 100644 index 00000000..3088773e --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingChecker.java @@ -0,0 +1,114 @@ +package com.aof.mcinabox.launcher.setting.support; + +import android.content.Context; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.runtime.RuntimeManager; +import com.aof.mcinabox.launcher.tipper.TipperManager; +import com.aof.mcinabox.launcher.tipper.support.TipperRunable; +import com.aof.mcinabox.launcher.user.UserManager; +import com.aof.utils.FileTool; +import com.aof.utils.MemoryUtils; +import com.aof.utils.dialog.DialogUtils; + +public class SettingChecker { + + private final static int CHECKER_ID_NOT_CHOOSE_USER = 10; + private final static int CHECKER_ID_NOT_INSTALL_RUNTIME = 11; + private final static int CHECKER_ID_NOT_INSTALL_GAME = 12; + private final static int CHECKER_ID_MEMORY_LOW = 13; + private final static int CHECKER_ID_MEMORY_OVER = 14; + private final static int CHECKER_ID_NOT_CHECK_GAME = 15; + + private Context mContext; + private SettingJson mSetting; + private TipperManager mTipperManager; + + public SettingChecker(Context context, SettingJson setting, TipperManager manager){ + this.mContext = context; + if(setting == null){ + mSetting = MainActivity.Setting; + }else{ + mSetting = setting; + } + if(manager == null){ + mTipperManager = MainActivity.CURRENT_ACTIVITY.mTipperManager; + }else{ + mTipperManager = manager; + } + } + + public void checkIfChoseUser(){ + if(UserManager.getSelectedAccount(mSetting) == null){ + mTipperManager.addTip(TipperManager.createTipBean(mContext, TipperManager.TIPPER_LEVEL_WARN, "未选择用户", new TipperRunable() { + @Override + public void run() { + DialogUtils.createSingleChoiceDialog(mContext,"警告","您还没有选择用户,请在左侧导航栏选择用户管理并创建或选择一个用户。","确定",null); + } + },CHECKER_ID_NOT_CHOOSE_USER)); + }else{ + mTipperManager.removeTip(CHECKER_ID_NOT_CHOOSE_USER); + } + } + public void checkIfInstallRuntime(){ + if(RuntimeManager.getPackInfo() == null){ + mTipperManager.addTip(TipperManager.createTipBean(mContext, TipperManager.TIPPER_LEVEL_WARN, "未安装运行库", new TipperRunable() { + @Override + public void run() { + DialogUtils.createSingleChoiceDialog(mContext,"警告","您还没有安装运行库,请在左侧导航栏选择启动器设置并安装运行库。","确定",null); + } + },CHECKER_ID_NOT_INSTALL_RUNTIME)); + }else{ + mTipperManager.removeTip(CHECKER_ID_NOT_INSTALL_RUNTIME); + } + } + public void checkIfInstallGame(){ + if(FileTool.listChildDirFromTargetDir(AppManifest.MINECRAFT_VERSIONS).size() == 0){ + mTipperManager.addTip(TipperManager.createTipBean(mContext, TipperManager.TIPPER_LEVEL_WARN, "未安装游戏", new TipperRunable() { + @Override + public void run() { + DialogUtils.createSingleChoiceDialog(mContext,"警告","您还没有安装任何的游戏版本,请在左侧导航栏选择游戏列表-安装新游戏版本并安装一个游戏版本。","确定",null); + } + },CHECKER_ID_NOT_INSTALL_GAME)); + }else{ + mTipperManager.removeTip(CHECKER_ID_NOT_INSTALL_GAME); + } + } + public void checkMenmrySize(){ + if(mSetting.getConfigurations().getMaxMemory() < 256){ + mTipperManager.addTip(TipperManager.createTipBean(mContext, TipperManager.TIPPER_LEVEL_NOTE, "内存分配过低", new TipperRunable() { + @Override + public void run() { + DialogUtils.createSingleChoiceDialog(mContext,"提示","您设定的内存上限过低,可能导致java虚拟机崩溃,请在左侧导航栏选择启动器设置调整内存大小。","确定",null); + } + },CHECKER_ID_MEMORY_LOW)); + }else{ + mTipperManager.removeTip(CHECKER_ID_MEMORY_LOW); + } + + if(mSetting.getConfigurations().getMaxMemory() > MemoryUtils.getDynamicHeapSize(mContext) * 2 - 20){ + mTipperManager.addTip(TipperManager.createTipBean(mContext, TipperManager.TIPPER_LEVEL_NOTE, "内存分配过高", new TipperRunable() { + @Override + public void run() { + DialogUtils.createSingleChoiceDialog(mContext,"提示","您设定的内存上限过高,可能导致java虚拟机崩溃,请在左侧导航栏选择启动器设置调整内存大小。","确定",null); + } + },CHECKER_ID_MEMORY_OVER)); + }else{ + mTipperManager.removeTip(CHECKER_ID_MEMORY_OVER); + } + } + + public void checkIfDisableFileCheck(){ + if(mSetting.getConfigurations().isNotCheckGame()){ + mTipperManager.addTip(TipperManager.createTipBean(mContext, TipperManager.TIPPER_LEVEL_NOTE, "不检查文件完整性", new TipperRunable() { + @Override + public void run() { + DialogUtils.createSingleChoiceDialog(mContext,"提示","您禁用了文件完整性检查,如果游戏文件不完整,您将不会得到任何提示,在游戏不完整的情况下继续启动,有可能造成minecraft异常崩溃。因此建议您开启文件完整性检查。","确定",null); + } + },CHECKER_ID_NOT_CHECK_GAME)); + }else{ + mTipperManager.removeTip(CHECKER_ID_NOT_CHECK_GAME); + } + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingJson.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingJson.java new file mode 100644 index 00000000..41decf37 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/setting/support/SettingJson.java @@ -0,0 +1,286 @@ +package com.aof.mcinabox.launcher.setting.support; + +import android.os.Environment; + +public class SettingJson { + + public final static String USER_TYPE_OFFLINE = "offline"; + public final static String USER_TYPE_ONLINE = "online"; + + public final static String DOWNLOAD_SOURCE_OFFICIAL = "official"; + public final static String DOWNLOAD_SOURCE_BMCLAPI = "bmclapi"; + public final static String DOWNLOAD_SOURCE_MCBBS = "mcbbs"; + public final static String[] DOWNLOAD_SOURCES = {DOWNLOAD_SOURCE_OFFICIAL, DOWNLOAD_SOURCE_BMCLAPI, DOWNLOAD_SOURCE_MCBBS}; + + public final static String DEFAULT_GAMEDIR = Environment.getExternalStorageDirectory().getPath() + "/MCinaBox/gamedir"; + + private String downloadType; //下载源 + private Configurations configurations; //全局游戏设置 + private boolean backgroundAutoSwitch; //自动切换启动器背景 + private boolean fullscreen; //全屏显示 + private Account[] accounts; //用户信息 + private String lastVersion; //最后一次选择的版本 + private String gamedir; //我的世界目录 + + public SettingJson() { + //默认模板初始化 + super(); + + downloadType = DOWNLOAD_SOURCE_OFFICIAL; + lastVersion = ""; + gamedir = DEFAULT_GAMEDIR; + + configurations = new Configurations() + .setJavaArgs("") + .setMinecraftArgs("") + .setMaxMemory(256) + .setNotCheckGame(false) + .setNotCheckPlatform(false); + + accounts = new Account[]{}; + } + + //全局游戏设置 + public class Configurations { + private String javaArgs; //Java虚拟机附加启动参数 + private String minecraftArgs; //Minecraft附加启动参数 + private int maxMemory; //最大内存 + private boolean notCheckGame; //启动时不检查游戏完整性 + private boolean notCheckPlatform; //启动时不检查JVM架构的兼容性 + private boolean notCheckTipper; //启动时不检查消息管理器 + private boolean notCheckForge; //不检查forge + private boolean notCheckOptions; //不检查options.txt + private boolean alwaysChoiceRuntimeManifest; //总是选择运行库清单 + private boolean enableDebug; //启用调试 + private boolean enableAutoMemory; //启用自动内存设定 + + public Configurations(){ + super(); + } + + //Getter and Setter + public String getJavaArgs() { + return javaArgs; + } + + public Configurations setJavaArgs(String javaArgs) { + this.javaArgs = javaArgs; + return this; + } + + public boolean isEnableDebug(){ + return enableDebug; + } + + public Configurations setDebug(boolean b){ + this.enableDebug = b; + return this; + } + + public String getMinecraftArgs() { + return minecraftArgs; + } + + public Configurations setMinecraftArgs(String minecraftArgs) { + this.minecraftArgs = minecraftArgs; + return this; + } + + public int getMaxMemory() { + return maxMemory; + } + + public Configurations setMaxMemory(int maxMemory) { + this.maxMemory = maxMemory; + return this; + } + + public boolean isNotCheckGame() { + return notCheckGame; + } + + public Configurations setNotCheckGame(boolean notCheckGame) { + this.notCheckGame = notCheckGame; + return this; + } + + public boolean isNotCheckPlatform() { + return notCheckPlatform; + } + + public Configurations setNotCheckPlatform(boolean b) { + this.notCheckPlatform = b; + return this; + } + + public boolean isNotCheckTipper(){ + return notCheckTipper; + } + + public Configurations setNotCheckTipper(boolean b){ + this.notCheckTipper = b; + return this; + } + + public Configurations setAlwaysChoiceRuntimeMainfest(boolean b){ + this.alwaysChoiceRuntimeManifest = b; + return this; + } + + public boolean isAlwaysChoiceRuntimeManifest(){ + return this.alwaysChoiceRuntimeManifest; + } + + public Configurations setNotCheckForge(boolean b){ + this.notCheckForge = b; + return this; + } + + public boolean isNotCheckForge(){ + return this.notCheckForge; + } + + public Configurations setAutoMemory(boolean b){ + this.enableAutoMemory = b; + return this; + } + + public boolean isEnableAutoMemory(){ + return this.enableAutoMemory; + } + + public Configurations setNotCheckOptions(boolean b){ + this.notCheckOptions = b; + return this; + } + + public boolean isNotCheckOptions(){ + return this.notCheckOptions; + } + + } + + + //用户列表 + public class Account { + String uuid; //唯一用户标识 + String username; //用户名 + String type; //用户类型 "offline"离线模式 "online"线上模式 + String accessToken; //通行令牌 + boolean selected; //是否被选中 + + public Account(){ + super(); + } + + //Getter and Setter + public String getUuid() { + return uuid; + } + + public Account setUuid(String uuid) { + this.uuid = uuid; + return this; + } + + public String getUsername() { + return username; + } + + public Account setUsername(String username) { + this.username = username; + return this; + } + + public String getType() { + return type; + } + + public Account setType(String type) { + this.type = type; + return this; + } + + public boolean isSelected() { + return selected; + } + + public Account setSelected(boolean selected) { + this.selected = selected; + return this; + } + + public String getAccessToken() { + return accessToken; + } + + public Account setAccessToken(String accessToken) { + this.accessToken = accessToken; + return this; + } + + } + + public String getDownloadType() { + return downloadType; + } + + public SettingJson setDownloadType(String downloadType) { + this.downloadType = downloadType; + return this; + } + + public Configurations getConfigurations() { + return configurations; + } + + public SettingJson setConfigurations(Configurations configurations) { + this.configurations = configurations; + return this; + } + + public Account[] getAccounts() { + return accounts; + } + + public SettingJson setAccounts(Account[] accounts) { + this.accounts = accounts; + return this; + } + + public String getLastVersion() { + return lastVersion; + } + + public SettingJson setLastVersion(String lastVersion) { + this.lastVersion = lastVersion; + return this; + } + + public String getGamedir() { + return this.gamedir; + } + + public SettingJson setGameDir(String dir) { + this.gamedir = dir; + return this; + } + + public boolean isBackgroundAutoSwitch(){ + return this.backgroundAutoSwitch; + } + + public SettingJson setBackgroundAutoSwitch(boolean b){ + this.backgroundAutoSwitch = b; + return this; + } + + public boolean isFullscreen(){ + return this.fullscreen; + } + + public SettingJson setFullscreen(boolean b){ + this.fullscreen = b; + return this; + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/ThemeManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/ThemeManager.java new file mode 100644 index 00000000..b3da263b --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/ThemeManager.java @@ -0,0 +1,38 @@ +package com.aof.mcinabox.launcher.theme; + +import android.app.Activity; +import android.content.Context; +import android.view.View; +import android.view.WindowManager; + +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.theme.support.ThemeUtils; + +public class ThemeManager { + + private Context mContext; + private final static String TAG = "ThemeManager"; + private final static String SUPPORTED_PIC_SUFFIX = "png"; + + public ThemeManager(Context context){ + this.mContext = context; + } + + public boolean autoSetBackground(View v){ + try { + String[] result = ThemeUtils.getBackgroundsNames(SUPPORTED_PIC_SUFFIX); + if(result.length != 0){ + return ThemeUtils.replaceBackGround(mContext, v, AppManifest.MCINABOX_BACKGROUND + "/" + ThemeUtils.randomSelectedBackgroundFileName(result)); + } + return true; + }catch (Exception e){ + e.printStackTrace(); + return false; + } + } + + public void setFullScreen(Activity activity){ + activity.getWindow().setFlags(WindowManager.LayoutParams.FLAG_FULLSCREEN, WindowManager.LayoutParams.FLAG_FULLSCREEN); + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/support/ThemeUtils.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/support/ThemeUtils.java new file mode 100644 index 00000000..3fe080c9 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/theme/support/ThemeUtils.java @@ -0,0 +1,68 @@ +package com.aof.mcinabox.launcher.theme.support; + +import android.content.Context; +import android.graphics.Bitmap; +import android.graphics.BitmapFactory; +import android.graphics.drawable.BitmapDrawable; +import android.util.Log; +import android.view.View; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.utils.FileTool; +import java.io.File; +import java.io.FileInputStream; +import java.io.FileNotFoundException; +import java.util.Random; + +public class ThemeUtils { + + private final static String TAG = "ThemeUtils"; + + public static Bitmap getBitmapFromFile(File file){ + FileInputStream stream; + try { + stream = new FileInputStream(file); + } catch (FileNotFoundException e) { + e.printStackTrace(); + Log.e(TAG,"Failed to read File: " + file.getAbsolutePath()); + return null; + } + + //根据配置读入图片 + return BitmapFactory.decodeStream(stream); + } + + public static Bitmap getBitmapFromFile(String path){ + return getBitmapFromFile(new File(path)); + } + + public static boolean replaceBackGround(Context context, View v, File pic){ + Bitmap bm = getBitmapFromFile(pic); + if(bm == null){ + return false; + }else{ + v.setBackground(new BitmapDrawable(context.getResources(),bm)); + return true; + } + } + + public static boolean replaceBackGround(Context context, View v, String path){ + return replaceBackGround(context,v,new File(path)); + } + + public static String[] getBackgroundsNames(String suffix){ + return FileTool.listChildFileFromTargetDirFilterSuffix(suffix,AppManifest.MCINABOX_BACKGROUND); + } + + public static File getBackFileFromName(String name){ + return new File(AppManifest.MCINABOX_BACKGROUND + "/" + name); + } + + public static String randomSelectedBackgroundFileName(String[] list){ + int max = list.length; + Random rd = new Random(); + return list[rd.nextInt(max)]; + } + + + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/Tipper.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/Tipper.java index 0969364e..544ad90f 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/Tipper.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/Tipper.java @@ -1,38 +1,32 @@ package com.aof.mcinabox.launcher.tipper; -import android.app.Activity; +import android.content.Context; import android.view.Gravity; import android.view.LayoutInflater; import android.view.View; import android.widget.ListView; import android.widget.PopupWindow; - -import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.launcher.uis.MainToolbarUI; -import com.aof.mcinabox.utils.FileTool; +import com.aof.mcinabox.launcher.tipper.support.TipperListAdapter; +import com.aof.mcinabox.launcher.tipper.support.TipperListBean; import com.daasuu.bl.ArrowDirection; import com.daasuu.bl.BubbleLayout; import com.daasuu.bl.BubblePopupHelper; - -import java.util.ArrayList; - -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_RUNTIME_FILES; +import java.util.List; public class Tipper { - public Tipper(Activity context) { - mContext = context; - initTipper(); - } - private Activity mContext; + private Context mContext; private ListView listTipper; private BubbleLayout bubbleTipper; private PopupWindow popupWindow; - private ArrayList tipslist; - private void initTipper() { + public Tipper(Context context) { + mContext = context; + init(); + } + + private void init() { bubbleTipper = (BubbleLayout) LayoutInflater.from(mContext).inflate(R.layout.layout_popup_tipper, null); popupWindow = BubblePopupHelper.create(mContext, bubbleTipper); listTipper = bubbleTipper.findViewById(R.id.tipper_list); @@ -42,8 +36,11 @@ private void initTipper() { /** * 【在View下方显示Tipper】 **/ - public void showTipper(View v) { - TipperListAdapter tipperListAdapter = new TipperListAdapter(mContext, tipslist); + public void showTipper(View v, List list) { + if(list == null || list.size() == 0){ + return; + } + TipperListAdapter tipperListAdapter = new TipperListAdapter(mContext, list); listTipper.setAdapter(tipperListAdapter); int[] location = new int[2]; v.getLocationInWindow(location); @@ -51,78 +48,4 @@ public void showTipper(View v) { popupWindow.showAtLocation(v, Gravity.NO_GRAVITY, location[0], v.getHeight() + location[1]); } - public void refreshTipper(SettingJson setting, MainToolbarUI toolbarUI) { - ArrayList tip_indexs = new ArrayList<>(); - - boolean User_isSelected = false; - boolean Keyboard_isSelected = false; - boolean Minecraft_isSelected = false; - boolean Runtime_isImported = false; - - //检查用户是否选择 - SettingJson.Accounts[] accounts = setting.getAccounts(); - for (SettingJson.Accounts p1 : accounts) { - if (p1.isSelected()) { - User_isSelected = true; - } - } - - //检查键盘模版是否选择 - if (setting.getKeyboard() != null && !setting.getKeyboard().equals("")) { - Keyboard_isSelected = true; - } - - - //检查游戏版本是否选择 - if (setting.getLastVersion() != null && !setting.getLastVersion().equals("")) { - Minecraft_isSelected = true; - } - - //检查运行库是否导入 - for (String p1 : MCINABOX_RUNTIME_FILES) { - if (FileTool.isFileExists(p1)) { - Runtime_isImported = true; - } - } - - //检查内存大小设置是否正确 - if (setting.getConfigurations().getMaxMemory() >= 128 && setting.getConfigurations().getMaxMemory() <= 1024) { - //nothing - } else { - tip_indexs.add(5); - } - - if (User_isSelected && Keyboard_isSelected && Minecraft_isSelected && Runtime_isImported) { - toolbarUI.setTaskInfoBackground(R.drawable.ic_info_outline_blue_500_24dp); - return; - } else { - toolbarUI.setTaskInfoBackground(R.drawable.ic_info_red_500_24dp); - if (!User_isSelected) { - tip_indexs.add(1); - } - if (!Keyboard_isSelected) { - tip_indexs.add(3); - } - if (!Minecraft_isSelected) { - tip_indexs.add(2); - } - if (!Runtime_isImported) { - tip_indexs.add(4); - } - } - - if (tip_indexs.size() != 0) { - ArrayList tipperlist = new ArrayList(); - for (int index : tip_indexs) { - TipperListBean tmp = new TipperListBean(); - tmp.setContext(mContext); - tmp.setTipper_index(index); - tipperlist.add(tmp); - } - tipslist = tipperlist; - } - - } - - } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperListBean.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperListBean.java deleted file mode 100644 index 67914444..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperListBean.java +++ /dev/null @@ -1,30 +0,0 @@ -package com.aof.mcinabox.launcher.tipper; - -import android.content.Context; - -public class TipperListBean { - private String tipper_info; - private Context context; - private int tipper_index; - - public int getTipper_index() { - return tipper_index; - } - - public void setTipper_index(int tipper_index) { - this.tipper_index = tipper_index; - } - - public String getTipper_info() { - return tipper_info; - } - public void setTipper_info(String tipper_info) { - this.tipper_info = tipper_info; - } - public Context getContext() { - return context; - } - public void setContext(Context context) { - this.context = context; - } -} \ No newline at end of file diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperManager.java new file mode 100644 index 00000000..616edae2 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperManager.java @@ -0,0 +1,84 @@ +package com.aof.mcinabox.launcher.tipper; + +import android.content.Context; +import android.util.Log; +import android.view.View; + +import com.aof.mcinabox.launcher.tipper.support.TipperListBean; +import com.aof.mcinabox.launcher.tipper.support.TipperRunable; +import java.util.ArrayList; + +public class TipperManager { + + public final static int TIPPER_LEVEL_NOTE = 0; + public final static int TIPPER_LEVEL_WARN = 1; + public final static int TIPPER_LEVEL_ERROR = 2; + + private final static String TAG = "TipperManager"; + + private Tipper mTipper; + private ArrayList tipperList; + + public TipperManager(Context context){ + mTipper = new Tipper(context); + tipperList = new ArrayList<>(); + } + + public static TipperListBean createTipBean(Context context, int level, String des /*描述*/, TipperRunable runable, int id){ + return new TipperListBean() + .setContext(context) + .setTipper_level(level) + .setTipper_info(des) + .setTipper_runable(runable) + .setTipper_id(id); + } + + public void addTip(TipperListBean tipbean){ + for(TipperListBean bean : tipperList){ + if(bean.getTipper_id() == tipbean.getTipper_id()){ + return; + } + } + tipperList.add(tipbean); + Log.e(TAG,"添加完成 " + tipperList.size()); + } + + public void removeTip(int id){ + for(TipperListBean bean : tipperList){ + if(bean.getTipper_id() == id){ + tipperList.remove(bean); + break; + } + } + ArrayList tmp = new ArrayList<>(); + for(TipperListBean bean : tipperList){ + if(bean != null){ + tmp.add(bean); + } + } + this.tipperList = tmp; + } + + public void showTipper(View underView){ + mTipper.showTipper(underView, this.tipperList); + } + + public void clearTipper(){ + this.tipperList = new ArrayList<>(); + } + + public int getTipCounts(){ + return this.tipperList.size(); + } + + public int getTipCounts(int level){ + int a = 0; + for(int b = 0; b < tipperList.size(); b++){ + if (tipperList.get(b).getTipper_level() == level){ + a++; + } + } + return a; + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/ids.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/ids.java new file mode 100644 index 00000000..3b85a699 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/ids.java @@ -0,0 +1,5 @@ +package com.aof.mcinabox.launcher.tipper; + +public class ids { + //TIPPER_ID = 10 -> UserUI +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperListAdapter.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperListAdapter.java similarity index 55% rename from mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperListAdapter.java rename to mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperListAdapter.java index c3adcef5..69403b71 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/TipperListAdapter.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperListAdapter.java @@ -1,6 +1,7 @@ -package com.aof.mcinabox.launcher.tipper; +package com.aof.mcinabox.launcher.tipper.support; import android.content.Context; +import android.graphics.Color; import android.view.LayoutInflater; import android.view.View; import android.view.ViewGroup; @@ -8,15 +9,15 @@ import android.widget.ImageButton; import android.widget.TextView; import com.aof.mcinabox.R; -import java.util.ArrayList; +import com.aof.mcinabox.launcher.tipper.TipperManager; + +import java.util.List; public class TipperListAdapter extends BaseAdapter { - private ArrayList tipperList; + private List tipperList; private LayoutInflater mLayoutInflater; - - - public TipperListAdapter(ArrayList list){ + public TipperListAdapter(List list){ tipperList = list; } @@ -34,7 +35,7 @@ public long getItemId(int position){ } - public TipperListAdapter(Context context, ArrayList list) { + public TipperListAdapter(Context context, List list) { tipperList = list; mLayoutInflater = LayoutInflater.from(context); } @@ -47,38 +48,36 @@ public View getView(final int position, View convertView, ViewGroup parent) { viewHolder = new ViewHolder(); viewHolder.tip = convertView.findViewById(R.id.tipper_info); viewHolder.help = convertView.findViewById(R.id.tipper_help); + viewHolder.level = convertView.findViewById(R.id.tipper_level); + + switch (tipperList.get(position).getTipper_level()){ + case TipperManager.TIPPER_LEVEL_NOTE: + viewHolder.level.setText("N"); + viewHolder.level.setTextColor(Color.BLUE); + break; + case TipperManager.TIPPER_LEVEL_WARN: + viewHolder.level.setText("W"); + viewHolder.level.setTextColor(Color.GRAY); + break; + case TipperManager.TIPPER_LEVEL_ERROR: + viewHolder.level.setText("E"); + viewHolder.level.setTextColor(Color.RED); + break; + } + convertView.setTag(viewHolder); }else{ viewHolder = (ViewHolder)convertView.getTag(); } viewHolder.context = tipperList.get(position).getContext(); - String tips = ""; - switch(tipperList.get(position).getTipper_index()){ - case 1: - tips = viewHolder.context.getString(R.string.tipper_warn_user_notselected); - break; - case 2: - tips = viewHolder.context.getString(R.string.tipper_warn_version_notselected); - break; - case 3: - tips = viewHolder.context.getString(R.string.tipper_warn_keyboard_notselected); - break; - case 4: - tips = viewHolder.context.getString(R.string.tipper_warn_runtime_notinstall); - break; - case 5: - tips = viewHolder.context.getString(R.string.tipper_warn_memory_notstable); - break; - default: - break; - } - viewHolder.tip.setText(tips); - + viewHolder.tip.setText(tipperList.get(position).getTipper_info()); viewHolder.help.setOnClickListener(new View.OnClickListener() { @Override public void onClick(View v) { - + if(tipperList.get(position).getTipper_runable() != null){ + tipperList.get(position).getTipper_runable().run(); + } }}); return convertView; @@ -86,6 +85,7 @@ public void onClick(View v) { class ViewHolder{ public TextView tip; + public TextView level; public ImageButton help; Context context; } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperListBean.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperListBean.java new file mode 100644 index 00000000..2f22f7e9 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperListBean.java @@ -0,0 +1,56 @@ +package com.aof.mcinabox.launcher.tipper.support; + +import android.content.Context; + +public class TipperListBean { + private String tipper_info; + private Context context; + private int tipper_level; + private TipperRunable tipper_runable; + private int tipper_id; + + public String getTipper_info() { + return tipper_info; + } + + public TipperListBean setTipper_info(String tipper_info) { + this.tipper_info = tipper_info; + return this; + } + + public Context getContext() { + return context; + } + + public TipperListBean setContext(Context context) { + this.context = context; + return this; + } + + public int getTipper_level(){ + return this.tipper_level; + } + + public TipperListBean setTipper_level(int level){ + this.tipper_level = level; + return this; + } + + public TipperRunable getTipper_runable(){ + return this.tipper_runable; + } + + public TipperListBean setTipper_runable(TipperRunable runable){ + this.tipper_runable = runable; + return this; + } + + public int getTipper_id(){ + return this.tipper_id; + } + + public TipperListBean setTipper_id(int id){ + this.tipper_id = id; + return this; + } +} \ No newline at end of file diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperRunable.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperRunable.java new file mode 100644 index 00000000..47a2b22d --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/tipper/support/TipperRunable.java @@ -0,0 +1,7 @@ +package com.aof.mcinabox.launcher.tipper.support; + +public interface TipperRunable { + + public void run(); + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/BaseUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/BaseUI.java index 61375c1a..585243e7 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/BaseUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/BaseUI.java @@ -1,26 +1,22 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; -import android.app.Application; -import android.os.Bundle; - -import com.aof.mcinabox.launcher.json.SettingJson; +import android.content.Context; public abstract class BaseUI implements UILifecycleCallbacks { - public Activity mContext; + public Context mContext; //Method instruction - public BaseUI(Activity context){ + public BaseUI(Context context){ super(); setUIContext(context); } //Apply states from Setting to UIs - public abstract void refreshUI(SettingJson setting); + public abstract void refreshUI(); //Save States of UIs to Setting - public abstract SettingJson saveUIConfig(SettingJson setting); + public abstract void saveUIConfig(); //Set the visiability of the UI public abstract void setUIVisiability(int visiability); @@ -29,34 +25,38 @@ public BaseUI(Activity context){ public abstract int getUIVisiability(); //Set Android Context - public void setUIContext(Activity context){ + public void setUIContext(Context context){ this.mContext = context; } @Override - public void onCreate(SettingJson setting){ } + public void onCreate(){ } @Override - public void onStart(SettingJson setting){ } + public void onStart(){ } @Override - public void onResumed(){ } + public void onResume(){ } @Override - public void onPaused(){ } + public void onPause(){ } @Override public void onStop(){ } @Override - public void onDestory(){ } + public void onDestory(){} + + @Override + public void onRestart(){} } interface UILifecycleCallbacks{ - void onCreate(SettingJson setting); - void onStart(SettingJson setting); - void onResumed(); - void onPaused(); + void onCreate(); + void onStart(); + void onResume(); + void onRestart(); + void onPause(); void onStop(); void onDestory(); } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/FunctionbarUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/FunctionbarUI.java index 8ecd6188..cc74b008 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/FunctionbarUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/FunctionbarUI.java @@ -1,66 +1,63 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; import android.content.Intent; import android.view.View; -import android.widget.Button; import android.widget.LinearLayout; import android.widget.TextView; - import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.VirtualKeyBoardActivity; -import com.aof.mcinabox.launcher.json.SettingJson; +import com.aof.mcinabox.gamecontroller.ckb.CustomizeKeyboardEditorActivity; +import com.aof.mcinabox.launcher.setting.support.SettingJson; public class FunctionbarUI extends BaseUI { - public FunctionbarUI(Activity context) { + public FunctionbarUI(Context context) { super(context); } private LinearLayout layout_functionbar; private LinearLayout buttonUser; - private Button buttonPlugin; - private Button buttonGamelist; - private Button buttonGamedir; - private Button buttonSetting; - private Button buttonKeyboard; - + private LinearLayout buttonPlugin; + private LinearLayout buttonGamelist; + private LinearLayout buttonGamedir; + private LinearLayout buttonSetting; + private LinearLayout buttonKeyboard; + private LinearLayout buttonHome; private TextView textUserName; private TextView textUserType; - - private View[] views; - + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { - layout_functionbar = mContext.findViewById(R.id.layout_functions); + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; + layout_functionbar = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_functions); buttonUser = layout_functionbar.findViewById(R.id.main_button_user); buttonPlugin = layout_functionbar.findViewById(R.id.main_button_plugin); buttonGamelist = layout_functionbar.findViewById(R.id.main_button_gamelist); buttonGamedir = layout_functionbar.findViewById(R.id.main_button_gamedir); buttonSetting = layout_functionbar.findViewById(R.id.main_button_setting); buttonKeyboard = layout_functionbar.findViewById(R.id.main_button_keyboard); - + buttonHome = layout_functionbar.findViewById(R.id.main_button_home); textUserName = layout_functionbar.findViewById(R.id.functionbar_username); textUserType = layout_functionbar.findViewById(R.id.functionbar_usertype); - views = new View[]{buttonUser,buttonPlugin,buttonGamelist,buttonGamedir,buttonSetting,buttonKeyboard}; - for(View v : views){ + for(View v : new View[]{buttonUser,buttonPlugin,buttonGamelist,buttonGamedir,buttonSetting,buttonKeyboard,buttonHome}){ v.setOnClickListener(clickListener); } - refreshUI(setting); + refreshUI(); } @Override - public void refreshUI(SettingJson setting) { - refreshUserInfo(setting); + public void refreshUI() { + refreshUserInfo(); } @Override - public SettingJson saveUIConfig(SettingJson setting) { - return setting; + public void saveUIConfig() { + } @Override @@ -78,42 +75,44 @@ public int getUIVisiability() { @Override public void onClick(View v) { if(v == buttonUser){ - ((MainActivity)mContext).switchUIs(((MainActivity) mContext).uiUser,mContext.getString(R.string.title_user)); + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiUser,mContext.getString(R.string.title_user)); } if(v == buttonPlugin){ - ((MainActivity)mContext).switchUIs(((MainActivity) mContext).uiPlugin,mContext.getString(R.string.title_plugin)); + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiPlugin,mContext.getString(R.string.title_plugin)); } if(v == buttonGamelist){ - ((MainActivity)mContext).switchUIs(((MainActivity) mContext).uiGamelist,mContext.getString(R.string.title_gamelist)); + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiGamelist,mContext.getString(R.string.title_gamelist)); } if(v == buttonGamedir){ - ((MainActivity)mContext).switchUIs(((MainActivity) mContext).uiGamedir,mContext.getString(R.string.title_gamedir)); + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiGamedir,mContext.getString(R.string.title_gamedir)); } if(v == buttonSetting){ - ((MainActivity)mContext).switchUIs(((MainActivity) mContext).uiLauncherSetting,mContext.getString(R.string.title_launchersetting)); + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiLauncherSetting,mContext.getString(R.string.title_launchersetting)); } if(v == buttonKeyboard){ - //Start VirtualKeyboardActivity. - Intent intent = new Intent(mContext, VirtualKeyBoardActivity.class); + Intent intent = new Intent(mContext, CustomizeKeyboardEditorActivity.class); mContext.startActivity(intent); } + if(v == buttonHome){ + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiStartGame,mContext.getString(R.string.title_home)); + } } }; - private void refreshUserInfo(SettingJson setting){ + private void refreshUserInfo(){ boolean selected = false; - SettingJson.Accounts[] accounts = setting.getAccounts(); + SettingJson.Account[] accounts = setting.getAccounts(); if(accounts != null && accounts.length != 0){ - for(SettingJson.Accounts a : accounts){ + for(SettingJson.Account a : accounts){ if(a.isSelected()){ selected = true; textUserName.setText(a.getUsername()); String type; switch(a.getType()){ - case "offline": + case SettingJson.USER_TYPE_OFFLINE: type = mContext.getString(R.string.title_offline); break; - case "online": + case SettingJson.USER_TYPE_ONLINE: type = mContext.getString(R.string.title_online); break; default: diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GameSettingUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GameSettingUI.java index f25cbf9f..0bfc8fed 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GameSettingUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GameSettingUI.java @@ -1,28 +1,29 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; +import android.widget.CompoundButton; import android.widget.EditText; import android.widget.LinearLayout; import android.widget.Spinner; -import android.widget.Switch; import android.widget.TextView; +import androidx.appcompat.widget.SwitchCompat; + +import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.JsonUtils; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.utils.MemoryUtils; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.utils.MemoryUtils; import java.io.File; import java.util.ArrayList; -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_FILE_JSON; -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_KEYBOARD; +import static com.aof.mcinabox.definitions.manifest.AppManifest.MCINABOX_KEYBOARD; -public class GameSettingUI extends BaseUI { +public class GameSettingUI extends BaseUI implements SwitchCompat.OnCheckedChangeListener { - public GameSettingUI(Activity context) { + public GameSettingUI(Context context) { super(context); } @@ -31,64 +32,80 @@ public GameSettingUI(Activity context) { private EditText editMaxMem; private EditText editJavaExtArgs; private EditText editMCExtArgs; - private Switch switchDisJVMCheck; - private Switch switchDisMCCheck; + private SwitchCompat switchDisJVMCheck; + private SwitchCompat switchDisMCCheck; + private SwitchCompat switchDisTipperCheck; + private SwitchCompat switchEnableDebug; + private SwitchCompat switchAlwaysChoiceManifest; + private SwitchCompat switchDisForgeCheck; + private SwitchCompat switchAutoMenmory; + private SwitchCompat switchDisOptCheck; private Spinner listKeyboards; + private SettingJson setting; + + private final static String TAG = "GameSettingUI"; @Override - public void onCreate(SettingJson setting) { - layout_gamesetting = mContext.findViewById(R.id.layout_gamelist_setting); + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; + layout_gamesetting = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_gamelist_setting); textPhysicalMem = layout_gamesetting.findViewById(R.id.game_setting_text_memory); editMaxMem = layout_gamesetting.findViewById(R.id.setting_edit_maxmemory); editJavaExtArgs = layout_gamesetting.findViewById(R.id.setting_edit_javaargs); editMCExtArgs = layout_gamesetting.findViewById(R.id.setting_edit_minecraftargs); switchDisJVMCheck = layout_gamesetting.findViewById(R.id.setting_switch_notcheckjvm); switchDisMCCheck = layout_gamesetting.findViewById(R.id.setting_switch_notcheckminecraft); + switchDisTipperCheck = layout_gamesetting.findViewById(R.id.setting_switch_notchecktipper); + switchEnableDebug = layout_gamesetting.findViewById(R.id.setting_switch_debug); + switchAlwaysChoiceManifest = layout_gamesetting.findViewById(R.id.setting_switch_always_choice_runtime_manifest); + switchDisForgeCheck = layout_gamesetting.findViewById(R.id.setting_switch_notcheckforge); + switchAutoMenmory = layout_gamesetting.findViewById(R.id.setting_swith_auto_memory); + switchDisOptCheck = layout_gamesetting.findViewById(R.id.setting_switch_notcheckoptions); listKeyboards = layout_gamesetting.findViewById(R.id.setting_spinner_keyboard); - loadInfo(setting); - refreshUI(setting); - } - @Override - public void refreshUI(SettingJson setting) { - refreshAvailableMemories(); + //设定属性 refreshLocalKeyboardList(); + refreshAvailableMemories(); + editJavaExtArgs.setText(setting.getConfigurations().getJavaArgs()); + editMaxMem.setText(String.valueOf(setting.getConfigurations().getMaxMemory())); + editMCExtArgs.setText(setting.getConfigurations().getMinecraftArgs()); + switchDisJVMCheck.setChecked(setting.getConfigurations().isNotCheckPlatform()); + switchDisMCCheck.setChecked(setting.getConfigurations().isNotCheckGame()); + switchDisTipperCheck.setChecked(setting.getConfigurations().isNotCheckTipper()); + switchEnableDebug.setChecked(setting.getConfigurations().isEnableDebug()); + switchAlwaysChoiceManifest.setChecked(setting.getConfigurations().isAlwaysChoiceRuntimeManifest()); + switchDisForgeCheck.setChecked(setting.getConfigurations().isNotCheckForge()); + switchDisOptCheck.setChecked(setting.getConfigurations().isNotCheckOptions()); + + //设定监听 + for (SwitchCompat s : new SwitchCompat[]{switchDisMCCheck, switchDisJVMCheck, switchDisTipperCheck, switchEnableDebug, switchAlwaysChoiceManifest, switchDisForgeCheck, switchAutoMenmory, switchDisOptCheck}) { + s.setOnCheckedChangeListener(this); + } + + switchAutoMenmory.setChecked(setting.getConfigurations().isEnableAutoMemory()); + } - private void loadInfo(SettingJson setting){ - //This should not be applied again after the UI has been created. + @Override + public void refreshUI() { refreshLocalKeyboardList(); - setConfigureToKeyboardList(setting.getKeyboard()); - editJavaExtArgs.setText(setting.getConfigurations().getJavaArgs()); - editMaxMem.setText((Integer.valueOf(setting.getConfigurations().getMaxMemory())).toString()); - switchDisJVMCheck.setChecked(setting.getConfigurations().isNotCheckJvm()); - switchDisMCCheck.setChecked(setting.getConfigurations().isNotCheckGame()); } @Override - public SettingJson saveUIConfig(SettingJson setting) { + public void saveUIConfig() { SettingJson.Configurations configurations = setting.getConfigurations(); if (editMaxMem.getText().toString().equals("")) { configurations.setMaxMemory(0); } else { - configurations.setMaxMemory(Integer.parseInt((String) editMaxMem.getText().toString())); + configurations.setMaxMemory(Integer.parseInt(editMaxMem.getText().toString())); } configurations.setJavaArgs(editJavaExtArgs.getText().toString()); configurations.setMinecraftArgs(editMCExtArgs.getText().toString()); - configurations.setNotCheckJvm(switchDisJVMCheck.isChecked()); - configurations.setNotCheckGame(switchDisMCCheck.isChecked()); - - if (listKeyboards.getSelectedItem() == null) { - setting.setKeyboard(""); - } else { - setting.setKeyboard(listKeyboards.getSelectedItem().toString()); - } - setting.setConfigurations(configurations); - return setting; } @Override @@ -106,17 +123,17 @@ public int getUIVisiability() { * Refresh the Physical Memory Size. **/ private void refreshAvailableMemories() { - textPhysicalMem.setText(MemoryUtils.getTotalMemory(mContext.getApplication())); + textPhysicalMem.setText(MemoryUtils.getTotalMemory(mContext)); } /** * 【刷新键盘模板列表】 * Refresh the Keyboard layout list. **/ - private ArrayList KeyboardList = new ArrayList(); + private ArrayList KeyboardList = new ArrayList<>(); private void refreshLocalKeyboardList() { - ArrayList keyboardList = new ArrayList(); + ArrayList keyboardList = new ArrayList<>(); File file = new File(MCINABOX_KEYBOARD + "/"); File[] files = file.listFiles(); if (files == null) { @@ -126,7 +143,7 @@ private void refreshLocalKeyboardList() { keyboardList.add(targetFile.getName()); } if (listKeyboards.getAdapter() == null) { - ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_spinner_item, KeyboardList); + ArrayAdapter adapter = new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_item, KeyboardList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); listKeyboards.setAdapter(adapter); } else { @@ -137,15 +154,37 @@ private void refreshLocalKeyboardList() { } } - /** - * 【根据Keyboard参数匹配键盘布局】 - * Select the last Keyboard layout. - **/ - private void setConfigureToKeyboardList(String itemName) { - int pos = Utils.getItemPosByString(itemName, listKeyboards); - if (pos != -1) { - listKeyboards.setSelection(pos); + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (buttonView == switchDisJVMCheck) { + setting.getConfigurations().setNotCheckPlatform(isChecked); + } + if (buttonView == switchDisMCCheck) { + setting.getConfigurations().setNotCheckGame(isChecked); + } + if (buttonView == switchDisTipperCheck) { + setting.getConfigurations().setNotCheckTipper(isChecked); + } + if (buttonView == switchEnableDebug) { + setting.getConfigurations().setDebug(isChecked); + } + if (buttonView == switchAlwaysChoiceManifest) { + setting.getConfigurations().setAlwaysChoiceRuntimeMainfest(isChecked); + } + if (buttonView == switchDisForgeCheck) { + setting.getConfigurations().setNotCheckForge(isChecked); + } + if (buttonView == switchAutoMenmory) { + setting.getConfigurations().setAutoMemory(isChecked); + if (isChecked) { + editMaxMem.setText(String.valueOf(MemoryUtils.getDynamicHeapSize(mContext) * 2 - 50)); + editMaxMem.setEnabled(false); + } else { + editMaxMem.setEnabled(true); + } + } + if (buttonView == switchDisOptCheck) { + setting.getConfigurations().setNotCheckOptions(isChecked); } } - } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamedirUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamedirUI.java index 2bbf6b5d..7b74b0ef 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamedirUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamedirUI.java @@ -1,61 +1,68 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.app.Dialog; +import android.content.Context; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import android.widget.Button; +import android.widget.EditText; import android.widget.LinearLayout; -import android.widget.RadioButton; - +import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.SettingJson; +import com.aof.mcinabox.launcher.gamedir.GamedirManager; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.utils.PromptUtils; +import com.aof.utils.dialog.DialogUtils; +import com.aof.utils.dialog.support.DialogSupports; + +import java.io.File; public class GamedirUI extends BaseUI { - public GamedirUI(Activity context) { + public GamedirUI(Context context) { super(context); - } private LinearLayout layout_gamedir; - private RadioButton buttonPublic, buttonPrivate; + private LinearLayout layoutPrivate; + private LinearLayout layoutPublic; + private EditText editGamedir; + private Button buttonSave; private Animation showAnim; - private View[] views; - + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; showAnim = AnimationUtils.loadAnimation(mContext, R.anim.layout_show); - layout_gamedir = mContext.findViewById(R.id.layout_gamedir); - buttonPublic = layout_gamedir.findViewById(R.id.radiobutton_gamedir_public); - buttonPrivate = layout_gamedir.findViewById(R.id.radiobutton_gamedir_private); - views = new View[]{buttonPrivate,buttonPublic}; - if (setting.getLocalization().equals("private")) { - switchRadioButton(buttonPrivate); - } else if (setting.getLocalization().equals("public")) { - switchRadioButton(buttonPublic); - } else { - switchRadioButton(buttonPublic); - } - for(View v:views){ + layout_gamedir = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_gamedir); + layoutPrivate = layout_gamedir.findViewById(R.id.gamedir_select_private); + layoutPublic = layout_gamedir.findViewById(R.id.gamedir_select_public); + buttonSave = layout_gamedir.findViewById(R.id.gamedir_button_save); + editGamedir = layout_gamedir.findViewById(R.id.gamedir_edit_gamedir); + + for(View v : new View[]{buttonSave,layoutPublic,layoutPrivate}){ v.setOnClickListener(clickListener); } - refreshUI(setting); + + init(); + + } + + private void init(){ + editGamedir.setText(GamedirManager.getGamedir(MainActivity.Setting)); } @Override - public void refreshUI(SettingJson setting) { + public void refreshUI() { } @Override - public SettingJson saveUIConfig(SettingJson setting) { - if (buttonPrivate.isChecked()) { - setting.setLocalization("private"); - } else if (buttonPublic.isChecked()) { - setting.setLocalization("public"); - } - return setting; + public void saveUIConfig() { + } @Override @@ -74,26 +81,48 @@ public int getUIVisiability() { private View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { - if (v == buttonPrivate) { - switchRadioButton(buttonPrivate); + if(v == buttonSave){ + String t = editGamedir.getText().toString(); + //过滤掉最后一个反斜杠 + if(t.charAt(t.length() - 1) == '/'){ + StringBuilder tmp = new StringBuilder(); + for(int a = 0; a < t.length() - 1; a++){ + tmp.append(t.charAt(a)); + } + t = tmp.toString(); + editGamedir.setText(t); + } + + final File dir = new File(t); + if(dir.exists() && !dir.isDirectory()){ + DialogUtils.createSingleChoiceDialog(mContext,"错误","目标路径是文件而不是文件夹","确定",null); + }else if(!dir.exists()){ + DialogUtils.createBothChoicesDialog(mContext,"警告","目标路径不存在,是否创建文件夹?","确定","取消",new DialogSupports(){ + @Override + public void runWhenPositive() { + if(!GamedirManager.setGamedir(mContext, MainActivity.Setting, dir.getAbsolutePath())){ + DialogUtils.createSingleChoiceDialog(mContext,"错误","发生未知错误,路径设置失败!","确定",null); + }else{ + DialogUtils.createSingleChoiceDialog(mContext,"提示","路径修改成功!","确定",null); + } + } + }); + }else{ + if(!GamedirManager.setGamedir(mContext, MainActivity.Setting, dir.getAbsolutePath())){ + DialogUtils.createSingleChoiceDialog(mContext,"错误","发生未知错误,路径设置失败!","确定",null); + }else{ + DialogUtils.createSingleChoiceDialog(mContext,"提示","路径修改成功!","确定",null); + } + } } - if (v == buttonPublic) { - switchRadioButton(buttonPublic); + + if(v == layoutPublic){ + editGamedir.setText(GamedirManager.PUBLIC_GAMEDIR); } - } - }; - /** - * 【切换单选按钮】 - * Change the state of radiobuttons. - **/ - private void switchRadioButton(RadioButton v) { - if (v == buttonPrivate) { - buttonPrivate.setChecked(true); - buttonPublic.setChecked(false); - } else { - buttonPrivate.setChecked(false); - buttonPublic.setChecked(true); + if(v == layoutPrivate){ + editGamedir.setText(GamedirManager.PRIVATE_GAMEDIR); + } } - } + }; } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamelistUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamelistUI.java index 55817c03..0155668a 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamelistUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/GamelistUI.java @@ -1,27 +1,24 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.ListView; - import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.launcher.version.LocalVersionListAdapter; -import com.aof.mcinabox.launcher.version.LocalVersionListBean; -import com.aof.mcinabox.utils.FileTool; -import com.aof.mcinabox.utils.PathTool; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.version.VersionManager; +import com.aof.mcinabox.launcher.version.support.LocalVersionListAdapter; +import com.aof.mcinabox.launcher.version.support.LocalVersionListBean; -import java.io.File; import java.util.ArrayList; public class GamelistUI extends BaseUI { - public GamelistUI(Activity context){ + public GamelistUI(Context context){ super(context); } @@ -31,33 +28,33 @@ public GamelistUI(Activity context){ private LinearLayout buttonGameSetting; private ListView listLocalVersions; private Animation showAnim; - - private View[] views; + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; showAnim = AnimationUtils.loadAnimation(mContext, R.anim.layout_show); - layout_gamelist = mContext.findViewById(R.id.layout_gamelist); + layout_gamelist = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_gamelist); buttonInstallGame = layout_gamelist.findViewById(R.id.gamelist_button_installnewgame); buttonRefreshList = layout_gamelist.findViewById(R.id.gamelist_button_reflash_locallist); buttonGameSetting = layout_gamelist.findViewById(R.id.gamelist_button_setting); listLocalVersions = layout_gamelist.findViewById(R.id.list_local_version); - views = new View[]{buttonGameSetting,buttonInstallGame,buttonRefreshList}; - for(View v : views){ + for(View v : new View[]{buttonGameSetting,buttonInstallGame,buttonRefreshList}){ v.setOnClickListener(clickListener); } - refreshUI(setting); + refreshUI(); } @Override - public void refreshUI(SettingJson setting) { - refreshLocalVersionList(setting); + public void refreshUI() { + refreshLocalVersionList(); } @Override - public SettingJson saveUIConfig(SettingJson setting) { - return setting; + public void saveUIConfig() { + } @Override @@ -78,13 +75,13 @@ public int getUIVisiability() { @Override public void onClick(View v) { if(v == buttonGameSetting) { - ((MainActivity) mContext).switchUIs(((MainActivity) mContext).uiGameSetting, mContext.getString(R.string.title_setting_minecraft) + " - " + mContext.getString(R.string.title_gamelist)); + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiGameSetting, mContext.getString(R.string.title_setting_minecraft) + " - " + mContext.getString(R.string.title_gamelist)); } if(v == buttonInstallGame){ - ((MainActivity)mContext).switchUIs(((MainActivity) mContext).uiInstallVersion,mContext.getString(R.string.title_install_newversion) + " - " + mContext.getString(R.string.title_gamelist)); + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiInstallVersion,mContext.getString(R.string.title_install_newversion) + " - " + mContext.getString(R.string.title_gamelist)); } if(v == buttonRefreshList){ - + refreshLocalVersionList(); } } @@ -92,45 +89,18 @@ public void onClick(View v) { /** * 【刷新本地游戏列表】 - * Refresh the local Version list. - * These versions are from your sdcard. **/ - private ArrayList localversionList; - - private ArrayList versionIdList; - - public void refreshLocalVersionList(SettingJson setting) { - PathTool pathTool = new PathTool(setting.getLocalization(),true); - ArrayList versionIdListTmp; - try { - versionIdListTmp = FileTool.listChildDirFromTargetDir(pathTool.getMINECRAFT_VERSION_DIR()); - }catch(NullPointerException e){ - e.printStackTrace(); - versionIdListTmp = new ArrayList(){}; - } - ArrayList versionIdList = new ArrayList(); - ArrayList mlocalversionList = new ArrayList(); - for (String fileName : versionIdListTmp) { - if ((new File(pathTool.getMINECRAFT_VERSION_DIR() + fileName + "/" + fileName + ".json")).exists()) { - versionIdList.add(fileName); - } - } - for (String fileName : versionIdList) { - LocalVersionListBean localVersionListBean = new LocalVersionListBean(); - localVersionListBean.setVersion_Id(fileName); - mlocalversionList.add(localVersionListBean); - } - - if(listLocalVersions.getAdapter() == null){ - this.localversionList = mlocalversionList; - LocalVersionListAdapter localversionlistadapter = new LocalVersionListAdapter(mContext, this.localversionList); - listLocalVersions.setAdapter(localversionlistadapter); + private ArrayList beans; + public void refreshLocalVersionList() { + if(beans == null){ + beans = new ArrayList<>(); + beans.addAll(VersionManager.getVersionBeansList()); + listLocalVersions.setAdapter(new LocalVersionListAdapter(mContext, beans)); }else{ - this.localversionList.clear(); - this.localversionList.addAll(mlocalversionList); + beans.clear(); + beans.addAll(VersionManager.getVersionBeansList()); ((BaseAdapter)listLocalVersions.getAdapter()).notifyDataSetChanged(); } - } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/InstallVersionUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/InstallVersionUI.java index 72ddbb76..1e41d96c 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/InstallVersionUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/InstallVersionUI.java @@ -1,6 +1,7 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; +import android.util.Log; import android.view.View; import android.widget.AdapterView; import android.widget.ArrayAdapter; @@ -10,21 +11,17 @@ import android.widget.RadioGroup; import android.widget.TextView; import android.widget.Toast; - import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.dialogs.DownloaderDialog; -import com.aof.mcinabox.launcher.json.SettingJson; +import com.aof.mcinabox.launcher.download.DownloadManager; +import com.aof.mcinabox.launcher.setting.support.SettingJson; import com.aof.mcinabox.minecraft.json.VersionManifestJson; - import java.util.ArrayList; - -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_TEMP; +import static com.aof.mcinabox.definitions.manifest.AppManifest.MCINABOX_TEMP; public class InstallVersionUI extends BaseUI implements RadioGroup.OnCheckedChangeListener { - - public InstallVersionUI(Activity context){ + public InstallVersionUI(Context context) { super(context); } @@ -38,12 +35,17 @@ public InstallVersionUI(Activity context){ private RadioButton buttonSnapshot; private RadioButton buttonOld; private ListView listVersionsOnline; + private SettingJson setting; + + private DownloadManager mDownloadManager; - private View[] views; + private final static String TAG = "InstallVersionUI"; @Override - public void onCreate(SettingJson setting) { - layout_installversion = mContext.findViewById(R.id.layout_gamelist_install); + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; + layout_installversion = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_gamelist_install); buttonBack = layout_installversion.findViewById(R.id.gamelist_button_backfrom_installnewversion); buttonRefresh = layout_installversion.findViewById(R.id.gamelist_button_refresh); textSelectedVersion = layout_installversion.findViewById(R.id.gamelist_text_show_selectedversion); @@ -61,21 +63,21 @@ public void onItemClick(AdapterView adapterView, View view, int pos, long l) } }); - views = new View[]{buttonBack,buttonRefresh,buttonDownload}; - for(View v : views){ + for (View v : new View[]{buttonBack, buttonRefresh, buttonDownload}) { v.setOnClickListener(clickListener); } - refreshUI(setting); + //初始化下载管理器 + mDownloadManager = new DownloadManager(mContext); } @Override - public void refreshUI(SettingJson setting) { + public void refreshUI() { } @Override - public SettingJson saveUIConfig(SettingJson setting) { - return setting; + public void saveUIConfig() { + } @Override @@ -90,15 +92,13 @@ public int getUIVisiability() { /** * 【下载从网络版本列表中选择的版本】 - * Download the selected version. - * Maybe we need a method to choice what to download, such as Libraries only and Version Jar only. **/ private int selectedVersionPos = -1; private VersionManifestJson.Version[] versionList; private void DownloadSelectedVersion() { - MainActivity context = (MainActivity) mContext; - DownloaderDialog downloaderDialog = context.dialogDownloader; + //TODO:修复下载功能 + if (versionList == null) { Toast.makeText(mContext, mContext.getString(R.string.tips_online_version_reflash), Toast.LENGTH_SHORT).show(); return; @@ -107,13 +107,12 @@ private void DownloadSelectedVersion() { Toast.makeText(mContext, mContext.getString(R.string.tips_online_version_select), Toast.LENGTH_SHORT).show(); return; } - downloaderDialog.startDownloadMinecraft(listVersionsOnline.getAdapter().getItem(selectedVersionPos).toString()); + mDownloadManager.startPresetDownload(DownloadManager.DOWNLOAD_PRESET_VERSION_JSON ,listVersionsOnline.getAdapter().getItem(selectedVersionPos).toString()); } /** * 【更新网络版本列表】 - * Update version manifest. **/ public void refreshOnlineVersionList() { //获取实例化后的versionList @@ -131,16 +130,14 @@ public void refreshOnlineVersionList() { switch (version.getType()) { default: break; - case "release": + case VersionManifestJson.TYPE_RELEASE: version_type_release.add(version); break; - case "snapshot": + case VersionManifestJson.TYPE_SNAPSHOT: version_type_snapsht.add(version); break; - case "old_beta": - version_type_old.add(version); - break; - case "old_alpha": + case VersionManifestJson.TYPE_OLD_BETA: + case VersionManifestJson.TYPE_OLD_ALPHA: version_type_old.add(version); break; } @@ -170,13 +167,12 @@ public void refreshOnlineVersionList() { break; } - ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_list_item_1, nameList); + ArrayAdapter adapter = new ArrayAdapter<>(mContext, android.R.layout.simple_list_item_1, nameList); listVersionsOnline.setAdapter(adapter); } /** * 【当版本类型发生变化时】 - * When the type of Version changed. **/ @Override public void onCheckedChanged(RadioGroup radioGroup_version_type, int checkedId) { @@ -190,17 +186,20 @@ public void onCheckedChanged(RadioGroup radioGroup_version_type, int checkedId) private View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { - if(v == buttonBack){ - ((MainActivity)mContext).backFromHere(); + if (v == buttonBack) { + MainActivity.CURRENT_ACTIVITY.backFromHere(); } - if(v == buttonRefresh){ - MainActivity context = (MainActivity) mContext; - DownloaderDialog dialogDownloader = context.dialogDownloader; - //What will happen if click buttonRefresh many times before one finished? - //Maybe we need a way to limitation the too much click. - dialogDownloader.startDownloadManifest(); + if (v == buttonRefresh) { + mDownloadManager.downloadManifestAndUpdateGameListUi(mDownloadManager.new Runable() { + @Override + public void run() { + Log.e(TAG, "开始刷新列表"); + refreshOnlineVersionList(); + } + }); + } - if(v == buttonDownload){ + if (v == buttonDownload) { DownloadSelectedVersion(); } } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/LauncherSettingUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/LauncherSettingUI.java index 2a85e9cd..3dd25918 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/LauncherSettingUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/LauncherSettingUI.java @@ -1,41 +1,40 @@ package com.aof.mcinabox.launcher.uis; import android.Manifest; -import android.app.Activity; +import android.content.Context; import android.content.pm.PackageManager; -import android.os.Handler; -import android.os.Message; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.Button; +import android.widget.CompoundButton; import android.widget.LinearLayout; import android.widget.Spinner; import android.widget.Toast; - +import androidx.appcompat.widget.SwitchCompat; import androidx.core.app.ActivityCompat; import androidx.core.content.ContextCompat; - import com.aof.mcinabox.FileChooser; import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.JsonUtils; +import com.aof.mcinabox.definitions.manifest.AppManifest; import com.aof.mcinabox.launcher.dialogs.ContributorsDialog; -import com.aof.mcinabox.launcher.dialogs.DownloaderDialog; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.minecraft.ForgeInstaller; +import com.aof.mcinabox.launcher.runtime.RuntimeManager; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.uis.support.Utils; +import com.aof.mcinabox.minecraft.forge.ForgeInstaller; +import com.aof.utils.dialog.DialogUtils; +import com.aof.utils.dialog.support.DialogSupports; import java.io.File; import java.util.ArrayList; -import static com.aof.sharedmodule.Data.DataPathManifest.FORGEINSTALLER_HOME; -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_FILE_JSON; - -public class LauncherSettingUI extends BaseUI { +public class LauncherSettingUI extends BaseUI implements Spinner.OnItemSelectedListener, CompoundButton.OnCheckedChangeListener { - public LauncherSettingUI(Activity context) { + public LauncherSettingUI(Context context) { super(context); } @@ -45,45 +44,67 @@ public LauncherSettingUI(Activity context) { private Button buttonImportRuntime; private Button buttonInstallForge; private Button buttonShowControbutors; + private SwitchCompat switchAutoBackground; + private SwitchCompat switchFullscreen; private Animation showAnim; - private ContributorsDialog contributorsDialog; - - private View[] views; + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; showAnim = AnimationUtils.loadAnimation(mContext, R.anim.layout_show); - layout_setting = mContext.findViewById(R.id.layout_launchersetting); + layout_setting = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_launchersetting); listDownloaderSources = layout_setting.findViewById(R.id.setting_spinner_downloadtype); buttonImportRuntime = layout_setting.findViewById(R.id.launchersetting_button_import); listForgeInstallers = layout_setting.findViewById(R.id.launchersetting_spinner_forgeinstaller); buttonInstallForge = layout_setting.findViewById(R.id.launchersetting_button_forgeinstaller); buttonShowControbutors = layout_setting.findViewById(R.id.setting_show_contributors); - contributorsDialog = new ContributorsDialog((MainActivity) mContext,R.layout.dialog_contributors); + switchAutoBackground = layout_setting.findViewById(R.id.launchersetting_switch_auto_background); + switchFullscreen = layout_setting.findViewById(R.id.launchersetting_switch_fullscreen); + + switchAutoBackground.setChecked(setting.isBackgroundAutoSwitch()); + switchFullscreen.setChecked(setting.isFullscreen()); - views = new View[]{buttonInstallForge, buttonImportRuntime,buttonShowControbutors}; - for (View v : views) { + //设定监听器 + for (View v : new View[]{buttonInstallForge, buttonImportRuntime, buttonShowControbutors}) { v.setOnClickListener(clickListener); } - loadInfo(setting); - refreshUI(setting); + for(SwitchCompat sc : new SwitchCompat[]{switchAutoBackground,switchFullscreen}){ + sc.setOnCheckedChangeListener(this); + } + listDownloaderSources.setOnItemSelectedListener(this); + + //设定属性 + refreshForgeInstallerList(); + setConfigureToDownloadtype(setting.getDownloadType(), listDownloaderSources); + + //调用主题管理器设定主题 + if(setting.isBackgroundAutoSwitch()){ + if(!MainActivity.CURRENT_ACTIVITY.mThemeManager.autoSetBackground(MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_main))){ + DialogUtils.createSingleChoiceDialog(mContext,"错误","图片文件已损坏,启动器背景图片切换失败!","确定",null); + } + } + + if(setting.isFullscreen()){ + MainActivity.CURRENT_ACTIVITY.mThemeManager.setFullScreen(MainActivity.CURRENT_ACTIVITY); + } } @Override - public void refreshUI(SettingJson setting) { + public void refreshUI() { refreshForgeInstallerList(); } @Override - public SettingJson saveUIConfig(SettingJson setting) { + public void saveUIConfig() { setting.setDownloadType(listDownloaderSources.getSelectedItem().toString()); - return setting; } @Override public void setUIVisiability(int visiability) { - if(visiability == View.VISIBLE){ + if (visiability == View.VISIBLE) { layout_setting.startAnimation(showAnim); } layout_setting.setVisibility(visiability); @@ -94,20 +115,14 @@ public int getUIVisiability() { return layout_setting.getVisibility(); } - private void loadInfo(SettingJson setting){ - //This should not be applied again after the UI has been created. - setConfigureToDownloadtype(setting.getDownloadType(), listDownloaderSources); - } - /** * 【刷新forgeinstaller列表】 - * Refresh the ForgeInstaller list. **/ - private ArrayList forgeInstallerList = new ArrayList(); + private ArrayList forgeInstallerList = new ArrayList<>(); private void refreshForgeInstallerList() { - ArrayList packlist = new ArrayList(); - File file = new File(FORGEINSTALLER_HOME + "/"); + ArrayList packlist = new ArrayList<>(); + File file = new File(AppManifest.FORGE_HOME + "/"); File[] files = file.listFiles(); if (files == null) { //nothing. @@ -120,7 +135,7 @@ private void refreshForgeInstallerList() { packlist.add(targetFile.getName()); } if (listForgeInstallers.getAdapter() == null) { - ArrayAdapter adapter = new ArrayAdapter(mContext, android.R.layout.simple_spinner_item, this.forgeInstallerList); + ArrayAdapter adapter = new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_item, this.forgeInstallerList); adapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); listForgeInstallers.setAdapter(adapter); } else { @@ -133,15 +148,10 @@ private void refreshForgeInstallerList() { /** * 【安装ForgeInstaller】 - * Install Forge via ForgeInstaller - * This function is very primary.... - * Will be kicked later... **/ private void installForgeFromInstaller() { - MainActivity context = (MainActivity) mContext; - DownloaderDialog downloaderDialog = context.dialogDownloader; - if (JsonUtils.getSettingFromFile(MCINABOX_FILE_JSON).getDownloadType().equals("official")) { - Toast.makeText(mContext, R.string.toast_change_downloadtype, Toast.LENGTH_SHORT).show(); + if (MainActivity.Setting.getDownloadType().equals(SettingJson.DOWNLOAD_SOURCE_OFFICIAL)) { + DialogUtils.createSingleChoiceDialog(mContext,"错误",mContext.getString(R.string.toast_change_downloadtype),"确定",null); } else { String filename; if (listForgeInstallers.getSelectedItem() != null) { @@ -154,17 +164,21 @@ private void installForgeFromInstaller() { installer.unzipForgeInstaller(filename); } catch (Exception e) { e.printStackTrace(); - Toast.makeText(mContext, mContext.getString(R.string.tips_unzip_failed), Toast.LENGTH_SHORT).show(); + DialogUtils.createSingleChoiceDialog(mContext,"错误",mContext.getString(R.string.tips_unzip_failed),"确定",null); return; } - String id = installer.makeForgeData(); - downloaderDialog.startDownloadForge(id); + + try { + installer.startDownloadForge(installer.makeForgeData()); + }catch (Exception e){ + e.printStackTrace(); + DialogUtils.createSingleChoiceDialog(mContext,"错误","发生未知错误,Forge安装失败","确定",null); + } } } /** * 【匹配下载源】 - * Select the Download Souce. **/ private void setConfigureToDownloadtype(String type, Spinner list) { int pos = Utils.getItemPosByString(type, list); @@ -178,18 +192,16 @@ private void setConfigureToDownloadtype(String type, Spinner list) { public void onClick(View v) { if (v == buttonImportRuntime) { if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 2048); + ActivityCompat.requestPermissions(MainActivity.CURRENT_ACTIVITY, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 2048); } if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { Toast.makeText(mContext, "Please allow read storage permission to import runtime packs externally.", Toast.LENGTH_LONG).show(); return; } - FileChooser fc = new FileChooser(mContext); - fc.setExtension(".tar.xz"); - fc.setFileListener(new FileChooser.FileSelectedListener() { + FileChooser fc = new FileChooser(MainActivity.CURRENT_ACTIVITY).setExtension(".tar.xz").setFileListener(new FileChooser.FileSelectedListener() { @Override public void fileSelected(File file) { - installRuntimeFromPath(file.getPath()); + RuntimeManager.installRuntimeFromPath(mContext, file.getPath()); } }); fc.showDialog(); @@ -197,59 +209,41 @@ public void fileSelected(File file) { if (v == buttonInstallForge) { installForgeFromInstaller(); } - if(v == buttonShowControbutors){ - contributorsDialog.show(); + if (v == buttonShowControbutors) { + new ContributorsDialog(mContext).show(); } } }; - /** - * 【从路径安装运行库】 - * Install Runtime from path. - **/ - public void installRuntimeFromPath(String globalPath) { - //check the permissions first, we want to ensure that app have it. weird things can happen i we have denied. - if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - ActivityCompat.requestPermissions(mContext, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE}, 2048); - } - if (ContextCompat.checkSelfPermission(mContext, Manifest.permission.READ_EXTERNAL_STORAGE) != PackageManager.PERMISSION_GRANTED) { - Toast.makeText(mContext, "Please allow read storage permission to import runtime packs externally.", Toast.LENGTH_LONG).show(); - return; + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if (parent == listDownloaderSources) { + setting.setDownloadType((String) listDownloaderSources.getItemAtPosition(position)); } + } - final String mpackagePath = globalPath; - new Thread() { - @Override - public void run() { - Handler handler = ((MainActivity) mContext).handler; - File packageFile = new File(mpackagePath); - if (!packageFile.exists()) { - - Message msg_1 = new Message(); - msg_1.what = 4; - handler.sendMessage(msg_1); - return; + @Override + public void onNothingSelected(AdapterView parent) { - } else { - if (packageFile.isDirectory()) { - Toast.makeText(mContext, "Runtime packs should not be directories!", Toast.LENGTH_LONG).show(); - return; - } - } - Message msg_2 = new Message(); - Message msg_3 = new Message(); - msg_2.what = 5; - handler.sendMessage(msg_2); - cosine.boat.Utils.extractTarXZ(mpackagePath, mContext.getDir("runtime", 0)); - if (cosine.boat.Utils.setExecutable(mContext.getDir("runtime", 0))) { - msg_3.what = 6; - handler.sendMessage(msg_3); - } else { - msg_3.what = 7; - handler.sendMessage(msg_3); - } - } - }.start(); } + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if(buttonView == switchAutoBackground){ + if(isChecked){ + DialogUtils.createSingleChoiceDialog(mContext,"提示",String.format("请将后缀名为png的图片放入 %s 文件夹中,启动器将会随机选择一张作为背景,该操作重启后生效。",AppManifest.MCINABOX_BACKGROUND),"确定",null); + } + setting.setBackgroundAutoSwitch(isChecked); + } + + if(buttonView == switchFullscreen){ + if(isChecked){ + MainActivity.CURRENT_ACTIVITY.mThemeManager.setFullScreen(MainActivity.CURRENT_ACTIVITY); + }else{ + DialogUtils.createSingleChoiceDialog(mContext,"提示","您已经关闭了状态栏隐藏功能,将在下一次启动时应用更改。","确定",null); + } + setting.setFullscreen(isChecked); + } + } } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/MainToolbarUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/MainToolbarUI.java index 0de2c2d4..f5de8311 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/MainToolbarUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/MainToolbarUI.java @@ -1,20 +1,20 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; import android.view.View; import android.widget.Button; import android.widget.TextView; - import androidx.appcompat.widget.Toolbar; - import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.launcher.tipper.Tipper; +import com.aof.mcinabox.launcher.lang.LanguageDialog; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.utils.dialog.DialogUtils; +import com.aof.utils.dialog.support.DialogSupports; public class MainToolbarUI extends BaseUI { - public MainToolbarUI(Activity context) { + public MainToolbarUI(Context context) { super(context); } @@ -25,39 +25,39 @@ public MainToolbarUI(Activity context) { private Button buttonLanguage; private Button buttonRefresh; private Button buttonInfo; - - private Tipper tipper; - - private View[] views; - + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { - layout_toolbar = mContext.findViewById(R.id.layout_toolbar_main); + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; + layout_toolbar = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_toolbar_main); buttonBack = layout_toolbar.findViewById(R.id.toolbar_button_backfromhere); textPosition = layout_toolbar.findViewById(R.id.main_text_showstate); buttonHome = layout_toolbar.findViewById(R.id.toolbar_button_backhome); buttonLanguage = layout_toolbar.findViewById(R.id.toolbar_button_language); buttonRefresh = layout_toolbar.findViewById(R.id.toolbar_button_refresh); buttonInfo = layout_toolbar.findViewById(R.id.toolbar_button_taskinfo); - tipper = new Tipper(mContext); setToolbarAsActionbar(); - views = new View[]{buttonInfo,buttonRefresh,buttonLanguage,buttonHome,buttonBack}; - for(View v : views){ + for (View v : new View[]{buttonInfo, buttonRefresh, buttonLanguage, buttonHome, buttonBack}) { v.setOnClickListener(clickListener); } - refreshUI(setting); + refreshUI(); } @Override - public void refreshUI(SettingJson setting) { - tipper.refreshTipper(setting,this); + public void refreshUI() { + if(MainActivity.CURRENT_ACTIVITY.mTipperManager != null && MainActivity.CURRENT_ACTIVITY.mTipperManager.getTipCounts() != 0){ + buttonInfo.setVisibility(View.VISIBLE); + }else{ + buttonInfo.setVisibility(View.GONE); + } } @Override - public SettingJson saveUIConfig(SettingJson setting) { - return setting; + public void saveUIConfig() { + } @Override @@ -70,37 +70,38 @@ public int getUIVisiability() { return layout_toolbar.getVisibility(); } - public void setCurrentPosition(String position){ + public void setCurrentPosition(String position) { textPosition.setText(position); } - public void setTaskInfoBackground(int id){ - buttonInfo.setBackground(mContext.getResources().getDrawable(id)); - } - - private View.OnClickListener clickListener = new View.OnClickListener(){ + private View.OnClickListener clickListener = new View.OnClickListener() { @Override public void onClick(View v) { - if(v == buttonRefresh){ - ((MainActivity)mContext).refreshLauncher(null,true); + if (v == buttonRefresh) { + DialogUtils.createBothChoicesDialog(mContext,"警告","此操作将会重启APP,是否继续?","继续","取消",new DialogSupports(){ + @Override + public void runWhenPositive(){ + MainActivity.CURRENT_ACTIVITY.restarter(); + } + }); } - if(v == buttonBack){ - ((MainActivity)mContext).backFromHere(); + if (v == buttonBack) { + MainActivity.CURRENT_ACTIVITY.backFromHere(); } - if(v == buttonHome){ - ((MainActivity)mContext).switchUIs(((MainActivity)mContext).uiStartGame,mContext.getString(R.string.title_home)); + if (v == buttonHome) { + MainActivity.CURRENT_ACTIVITY.switchUIs(MainActivity.CURRENT_ACTIVITY.mUiManager.uiStartGame, mContext.getString(R.string.title_home)); } - if(v == buttonInfo){ - tipper.showTipper(v); + if (v == buttonLanguage) { + new LanguageDialog(mContext).show(); } - if(v == buttonLanguage){ - ((MainActivity)mContext).dialogLanguage.show(); + if(v == buttonInfo){ + MainActivity.CURRENT_ACTIVITY.mTipperManager.showTipper(buttonInfo); } } }; - private void setToolbarAsActionbar(){ - ((MainActivity)mContext).setSupportActionBar(layout_toolbar); + private void setToolbarAsActionbar() { + MainActivity.CURRENT_ACTIVITY.setSupportActionBar(layout_toolbar); } } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/PluginUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/PluginUI.java index 1a57f9b0..3e0754cb 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/PluginUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/PluginUI.java @@ -1,20 +1,18 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; -import android.widget.Button; import android.widget.LinearLayout; import android.widget.ListView; - import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.SettingJson; +import com.aof.mcinabox.launcher.setting.support.SettingJson; public class PluginUI extends BaseUI { - public PluginUI(Activity context) { + public PluginUI(Context context) { super(context); } @@ -23,32 +21,31 @@ public PluginUI(Activity context) { private LinearLayout buttonRefresh; private ListView listPlugins; private Animation showAnim; - - private View[] views; + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { + public void onCreate( ) { + super.onCreate(); + setting = MainActivity.Setting; showAnim = AnimationUtils.loadAnimation(mContext, R.anim.layout_show); - lagout_plugin = mContext.findViewById(R.id.layout_plugin); + lagout_plugin = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_plugin); buttonAddPlugin = lagout_plugin.findViewById(R.id.plugin_button_addplugin); buttonRefresh = lagout_plugin.findViewById(R.id.plugin_button_refresh); listPlugins = lagout_plugin.findViewById(R.id.listview_plugins); - views = new View[]{buttonRefresh,buttonAddPlugin}; - for(View v : views){ + for(View v : new View[]{buttonAddPlugin, buttonRefresh}){ v.setOnClickListener(clickListener); } - refreshUI(setting); + refreshUI(); } @Override - public void refreshUI(SettingJson setting) { + public void refreshUI() { refreshPluginList(); } @Override - public SettingJson saveUIConfig(SettingJson setting) { - return setting; + public void saveUIConfig() { } @Override @@ -71,7 +68,7 @@ public void onClick(View v){ //TODO:添加插件功能 } if(v == buttonRefresh){ - ((MainActivity)mContext).refreshLauncher(null,true); + //TODO:刷新插件列表 } } }; diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/StartGameUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/StartGameUI.java index e0e4104e..bfc08d99 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/StartGameUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/StartGameUI.java @@ -1,68 +1,61 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; import android.view.View; +import android.widget.AdapterView; import android.widget.ArrayAdapter; import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.Spinner; -import android.widget.Toast; - import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.core.LaunchMinecraft; -import com.aof.mcinabox.launcher.JsonUtils; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.launcher.version.LocalVersionListBean; -import com.aof.mcinabox.utils.FileTool; -import com.aof.mcinabox.utils.PathTool; - -import java.io.File; +import com.aof.mcinabox.launcher.launch.LaunchManager; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.uis.support.Utils; +import com.aof.mcinabox.launcher.version.VersionManager; import java.util.ArrayList; +import java.util.Arrays; -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_DATA_PRIVATE; -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_DATA_PUBLIC; -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_FILE_JSON; -import static com.aof.sharedmodule.Data.DataPathManifest.MCINABOX_VERSION; - -public class StartGameUI extends BaseUI { +public class StartGameUI extends BaseUI implements Spinner.OnItemSelectedListener { - public StartGameUI(Activity context) { + public StartGameUI(Context context) { super(context); } private LinearLayout layout_startgame; private LinearLayout buttonStartGame; private Spinner listVersions; - - private View[] views; - + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { - - layout_startgame = mContext.findViewById(R.id.layout_startgame); + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; + layout_startgame = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_startgame); buttonStartGame = layout_startgame.findViewById(R.id.main_button_startgame); listVersions = layout_startgame.findViewById(R.id.spinner_choice_version); - views = new View[]{buttonStartGame}; - for (View v : views) { + //设定属性 + refreshLocalVersionList(); + if(setting.getLastVersion() != null && !setting.getLastVersion().equals("")){ + setConfigureToVersionlist(setting.getLastVersion(), listVersions); + } + + //设定监听器 + for (View v : new View[]{buttonStartGame}) { v.setOnClickListener(clickListener); } - loadInfo(setting); - refreshUI(setting); + listVersions.setOnItemSelectedListener(this); } @Override - public void refreshUI(SettingJson setting) { - refreshLocalVersionList(setting); + public void refreshUI() { + refreshLocalVersionList(); } @Override - public SettingJson saveUIConfig(SettingJson setting) { - saveLastVersion(setting); - return setting; + public void saveUIConfig() { } @Override @@ -85,100 +78,32 @@ public void onClick(View v) { } }; - public void loadInfo(SettingJson setting){ - //These initial should not be applied after the UI has been created. - if(setting.getLastVersion() == null){ - return; - } - if (!(setting.getLastVersion().equals(""))) { - setConfigureToVersionlist(setting.getLastVersion(), listVersions); - } - } - /** * 【刷新本地游戏列表】 - * Refresh loacl verion list. **/ private ArrayList versionIdList; - private void refreshLocalVersionList(SettingJson setting) { - - PathTool pathTool = new PathTool(setting.getLocalization(), true); - ArrayList versionIdList = new ArrayList(); - ArrayList mlocalversionList = new ArrayList(); - - ArrayList versionIdListTmp; - try { - versionIdListTmp = FileTool.listChildDirFromTargetDir(pathTool.getMINECRAFT_VERSION_DIR()); - } catch (NullPointerException e) { - e.printStackTrace(); - versionIdListTmp = new ArrayList() { - }; - } - - for (String fileName : versionIdListTmp) { - if ((new File(pathTool.getMINECRAFT_VERSION_DIR() + fileName + "/" + fileName + ".json")).exists()) { - versionIdList.add(fileName); - } - } - for (String fileName : versionIdList) { - LocalVersionListBean localVersionListBean = new LocalVersionListBean(); - localVersionListBean.setVersion_Id(fileName); - mlocalversionList.add(localVersionListBean); - } - - if (listVersions.getAdapter() == null) { - this.versionIdList = versionIdList; - ArrayAdapter mAdapter = new ArrayAdapter(mContext, android.R.layout.simple_spinner_item, this.versionIdList); - mAdapter.setDropDownViewResource(android.R.layout.simple_spinner_dropdown_item); - - listVersions.setAdapter(mAdapter); - } else { - this.versionIdList.clear(); - this.versionIdList.addAll(versionIdList); - ((BaseAdapter) listVersions.getAdapter()).notifyDataSetChanged(); + private void refreshLocalVersionList() { + if(listVersions.getAdapter() == null){ + versionIdList = new ArrayList<>(); + versionIdList.addAll(Arrays.asList(VersionManager.getVersionsList())); + listVersions.setAdapter(new ArrayAdapter<>(mContext, android.R.layout.simple_spinner_dropdown_item, this.versionIdList)); + }else{ + versionIdList.clear(); + versionIdList.addAll(Arrays.asList(VersionManager.getVersionsList())); + ((BaseAdapter)listVersions.getAdapter()).notifyDataSetChanged(); } } /** * 【启动Minecraft】 - * Start to launch Minecraft. **/ private void startMinecraft() { - ((MainActivity)mContext).quickSave(); - LaunchMinecraft starter = new LaunchMinecraft(mContext); - if (checkConfig()) { - starter.StartGame(); - } else { - Toast.makeText(mContext, mContext.getString(R.string.tips_check_setting), Toast.LENGTH_SHORT).show(); - } - } - - /** - * 【检查启动状态】 - * Check the state of the Launcher. - * If return false, launch task will be abort. - **/ - private boolean checkConfig() { - //TODO:根据Tipper - return true; - } - - /** - * 【保存选中的版本号】 - * Save the last seleced version into Setting file. - **/ - private void saveLastVersion(SettingJson setting) { - if (listVersions.getSelectedItem() != null) { - setting.setLastVersion(listVersions.getSelectedItem().toString()); - } else { - setting.setLastVersion(""); - } + new LaunchManager(mContext).launchMinecraft(MainActivity.Setting ,LaunchManager.LAUNCH_PRECHECK); } /** * 【匹配选中的版本】 - * Selected the last version that launched. **/ private void setConfigureToVersionlist(String id, Spinner list) { int pos = Utils.getItemPosByString(id, list); @@ -186,4 +111,18 @@ private void setConfigureToVersionlist(String id, Spinner list) { list.setSelection(pos); } } + + @Override + public void onItemSelected(AdapterView parent, View view, int position, long id) { + if(parent == listVersions){ + setting.setLastVersion((String) listVersions.getItemAtPosition(position)); + } + } + + @Override + public void onNothingSelected(AdapterView parent) { + if(parent == listVersions){ + setting.setLastVersion(""); + } + } } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/UserUI.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/UserUI.java index acab1070..2f7c74fd 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/UserUI.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/UserUI.java @@ -1,25 +1,28 @@ package com.aof.mcinabox.launcher.uis; -import android.app.Activity; +import android.content.Context; import android.view.View; import android.view.animation.Animation; import android.view.animation.AnimationUtils; +import android.widget.BaseAdapter; import android.widget.LinearLayout; import android.widget.ListView; - import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.json.SettingJson; -import com.aof.mcinabox.launcher.user.UserListAdapter; -import com.aof.mcinabox.launcher.user.UserListBean; - -import static com.aof.mcinabox.DataPathManifest.*; +import com.aof.mcinabox.launcher.tipper.TipperManager; +import com.aof.mcinabox.launcher.tipper.support.TipperRunable; +import com.aof.mcinabox.launcher.user.CreateUserDialog; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.user.UserManager; +import com.aof.mcinabox.launcher.user.support.UserListAdapter; +import com.aof.mcinabox.launcher.user.support.UserListBean; +import com.aof.utils.dialog.DialogUtils; import java.util.ArrayList; public class UserUI extends BaseUI { - public UserUI(Activity context) { + public UserUI(Context context) { super(context); } @@ -28,34 +31,32 @@ public UserUI(Activity context) { private LinearLayout buttonRefreshUserList; private ListView listUsers; private Animation showAnim; - - private View[] views; - + private SettingJson setting; @Override - public void onCreate(SettingJson setting) { + public void onCreate() { + super.onCreate(); + setting = MainActivity.Setting; showAnim = AnimationUtils.loadAnimation(mContext, R.anim.layout_show); - layout_user = mContext.findViewById(R.id.layout_user); + layout_user = MainActivity.CURRENT_ACTIVITY.findViewById(R.id.layout_user); buttonCreateUser = layout_user.findViewById(R.id.layout_user_adduser); buttonRefreshUserList = layout_user.findViewById(R.id.layout_user_reflash_userlist); listUsers = layout_user.findViewById(R.id.list_user); - views = new View[]{buttonCreateUser, buttonRefreshUserList}; - for (View v : views) { + for (View v : new View[]{buttonCreateUser, buttonRefreshUserList}) { v.setOnClickListener(clickListener); } - refreshUI(setting); + + refreshList(); } @Override - public void refreshUI(SettingJson setting) { - refreshLocalUserList(setting); + public void refreshUI() { + } @Override - public SettingJson saveUIConfig(SettingJson setting) { - saveUserList(setting); - return setting; + public void saveUIConfig() { } @Override @@ -76,87 +77,54 @@ public int getUIVisiability() { @Override public void onClick(View v) { if (v == buttonCreateUser) { - ((MainActivity) mContext).dialogCreateUser.show(); + new CreateUserDialog(mContext).show(); } if (v == buttonRefreshUserList) { - ((MainActivity) mContext).refreshLauncher(null, true); + refreshList(); } } - }; - /** - * 【刷新本地用户列表】 - * Refresh User list - **/ - private ArrayList userlist = new ArrayList(); - private void refreshLocalUserList(SettingJson setting) { - SettingJson.Accounts[] accounts = setting.getAccounts(); - ArrayList tmp = new ArrayList() { - }; - if (accounts == null) { - userlist = new ArrayList() { - }; - } else { - for (SettingJson.Accounts account : accounts) { - UserListBean user = new UserListBean(); - user.setUser_name(account.getUsername()); - user.setUser_model(account.getType()); - user.setIsSelected(account.isSelected()); - user.setAuth_UUID(account.getUuid()); - user.setAuth_Access_Token(account.getAccessToken()); - user.setContext(mContext); - tmp.add(user); + public void reloadListView(){ + for(SettingJson.Account account : MainActivity.Setting.getAccounts()){ + if(account != null){ + usersList.add(UserManager.account2Bean(mContext,account)); } } - userlist = tmp; - if (listUsers.getAdapter() == null) { - UserListAdapter userlistadapter = new UserListAdapter(mContext, userlist); - listUsers.setAdapter(userlistadapter); - } else { - listUsers.deferNotifyDataSetChanged(); - } + this.listUsers.setAdapter(new UserListAdapter(mContext,usersList)); + refreshList(); } - /** - * 【添加一个配制好的用户】 - **/ - public void addFormedUser(SettingJson.Accounts account) { - UserListBean user = new UserListBean(); - user.setUser_name(account.getUsername()); - user.setUser_model(account.getType()); - user.setIsSelected(account.isSelected()); - user.setAuth_UUID(account.getUuid()); - user.setAuth_Access_Token(account.getAccessToken()); - user.setContext(mContext); - userlist.add(user); - listUsers.deferNotifyDataSetChanged(); + private ArrayList usersList; + public void refreshList(){ + if(usersList == null){ + usersList = new ArrayList<>(); + listUsers.setAdapter(new UserListAdapter(mContext,usersList)); + }else{ + usersList.clear(); + } + for(SettingJson.Account account : MainActivity.Setting.getAccounts()){ + if(account != null){ + usersList.add(UserManager.account2Bean(mContext,account)); + } + } + ((BaseAdapter)listUsers.getAdapter()).notifyDataSetChanged(); } - /** - * 【保存用户列表】 - * Save user data. - **/ - private SettingJson saveUserList(SettingJson setting) { - SettingJson.Accounts[] accounts; - if (listUsers.getAdapter() == null) { - accounts = new SettingJson.Accounts[0]; - } else { - accounts = new SettingJson.Accounts[listUsers.getAdapter().getCount()]; - for (int i = 0; i < listUsers.getAdapter().getCount(); i++) { - SettingJson.Accounts account = new SettingJson().newAccounts; - UserListBean user = (UserListBean) listUsers.getAdapter().getItem(i); - account.setSelected(user.isIsSelected()); - account.setUsername(user.getUser_name()); - account.setType(user.getUser_model()); - account.setUuid(user.getAuth_UUID()); - account.setAccessToken(user.getAuth_Access_Token()); - - accounts[i] = account; + public boolean addFormatedUser(SettingJson.Account account){ + if(account == null){ + return false; + }else{ + UserListBean tmp = UserManager.account2Bean(mContext, account); + for(UserListBean bean : usersList){ + if(bean.equals(tmp)){ + return false; + } } + usersList.add(tmp); + refreshList(); + return true; } - setting.setAccounts(accounts); - return setting; } } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/achieve/UiManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/achieve/UiManager.java new file mode 100644 index 00000000..e216b5c8 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/achieve/UiManager.java @@ -0,0 +1,137 @@ +package com.aof.mcinabox.launcher.uis.achieve; + +import android.content.Context; +import android.view.View; + +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.R; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.uis.BaseUI; +import com.aof.mcinabox.launcher.uis.FunctionbarUI; +import com.aof.mcinabox.launcher.uis.GameSettingUI; +import com.aof.mcinabox.launcher.uis.GamedirUI; +import com.aof.mcinabox.launcher.uis.GamelistUI; +import com.aof.mcinabox.launcher.uis.InstallVersionUI; +import com.aof.mcinabox.launcher.uis.LauncherSettingUI; +import com.aof.mcinabox.launcher.uis.MainToolbarUI; +import com.aof.mcinabox.launcher.uis.PluginUI; +import com.aof.mcinabox.launcher.uis.StartGameUI; +import com.aof.mcinabox.launcher.uis.UserUI; + +public class UiManager { + + public PluginUI uiPlugin; + public InstallVersionUI uiInstallVersion; + public GamedirUI uiGamedir; + public GamelistUI uiGamelist; + public GameSettingUI uiGameSetting; + public LauncherSettingUI uiLauncherSetting; + public StartGameUI uiStartGame; + public UserUI uiUser; + public MainToolbarUI uiMainToolbar; + public FunctionbarUI uiFunctionbar; + + public BaseUI[] Uis; + + private Context mContext; + + public UiManager(Context context, SettingJson setting){ + this.mContext = context; + uiInstallVersion = new InstallVersionUI(context); + uiPlugin = new PluginUI(context); + uiGamedir = new GamedirUI(context); + uiGamelist = new GamelistUI(context); + uiGameSetting = new GameSettingUI(context); + uiLauncherSetting = new LauncherSettingUI(context); + uiStartGame = new StartGameUI(context); + uiUser = new UserUI(context); + uiMainToolbar = new MainToolbarUI(context); + uiFunctionbar = new FunctionbarUI(context); + + Uis = new BaseUI[]{uiMainToolbar, uiFunctionbar, uiInstallVersion, uiPlugin, uiGamedir, uiGamelist, uiGameSetting, uiLauncherSetting, uiStartGame, uiUser}; + } + + public void switchUIs(BaseUI ui, String position) { + if (ui.getUIVisiability() != View.VISIBLE) { + hideAllUIs(); + ui.setUIVisiability(View.VISIBLE); + } + + currentUI = ui; + uiMainToolbar.setCurrentPosition(position); + } + + private BaseUI currentUI; + + public void backFromHere() { + if (currentUI == uiStartGame || currentUI == null) { + MainActivity.CURRENT_ACTIVITY.finish(); + } + + if (currentUI == uiGamedir || + currentUI == uiGamelist || + currentUI == uiLauncherSetting || + currentUI == uiUser || + currentUI == uiPlugin) { + switchUIs(uiStartGame, mContext.getString(R.string.title_home)); + } + + if (currentUI == uiGameSetting || + currentUI == uiInstallVersion) { + switchUIs(uiGamelist, mContext.getString(R.string.title_gamelist)); + } + } + + /** + * 【隐藏全部界面】 + * Hide all UIs. + **/ + public void hideAllUIs() { + for (BaseUI ui : Uis) { + if (ui.getUIVisiability() != View.INVISIBLE) { + ui.setUIVisiability(View.INVISIBLE); + } + } + } + + public void refreshUis(){ + for(BaseUI ui : Uis){ + if (ui != null){ + ui.refreshUI(); + } + } + } + + public void onStop(){ + for (BaseUI ui : Uis){ + if(ui != null){ + ui.onStop(); + } + } + } + + public void onCreate(){ + for (BaseUI ui : Uis){ + if(ui != null){ + ui.onCreate(); + } + } + } + + public void onRestart(){ + for (BaseUI ui : Uis){ + if(ui != null){ + ui.onRestart(); + } + } + } + + public void saveConfigToSetting(){ + for (BaseUI ui : Uis){ + if(ui != null){ + ui.saveUIConfig(); + } + } + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/Utils.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/support/Utils.java similarity index 86% rename from mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/Utils.java rename to mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/support/Utils.java index 23ad3f2c..802c19e0 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/Utils.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/uis/support/Utils.java @@ -1,5 +1,6 @@ -package com.aof.mcinabox.launcher.uis; +package com.aof.mcinabox.launcher.uis.support; +import android.util.Log; import android.widget.ListView; import android.widget.Spinner; diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/CreateUserDialog.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/CreateUserDialog.java new file mode 100644 index 00000000..2c344808 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/CreateUserDialog.java @@ -0,0 +1,114 @@ +package com.aof.mcinabox.launcher.user; + +import android.app.Dialog; +import android.content.Context; +import android.os.Bundle; +import android.view.View; +import android.widget.Button; +import android.widget.CheckBox; +import android.widget.CompoundButton; +import android.widget.EditText; +import android.widget.LinearLayout; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.R; +import com.aof.mcinabox.launcher.user.support.Login; +import com.aof.utils.PromptUtils; + +public class CreateUserDialog extends Dialog implements View.OnClickListener, CheckBox.OnCheckedChangeListener { + + private Context mContext; + + private Button buttonOK; + private Button buttonCancel; + private EditText editUsername; + private EditText editPassword; + private LinearLayout layoutPassword; + private CheckBox checkboxUsermodel; + + private boolean enableLegal = false; + + public CreateUserDialog(Context context) { + super(context); + this.mContext = context; + setContentView(R.layout.dialog_createuser); + } + + @Override + protected void onCreate(Bundle savedInstanceState) { + buttonOK = findViewById(R.id.dialog_button_confirm_createuser); + buttonCancel = findViewById(R.id.dialog_button_cancle_createuser); + editUsername = findViewById(R.id.dialog_edittext_input_username); + editPassword = findViewById(R.id.dialog_edittext_input_userpasswd); + layoutPassword = findViewById(R.id.dialog_linearlayout_input_userpasswd); + checkboxUsermodel = findViewById(R.id.dialog_checkbox_online_model); + checkboxUsermodel.setOnCheckedChangeListener(new CompoundButton.OnCheckedChangeListener() { + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if (isChecked) layoutPassword.setVisibility(View.VISIBLE); + else layoutPassword.setVisibility(View.GONE); + } + }); + + for (View v : new View[]{buttonOK, buttonCancel}) { + v.setOnClickListener(this); + } + } + + @Override + public void onClick(View v) { + + if(v == buttonOK){ + if(addUser()){ + dismiss(); + } + } + if(v == buttonCancel){ + this.cancel(); + } + } + + @Override + public void onCheckedChanged(CompoundButton buttonView, boolean isChecked) { + if(buttonView == checkboxUsermodel){ + if(isChecked){ + editPassword.setVisibility(View.VISIBLE); + enableLegal = true; + }else{ + editPassword.setVisibility(View.GONE); + enableLegal = false; + } + } + } + + private boolean addUser(){ + String password = editPassword.getText().toString(); + String username = editUsername.getText().toString(); + //检查用户名 + for(String str : UserManager.getUsersName(MainActivity.Setting)){ + if (str.equals(username)){ + PromptUtils.createPrompt(mContext, "用户已经存在!"); + return false; + } + } + if(username.equals("")){ + PromptUtils.createPrompt(mContext, "用户名不能为空!"); + return false; + } + //检查密码是否为空 + if(enableLegal){ + if(password.equals("")){ + PromptUtils.createPrompt(mContext, "密码不能为空!"); + return false; + } + } + //创建用户 + if(enableLegal){ + new Login(mContext).execute(username, password); + }else{ + UserManager.addAccount(MainActivity.Setting,UserManager.getOfflineAccount(username)); + } + //主动调用UIManager + MainActivity.CURRENT_ACTIVITY.mUiManager.uiUser.reloadListView(); + return true; + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListAdapter.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListAdapter.java deleted file mode 100644 index 367c97b4..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListAdapter.java +++ /dev/null @@ -1,153 +0,0 @@ -package com.aof.mcinabox.launcher.user; - -import android.content.Context; -import android.content.DialogInterface; -import android.view.LayoutInflater; -import android.view.View; -import android.view.ViewGroup; -import android.widget.BaseAdapter; -import android.widget.Button; -import android.widget.ImageView; -import android.widget.LinearLayout; -import android.widget.RadioButton; -import android.widget.TextView; - -import androidx.appcompat.app.AlertDialog; - -import com.aof.mcinabox.R; -import java.util.ArrayList; - -public class UserListAdapter extends BaseAdapter { - - private ArrayList userlist; - private LayoutInflater mLayoutInflater; - public UserListAdapter(ArrayList list){ - userlist = list; - } - public ArrayList recorder = new ArrayList(){}; - Context context; - - @Override - public int getCount(){ - return userlist.size(); - } - @Override - public Object getItem(int position){ - return userlist.get(position); - } - @Override - public long getItemId(int position){ - return position; - } - - - public UserListAdapter(Context context, ArrayList list) { - userlist = list; - this.context = context; - mLayoutInflater = LayoutInflater.from(context); - } - - @Override - public View getView(final int position, View convertView, ViewGroup parent) { - final ViewHolder viewHolder; - if(convertView == null){ - convertView = mLayoutInflater.inflate(R.layout.listview_user, null); - viewHolder = new ViewHolder(); - viewHolder.userimage = convertView.findViewById(R.id.user_image); - viewHolder.username = convertView.findViewById(R.id.user_text_username); - viewHolder.userstate = convertView.findViewById(R.id.user_text_userstate); - viewHolder.removeuser = convertView.findViewById(R.id.user_button_removeuser); - viewHolder.linearLayout = convertView.findViewById(R.id.small_layout_aboutuser); - viewHolder.context = context; - viewHolder.radioButton = convertView.findViewById(R.id.radiobutton_selecteduser); - boolean isDif = true; - for(RadioButton p1:recorder){ - if(p1 == viewHolder.radioButton){ - isDif = false; - } - } - if(isDif){ - recorder.add(viewHolder.radioButton); - } - if (userlist.get(position).isIsSelected()){ - viewHolder.radioButton.setChecked(true); - } - convertView.setTag(viewHolder); - }else{ - viewHolder = (ViewHolder)convertView.getTag(); - } - viewHolder.username.setText(userlist.get(position).getUser_name()); - if(userlist.get(position).getUser_model().equals("offline")){ - viewHolder.userstate.setText(viewHolder.context.getString(R.string.title_offline)); - }else if(userlist.get(position).getUser_model().equals("online")){ - viewHolder.userstate.setText(viewHolder.context.getString(R.string.title_online)); - }else{ - viewHolder.userstate.setText(viewHolder.context.getString(R.string.title_unknown)); - } - viewHolder.removeuser.setOnClickListener(new View.OnClickListener() { - @Override - public void onClick(View v) { - - // 通过AlertDialog.Builder这个类来实例化我们的一个AlertDialog的对象 - final AlertDialog dialog ; - final AlertDialog.Builder builder = new AlertDialog.Builder(viewHolder.context); - // 设置Title的图标 - //builder.setIcon(R.drawable.ic_launcher); - // 设置Title的内容 - builder.setTitle(viewHolder.context.getString(R.string.title_warn)); - // 设置Content来显示一个信息 - builder.setMessage(viewHolder.context.getString(R.string.tips_user_remove_warning)); - // 设置一个PositiveButton - builder.setPositiveButton(viewHolder.context.getString(R.string.tips_ok), new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - userlist.remove(position); - notifyDataSetChanged(); - } - }); - // 设置一个NegativeButton - builder.setNegativeButton(viewHolder.context.getString(R.string.tips_no), new DialogInterface.OnClickListener() - { - @Override - public void onClick(DialogInterface dialog, int which) - { - //如果取消 - dialog.dismiss(); - } - }); - // 显示出该对话框 - dialog = builder.create(); - builder.show(); - - } - }); - - //当RadioButton被选中时,将其状态记录进States中,并更新其他RadioButton的状态使它们不被选中 - viewHolder.radioButton.setOnClickListener(new View.OnClickListener() { - public void onClick(View v) { - for (RadioButton p1:recorder){ - p1.setChecked(false); - } - for(UserListBean p1 : userlist){ - p1.setIsSelected(false); - } - userlist.get(position).setIsSelected(true); - viewHolder.radioButton.setChecked(true); - } - }); - - return convertView; - } - - class ViewHolder{ - public RadioButton radioButton; - public ImageView userimage; - public TextView username; - public TextView userstate; - Button removeuser; - LinearLayout linearLayout; - Context context; - } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListBean.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListBean.java deleted file mode 100644 index 6d56bba6..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserListBean.java +++ /dev/null @@ -1,40 +0,0 @@ -package com.aof.mcinabox.launcher.user; - -import android.content.Context; - -import com.aof.mcinabox.R; - -public class UserListBean { - private String user_name; - private String auth_uuid; - private String auth_access_token; - private String user_model; - private int user_image; - private boolean isSelected; - private Context context; - - public UserListBean(){ - this.user_name = "Steve"; - this.user_model = "offine"; - this.user_image = R.drawable.ic_account_box_black_24dp; - } - - - public String getUser_name() { return user_name; } - public void setUser_name(String user_name) { this.user_name = user_name; } - public int getUser_image() { return user_image; } - public void setUser_image(int user_image_id) { this.user_image = user_image_id; } - public String getUser_model() { return user_model; } - public void setUser_model(String user_model) { this.user_model = user_model; } - public boolean isIsSelected() { return isSelected; } - public void setIsSelected(boolean isSelected) { this.isSelected = isSelected; } - public Context getContext() { return context; } - public void setContext(Context context) { this.context = context; } - - public String getAuth_UUID() { return auth_uuid; } - public void setAuth_UUID(String auth_uuid) { this.auth_uuid = auth_uuid; } - - public String getAuth_Access_Token() { return auth_access_token; } - public void setAuth_Access_Token(String auth_access_token) { this.auth_access_token = auth_access_token; } - -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserManager.java new file mode 100644 index 00000000..d9dca3b4 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/UserManager.java @@ -0,0 +1,191 @@ +package com.aof.mcinabox.launcher.user; + +import android.content.Context; +import android.content.SharedPreferences; + +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.user.support.UserListBean; +import com.aof.utils.FileTool; +import java.io.File; +import java.util.UUID; + +public class UserManager { + + public final static String launcher_prefs_file = "launcher_prefs"; + public final static String auth_accessToken = "auth_accessToken"; + public final static String auth_profile_id = "auth_profile_id"; + public final static String auth_profile_name = "auth_profile_name"; + public final static String auth_clientId = "auth_clientId"; + public final static String auth_importedCredentials = "auth_importedCredentials"; + + public static SettingJson.Account getOfflineAccount(String username) { + SettingJson.Account user = new SettingJson().new Account(); + + user.setAccessToken("0"); + user.setSelected(false); + user.setType(SettingJson.USER_TYPE_OFFLINE); + user.setUuid(UUID.nameUUIDFromBytes((username).getBytes()).toString()); + user.setUsername(username); + + return user; + } + + public static boolean addAccount(SettingJson setting, SettingJson.Account account){ + if (setting.getAccounts() == null){ + return false; + } + + SettingJson.Account[] accounts = new SettingJson.Account[setting.getAccounts().length +1]; + SettingJson.Account[] lastAccounts = setting.getAccounts(); + int a = 0; + + for(; a < lastAccounts.length ; a++){ + if(lastAccounts[a] != null){ + accounts[a] = lastAccounts[a]; + } + } + + accounts[a] = account; + setting.setAccounts(accounts); + return true; + } + + public static SettingJson.Account getOnlineAccount(Context context){ + SharedPreferences prefs = context.getSharedPreferences("launcher_prefs", 0); + + if( ! prefs.contains(auth_profile_name)){ + return null; + } + + SettingJson.Account account = new SettingJson().new Account(); + account.setUsername(prefs.getString(auth_profile_name,"Player")); + account.setType(SettingJson.USER_TYPE_ONLINE); + account.setSelected(false); + account.setUuid(prefs.getString(auth_profile_id,"00000000-0000-0000-0000-000000000000")); + account.setAccessToken(prefs.getString(auth_accessToken,"0")); + + return account; + } + + public static UserListBean account2Bean(Context context, SettingJson.Account account){ + if(account != null){ + return new UserListBean() + .setUser_name(account.getUsername()) + .setAuth_Access_Token(account.getAccessToken()) + .setAuth_UUID(account.getUuid()) + .setContext(context) + .setSelected(account.isSelected()) + .setUser_model(account.getType()); + }else{ + return null; + } + } + + public static SettingJson.Account bean2Account(UserListBean bean){ + if(bean != null){ + return new SettingJson().new Account() + .setAccessToken(bean.getAuth_Access_Token()) + .setSelected(bean.isSelected()) + .setType(bean.getUser_model()) + .setUuid(bean.getAuth_UUID()) + .setUsername(bean.getUser_name()); + }else{ + return null; + } + } + + public static String[] getUsersName(SettingJson setting){ + String[] strs = new String[setting.getAccounts().length]; + for(int i = 0; i < strs.length ; i ++){ + strs[i] = setting.getAccounts()[i].getUsername(); + } + return strs; + } + + public static SettingJson.Account getSelectedAccount(SettingJson setting){ + for(SettingJson.Account account : setting.getAccounts()){ + if(account.isSelected()){ + return account; + } + } + return null; + } + + public static SettingJson.Account getAccountByUsername(SettingJson setting, String username){ + for(SettingJson.Account account : setting.getAccounts()){ + if(account.getUsername().equals(username)){ + return account; + } + } + return null; + } + + public static boolean removeAccount(SettingJson setting, String username){ + SettingJson.Account[] accounts = setting.getAccounts(); + SettingJson.Account target = null; + for(SettingJson.Account account : accounts){ + if(account.getUsername().equals(username)){ + target = account; + } + } + if(target == null){ + return false; + }else{ + SettingJson.Account[] tmp = new SettingJson.Account[setting.getAccounts().length - 1]; + int a = 0; + for(SettingJson.Account account : accounts){ + if(target != account){ + tmp[a] = account; + a++; + } + } + setting.setAccounts(tmp); + return true; + } + } + + public static boolean cantainAccount(SettingJson setting, String username){ + for(SettingJson.Account account : setting.getAccounts()){ + if(account.getUsername().equals(username)){ + return true; + } + } + return false; + } + + public static boolean cantainAccount(SettingJson setting, SettingJson.Account account){ + return cantainAccount(setting, account.getUsername()); + } + + public static boolean replaceAccount(SettingJson setting, SettingJson.Account originalAccount , SettingJson.Account account){ + if(cantainAccount(setting,originalAccount)){ + removeAccount(setting, originalAccount.getUsername()); + addAccount(setting, account); + return true; + }else{ + return false; + } + } + + public static boolean replaceAccount(SettingJson setting, String originalUsername , SettingJson.Account account){ + return replaceAccount(setting, getAccountByUsername(setting, originalUsername), account); + } + + public static void clearLegalData(Context context){ + FileTool.deleteFile(new File(context.getExternalFilesDir(null) + "/shared_prefs/" + launcher_prefs_file + ".xml")); + } + + public static void setAccountSelected(String username){ + SettingJson.Account a = getAccountByUsername(MainActivity.Setting,username); + for(SettingJson.Account account : MainActivity.Setting.getAccounts()){ + if(account == a){ + account.setSelected(true); + }else{ + account.setSelected(false); + } + } + } + + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/minecraft/Login.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/Login.java similarity index 81% rename from mcinabox/src/main/java/com/aof/mcinabox/minecraft/Login.java rename to mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/Login.java index 77757fd0..7e6bf02d 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/minecraft/Login.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/Login.java @@ -1,11 +1,12 @@ -package com.aof.mcinabox.minecraft; +package com.aof.mcinabox.launcher.user.support; import android.content.*; import android.os.*; import com.aof.mcinabox.MainActivity; import com.aof.mcinabox.R; -import com.aof.mcinabox.launcher.dialogs.CreateUserDialog; +import com.aof.mcinabox.launcher.user.UserManager; +import com.aof.utils.PromptUtils; import com.google.gson.*; import java.io.*; import java.net.*; @@ -14,23 +15,21 @@ public class Login extends AsyncTask { - private CreateUserDialog context; - private MainActivity mContext; + private Context mContext; private YggdrasilAuthenticator authenticator = new YggdrasilAuthenticator(); - public Login(CreateUserDialog context,MainActivity mContext) { - this.context = context; - this.mContext = mContext; + public Login(Context context) { + this.mContext = context; } private UUID getClientId() { - SharedPreferences prefs = mContext.getSharedPreferences("launcher_prefs", 0); - String out = prefs.getString("auth_clientId", null); - boolean needsRegenUUID = prefs.getBoolean("auth_importedCredentials", false); + SharedPreferences prefs = mContext.getSharedPreferences(UserManager.launcher_prefs_file, 0); + String out = prefs.getString(UserManager.auth_clientId, null); + boolean needsRegenUUID = prefs.getBoolean(UserManager.auth_importedCredentials, false); UUID retval; if (out == null || needsRegenUUID) { retval = UUID.randomUUID(); - prefs.edit().putString("auth_clientId", retval.toString()). - putBoolean("auth_importedCredentials", false). + prefs.edit().putString(UserManager.auth_clientId, retval.toString()). + putBoolean(UserManager.auth_importedCredentials, false). apply(); } else { retval = UUID.fromString(out); @@ -40,7 +39,7 @@ private UUID getClientId() { @Override public void onPreExecute() { - SharedPreferences prefs = mContext.getSharedPreferences("launcher_prefs", 0); + SharedPreferences prefs = mContext.getSharedPreferences(UserManager.launcher_prefs_file, 0); } @Override @@ -49,11 +48,11 @@ public String doInBackground(String... args) { AuthenticateResponse response = authenticator.authenticate(args[0], args[1], getClientId()); if (response == null) return "Response is null?"; if (response.selectedProfile == null) return mContext.getResources().getString(R.string.login_is_demo_account); - SharedPreferences prefs = mContext.getSharedPreferences("launcher_prefs", 0); + SharedPreferences prefs = mContext.getSharedPreferences(UserManager.launcher_prefs_file, 0); prefs.edit(). - putString("auth_accessToken", response.accessToken). - putString("auth_profile_name", response.selectedProfile.name). - putString("auth_profile_id", response.selectedProfile.id). + putString(UserManager.auth_accessToken, response.accessToken). + putString(UserManager.auth_profile_name, response.selectedProfile.name). + putString(UserManager.auth_profile_id, response.selectedProfile.id). apply(); return null; } catch (Exception e) { @@ -65,14 +64,18 @@ public String doInBackground(String... args) { @Override protected void onPostExecute(String s) { super.onPostExecute(s); - context.OnlineLogin(s); + //写入正版用户信息 + if(s == null){ + PromptUtils.createPrompt(mContext,s); + }else{ + UserManager.addAccount(MainActivity.Setting, UserManager.getOnlineAccount(mContext)); + } } } class YggdrasilAuthenticator { - private static final String API_URL = "https://authserver.mojang.com"; - //private static final String API_URL = "http://localhost:8000"; + public static final String API_URL = "https://authserver.mojang.com"; private String clientName = "Minecraft"; private int clientVersion = 1; diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListAdapter.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListAdapter.java new file mode 100644 index 00000000..f50a68f2 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListAdapter.java @@ -0,0 +1,154 @@ +package com.aof.mcinabox.launcher.user.support; + +import android.content.Context; +import android.view.LayoutInflater; +import android.view.View; +import android.view.ViewGroup; +import android.widget.BaseAdapter; +import android.widget.Button; +import android.widget.ImageView; +import android.widget.LinearLayout; +import android.widget.RadioButton; +import android.widget.TextView; +import com.aof.mcinabox.MainActivity; +import com.aof.mcinabox.R; +import com.aof.mcinabox.launcher.setting.support.SettingJson; +import com.aof.mcinabox.launcher.user.UserManager; +import com.aof.utils.dialog.support.DialogSupports; +import com.aof.utils.dialog.DialogUtils; +import java.util.ArrayList; + +public class UserListAdapter extends BaseAdapter { + + private ArrayList userlist; + private Context context; + private ArrayList recorder = new ArrayList(){}; + private final static String TAG = "UserListAdapter"; + + public UserListAdapter(ArrayList list){ + userlist = list; + } + + @Override + public int getCount(){ + return userlist.size(); + } + + @Override + public Object getItem(int position){ + return userlist.get(position); + } + + @Override + public long getItemId(int position){ + return position; + } + + public UserListAdapter(Context context, ArrayList list) { + this.userlist = list; + this.context = context; + } + + @Override + public View getView(final int position, View convertView, ViewGroup parent) { + final ViewHolder holder; + if(convertView == null){ + convertView = LayoutInflater.from(context).inflate(R.layout.listview_user, null); + holder = new ViewHolder(); + holder.ivUser = convertView.findViewById(R.id.user_image); + holder.textUsername = convertView.findViewById(R.id.user_text_username); + holder.userstate = convertView.findViewById(R.id.user_text_userstate); + holder.buttonDel = convertView.findViewById(R.id.user_button_removeuser); + holder.buttonRelogin = convertView.findViewById(R.id.user_button_relogin); + holder.layout = convertView.findViewById(R.id.small_layout_aboutuser); + holder.radioSelecter = convertView.findViewById(R.id.radiobutton_selecteduser); + holder.textUsername.setText(userlist.get(position).getUser_name()); + + //用户选择切换 + boolean isDif = true; + for(RadioButton p1:recorder){ + if(p1 == holder.radioSelecter){ + isDif = false; + } + } + + if(isDif){ + recorder.add(holder.radioSelecter); + } + + if (userlist.get(position).isSelected()){ + holder.radioSelecter.setChecked(true); + } + + convertView.setTag(holder); + }else{ + holder = (ViewHolder)convertView.getTag(); + } + + //判断是否启用账户刷新按钮 + if(userlist.get(position).getUser_model().equals(SettingJson.USER_TYPE_OFFLINE)){ + holder.buttonRelogin.setVisibility(View.GONE); + }else{ + holder.buttonRelogin.setVisibility(View.VISIBLE); + holder.buttonRelogin.setOnClickListener(new View.OnClickListener(){ + @Override + public void onClick(View v) { + DialogUtils.createBothChoicesDialog(context, context.getString(R.string.title_warn), "您正在刷新正版账户的状态,此操作将会删除并重新获取正版账户的凭证,请确保网络畅通。是否执行?", context.getString(R.string.tips_ok), context.getString(R.string.tips_no), new DialogSupports(){ + @Override + public void runWhenPositive(){ + //TODO:添加正版用户状态刷新功能 + } + }); + } + }); + } + + //设置账户模式 + if(userlist.get(position).getUser_model().equals(SettingJson.USER_TYPE_OFFLINE)){ + holder.userstate.setText(context.getString(R.string.title_offline)); + }else if(userlist.get(position).getUser_model().equals(SettingJson.USER_TYPE_ONLINE)){ + holder.userstate.setText(context.getString(R.string.title_online)); + }else{ + holder.userstate.setText(context.getString(R.string.title_unknown)); + } + + //添加删除键监听 + holder.buttonDel.setOnClickListener(new View.OnClickListener() { + @Override + public void onClick(View v) { + DialogUtils.createBothChoicesDialog(context, context.getString(R.string.title_warn), context.getString(R.string.tips_user_remove_warning), context.getString(R.string.tips_ok), context.getString(R.string.tips_no), new DialogSupports(){ + @Override + public void runWhenPositive(){ + UserManager.removeAccount(MainActivity.Setting, userlist.get(position).getUser_name()); + //删除后重置用户列表 + MainActivity.CURRENT_ACTIVITY.mUiManager.uiUser.reloadListView(); + } + }); + } + }); + + + //当RadioButton被选中时,将其状态记录进States中,并更新其他RadioButton的状态使它们不被选中 + holder.radioSelecter.setOnClickListener(new View.OnClickListener() { + public void onClick(View v) { + for (RadioButton p1:recorder){ + p1.setChecked(false); + } + holder.radioSelecter.setChecked(true); + UserManager.setAccountSelected(userlist.get(position).getUser_name()); + } + }); + + return convertView; + } + + class ViewHolder{ + public RadioButton radioSelecter; + public ImageView ivUser; + public TextView textUsername; + public TextView userstate; + public Button buttonRelogin; + public Button buttonDel; + public LinearLayout layout; + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListBean.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListBean.java new file mode 100644 index 00000000..5dca4389 --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/user/support/UserListBean.java @@ -0,0 +1,87 @@ +package com.aof.mcinabox.launcher.user.support; + +import android.content.Context; + +import com.aof.mcinabox.R; +import com.aof.mcinabox.launcher.setting.support.SettingJson; + +public class UserListBean { + private String user_name; + private String auth_uuid; + private String auth_access_token; + private String user_model; + private int user_image; + private boolean selected; + private Context context; + + public UserListBean() { + this.user_name = "Steve"; + this.user_model = SettingJson.USER_TYPE_OFFLINE; + this.user_image = R.drawable.ic_account_box_black_24dp; + } + + + public String getUser_name() { + return user_name; + } + + public UserListBean setUser_name(String user_name) { + this.user_name = user_name; + return this; + } + + public int getUser_image() { + return user_image; + } + + public UserListBean setUser_image(int user_image_id) { + this.user_image = user_image_id; + return this; + } + + public String getUser_model() { + return user_model; + } + + public UserListBean setUser_model(String user_model) { + this.user_model = user_model; + return this; + } + + public boolean isSelected() { + return selected; + } + + public UserListBean setSelected(boolean isSelected) { + this.selected = isSelected; + return this; + } + + public Context getContext() { + return context; + } + + public UserListBean setContext(Context context) { + this.context = context; + return this; + } + + public String getAuth_UUID() { + return auth_uuid; + } + + public UserListBean setAuth_UUID(String auth_uuid) { + this.auth_uuid = auth_uuid; + return this; + } + + public String getAuth_Access_Token() { + return auth_access_token; + } + + public UserListBean setAuth_Access_Token(String auth_access_token) { + this.auth_access_token = auth_access_token; + return this; + } + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/LocalVersionListBean.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/LocalVersionListBean.java deleted file mode 100644 index 4c07bc7b..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/LocalVersionListBean.java +++ /dev/null @@ -1,18 +0,0 @@ -package com.aof.mcinabox.launcher.version; - -import com.aof.mcinabox.R; - -public class LocalVersionListBean { - private String version_Id; - private int version_image; - - public LocalVersionListBean(){ - this.version_Id = "1.7.10"; //仅作为文本填充,无实际意义。 - this.version_image = R.drawable.ic_extension_black_24dp; //作为自定义图标的一个预留实例变量 - } - - public String getVersion_Id() { return version_Id;} - public void setVersion_Id(String version_Id) { this.version_Id = version_Id; } - public int getVersion_image() { return version_image; } - public void setVersion_image(int version_image) { this.version_image = version_image; } -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/VersionManager.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/VersionManager.java new file mode 100644 index 00000000..2123064a --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/VersionManager.java @@ -0,0 +1,76 @@ +package com.aof.mcinabox.launcher.version; + +import android.util.Log; + +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.launch.support.Utils; +import com.aof.mcinabox.launcher.version.support.LocalVersionListBean; +import com.aof.mcinabox.minecraft.JsonUtils; +import com.aof.mcinabox.minecraft.json.VersionJson; +import com.aof.utils.FileTool; +import java.io.File; +import java.util.ArrayList; + +public class VersionManager { + + /* + * 这是一个本地版本管理类 + * 通过该类来获得本地版本的列表信息 + * 通过该类来管理本地版本(导出、删除等) + */ + + public final static int REMOVE_VERSION_ONLY = 0; + public final static int REMOVE_VERSION_WITH_LIBRARIES = 1; + + private final static String TAG = "VersionManager"; + + public static String[] getVersionsList(){ + ArrayList dirList = FileTool.listChildDirFromTargetDir(AppManifest.MINECRAFT_VERSIONS); + ArrayList fileList = new ArrayList<>(); + for(String dirName : dirList){ + if(new File(AppManifest.MINECRAFT_VERSIONS + "/" + dirName + "/" + dirName + ".json").exists()){ + fileList.add(dirName); + } + } + String[] tmp = new String[fileList.size()]; + for(int a = 0; a < fileList.size(); a++){ + tmp[a] = fileList.get(a); + } + return tmp; + } + + public static ArrayList getVersionBeansList(){ + String[] versions = getVersionsList(); + ArrayList beans = new ArrayList<>(); + for(String id : versions){ + beans.add(new LocalVersionListBean().setVersion_Id(id)); + } + return beans; + } + + public static boolean removeVersion(String id, int mode){ + boolean hasVersion = false; + for(String str : getVersionsList()){ + if (str.equals(id)) { + hasVersion = true; + break; + } + } + if(!hasVersion){ + return false; + } + switch (mode){ + case REMOVE_VERSION_ONLY: + FileTool.deleteDir(AppManifest.MINECRAFT_VERSIONS + "/" + id); + break; + case REMOVE_VERSION_WITH_LIBRARIES: + for (VersionJson.DependentLibrary lib : JsonUtils.getVersionFromFile(Utils.getJsonAbsPath(id)).getLibraries()){ + FileTool.deleteFile(new File(Utils.getLibPathByPkgName(AppManifest.MINECRAFT_LIBRARIES,lib.getName()))); + } + } + return true; + + } + + +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/LocalVersionListAdapter.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/support/LocalVersionListAdapter.java similarity index 56% rename from mcinabox/src/main/java/com/aof/mcinabox/launcher/version/LocalVersionListAdapter.java rename to mcinabox/src/main/java/com/aof/mcinabox/launcher/version/support/LocalVersionListAdapter.java index b44fb47d..88197f06 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/LocalVersionListAdapter.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/support/LocalVersionListAdapter.java @@ -1,4 +1,4 @@ -package com.aof.mcinabox.launcher.version; +package com.aof.mcinabox.launcher.version.support; import android.content.Context; import android.view.LayoutInflater; @@ -12,6 +12,9 @@ import android.widget.TextView; import com.aof.mcinabox.R; +import com.aof.mcinabox.launcher.version.VersionManager; +import com.aof.utils.dialog.DialogUtils; +import com.aof.utils.dialog.support.DialogSupports; import java.util.ArrayList; import java.util.HashMap; @@ -19,13 +22,7 @@ public class LocalVersionListAdapter extends BaseAdapter { private ArrayList versionlist; - private LayoutInflater mLayoutInflater; - HashMap states=new HashMap();//用于记录每个RadioButton的状态,并保证只可选一个 - - - public LocalVersionListAdapter(ArrayList list){ - versionlist = list; - } + private Context mContext; @Override public int getCount(){ @@ -43,14 +40,14 @@ public long getItemId(int position){ public LocalVersionListAdapter(Context context, ArrayList list) { versionlist = list; - mLayoutInflater = LayoutInflater.from(context); + mContext = context; } @Override public View getView(final int position, View convertView, ViewGroup parent) { LocalVersionListAdapter.ViewHolder viewHolder; if(convertView == null){ - convertView = mLayoutInflater.inflate(R.layout.listview_version, null); + convertView = LayoutInflater.from(mContext).inflate(R.layout.listview_version, null); viewHolder = new LocalVersionListAdapter.ViewHolder(); viewHolder.versionimage = convertView.findViewById(R.id.version_image); viewHolder.versionId = convertView.findViewById(R.id.versionlist_text_versionId); @@ -60,35 +57,22 @@ public View getView(final int position, View convertView, ViewGroup parent) { viewHolder = (LocalVersionListAdapter.ViewHolder)convertView.getTag(); } viewHolder.versionId.setText(versionlist.get(position).getVersion_Id()); - final RadioButton radioButton = convertView.findViewById(R.id.radiobutton_selectedversion); - viewHolder.radioButton = radioButton; - - - - //当RadioButton被选中时,将其状态记录进States中,并更新其他RadioButton的状态使它们不被选中 - viewHolder.radioButton.setOnClickListener(new View.OnClickListener() { + viewHolder.removeversion.setOnClickListener(new View.OnClickListener(){ + @Override public void onClick(View v) { - //重置,确保最多只有一项被选中 - for(String key:states.keySet()){ - states.put(key, false); - } - states.put(String.valueOf(position), radioButton.isChecked()); - LocalVersionListAdapter.this.notifyDataSetChanged(); + DialogUtils.createBothChoicesDialog(mContext,"警告",String.format("即将删除 %s ,此操作不会对依赖库和资源文件进行任何更改,此操作执行后将无法恢复,是否继续?",versionlist.get(position).getVersion_Id()),"继续","取消",new DialogSupports(){ + @Override + public void runWhenPositive(){ + VersionManager.removeVersion(versionlist.get(position).getVersion_Id(),VersionManager.REMOVE_VERSION_ONLY); + } + }); } }); - boolean res=false; - if(states.get(String.valueOf(position)) == null || states.get(String.valueOf(position))== false){ - res=false; - states.put(String.valueOf(position), false); - } - else - res = true; - viewHolder.radioButton.setChecked(res); + return convertView; } class ViewHolder{ - public RadioButton radioButton; public ImageView versionimage; public TextView versionId; Button removeversion; diff --git a/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/support/LocalVersionListBean.java b/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/support/LocalVersionListBean.java new file mode 100644 index 00000000..9bb890fb --- /dev/null +++ b/mcinabox/src/main/java/com/aof/mcinabox/launcher/version/support/LocalVersionListBean.java @@ -0,0 +1,31 @@ +package com.aof.mcinabox.launcher.version.support; + +import com.aof.mcinabox.R; + +public class LocalVersionListBean { + private String version_Id; + private int version_image; + + public LocalVersionListBean() { + this.version_Id = ""; + this.version_image = R.drawable.ic_extension_black_24dp; + } + + public String getVersion_Id() { + return version_Id; + } + + public LocalVersionListBean setVersion_Id(String version_Id) { + this.version_Id = version_Id; + return this; + } + + public int getVersion_image() { + return version_image; + } + + public LocalVersionListBean setVersion_image(int version_image) { + this.version_image = version_image; + return this; + } +} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/minecraft/ForgeInstaller.java b/mcinabox/src/main/java/com/aof/mcinabox/minecraft/forge/ForgeInstaller.java similarity index 60% rename from mcinabox/src/main/java/com/aof/mcinabox/minecraft/ForgeInstaller.java rename to mcinabox/src/main/java/com/aof/mcinabox/minecraft/forge/ForgeInstaller.java index 7052f8b1..d3d0e8f3 100644 --- a/mcinabox/src/main/java/com/aof/mcinabox/minecraft/ForgeInstaller.java +++ b/mcinabox/src/main/java/com/aof/mcinabox/minecraft/forge/ForgeInstaller.java @@ -1,41 +1,31 @@ -package com.aof.mcinabox.minecraft; +package com.aof.mcinabox.minecraft.forge; import android.content.Context; -import android.util.Log; +import com.aof.mcinabox.definitions.manifest.AppManifest; +import com.aof.mcinabox.launcher.download.DownloadManager; import com.aof.mcinabox.minecraft.json.VersionJson; -import com.aof.mcinabox.utils.FileTool; +import com.aof.utils.FileTool; import com.aof.mcinabox.utils.ZipUtils; - import java.io.File; - - -import static com.aof.sharedmodule.Data.DataPathManifest.*; +import static com.aof.mcinabox.definitions.manifest.AppManifest.*; public class ForgeInstaller { + private Context context; + private String MINECRAFT_HOME; + private String MINECRAFT_HOME_VERSION; + public ForgeInstaller(Context context){ this.context = context; - } - private Context context; - private String MINECRAFT_HOME = getMinecraftHomePath(); - private String MINECRAFT_HOME_VERSION = MINECRAFT_HOME + "/versions"; - - private String getMinecraftHomePath(){ - switch(com.aof.mcinabox.launcher.JsonUtils.getSettingFromFile(MCINABOX_FILE_JSON).getLocalization()){ - case "private": - return MINECRAFT_DATA_PRIVATE; - case "public": - return MINECRAFT_DATA_PUBLIC; - default: - Log.e("DownloadMinecraft","Can't get minecraft home path."); - return null; - } + this.MINECRAFT_HOME = AppManifest.MINECRAFT_HOME; + this.MINECRAFT_HOME_VERSION = MINECRAFT_HOME + "/versions"; } public void unzipForgeInstaller(String filename) throws Exception { - ZipUtils.UnZipFolder(FORGEINSTALLER_HOME + "/" + filename,MCINABOX_TEMP + "/forge"); + ZipUtils.UnZipFolder(FORGE_HOME + "/" + filename,MCINABOX_TEMP + "/forge"); } + public String makeForgeData(){ File forgeFile = new File(MCINABOX_TEMP + "/forge/version.json"); VersionJson forgeJson; @@ -57,4 +47,9 @@ public String makeForgeData(){ return null; } + public void startDownloadForge(String id){ + new DownloadManager(context).startPresetDownload(DownloadManager.DOWNLOAD_FORGE_LIBS,id); + } + + } diff --git a/mcinabox/src/main/java/com/aof/mcinabox/plugin/Plugin.java b/mcinabox/src/main/java/com/aof/mcinabox/plugin/Plugin.java deleted file mode 100644 index bab6ddb1..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/plugin/Plugin.java +++ /dev/null @@ -1,23 +0,0 @@ -package com.aof.mcinabox.plugin; - -import android.app.Activity; -import android.view.View; - -import java.util.HashMap; - -public class Plugin { - -} - -interface MCinaBoxPlugin{ - //Life circle - void launchPlugin(Activity context); //Plugin入口方法 - void stopPlugin(Activity context); //Plugin停止方法 - boolean deployPlugin(Activity context); //Plugin装载方法 - boolean removePlugin(Activity context); //Plugin移除方法 -} - -interface BoatPlugin extends MCinaBoxPlugin{ - //传入BoatClientActivity中的控制器引用的数组 - void registerControler (HashMap defControler,Activity context); -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginAdapter.java b/mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginAdapter.java deleted file mode 100644 index 7567291d..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginAdapter.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.aof.mcinabox.plugin; - -public class PluginAdapter { -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginBean.java b/mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginBean.java deleted file mode 100644 index dccbc36f..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/plugin/PluginBean.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.aof.mcinabox.plugin; - -public class PluginBean { -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/plugin/Test.java b/mcinabox/src/main/java/com/aof/mcinabox/plugin/Test.java deleted file mode 100644 index 60c33b25..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/plugin/Test.java +++ /dev/null @@ -1,27 +0,0 @@ -package com.aof.mcinabox.plugin; - -import android.app.Activity; - -public class Test implements MCinaBoxPlugin { - //Test Class - @Override - public void launchPlugin(Activity context) { - - } - - @Override - public void stopPlugin(Activity context) { - - } - - @Override - public boolean deployPlugin(Activity context) { - return false; - } - - @Override - public boolean removePlugin(Activity context) { - return false; - } - -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/plugin/Utils.java b/mcinabox/src/main/java/com/aof/mcinabox/plugin/Utils.java deleted file mode 100644 index 20a961eb..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/plugin/Utils.java +++ /dev/null @@ -1,4 +0,0 @@ -package com.aof.mcinabox.plugin; - -public class Utils { -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/utils/ColorUtils.java b/mcinabox/src/main/java/com/aof/mcinabox/utils/ColorUtils.java deleted file mode 100644 index 5ff29424..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/utils/ColorUtils.java +++ /dev/null @@ -1,9 +0,0 @@ -package com.aof.mcinabox.utils; - - -/** - * Created by HaiyuKing - * Used Color工具类(color整型、rgb数组、16进制互相转换) - */ - -public class ColorUtils extends com.aof.sharedmodule.Tools.ColorUtils{} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/utils/LanguageUtils.java b/mcinabox/src/main/java/com/aof/mcinabox/utils/LanguageUtils.java deleted file mode 100644 index dfa54ca1..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/utils/LanguageUtils.java +++ /dev/null @@ -1,44 +0,0 @@ -package com.aof.mcinabox.utils; - -import java.util.Locale; - -public class LanguageUtils { - public static boolean checkSystemSameAsLauncher(String launcherLan){ - if (Locale.getDefault().equals(getLocaleFromConfig(launcherLan))){ - return true; - }else{ - return false; - } - } - public static Locale getLocaleFromConfig(String config){ - Locale mLocale; - switch (config){ - case "English(en)": - mLocale = Locale.ENGLISH; - break; - case "日本語(ja)": - mLocale = Locale.JAPANESE; - break; - case "简体中文(zh-CN)": - mLocale = Locale.SIMPLIFIED_CHINESE; - break; - case "繁体中文(zh-TW)": - mLocale = Locale.TRADITIONAL_CHINESE; - break; - case "Español(es)": - mLocale = Locale.forLanguageTag("es"); - break; - case "Русский(ru)": - mLocale = Locale.forLanguageTag("ru"); - break; - case "Brazilian(pt-BR)": - mLocale = Locale.forLanguageTag("pt-rBR"); - break; - default: - mLocale = Locale.getDefault(); - break; - } - return mLocale; - } - -} diff --git a/mcinabox/src/main/java/com/aof/mcinabox/utils/PathTool.java b/mcinabox/src/main/java/com/aof/mcinabox/utils/PathTool.java deleted file mode 100644 index b2f64a67..00000000 --- a/mcinabox/src/main/java/com/aof/mcinabox/utils/PathTool.java +++ /dev/null @@ -1,60 +0,0 @@ -package com.aof.mcinabox.utils; - - - -public class PathTool { - public PathTool(String datapath){ - super(); - initPath(datapath); - } - - public PathTool(String type,boolean auto){ - super(); - if(type.equals("private")){ - initPath(com.aof.mcinabox.DataPathManifest.MCINABOX_DATA_PRIVATE); - }else{ - initPath(com.aof.mcinabox.DataPathManifest.MCINABOX_DATA_PUBLIC); - } - } - - private void initPath(String dataPath){ - MCinaBox_Home = dataPath; - MINECRAFT_URL = ""; - MINECRAFT_ASSETS_URL =""; - MINECRAFT_DIR = MCinaBox_Home + "/.minecraft/"; - MINECRAFT_TEMP = MINECRAFT_DIR + "Temp/"; - MINECRAFT_VERSION_DIR = MINECRAFT_DIR + "versions/"; - MINECRAFT_LIBRARIES_DIR = MINECRAFT_DIR + "libraries/"; - MINECRAFT_ASSETS_DIR = MINECRAFT_DIR+"assets/"; - VERSION_MANIFEST_URL = MINECRAFT_URL + "/mc/game/version_manifest.json"; - } - - //下列路径定义为绝对路径 - String MCinaBox_Home; // - String MINECRAFT_URL; //Minecraft 的 版本清单 version.json assetsIndex.json 下载地址 - String MINECRAFT_ASSETS_URL; //Minecraft 的 assets资源 下载地址 - String MINECRAFT_DIR; //Minecraft本地路径 - String MINECRAFT_TEMP; //Minecraft临时目录-用于保存其他文件 - String MINECRAFT_VERSION_DIR; //Minecraft的version文件夹路径 - String MINECRAFT_LIBRARIES_DIR; //Minecraft的libraries文件夹路径 - String MINECRAFT_ASSETS_DIR; //Minecraft的assets文件夹路径 - //部分文件 - String VERSION_MANIFEST_URL; //version_manifest.json文件下载地址 - - public String getMINECRAFT_ASSETS_URL() { return MINECRAFT_ASSETS_URL; } - public void setMINECRAFT_ASSETS_URL(String MINECRAFT_ASSETS_URL) { this.MINECRAFT_ASSETS_URL = MINECRAFT_ASSETS_URL; } - public void setMINECRAFT_LIBRARIES_DIR(String MINECRAFT_LIBRARIES_DIR) { this.MINECRAFT_LIBRARIES_DIR = MINECRAFT_LIBRARIES_DIR; } - public String getMINECRAFT_ASSETS_DIR() { return MINECRAFT_ASSETS_DIR;} - public void setMINECRAFT_ASSETS_DIR(String MINECRAFT_ASSETS_DIR) { this.MINECRAFT_ASSETS_DIR = MINECRAFT_ASSETS_DIR; } - public String getMINECRAFT_TEMP(){ return MINECRAFT_TEMP; } - public void setMINECRAFT_TEMP(String MINECRAFT_TEMP){this.MINECRAFT_TEMP = MINECRAFT_TEMP;} - public String getMINECRAFT_URL() { return MINECRAFT_URL; } - public void setMINECRAFT_URL(String MINECRAFT_URL) { this.MINECRAFT_URL = MINECRAFT_URL; } - public String getVERSION_MANIFEST_URL() { return VERSION_MANIFEST_URL; } - public void setVERSION_MANIFEST_URL(String VERSION_MANIFEST_URL) { this.VERSION_MANIFEST_URL = VERSION_MANIFEST_URL; } - public String getMINECRAFT_DIR() { return MINECRAFT_DIR; } - public void setMINECRAFT_DIR(String MINECRAFT_DIR) { this.MINECRAFT_DIR = MINECRAFT_DIR; } - public String getMINECRAFT_VERSION_DIR() { return MINECRAFT_VERSION_DIR; } - public void setMINECRAFT_VERSION_DIR(String MINECRAFT_VERSION_DIR) { this.MINECRAFT_VERSION_DIR = MINECRAFT_VERSION_DIR; } - public String getMINECRAFT_LIBRARIES_DIR() {return MINECRAFT_LIBRARIES_DIR;} -} diff --git a/mcinabox/src/main/res/drawable/background_layout_item.xml b/mcinabox/src/main/res/drawable/background_layout_item.xml index 7cf85287..d8a6b574 100644 --- a/mcinabox/src/main/res/drawable/background_layout_item.xml +++ b/mcinabox/src/main/res/drawable/background_layout_item.xml @@ -11,8 +11,8 @@ android:height="30dp" android:width="80dp" /> + android:color="#9B9B9B" /> diff --git a/mcinabox/src/main/res/layout/activity_main.xml b/mcinabox/src/main/res/layout/activity_main.xml index cafb9af6..42e242c4 100644 --- a/mcinabox/src/main/res/layout/activity_main.xml +++ b/mcinabox/src/main/res/layout/activity_main.xml @@ -1,5 +1,6 @@ - + android:id="@+id/layout_keyboard"> - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -