From 78a27326e18e2e077a8d6e9536f9b961775bc22c Mon Sep 17 00:00:00 2001 From: Psychic-74 Date: Thu, 2 Nov 2017 17:25:16 +0530 Subject: [PATCH 1/8] Update compatibility to LILU 1.2.0 Signed-off-by: Psychic-74 --- ATH9KFixup.xcodeproj/project.pbxproj | 4 +- .../contents.xcworkspacedata | 7 + .../UserInterfaceState.xcuserstate | Bin 0 -> 47524 bytes .../xcschemes/ATH9KFixup.xcscheme | 82 ++++++ .../xcschemes/xcschememanagement.plist | 22 ++ ATH9KFixup/Info.plist | 2 +- ATH9KFixup/kern_ath9k.cpp | 186 +++++++------- ATH9KFixup/kern_start.cpp | 7 +- Lilu.kext/Contents/Info.plist | 16 +- Lilu.kext/Contents/MacOS/Lilu | Bin 347592 -> 376384 bytes .../Contents/Resources/Headers/.DS_Store | Bin 0 -> 6148 bytes .../Contents/Resources/Headers/capstone/arm.h | 0 .../Resources/Headers/capstone/arm64.h | 0 .../Resources/Headers/capstone/capstone.h | 4 + .../Resources/Headers/capstone/mips.h | 0 .../Resources/Headers/capstone/platform.h | 0 .../Contents/Resources/Headers/capstone/ppc.h | 0 .../Resources/Headers/capstone/sparc.h | 0 .../Resources/Headers/capstone/systemz.h | 0 .../Contents/Resources/Headers/capstone/x86.h | 0 .../Resources/Headers/capstone/xcore.h | 0 .../Contents/Resources/Headers/kern_api.hpp | 28 +- .../Resources/Headers/kern_compat.hpp | 78 ++++++ .../Resources/Headers/kern_compression.hpp | 80 +++--- .../Resources/Headers/kern_config.hpp | 18 +- .../Resources/Headers/kern_crypto.hpp | 111 ++++++++ .../Resources/Headers/kern_disasm.hpp | 16 +- .../Contents/Resources/Headers/kern_iokit.hpp | 8 +- .../Contents/Resources/Headers/kern_mach.hpp | 69 +++-- .../Contents/Resources/Headers/kern_nvram.hpp | 190 ++++++++++++++ .../Resources/Headers/kern_patcher.hpp | 78 ++++-- .../Resources/Headers/kern_policy.hpp | 2 +- .../Contents/Resources/Headers/kern_user.hpp | 14 +- .../Contents/Resources/Headers/kern_util.hpp | 243 ++++++++++++++---- .../Resources/Headers/plugin_start.hpp | 27 +- .../Contents/Resources/Library/.DS_Store | Bin 0 -> 6148 bytes .../Resources/Library/plugin_start.cpp | 49 ++-- README.md | 1 + 38 files changed, 1066 insertions(+), 276 deletions(-) create mode 100644 ATH9KFixup.xcodeproj/project.xcworkspace/contents.xcworkspacedata create mode 100644 ATH9KFixup.xcodeproj/project.xcworkspace/xcuserdata/nick.xcuserdatad/UserInterfaceState.xcuserstate create mode 100644 ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/ATH9KFixup.xcscheme create mode 100644 ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/xcschememanagement.plist mode change 100644 => 100755 Lilu.kext/Contents/MacOS/Lilu create mode 100644 Lilu.kext/Contents/Resources/Headers/.DS_Store mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/arm.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/arm64.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/capstone.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/mips.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/platform.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/ppc.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/sparc.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/systemz.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/x86.h mode change 100644 => 100755 Lilu.kext/Contents/Resources/Headers/capstone/xcore.h create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_compat.hpp create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_crypto.hpp create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp create mode 100644 Lilu.kext/Contents/Resources/Library/.DS_Store diff --git a/ATH9KFixup.xcodeproj/project.pbxproj b/ATH9KFixup.xcodeproj/project.pbxproj index 03ecd89..c8012e7 100644 --- a/ATH9KFixup.xcodeproj/project.pbxproj +++ b/ATH9KFixup.xcodeproj/project.pbxproj @@ -356,7 +356,7 @@ MODULE_NAME = com.chunnann.ATH9KFixup; MODULE_START = "$(PRODUCT_NAME)_kern_start"; MODULE_STOP = "$(PRODUCT_NAME)_kern_stop"; - MODULE_VERSION = 1.1.0; + MODULE_VERSION = 1.2.0; OTHER_CFLAGS = ( "-mmmx", "-msse", @@ -400,7 +400,7 @@ MODULE_NAME = com.chunnann.ATH9KFixup; MODULE_START = "$(PRODUCT_NAME)_kern_start"; MODULE_STOP = "$(PRODUCT_NAME)_kern_stop"; - MODULE_VERSION = 1.1.0; + MODULE_VERSION = 1.2.0; OTHER_CFLAGS = ( "-mmmx", "-msse", diff --git a/ATH9KFixup.xcodeproj/project.xcworkspace/contents.xcworkspacedata b/ATH9KFixup.xcodeproj/project.xcworkspace/contents.xcworkspacedata new file mode 100644 index 0000000..919434a --- /dev/null +++ b/ATH9KFixup.xcodeproj/project.xcworkspace/contents.xcworkspacedata @@ -0,0 +1,7 @@ + + + + + diff --git a/ATH9KFixup.xcodeproj/project.xcworkspace/xcuserdata/nick.xcuserdatad/UserInterfaceState.xcuserstate b/ATH9KFixup.xcodeproj/project.xcworkspace/xcuserdata/nick.xcuserdatad/UserInterfaceState.xcuserstate new file mode 100644 index 0000000000000000000000000000000000000000..b5b7e12143a4b8b44de28a710fb949c230f9e541 GIT binary patch literal 47524 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 CmPsN2 literal 0 HcmV?d00001 diff --git a/ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/ATH9KFixup.xcscheme b/ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/ATH9KFixup.xcscheme new file mode 100644 index 0000000..75f0850 --- /dev/null +++ b/ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/ATH9KFixup.xcscheme @@ -0,0 +1,82 @@ + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + + diff --git a/ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/xcschememanagement.plist b/ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/xcschememanagement.plist new file mode 100644 index 0000000..7424cef --- /dev/null +++ b/ATH9KFixup.xcodeproj/xcuserdata/nick.xcuserdatad/xcschemes/xcschememanagement.plist @@ -0,0 +1,22 @@ + + + + + SchemeUserState + + ATH9KFixup.xcscheme + + orderHint + 0 + + + SuppressBuildableAutocreation + + 1C748C261C21952C0024EED2 + + primary + + + + + diff --git a/ATH9KFixup/Info.plist b/ATH9KFixup/Info.plist index 3a94af2..39cb905 100644 --- a/ATH9KFixup/Info.plist +++ b/ATH9KFixup/Info.plist @@ -43,7 +43,7 @@ OSBundleLibraries as.vit9696.Lilu - 1.1.6 + 1.2.0 com.apple.kpi.bsd 12.0.0 com.apple.kpi.dsep diff --git a/ATH9KFixup/kern_ath9k.cpp b/ATH9KFixup/kern_ath9k.cpp index 9d75912..025e947 100644 --- a/ATH9KFixup/kern_ath9k.cpp +++ b/ATH9KFixup/kern_ath9k.cpp @@ -21,7 +21,7 @@ static const char *kextAirPortAtheros40[] { }; static KernelPatcher::KextInfo kextList[] { - { "com.apple.driver.AirPort.Atheros40", kextAirPortAtheros40, 1, true, {}, KernelPatcher::KextInfo::Unloaded } + { "com.apple.driver.AirPort.Atheros40", kextAirPortAtheros40, 1, {true,true}, {}, KernelPatcher::KextInfo::Unloaded } }; static size_t kextListSize {1}; @@ -34,7 +34,7 @@ bool ATH9K::init() { }, this); if (error != LiluAPI::Error::NoError) { - SYSLOG("ath9k @ failed to register onPatcherLoad method %d", error); + SYSLOG("ath9k", "failed to register onPatcherLoad method %d", error); return false; } @@ -49,7 +49,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t for (size_t i = 0; i < kextListSize; i++) { if (kextList[i].loadIndex == index) { if (!(progressState & ProcessingState::AirPortAtheros40Patched) && !strcmp(kextList[i].id, "com.apple.driver.AirPort.Atheros40")) { - DBGLOG("ath9k @ found com.apple.driver.AirPort.Atheros40"); + DBGLOG("ath9k", "found com.apple.driver.AirPort.Atheros40"); if (getKernelVersion() == KernelVersion::Mavericks){ const uint8_t find1[] = {0x66, 0x89, 0x83, 0x20, 0x02, 0x00, 0x00}; @@ -60,7 +60,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch1, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched 10.9.x start"); + DBGLOG("ath9k", "patched 10.9.x start"); const uint8_t find2[] = {0x66, 0x83, 0xFA, 0x30}; const uint8_t replace2[] = {0x66, 0x83, 0xFA, 0x00}; @@ -70,7 +70,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch2, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched ___ath_attach"); + DBGLOG("ath9k", "patched ___ath_attach"); } else if (getKernelVersion() == KernelVersion::Yosemite){ const uint8_t find1[] = {0x66, 0x89, 0x83, 0x48, 0x02, 0x00, 0x00}; @@ -81,7 +81,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch1, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched 10.10.x start"); + DBGLOG("ath9k", "patched 10.10.x start"); const uint8_t find2[] = {0x41, 0x0F, 0xB7, 0xFE, 0x83, 0xFF, 0x30}; const uint8_t replace2[] = {0x41, 0x0F, 0xB7, 0xFE, 0x83, 0xFF, 0x00}; @@ -91,7 +91,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch2, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched ___ath_attach"); + DBGLOG("ath9k" ,"patched ___ath_attach"); } else if (getKernelVersion() == KernelVersion::ElCapitan){ const uint8_t find1[] = {0x66, 0x89, 0x83, 0x10, 0x04, 0x00, 0x00}; @@ -102,7 +102,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch1, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched 10.11.x start"); + DBGLOG("ath9k" ,"patched 10.11.x start"); const uint8_t find2[] = {0x0F, 0xB7, 0xF8, 0x83, 0xFF, 0x30}; const uint8_t replace2[] = {0x0F, 0xB7, 0xF8, 0x83, 0xFF, 0x00}; @@ -112,7 +112,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch2, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched ___ath_attach"); + DBGLOG("ath9k", "patched ___ath_attach"); } else if (getKernelVersion() == KernelVersion::Sierra){ const uint8_t find1[] = {0x66, 0x89, 0x83, 0x38, 0x04, 0x00, 0x00}; @@ -123,7 +123,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch1, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched 10.12.x start"); + DBGLOG("ath9k", "patched 10.12.x start"); const uint8_t find2[] = {0x0F, 0xB7, 0xF8, 0x83, 0xFF, 0x30}; const uint8_t replace2[] = {0x0F, 0xB7, 0xF8, 0x83, 0xFF, 0x00}; @@ -133,7 +133,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch2, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched ___ath_attach"); + DBGLOG("ath9k", "patched ___ath_attach"); } else if (getKernelVersion() == KernelVersion::HighSierra){ const uint8_t find1[] = {0x66, 0x89, 0x83, 0x38, 0x04, 0x00, 0x00}; @@ -144,7 +144,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch1, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched 10.13.x start"); + DBGLOG("ath9k", " patched 10.13.x start"); const uint8_t find2[] = {0x41, 0x0F, 0xB7, 0xFD, 0x83, 0xFF, 0x30}; const uint8_t replace2[] = {0x41, 0x0F, 0xB7, 0xFD, 0x83, 0xFF, 0x00}; @@ -154,7 +154,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch2, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched ___ath_attach"); + DBGLOG("ath9k", " patched ___ath_attach"); } const uint8_t find3[] = {0xC1, 0xE9, 0x0C, 0x81, 0xE1, 0xC0, 0xFF, 0x0F, 0x00}; @@ -165,7 +165,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch3, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300ReadRevisions"); + DBGLOG("ath9k", " patched _ar9300ReadRevisions"); const uint8_t find4[] = {0xC1, 0xE8, 0x0C, 0x25, 0xC0, 0xFF, 0x0F, 0x00}; const uint8_t replace4[] = {0xC1, 0xE8, 0x0C, 0xB8, 0xC0, 0x01, 0x00, 0x00}; @@ -175,7 +175,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch4, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300ReadRevisions #1"); + DBGLOG("ath9k", " patched _ar9300ReadRevisions #1"); const uint8_t find5[] = {0xC1, 0xE9, 0x08, 0x83, 0xE1, 0x0F}; const uint8_t replace5[] = {0x90, 0xB9, 0x02, 0x00, 0x00, 0x00}; @@ -185,7 +185,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch5, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300ReadRevisions #2"); + DBGLOG("ath9k", " patched _ar9300ReadRevisions #2"); const uint8_t find6[] = {0xC1, 0xE8, 0x08, 0x83, 0xE0, 0x0F}; const uint8_t replace6[] = {0x90, 0xB8, 0x02, 0x00, 0x00, 0x00}; @@ -195,7 +195,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch6, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300ReadRevisions #3"); + DBGLOG("ath9k", " patched _ar9300ReadRevisions #3"); const uint8_t find7[] = {0x0F, 0xB6, 0x87, 0x00, 0xB2, 0x00, 0x00, 0x83, 0xE0, 0x0F}; const uint8_t replace7[] = {0x0F, 0xB6, 0x87, 0x00, 0xB2, 0x00, 0x00, 0x90, 0x31, 0xC0}; @@ -205,7 +205,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch7, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300RxGainIndexGet"); + DBGLOG("ath9k", " patched _ar9300RxGainIndexGet"); const uint8_t find8[] = {0x0F, 0xB6, 0x87, 0x00, 0xB2, 0x00, 0x00, 0xC1, 0xE8, 0x04}; const uint8_t replace8[] = {0x0F, 0xB6, 0x87, 0x00, 0xB2, 0x00, 0x00, 0x90, 0x31, 0xC0}; @@ -215,7 +215,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch8, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300TxGainIndexGet"); + DBGLOG("ath9k", " patched _ar9300TxGainIndexGet"); const uint8_t find9[] = {0x66, 0x89, 0x83, 0x16, 0x09, 0x00, 0x00}; const uint8_t replace9[] = {0xC6, 0x83, 0x16, 0x09, 0x00, 0x00, 0x00}; @@ -225,7 +225,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch9, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300FillCapabilityInfo"); + DBGLOG("ath9k", " patched _ar9300FillCapabilityInfo"); const uint8_t find10[] = {0x48, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x60, 0x10, 0x00}; const uint8_t replace10[] = {0x48, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00}; @@ -235,7 +235,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch10, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300FillCapabilityInfo #2"); + DBGLOG("ath9k", " patched _ar9300FillCapabilityInfo #2"); char tmp[16]; if (PE_parse_boot_argn("-ath9485", tmp, sizeof(tmp))) { @@ -247,7 +247,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched AR9485"); + DBGLOG("ath9k", " patched AR9485"); if (getKernelVersion() == KernelVersion::Mavericks){ const uint8_t find11[] = {0xFF, 0x03, 0x00, 0x00, 0x4C, 0x89, 0xFF, 0x4C, 0x89, 0xF6, 0x89, 0xDA, 0xB9, 0xFF, 0x03, 0x00, 0x00}; @@ -258,7 +258,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch11, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300EepromRestoreInternal"); + DBGLOG("ath9k", " patched _ar9300EepromRestoreInternal"); const uint8_t find12[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xD0}; const uint8_t replace12[] = {0xBA, 0x01, 0x00, 0x00, 0x00, 0xFF, 0xD0}; @@ -268,7 +268,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x13}; const uint8_t replace13[] = {0xBA, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x13}; @@ -278,7 +278,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); } else { const uint8_t find11[] = {0xFF, 0x03, 0x00, 0x00, 0xB9, 0xFF, 0x03, 0x00, 0x00}; @@ -289,7 +289,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch11, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300EepromRestoreInternal"); + DBGLOG("ath9k", " patched _ar9300EepromRestoreInternal"); const uint8_t find12[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0xFF, 0xD0}; const uint8_t replace12[] = {0xBA, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0xFF, 0xD0}; @@ -299,7 +299,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0x41, 0xFF, 0x55, 0x00}; const uint8_t replace13[] = {0xBA, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0x41, 0xFF, 0x55, 0x00}; @@ -309,7 +309,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); } /* const uint8_t find12[] = {0xA2, 0x00, 0x00, 0xBA, 0x07, 0x00, 0x00, 0x00}; @@ -320,7 +320,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0x83, 0x00, 0x00, 0xBA, 0x07, 0x00, 0x00, 0x00}; const uint8_t replace13[] = {0x83, 0x00, 0x00, 0xBA, 0x01, 0x00, 0x00, 0x00}; @@ -330,7 +330,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); */ const uint8_t find14[] = {0xBE, 0x88, 0x62, 0x01, 0x00}; const uint8_t replace14[] = {0xBE, 0x84, 0x62, 0x01, 0x00}; @@ -340,7 +340,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch14, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300 #1"); + DBGLOG("ath9k", " patched _ar9300 #1"); const uint8_t find15[] = {0xBE, 0x90, 0x62, 0x01, 0x00}; const uint8_t replace15[] = {0xBE, 0x8C, 0x62, 0x01, 0x00}; @@ -350,7 +350,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch15, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300 #2"); + DBGLOG("ath9k", " patched _ar9300 #2"); KextPatch kext_patch51 { {&kextList[i], _ar9300_osprey_2p0_mac_core, _ar9485_osprey_2p0_mac_core, sizeof(_ar9300_osprey_2p0_mac_core), 1}, @@ -358,7 +358,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch51, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_mac_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_mac_core"); KextPatch kext_patch52 { {&kextList[i], _ar9300_osprey_2p0_mac_postamble, _ar9485_osprey_2p0_mac_postamble, sizeof(_ar9300_osprey_2p0_mac_postamble), 1}, @@ -366,7 +366,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch52, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_mac_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_mac_postamble"); KextPatch kext_patch53 { {&kextList[i], _ar9300_osprey_2p0_baseband_core, _ar9485_osprey_2p0_baseband_core, sizeof(_ar9300_osprey_2p0_baseband_core), 1}, @@ -374,7 +374,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch53, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_baseband_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_baseband_core"); KextPatch kext_patch54 { {&kextList[i], _ar9300_osprey_2p0_baseband_postamble, _ar9485_osprey_2p0_baseband_postamble, sizeof(_ar9300_osprey_2p0_baseband_postamble), 1}, @@ -382,7 +382,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch54, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_baseband_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_baseband_postamble"); KextPatch kext_patch55 { {&kextList[i], _ar9300_osprey_2p0_radio_core, _ar9485_osprey_2p0_radio_core, sizeof(_ar9300_osprey_2p0_radio_core), 1}, @@ -390,7 +390,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch55, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_radio_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_radio_core"); KextPatch kext_patch56 { {&kextList[i], _ar9300_osprey_2p0_radio_postamble, _ar9485_osprey_2p0_radio_postamble, sizeof(_ar9300_osprey_2p0_radio_postamble), 1}, @@ -398,7 +398,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch56, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_radio_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_radio_postamble"); KextPatch kext_patch57 { {&kextList[i], _ar9300_osprey_2p0_soc_preamble, _ar9485_osprey_2p0_soc_preamble, sizeof(_ar9300_osprey_2p0_soc_preamble), 1}, @@ -406,7 +406,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch57, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_soc_preamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_soc_preamble"); KextPatch kext_patch58 { {&kextList[i], _ar9300_osprey_2p0_soc_postamble, _ar9485_osprey_2p0_soc_postamble, sizeof(_ar9300_osprey_2p0_soc_postamble), 1}, @@ -414,7 +414,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch58, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_soc_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_soc_postamble"); KextPatch kext_patch59 { {&kextList[i], _ar9300Common_rx_gain_table_osprey_2p0, _ar9485Common_rx_gain_table_osprey_2p0, sizeof(_ar9300Common_rx_gain_table_osprey_2p0), 1}, @@ -422,7 +422,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch59, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Common_rx_gain_table_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Common_rx_gain_table_osprey_2p0"); KextPatch kext_patch60 { {&kextList[i], _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0, _ar9485Modes_lowest_ob_db_tx_gain_table_osprey_2p0, sizeof(_ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0), 1}, @@ -430,7 +430,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch60, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0"); KextPatch kext_patch61 { {&kextList[i], _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, _ar9485PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, sizeof(_ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0), 1}, @@ -438,7 +438,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch61, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0"); KextPatch kext_patch62 { {&kextList[i], _ar9300PciePhy_clkreq_enable_L1_osprey_2p0, _ar9485PciePhy_clkreq_enable_L1_osprey_2p0, sizeof(_ar9300PciePhy_clkreq_enable_L1_osprey_2p0), 1}, @@ -446,7 +446,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch62, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300PciePhy_clkreq_enable_L1_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300PciePhy_clkreq_enable_L1_osprey_2p0"); KextPatch kext_patch63 { {&kextList[i], _ar9300Modes_fast_clock_osprey_2p0, _ar9485Modes_fast_clock_osprey_2p0, sizeof(_ar9300Modes_fast_clock_osprey_2p0), 1}, @@ -454,7 +454,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch63, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Modes_fast_clock_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Modes_fast_clock_osprey_2p0"); } else if (PE_parse_boot_argn("-ath9565", tmp, sizeof(tmp))) { const uint8_t find[] = {0x39, 0x33, 0x38, 0x30}; @@ -465,7 +465,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched AR9565"); + DBGLOG("ath9k", " patched AR9565"); const uint8_t find11[] = {0x8D, 0x90, 0x00, 0x04, 0x00, 0x00}; const uint8_t replace11[] = {0x8D, 0x90, 0x00, 0x04, 0x08, 0x00}; @@ -475,7 +475,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch11, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300SetRxFilter"); + DBGLOG("ath9k", " patched _ar9300SetRxFilter"); if (getKernelVersion() == KernelVersion::Mavericks){ const uint8_t find12[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xD0}; @@ -486,7 +486,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x13}; const uint8_t replace13[] = {0xBA, 0x01, 0x00, 0x00, 0x00, 0xFF, 0x13}; @@ -496,7 +496,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); } else { const uint8_t find12[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0xFF, 0xD0}; @@ -507,7 +507,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0x41, 0xFF, 0x55, 0x00}; const uint8_t replace13[] = {0xBA, 0x01, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0x41, 0xFF, 0x55, 0x00}; @@ -517,7 +517,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); } /* const uint8_t find12[] = {0xA2, 0x00, 0x00, 0xBA, 0x07, 0x00, 0x00, 0x00}; @@ -528,7 +528,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0x83, 0x00, 0x00, 0xBA, 0x07, 0x00, 0x00, 0x00}; const uint8_t replace13[] = {0x83, 0x00, 0x00, 0xBA, 0x01, 0x00, 0x00, 0x00}; @@ -538,7 +538,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); */ const uint8_t find14[] = {0xBE, 0x88, 0x62, 0x01, 0x00}; const uint8_t replace14[] = {0xBE, 0x8C, 0x62, 0x01, 0x00}; @@ -548,7 +548,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch14, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300 #1"); + DBGLOG("ath9k", " patched _ar9300 #1"); const uint8_t find15[] = {0xBE, 0x90, 0x62, 0x01, 0x00}; const uint8_t replace15[] = {0xBE, 0x94, 0x62, 0x01, 0x00}; @@ -558,7 +558,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch15, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300 #2"); + DBGLOG("ath9k", " patched _ar9300 #2"); KextPatch kext_patch51 { {&kextList[i], _ar9300_osprey_2p0_mac_core, _ar9565_osprey_2p0_mac_core, sizeof(_ar9300_osprey_2p0_mac_core), 1}, @@ -566,7 +566,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch51, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_mac_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_mac_core"); KextPatch kext_patch52 { {&kextList[i], _ar9300_osprey_2p0_mac_postamble, _ar9565_osprey_2p0_mac_postamble, sizeof(_ar9300_osprey_2p0_mac_postamble), 1}, @@ -574,7 +574,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch52, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_mac_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_mac_postamble"); KextPatch kext_patch53 { {&kextList[i], _ar9300_osprey_2p0_baseband_core, _ar9565_osprey_2p0_baseband_core, sizeof(_ar9300_osprey_2p0_baseband_core), 1}, @@ -582,7 +582,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch53, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_baseband_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_baseband_core"); KextPatch kext_patch54 { {&kextList[i], _ar9300_osprey_2p0_baseband_postamble, _ar9565_osprey_2p0_baseband_postamble, sizeof(_ar9300_osprey_2p0_baseband_postamble), 1}, @@ -590,7 +590,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch54, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_baseband_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_baseband_postamble"); KextPatch kext_patch55 { {&kextList[i], _ar9300_osprey_2p0_radio_core, _ar9565_osprey_2p0_radio_core, sizeof(_ar9300_osprey_2p0_radio_core), 1}, @@ -598,7 +598,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch55, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_radio_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_radio_core"); KextPatch kext_patch56 { {&kextList[i], _ar9300_osprey_2p0_radio_postamble, _ar9565_osprey_2p0_radio_postamble, sizeof(_ar9300_osprey_2p0_radio_postamble), 1}, @@ -606,7 +606,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch56, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_radio_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_radio_postamble"); KextPatch kext_patch57 { {&kextList[i], _ar9300_osprey_2p0_soc_preamble, _ar9565_osprey_2p0_soc_preamble, sizeof(_ar9300_osprey_2p0_soc_preamble), 1}, @@ -614,7 +614,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch57, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_soc_preamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_soc_preamble"); KextPatch kext_patch58 { {&kextList[i], _ar9300_osprey_2p0_soc_postamble, _ar9565_osprey_2p0_soc_postamble, sizeof(_ar9300_osprey_2p0_soc_postamble), 1}, @@ -622,7 +622,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch58, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_soc_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_soc_postamble"); KextPatch kext_patch59 { {&kextList[i], _ar9300Common_rx_gain_table_osprey_2p0, _ar9565Common_rx_gain_table_osprey_2p0, sizeof(_ar9300Common_rx_gain_table_osprey_2p0), 1}, @@ -630,7 +630,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch59, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Common_rx_gain_table_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Common_rx_gain_table_osprey_2p0"); KextPatch kext_patch60 { {&kextList[i], _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0, _ar9565Modes_lowest_ob_db_tx_gain_table_osprey_2p0, sizeof(_ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0), 1}, @@ -638,7 +638,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch60, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0"); KextPatch kext_patch61 { {&kextList[i], _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, _ar9565PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, sizeof(_ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0), 1}, @@ -646,7 +646,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch61, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0"); KextPatch kext_patch62 { {&kextList[i], _ar9300PciePhy_clkreq_enable_L1_osprey_2p0, _ar9565PciePhy_clkreq_enable_L1_osprey_2p0, sizeof(_ar9300PciePhy_clkreq_enable_L1_osprey_2p0), 1}, @@ -654,7 +654,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch62, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300PciePhy_clkreq_enable_L1_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300PciePhy_clkreq_enable_L1_osprey_2p0"); KextPatch kext_patch63 { {&kextList[i], _ar9300Modes_fast_clock_osprey_2p0, _ar9565Modes_fast_clock_osprey_2p0, sizeof(_ar9300Modes_fast_clock_osprey_2p0), 1}, @@ -662,7 +662,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch63, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Modes_fast_clock_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Modes_fast_clock_osprey_2p0"); } else { const uint8_t find[] = {0x39, 0x33, 0x38, 0x30}; @@ -673,7 +673,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched AR946X"); + DBGLOG("ath9k", " patched AR946X"); const uint8_t find11[] = {0x8D, 0x90, 0x00, 0x04, 0x00, 0x00}; const uint8_t replace11[] = {0x8D, 0x90, 0x00, 0x04, 0x08, 0x00}; @@ -683,7 +683,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch11, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300SetRxFilter"); + DBGLOG("ath9k", " patched _ar9300SetRxFilter"); if (getKernelVersion() == KernelVersion::Mavericks){ const uint8_t find12[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0xFF, 0xD0}; @@ -694,7 +694,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0xFF, 0x13}; const uint8_t replace13[] = {0xBA, 0x03, 0x00, 0x00, 0x00, 0xFF, 0x13}; @@ -704,7 +704,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); } else { const uint8_t find12[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0xFF, 0xD0}; @@ -715,7 +715,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0xBA, 0x07, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0x41, 0xFF, 0x55, 0x00}; const uint8_t replace13[] = {0xBA, 0x03, 0x00, 0x00, 0x00, 0x4C, 0x89, 0xE7, 0x41, 0xFF, 0x55, 0x00}; @@ -725,7 +725,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); } /* const uint8_t find12[] = {0xA2, 0x00, 0x00, 0xBA, 0x07, 0x00, 0x00, 0x00}; @@ -736,7 +736,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset"); + DBGLOG("ath9k", " patched _ar9300Reset"); const uint8_t find13[] = {0x83, 0x00, 0x00, 0xBA, 0x07, 0x00, 0x00, 0x00}; const uint8_t replace13[] = {0x83, 0x00, 0x00, 0xBA, 0x03, 0x00, 0x00, 0x00}; @@ -746,7 +746,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Reset #2"); + DBGLOG("ath9k", " patched _ar9300Reset #2"); */ const uint8_t find14[] = {0xBE, 0x88, 0x62, 0x01, 0x00}; const uint8_t replace14[] = {0xBE, 0x8C, 0x62, 0x01, 0x00}; @@ -756,7 +756,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch14, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300 #1"); + DBGLOG("ath9k", " patched _ar9300 #1"); const uint8_t find15[] = {0xBE, 0x90, 0x62, 0x01, 0x00}; const uint8_t replace15[] = {0xBE, 0x94, 0x62, 0x01, 0x00}; @@ -766,7 +766,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch15, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300 #2"); + DBGLOG("ath9k", " patched _ar9300 #2"); KextPatch kext_patch51 { {&kextList[i], _ar9300_osprey_2p0_mac_core, _ar946x_osprey_2p0_mac_core, sizeof(_ar9300_osprey_2p0_mac_core), 1}, @@ -774,7 +774,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch51, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_mac_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_mac_core"); KextPatch kext_patch52 { {&kextList[i], _ar9300_osprey_2p0_mac_postamble, _ar946x_osprey_2p0_mac_postamble, sizeof(_ar9300_osprey_2p0_mac_postamble), 1}, @@ -782,7 +782,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch52, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_mac_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_mac_postamble"); KextPatch kext_patch53 { {&kextList[i], _ar9300_osprey_2p0_baseband_core, _ar946x_osprey_2p0_baseband_core, sizeof(_ar9300_osprey_2p0_baseband_core), 1}, @@ -790,7 +790,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch53, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_baseband_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_baseband_core"); KextPatch kext_patch54 { {&kextList[i], _ar9300_osprey_2p0_baseband_postamble, _ar946x_osprey_2p0_baseband_postamble, sizeof(_ar9300_osprey_2p0_baseband_postamble), 1}, @@ -798,7 +798,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch54, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_baseband_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_baseband_postamble"); KextPatch kext_patch55 { {&kextList[i], _ar9300_osprey_2p0_radio_core, _ar946x_osprey_2p0_radio_core, sizeof(_ar9300_osprey_2p0_radio_core), 1}, @@ -806,7 +806,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch55, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_radio_core"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_radio_core"); KextPatch kext_patch56 { {&kextList[i], _ar9300_osprey_2p0_radio_postamble, _ar946x_osprey_2p0_radio_postamble, sizeof(_ar9300_osprey_2p0_radio_postamble), 1}, @@ -814,7 +814,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch56, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_radio_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_radio_postamble"); KextPatch kext_patch57 { {&kextList[i], _ar9300_osprey_2p0_soc_preamble, _ar946x_osprey_2p0_soc_preamble, sizeof(_ar9300_osprey_2p0_soc_preamble), 1}, @@ -822,7 +822,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch57, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_soc_preamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_soc_preamble"); KextPatch kext_patch58 { {&kextList[i], _ar9300_osprey_2p0_soc_postamble, _ar946x_osprey_2p0_soc_postamble, sizeof(_ar9300_osprey_2p0_soc_postamble), 1}, @@ -830,7 +830,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch58, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300_osprey_2p0_soc_postamble"); + DBGLOG("ath9k", " patched _ar9300_osprey_2p0_soc_postamble"); KextPatch kext_patch59 { {&kextList[i], _ar9300Common_rx_gain_table_osprey_2p0, _ar946xCommon_rx_gain_table_osprey_2p0, sizeof(_ar9300Common_rx_gain_table_osprey_2p0), 1}, @@ -838,7 +838,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch59, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Common_rx_gain_table_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Common_rx_gain_table_osprey_2p0"); KextPatch kext_patch60 { {&kextList[i], _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0, _ar946xModes_lowest_ob_db_tx_gain_table_osprey_2p0, sizeof(_ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0), 1}, @@ -846,7 +846,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch60, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0"); KextPatch kext_patch61 { {&kextList[i], _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, _ar946xPciePhy_pll_on_clkreq_disable_L1_osprey_2p0, sizeof(_ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0), 1}, @@ -854,7 +854,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch61, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0"); KextPatch kext_patch62 { {&kextList[i], _ar9300PciePhy_clkreq_enable_L1_osprey_2p0, _ar946xPciePhy_clkreq_enable_L1_osprey_2p0, sizeof(_ar9300PciePhy_clkreq_enable_L1_osprey_2p0), 1}, @@ -862,7 +862,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch62, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300PciePhy_clkreq_enable_L1_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300PciePhy_clkreq_enable_L1_osprey_2p0"); KextPatch kext_patch63 { {&kextList[i], _ar9300Modes_fast_clock_osprey_2p0, _ar946xModes_fast_clock_osprey_2p0, sizeof(_ar9300Modes_fast_clock_osprey_2p0), 1}, @@ -870,7 +870,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t }; applyPatches(patcher, index, &kext_patch63, 1); progressState |= ProcessingState::AirPortAtheros40Patched; - DBGLOG("ath9k @ patched _ar9300Modes_fast_clock_osprey_2p0"); + DBGLOG("ath9k", " patched _ar9300Modes_fast_clock_osprey_2p0"); } } } @@ -882,12 +882,12 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t } void ATH9K::applyPatches(KernelPatcher &patcher, size_t index, const KextPatch *patches, size_t patchNum) { - DBGLOG("ath9k @ applying patches for %zu kext", index); + DBGLOG("ath9k", " applying patches for %zu kext", index); for (size_t p = 0; p < patchNum; p++) { auto &patch = patches[p]; if (patch.patch.kext->loadIndex == index) { if (patcher.compatibleKernel(patch.minKernel, patch.maxKernel)) { - DBGLOG("ath9k @ applying %zu patch for %zu kext", p, index); + DBGLOG("ath9k", " applying %zu patch for %zu kext", p, index); patcher.applyLookupPatch(&patch.patch); // Do not really care for the errors for now patcher.clearError(); diff --git a/ATH9KFixup/kern_start.cpp b/ATH9KFixup/kern_start.cpp index 9480791..e71771b 100644 --- a/ATH9KFixup/kern_start.cpp +++ b/ATH9KFixup/kern_start.cpp @@ -29,12 +29,13 @@ static const char *bootargBeta[] { PluginConfiguration ADDPR(config) { xStringify(PRODUCT_NAME), parseModuleVersion(xStringify(MODULE_VERSION)), + LiluAPI::AllowNormal | LiluAPI::AllowInstallerRecovery, bootargOff, - sizeof(bootargOff)/sizeof(bootargOff[0]), + arrsize(bootargOff), bootargDebug, - sizeof(bootargDebug)/sizeof(bootargDebug[0]), + arrsize(bootargDebug), bootargBeta, - sizeof(bootargBeta)/sizeof(bootargBeta[0]), + arrsize(bootargBeta), KernelVersion::Mavericks, KernelVersion::HighSierra, []() { diff --git a/Lilu.kext/Contents/Info.plist b/Lilu.kext/Contents/Info.plist index d26b6a3..69dc308 100644 --- a/Lilu.kext/Contents/Info.plist +++ b/Lilu.kext/Contents/Info.plist @@ -17,7 +17,7 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.1.7 + 1.2.0 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -25,21 +25,21 @@ MacOSX CFBundleVersion - 1.1.7 + 1.2.0 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild - 8E3004b + 9A235 DTPlatformVersion GM DTSDKBuild - 16E185 + 17A360 DTSDKName - macosx10.12 + macosx10.13 DTXcode - 0833 + 0900 DTXcodeBuild - 8E3004b + 9A235 IOKitPersonalities as.vit9696.Lilu @@ -59,7 +59,7 @@ NSHumanReadableCopyright Copyright © 2016-2017 vit9696. All rights reserved. OSBundleCompatibleVersion - 1.1.0 + 1.2.0 OSBundleLibraries com.apple.kpi.bsd diff --git a/Lilu.kext/Contents/MacOS/Lilu b/Lilu.kext/Contents/MacOS/Lilu old mode 100644 new mode 100755 index 0327c4b2130b7f7b7b92722a68589186591bc382..9295776f3a6fff9422ad2fd37c26632a7c0cf3ab GIT binary patch literal 376384 zcmeEv33wD$)^>-aAt)LZNyO&w-8iff|vw1f(xR8G>A~82mv()RPw*?xplj$lLndPdA{%aAM@mNoqF%N z=iYnnzEsu1&EIY5=JRD_`h30}LEwGSET69uSN{D0G%UmC8#Cst;OMgiO8prNVeg-F zPd$DR_404bnCr(+zFzU_K2_h?uF9>~y(4_g;O<)zt`nS6_9V8^MnHrY=@KCYdk>{&?@z=W0?M?KT-+#*8T}IIF

e$Cus`U8u{a7VKyU}L6@^8$TORjcfwRL@yl(>)jw9Pf-y^a}k<<%FDx%8?_uOBm^ z_^NT8;y1~OPqyQU_g;P7y~@BVeb-EtRW3gCMzu!{nw7pmKG&x=elDt%u-t_}W5$d;`Lt7mg(sioC{M69`h0;c&V8NI zqVHMWyt-K0dxJ{f&hlLa(cA<5zCrh^He!^c;#mlh&c%IKWWq$R0!OCfWo!?>?`&om z!k>l9o*;%(eB@;tzBuggbDn#;$Ia{RzpnORV7Z{*|Nd`VpeSU19g3{Y9b9M53z;Qt zp%}>A6pGYmGwC zw^4Zj{Mqyzis!$0PZwNK*l}wr7JRw>UtH*)a0KN-XImZ zVk=}8B|>I+Nue41I1~$8p;!?jT{VqC#=;5bcDlM<;@mc+-p;^nVNCqD6q;pq;#$&T z<)XeIB}OGH5De2|t=q*xPS(iHyF18Hf&^QP+0h@sMmG73iv6|Jggl>bMut%d?@H0z z2P$tBJ%BU@e`&{`eW$nvTSBo?MhWq62@NQ7B8ya&HEV%L4Ozpu&Fg)X<7!lAGxSPU z&k(Fy6}22LnjMP!kNE)EK-Dp`jY?+kY%U62zMw}aqe)=1EP!+)PH^jDEpV<=v{T#R_* zA!*WHu`{Al9bDe81wJBe0i*H{@Z%I6$K$MY9#8G$5vFwm>yggS?(k!?y;VOC!uSl^ ztdH0Sn89W<{GL%Uh0Y+DpgCe4Y6hE(3U&l8Hq;ExH!8-YV8@xkI-}xLFIM+Z#L6;* zZy4oAdfy^;#?%>39TLu71-nH-!PEKmwf@1~~ zB5pu{1vsUY?SXQ^%+aL`!AZUkmy%{w-U++Y8u=Tc*{Cr1%iHhCR9>TU@=MXbZ#w<2 z!N=D9Pk@$LsMz5z%Qn#j#y#^&SK|I1qq_LZveoSU%C_8wUo$)_8hpX1U_T9YU-n~R z&7aDno%)11-sY`-h(oj zqHnwzoN82Dl7dYzgSQ(Mvr@22%wW{0nCHQqQeBZ!s%N;Ry4095M~h2V1$I(d7BHM^ zjwHP*jHaR}VN`Fh2Ease8*GV&GVEL6ojw}_S0EjZr>@Smn{&-}u72m*-MQ|7Ye|bo z`3L#Pye>^Yf_cZXU$PD=lDt`|KC>LGgbK|u5ykW|3l@o(S#;#-o@U* zRnA89KUDtbROK@rjmXfh|GDyC4@immC}>2tga!`T9(2l7i}fj`H;f;KK_ zt|~7&X4n#MhNV_I==2QN3ZRwwplTFm15a+J@k4#m82`);(UGYZ)uUEO+27FasTf^Q zF{1C#IXY^hR|-|e&M@OQa|m347DNppoW^cxhAQ(Pc5!S)#YSa~velEcrV;oe36aipRyS zM|A4WGz9hMehjHQHF%H1PlrjD&ana%Ni;bzQ}sbM`XHIbCm0(vW|BKr24b@H;^4}C zhS0Ym2X#&%PjaqNP`WDs*Py`r=CGVr6)kO@mti&-!3}}vMyie8ZwbDv6Hdcb6?MkH z*@~WTleiJAkIqxd*8;S!M)+=|&{RmI7#|Lw|A!*=Nyp;zrUMw&p^38IaXI3qN+p05 z+4Y+;1?CcG4Z1sJQRZz!Ic=C7s489-Xl=+q@&nNZIs~FG(TYljcFR&MP35pOP?mk1 z6L#t3iI~x0;nP=>G|y`c3%Zw5x7la}HwB_wMxx*sL}xKvH`wMtbg|>WV3U648A0^? z+KKVliWB3dom46ub&`$uz|~FoYs@+=Y%Vl{o6|?DLyS`*mg*}dVyRBsju;}+u?~0^ ze9GptP2rkPK&|&g){c_(HkAIxDJ}GjKNi=9Dcz9|!baY7#)(S>aQmSZndUo@Z!*lV zWfrY6DvpLTlZ15@D`IuQQiV}*Mhcc`2A3KYmugI}j{S=EgN3WHlrhl35()X&1L3%1 zpFOy!@{7GFMV59~4T4v8BbMSR`&5c7Zqmp$II=f7vZ@P5)1Q^B0;s*Ygog7nkboc8cZNrSp<2!mR5syoEOA~y#q()agaH{wrqDEVahy)bdxP=09gtaQf|HsQELDiUGt}VN?`zohaIUl28{7xe3YgBm~3# zyC9n!>r0QD>-f&$9$jbQ$co(hO<5fz^U_Op>mY`{HJ!q|`c3{0k|-zXBm?!Ex^|F6 zEp#O93sc$wWZw%&3NsApoC?;p^OI%~Ry{ehaBTXd*cq#y9y|a^KdXLI zm(=)|A`UwKT)J_~7e;QL_}`fl|9i|Ltg?FIe~-i;tE`^*14I0=%KG1kzY2fb@&6QY zbmNb9_*Dn!Wd91YsMM%90?v;8D;WPuHIqCn1LB zuH5mGwcH~%W*4oqW~OWM&vFJcdgY|DSmG9JX$|a%-9lwOsp0G4P_~Iz9>O}9~#YFShOUkQ9Qe`lAhwKhOi zD4w&!i`Xxf9W@M9XAd*mLYLQJv$Wo*zA+=x4r`{yNM~>|Mt|>>rbjK%G3pep3R;-a zQpVw`t0Xm%%TYn4Y|1fqXG-i!79(m{w4(XL>mmzak9UmOA6or%pa(F;e-*{Wsa0m(|p&(2jDmVem%TgzK-u z!`eYIJQ#Da^&}!BlYFy`f!f@3+rD`1maMBS@Bt_ zMSGysG{9Qe<>nqCv;3}PCjE$-A)~G#jus^_bwVr*(*K)DT^p8k-E>N+gW9lH>ALe1Wp*`FQmX2 zY-1j`)F_{p0?!rcB}RE!3jCtL9~YSc6h}o|EJd> zM?1_i%J1?zbk`2g8Re6`4u0)0!zdr)b;!^TPa5SXc^!V;!ovZG?sTJkpx0rOc6i7r z@9A~;Q9DdC%751VAadA$qIS5)C|~Ju7+8neCfmR7dC_@-VrWwBLH);SB~hdNVUNSW zg(8k!;3;18BSA4{xW(E~uE*6J*UWbFlVXQbj<8?Sh9L^Jmsa}Ue#bLBK z+~9SXf*Z5)EOEHN>tKq*C~*jS9b)1zQXCHPI>f~xBo4cJ9Uc>hLUGuPh$K_~f;a@k zVTIS>MR7P*9GbiiFN?!4ad^S&@Txc*DGv8}9Q>hQSY9#s8$`GAo4jtvi(8gid5E}O z;B_0K{q+~O6TEJRh#SV4eZ`F#sMF-%>(*Vn?ImvOP*jrseA=zIxP9n# z`)RYPbCo^CjjIPqe`kmr(w8f4fA_kDv|A5xyT$8vymreLw~M@PLv?sr;&zh9ZQ$`} z)XYjB9V!NT9SX$Z7gR@_m+?BBC=PAn@H4su9rb}hari+TR(c&m;?N=v3%m{^#bK>D zuy;wSI$azrak$^>aE3Un5{Fwn4*sXGfiC4DLAUaYylxL^x258ClGp8S?Y2bRIJD8R z@K=c&%Eiax#zB<0H3Zu;Y>v>t`0PPo*crD5c0!lPF$nLletmOf6Bbi2w-ulvkdgF_ zb(eM?G^z`g&1br0`Ju!5Lu74$oo!<<0Rd>hGR|3je7?a8qVHf(5iss;2$Z(A2TE6G z1dQqi6APaumM>bg90z$sp0fb1KKP7#akObUwngMpZ`_`gyC{b<`dRlrN3 zN!A)APP^=%Mnu|MHcGZP3M_fLrH$0#bn06BGWMAzt5AKsf~v@QP7VjqTuyxivQPX5 z^+Qtc0>zQ&bo2o5DZjS2zX19abS|3t2Wy83=YX)!4;slyCv_^^cW~3g?F)|5LWcUd}C@Mmc zdK{Gzmh`QyY)H!*c26TU3nx09QzQr%sD(-XH;zRqO5MRmBV7C<2~?uL2-Oqs@kro zm&}TWfS*U5EXg~wAlIg=a_H)H=xwh~I&||otEp?qX}9s1j^BpteY9R}GCCLMP0 zIt;VRlMXw29RfBhq6(vj*CAw&N;>3t9Y)zlB^`G1I*gWe6s5}WI*fHURXXpNsPfSg z#fB1|ovl9>@(1$EsdscOWuS{G8JC0-Hj*YpQhb4${w2`iZ1;w^Zr84$?9QC{9Xe zr%LzlAU%q@M#<3ogLDI>_3Bz{ zphv27sDm_H(&UpYtpP4Qd32BJAblC7FHFXSqjHb*=nm4yQu>Ibw2>-3wu7|H0k9gP z3J}NtdMJ-7kNz`cremgjmne1hZ(hF?(ZV3&sdl zhyhlySMynuahM^5t-*EC`cPSkRRIgYE=FVzraJC_1IIkjdRxZqp3&h&cn;{EhCsCV z>#E?_$>r!_O7d?>$+Mzeh8O+dsm1$3LRt-4BZLtPW(RO5H0?r}DZkcr zf-w@Y@DJuYfvO{OVbtZNCCiaFL#a#36%Mi6$e%^X>m5QF&Dc@ch~0$h9#gTFt|qZE zf&IV?|6-?(^v-|lSQz&l(6yjAD5ZY6&x>*7**anp>VPwBMBqOA|enknJnFMpkqqB!>(fsmO|9 z^>!xF?;Jsv81n9U#jz-3ORpJ=%;+%ijyY*1 zp1y!N)wwIrt~$dQWa$`mfBgbah_V+2R}yPMst>9v-RxA8}T4Z zW;8q-c{c;y`gCK;c>0d}Zxkir8Ogj$wJI`x9Sc&H8Ggtt!m$ylEeHW)+=n8TUmliw z5VuZ20@g!zOFRV*SdKg_cU_8HPafl_d_-e4{lLxXg&$ds@J`|$7*f12!@3M1Qp5`AnLIu}6X3BrQH2hw>zgWjbN-fEe$Ik@)}C7jVZBm*NG z3`oqy@w0}aY!$bd_pz`ux6Mx@>$9T4DL5u#&b^skg7>fpcItZQQz2}P9D@SxX;xlO zX=y$LR(Zq}DSIIe-1cJ$c8&5DYGtP~{a0$%t>M;c3e??}&hv3PTFHvpSjxolk5P(6 z(-mxqv1fqgZqWMf!TQ8}tW7Kg%|#NMur^VEb&dN$D?$3aZM3N%>WnZ7qrvZ^X$BeL zwgPiO*nHUj_32W0jS6sS-Sz}njc9FufXAi{5aF@dVf@c!e_7qna{DGH>mR1wW1hYV2O_ti z4qTz~W8HkjRz}xnbTJoAh#iShdhr(fG`OM@+t{xTVbr&EjkKZn-jCtM{jYnxMCNf> zJn3zBrSt)hghweCaXKk=ir55?7py;QjI173za=wcV`N^o1aK_kRkFpdR#6zX6=|<% zEL~^=l>fH3+*GU3j_(wd^j2~I`<+Bp#JoY}DXoup5Y5==5yE6=3lGrys!*?g23>)= zzYO$O)cprQ=b`?u!?h9Dj`I(^k7JNbM$uZgj<~+VVA(HO%n|VQG6GhskFlvuh}J=T zUNI1z#pN2+M6tnQagiQT>b_aB#F+A;O2a&n!)r41W)M9=vCp0=0?wJ_pU|LmYFkSn zVbrQa$!5W1H7bo4ru0$o=&y&>QLPIg0jlHq-QkO{{xu2kWks0RoM1tymXhSGMTR=rUmzVX@TH z*(YRliA6JZ=T096EL#>!`x2wD-gByiazujT7DNI$a3`7=q+iGB#imSpF{(#RjI8WZzd56RWu`p4isAYix~SvMsMU;<5|v}aGA8GP zI%>SVMi1oIR0Y=@g5LWhqmu2sryDNCE&pte?y=B~W^E1M9Ktb6DIju@*U0tqZf_Fk zrw(H?_{LHK{7b54QZSz~n<6&H+)ZY9zA@!=NT3lqTgrU6DYcxIR=_pGmRb&-4RYVb z)(c4LKFi*bI+E_$D)ls5H)XF3Oy@s{_h<-27Y3pwtC679kp3USos=`1M&WO_W%XlM3bL~ZuhzLkbtzQ`N9m`|W*Y?h6to6(8Z=xDx)=01sN?%~ z8iH$}Bmq@WpD^)$o=q7>_a7N zp6x~hX~wH;I<5C4+glThe~rP_G*bf6NT#rh5n*fhUrOPh zp$g3)3tDOlCzy+kH@9?en_xDeTVCxZlH*~V4#cWt7^{;Vl8Fbd(a{YfVfvmK#;HpmPGZ%MnF@vkzbd?}o5M;7CrV2xww5gKv$c0+8lF3KT zhA{3ZdZ?avf%P_O3ZBaD3~vL7tejlG87(7DJ=%{uo|4aU=|vG}5pgb8Oh(g4;YlgN zSV{5-C)YN#FeeTSS82u>dXI1?&EA^JnToWB?vK(_2Zt_3MR#0yJ~Pn`n~>aOWWQL( zro%1czfr!qux(U#<=bSikDD;V=+C%1D8M9y(Ao&i(2 z2Bh^q;?+x$&Uz!%djs_%M`Fp9l;LXfRxXWj+W4ypc(7%_R8I4Bh&_-8$&^r}bBIYB zX+t4!WSjFMEw(-#)|=V>c=qIANuzr9?eG-Y(k0bMk03zx1XptE%LS2dAsY>^w{vh! zJ~>5DrCA!@l=0y@xS@KkZ(qQEtQ)%9C1&_zV~Wa6|A`0&d9}pt$Ku6U+QTSqZX(TK zBwNL59eM+F{#*qxs&8Zbv4w5kzA+chau@>bry3nTjg0R!o}9-x%?_^JmKJvS(4t0+ z1xRiuEjL2~{ob~e9IuolBth?`Q{wElLL!Xh;QUbaOOl+8IP|lK$)R1VqQpw;Gor${ zHBi4W&G!!aQyvZc9CWsGB~N+~r04tYem(cfLS8@K06P%*TO*C{Cgk z{nY-BxhV1tvJLGfo~fO(FQXLq?yvGti4tpR*ejS=p`oqDZ|2VMg;* zij*kdTPGHRbfkt(Sw^``+mb-G5!u^`UranlY+uCAiqz*a2&K=CITG6nzo$q3-0hI> z>yaO@9r8!I@`LNne`^Es;~Ll<)3Nr)oGW?KB9P7xJ@?Z6i{7h%h#Fl%ZL+Uf(T#Uz zGz*q;%K+zorHG+CKOMz_NlA-YyfzyA7J0^Em1xMwh!w4k%)@3;gdwi15O)eBR__FPA63?;= zl6)6i_o|dRD2Zp;PTnIvU2L{>Dn426i34^~b#3Tktdo$iCT{rarKzV>!cqqEi3aC% z=H)OUl_l5tzs*qd+2VGaC$#7$#ffEiQ~RSyJLi1-$0~e%5;h%}L5!p#V0uDx8rD;E7lj&2GjW zSjlA~m|$Z5=WwsYIKB|EM7Ky?p~BA7Sew7I*H@BWnN3>_;kBgLPL7zL?W_arg}R^uT68l}SEPXDNnpGJKF}@1T-`$0uWRVxB;>Ym zCCb}2TR1kNN-U*?D^}PxTez>2Ubor8$=Fxg_+$&mvtJT`YT>5--oB-_=l{R7Z^dYn zH06W$l5XElbJ{JoW#qm0#7tnbKwSUgeY*DTe`0+Ihow5LpKyI>_V4RMXecA|wz)p! zS?|)vvKsMnYW(4-s;pUJ3R8?*%q8&-%imnHT$-|G`EjJ=f)=}0gh&UK@GYKUl7L!9nB$} z_$!+?oj%PHt1+uDIG@GGE|4BX8D|%H(u>pY${i^cDQSUC*r3a*hx}k7^Zw;ozE+&P zlC6L7Hk=lS=WiH_lWy@LAIhcIj))45zZtlU#GJdptnf;r1I?UeI&k+owBqfNo+yuzyUb2<0qu~we-<~*|i@7pen z7Jb?`BN|*>Q2G^a&i@3dX+c$KfdHmLS*`M>qP_yY{1QFicb@E7_AnW+#yCaQR*=&{+>qYT}LP;LR^lNY?P988RS#4?hbtILyFG;YKrHV zi&=&|bfg&R6S?Gkh6_%?S|~Y9>5Mf)Wg$yCqK}w{+w5Zy3zZX0s5&9qWOrrRYz)>x z5^u6!jAdS~gtP`f1;;^1GQmjf6Ug%rV}0A6aB)h6wwLuaYf6ljrLHQ77iAV(e4?+- zy0R;9GdK(NWfn^DFnDzeME;kOnjv*ZNZK~>f+FT5h#{+Fa1Lp!{jic*P@KR5)e=Y| zoKN~@6yiZet2drf#p!uQuHsdQM@rr})TrPzUl+ci6CJze0fb#|S78^buuD?I)^>6t zz?MSR4+Pg5S6$+0JWy#It2AyrTv9VY6z3d<3v+54xzvN&uN57|NS;%`VDAVv;&=qu zYqEYSkhlt@ftRhCj9bZGeIG#|a-z*Xj3I&?<4DF->>|=7v#ehhWWXC3z6Jngqm7c# z(}sFC7W-$;{upbS=Xs)`@X`{hUy~Wi*b*|amCH|Mc=uxhZbJ)As6u8*f>kKYawDZ` zCBkt^RYJEjccOg0N&AOlL&p6PjULu*tyA7pO-yAa9U6li=re}!RTrX8c`N`Yc7V0u zh`eP)26`p1TuUkS2+c5yPiu&zsuV5u+X%E{L|9PxfwilV){q$2;% zxKlkrqyH4T5RS~plV^H8Z&cFQu@TvDLQj~|UjCLl#(%m0V*cjoAYU>&L@4U!mxQ!3!Y6ufx_1o z(4bh>ru`h#JI{us-LF!GnL9CjhVm9vt48QxBZhqn)LFB52@kL2An&C;lNXq&{6)I> z0-~Kmv1_tJW)@zmTLABTNTVQI9>QXI(Is}K>hb@H*K1%{RO60^ybp1p$YKnXY+pwq zA~HS>#cqY>_0Y`bn$->R?l==~Lwl zNIbt%>3>A&|5PqHU+@BpkHlz0E}=YcZC1LNBe6gpvbV+l2Ehae*HJhW8>B9yP%(KM z%H=gsHF-~73#&qV1xnXs6tH|C2{;|I5apz>s%T-*sQ$b#8vYD3mGro8B3Z2fh**ad39gNBg5C>@FxCKR}AWx_Gkugq+52Zjne~D!K zkmvB$73BWca>=oILG+Mf4EdIHO07;Z3Lxr_)S>yq&h?ZJWM`l-S|_ChH30)- zs<9j~Lear4rujiA(lCg{8OLiO(qz4eS4_aUiR0h$gLP&hmZMcHyQ)|oFVPFP=y;7+ zX>CRkhqYB_+wc=r4U@8j@0{RU8}bsZ1=g}=XTFdel|cU?O8-9&5-TjnrBk_bW&-H+ zSX(>qFXx#hznH~sk&<6f(Dp`*upey(f3P?xJ&S5c(7}dxv-s>GH3ndAQFJeN{5+U=1+)(7ET;#%8I)1wFKX#r| z_?^kl6H=aryl|jI+LBAoT3)2^2Xeh}7bWt7Lb|%CusNQyCLs913s9uvy{3!S{7JY( z+HwnwhvkEAIA{J-A@-OHTG0+0oUtI%0Y;hwM|mkh#l;;X+;XlH;o&q_JpU3E;VpP6 z4+1($MR+(aP^_jVsIRbkkrj^ZGSckXce@gB6O^|Gf5IAqY7}}s0CUTFg{nR!IE97< zg95YOQllfWa&KEk9r0e6{G)`Y$UD-58Ee&8C9Egcc~>)F!jS17g!HMdCH48hkb0g? zO|c82?|RF&GofDY%(A~^qq58?@CjHI#%%P54#KRUxEb+pHaFmFW2gbsbt!o8 &0 z6lK(B`iW6j$|YwtE-1atg|YB^os8HJd{>HcXdE;jjR&w#@0f8%=`fthnqP$xRAJnr z!YEf^q|^|JB=l#X537S#WXy784DF67LVb-Nj5)7{Lp83DlvpTJ?>c1)uLLZf4pU8& zAwn@O;i*W&RBIFFe8`776tg;g^Z^qswmkMdsEHD2D*`ntm}NEXh?vrDJz|L08kBh$ zwhp}*I%qT$w<&y<>|57T0V89*nJS(UD~9PCtu{v*5vW1M+>zpHe$LUglQH=_9>g3N zlGj%<;!n6ZmPg>zJ-vIZq{eEcM$Q_)Bcl`3h^p8c{1WLXgDBQ430f9xmeU5<;BUZtUrq*Vo56@Ec_ zQaq8w80>=>L@WP_sf7w6RrGnU==X?LwDKm1O0X(yTJYeVkP7ByAH^VkZ2GYRpdal? z)8CH5G_~byG(ARzorwncYjkaBZjIZ6VyFCNaFbD{WUhD8JW*xt9L#=^xf^luR`5{F z|95z8AJy9v%ea36Fj*(Vgb&{G&sIvVS4w8eCFjKsx|}5XPp0PpUq_%8@chF7gd&sK zN$~-7gn0lFzAYiiu+sSBEC>0a%16NFcHS2 zAhfe6T?FTbz+_4`P%=_CmU(tC8WFVwf&~LQKGR7J&n_;2uFF51te!?{QE7?$&xfoS z;%H@v$*SmFo+s9PQZ6|&a4DD*pae#TBV&P4ykaWSxkEzTRg(dknda;x@vKKYF%S+W ztXq)7GKS@nXo*xR|K_utv~Z$;^xOm)2@DbD7=1EZspJ<`jmkmrmXetdK!JDBbCvX` zL!QPf@=+oZa>-f6ixYcq0dX>w179X9=L(4pVl1&?te038N~A;u(=apCTM{1&jE3}a zour$s*OJm0rG@g4A-y}KaGI6~^oNekXEOcX5Sy&Oh{Q02)Pxt>#Qcjz2KnvS=xn8- zH82<}d{`Mk^!zV%ka--XCK_zCrC)#uWTer@><&+(or|%GvZA*#sqS*f75j+kp2DS* zt*lcpXOXHooI2zACm>v>YNAAYwJns6amYSO+d1j9VYo1gWAN1X)9dvTPB!?yp-BG6 zSiSRcJZw}RiC~@LoBwC2sYBk_TjKj8E>3)zR@KL_i?sucDssOyFbHu}jeXEUWy(N% zi!j76Qk(XIB$rLmc8S3}9hHpOo%IurXHf%CVz)h?f4>*hNSh^tR0hN{z5Vm~Wy*%1 z?xYx zoD9eCBc|kAszSY0_W%j6XMESgdRqCf3Jp>s{CIF-_j!B)vU<@+Xb|;Qh5oP=70uSg zTE*a`isn=mgSS%Bci=*qv)~bs^{-K?M`Ev(c6}4}%M}rAzu0fCPs5f_r{%f1ha0?2 zC(p4?C^8JagPPdWfG8AP!$>L2^QE2)S-*#5b^kq+Sq$JYpMuwf6a{;PV&@;oG&WlTwvGq;?R-TzDf&QtM13vY&XzlA09J zNlsB6)jL^M`Lf8FRl%7_U1%X0Ad4$o#e_XWEvh1>SoW9C>>v#_3=Lv6VzA)_y^V-d znPGbN*5R6}o(v5khijt3);KC_?6;K4CI@KJ9ZsDC)Y;28*~DyjNZrw}`m-;mv3eJ2 z;D&tMTZ%@`AGT)oi&RXToS5br6{CPSt)+ib*y$+yQ!JjpN*a|Rw%WF8 zK4QN6EUZn)o{y}DjMDY9VFcbO)_MN{^U3L=4RctCA|Q?&IE@W2!RupC>^ye6-h~Xw?)h5 zPlrdYwwB_m_h$k%gK#6oTXid_Ep)~^`BA+23Pvuu2Aiy35D~Qa085&zePzbQj8@xu zZvEu*GPR--dlt^C4wD*T{9-)JP=ux1V6#<4C2{5mI*yr2V>2|$j)9KfAW!`85-V0_ zCwihRRs;yT_Ccvn>MG!ktWYXlrSy@qAH1FW3+SKobQAG!?-xFS^9?Ech4Tn__X}4L zI1O<`q+x6n!5sm3_Y3zW;N36usj6|vu9ErVd4b=5W4{m$*LICBA7=jiC*#W!Ra|e{ zMPeLv2Oa;)_%e2!m?(B^Bb#EYKi5HJsEbZG(ts+4>u@~fR53zX6O}q!N-!R~=1bCI z=tMCLk2GY2>Q@8778iUB0K{94Qn^fpdRmmwZ3K!LMlF%a*%(Brj-TV&>|{ZtYa}R7qO;U@KNvo$j`@?R9XIs#l)ESi=hsc?iio?Mptgqj3J0PBZtQ(l)~?hc@&QwzuaR zB5m@J=W-=CzsALFgzHj!E}0hcxN))@YsQT_#p6}kOR4;mQu(*vR9OWr(#ok-O?;)3 zZFm^FPqNKbXC1>`i)06>p4`$ael$$V;xn7<60B9ra`h}c*)N4%KkkK&Avn!O-{Y%c za@bskr>Q137MuphHk1;KN9IpTZC}gQGOeMQf47e_abbUrR(9@WwD8GZ;a;}?p_ue1 zX#GRDQ<~%c{#b341&4#FC7!>#3>1b8HN@&y%O&SJTt>#E7fI6rNN)n)2wm9FaFH}3 z^U-_POooFw4-a;hhGMFdx_mCXAFSSBA>3(d8!JZxa&(Xl#o~-*a%NW0A~$AB(PaZv`97S* zLfT9jSo`#@%N(srlChJRDI}Mik+_VE2TQTj(cIZi>@A$IOiWay2&tgWf;^-`#e&Ny zbIHnD$v;m(bxTdzfg5Q9EZT9oBoFaK)<-&vO@d3b@_6X6`=ll&CbouF)KFpVs9rzO z8K~TtOSWqN{B!VCO%^WhkYZawUYd$EP!_%O-x9mI=P}sctBzhe_tf?@)SWSA`}TjP zJ?vbCp9rCdo5L~0R!d2U8Jt;Lljt6N3 zR6NqJKXE+5_{2^}2X$+2#LGeplR%RODgxhVy`cil>o^~BpHY=3Q8DD|<|H}oelxy9 z)k2fu4VkTYb3rRwJ@BrVj`5T9$lF7Ips0CNT6?PXh!#qOk|JrtAA~Lz5hy}>F|cGA zl(h0t3P#Qtn*&<{JxKEn$e-O2T*`Pb&q*&gD&#HN3{z5GBquprEWTg^zG$d4>;Gx| zBQA}YSix803E9py*SYp~u6fS2zjGbLYvT#SoZEnN4LR3Qyf&UNT3yalm$AGcjET;5 zl5?Hx%foY)<)yrBC@;frMnicy?__&6S{?zbO!8V3tZw#pIL>MII50%-@bb=V?}qg5 zF3sLzxyvcSU2>PVbGs*YN}kV2u17H+JJgTrNjqCnJcp4s|I^6Np0vwv%ExZ#$)bIi ztM)hR6Y55zRqA@^SYDIkb*Db%p+5CbSD*OaC#RTr(~t6*G9Jczs96?^ml%;VB^x-n zKt)BREyK*tI7x6;EI)&O(DW2vwKs_&lKl4F$RK7J%d+h$T$rq;xhY>u9~z zAcDh2eIDw6TYQv#RUJk@!E%E740BkrO23uzB<+KewZx37F-%iGk-uz1q>X_7qPE5^ z*n)sLiChcAGqj;#bHT!_*Y-vx_IA&+$%Z;Uq9A?+I`F($_(Maa$u-E091II~>=;wW?e6 zq+Gl%B6`x!Dsi6pdBQ{6Nl)q1rwyFGe!#wF5nuTr*@x%dEtzdPi7RDJC&R466v4|} zcMJS(f!{6gy9Iu?!0#6L-2%T`;CBoBZh_w|@c*|3^z)3Pv4mTS?+m>54bnTfZe%=X z-bb0fIj7?e4+jR#c_ZU{=O(b>6W{yf6`8(*nr?8BMGq_n;f=UveW4k&u#t&(gV0l` zv9ND8u0CA3=I9$~p4YcG(LCOTaMvF@#sB z3QxjeK_{3S9Q(ij4(EMU#{ME7CjF$&ZoyB~-VGxI;>hKke8Z3^^k`+;Y_J!-6 z*ymJx_s!e|R4k+_M}r+{{#3}P1U^^ms&Z1y%;iDk$Q);>wQ?Bb@L&RBGPt!S3vn>9 z|H~s~N-$pg0s?!%kq9_alJLqPzJXaNc0NR#ZLqy z^?3dqtH_mukR(YS{gfhQ+wy~DF8bjHpf*V!c-VGEER+>l(FI=yGb#>aI^%OCXW~Qf zERj548h32ZY?)^jo`(ZTm4)!EU&gC6WQhhIIdC;th?R5JDOE}Pxk)7hQ+(is7w{oV zfT=#-cYVNvFEW=gK$Q2P_gG~%wl_lqf;AJc)s8b-6HGjSyxwQa%h;Tv7L%{ny8>8a zY_fPJ4aHKPDm$`$Mn-`VY?jl%b=WYfJP~2E$}bLQZ#@?T4y<6y7-5`Sa6xkaLGOj|lnPJ4a`k<{*;qZtb@!(75CbG)D1O}*59{~R)Fqn|=1f_`9S};M-{5)U zmk3~6yma!-&@m->SAx3{&RtdLW{5yzDVvmNh%f2IQTdV-aEO5NLB14xsC-XD`ADax zvyUO_Lq!auv*VFsW~FXoN2|hFi#4wz*pT-fg2AVJ*|*{-H06qT5!8hf*1lOzR2Cqmvf0BE%Fkr$@Ky0+3;|!;UBeG1rSU4ZS$WWC^}>%N z>Q;}Np+2iBUvOl?TA)FM{_GKo&GJ#f$AH95z3g9EMb~ybvEizJ_LAVtnbGJeKHphc-U$PZi0o+SxLEcM~aIf8ozX&=2ln;{q zxU#h^OmW8mh$@2Q{MZwUjUy{TD)?H0C%VaWr130jv9Pu82`^&K0G3 zo=Tn1;5V%K{p!e;Y~yzNlOo2mb1WTr{pb2f-5(LB+Yl0S%VTP3K9l>aY3j=f8GMN~ zYRqZL8gl{_$Ne0?rKvF}bL%j?Rhhe|69*}ZN1<8&jXa+VgLvs%+;0zk47u&4?a}vJ zGFuCa{=D(u7O%t5GWuR$HO{ceYdqbRGHLer$D;j1=|nH(yxar%g*sWlmoP?3mX0zi z-;fN#$G@wioC3LDLTHi?58X}YxPNa9WZ*UBedR5oex-DkW6C(M3;~>{&ha58n1Hm{ z=WD2+4|1KvASYtd!$Pza4c-1>oEGL#dKdbw!4I{yhj!#aZK&J5NRI8=!?tH)$iW;wYEbKqU$>&-^_P;p6(8N`Q- z=oiVx$wnsI{g9FUFdWKCmf!_$c*c#R+~BA3Uc8C}MKj{LZKFWS{o+w*+m;y&S=wNG zEF;fQiE_sjxz2M{jum!xZbc;Z2XEy>mslUM0yq>i14oaIDfN&*^3|Erl&^&H2m@a8 zUtiDf99(ODU>$KI62!)iW=*=4)&C6;oO{xFL1$-nQE>hd*iGA%l#{y&0Lff8_0KjG3ZvB6h|VCcZU(WVUq@qKocn?D=o~ z@+-bsiT-6G=pIlDKAx~Uu&Y7GIal(e%Rp@XuLF&6i2VQ0)Bu}kS_wV_=}pr<NSMb=**)V)rh(2)mSA0--j!cL< z`{0D4hHhI^2`9<$Sn*nG%wJdr@^*ztB zZ!#f;_CCP@hcRU#pD&90SM$P&t{$Ju7>BPi5vCeUEm~zJvc-D%dbBH#5@OpgP!*xu z3FT_&20}LyV)H3d7ZaL52ysx*8HCOxBqK7aKaNm

z-wKxiN#j%P(zZ$f(z`cOlD zLfr^`q@j)10r~-1SNpMsmJ?b*=o1aSN9Y4Wi#0Td(CdUg)zCi(%^9ULOz03oPH)&^?M~;N3D7Ti(ylh4p*4i~oyyu38v2;fVnX|CsGiVUgbvWq^Mqy*;^;?; z+=GN3Ce%+uQ9@OO4$)9Cp&JPG)zC$RE+#ZUL#GougOD2K!CuD_I*!mqTIwJ|0|<@N z&~Ai!6S`PKnS}g=#%rkMYCs#&P}NS*&@w{H30lXrhK@6PiQlQVl&x=pTgi zWZk-p(A|X8f-7Qw3!zd%=V_0Z6S|Vn`5GEc=+A^M&`^-j2tw+KO6WSA(2<13YN>q* z^&xbjhI$a%i4ZD)%ArkH0s0wjYAsp^1+6Az5kfnuppOWBLI{11g6as(BZPifK{E-x zKP9jvLp}~ZXAQaQkK7{fJ z-L9b>3FQ!qYpCrCK%2V(x6Iw&)P7QrX=wm`tHS{K-dO~+;=s7~q6Z)Hm9w77} zp}RG78=)wndo*+%p<+V!YG^E>iwNDPp)jG-3Ei)uV+b8fXqtu&BytH(7MY3wR8pakcPe>w2aWh8fqf+4xvXh^eUm*gdWw<*U+VeE+_PahR!B5n$VLPI+0M2&{G;3MCfor|IpChg!U!$w1##d)Pv9r z4gGW(piO>2&uC~Bq1A-`si8%L_?q(CXEjtysE*Kc8hVz{OhPj?G>y>T2|cf&NO!bm zL*HErXnhu-*&6zs&{9G*8fql8fY2Nby+Wv(&}$lcjL;K=Uf0kagr*XDLqmThR6=O3 zh9(li=NNpowHhiS#P3PezNw)T2;oUtUu~U+4kLu;mwmPM8rqA{K7{6Js5_w@3B9GE z)`@`HG6Buk&{u@MCiJ$3nhAYKs6j(>3B5_EQA7VE^co*i_qDG_R>%Rp%V%1sG&m%4I(sHLwgd!3s-!#J8LML&<=$1H1y*HKtE*w z>Z75Rg!mfr+7mRikkBGRCu-;oLY$-37Ha4jLfp2k4Ql8Oo) zghCoRpU@aWCu`^wLL&(suA!p{9Zl#64fQ2-0HGr_v@;=oR-kr>hPI3c#Ql@np&I&@ z(0912JxW7M2z^dyn1>HAE%=c|B;|Epld;uplP6ILA9VopjDusKs(^AqI-h|fldUS4Z0L`Gw4px zp&TJ^t~sDkH8-T3WLUit^?f$dI0ns=uOavpszt~Aig$WAJAY>A?O^? zWuOw!RL~QkYS04EQqX!(mmk{Odx83chJ#K6T?o1!GzIi`&`eMr=p)c-&?Zn1yissp z(BYsUXf)_@5Z{h|7wAdQY|uNPWuO*NCSGm58|Wa=v7pmI7lDdFQP6{+=Rx(Lk3nld zn?X5vlXxEJ2+&EOKY^|Q-3s~}=qXSQ=v~m4pbem`Hmuo#4hH3e_}=Ytpud1j&_kdX zK=VMKfGp6@pq=mn^gf^?K_fta23-j%1>Ft$2WSrHJT?g2dwdJXhGC;|E&)D>&de*hf< zIv(^#(0I^fPz>}4=tae-XlJYk_XQmVIt6q-Xc8y_x)1aW z=nc?9Q1W@qvbCjbO7xcgHkTMzqn*LxE!G^P@PjR->F9U}#G(Y$KG(ijWmNlI*V8rb zAGj-pJo{YkGR-Mt(RfKuxEuV-8pBb9q$ljHp}vHqC+wx6oe4=#xQ~Xmi~%G)VNVTx zOGtXcy*0Fiko1JRYv^r4(i5^@kVw2lNP5CAH1sGT=?Rx==ypQV6E4%xjfA8p{8B>` z2uV-4TtjCPlAbW3p#UN230G)nAR*}q_t(%Kgrp}tKttUKNl(~cLqA*qNP5D48d^a} zdcs3A^Z_C13Hxg3bwbh;4$#mHLedi+sG)laNl$o@hRO*^PdH9PR}+$+@L~;}M`$AM z++~`R2}w_g4qe%PC?V+yFVWEcgrp~=Z^@xtLedjns-a)c2bAmyD|_IMgQ>xMK}3tS z9Ig$))u69IYw-4-)!5@;QE3f+4Q>bF*5Fhf=b1GeV9n`+A0A+ey;SOOM)hkp*hqV} zQCNRa10Jex4bo2zKrS6(|Fcfsty#lC+nh7-Q&seJ>pZo|QipSZI39yHdZIp9kvXMs zhL1PYH`&#Zs9=rV6(~-an!y^pwJsKZBLk;ZiY&8=;;Qxx*MYf|3eQSiS(ogH;#rC88x+5c{N;-OlKdFOFDHMd;uGXYD4sP$ zCW(kYtA>4;!dWNm{T0v3VDGN@e&lyl{3gb~9m6E}Wx2P%S3C>6y+-jY>Gl_jXA!p- zDxPKAeoOHelb@~l@#LRXJd3gYsNz|E?YkAvf@@DvJWH(oSH)jT{%XZvM}C~*uP4t* zBH~$0{#3>Ph5Ye~zk&P_il0pWK*irkeow{UMBY$5Yond1_?yY|+k((vLjGID-$H)5 z;%_C7liQRjCEuv{GV-r0zMT9EijR=zx9cEZLH>TlSCWq@{xC4Y(H zP4ed|zKZ$QSrBvKT7d&@&gplM#$b*@pqEnRq6#oSI{T2TtdAw_jexD-0qvHQTz8#eS z_|xRSSNsg}YZU(s`7adzPx1>D|19~p6#pFg*@~Y@o?Rn!K2QEp#lJxQZpCvQ$eyD3 z7s>xs@h_3TTJbNFAE)?N$e*M5SIM8M_-gXUD}FZlBNSgl{y@dgA-|{MUn6fQ{&n)) z2Sq&JApaA7z|STBt>SCRv*7{$Ci#yPUq`-C@%7}X3^Mb`Goj$$BF{_!Kc74c2>7?j zv+#m%AkT^gp6YB?dhku;FH!sg^5-g^D=PNsihq~Ymw|MV#j|X1s{dCmRBZ2#D7l-TZ+rawn(1|U*5l_ZxHw^| zE|%NqTd4jAigQRZ66)2u*^e4JnvkrUwQA@9 zLb7hgk*s*!m5{8PF`)wa2+6t`Qz+1PX91FRv#uKYoRF-WCGFBkNY>3(YN=NU$-3EB z8hVV7tedUU&>e(i-Rx@({gsfco2}N+L_)G|wnjrmgk;^!($EQnWZlfx&|!pR-HgRU z60{eg)Y(FJLaDQb)-wU6&KABRB(nt$Uqn|kq14&JTtca{g?|!Coh{r?D0Q|_K`3>$ za1Ei<*}?^cQfCXN5=xyd3?q~}Tj)n9b+)hzq14$z`yTqIA-sOPoNMFJa4UA&73K#x(=^Ds z3ewQ+o(nFUUkc55&(jjDL7ag#h08&ephrR9fPMw#V$EQG&`{9Hpz}aigUUhof@XkT z2Ymoq0r~;d4QmE_fChpBpff=eKsSPJ2R#aU3G_B-3FuqU7SPUEGw2IC3UmtSe9$CN z1au$h8PFS`g&>|cuS^@e2 z)D16h-vcxdWP^SLWndjW2lNL}KhR)MKImjn5$HnDm7p6zT#LU8^f2fd(5s+&(EFgz zKwpD4fPMva$69+YP#@4h(9xhE=nT;LAg20j&Ui2igSk zV;z2H(B7bfKtn(UAgPZ~nq7A2(AE0HMeI@J95w{6YhIT)rAn-ukECH>u*| zec#^`XqZ&I(uJqwQ{&a~eSZH+{FC~a?)F|o5m#9+m+uOyk8`QW(7vOPnqT;4ZQ4eC zzN6#&4s-E1y&uENP^?$^WIRV7rS%+B^6SI0bgw@80A>4@Y181@RkMqe?3DDV*x&`= z2vWZxo6lDTTdY4&H|?!oz6gVLj*reqPRW#HihjiRAe|(bwNo7Pccg3F-vg;}auHGO z>Ma&teS<{*0UV8lncg_oIITDm9Y?c3wWtr-Ut<)#RlJ84p_>cX? zlU{j_vvi3HA5mf)P%DZpq*F@1_j?%e{7-PKWBcmsj>y2y`IjdpO6qG{$e+Ellr{v} zXzhtn9?WHFw9#5{qx!~2#r4_tdPw7sWDn$z9G(xa<5z z-;@vzytQMP#RyZ(c_^Ekc>a)8u$9M8gSG47a1dnb4&;!BWet)Ll#{AE%K+lbSV)mk zy~w%`^WMIApt;zJ-WG*RtNbEgZ|j((^KgVlUefL)Y4K~4q|0VWl4|8H=V{z+B}oz) zm~qt>9X(~-M(c!IIwo@JWG9g)EAx%Q`hzD)XbSHbCaFIv>7WuQX;mQ=qr~G&sYMBE zm*HxjlUm}EMzw-v>`=uUX#ENEElU`XBo|eb_6JNN?Crsjyp~m#_;}*aNo`_S*{) zcAkX2UWc7*U-xPBTp1i~wCg7Oze@UO9d#MfIAlxrxZoKLl9@%&@F?tHLMzT<{(JTw(Vquh7Wf_raE@HUU& zuQi?!MUfM=6&ZNEc|k$<`T{=jC*dFr#zw+m;FX&srup-|I>hx&?3n43MPWQ%TSk8c zr3t)&qPkhWKv#gr^9U41#m)K|JIibVIlX7XTT7W709>$yWyW<1Lt-!(uDZcI1tMrL z511)Ac@tKYo#NvfGDAMwq4YCK(0@Q@4Xd6L4Z~aw5`^dH*kmlzXgN*A;}NB0BVPKE zt{9KB6cEO5q##O-?qsM$OO#VG9zGEKx9- z5@~6tPYEtsR*vAb_(xuGCpr-)I%xwcqpS8k?LYE8@jvo?#DC;F^WXQKG-}eIe4y3( zXBT85zEIzmgO8Rs8h7M4MW!lBi$%kYRl!D->o|%>GJn{2@I5B%Rm7$&;}y~#NLxTW zL%tXfpXYmhy3#U`N=iGGLn@T`HY!IUB32K?4pB4iq8cTK#ltN8L1EbUr8;= zs#=LwrNIdR3yO|PrWAvwZHDn7K6i*PCaEyyzr4*b8jyTwhX?;27?4Rjey!Z+*D5{z zm7bfSClt>aFL(ZR7$&i83#zuQ0F5pRbA4e|w!h6T$jbTsvSuA4(qilM)%DS>%EF`oc8NBACAd-sx%G7NhFqlkXbOy-bG=L z<3y9f%D6(Vl8+!e^dMEi<)K*4+$-3K;JcIXa2(do}IU+^z#g3e^O-e~QNNG9J1^G|4Z+eJu6mZo;EGf-%dy>~q=Mwlf- zwww=er)>cR$rijCeYVvH69*LUKQq{}#x{%@tt~ryf@Igy;IGHXG{g2b-sh^24pbqX zlx{dET{fPIOpcFp2iMKPSU8!!s$Q2tuR3F)N3*4HPksNpOhh;z+v$4D$NIzBnU77_ z9jauylN=Al{d`bR><4cR-S7so5!uv;D=Rjy92D@H=Ul0g_k)}(MrU##aIPWe%9>2M z(av?ObDij1Cpp*2>N=&ASNw$T5 ztmU#TF5Bj^+)3acBAM;7xh~t=W%FFNzsquC&CxK-Wdkl7a@kQXJKAN(y6i-ko#e8U zUAEL^qb@tuWv999beEmsva?*a#%1eVw#j9iU3Q7fCS2BX*%p^=b6FqS6URE)E}QGJ z_%x{&z_-XX+uvomH^x8Y&@h(`xNOK}N4e~1mmTY}6J2(a%T9LLQkRXo>{OSX=CadW zc81H&a@iV}t#jEXmu+_0B`%wAS<7WxT(-?+eVIw?WV@=61u32-+46sPdER8fysd3pl zmu+&{W|v*!vI&>9T(-q!+g#R{m5g?_%jUXlZ>*qVwJm6n!b@j+YDqHQ!`GBPK}k@&!3 zYrUzpZQA-sTY=PyPN>a9RESD7)*_>F;Y=@uXt@x3m3;sI+WWj_CZM(V_ucRNU4Bf? zey+Xt+H0@9_S!GcIm>g-@tpHL=R(i9$a6M(&ba4n_ngZ;XNTwP^qgIuv)gkfJ!hZi z?Dw1lo-^$^ZO=LAIfpzacW&?>Wv}Nf^PJ_Lv%+)oaFxzh={cu*&ame+Jm*Z$Im>g- z@tpHL=R(i9$a6M(&ba4n_ngZ;XNTwP^qgIuv)gkfJ!hZi?Dw1lo-^$^ZO=LAIfp!F z0Ve#KP^F%;%yX7|&I->t(Q{UM&Z(X=>^Tk3In#6UxS%e0j^~{3ITw1)MV_T6C1rUyHUTD~J8lH2e=bYs^=XlQfo^zq+T;w^MJ!jl=wtLRyp0mSqc6!b(&)Mxc zlb*BBbM|}A0neHCoVMp2^qfPUv!K+YujefDoaLUACyn_Jl$_`}D?R5_&l&cdhUc8= zIcIs!Ii7RA=UnJH7kSQR&l&fe?VfYF=j`yDou0GHb9Q^qr04AOoc*42z;mWOr|mfh zJ?D_;EZEPbS*hnN^PJ_Lv%+&u^qiHRbE@YIdrrP@$$w}To}JguS)Ox_=bZ037kbV` zp0n9=#yw}d=UnbNJ3MEn=j`&F-JUb)Ir}_kzvmqAoN3Q#d(J`6IpjGDFtyh;F7=#c zp0nI@R(Q^dp0m<(PW7B&&uMthnVxf&=bYm?=X=hDo^z3Q_AY6LtFU(o%>@O$OK6vX zkLDHlkYC35VbcL|M$2wb8*aelaJR?-d^rlBxNr|d@<$fY^GB%|NcOjKolEYtL= zpW-9&oPNuCYcy4g++4bWF~YXFXIGitbKfh=AdVKAMb8CI0b>X?QFZJ0r402M_XqfL zO##l5;mGTS3lsu!#Zg`E{M_aqdS?dj#aDQSj0V(&*YaY$Ko;fT=iQyhK*Z^aWv^G# zzCRK5TJ|6-FfJ;e@pI%;wE&+PiIOkMXWTjR8DAxzBaX)h7nC2ukGp=2vrSilq*s;U zSB_uB4D+gq_*LRJb%uFqc!qhAVVIZBoME0f3(tSffqTATUbN6K&s&5p+e|9sADnUJ zqVvCdGM`%F%;kHR$fnueB|LJ$qSO51pKzNkjvk|>r+^J1oC9jhm41hD zS=5YEON8%L<)flF-Rz>0I6WmRyqsvm=_rVBItn7dISL}2+mMC-;B<6FICpxXR2vBl zq3^*t6;8vdx(wx_zyjzz@O@tSO5sDYGNlN$!+9{AI&--SWrD*!XNBjS;5jFH&Xcqg z6`1LS_BPL=bGq3+2jA&t_k8&@FT@AkXCkbOd*2^1iIvb-lzIIVoq_!k`#P}7m>oaU zi8NB8hrseB<0ZajNX_J>DArw%)Awl$JR_O{Y;222&e7{~=qnF2 zBJQSP6%pIYW3Q;~9?k`9Bg-Q(y9ev@Ve#dA0?}{VaR?fL?pyp}$jB8c{ z!rAhv+TI~Tu0uZKZj;aWdGa~pWPBjxw&1|V4BTs6o4R#50Q28;^ZpKe>dpH*<#SJ$ zd~WZS&#g&(rkgAK!BmVcf@oxLm>YHajjvN00`T2iZdbfW$8);-btshE(k;rgZgD@{H#TVV|;xZ#u zTh8!QZ3REvOMu{ssoF~MrfR41o2m_Kuc5y)PGB@ zQ~PleH5(r-DzLi{j3ti1KW(okiGejXK49~<6r5=6ra-W(Yk9o#F)Q-wvAh&f7UoVy z3a#waY`&lDU-b)IQ;yv_@4%bN+tALZ!5WK>7D>bxTEmUc-jiM2EZ*vU@&nIvg$ixXL6&YA05S#2pp<8t{ zt%aGZ@kbr3J&p;uLrY`AHgq77Wiy}UALjL^qI*|(ET}{F^~V4KjCRgZsQ2JR`@VP zB=bk}@u@R^^cDFmnSaD86xJ zw^77LI%in*9l5HzC9r!zi~9TUbP1s!1E#|s5>4wTsMyFs8zU8)iD-C1S8<{T#6!^w z5#X$eCxKz}vqnDrl3z*mK2ZSoRwhuOe6m6Qb|IwDx}vfR@3tX zX`v}?(n1f>XVs%=B2Lq!B2Q3@&b;W$^oq*#o++8WlbcDP>mo|}e@PL+c_lglmy^+0 z4+V4 zth5@z8v5<0ke8DbJZL`vHm0(uX;YKFSIGaHxKMI3e7Z+KIB+2-vygcccms;sCZDe` zG3|k<7iTR-NA4KK?qeumi;$GebGi@y8U_Dz3jXt0Ky-!`t7*XAf|O1{WFoln*ONlQ z{kGj0w+c`WlZ>$c+N;0JiSYn?GzA{iyHtTTZYkj2>DA*=E9r$ID5P#^0aVXA(6GKy zYM90E7#6B0O;?NOig20mu_)J}TN74AF4SJRQKU3Cy}dcHOI4$hsFK-Tcg`%2HM-KAAlsq_#oqRxBWE=2yEL!yZ2?a`;}-3;Q#oof`64~ z#BiG9P!TSTeQ011gEiC{9dps}mmD10Y+(^zaHT+)zn5l{9L-Z%VzO(o7e%wc` zZ$cE9s*s=wYW_zl7L0q}G0I~#&tG>AzmMB8UM zEfWDMzOG8m^1VSbhTVO1x@0(~8_U#HEis^yO?XJ!j zdl+Irrx5aIGop*iAd#mcM)l`J&0R`2ys}B!;#H2s!J-Vy-G#dcG6ZZtn4JPTY6i1E ziNY{oUlYMu#mLjqrl+x?dK@J>jXK{(D1!D6#VBC2VC)K)Lm8*_KPTc4)aA<##v1Js z^Vh-UuJ^IbfFbky-;-(_Bnrj24e)8sl6+c*<*h*HRha9{MlnDUZz$C}1!B&6gi{tx zP?)E$R%K06W&MnU^@t=x4n=B(z!MHJp833@mmRLt2eHCVN|bQ3D&ZO2wF5P;&Qkz{ zkdu)G4lq$_mR-O$!E{OPo-h)yRAl1I43>D}%apY>Y?~o=9#Miae zmS<(DYny%u&oFQUH%e{>>mvIa?9}e#)^7V*Rtwjj=@FlEaotcguZWGVYR^qll^bc> z$VSlNFGQ%0flhIPf;f;7Q?XdI@bVPZdbVC;x7|Hk6L9!!O~A{2rQWVejjK|N_FgJ@ z^UnYR(B1ZrRRby7J_v|H+fTTlu@_wT{JzW=aD{_rDRg@!4+b(rxD0|=+P$!RU@qK@ zym{7VI2nQjB?=l|94I6tq8Cu`%+ z{Ep(H7VC9HSX-aT2zBxLtuz>JnPI--$Y9h4hG?inb#3)q>)Ni^!i2TWZ(&-SBB$W@ zEGcSVEkciEqXAF0#|P)nJYPEj0!~WJW6yW#Blgc>ri1-c+Y<*VSAjK#DH6%CH`m3X zvwD@FB^XoC0eQF#NV7S}T$q?Oq+!$WFEh{6xPMts!Bf^tzdkV4rq%6PnXJ4YF@ zP3!kv{~OwSj!PU4t~jY0O)W%&r|oS*Ng8mEQguojO3y@%2HiLrjbvp;$cS;1>aoeg zy(ydh1mr~+VMhAx?R>5b{}l+|dJvge_&62mN0mWT7#Kv_;v4M=D>m)6uMsjr zp8D7n2{5f9G0|EJB!M&v@`JW$J6cypVAFmr{Q5Hw!i*2)LtL44m;;bAkX?D@il>55CJ@MR2Og9L^1F>z(5R8zf@fjCw=PL8eX3O zA%;|t0gzy8?E^@k9DCWs4+I}#CWS!;07h7|!`fYij!$#Z4k!S%+RC;F(1_PgLBSJ6 zWCr-jlZWiPDcSOdl#qVj`5U+9(WXIYX6F!zM9m{Vqdk{vM)<%OXJPqJzSGM|i5b?p z75vtyDU8}6OjwXv^+CI_t}76yroB+LT6{ zm9x!UlQz^L%tXxEGPQJ=iVU$j8O$HGyp#DzDQF9t%HpP)lEa+qQ9fncge|^GE*lH=-WC!b0I2sKNaH5#+_KIqBz0h zkKZgd8#h~#&DD{eq1(?R`J{)ziZHi+Gv4Am{k@g3b!pRR_~)PEEbG|b(ozQ_&xd8tVAKLEa4hGCv04Gm;Vd(B2%xp%CAGMG8q7mcw zMsHtxQuY8q(y`^AXKY zf&#bywWN4V524`PCL1I#RIFyBTyU?Q-9Fj*!Qi2l3yXbBL`adLHlw(?r!a056G(4Z zgN@kcLR8zo-k8llExigM8Gh~FbBjl*VVFa(gVNse=kT8z$cNf46of7WLXA0K)m9>z zeT5GVDfQEr$w<9Bg+omEyF zU0YgbLWOeZt@K~E#GnP1O}{NGPMiS4C@*udSK;oSg+J&siE*c(pkc@m+C!UcyY$-- zH8?Mgf)Tk^J~eO2XZ%C*sfr;9aN6@}?!2uZtjGEbG^oMaRQMVyuyETt96M$rgVW80 zP3zee5nKv2gd;V0Vk=2ILXxNVwo{8*~mxIwo#igN`>{`OT#9yZ(%H`mePQ*KB z@=u0^(--Vpa?lFC((j>LnT^}Hl>o06n}boi&}{q*CPbmuuMikZ#N*z0*Blr5t2eGC zEb}}fs9bq?JRB_0!Q*H119$-aw9GXJO`|xogixrLAt;&|#px_(U!lbyo~w&tI&U+o zJJee33m!~`Wq&VfHk!d_6IP<+)>8?R15c-&> zZ=*jr8{2~Wp{$63jZonk))i=`D=M)OYGR$$RDq39;Ja(f&@uZVi2KZjr%|Cgym|l? zyQ|K;_91M5>ZmiDupz3k-7v4fhNvr=>&#`};~-}04LF=Ua!xtgs(%{v>F02V$*8!- z;)w+1D#NEsB|H~A#63vNbT0TP64&mjR{cXNbp<{hI&`9Jd?MTl2yND(VJjh6NHJhS zjf}vY>D!p%@9)uVVN{hoq-P^m!#0w?`r^{iV%@DkXI!0(Kd?yjTaj(^$N-$Hd=8jW zr#~HmwPvz@LGs`kg}v6frMRo0XG-_cAhNU`f1y z7q_EiVrU?bN%UMOd%ivok{2uk9ClIXnP=e(y=R^Yu}Kw(Bgmy9a`pV0a~lrHQM{z- zK5C5@Gg%|{dMjKy&nlf~)^AtdnXr1UL2sB@iYiE0Xw}rh-Sf%0pJhq8l7rGSYrG4sf&wGzUQl1qyZ~7e-7*HE z9*&;vMO673H!HfIcj&a<(Bl1omRxFf0vz3F0U(S%YfY!pXTBU-dGHjNLtjcCwI=!x ztyKgNci;0N|0OUT@pw=aoLj;Q-hN=mTC-nqR*!Y@Sn~yFhu|!%X@M6Tw#}bdf*}oatzCw@fx(9ZHZK#7N7jq`_i(#BSu1sl^oLfJ zR@d9==@m(}0;xi)`po+GG834FP~OIMT__zEp%mJ-sXrcBm*Mk8`{Xx|-bB9oI~AeD zfjNnAvErk0t9~2I(F?BDs8CIS4WwCE;giqTyr1`IxtR;6G zCxZk!2)1Tb;#xxmlS~^ke87ILfNlMf0BiSvf!&e06ive=8}pUniziA@3Yj&h6)Q)f z!~N*N73AR{|Et3dL!c(~XJ>!#r;t^3zw8o%+k|uHKRhqdvW;d%F`{FjO#n#fkJ^q|yNv%_9-vMB>j=O|J zwM7W8sb8{unO^Wao(U5*9gU=1)z9V#0WT8YxVPYA!G6P&0-%?JGxvjdAV9Z}I5m7n z7(Es{&7)0^p@DJ=JtnKr^HiZzRH1*qfn|@oZl8sofI_kV9Gul}7WPJd3k+a<<%Dki z@STf*0V>`ZTG_Zhx}`9>2Z&sT398z#9(}hs1Wxq0@J%VS>Ji*4kEOv&>64v+k^VZ% zVMt8mg`OGS5&@y|TO)yuDON)#ByKSptzm(_RR*#(c7$^O#IeeFc@a#njqA+>?7P@(-4ikU zaY0n7ZbB)u<6A}ub>$TyeN+4b%>AbHGq|9Y7k12ArXI%#0~z zs3{30rPJO%osgT_Ev>2b+V_zKqfMP?Sm>Otz+0d&IY(i#?Hh^;*%-{o#Q-b;43-K8 zIK@%_n3>=XWtJXVS-(E|Mw#4lxCSP5SksB6VXdAcl0tTo+gPvFC`vx;FL;;0a#7q( z@+7J{W(%>VkAUJYoJt9$KoK+pdg89gZ?UyNMj5U=V`d}|ypUoko43$7T5NPRcawuU z{*L&ND*9Me^ty$LI$*MV9Z`gqC16MeVF4xbtYxxOU3AWvAymQu(DF1Ttv-R}u3uot zg4WeIXi_t!nf&I`U1P972@7&7x2dD>0kI%s;HXcBR?aMozF9`KqZON%!0X#E++ib& z{e<*}rnFr|`5=R;+DuI44*Q33@IxF$4`lNJ6Mth|r9OXoYGM56tuE-|vq-w4KX|8@-@1W_oF99JkC-`Xmq~gIJW43_7 z;Cz$?0_qMb1vpej8PEc_)b7(a%Y>h(AM|W3P~0dBMvndzj^lh#!v@ir(B?cEgeIbT zmWpfu7N}99-4@wO$&H;L_Mh;KC@O+kuI%6rsBdRU@}@qkaf2!eIs-)d*65Zpj(EDp z8>Gg4HtioMr%$h!LvWGvRUNQ!qxHLTr#}D>#g$CK33w0ipyd@>mvbZvEXxQk=i9v? zV?VoE^yzXaPELJYdf2ZGu*n1aE1>)&ffcqyIP_p2Fzf#kkG!VVoG=gM8jWE}k5(pz zXwzRHHaJ~V%>lhd7@}(XrP5^I$CTcx|BG%iQ6x`PV>T4=`ebipJ?H?<%4|sDArrIl z383Er8h2u>ehp)F7ijpJqcw0V(7aS+`6pAoksm!P_Q`{NXQM));3u2=&2{H2olX0tIj6<5@cHocLxYd9L6a~ee1$5vw zA>@+9<{Go%2`EgjMc*tHd0k07Ibg<#;u--0^}(VB(Ga(qo-p^A#ivRfbvmd+ktY=S zaSp(0e8Mdi4{w=rJP2i}{S{F;v4)Pp*VA0nNU2O%?wn8R%8IF^f&!0yedtWsW}yy+ znagC1GS@<#rwe+#J5k&Z0KvkA@*J9?Xqm8ESe2x7fKq7tTJKJ>yKB_|%J6DAtmW#& zmiG7BW6=V@)StgymF0h=CyAhde5-Wi!$%!2Z&O>k()LT@pfTfvjF;gN$IBMEsKFiY zuEA0|n93RNj(5j94h`N|w=5nU>r&+MMAc6|FFZd379xywY54Xz)~Pd6G~;kYW+~*t z>1NV?;|6wV%FXYBoDl3HHKEsXO!Nl5{T)>Fpm)7OrCg!X^EE-GfxeLjJs6}^=}?Yu zlSvt^bB#loPmVYc7L!hp3-$%vdvF2}R6L)kIY^bi{BuHzT9m){fe?d8?tFP>u)Uz& zU}g&}Y19(I-qaVg2%LE}i>o?XmHOCUe4;Gi_?_s%y}u`A<$15Vx#)-&@u>}j3?nh3`(DRd>WD< z29%AY7!R5T;*qE9TA&h-JgH@$4@!r>HnG4VVP8>L2ph|WU6Hq-+H#8EG&ctVW<+XUbOcr;i(q^Oi>N~Af&9mt_WnE+{?Vol z1);k+g^V{0XZ#vgBl;nF&n?M?VYXj*VOCv(`}>ln{aSwNzF5{-qIAR>G*#Hu>@ zAofUDE}hM-=yT3GHTW7vKy}T6=*KPFXcWPf%f|ve^qWLUMS3`gm^L3rdu$c{3$adXoSaNWaz34GGjriXi=jbfTv7LLChjyG;M zUy1HG&TP03O&DrD90`TmR^+~@eX<$3JJebl2s>R)jO|1bUb@ekk=sJ8X@6J}*+)U+ z3N3!dA8cb~0+tg_lfCR;Gb7ER)>nLClLz5Z29Qwewf=~AB!W6csMVd<1KG)cmxvn} z5&OB5qb-6Ziu%ELEi4ud8>4HBKp#3Q7Tu3iu!^-ismu^#AJ&A zxi07egj&j|QWaIjoQ@2} zXO4mSMr=JtspMdW(v~-d;Awfc8-GJF$UoHQ*Zm zmBYAd8klY?i#N!^Q+(!FL{SGiADrHwxq_$z*_sYIZkz6Se?rGn8tc3&)o;|(rdFJ> z)C4URg35|4z-)}BcdGy-P|PZ`iMIOf@%qxN9Z``}(R`Pw}^ zV{Y>7(8}V`FoM=2k-A)>@7~?Rbyk9&+QJv6&wX1P*lXLyR^pKp@W-Z>fAF3F{~33; zMJv%OjH7xZn}Blt>(MvfkG?y>X{}9ctxdu>==`kHrem7{NYuhp;2^P(ZBz7(Ta39c z%(G4_n}-2v9<~UFegCFqn4h} zKqf$pfCl_E0B$3y$e9xtAeYU8<6d=@#O^)D+#ytwL9huIPu1kO1pYb`0-@ou7HDQq2t`TAtWk`3{8Qe=H}s3;V> z03k-AhXXxi++NEGp3WyeZQ_^KEMdCx$O=3CG_C z$P5K2Kz&?5y-$y5&XPOj=3ZweW*`@H^XudWLaDu1)@demr3z`L;{;n>kMS%|wHahp zyKr`foR1yT@yIGlz2+OqermE(a_w2Ha4$eOSQ;e*^p%_mfr+s0%oJ6hb0p;>fs~T3 z#;3qjfjzX5utr(s~qP1$T8L$z)D9)Xh0iD;UQ?(gA(D zpl~Rm9*aK?W`W{Wnq6qdOd%5@I}@s2fH%E_dz6IIEOI_B_%lkj1{(fAWHm|-Q4QZI z7i@rD6_QfeN3*=nS2EE_$>KCybcR|@$LHE3HCwz+wrChBcH>d+h!peWujZSRG~e)> z%QsNHbNPmQkoq%MBSYqGRi0)M&Iv)7*TEl|nd)X2GciFLg;P7-C=(Gd`H%3Mu?mSx zWW~KKafeGBjoSWvRL;y;xy1PzT43&$xPuuNlk1`2CqC%*`$@N#wmunwnIqkp(OwJ{ z@rJgmCT5O{CdqUI%0ZM-xTeG*22fbDx7#? z>#9+RFH`Xd^*Ah+G-G8_S5L*10B%o?UR?Lp;B!4`(E^{7EJz@Iqc!f9 zRUC@ZAfzcNx0WKJ$o7try+$Ofx(>#XL)r%rlXOS0rfSv^-OQPN&n*xDvq*!6Q(w z=P(kbjk*2mR)(}l5Y-lHPzw(8dK?2>(gX^MYJT=Dq+D<^}nykVa0mGEV5j`82W}^n`b!dqSbx zKj~Elj5X6~&%xe;5EF)0LWzEwGkr|{XAKPxH{<7gol6&e`=K7^0tw6x?okFB8G7xT zaE%AR4fQrp#1c;-OgBTaUAw`yLqtIBFbbTPQ0JLEKn*Zq+*yI#(VOOjk@|oVA>skn zG6dpd3!r2rSg%qlYndv>WK3w~#j~-2ZNW2@I5&|hKo-d!ZtEgO|1=~ta>YNLS?@ah z2>Ch5{^yZTg((s~O8$e<3jch5?9?t-2!I_TJ0a@9Dxr0vBd2Mewa;D;@rzy6T;^=O zQOa_XVlrnV`J97@Ko)bb-(YbqmkY3r2L8ZLdl1uud>Uf_=CL{&M~ z!)c0AfY=NF{~|9$?#p1n10Jo{P%6cZzlqX*M9@@V8>qj+sXOi{TXI*4_-hX z{M%mPWw;8Gi(gv+UO*mPG$Oo80+RI#lS{|kk;AnM=m%rsnEZH`t+o>qJm|0=j@Z3dl%+MG9-B8VOb^9ikUw1b)~lhPFn*+4)no z*piFAIyhLF8(C-8&ex&jJe1t2(_-I7UE5eJg=WL6i<`|}K_4PlmzT?@>fkn=*|j*t zRu`W>8_MuNhU%M;FWQT-B7p-232ZG&*>xp_-qPY0ftB4kQemkoR=CI>L1oJ{P*Jxh zB90YBN^@Lb2Nh-_M+4;=)axa^rjxH*_m!cGHvSIaxXO9Z# z#W)3MjHY!|c2OzjIc9|7d^LmKH(HJ4-g&u&+5BsN{EuK)E>$L~;;)S=u!`>i*Me($ z?6J}Gk>;AH{V5oI2Y6y^2`8uQ@TJ0W1BPQ9Q`laDU?nxc^n>>PSd_@b!CtFK zwBv&T=zhJJb3KAuFnN?orC=_nagr=U88dS)X8;tFxM5##iw6_ zW!=M7-bB^)POdFG0vImgo{ztc4upN{P}KF+VA!J!`(rR{5)jI~3kLQzhrs*yVAwG% zVsi__)mmQL)eoLeA30GElz@E3N?*!BQ|!I*zax6 zro~#YQ-+U?1T&taGR|-^{vjvh9n6@*>^hk7iz?&Cos4Zc8D}vg4W+@1-%uIcu%3k7ULMWc1PYS8M|lRrZB#Wmsb{?3lw4_N8FhRSc^ShE2k@7g=KnBKIJ82z0D* zkbCTJ*>qft6dA5KNvA$Anhw$Qy+0P5`fx#=+o=x&`VjklS)KY8WCZ+;=jqB{0{EFv zfjtoTLnrVo1p2C3#uCp}8Gr7iIgE&jV!}c4h|%rPp7=_DE2h9u~BzcTU9#=`GI7yZ=iNlWe9Zd3lmE_}2 zl53a*)l>yNNpvZ2+$|d0s>1q$g}Wea2v3Ps08y>pbR#8W(9AAjW+WVs^nHnQhx#j&v2`IF!&+{ z|1>8!&fwb_>{MKUyg=Ch0B*tH6N$-NIl+Ht>gRHTKf~Y^Il<#uxi}tk{mO@p4Y^y>BD!8Qhr@d>Dgq@2j7YaSuj82Dd`0<~%f-F4C(; z^_^zqLANW~rq@&LXfHxBtLpiM+wGbgH;Upg_|q2O^+Ayl3WxJi|I zIJOJ0RM-sbmvak=GYW4f5DQyzgG>ZmJSO@?8A^MCEP;3n%! zzjN{XB7WE5w-~>B@cSixPvW;5ze)^ySL62pek<`?i{I<`y@TIq4A#5xeGk6_;jY4O z7JlEw?|%Gx@Y{^v7)%>Z#P1CJF2wJv_9Jny8yp0 z<98!|?fCs1zbEzY5BLt?w-LVyFxOY($A#Cc@oUC!ul7ip;n`pMJ(LOdSdk{MQzwsMX;13*C+(k>IM4SU_0~ zJmv8xrs8rCqK*$nJ-GGUyz*902zh!=rzF2lDvbQl( zrbCQG;@X9~BD=BhD;VX>Ali)CayiFr*-{s@pQ-(5EK}Q_dm~$g>tSfNAOD@EBp+Hx zJnn0zZt3X=eFdRrWCQEZLnO`M z@IE%7ecLKDZBMl4KX7vf)H1m@;{pypC<{&ZbTs*l>;ZftwD>fCuzjZ7rBUGzOa4HT zK8BO|f#B~;a93#YI~3g-aLM(0oiOrHXz{E5h-;jP&d}ndFJkgf(Uu(lTJcVc3uiL7 zh?tR%Q0v{k(2@%wqommTLW{raipi`2`aLeGF8-rGZn6`% zNaB9skE7^kRbw|uT*4POc@s;LD>y=}H~1sU&_ZU6qz<)S?vJREi1`w6wm%{)5nqvr z6Z{bk62Wa_p;j*2xz(H{5wj&?H^}Zr+#?aQB;s{{#Jv*1jbx$LKl&pckqGX43bj7u zkNCAj%#et?{1MMdgdq_(`6Jd#M4d!@$sh6W62aX!p;k<5JaqX^r{1d5dWtWiWC#PZ zP<|>iE&jMKZt?+8Q_Yy#RYN7#t^6#BsFY&f@JC!O5hqCmM?W`5vqW&4hI-|}jfhIb z1c|uEm!sqi2Qk?sviK%{+-XkS;mo)AN`G9D#EsUQL>8azkF%hyNM&V{$l~Mtad9V3 zHeB%4UWI)IYBq&;pKpNWfVw`^!TakhYp%u!Et8AfuL#Dg=rm@S%nXUDyCh2ZPt!>y^g`BvG-H?p83a`f z@uH0_;Gsy$};njy!0diyEzF{kOrrll#4^9LB z(+I_DD>AYh*z1@egDpiEvuOgp{Y6!2$8Oy+^*+Y7F3b-8kpy2B4A#Kf;>~%(JylFr zCKWkymY)0LMny)`eyC0O$tOs35&w5Up;ly*kHitBxs}OL2bCC*(wvbEyX_+dO||W$=+8jeU0@5$7cgyVde47flUi>pJ`LT>n?pdX4D~MN4iT=g z$ySy}UnLoQ>wB1g>oT(Dixn{EKl$kq;Bk#j;9ZpkFSJ*9H)g|AKn@ik&i)!u*~9Ot z(R;&h|NQXQ4zQ9AyukYV^&`TQ^*e9l58K49eMlx=X<&r;G43CAkFt#gQ6=<#gc4!Q z5ZNh0t1c?TiM&Gi5mvOMoas0TR^3*KEiU?EU9|wZKUI53RLp&Oz{{PR;pV?lp;)Ej z*`bz2r3)ZTLamBBA`CbTV}ZID0NDmGcq`$V3*^&TKw?Mh00{g^z%KgkypiCbm_wx) zXN*9=*NI5%V+w}9Tse1_(1X#VQ(Sq^x%l)~AiZmu2dTXA+6<;ThN<*;-5882WfbyD zvj)WfY>tUJGSQPU+44VYClzIMZgyM_GFznf{{uo&n*SpVbNdi#B#t}1b@;#&?QvtY zYL}e*-YGvmQJEz_RDVD5Pm1VjKONRuz5Y)7UVeF$)jw^h4o^eXw>NGeFn7O27_f_jlm`= z!Kxa?8Q5HW{!tl%^zqh*f;Kt}T5;y{9|79_S@i$TRs7`LbgtcXbF%tsK zL!6l3Atq-(IXG9K&kuxs@*NeE`9oocFj89kDcHCFn*;^* zblNfcg!^2pTh3%To8z(++5cH``Jb)E|2JEFA?)hV(pZv{t2kP3CP$JhQBL85%O=wXPJ4QswC&%nfl=LZ4G74xrGRb#s?fq+TEw=D zS-5Z8ioi4$yzkj;+G#cIm2{Dl>b`C|3l?pmH!8he}VG<#PMIQ{Es;P3zUDg@@wImFypM(j!qH(>fA z!FbB9$4O;D9DD8IgnQgkk_^WiFoD9hAzq|~QdGrs6%?+xY$@1(qwf0=yeGsquqP_o zw5>Q4yHb^s20W4pKj2)_F_rB`U$_+Bdp$42X33qNw;W!}^H#vy3a>-Y8l_ZGKxA== z$PX?z^5S1*FnSKFTA|icfshOjR^+*;UBZp9t!D(nMw_^uwYAv^lf8=u_DOLk6Rrd_ z<~yZ7g(Q$#X}o8YB*#FWw!|3*_bzckVxJ@dydySl!YP~iKQ3X=A;@p!ulN$i30e;D zFEffa?}b_?N-ANdwA>QbuJTL7k*#$yi9Lek`E z%2Kc%2C<+##n?3nyauf?ytnUN$kZ_i0$=!K>KvBfm#L8P!x^rFflN3;T$>H zH%fLu!ci>u7l?yX6Nwt99PZU&Jf=T<#UEBePQ9jolv$2@Gu+s54jHE3-)PxZNlTAa za$N5yeAq8A7_3f1>=@<>Zll9>I{orV^x-qZj3woh=w@Ilwh-&?z@Z=&`-*lUaHi)p z-1vjxDn&}%$*I7{x(Fh=njiGkGRCE1HhuV)d2NiOWh@@8VGwfC7oCdK%F-_WRQM}8 zR^b~fM@dLad=1=3p?v+yR{@`uATF>=T%8;wSTjZ}L4;bIl)&Y+^r8EkQV$>~)d|Hu z<)HwCC{F$8o}|!aTI8I?Pjod4#SMpd(E62F-Hbpxb_a`+N`ufH#L8N&P+h%T`J|G! zaPm`uLb`{L8<*aV|H)~Boq#r%Q1)oKs7g!8swYBGRDwm#NW^X?8o2z3A2Zf2;1yl0 zW#Ti>E=4?@z2T!tVC6j9p)~|eIq;JPvlKsA!Vfbn#Shl9E@ZB^K36frJb1!zKl*a) zJQTM}{-Pfz1)ovG*+uw)I9UNGKU)0Ee7t8AvnWYL6og!aY1}_fqZaN zQi3jsS4B%Bv4UXTOw;kwlyJm!Yi1c!2^oyUGL=fvT!GdJ>#gui)P#IvKLj$@g;p&i z&FV0OnTb-kG7pHTRE#GJ>r~djE0aIX)<_6xEjf&?hcrpLtC<1~)fZ!g!b(dr@LhGR zA0>uvMTvToyh>q2yD65?@KO9lYbatgD_OO=oMf<8RLDojZ%j%|6rZ#Lj?#B9pSf%Z zyINoo0e*A|FIP&sn0x}|@5E3FR%HbGm7pY>yOecbQ1CFvjXDYr>#YVjpegLDX(8`U zNve4~r6;_H%P!E$x>F<%LLH>1TFV5OJB|u5duz#u+DSfCBu=%E;rS0CDx0(q*m@9E zv_$;ythqRlW+CyEJKMB#H3b(sqq4Dy;6g(%P}llDIO<9E>KFw?D0VYKx=9fwF>uS3 z8QX@^%)TivS_!&#zimodOa9{4#jAITNGV!DAp#L9AFFD2rS#pI2n6ftxHJH$H%{o{ z{iL|kNYGx*4_f1CsjrXuzM}#N$B{Cr*nB2d5p<$ftb8aMk+71el%0=LCAHkeA~2jL zD$!DrZJhZz_(uj<@ccBd7F3U7-5{P;bKoPh<`Ik^Cx78mCSs;Vs--0B)zUIj7+$?p zLem>ZGHRx$xWhzPKDEhDsJWC+SfcL>0n3`d*fi=IVR<@L?U}8N;bvjeVc=&9#lr`>G*sRKDi#Q9J z2Duv>KyT3cfF&MWRzfx9ia&@92;P4?v%3uC*Fx54y8#qwQMhn9>45XDb7)mY4yo1Dk9&j%@dlPr zHe+tjjKUOdEL=y|32ThPSLlJrHJiG5X|vVXEy&Kp`zrv^FgUNyJRd@kw-ZOY>>ap& zO)UQ0@4!%dBSPR9H1V*zT-7V)XPF9djYOT9hTaJM6Po8t_dSEkk?S4I#|Ia9RkU3M z4N%RS@}Ez4=&0WV0y%8lO*a^dep+xX`SeL-H(0u^Zm?D7#eBy<0wTS-;K|NB1?ho~ zQs88fS)c6PaqPnt-Gsr$P^vS&Akq5a@sD8_256;kP>z*L;gPf}Vf3@ZEjm0ZgY%{E zxeC)a34sPMr7cNCqN-U!v5AteWS*qqWK+#YbKoC^bQ#r3z{OLtG>;>UDl=>eAStJJ z!S!Lh|A6rW6zF}NOwI~@5d9jRLsTwPiP-3BN?J&&u|TFbwu7EbJMCRs5mKU9tI77! zOF(p22V5z=OaU@u9m=OhY@icct^zm?!q*;*wnRxY%=1Rp5@ihVYl+K5D)Ut@HF2;G z(z;?jUq@NS^g(s;7Rbt7G5&?V#DNU88bm7lAHNlKQB}aNE~+v`T~y8$MBh~xMe51x z19at47gZ)v7wH^9UG#y*m`$HgT|{N3FcY@EyZE(21fl>Coa- zQSLv{Y>#)FTbZu-T?sE83%1l ziDJuC3Z>Ss~8atWW9bf$j zV(*?h8kbWeZ1z`x*_K(VCF-A09LiTsC85$T8K|{Oi5EGoTVe{RE+9PxlWDYqshpx< zs&We|FD4@+WLqjb>2 zntR_C1R>v~#aJM+P}wrH1WLnTRS7}BdB5{ak6c*@36#cUt&-VbsGzFh7farK1{D;v zdxg*G^+@oi{tMuT_X0n>Pxu_~K$u1wx7};gw>Fd%WPU}e(DX*L7KS?+6Xb$G`XC-L zM;DWNMvoe{*b?-T0u#_i48w|hyB|g$XTb2Ka>1Ob3begd$)hnc!YjjJ+r=mH-A^-x z8->@HjT`FBUYzH$X~mKy1mAV?Fk-U()%m(XT*D0|CKcI?lrY3?#?^&8ruBsqQ&e$- zd@LR}6_-{w*uGT+PS|8r;+8JVgzz*x*D+Wfr=*tN;rsqXE z!QSb4f|JS;s-x8$(zY36VImH#eB0iD9r$_3=jaoa|FijHT!250%EupnhmgusL6Hw0 z?>nz)1y+C1+{2lw;(Wb8P3PTS0DGq-E>($D!}-#%BRFX`Q`2BmxP8HwkbS{P_mb&?&{K=lH7NJg6^dVc0taECl%=@II(-XoeS&yGpF^3 zqUWiC96r%ITqknlk@MQCWsI#xhlx>6;7q6VjSae|^oy@Q^KYcwe`2aSQemf$Tv(}7 z7`9IJTSoZ@D=fa3!e+CubMw}$GEf*E*WE|Ou+?HXbNF7$svNm2w_@e2*as}D3o6J+ zM4UEqSz}ebdfqJl5M|*yfDy}@y3eu}yg2qllr@0n7^z;Tja-(dVb7Z-AEK;l_EOef z+N=1Vp&^Q5uTYB`Se3t%f&sq)h@orntAo7l!jFgU;`jyDKRtPbC619r()JG{l6pRX zNcxdZvrmz9gG%^8MG_AX8~!_8@`$9PkY*%C5Rs(U?mo0gLMv3`p5ho~FN7VRVP669 zmnEs#2AO;IA{Iqb<;TJ8&?8E!JUC1l0SCM*Ga?;CfL(!l$hZ-_#&ur;EDs8gKz?PB z!6X@$?n|!aN5Lh-NOCO?3Ow|d4~4ONK|#b_eiZg8?((3}32B!P1#@3gaIYwgECutR zaO?;u;Of2+c|n9@eiZg89P^;?0Jth26`}|qsauN7%#Xr8Wo8}}jvN661Oo+8tYouI z`>U`JTmk=AAV=T8cPqYMhb;XYehb0C{w+{?{x=hQa`?IvCIDvrW*RZIJy51((5RqB zDXS$WI+)oufbtANM@!-h{*s)=TyYvT+hHaMMUU}u5!jkzl%pk>Q2=!JJ)C28hHRrH6T3Y$!oeD;UV+u`P=xV2*R%ZpY$ z>EZ*VT~+I<7+hOt%>>?|J*JS}pyfTjfNcCHVw zG5=j}{~E&pLm^_YID}cS+|tP(ViS8_i7QzXFVgf1-l-eOt1fo&6Wp< zWI)C>{{w-zjd&wJVJ#hn<0FyJUaaaC$Q~?(n_>#BTGytm`8miB%e;S1DMpD$jp%1qM zVTrErABc*>KY$_L@i)(Kti@QS17W%#`#^?*OgRP?3b;M!1B9~8w75IjwIXO9YQi!stYLakQWNOI?` znZ7nG97ekEDrQmRgT~x-@w-dMK24T+P>dH3X0W9Q+Xf$WP`$Q@xbU(Wj0};7@G|c~ zp(RJs2mGx_$E3(ZIPt`5W~|6V0^*^}O8_C!jUD!H5F-V~CxEWi^$&(_CvT%XFiw}* z!cfK=bDPB(9U2u{qU|tUDG6iQuv*@QdmhsJ;h91{^_W(9nmWR5k4=>d)ZdLOR3L2e zF!LH7SgQ40THv2Y2ufZ2ox3D^KNm=8-vU+7eXHIhR%IT z;j^R2*l#GlCO0p3$K9nLtpRF1GP2DB08k5mNsemV7nrCcOsZPdco{PKDf&Riwi!}5 z6foyuw}H4mG5TMquXI?Cpj{wn7Mpl9#l?iWNOFl3yF8w_8CgP!93EkCTa15Q9wED_ z*1FH$4EBT@`~vkwUiaz?tvthQ?6ev?@z9zk`hD@+gyyKoePD=|mvv(1Q1K6`J*+>he(HG9S{X0BNi7 zJ~XT`caPDsRYui4X5)Qe@|?g9tMNfxa&6-89_)?ca*|W@7!;kk%PCR%z|vX_3(=;# z3q!ZhM#_)cv=xBiR7dv}Hmw8+k5I0QoY07&UpOL!;@%qf?0s3o5jB5zIHCu`5ye>E z{S6h4JzMPo_}9NDJ7t%MPcXGsbVWl?MRo!s4mH^PAKB@smeLofD9^3m+1n~&s6w6H zF(W%OFQP8UScsujWhwwOhn5^gKsr;ZHC`NsA4$A?>s3AkJNXbDie}|2ZOxZYExQNT zw|H3~b}vu}fl-ExmK4Q}pj3!`x!7QU)w0maN<0=>LS)TeSrB8jns%m&yNR7b7~a-y z2Vn*&@kUIeeAxN6FG(3fkZs0XRXL-E079+WN={;Jv+kC9<577Txlwn>Qp7ZDGh6Rq z0oZS?Lv|vBb859D|#d;Y> z2*;A12D*45=-^U9$5LVuCZluLg;qW$t$o5fn3&3&a_GSY8DgP($Ds6%!OXAFm|TNH z^{Qp42;I(gD~*cTLbkXzxxl;AQ>Y7}x2L z+>KE!AV(a~UP65=v(6p+YYi)xkA;lQo;kO5iI7Gyol;izhgfv#oyC~^2P1gNT^@`17D%1PLw1^L_Ja1GqEf1eLPl3bi zA^(E{pslK`I$o7;v}Z$>GV8Q%4sS>}sAhS~f`E02V3~Jo**16TNt@@t9VxVB+z2(K{pl9ig zahyA$5WK`(-Bt$Kg#k--yMDupmm+{C?_b8;Rg%vv)SST@>uC6V04je?%hBcLgzg52tRUxXfbMRg|n*M_OkdB56ByiHvX&Jbk z&`W!*N{e$va%j#;i{mEsa;9a{`K2ayJkkWkdFJ`0RNEMUc>=Pk0w*dUxWf-8?DU2r z?%Bihgw_-iaf*EW8}T>&4r zSNdmw3IL6Q(e8fY5o%>y1%R(8(!j;)m8el=`@`#)fl`q!U_yVV z{&w)|;CtopC`BY`!$i$*6_Ku4OGL+S+RD$kU(n|gDTr^lY=%N;21baBfRJo|ZRq1M zsoZL$BFhB}E3(`nrFDm@P9v&w@HVulI8c%&G45Qe#2G@~P^b*mkgZd-TTB z(8;fMYUNZdx<^+nj2N_kv2Ooo=o??Gs- z_&UkL>MWzO&g{d+V)9?THI_C_gw8_fz;vr_P1vxmfd4SVES^wj&Yn;Hu>us zo&L_T!)l@$4U`vBbmBX++$MN2r6rNVE5}HblskB9^8VsKh;Y?$3h#S2(>HD|eF7_7 zik*^vw^5i=1#By34Z+yeC{4YSKr3!zr*Q&yT`!xDNYK2?C{j+GVjtunx@?X_sLv$C zo6BaYq;VY0F($1LA2x0aq_?Gcmd%tDX!S|;-9}MDV4Dd8p-#)3{$ILf3=jdV{vQ}P zQNy}ke#WnQi=S~V@L>xzv!i8Hu`%KUwk5E=FjFeV^$t=PCz7T*PSr7ul8F$uv^KTF zx{Gy=O2n(yUB;wF^)iOU6CcChP*f&<(bWPEZG75rJjRGN`RlgwH(68wzO_Ptp_m(4 zjD`Q29=FmC0> zG6%D4S-(t@n)^d|ip#pO!v1cgKpw(7Trd;2uZv!eNL2FHC)!pYgwXgP(DY^jSg>&=G)f z=#)I46=D?T1kD_k6Ev$R7!+DL3)f6#fm&FS6SQb_PSBh&br_jMLPAQG)tNU;D6ccW zH=&}={K|xhx!o|K$Q0ldu*kVnp`OHsVY*RNaavFKL=&oJDyRp-9Qg+!%$;dZxtN2M zGLdJS`_Dl%2FUKdI*aIwFwijrc?HSP)<6oEU zzs`bu&~eO`pisyL@Q*M(=B6-X$0m%J@|QX#&YUB!s)i-FYj!8d%;%gqO^uSj@6v2@ z8X+fY>bLS!Rk((q@i%PZXWVD$i>`KRF`*D#lgw=uCq?W!z_Kqp1DO;yZr(sc3~eFs zs(X6)8NVNjazMUK2Q{RdYq+nHPo-N(rZHQd6!l|7ubQHUPCg7gv%? z%@LMoCh@EtR2BQWN(YEcXJrb}pXu3&$`(3@L8!A|UOT(?%G#^E`_pF1T#Cj%v#HA= zXcC9EMISgBxPfI3eUqQ6bx#RewLl95J%C7JnQkxo`yjGY1y<556-kR9Cr(C%qUSIw zfrW0d7EtqfqG$eSaMerKAi~5fN?pi=AxPaT<&ZC}YoE^i21M)lI8)(6?!<<2c0CSsD;QTP#0g`Y=A`;7&S zec0UyRRDuQR)T4&o}BP6XkaRwHsygLl)Ipw{yscjK2c~846Dc!R-PxUOozdsEiK%a z`7BvXZKdkhNVCEeEZ;@rd9#ySk3j1S37tlM?H%37pbZ;&W}2U>%xZqd&wh=camPI= zx@nTIG2s|#qSmbu>kd%z#{{fu+AX!W!ex@coqHfX<{swROvKOU?Bn5v$&KLg;YGpQR36XzZNI`*Y1z zxqhW`eQM-fng#b0+F(c74eYu2x#eG=Abm+e+VH9?1Auy0uT1q}E7?@2xn2Vrv=^Mj zrw%sxrtSIdC)(!ftiUzznA+Glr5xCsr-8^SRT>r?LPoozY2+vn?KCi<03GPz zKXYi)(zH_+zM@N|MBG+tuv;e}{!aO{(#5{)q;;^|wL@chyuxz4!m?Ol`JDm5vKBtr z<8m=nt0^}6eYe@#Mrz246oO^*L@C#9ZdIcMJZ!{}k_Tw*HQlAQ4j-P)p4r5|L$s0c_nj z?acMCWjbS*+BQjc&anqpV2aiY8a~WkLsKTtHCju7CB5LI_4d*2doVKds26S6-HfuY zY}q3RV2vG1oAdr%*~6F^|RHq6CwiF=$$>`!Po zt!KignXcwE)r0>HQW2mJdf9DOKL+pNu|TnXjvj-YA4A#x*w+z@O9Iv*e~8e0sDFNG zZgrL-xlECDb%qbxM|EDm!>vv;FgGk!o%1xDKy^AqfvW0XCDl0xvk%Rseyk=t)j0!W zc*ai+Q)RzHWiQU3efuq%8oZ52=&0NECg%3q#BR8qh*LncbO_?oRQB!2FRKIok}pst ze^Qm)wjnR#H#jBVjFNSsQ?m+9C)`3ieT5#9uh9Kep%1JSYK_ld=Xwp~c<4t*L`ejw5tzF z_T;Z(#MrA~I#@b{2&R6i$Kz>y>?RE-(35}m7h#jpsvbAKke7IKkyD6wE%boQr2r=V zQ46<{2W>qd=%MTu1@kw*71|sNm>BnWz?UU$$mg&4%zagS2RTiRUdw$IpQYghD!xcz z{>HDR;+L$?Tk+32m>U2WsQA}Z_6Jn<@%gh4->56TAG70^z52(iPV$fU?tC@+lq@sC zZ@W+QV2tl(s7;XIH{PfssT{9s(yV6)_9#h0%palmp5i9*>AizW?@iecsaQ-)W%4kX z>E+Z*@1Uu3*Y_(t{LU&+xLxfpN-YoK#v81_M~`(%v`W!B&|5z9g1vKsVD6Rkj7;&U zzQ8D@7LQfUkePJ|m+5b*d^JV|dcVX+#^+!NGL-i(!H4UITs@o!b_Z?JTtUVv1vG#3 zNoPLpn9?yVua4lH@@CY_uu5ic#x_T{`Svi7OK;A48@JOI$wu-n%o~!pi0y7B(aUdQ zzQc|D#qq>dAg8-ix*J6#L(8yJn!#-`{&j73$E$fz7kXnS4tdN$ob{N@0`LZ|RgBh% zbfBzG=;P2ZSQdv&5=()N-X}h>#0Tb5ox)SN!im%LOQd=<{&j?6mmr692l-K|0Dd2UnRbAE%0HMg@vQ~jvT2gcXBIm{;BU5P@4?j?1cG>H5(bh-$Fm7 zfszQeKA4T*vNtt?-$IOo#J*tSnoru>W~j9e`(l=ms5x5IZ9WVzsM~8?{7j7dDScd> zRXK1C8j;27SWZPj_avI6JCj4iw{hX1n6oCaK@v4_0bMnWE{%e|sS5fG3Uctzf$g=4 zL&;7p2Rbtya!kZ&^Fttgz^#vK)ou`oxACx1vv8~s#FHPp5uk?PG* z3c*e7z!nKqI&BZVmEcX75V@emUH;Jvnb?wjRYCY7++iISoqWg7nvdv60?RdwZ! z-vCiS5bgaGCQX8F?qV350`>nP2Ip^LafSvdG|KI0*ULVOl zXYaMvUVH7e*Is+=kAsv;VyiEiAIlm+xKcutZWM`}=tHIPy>Z3tw<`Fr!$x{*r9T)H zyOyS}U2W5{N}Qe&v`u)!>B6=Lhp#zgIkIe$qNVCPj6Z=D8@rsK>yusUrr~?NmyJVb zf|Hn!tRNkE2SpqJ;v)jdQYFyAWs35V*)jN;=p^zp=*YX$;bVZ#B&SC{Jv#=SNsffA zgZ#`OU8Tdv0G({7=RBm0C7*035g}ecKJu<~_!yvrkI=q<96HB2iD?;h1T{^VUKZ#f6?R^o~xl(-4DV~M+&%^<5k z?w2S@Sp;&wL}AEMkh_ER(G?+g7kQF}A*W=lbs@Fw?}I8n2IGa2vnM`@uIA<^e}9Ep zCjJ{TgjM+ih&O(1G}yST1^ zy3Q1wf%a$F--$&$_FxIkB4ZLy8H9tUQ19?XwmB}C=zEr(zmlP-tsM&3NAO!l%tZK|S$ zrm0F%c3M+i`C@ugeg7wHoPs6aHZrM%%zEEyGr--HV)lwiNGVH(!)_FA%&H{lbA?l1l4v z@~l7eRKjzRXHok10>&&~?+wjy1l#Eyg9o^B`%&@`p1^*o{^G;WnmPyXkFoQO zY3Nraz5RB|;Vga5DdSb*QQZ06I(#tt4C*esP{Q5fBC0Q8B_QV%*to8EA5JGLzPD4v z12?T7Z>YMuAKnCo*D|1M_p#03sP%=rz6=?rgK=v)w zt_NIibcAn{!gtIB917YdBS+CRSbZIXYzj#0I1p7pqGgBIU*x|XAHL(fG$J!b5y`hi z00&pqY|`pJ^Ei2vK^kB8mACc|bdE`UbfdkzRtncY{25vlu)c}xU;o0G^vg*vQFxuI z=?td#$oJ#wuGW>#B4xiv@HC1^)rdv`A zGxL&DpjR-@j<98DCOQ=nI29{oB*tcI*?yJ$vs_{+?rUt~WZd`X45??ajBwTo?(Ju- zxHlK~(MyKxR)clx#U-O?BJo@G=FJ(%$IY8g&k{Uz?c!g|Xg@TG1cY<#AG_#=TBAeF zDVhwPrXkT@U(2*ylLk(hg#j0-*G~f_@nZe`{>9iUQ`|9fxVU3DtE9JQG3kg<64?u% zGflIOl}HpmkIKM$lz)Xkc|U%HKRF4!ZHzvn8&x(6zC3fQCdC~M?>yZ+7Ke9!Jj+jR zn&3a*HnGHc|9RZDN%s@Gl0I|Zv{B>tL7@&y_y?E~WBcblQQU{FmnP%RS3@Ik`&bK^ z#{DC}({!%(=jqPP_oONXw|-eF_S(Nm#U8-hC>H#N9W;e%qv)<^XV+xZIIV5i4s;rW zZNv6r8i?tS*`dfLTEr$I6_{4!=iP`8_inxl#F0$>#bCpt!aFaX9NxK$8JE5j?ruUMX)1M^Wp5FAN)(=}l{!x= z^@WF+m{Wl_Gz#e%>M&(|yE44+( zUJ_wM)cZ$xgQea&s^WbSV9^cSOv*9$NByMYwj=Nt-5TqBJfCBpBRdQAyAKh7(X`{p zefxbd>VMEdhS;5bgns7jKR~PK(?Xtp^3zQ2xdYHRy`9fOACD!<`uk#h9O#>mA1sRt zJ6Idd*$RGFbLiGmTVK*a2wb{qijW7SV`%nGrYt_ zcAE&5Axq^lp@IRk33V|k*!O7{VLo;>l;$M`@)>MuW85IpI z`0W?SO5QRqvMMdabO>%#a&Ppptkgb)Hv~_SM^F2+fzUS@)St$RzexxoRpfg`N_1POahEPK130UFE)*nIwI*Tj^_Rssf8Gh_s(SBEY# z8KCOX@o98rwg)Qn-?DsO@ZX!IGL2ZRO{STb zPeP7-A6@i?fueV5(d)J7KVy9~t!NRq=+~!oz|99mpkv_J#Yc3a*Z8KLh$(5E2;|1d z3v{A;05Dc3BBjhuq-nMjrS+gRH3{~h^R#+jM`uM3It~1w2a%A8iU!q%``FTYkW@!U zG(M)-kf{$@D2x|>h1$gu1yQBm$2C?}4!4&!H*Lh29l(28@p2Te19)!PeLgFp6bu)Z zU?0N)%*SGGP8+UN)BUdeWQy*$x7W)bhU;Q?6mu{%w~E;F*+mZ_4GPW;#RwEI=z<7? zxoaFl7KV0^<{qtR5~`G3)Y-35Fs=lmUoRa(heRg6?MNrOdkWxr;rJjg9DfM?3)tK$ zxXCBfnofvk;LxR`gV4it5)(**H9aZ`gcV2vVTBA5lR$z&2#NEIimxn2z^M(yBM3=M zD{*guq0`IoahVrJE}WK)qIzY6CC)8-N}Z*B7>BmU-0aQ)io0Wz5smo}AVwm5Pz4Bx zbb!_#(Couuv+bO*$kDJEqvssmzuVQm2jheIM7!R&!&ZN+P6a3 z$zQ(CU=c2G+SB%l@z&dMAKBl$mJA%VHD)n;Gd}DmYim(*pD6r3H9k@Bb@Vgp{}1?+ zGmJOHZvKX-z!(2E75V+-(Iux{dd5GG30FVx`U1^$M@%=5)XD8^S^R2bdirJs-qXGmD`V})qw zVYKQHBlu`1kd@7=**^mK!45gk9q#@nkOF-?kzK`H#?{OeW*a&q1lEMshroV|RY(Zz z2Y4Gx95)Fk+2!)nv0WJA`DRK$J}{G0z$|;*yzm0NxnJM`b0Z~Z=^lKz%`MxLJn(xF zS2iH_3bOz~+|2|qi_+uAjF66XKPA3rEb>BrazQRi$%rR+9uOYQ5p(oz3JitF7l`1Z z13~uq=J3(n$CkoZulO>AH1dS%afg0%u!COGRL!&}uLr}APVRbZYPbjMtwf?#;4h0M zGPd>O8=qYmwD~rSjm+C+C%Sx?0RwI*^-0YdgqPS)Ey31(f?&V@y!6-WCo@C_Xr0~D zyrz-VV4q(E105}*(w`Hg#B1RI+Y_S0e?qXt^Bot?c zRS_5{nXC@^mcwTCqiTa-b}*G=%QAJwcrQ>L=7MLea?@swVHeaf(@ge)^$5@yVZ9Fl-m|bE))8A87PYQ=>5_$X>XO>AvWfSy~vGR z8tzTyx`}G-TR!X;Ab1Xm>l&ZMGTH!E1GqQoFCd2>aZHkDP6l~#CuRW|IY7Vp+*n3b9iP;EGzkN8KRB?>lfT|68{p^3r-B`@X zW96^hj%P9Vs$A&m2z5pEfvZx`CboI!?in&$Ls&jKl>F4o?1^v$F5Qh~9#xP1-tHf0 z*Ff^i0s@8Mb|3t-4pZ0MFm6$CC(Q>Hs1s>_6pw?+a?xe1b6vVOyk0tucTjGAaxpS{ zqXVh4wICqUNx}JHy4%sd8*&kRW`cH@49t3i+7lC)p z3?!f6Sc@Y+qU{TCrCnE-EmP@HAiTvAIg2%CNH;SjlkG22Cafuvc&p%ksadroqh<^8 z1D_Vk2eRdLzu|SielrC*AOi7di8vR68gR>P;HnrbxmK(FaI=4X4LlwgL3#HYbMGB; z9TaM=OXMY9|IfAUox~t8mi@E&u>oi#2D*fvaG4Q0Tx_9DB)LCjSwSzplS;zbQmP0sAWQKihBW)sIJek{=f0a2~q`B1!Je z;4l#DIt($kk87dR?AiZO_0#r|Mi@0-{eAjF$IwV0H62J|5^t2y^iNNoW6^)N`r^Zn zyI&+9(WjEII>iN)+>BsKGqH=7fDR;8Oyg0?VDR>vYd%_Oq+a!?WmCrin@@lGpeM!@Y zO!@u)${)fJ|BoLuny5rt`+4^X`tsrARP@7K!O)%z=nWLzenMgd1KFX}UDOqwoN^Q# zk;&<&G;suzQkEKiG#BdzJqtC}8`zW~Oxv*#!LhT4>nAuOgeU^Gxy-_7j=OtsZ#AaN zhxB#;4g$f#yy1L3hx7D%%rpE)+E4i&qkhOOO~oZ-GY}mHbumIzGYp#rEI;WT-d|}=o z3@UggeW@Qt6^vhY{F@7K6XHei<`G<}sMo8&Q<^8Fyr`fY-I?QqYwXf3=oK8f3)vzR zhd+n?3f!v@Jsfa7Q04UdQ$2b6ETM&26DjN>zp!~v#N2|jypo2oGY2uU1Azi}7k9jb z0?RTAOdB6_HC7*-pB+llc9}N8)G8fbn{xL$g)3RUhk(rOT2;O|L z#ur+#qV-j*IL51m$^;CDaxkGJ8!*qxp6ZeuPzl;kx&+3#Qd257f6DlW@1KAMwr-WW zIe#slfIAEGO1_MO?VQa7l(>}(+s4X95H*5d9xC3re*IMW3T9^~UKe#;3Y4-<;qC&w ziGX$LL+>r{%5_kEH4F<>&xJ@<))R#f{|l;=DA@BE{^YIi@kT97#Q8z3pTIeX^!7tu z_b`;gMenY@UQj^F?MNw2M4#CkeFiz)oWmvY?aW1wo{tIucy~U-9Cwip-<{%VF>GcB z_Adwq3^z6(M+iFK4n;t7JvL!zDQ@F5%K0ag&3ji{3`n&myQ^&(-adghH8cz*;Y-0! zCO5u#^+BAOHx+Y0G871CD}^cH|> zO=GbVw`f^fTyup*Gq~ANT-_nzQE?q{^@!41th7!htwhcyym^~{5LDh&=E^S0G}54K zIHH&bia6>kBVBDpFz2UYcGE{8LTYoNs<3wbXu5u61zY@Ct@pFHvE;l>a92zzrp2+R zhfYJEP&a|cz0n^qZL6fYQSQ~l6sZl(59tqBXi>F!2XXBj=4xCB;3N={dG|7OsWNlT ztX;Z43&<*IA)3g3{|}6yXzmaKyH5H1pz@hS142-%_y)QNeQ&+iozy={K=ZgzirE?d zadm;$u(WSV7Ku`9kq}$Y7Se|Z4|Z_&hrqRQ`1}M3mf<4$hRYL4f)!w>A24lWk7}R1m{*}y};gT2Fa}{992Ag5E$W} zPh_(5!uQgH@z*IkziktCzTU~7oO8g=D8Zq${$vg6YSiEcKH8@I$!+V4S^wOvql+ls`{q_2OSWV0 zUCt8|9{QYUw}_9mVW{^DVOt@r)*zq=I+#oQ@ukiKn~;)ee&r)IT-rf2!zt@c?mmOX zV<$$}x(F)#-br}vD*X0$(Nn@b7n4AuVD+~M!+nIY2t#OCzPNWXyONvp}v@@Cw<`XJ^AP=PId`W2BK^hG|^KFvMP#ld}_pKC`H7qE#jLij zSH$#jD^d$Z7yvR2Cs~MQaY{x@bSV_AgGz-{Hiz#i7iehJtm6FG#Nrv?cng@=f}^z4 z!t0@O5G+#w!5ybFhs-*JoMJ*&uMV8fW-d-(*<5}cb`qPlVCkmtUG+-HK+jr={MKRj zB#f4qz8Su=+~gkA5mFb$NdbDC8#A|R!Yb%68@y%H?2qxLoLj*Ep_F%-HM;v-I@Hy) zpeBjD^V?aWGPG{=sS-D*^;;9tdq2uB!&{>8FN!%wF%Qr=@i74h3C$J5Yq8FWO_e>1KW5c0uotJj7x44 z+95IXrvh`y6X86bG`{0>p~u-`S-*SzBxfJ@W-(_&9de{^LLk7|W_>ybA1^ZJFp%i> z_L2g=zN0#q$j+q&hn{M`rg|m{_k0a$iGt21{^VW$X-fHi95k`Q;Vxs8(cd-yec_%< z`I0CcW{+ow(?v$u7Vr$+O`<#!>z908A7m0|I6b2V-_*aPk9O;nlfPiv3Ql&2=a6$T z__C~!lx4jSvFmA&%r>rWr0zow__~D@^jIm(| zJZ#6=QTs{E`6VbkM-0R#g7R{Flprl>R(W}BL3u2^{z8+C zrMV)|ofexILqj0fTwjU;073m9Ozpvg{)o;4L%@|;1~$sVDEUokwgZ9p5!kIHMj2F- z+hSmU@ZC7sPKTik+hB3TDS6jfterXd6|~v^@zkw^9mUo-vS0eO=s*oO3`MqtIYbPC@`_{P63O?>zjd)AJdO zs=7}XyBVNT3L(j}AAR_pC!L-aK!m%OqNHFRw;=2Jpm6sGGV&@L)->vF)o}L@NplKa zNok_84)pa#+s5zL^d!0(zQt$GWTE#ji0%n@tz_NcCqYXvabErGsk~!Q4JeFSw6AkM zR(3Eu5E;-n<82hOvK#Gl+a?!d#m8;$NY27Ef>ZqM6Kw@xqd5Zhr|w0~j7SS>|CzEY z_!@=`h;T)#XT5A|Gy-4PX`7UM@B}vN17_L?ld=Hc$?f_lk70aVB%R@Hz})7}Pkt7N zh069aflgz48`zGSJ+|f^Y9~<+CX-jPK%Mi!wKAuRTyqdaL9T#FVm)zI*ECdgyVP@g z>Jx!_eg|Blo)522a1*GYAvZ;OFGFfDfKXP0&TMe)UYeNL*B}^y4UB%oLw>S>bw9Su!!}( zR?ET8Lfr?39VG;S1SESd+((HD2Ftxr%iaG;sp040#@HTU9aq-iPgB^0p9A5o?z$6` zzm?ZbhWG5XUojobgfl`)vs-B{6xS$cH{Q^}J_kpB69rS^mQNbk+8*26)pkpCS8j8_5wxE|9AENI?ZtO%W zH^6GEs(3&!Ih~Y(Qm<4ZE0stj!yB=kXqKe}qgACC`HJy6Ms4hvOjkyo&C(WU#%qgU zln-GXff2^}XzcmGXLyp0U<%4eql|Q1(s}u*k}!+}BqCuB68M1)K*51*9}e{{eJ0$^ zfzn(xvp>{ZhLm|WMQqA@fRFX^)0owB8nPfC&@7rP=7v`SeeQ7(lF%0JU)GT(J-!Up z2EUBo{xpe392LLy@;TVp_16(>rh$K8H`Aa_7~%LKHI&b#>msm%`5E`&!1?axo82Gd z)9bo@8ic}S+xHQgm^|rN<&&94JjsxKKiv`g$~itP8O}61FC4yphAEZVrd0p?dig8@ z^&3h4p1Ev3D+f@Mh>Ke56h>ci!P7x9-Wujj~Td z-Lag*m+;O*$vcoQ|&Fp5$5zI!N$f}tw@F-a~VGF#8Ap zG=Yu<&9dB9lKdTfh~DV$$6`xL<42(a>mytbGxhsx^3x}ye8}ox^sf+PR0>$B1t$`JmO&*zR+S_w;2*Ew@NYK8Q7yZ^51vqfOPb$eJoR%RRE z;kzmMg6k^zla~X}%4nhOQK_4#IdGpO!kUKr4aGf0areQ8$izLv;2!MgKOvTHmflf%aV_>Y1)cl8v19f2=kb7c=ki|Mq&$M zMd9@|N(H%P*s@%Vlp7_*E<)?>r@?{f9x#W1<{knrD84z|Wu|ZFgZV;`<0;Y8tGck!p7zk)w`pA}ao z=fCmBU?d72=7@$>neB@v7UL^LONYzc8z$rWim^XUIxEy);i_o)SH@Lh7-z)>93w zc)GP-fuV7%`S~QAkH9&D@H5;Owr3LEi@^BVd7vLmxzTA51Gq4r1`ovqj#A(x$e<%F zil`P^9qe#Y=sgbmkNf>cnD8>R95>rSWpJ-@=cPI@qA#jK>WH{Kbt-5=R+#7Lxy}H< z`yuY_sn-<)0G!H&dw!|!93-{@5wnR&$sCwWN50UFdhW*TqHGI#-zGqk_9ld|Fu-4m z>-xT+DO)f}`6VRI8CVaRjZlZc<`#DykmWMBuDbMYf;B!l#W3!%v0<_iWylQ9Jgc7&l`BYS6OX?=@pPDw& zfC=nC^iH6mb+B|))+e#SzgRmmA9g@v_2}7H83C;h(3%VehwQ=x?P!m86O_I6LgUI@ z&efCwnfFRT@`SQF78K`)yZ(qYOhYsp-5ThC+a)8~fshJ@b%uPL2_{|*M@o{QKYr2- zNjhY{t{BWYPjdDnNrjWhe)V3{moH->_*SC!fj`~Cx4a*Tuah(HAEdd^3T(BJQm$Ok zoWL}XaqnL0anUbZ?-EmQS8B_CC=aQ3*iIBfs#*1My978Z%nPu%Lm%~&pRq(e&j*#g z_udKc7?7DV&~r2XvJ6+AaPp4CXilxP6>+q*P2m#ZguJl;p~uVJq6iuc;ze|(Rz8EnP=#rN0N@ax~J$162#^&@* z?sdlTGZ{Pqxm6gD9Tra6Rx9cqZaVjL;5k$OIl}c0 zdQK{W@SM&3hGzL7Kf>W)&9M6%06_%UH$xKG`cYJ)zx>PBHu(jFbuwilWTTh36e0xS z3`0RrB)qoPCbUu;k}>)1<_rSKXgGW|NMEpV;E545Hd2t&i(e}F5P)x0)g408Ajata zh$0V}Ls4)R7%dAS84%kBqW2>oqu~8e@j)2{eM8Gug|VPDUJ%{pt&o94SzlmdW!+e8 zKZH*0M}rsF$mNHIBbt;+l!d>F1N(Wu*w6b@k6CN0HJ^`07*M*9Lt71A`}itt*@MWD zC=1nl7FLj)SZ?ZalV+Ed?V2Ja7R$HG$|ooglt3?_@>Z0oDY-0K_0JoA-r8t}pIO9A z6n@3wPr>mw@+a>n9OV-^C42)e)?P-Rz)cJ9bt(EFBKSbx0CeMd+jck}#TcE|fEznc z#{R=;_%L?R59UY68B}wc+Qj*DnsWE9?*JaYZ?k9G=y(*Q5%8h~yQzkA`H+8b-!uPMS1fcpSEWP0$R*MmVKtp^W=Hy}u6doU(W?De(> zf7e^%-tP5a3~%gR=)MCkno_m_K=+fQRFjeb?`}sM8@Jhf-IQ z1jdf8`DfT;f?$~DhSR_cO|EvmA;0Slc{9A!aqxC5IZ!$Tt-(|+7*BMwzx7@WzVu#^ zjgx)htg_buIudgW@0Og)Aq-q}z{6bo!#z{A)cv4@z0@+a+wUKjha>$$MGN9toV4~W z7v+Sf6g~$hWO-J{|A@UkZ>8RW(P10fbJQZqWr(|8c5FKD5K$OxI*2Z288in*a-lMbBsFkN=5)m z>)5>zK-#W}!mBm_KT+_+_58`J7I<7{9tV1AY+_;u6Y0_Or)w}5=3O3L zC4*16B15VoO~PKMI+Q3vM(QL|c6)k>jm0kh;7V=z$=QA?x#D;0c#j9N=OaDbBOMo4 z1rn%p4{Kob92HE{XKz0~wQ%h7|M^kuV-K2S6WCD2g;u(l06>AcuAQ7gUez+%_${hS z4aa)MU!P(9xd!3yH^leeOL_;3WnX^r!_ccxbl$%M1Io@Z1M9SA8J$iUFY`=d?POb4 zG#ve9iStZ}^K6OpOA#FuzaQ2X{%6l@P_a7wP1>$R!Jn_?Pu|@KefdKg9sJb!+SB@F zY(gl@sMI4}?T?^)%ngugS5n_rQY9eemOWyqxzR_sqWVjK>lJZl;0f_q*#pkKw`D_? zuv`@|c9xb|7ASL$mU)SmIkcX&$i7q(b1uM738Ybc5Zyl<-HiptM{tHCoujKj3|#c9 zj6}bJ;yHv`Ks?W*Oo*ou^fSbhG2+X?()9JJA}&E<$TbEJp)XuITVlpFlpZQIwolra z(?m4Y5Ea60eFXwX6v)a(cR%!e2S~M- zo`V;w1gDGK3Pwt$mK!@MlCneGcV}v=_9uvvrzpD=R*w z%0=t^SG>xo>gGJq0b4Q?%S_3M)z0J9&eDSd5`M7#U~*W%vhN{?o3jx=Om^N5Klqt_ z6P&lg4_-Fd`MXdD1{L0_^#MRDc|4$zkSkrH>>X4Qcjx3i zCK#>n6gwj*`{KvZPJf$%Omw`wuOkm^-sge50XAC(Cjhp3p)(27uDlK}4@qvxazgvQn!EurO8q)5{bA`8U^)EYA=LHt(kiWdT%eE3B>y2Lf1yV~$xpK6Nh<7R zDtQ+9S15*0%aWgz;##I(b5BDwAdvkN!D1`RIbzu{HYvs#g!=vwbq6#2r9}2GfERPJ zH{hpwAiD=Yp$N3-9ke*6##!JbrwNIOBv!Kn=jrN!Nh6Z2-f%V7=*^4KTlgy6U#d{13m}pF>c6QTzK;zyS!(aAoXSEa! zqxp8VTe6SMv;-+I4`nt3G(Pj@ama_6Xa2=DLonFb=P1S*HbXEbDF*W=*bHNm58rpb)o@8**UJ8e{`58u8}3~vN(009ER^`veVs3BCv1It3bh>& z_ZtXk?ccKAEUkRD`U;E~=#uXs^NukxOZH8G8iGl}D~%NZD|Pce<`wpH7WOMGOi7M` z^+69@%cR3xWc`C8X)}7qU4u7Q5Lj}vb6KdHGewGN ze|bCyBmkG%^u~mlZ(~jK?$2ZhA^V#GRrWH+fX@s~ zNS;mU9)$ILIr#us(dy=P8Yqn1xLR^zY1ZR7)(u^5#gZER+!t`mpnBeJ-cn2PX&KD12f0U+k4OKbpn{U1Jf@`Ga5_m% zOKM|D(ytN)Urx*U2j*O<*wCD_lp6;y>D*ir;C02Q+-b}OYCvPgY|ruey^KpW9>0Sy zDVE=}({jGgoKgG^H)ry@fpA8)gQIe5n0w6pLc5JrSA&wz@UdG~>)f$iE4x(8}4MevvZVfWWA~C|SQmn}MOwLv&5sKxS#JGGM zLZAk8z~&g5My*c00?*IW;U^TFwPo$77to1e`%K-YjvT4x@?A}BD{cSj$FtG3F<2j{ zs1dqVdDCQ~Kc>l~`Ix>Xb^@A_*p%YsQX5aFL_+D(I*HUp*G^!?RD|q{Z0Ek1EmGgO z(Nl9+GcK2j76Lt#ddli}*KjxkNCYlG-&7#B!jbg131Jl}UZuePL6(esOvl$ZWoa9z zpCIS$fOfPtJ~flNa;!8M&`IH6D7BBKVC??&EV6XmUy40VyhLN^R`^Hw#Xo+=VL@3k zya5J?hHyga4yD9x5L;1=twLW&Q;2#He3NP%HE65IR+I6LlR2_8fa2DM8R&;yg2#-) zXkQT;?K%YO`fW*+A_hTb2mphznTUYn=ZGr(JGC;f(o%r(*9UdbuWx_{tQ1Ua1*<&B z!+)2=I$zahXk{*H#!sW+2+Pw+%1%n|+KqN+(IO9I%T71%GAks&T=Z(utQ)lizr4Dj z=XR}1|M=bTLr3SCTzNc)cOIv@T!{frm_}K9Q6@l+S^?}_MkREsUq%IR*EzL>U5xVr z{PJ$(o~EN#pb3bg2zreYKXYP5=`l?~`^=*8kHjppMcQCN2HkC7c$u<6?k08}c+rAz9c<%w0GN!{L3QVsNO{{!PFU{S7C#W^V z>KcUraRF`=Dq97Oj8^bkLi|+`(|RMO>=Yk_2@x7zLff-=|HmGD07=sAXa+L8%DEp9 zvX5aRe8!LA-yiVrE&Tf`eA1Qh)1SrcuNNBHI8$>Z_60q@WKzkmPN$lw_$M;L*U zJMiy9JYR}``|$5{gg-98zyHF&iw+$=d=vidz`s%J_a?p(3uAA~q2O*5Gyh0r$KjIk z6AzU*pfjmgf-l|FPK_rbo_&=3?EE9(>s~L+mP|b5Xz$o>5Q!zSe>iVK=%LAU>P-B_ zS$e=-ie(N2f4cUzVKWPC@UWcwA5Oj!VK8q93(H-yRg%lJps@xtP$?XEThfbVr|5{2 z%bumX@qG7!HN}i9a?6hy4?=MR(LXWG#q1p+ueWXtca;z%k$u@BTr6DnCtdZCwbE&t zajwm9ONVg!{BJ2vGNns{h-?u2Q|f!@l>W{*Z-0`h9vqjX`9cc5Eh6O}7w&3M@-5e} z+*hy;vHIB)vBy9BATDXdN^PNLFHOtF7gVyIcdtc^ap{ONHHfBnRU{p~nA}_Y;HOo1 zhW(WkuaXSjt84;BY4iVM;djr~N96Y#Y1xL~$z$=0N<{zX{ARRgx!0a`!pIoyx!7jB z`}TzX=3AZJ8~r^-jn+fqof~GtOX5WdSarb;gjcX!AMU=ySCUs|zbP3nhP$T+Q~yg+ z@kw6BNkpOK*3p!MS4J=e}5j%U}D-JXGv|mr4e24tFS@V9`G(xu?1Y28h|a}vEBi(1^bix zv92Mu;FYfSSFrf`2tAKVe6A;va|>v|7IaQPU&EFp=lQPJSMWQ)twZ7NYpv&kkNkEe zE3k(IN4e9|Rw4+GFCnL;RpHE5xcfbUwAtL?gIR63`)_zKCg8d3^U$-plKA-0BjNS` z8O-RzklmG>1h*o*{>fm*JjnpY1L5^Q3}npyIZ9)&rTdG))L%#{c4_tmQnODJA`{^a zhu7ByGGO|j$K~u*lDakAT@y&n-U3fUc)u^a{(@jeTr$A>mhgHkFe)9n z;`AE4;UP;F2|C*k@RA1W4I=eI%?_o`#RIZ)VT=RWbisrSRVZkWpcjp>Non>7{cQ#G zqjT0V>PH_;b5K8i1lEjx6oN*YessPrt!Y%`96*k4(5J%drvx%)^8z!`6n0$;K6{a* zLRYc_u-Q9p8~2CT?+JoGBjAsOyT2byLhWprpsrOkesSl)P^S&a{hpm~-{z-sIvsd5&?YbQOJJ7C1D?(N)UIY0+ zcBWQ*^VqdwMcVpjIrQOEGmlXpwqXbl>cfA7b)yfnK_g8c0`}tWfJCgl=uS&hd$B4l ztxD`gn&h=7!d|3FUV9=GfJ;GEi~ODlWAXo0hbzzY2jKv~n+ps$UAOae1J#{F4F&== z_8n^M`|~jsgTd!E;ovY3-g*7aSnOT>1i!^JfQ=6rxt8kX!N*MDQ#U(r7z(lvLQ3Z_ z1SYnTpUSd76>Yo>uEpQUS5a?UWHfTo#^|;AZwXWV+b@;@G}0|G1%RyjkS}F72bK{%{ZsN`XHJFXV;6Z z+;m{CgFo?Ozk-2AM*VMQ{qOqNnAsb9JH|{Gy%62t`Hy>*;JwO7)6LGCaCX7SP;V?E zt3;IF#@^Y|y5o!GsH7$vUiKDc^OR49zHW@&+_5{Wmv^`Y+Vy0E;}_o>LqmG&!DICY z&J5uEkCwkvTq<3v#LTb8Y5ybOYnS}{@t0+mKdLhqAEm)Eb&8$2>$R*{C1xnnq4yTe z$kO?g_`<$-s>b59G3oCuS^}iZ{paJz=Zf*<>+APey3qAHxP*>Vwe~s1=cP@E&G`)a z?~F|*;iitrmunvD!%zj4NFrxQ!mE4nrl0#8Mu=$`25>DHdW_$(qz2QS-4Bpqp73%P z(cz_!8o2LO;!Lsy1i@EaGow}>=VnrH$*?aV9^p^k1X(gIvwMm`5_EP;H1?Upl8vBay;_Q{c zdjem+cJr>rVoc0^4`#84ur(q1b>w?D+oH%&_)%QU!P6v*@B*%G5#r{d6hM74%1OMTMK!O;T0|%!2G9_aZbPujF%{!1V*Rk%!RwJaG9( zFo;LqG&2mA@Q5>;8-BsZL_s5nQ(w$!)_YW&a(?|XIi3fymKp+{?Smk3HSrj3g!Vvd z?kNIwN@K%3$>4?>liA)U0BtN@j#)5aucfy=buAD?HLQMcYiID=lfPObEFL_QKY9Ns zZ#f^r<^k+m0B#T&5tO|q0en*DhXH`c{eD#+B!SUYee+)_cvT$+HO=Jr z)FBH~RrD?(qY&$5TGoqr8&y`u1P87xHa~TPzSrMy{-s}Z^YKij!zA{G-5TJKiF<$|40D>fG*7S12jljjq)OlGYm~$s@CxnK#`-Am`{Gn1XQm8|E zoxfC`ZfZ`^I)4ZIhfwDjf(?*w5^pdy-1Y?gAc1r%gF#KlQ}25Z<5qTWbbt%LeWZuq z?eZ(@y|Q!#dxQ;Ow7ZUaVXebd9Grc!i$dL(OLwss>%ay9Wt-K&8Iqav;ooGcEY>|} zk^X@4VEQluaOvb^xwc$Z&t&CWPULNYh}EtUqh}`>)f4%r@sUQHU#!I^9}f@pM!%54 zrU0x3@CgsNTIvgI*nxx50o?M`LJV2O*Z}c#|#ka#+vT?9_i^iYmeh^nlbH%Lj^FrA6+Z=rcD-ofY#S-oYS$Niv4m3#6!u~HNYG~H^R%R(HgP1y@_BD7r!ceEJ!ogTZGhAJtA`_@GmA)6hy;Oeuaz&;C zSpkp1jEA|dqCM%h{z>{BpUGxg+ZAaMZzB{8ZgYHYm51~W zYU1NZJr9WQ{jviEhfih6cs#>AoGPCHur>Xyv{XT}vax}0@SMC8)t(|(O zrrM#Lav8M`_T+3Wf%-<%g_7`hyCZ*DqBYs>R4f1(Uje6t`RNGRO58py-;m6D8^`2u zv7fW6QRw4iIGgoJ4w{Mu~r8Hg97)gH~IXgT20R$_ov-BG{BfBsQoEC=Y1uZo z@40XQ0TRkUW5h$;9)2A_Vu-eZv*G2y&AJF1?x4rfGQcHRR+_bAc*!EX0}vo&DZ;5^ zBJ@Qd5G*q#5?Ym~lfMQ9TZ!(ol^XzHPe$@_yg^?5NyY+gYX>fmNEGhWBJVm?c>HQ9 zyYpa>L5M(z^(9-CSYPrHJfso%wh~#SL~a%$X(tp_m%G{f_2vt*w?BEVQrw?pgwC|D zwQ20F^ziL`vg^P!8VbyRFo@!x%!6S4xF)q5Jq&X{83xgtND5Yk8C<4M(q$S#q#LG= z*EZPrz1T-c=TP#D&q-!(usn?Sl-X!|ah?`ndfuT(c>R046!bnh+H^5eY@_alIMApU zp2DBJ%dZjk#xNtVv%igNMrP<4i2YK@G&AxgrT-MT0R7*O{h8$bTBe;#e1Nc{`rIZcbg<9y9es{Jw$E*6lCcm@&v)_GwTpkz=Wc?G z(dPt08m(t5fnELK-Ys{BrtreR-LJ7P4vjnfq`!;MV*-L~(D^UBP7pA zubxY0Prp|0K0ZE4H_Hl+COLO zB?_(&OIuW3#kL@rKUjAFHI(`~{`5ug2c6(LIUgch-B1EAfkO#PkO$@IO};cmAE5Sa z$kLnYFzzgZD^38U6D3L4ysuFx;vO^jg3l+PXK!^kGaK=ajx>*Iu`;?1V-=L<->&q$ z;S@;F>U7Aj8|^^EA`eS9e#8R$&70}Gs~O~)y3RdYfpCjnL1OKxv=`Puv5X0;J1o=w zvJtHNBDm!obpC>~v=8CLl(;2&?l4sVD(o!!hT00dO%cC2=g# zy|^5wPjLbY=bUA8gnyq(B$mit$8Z1np*gsjTKF5)?x}a3Zf>V}k+?RE?ze zQs}f_-hK_U-Y(y_M5tyU`XcDTPk32mT(`%WM%HOP{YpC}zU}3O=OUMRuN;D*i9V4)E;hEnXmY;77$sa~Q|Dz_Ep?YNvrGtaEYYHXQ%MyYelA-Q5fLcpzqrPy$g*p*8f&S!IBGjj1e zdEm-P`KaW;ahSG+7&FAx6PSKtw892uNA7tkb@n2Lh@zIE#9}lgO2fLKT)Io2G9T?cP>!6Ko4xbtpuJ6k0vH&^&p^*3 z_zV6*13i7_scRS0Fa^C2$q*mm+yry6+X?Es`=x0%bq7b3doaFNdcLjhXSty{6_W^}}HD}73^TxrL z>Sr9!GA3%#mV7u^?rXI9X$CU=@`eWER?7ZbZqU`+cq$%&r8wX?J zyf?EvPIE^w1c%e`moDSfc1Q`WNBwYPF!)~MB=!W~>zqVC-hGYqT2>|niR^DZnT4^QFz#kj-u>Ef?hbi)^>oTk9$!Df z-6apd%TxJi>icZ!@l4IyrxecJOpX+@>)_#YcaR~?ro!MVfrS%K?9f(ph9;_FI*A8} zB*NL9n&57xly<*-))Wwx$JcV)9rEz%DbN@%^)#D0)lWTlGexQy=kB05*`!RfZ&;a1 zuvuIYmWs#~L8|y%5weQbl?Iq7{HgF=X(DYHSDH^7O}W2J;`SR(x?Ufv?ySlF zqCVDq=a*e)>to&fem4AxbpKcVYn@MLZt~>ml&)Kat>}ns)hyb0aW4G^dP45iMb48& zy_(?0iZIJ|aB)0xyV{D1!acKWeK1%gL*kWU)Nnr=;|K6Khjj3Wyn!o=SY6|I*v+1| zapV$rAl-in@(X15$|Bic*m?*T^Un`=EtEp(*c@=4#23o3FBg~cJ-v5Qen(gP0RUi) z15zFfAe8zQ%1o^o7l0IC)Q?7iqGr94C*r2tc?bLEgP?=EW)NV&6RHhAmkh*;aFqa< z8>BE}6Bowtts4l0!Yzsw^>PXKP*HE=m%|xg<3c|EZggQl-IpXZjkZ1HjSO5F@9j)CIDz5O68Nz{7 zC9Rb|JxOF=i+B#_y*>S{ljil`^5a_$4~wIg$gYcsUypE@N%({&U@gofT#W>`=tS>* z>S$Wl`NQw@=IQhDn_FsXn+5Ul zS6Sj~Dk^Itwe{5v7T$-htf{D96}NzmO${yaN-3hEB_jMpn&N93)>hP6)alLD4Xxn4 zq8r=NqakbSYg@*Hn%-Qy zs=lF#wM1DfHHvF4VBruaDQT4+}08pZxq_nn{HNGa^)*>~YF}-OWkJsCRR1Tm~6>qbpOm8+qTP;O- z(n^P_t%u-it0D@72PzDuYui_lTN|q&O-tFAb5p#fsW!ego(65f#w86_n%Ava*-!`e z8&It#OE}Zkes{x`x(Bb4^2QT@@M% zLaBrrq6wShEv=1Yt(4tZI!$$LQ*(<&gPL1WsXR=tusUGjf|=AwzZq_As)epY`?RMY z9ighWSrpb-2I7O_cz6|!jdiuCNJD+yI?)fcBF&M8)|N;^b+8LgZ?3AXW(ovU(X^^{ zO}rjm)RWNk=38r_>+D7qE1MhYTEX@wTh}zQI$%F2%*u*-8pBHTf7Y!g9;uI4qP;7c z)~S4a(_}%@?93Y26oPu@#@5akoAy;(87h4p%7W^vIl3^y2CYDMuC0%>G&QuMi(4Wq z#auS5jW?<6eWJ$NjV{-4xhh^CZ(@~%gvhWNJzZ+3&C%RgQRx-r6NVZ^;%)KD))r~H z#(2}3+U91MYR^Qs);G5{Ha0Z1pslLn&1h0JDoq*XIZ#K|Mr$Q74EfzJ>!+y~lh*eOiY$T?{45Xa>v%v?~y6*LWzfx%F!s zR-$qyRCVb;~YfFKmDvT!r3SUsV@xvIW(%W5F7LUS(@j6WB*TAT#l*3qcIYrq@%f zHRvtzdW$-a1nT0|F#KayABsaYCmYt%Yf-`jh9UR~5Fc6=5L7_6t8b`m!R(05mCT1I z*?R&NwnM>@>KxQ19i&^>(R&hcR&8)JwMqyF!;oiKYi+FPd_uX?}o)omfm>NvX8z0gn1`N zKCtkLlIWFJ#TH%kp^FPH`SAQpKeFJm!jE2FR6JAMKO;838#cF8G^tWI!dTT~ToI?n z6ENH<&vRo=Ee3oTU}O8${6W{zMAfycC`9W_dceL%=({}ZsBneW)>cH&p3B$3V{2Is z-?DP`a@tS4*%r%yghj71fOQos<8{k*yk1V*wifC%yAF=$%6Ll!Mo)dITDi)5hAq=X znCr@TXm+y?Z}_fgZE08ojyd|Si|9xveFffRJ^VIb+Ztd)wI4OFgS}g085Yv8Qn0hf zh8U@WCm`;6OGTu*uEHBhGbkA_O;tFlEh?zhfa4D%9BOLJ$3M16O9jkn)9k7>t3pi; z4K4D33f9c_-e$KcD!jd0jbvaIjV$7DGMg${2`Ps#7{%f5!YX)4g|`C4Yse%7h=##b68ZvM6X#_ogG>3eC4+jDY1tZh%+j9*_=g1qHXZcIHX4A z&ADh!exxM2aOqW%m94dPzF#O>zp@!@FJHbSx@-x4N{W{h z_`nsOTD_;rYX7le&6tR+O=>C=B}-1np?GUZq>TFD*3a#xdy!&JqA;s`0}>- zmn^^J;+i>YDjMG%iefAlJ)c`zyRr#>)Z8mbvw1EWV-9`1_#6&%bEKr^xr=F5S{vu8 zosh)P+zbNcO>uM)jMgf^X4JwYDAp(h3um)A6fCzd8N}Z$cXLG3Miu#YkXakAYiOkF zI*QoQDm)Gk$AC6|ndvecr-V^JK0P((HSjU3&~fQY*~$IX5Y1!rnxN6=l#~t!dbzlP zk?N*~H4(TBGvH^;oEoZVto6aiv$YnS#^&!cy6=L*_}14O_F%d+9$;KtSVf(wS1oU> zsBOBe1wRrPDHX5oqoZwy&K2bEG2;;YcT8^$oXT zl7`yMZD=Hrjm!9jFdVq(x{~8A%qT4b%2XkZq4ZM7s+o9B4PAD5+nTxv{9XEWh3CwhlYb7HLC3+ubCxc-a`yal zF8}D%%RW$Y-4#ndRvwKY)`h4-`O<}@i>`>AGkfmbV!B3i=awufiIkTvTD%0#VgB5? z(QD6%oKw@%()f|Nb8o%%R^vdS3IuGP3rhu))3S~+zu7>TQ`J&+4vJCgY3#rpPrYoe zWQ<{%J;|a2)5E<@d+N&8>S}u9X!s0?Bg|o)>t^`*@Wz{47E|tpqOi?PmEN0eqyP$> z^42;8J}rU;IfkaDcVWExmIj3AVLG*A`3;V!gb!o_2*<`?I^LKp20)I;Et!fmwlqaT zw>C6Y=~I>e_$mMKBcV@(ZVAoKZ$oSe(=7aL4Vf2to-VI#p?LF0J`uVwg8!@9@TY=* z;_|mi{#Mi>VIKZf)`cRoBB2igF)}-1Na0DSA;+f7(v|Dq-JRI(~SW*Of0>bltTxLnWB&*VbV! z3SO{~vKB8A;k2BWM3)pVDh1p+MD=PbBc@_&D(Wj%#U;SpilDm2HEx6Luz0BP;^>m4 z<-kNt8bcUD(Z%J9tS!KTPRp%aL#gD7&G`{HAmSTa^c$l$EEfLgOEfW}fPuCa;lH~0 z+6s`uthlNcBOeAE%+bA4OBO|!P)uXu(C@r}=IH`4-3*8c)%wWdYZjGr9vMlKpG}=< zhNWQi!dG{a(BdT2&R*!d=zdo~Ju!1Lz|y}AfHHs-Z)-#gL5E=w z(r{%x^wt`Ls&7Ta9aOj&Br`ddw`|P+17$a?lt5BdLBD zW@{fP*~d}&RLCe_7pDnE_l<}z4k-jsOq3pO0r;e%u%5N`j3c8-gAB_AmAMR>O8{{> z7MRcs%Udd%SF5{g;SoS;#zH5GMMYr>816T*Q0>~v>4lgZ8y^_$L75;>7MK~p*Ika_ z%W^P5x;JOi@Eof=cg+`)#X(pk;<=h*0b=ztf*4WlN}a4j zvtbWm`#|+VFa`&M^Oreu=GglCWtfI$*fy;Yvz9?wa$Qwc>MENmnrn_sC3Brk0tIQ+ zYc)fbsnD8=Rj}gzqF|-0n6g`l*Nw0fClusvc7rDb-O&(`8P>=vFt^ZQgFS#tj_H4F z)zSBAWfi{$okr&xtYj1c=f$EfOQ0JZ1}E%p09yO&>j&_hIqA4 zqp`KQhJDDZCq|7lS@;A^SLX-_N36NALH$kBbUsN2l1S3*_n?-VWoIdctJ;C?-rQPA zb6wq9Cv_nrl|2A~vf?eeTnzbxzkI(e8I;k{h5co!q4|F71QWxW2CNm592PQ`%U&U@ zQY>%cmab7Fp4ivXa2dGNgkwM@m}S%#A}Z5RhrKnyQX0A48>% zfHS&$aVC$oZ~=ZdC8r_S-p>dogUgI^VtnL6I;=2)Lhxl03Q>#0#{7qPC@{)<2cn}nrCjcX=G|+b~+M~)-T~S>~&2XLV zK1q%WFn5_VXzmQVwGq(|Y$3r8JkJ$@g0X4PJ-w=!3BHtN32|DrZjA~Cg9xb6A%f!) z1dw?b#w|1TvRT%ZFq=WuP16uqWJY~M{p^b7x+W77^ZYRb%-UdD9i}JiK*>^fuSKlMTHn(5bBA&A{j)B~-t;Gz^lB9Kw;n0bz*=lWpN2wlHQ_Xw_ z@p%iTDZT}gZdMV|#eHc$3t3sa3hO7w0_nqe-6IgGA?I`rq&B+LW{dCzG9y;POwAuA;_Q=Ri6|`=~ior3U zq1I`8aHLk+im;o(fE0X6X$i~I72ZVD6QNnKF_Of@y$;)eX-}3fFI{x)HPMnqOROce zRQ&Ceo-Puv6%H?^6`rEX%mh73YZzR6^3aY!-L&8PGXd-blqD7v2Xky~Jf{MdJ!3O% zz<`~o8nD=mj{awRkpUvDsi7I%pKc?N)0<5m2WqoVQJLUo7`O+XT#Tg|AHfRHayCBX z;*XUrDPBn8=?$1+&@35#{E>%I20LJ> z>9U;oFo-e0{k2dcrVM}GhsBm#vqW>O7}D>@CcfO%f`Q}`M4-@ru%aHi;>v}vt#$E5 zGV)i~daj?frDi2q<^a;PhCGC4C^GD!dx#e|v|IIFKd(TLz)EX$bB-1` z7P>1uf61PCco&^Rt1}(DXzH5giZ7#4MzEtJnPno~osb>5<^+u=I}3_qJn@zrG`GB= z8Bt0YPfY6}T4RVfC)Cbq#Mz24!r#NSIYS{P0K1BtS{qv;^YgJcrgbG3+S99$F;c)@ zh!F#_&yS>dVR9eCv#4VXN@Ehr^izzU05({0zW`}k-+xJx)paHcFYyC)%&!A^Stq(B0 z3Ya%udtLeRn{HUNB&v@$M2kzTc>_7jbD<7?aqy%}k>{EP#&bCqh0e7ro9F7%=DE|E z#y4Gr#a}`SPV;DT(_j}OG838`qGwQN=x4&~ z`6Ph|6tc3RqN!?jZPgKxEKmT?_E*2f$y3P^4PE*@Fg+hUOT5d^U)hAS4{&&z%{d?m z6XUc<3-%E=ws_MBpNwwWkL#BG3}QZ1h8E+nNIA}=z#Oi*CN2jA{R0SC^jw3D2@E2} z;cd&ljs{=s)-taKp4e1>6&{!fVp@%Y*Y9;s0;`vAYif5}c)MpTU7<<0g>yhT!G^fK zS8t0p%FeR{iJoT`;LD&Q-n`u6b3J2xNZE@E@JMA#n=E~d59(DByCKq6D$}>C*m48h z*sX)uIB^6-IHufK10yVZwmBPC#XYi|EZWiKWFghr%A{`mZHx*srh78;u)M91HYF%o zo95SgT*)H#z;m8jH+hlWHc$i=q*t=!`2;=rOS;vuz;TVV$CFR=Ur)yskoLa`W&YcQ zvXi}>31wNhRZ#ys^M(o6S|~nSs55WKx^@DtjYu--5T~_wL z31$8p;JqC1aDs&a?gZ`R}h&B-6|dd!^q;Z<-aUzik1`# zO_<_8v)m~b7u#DUiOcIi5YuKwUh|V7k=|N%wT=?3rgxw^Yxbbrx@*m;cVb@T?i$^9Rp5-#$;^ zEf3~D_KU!?FCU|i%%e_P82<_N%CQ<83Y~skpf3FWx%uz(>)w-NpC|C*PV?V{h<(zw zv)F9MlZ_?7vnL@w2hzQsE$JsIE$Y1Oo75%yeD+Mgtg~kYo}!K*Qzy;|ZKH*o8JfDb-LZ2APRcZEWJE8^K}MLc`0h-a@ADSt~P6gp#$ z{|wu8wS9ZPCqe3)pPqHKuf=%wbl{A+78C7K8mQwn{_}*XS-6i=|HJb&_W2B6zh(YA zW43(~I-Xu-UE}u*^eLat2|k@^C!A_Dfc+wkXOB)^u#a48t*7Xcr>l^^Ctb+j(`Y>Z zFZRv@FpA=9;4`zkN9aii9VLX`dlv`^CG-x`G=wUGARR@)&=sYs2&i;WP!SsfBA@~) zc0mOTVnaka2#DnS&E4+ha#@1@)lY>R_~q@q_jY!6c4udHc6KjN@Apr=QV5ZHr4Yh7 z@AMv}UL9EWw-)5HRcc+(b;^mcoYh%QEkW|h_0ZAl>!E*HpTl;0Nk0AS7A}`sp1OT> zeDt=Qm~OKI^jxugG4%d(mE)DV+&MK(AwAixY@X~QvnSk&@Pw-@VL3D92+N@&!@@H~ zgoPVfeRia)Jy))%sN96SdGqDVPsn430(Q8Py~OW)ul4#LAK$1^ zV?xuW2?@;zP3+Lz4p+PVT0j0RTC{B0iqNJ_+qUfpt?kg>4p+N9bo@id|5|SU7cN}1 z=uyJsk1t-lgz%UhmfGQJw_oe^f7!C-%U2Lqty;bM3BpP{JZXok-F~ef|21pYu6>H| z%rooOJxh4n4(si3wcA6-KXm*@d&{SGzrQ{6ok8TJHbddh4J;g9$^13>|tq;Wj%Av%}SHzt-#j z@Zlpyj3kU6J!Z^U!YDi3VTY^Teytz>JMSDf?k>Xk@e?N8L%7=x$#%Hf?V;lzI{w#k z`#*8wq)C$rQ>RXwHk~lV4)@yOYPVnO_5Z&6X3V&sFmvXtS+fZb*kO(xu6Fyie*EXo zoj316!ov^GpZ^HqAv-Lv!_{sN9skhr54HcH_WxRa{(rT%?^oKt(Dgrb{lAv4|5tne z?n?V7h5l!N1)2CTfc`{+{#1be>HK>8E7SskE>Y%F&^`HSXL>CW@w2{ylT@y%v z=Ab_-p+9Nid`6-zx^~b3Izbm~U7;K3&>ebQfu7hi;wJ1FaWnReNW|WYyd^;&mYvYg zUg(d00LufBw;~6_Z7>9e!tF2&hQkOL38P>%jDfLm2iytc;4Ziu#=``T{5>!mmcX-Y zV;j5%Z@^A?6W)e*;63;NK7u{?e?l5Rz@ZHI5!+$-33NCDKf_Tt2FKw9oP<+w8qUC3 z_yx|vdAI<-!bSKEEwi1s<#6i1-hvM8@$CRk{qM+fC+G}a;Ge4hH?r-n?3Y{p?}jb7 z{_A~ltN&WB!~atMyR)6(`riYcuKzmx)%Cw8`>X#AM(Xx|2;0)_|Lw?OFdV&Z|3@Gr zkfYG)_J0g=Ea>{B>;E0tb^AXKT{POek>g9;>vh7a$|1fsl{y&0VxBm-m zyKes%v78Z)V$X=juxG^M*fU}=_9f(RDY&)&%h9jEXBBcaQn&w4B6a(}2KiUC|7&Rr zbo;-VZRqxYH&VC%?;>^k|2|T;{~sbhhQ079>+ECuy8a(VUXGuz9f6-ghoi`2;M9NJ z{vRi<+y4_tUH?xab^Ct`soVe4NZtOQLF)GZEK;}szaYt0hMdFa^7z{S^Y~=u3w>D( zDY8O#!`J@jMCY{sg;|b_5J_t==J^o@Bq8M{~v)}-~W$7AB}xXfL-7JkHxO<|L;Vv@Bi-#u$YJ~hCu$N#2b*Z2STqSyETGXm^-{O^A3`u=|=dVT*t z+ixdwg-}c1V`dOC8vE0>jK==7Ej36nCm>&e+!#bkblSc|9tOu4Y8VX()a%x zkox|ABU0c0Z$|3-|1HR^upM6Kp4S=w+rj#mV<)y<-t>KY>NfuOCU!mk_ZCv$|G$mY z_y4<*`u_hNq`v=u7pd?6-$UyA|M!t(D?>iO=koaO|3Ad%Mz$Y3{&x_)zW>+beI|Cby8({^3|FE{?D?YjP7Zv4-ehm8MTss3j)_NQ$bjs0m`YH%O_ug)>j z? z%;Yr-&ou+*|Nc|Y|Ng4+|0}is%@}VCg-{8EO5j>80jUgASRNrVg=Nmdl)r4*bNr`@ z!Vq0eC2paOd={RwuV*hHUxb%n1H246Y_z2>_Iv&sViW1U4e!8v@Bw@Td*BoJ4EDnp z@YNqqpSj+wa}d6PZ{a)m9(4G@mcE$VUnvf;-NSGMj>2&`38&#KoP!H+5iWtSq)=dj z$8t;a-=vcwjC^LvAfMT=WrrM)6T%?^A|V$BPe2F{?$KfQL zhO=-EF2F^&#CqP~VT9hp96ZPcxgjs)hk|e&6*zq`L}Bz5uR!|s{!1EP{jWqB{8ROR z4BNf~#=+gL$06hL4AuXP%7;0jlxuPZ<@!(8|4HO+GE5<#ZuNgEwrLQm{}~q3pkgZzyLS{>t|MJJLM^zrcC;6@G&hkeUAZ_TL~67G#3VkQK5+PKbb9kQ?$s zekcgnL18G8$yZ+g-oICF|BJE@#h^HpfRa!ON<$ea3+13ZRDg<52`WPs%HYqo|5Zt+ z8tC@FI_cGf+L=<@|GL<20A2sx)k{}$3u9}ICT`fH*65B2{;{r^z^Kllo8?ezac^*>bqL-jvY|3l+{q4B?~ef;lE z`u%so?-~Caf7SQ@gRgm^c&G%f<`Uo?cIy6Y*ZcjedA~2WZ-$u5Sj#fXY(9cq?cF z?Vtm60{#52i{qE(u<>jR{Vi7@%_{%7h;RIVAm#8+jsO20_5Y7N|G(PD|F87?@82^1 zub=;g#{d7nFCd}k|5y9`pDWe>(DVP${GZVLpR0HLKUDu|Q$zFrF4M6Hwf~{^|DT=z z`@hcrThBe~|1$qKH2!~?OF>8-DuJuM1VZEgX%BH|{694Q|LWi9{_mU{SAPEg zZ+iac*8T^+|MUO-{Qvu_zWsO3laLIRK&S++y%KP~U*i3INj8x^N6zqTuMk3e94diO z3H&1^z&BeMi#hk7A4mB|3NN(LPzn6UOCVJL|KkVnAI?7C`l9`~2$w=_$Ul56{+G@3 zJ-y6)Pf!17YMQ|J_0s9mID{gh5(t&Rf4&4l?f-xN5QcUjR098V354qZ|6FvT6+_a{d3mcdMb)LnRO@fqz2@gzEpl;V6Xi5GsLxrUWim|3l+{ z|IG0SZ8cN^|DPprx$!?KB17Xj|DOjUw5?DH`~xL$x%&SPWF@r8|6mD(#{d6=2Q47W zm#hC$M1|V_fN}~ghDzXSE&(a>WHv-TZ=L72<84_cbPc$g4|-_dLM7l*0#cN->wkq% z{dXy!kSbIHS91wSQHl9nRiIj^{$I@pI<#-063Czgq^J?9{~44|$P_AptEB{_sKxz% z9lPJ(+?Fjv_5W%)z@hyJmB8;T0V!JB^}lVX{{PN03%P|#;A$xWDcW=I-w`^8>i^Yp zP(%9>DuF*(0#e)ld}{17b{cOQ9~oPXyk>22gD54+ ziMpbmC@ac~nxeQUVOnMuE4y{x{LRc}<*+WAm&`EhteM|DXUr83i)1lHJS66e$zrOQ zEyj!8@@?xqYooQrde?g2dc}IxdeeHzdPk1--0A7(8R)sgGtP61=T^^1Pj63@cwW9F zm&sM~MY%z)l&j@>xme~ECDq3=t9i`GZJssW=iodl9ux1%Qf77)uCkapRD`OeDyy%J zgT@#&M736pRYx^QwNMFayc((QRKrxF>Y{q8ZmPfd*r+8kTXV!))+o<&@)ohzs3Wpk z^TcjzjOPW}Mr<=mh+oVJVuRJkvqZKRZy2S;1#_ahTSN^6z%qdKf|TH#h(qqOmm`LtQj>}1|(O|W*G-iW~^L}%MS%qnJcvz0Z{+Gg%EA2gpbZ!kNWU99oe+vd0Cd~==I!0cjn zvy!cM%^%F^<`T1#nP9fChFhyNoRAD|u0#v`$&;jeCu|jjZZ`{7pv7 zrB+e7!YU${Sryd&G&!!QK2H-bp+1ti<#E|posrp0A&RRHWga~Gac*QMevcVpp5&Mh zFmjsV=3KO=g3f@`LGc!z>&@Sc`o;}Lb)%{=&Kz$(r0!PvWEu5|%*&Sgv!zH?gK?cWYK|7qSlvDIWfQTx8o7)dMlWNtJY+p#9Z`{1Zex zvx3>gY-ZhVy<+Y)?=mNt53{A25FV6ro}lsvHwAs*XWDT-5m>-yv%}330 zW+StyHN@Iver!%O7n)_vIJ2=e*m~Lg(41mEW|lV_n+euXYqPn>ETr}u1>`_=QeLM% zH-5AZThAC%jXMpczK|E>Pu3A@oiWWAXBg^B`Kydk@5x;9sO+sy$uN#{G4+9r;<)!A zznO`*Q$0m*ktF(xZsHx|1LJ+;L*p%@vZyYqi5jAUP?pECtV~vld7qdm9uTv{H1V3X z)7oL}vbI`7Ji|T1JR>}VJZt4T`HXy4J|PDhgN@uOpUR{1tM1}$qoNSjbg|7E?0Hh& zB;GZu2*a8oUblvNo{~MpZljWr*1cl8b(?36Ocd`KRfTEYFW#_j_dG3swJut1JZ(L- zjYdYi(b%YCG%@Cp^QK0E(b{vpd{fplsu_vKCVAFcZT+MotcJ!cbG2F1Y-6^!?yz>4 zUzu~wHD(>Nz1hjS%X-s1Xx0ikDse&a6Y8{zR}Yvg&FW?=v#mA8dfoiOoNYc~)-v0g z9jrU8o#p{^rn$7&;{1*W5qZ(uswW4`s2wL+z+{GNi|tMUSCjkQt|ufNOYRxdf{(+~}F;wG_7PWj#ebMLgv_%dHssuvJ$*Zl(R_tmnwpD($}y ztbXJ&HB44h)H!uteP|Vvd##$Ph9|2(C-aR*j0MI*|M6O6JZd~yC78}dZE{7Gc z5>~+y;9A4qQcxJ8jryLxW>51b^CRnH>zo`VN6S94udF7k%L=lhjFk=LP4Z@0N7j|4 zWNDc!C(5Dnb~#SoB?rn|Wqa8{wv?^pjk2q3BAdz*o|2x5o=ToO)a|ORYN|S`+f*yn zT-~EatGm<)m880=n^g~0*Sf)~Zq=|#TBWS(tn01PRvD|RRn015#aM-{Xsdx0Yt^>u zSoN&>R!ysxRoSXym9@%Q6|G8Ed8>jIZKfDI<+tK{(aY*>C0a@Tyi-uTV^F+HQ2a`{E@~?CMKerhk<+dFtZCN0{t_GS zxyy5pOKRCvPW6V|A-BqH@;BTMjxY}(b&_()6f&gy080N|6-ov{PB^w>aGf# zmy84Apy+AcZ1u2ivSLhWn$jaDTT`t`))dQBnba2fs=UZvoD&zsBgn^Lh%uDh`NCJi zkiUqZoT&I(Sn|C1SsW2Z#RuX;@rn3UBpJPp2AvBkk1l zw_1>&K7X@$vU@DUV=N46a~4@^)0`83^;y2yO8d{h)AquZ&WWjNn!2EVRi9XUtTA$| z>?ixn8nULWBrD4}87~uMFL{HkC(FpPa*~`ZhsojcZaH2Kl7nSO*-5sRZDcpuT_(t8 z@{l+z`da<1K2|>~o6I5aw`N*1tOxv8p9!A3J;`ZmzAuweDzDluUz3;gnJJZAh+G0= zj600c##sMx{Xt}vDdLoW7k?DlrIcsHX>nHU5qrgc@wvFwxXrl57-YnI8nLBUE_==C zW%e<@{L8O7Y3t`>{ylfHe5Iq|_&L|9>7$$~`9xQi<+Sp>DK8z3}MXYEj z9uW)JmAA!C@v5^+$lYR>*y@kxl;QGmu~-~3el&hG51Zc_-x(8)NyaQ|wl%=I#abv9 z;rotwQ*86EBgDJnEwSAnkC2gaiC8KQ8$TI8nMcg;jUSB3#uQ_YHP;$w-D<5jpEI8~ zUtoV%iA~}q5$SnGye2;7xU3eN#RiefvrfD&J|q5|Kg~7XrRV+ewce#C#4F-u5#@PS zydn1C|D@O=Hj3Py^R%?SaSvF{dnZ`ky9a^GH5kj(N1&FdEp)lpLF&@3%ZTS+rFZtP z9`(&f18>cW^A&8+-!P7uMjzAv;&RaLxI~?^KAuvqMtN8FpY`#Szfa?wosBpW(Hx5+ z_F3OpG!acjf@sDlPYcnKksgZ_G~syFqh2&kx5avl0JP?xmi4?+FSlWgwjI(rCb7iZ z2d&#dbQGN!AMYY=3|R6x1+S^&VT`1A>- z!P&0U^JylENjzm~WY?1^q&pSA3Eoyhc$cOzF4}|?b=^oHFV(z+vxe~3r0L>b^wY(C z$N^ZQ#SC#jOAnyC7e9S`eO904fpm4pxuyr#G5Q?#zxvb>{VzCP-LG*hX{D~Osdd)5 zexz?T1uf~7+fAnplI)X%KHkF^ANI9Mj-1JM>oZ=c|IXrXtS*KtgxR+L99t@pUCjO6 zYwN@n|MdRP^Io+cbXji0)$1Xy0Bt$O?f93^#YbQ9oORRtKg_;pbkIj6*8b~N{LVjt zwZeCd|IQrG_x3~=dh_;2OXrX0&S|qRf3E$WGtJjS(^v0BT)*9dZgU(QyA%H-(sw2O zqvc}p1T{0yP#qaA9;X+$*xw`jtJCx4QXdW9RUp=0igk7!>6Di5tgPql8~pEmWT&nN zY=A|lhnZHJ8q-JJ;QAX+$<+4dAT_3YCONp;HuCm3bYDCVS6BVyDSh7~ur)}#&D3_T zUg~DOwOHQ+>Ap;AaC+Xl+)_ho4G!!9={(Hz_8Vu~a+bFznV&m_wBgU4*-p7G<9^8b zmp1)B7Sj(X-9qsFQC6<+JX7Qd2>)G?+j^JR`R<{D@1S%U3);LQ-W8qezrH*9Sxk!&lYpM%X4Xu zAEedQ;bG>r_{K$q&|@2V9*Pcn3`Eyo9ny{ytn%u9@1ND;2}UK>h_&J=@w9kGtP{_& z>U!_U#`BC%yvX=RaM-|@h7&e2Lb91rj*P+<#&foM9kwwF^BQ9(PI!ZHke!V0TrRxH zxQ#Eo%{WkCc!x2a_k^CAlRoItTKz;pkM8MFTm58VKW?9kFZlbVe}%8a0spdKy!W8^ z#vA`ue8+R6A8gwpTmBf}n|ASVz^HLr%O8myVXXOR!1Iwmvaa?$&a;%0_BiKhamHT# zEb*gmZ?XteSWo&wY|?X^$50p zQlX!5#{1K3?0t@z!1D>8e@kR5?})a3YSG^B=d-5&+rc{m-r4Kdh3BG1Q|ksjm}HEA{BVerh9xe&Vag_$TlzM+p5Km}jbt{ZEloUDur^r`!5_UF~{1 z_sJRZe))i$DQDp`8|J`Vm?t0P??cR#;fcL`gue^G7Z%Dz%%XXW_~XpwTOyY-zmI3# zumV=XDp<|T3r1w+8vd@8Px1F@cm`6#I_77rm(R)PCSI5N`RLBe`U|m(85u&nCEvDvcFT9tc)yz_Cd7N*`1|q$09e)+llLVhW~O6TX~`hfge9+cn6Z{>ILd-;PrB!85L9ysod#w=@Lefho?zy`ro6=$Gn|DzXGbD zDx|Js=3HUs&lOQIs;DZail^~${7a~ks+20N%BZr;Oeyc`Q$bbq&Ni*WoW*L)T&$sL zs#;1vK}jF#sJiL~RZrDd4OA?1r&2xQn4{y1HDb1E6Yp|U=BuW9Fhavj3>|O5Q`SJe zv)qcAu5FmN(TkJA?{DF=NU+0o`Do$)GdY)@}i7g7h^;xjvjYBBL|~h(eG|V&$}`G?xx&ZComS#oUw=&^tfBn z<8DQtcobuVqs2Xp8zwU%IgwGtN%Wd0({G+a&v`0+=V|!di~Tw4{|T^GkSRY=;Q52evbS`d?mi6U-upTx$o)G{XqN>@gIpFCVq^*+Hs!g zpP;vOlK$2y;-`t9A%2$luk@BK(p&mXoTqPef!-0lCwYzz(s?dc7ns9h&<8T<1zF6L z@z4)4WH#d2iRU1mo4JE|==bDB=0_Hk1!NIsOO~SFQkt0#Wsqf&73i~6WF|x^W6IqA35p|gzaRag*GM1i5L;50d$arKE=0!ARW<&zA8L}n)kygx@XpL-x zY|k8u4)jMlB0C{(WG+QlW>a)Sc1PYsALC|bU?d`YA^Xsq=*tX^e#rjFfy~3Wm6;fW zkb{v!=_TCG42@yP;mA>P1bu>$atv}TavZ&YyXXhpjU10mrXMhop1>sJWaM-?jkfq< zTI2b&$B)n=FObXSLb-yrdL^y(D%$JS%zS+UpEcOmVt*RjGuYN)dluV9xtX?iGp*|u z+SgZUVYkr6zA8VYHT+1vCqI_&)AH@1?b}Q1_a5!v`?P#t$OE*1Un379kI`lwr`0-5 zi*<%J>mu#ZZ?s64kSWM4v`1NKk+Lb1*2PjeXmN7V=7iJgM9}U;V$X#=3VR-Gd9me3 ze?3?H!d&xvBBw<(k%yt6G2L0OVxq z`4npUROB?|eQLUz0khOhHAl@>^I*PuSS?VGsD<#TTBII>#p-dj1eP&tXgRD^PpGHV zlj>=;My*3Wi+o8vuQsR`)XVBcwF$WyxmCTYw!!P_HT4F(rFN>f)h@MLy{XWpbTjkkjb!^C*v_PBeNi{V?OcqMoy!M5pKj75xkuc$r}c_jN(QVZxZA- z${KliYauW1FXZFhh5Wp`P{62U6y)87Ld^cm!3=Iq73R3+fGS39(x^ikbxGp}FLjN2 z$a-iRl3qM%H6pFXq}7D9nvzxmX>~Qa7~PB;jqb=E$eWqvoCtl5B<85~HU=_ZvZ!W;4Ug>}F;&rU|weyGOvedv#?nN zikdNIF(_dcH%pl%dC#IW?@E;6U68W8V^NOxB+Bz1NCjpUmuBX08RjULWkzv1W(}8T zesTrg%4o=&6>+>d63-hMjd-h~F>j4DVGeRb<{8H^qdA`W$Bmd{+?d(SP0U2|X0sRc zW`bQzr4=$7J5!n8Ld$Q_Tm^ z&qO~9{cQAe(9cD`n0e|;n2WxY8Su-PqrRMZ=qs50z7qW^^sCW7f&NMKYtU~oH<+)Q zFPmGVg72KG%xZ#!f(8laEZ4PQt*-1 zF}l{rP18DQTGlDkW1TiLS!c{}E7FR9VpdVBIK){Et$1i|HL_Y*jjfhe6RVZg)M{-d zSZ%CkR$KJ#(6>k50ewgGozN#TC$E>)lR3CIF&Fn{W_tCo`V#L)yg%__%L9k%na2j%v7DqY_Un!{lp(2K9l%^ z%%FS-7Fds13$6LqBIM)Df?N!%cu!$9tYOyWT6l@~FE&`uST9@acw_8YYm>F!+H5_? zTVv1j{@4q=JN6>8_Mf)4V}A|%8`ySW+lg%#wqw>I>$vqJZ@3(`PFg?lX3G)lwDmLZ zTOGB|V*8cli!A5xWMfWXc277m0@={hfcdSlo_J&1R zc`Kxkr@N=Grw8w@_4M@j+~gVHxtaIZ5_yxY7jLm8@h(9(&u!R;V80#PFl@uIjld?d zR*onXUBus6y!qz#jXQK~-z>hPU-i2eJXum*Q<(BopZLk3uN$;N_f)tL_cPJwRtC_2 z3rovwxfu_QR;g5q5fi<{`DA#EIIDeP@p16`B>8>r&4W){d>s5f$$pQH)<44j_#urWUgCU`G_sJV zBkY48zfY3i=P~U=zWw-plKnmf^tQ;W7r%X}-##bupb1e>Ov@oLN(_lSDCXwcUTto! zgHdyHsp>wNHhyE|c5x$qH%2O{Wp3iRy;4an?+@P&S}Lh!N$e%jm&9MorMb3)mP%^b z3wtm0y|8Opgm@9JR8q@%q&JUr=8>M36|q-DUlD&T@6NRyv{X{d6ZoIN_lt-aI4Hh| z*bZ81-9a%nSBxBs-&of3N#%{dPTkP_R8;xE=O+y}=w6(72jUt#zMA9dg}klSaO}J| zagNh!jUAsv`d(Onl7{rXIC0XRq_N|l;qQg`XBzyyIB|SG)7bHXk=v^kzezlLYWqaf>ds$1UlAU+VxGogW%2*!f?t1tZCJ?_DE?|3+c*XEIh=C+qCVOT1 zh&WL`A_kIdne3J0@E?c&IQ)Gw*()33-w^+X`1@qCSMEi>7yVxJKAG&5VUcknEHVa? zY?S@yTSbJc9lR`XlIlGTAG4=ZX`%bHzZCEt9?S75rbp{}udwGTAE&;9mg$0{Hu6 zvR8hK{#*3lqW8&UudK~=`%~DOiP2H`iRI$(I($t0BD7?A8XRId5xEE=U<9m#g&CE=s-+T;AT-V=n# zI-7H9nGjQ$qFZCD5I+}D;%DmU&kT`yWjmjYW3t=Ny?o1Gavo|7&dKbYn-S2C_z>dX z(C$r(2HHA5vG%f~cjBb!^-1)}p2Zm5X9{f3Mz*9a_Qw18WYN4l@qj99V+J&a$05sb zAv#g_+Ep<{yAR2WBU#?Z^1eXH@)zWHCHc)oo$J9id$7$OY||^*rdP5}EhkWSCq!!E zAf~zv%Lk*pP^W$NB;@vLK4Mbs?HzkEI>q{$0DF?pK9}S4Dfy|%F+GSZO8i~qGRkZj zW$A~q^DaAjCr(*<^@%>&`G7}UI_?o;%}k;M`%#{9nhKdXMq%uKrKlvSxzLOAnC-j* zyTX&C<^!7)d@oW?O^{WPMQ%@}_)yM!o9gHt+M{#$Xauv=ZF=J4(2Qk=vn)IGV%ee9 zFrFUS?B^Kl=NRm#ti6&l^-ApfZAP-L!!mRZ2UvF4%6a1OIC_TV>W=x}H!!bUj&}D_Lry!((8(@S$W|($YMIO|w3LV;>3O@Dh55 zU(q{c;#|$du^fyXj7-xnqs{a8x!SVqK>tJcmHhpkXqNHygP*?-qy1nS=higNt7+`Z zG<`l1Uq*Zx@nyu5Xb=6+7A84#VA-KJ%dmv~9nCiVuB#f?K@f)x3pVr0IkgUIcmrSiu2kggMw=4BRMin0GT zuklDulf*hcVr1&F*4gppSw)h@@oPjH8qyiW<2j8Eemj1t@$G5!PMQnmW)=&UWfcpa z%PtnYmNV6-Bk5{L`zi9)k+i>hQHpwRq~>!0=e%!Q%00iYlb)sz>G%li!1|ihJjStZ zTxL5Srez%UCXT*g9Q7tHV!Mc=?!?hI)cZ2eMfMz(SRjB70LQ-sWBjqM(?TojE3;Wic&N zD65S+Fsa}e_89; zUYfY$$F{Y;INN@f?F=Uk&7C&)A~pT7eLx-xv;0T^t66sViDiwmo%on=5g!u?O2kL9 z9LaKIjEIk8IgVxej%oDm(Q_jb-#$p6ggyy9eZ)Zjwnf85+oF-6MB7{}=VCcmjA$Fr zay-kN6KV7v(04%3xsXQR8+~u|9REQ5eCm*9txYHPZ6jsyV|XfCS$5coEgL?O^kV`k zOxY!4)10)q0l!$vT$79CG3YgiY^tEEflZT(y5hjZMm@RF%NJ~CAZ0v|G9E}752TC- zQpN)*J&84sk42U5mq^px>H%6K4U9H{R_8TX=$dr`){DC1s~aWBfa z7iHXwGVVngr_oc!y(r^elyMq8W!#H0?nM~~>NiAfueO2uu^~!T*YaD+DhcYdU-j9q z`s`PI_NzYoRiFK;&wkZszv{DJY4q$@efFz9`;|t|e${8c>a$;g`ll%87VKLK_N@i` z)`ER&!M?R%-&(M5E!ejf>{}W=`__VeYr(#y(X($Y*tZt!TcCa|`?i*STFbs^*@Np$ zt7w%QBfqg6X*2vaKl>}UC`VsF({0`!G5KktaOnf!*)x^I;eusRcH_*>{iTF#zP2wi; zFOgp&&wP|h0_RHt=Su?TO9JOh0_RHt=Su?TO9JOh0_RH_J?BdT=Su?TOBy}rO9JOh z0_RJheqXf82G#b3$7F*>`(la52E^MEZ<`ulz_DMzF<-#3*RluaS`W^(9-M1EIM;e` zuJzzt>%qC!gLAD1=UN&)=UNZWwH};nY4n_HJvi5TaIOXF&yhcf(qjTgBQsd&f4G^0l7)X(>PEakOQ*{e;P~u_Ln&4-yzQ}ky+VijcK!x`=W)6$1P->P|N+pqI|?5+mkS1 zf22=(BSC*&W*_3{yLyQ_DB?6aj_gI=;~KH7acuVT5pAR2>&3C@ILpm+ntfQ-5ZA%G zz8&vEd+;pufh}-5ybTkfFn!9xtW!8@J7}rA@tTp_MNRHAYI2{UWhahjzPxcSB;-99 zHJsx$oa5J@p-2xXEe*5D61K;h2;Znd2g&Ee{VMoMvI0#B=*%_bt?S12n9+nTm9Gj(F7c?*0bmv%Y!F2d%tddVa5Ize(b)zbL|rmC%P_AZZK!h zO@-FXe=^gjviroyEt4x3d+n}loksNBGVIc`Urt!%`F!Ds6AQO(yJg|GQ<`o$w&T%l zId?C~R%}SQAIm>EX+-nSpIFyp-?a0i+PAAefAEgVt9O+&*6keM_0>~Z5A0|syXaDEY$Xb=98BR;YIK zCqHf7=B-8DPYtOs;Ary95kq>f7!x&S*Q7ADbH;^~Ewg?a)OPtV%g%2(Ip+2qzEb%A z`#UR}^logiEvIcZGu(Le4?c5STW07SV4Uy={R37FErv=UR05$A2$jH}D1pU?d@G0l z=##T-`6rSLtr{wUzpVrkzxO45;Pl_NiQkp*@xQp=V!3R!oWZ>)`fk9Y_?lTg!-^qL3g`l8c4J#K@%wrCvmx3RPzw=mvywQdKx z`-!&zy^Tsx#rA8$GK-=J+h}d;;sSKzY@JTi@q3qrImF{Zr-MrRh2@%{w|kt#UqSZ}%laK* z=Q#91m(SMe?dvjl1Ko@OzjzGqpqm|})8DBr6tJ$&-yU?61N`)Mr=in%bMm*1{0%}^ z99=cwc1>vA7cPFuF1lEBdY$s1^Q_k$flj|U9;n;kvhHLT-3%AqU|Uy}G+Fe13w;|4 z53;QH!?{ZsfQ}(HuMXiYzc-TG8_?-@_jP(Y=<@pv-6WQsZRqmT z-%KoK>$p`EwK$+(qtiYb7QMPgENHvd>ClUE8H0}7%rv@&=ybX1b6fjPAg;d~r*{xxf^{ogbf3HE7`{xm?hqHYm+kMhScg95*>$2VZTyzX`r`v8Jm%K3Ko6fJU%Xa6x z=)Q5$RdCtvSQp*vF1jo(d1>pSbFTB4y!B1j8T}%Mo5mmZ%+q&o$y6C=l(Uo(_-!K>56D~TZ zjZP$=PMMBy$umQ=>GG_Ht1lt6?Mtq z1Q*>GE;{}7m*8y-chPNe(U~rJY3`z%<)Yi^qO0zbKYf24oWDz~%YVKp<-6X`=KNDe zdffpRzwcahhh22XTy&>hbmv`k#mLK8@-`SKHgP-oE9Ii|xajmRX#}sUf7vHkm)k{G zz(rTsMYj%}zCH~CvM<_^zvo?ab6j)}yXY3V=$5$XR=Vi)FB}Btg)F5B$EW-5$fNJ| z$tds0g#ISC?g6HTSliy#mSOY;yk0?m9c_CLTbh)D@_D97?roYTIYo zGMw)~*lDKmTW8z1+A@sM8_T!tG=A^f_5*&uYD*xrKFzBEJfS)L|aDlO~_pMnnC3}!L~29rT*%Cl#Ab1+kU|BcO74~PM@B*->z@A z%*nS;^0@fL+V;c%zq~Gf6KwlpTjn6Wd@g=lZTtJS)ZbCh@8WmBwjcNVnS7_kWj`M9 z?MJvRb^R#l;#bJFm$79gd@P#@A!g z@5cz+KEakAe4<_aCfW8Gw$v#Vaq*jF+aIzeA0!YlE`AGa`{DqjM0WyZAkC+h4S$t{)}5erfB+M%%tQz^|lBdRuM#ySB{4Rj3qSTMa%Q2W)%v zO#A$&ww1;&EU3Q4+V&({Mld>E#>H=_ZJ%Y!a7J*;y7(=&?OXkR5qwuD{dN!7b}`F7 zui0*S7r$`ZUcr_*@vGqC7i-&Z3h=Aw;y2W`&#p2WZi?QuxY-y5StczbI+g>Zcuc3=yecRs1mImqZrZWH1_FtOY_O=0j@h*OyZF@Ic z@}sSyk&9oVZSND{*Vx5xplu&yOG$c7T>K{3_F1+JbQeXcP ze12&hx7v0wH}(40jGj(-P`O0g_E=l${zh{bzeL-<*q>frp1nr%FKsz*we1J|>E-4t zXX*XKJYT+IZ5d5#-ik9JHYmMB+djdT;q)R}yZHI;&UDXTKQq;TPo}W1UK!z)bNQ^I z5U+Xv9#1)G%U`@w_n>{x3Qwf)kk|WkPLIZ=q#R4pPb*VWj(g>~l$^x$IT4Q3bwSG% zKKh}h;y7q&_+@r)+~iv4^V7c?p>wK_gZB5y2$rMy#}nO4%;2VB91J5NT%1dphFk$} zz=4zl{QVBba1I?uo`MVTD_n%*DHl>MrToUyC2#B$%PHQav*>+G$B}v|FzEiRE+3!t zl?JzS>>&>h3BG-kluULsCT&nodd`*nUli6~6V_i9cEXGLUBy_PVsN;qlTDXijS~9q zPNz=)ImWj&OB6Gm6b$-%k+hIG*l!O{KlL|>_4kMm@dZ2mP2z-hoKK5`x8;lLEe5Y2 z?4S0#+4`x46MXsoC+!^qe)%RaXXlLnFH2Ug3YF63P-_BRReP8?zOiQ2HDJkC5#;?9o`hG|6 z!o{GqdDhQeP(JQm@^aS{MUP&830r>$`+)eGFJXVhTIYJDO~W7ao)A}Bo0^#6`f0bH ze(P+XqIM1Gw(qt!+s|kun_(%U)lYJ7hN z`hSJO_X`vOChrOPPuK51TmR~ zS4!V)?Z7<#uwM6JnIHL_Pp)`!#RkxSz5lk_VeQu4TbB@?U9n>2)~%oHJFxZJt%naE zI52JTKH%Fx$~E`R>eF3^Io-RDnl*>NsbS#oS>4+c zv}W|U(UZG(AKLwnXGV=m_2@oD|A2(Chkv`}W$Hq(Dw#_7L0v}x3Vzm2-Y_lQl@@zl_# z-)*=TpQBDdIILcBZ`g19wiolR{_A4)(JpE;D>{g1&8F+;>lu zstJx;LH>U>uJ2Y-x26x+pO0JIwPp10&u&j2)<5&_O54vU@7kt+y*HzO`j>q(`sbVn zPGtzbKh|~3@o|&du0x;WVex88{32*C@*4phq`!l?#J|@C|$m z-@*6r0~~@MA$WiEoT)#vKj&HhkL=Gd@}TDr=s7GSVHAu8J?C&N=x5J&!Z^4K?uPL& z0q%ihmK7QfcxPAm&5fpzdK=y}D@!SnC}=y{Yc!3KC4 zHo_*@46nczconw7HrNiY!Rzn_?0}uH3*Lmc;BD9q@4&n89=s23Ep}G)l_3HOK{ONr zZ;<@-Jpc6{`>(#hdxPRL*)&pN{-7OD68x&LFmIecS?r+OH5~$6yo-)qw}2T1-N0rP zQd=eCuDfLLe<`gwpJ>(}G>dW>F=zc+>E&;nXPYiI*) zp&hh`4$v98Kv(Dn-Ju8cgqt7{lAt&Ag?`W<2EZ*a5N?G*Fc^k0W;Pr~z(^Ryc=l)* z17qP1xD&>~U2r#yhY4^GB*R3Q1e0M3OoeGM9qxtuUA1+!re%!PUIAUp&Q z!+dyzC+`bjAuNJNIf{?L;~dGwumqOEGFT2PU?r^LD6fVm;7M4+5nl^W!PD>zM}HkW z3+v%I&V=XT1$Yr&;;h&JFT+OI#2K*}UV$y}Drd)5*aq9-HO`dR;SJaUJ2`81!JF_F zyv-T38{UC;;XTf#_u&KYcy%RyE2R>@l~Re{N~y${btOivEAtB}l^MaVOq*PpHn}ow za%I}&DzwQ}Xp^go1MoE*gm2(m_zu2@AK(!D2#4V(&eS9DGaQ9ua2!s+NjL?k;S8LG zUpTAJ!FjjmFmKfHG~NkcpwvmL1xGTSs@!_ha8Yo))e6o z0g;eP))G;W8}dM2$OrkM02G8mvNpdwS4Uhg>x#m%o`{z9MG@IR#K?xCsEiZEWV|RY z8;KIKu_y_ppfr?$vQSPo5#^x*RD?=U8LG&p+=Da~)u1}mfSOQCCh+TW38D_vg&UwA z)R!$p1Biu&5C`$lNVXD;41`-@5DbRf?ZDnac~#h4dY>g>>=)fWS9t(U@|-`d-6MPJ;fui z02aa`coZIk$6+xnfu*nvmct5I39Dc=JONL_8dwWY!PD>ztb=D^Jv;}`!wc{tyaXHI zWtk{8%3flVOybwx`iNI#U$I5@6R*Nn*aq9-HF#b27jGbUz)m@Y-+CJ&-jqZ6wYOyP zwwx$-%SqxLIa$2RUEh0hs(2qhfDhp#_!#!UUibt)h0kCg?1#_c3pq`E317hh_!;8ABYQl#OYVK2*1H4NCBZf z77~=&D-1Bf0uN+@Fvtv9AS+~p?2rR;LO4V~B;jfg3?e1%0f9P4;7#yR8n01)aRm#`a)DyUy5q#D^Xn?5H-}- zqNX}1YN>BTZK$KZ6?N5j;s&Uvz8CeOf%-wjLPK>(#Hk-eygDozGyKp5ngYM2CYu5C ziDe5qge{>Jw5Dg+2HHY9hBVsqLnR74Q`zNk7y%fuoj+zr{Nh`2hYNKcn+Rd`Na$HBD@3};APkdn_x4%0$bo! zHC1edZLl3)<6L?j-hdsjQ#F>m;7xc7-iF=q4!jHR!Taz5e59Jlk6{n&g-_s9_zd>J ze)t@|fG<^3`4t?1ui+qk1K+}T@ICwhhu}w*AP=i%@+Z|?9#Jji&#I+7s#?ios z+Q<{Ctvrc51*cg)gFLI+$zR|coQDhWD_m6VMGKaBI=7eyFfJn#%QIH$*KwiiP`Jn(5ghFr~Tn~jI8j3&+6oq0?97;kd zC=F$y9F&I&P!TFYWvF6ol2xG^REHYqYCVxb|+amaXR1dX8y zG=&6c2F;-bw1igB8rncxXb0_~19XH=&>6ZIo8^tr6}mxp=m9qw@5!5u_hq8-k?dvc zkx9m0*&F&mU+4$@VSw?8yahQBc`I@d3}*Q@1Uw0AU@bfaPs20DA-N8oh4t_p zJP$9xi|~@sSZ;uqVIypU&F~6rfmdNGY=iCa8oUl~zz*06yWmZD3*Ls^@D98S@4@@< z0elD_!N;%%_QEIdDSQU|V88LB{2ac3FX1aV0ACx2?_IUpy5Lj*)ZE{HN4tK4Q2m51fLkPq@h0VoKC z%%afuc|hibDw~38kR4*<6)@vQQ4nLj|Y^m7p?IfvQjqszVK^ z3ALa$)PcHi1Jr~1&;Vkgq1j5sK|C~q#=tL&siu$s&7e87fR@k-T0o%r0sn zEP_YjF?bvn!xC5u%V0UIfR(TcR>KqUB&>n8@Dw}^&%io(7S@|Ls^{Q&cmZBCd#abr zM76=}rCx@Oun9K9E3gG#g{`m+w!>@iI=lfpU?=Q?H{mUK8+OAx@GiUu@0&^L1GBgK z5I%yBVGrzuPvBGd4EDi(_#D1~FX1aV0AIsF_~!rGdlUG$s`~$Xnl_;zl&}Z|frh;- zEi;p)DT|~{rfukwAxRh3$t0OJ(%w!{1j=HDU z^7hV;=N+8CHt!Ia8Tsq-ieL`SZ_PUl=IH#kyqPe^G`;IRoZQn6qHc&c8hG9GG)qA}|dwQJ6-UCYWZJ7|d#zH83stSLDTE*21iVY0bYf zuMMUhCIOR#IS(cU(*cu)>4fQmSr5|<(*tup%x7ROfVmLnBAAO|dSNbsxfJFyn9K98 z%DV#QN|>u)Ho#mBa}5mkyvw@|=6aYLV6f+1USIx(yc=O|g1H&ybNScieIDi(m|OF& z&)b-PL*8vLx5In^=8G_2%KvQM9WZyo^uv5P|MPiw<=>L`mHb=tzM8)=@9zBD^1hb; zg}krle=%=U{+IIZ$-g7-8~JzUeG}$hnEPPv&tEXwymb^zntUM4 zrwZ~W9|Uu7!KITADY$I%jDpK27ZqGR`Ot!ECLacKc)_)kk0|)Yn|xfs{gaP}nN{$u$+KZjDEQ7~KTH572vc0}-N_{d4^1vBcxTFq1@BHd z3FhR2e@rA(#a)3k&`=Wf4p@%xN%-VV1xwg;@qu z0~3Zh9i|qhuHb_y^#%W#vb^BKDJu#-nzFLs<0-2OCgq<|ke7dE!NN&r!JG|q4$QeQ z5ts&;C`=lCJ_B6Uhs+hD++eczp`MD z{1+x;jedM1c!~NV)n1QF=GDsg#C@Rn=Q{=e9S%JiD)z<4N8aK5^~MO_9r z@xQD<{k;PJ_-B3h6MI>Q20_ukrS47eC-w`WV*fhbVU`0Io}alfDZFf7IXG=`rFdvV_jdN}l-Q#77dxC;-`{!IKW{96PT|No@@8}JV+ z--nE+2#(^u4J`JBP)XO%>Ao6&i~BF&csO)V+JB6Agy+LZxHEBlQTg^M_A+l;;<4Ap zm`!_GZ$ebemfE&{{9UWe=-=U2%1NK`Sgd+P?kN0)mY)*XSjbc9Cqxr z+$Yg}3d0?W^TI!?%pQzC;LZAb2G3W@@-Qq##or(KxA^-r|Cao*e|~rpzp@sEXn;Bm zekIJo_)q-X<^KO~`B{v7-3{k=Cd!}aBI+_~J@wc0C(AjDzaLSzP%ovwB(;lr0rh42 zdzSh<^#$sw)LB$JU31ARsUhlOs!S)4^lYSFNtNlgVlUHcLJ8Mhsh3k5s2ixw)a$5!K{=B0_&m#%tj*^xhm+tY<5Hp>v%BKyxn*<9W-p1i z%IJw5`vqnPXZv?7h{v}%Hpb&f*i#mp!S5`p{5|xp{EvM8hiYM$M%lD@6f&C~&EA9Vw@h1x)^pq5jo zQwymhS7`j(s9UIm)PCwlYBx1W4O16UXHtu(KI-<%c^=du>Hu{Ubpy4R+CW`JEvNda zh199kZI|hBhN*+p&D4$5K5CNMLS00ypcYZ5Q@3BL@sCi4s9UI;sQuJlYBzNiHB9wW zXHut9(V=Kv_u)&JZ`94y0csz01GRRl4sUy7_|2FCt>L9hBx{=yVO;W?u zMbw$pBC3zN{bHU6b%;7Z-9+6$?WHzQS5eEUerh3gDs|gM%s1*Fbu)D%wU3&lwon&Q zE2u@(>D28PYWySAA?gpZ-Rp>bEZi#`J`22TU`p;D6H_2k|Im2V># z%~0+q`)4ZONA5pC`B8EhLyzRQg*-@phFn;t?k|!3t{d964xq&?RX?0&m9tkOT*j%lA1-W9e@(tu(=|I5m3*?3x<$G-ZVdaO( zg{Lb&ZoAhiKS>_0Q~ra^%az|GCs!(CK%#ZM2FZJp`_ESQgUP*7<>Sc>jmjsH{Y}cJ zfu%fzo0Vg9?~g0rPWK`5!*s7$r|u)<2J);bOmuc|qFvn=lKaS4k^KpEA0&s#e;^N})ctL+obP}P{Kjv_0+z3fl+$2ww>p9#5751+ zSKToHRMSH~4J`hXm#KRXd62x3JWT#6!w+7m{x4Xh@fBXBT#Rxj=i5Mjl{`S6dYZZq zlV^|zH)!}Ka>Lci{a{I7kql19?=`v)+@L&nvBuZ?S>-5sfP6K1nEY*WVW0Z{J-LEB zX$j*a&ma$wPazMJ&mvnLWQekd?7vatzm=RM-%B1KKTaOHN&UY}wg%k8YLBIw9{;UrZh%f6w+WgZJ^<4fnlVpAqsba?$72eI+?eKA+r2{wjHh`~=x|i-v!j z>?iMAqsL2

Oz1Hv3J>w^@BKMIy$s^>ikqdX# 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 delta 91039 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 +#endif + #if !defined(_MSC_VER) || !defined(_KERNEL_MODE) #include #endif diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/mips.h b/Lilu.kext/Contents/Resources/Headers/capstone/mips.h old mode 100644 new mode 100755 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/platform.h b/Lilu.kext/Contents/Resources/Headers/capstone/platform.h old mode 100644 new mode 100755 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/ppc.h b/Lilu.kext/Contents/Resources/Headers/capstone/ppc.h old mode 100644 new mode 100755 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/sparc.h b/Lilu.kext/Contents/Resources/Headers/capstone/sparc.h old mode 100644 new mode 100755 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/systemz.h b/Lilu.kext/Contents/Resources/Headers/capstone/systemz.h old mode 100644 new mode 100755 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/x86.h b/Lilu.kext/Contents/Resources/Headers/capstone/x86.h old mode 100644 new mode 100755 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/xcore.h b/Lilu.kext/Contents/Resources/Headers/capstone/xcore.h old mode 100644 new mode 100755 diff --git a/Lilu.kext/Contents/Resources/Headers/kern_api.hpp b/Lilu.kext/Contents/Resources/Headers/kern_api.hpp index a7919cf..5aaa976 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_api.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_api.hpp @@ -39,14 +39,15 @@ class LiluAPI { UnsupportedFeature, IncompatibleOS, Disabled, - TooLate + TooLate, + Offline }; /** * Minimal API version that guarantees forward ABI compatibility * Present due to lack of OSBundleCompatibleVersion at kext injection */ - static constexpr size_t CompatibilityVersion {parseModuleVersion("1.1.0")}; + static constexpr size_t CompatibilityVersion {parseModuleVersion("1.2.0")}; /** * Obtains api access by holding a lock, which is required when accessing out of the main context @@ -64,12 +65,24 @@ class LiluAPI { * @return Error::NoError on success */ EXPORT Error releaseAccess(); - + + /** + * You are supposed declare that your plugins work in at least one of these modes + * It is assumed that single user mode is equal to normal, because it is generally + * used to continue the load of a complete OS, and by default Lilu itself ignores it. + */ + enum Requirements : uint32_t { + AllowNormal = 1, + AllowInstallerRecovery = 2, + AllowSafeMode = 4 + }; + /** * Decides whether you are eligible to continue * * @param product product name * @param version product version + * @param runmode bitmask of allowed enviornments * @param disableArg pointer to disabling boot arguments array * @param disableArgNum number of disabling boot arguments * @param debugArg pointer to debug boot arguments array @@ -82,7 +95,7 @@ class LiluAPI { * * @return Error::NoError on success */ - EXPORT Error shouldLoad(const char *product, size_t version, const char **disableArg, size_t disableArgNum, const char **debugArg, size_t debugArgNum, const char **betaArg, size_t betaArgNum, KernelVersion min, KernelVersion max, bool &printDebug); + EXPORT Error shouldLoad(const char *product, size_t version, uint32_t runmode, const char **disableArg, size_t disableArgNum, const char **debugArg, size_t debugArgNum, const char **betaArg, size_t betaArgNum, KernelVersion min, KernelVersion max, bool &printDebug); /** * Kernel patcher loaded callback @@ -189,7 +202,12 @@ class LiluAPI { * Api lock */ IOLock *access {nullptr}; - + + /** + * Defines current running modes + */ + uint32_t currentRunMode {}; + /** * No longer accept any requests */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_compat.hpp b/Lilu.kext/Contents/Resources/Headers/kern_compat.hpp new file mode 100644 index 0000000..7c0d49b --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_compat.hpp @@ -0,0 +1,78 @@ +// +// kern_compat.hpp +// Lilu +// +// Copyright © 2016-2017 vit9696. All rights reserved. +// + +#ifndef kern_compat_hpp +#define kern_compat_hpp + +#include +//Actually do not include to catch real errors +//#include +#include + +// Please do not use memcpy and similar functions, since they compile +// to macros unsupported by any other system with 10.13 SDK unless +// Availability.h header is included. +#define lilu_os_memcpy(...) (memcpy)(__VA_ARGS__) +#define lilu_os_memmove(...) (memmove)(__VA_ARGS__) +#define lilu_os_strncpy(...) (strncpy)(__VA_ARGS__) +#define lilu_os_strncat(...) (strncat)(__VA_ARGS__) +#define lilu_os_strlcat(...) (strlcat)(__VA_ARGS__) +#define lilu_os_strlcpy(...) (strlcpy)(__VA_ARGS__) +#define lilu_os_strcat(...) (strcat)(__VA_ARGS__) +#define lilu_os_bcopy(...) (bcopy)(__VA_ARGS__) + +// Additionally disallow the use of the original functions +#ifndef LILU_DISABLE_MEMFUNC_REDEFINE + +#ifdef memcpy +#undef memcpy +#define memcpy(...) _Pragma("GCC error \"Avoid memcpy due to 10.13 SDK bugs!\"") +#endif + +#ifdef memmove +#undef memmove +#define memmove(...) _Pragma("GCC error \"Avoid memmove due to 10.13 SDK bugs!\"") +#endif + +#ifdef strncpy +#undef strncpy +#define strncpy(...) _Pragma("GCC error \"Avoid strncpy due to 10.13 SDK bugs!\"") +#endif + +#ifdef strncat +#undef strncat +#define strncat(...) _Pragma("GCC error \"Avoid strncat due to 10.13 SDK bugs!\"") +#endif + +#ifdef strlcat +#undef strlcat +#define strlcat(...) _Pragma("GCC error \"Avoid strlcat due to 10.13 SDK bugs!\"") +#endif + +#ifdef strlcpy +#undef strlcpy +#define strlcpy(...) _Pragma("GCC error \"Avoid strlcpy due to 10.13 SDK bugs!\"") +#endif + +#ifdef strcat +#undef strcat +#define strcat(...) _Pragma("GCC error \"Avoid strcat due to 10.13 SDK bugs!\"") +#endif + +#ifdef bcopy +#undef bcopy +#define bcopy(...) _Pragma("GCC error \"Avoid bcopy due to 10.13 SDK bugs!\"") +#endif + +#endif /* LILU_DISABLE_MEMFUNC_REDEFINE */ + +// This may not be nice but will protect users from changes in KernInfo strcture. +#ifndef LILU_DISABLE_BRACE_WARNINGS +#pragma clang diagnostic error "-Wmissing-braces" +#endif + +#endif /* kern_compat_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_compression.hpp b/Lilu.kext/Contents/Resources/Headers/kern_compression.hpp index a656914..4e4fba9 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_compression.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_compression.hpp @@ -15,38 +15,56 @@ #include #include -/** - * CompressedHeader constants - */ -static constexpr uint32_t CompressedMagic {0x706D6F63}; //comp -static constexpr uint32_t CompressionLZVN {0x6E767A6C}; //lzvn -static constexpr uint32_t CompressionLZSS {0x73737A6C}; //lzss - -/** - * CompressedHeader structure - */ -struct CompressedHeader { - uint32_t magic; - uint32_t compression; - uint32_t hash; // adler32 - uint32_t decompressed; - uint32_t compressed; - uint32_t version; - uint32_t padding[90]; -}; - -/** - * Typed decompressing function - * - * @param compression compression type - * @param dstlen decompression buffer size - * @param src compressed data - * @param srclen compressed data size - * - * @return decompressed buffer - */ -EXPORT uint8_t *decompressData(uint32_t compression, uint32_t dstlen, uint8_t *src, uint32_t srclen); +namespace Compression { + /** + * Compression constants and modes + */ + static constexpr uint32_t Magic {0x706D6F63}; //comp + static constexpr uint32_t ModeLZVN {0x6E767A6C}; //lzvn + static constexpr uint32_t ModeLZSS {0x73737A6C}; //lzss + + /** + * Compressed header structure + */ + struct Header { + uint32_t magic; + uint32_t compression; + uint32_t hash; // adler32 + uint32_t decompressed; + uint32_t compressed; + uint32_t version; + uint32_t padding[90]; + }; + + /** + * Typed decompressing function (currently for lzvn and lzss) + * + * @param compression compression type + * @param dstlen decompression buffer size + * @param src compressed data + * @param srclen compressed data size + * @param buffer preallocated buffer to use + * + * @return decompressed buffer (must be freeded by Buffer::deleter if not preallocated) + */ + EXPORT uint8_t *decompress(uint32_t compression, uint32_t dstlen, const uint8_t *src, uint32_t srclen, uint8_t *buffer=nullptr); + + /** + * Typed compressing function (currently for lzss) + * + * @param compression compression type + * @param dstlen maximum compression buffer size + * @param src uncompressed data + * @param srclen uncompressed data size + * @param buffer preallocated buffer to use + * + * @return compressed buffer with its actual size in dstlen (must be freeded by Buffer::deleter if not preallocated) + */ + EXPORT uint8_t *compress(uint32_t compression, uint32_t &dstlen, const uint8_t *src, uint32_t srclen, uint8_t *buffer=nullptr); + +} + #endif /* LILU_COMPRESSION_SUPPORT */ #endif /* kern_compression_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_config.hpp b/Lilu.kext/Contents/Resources/Headers/kern_config.hpp index fe4116a..d5cdbf2 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_config.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_config.hpp @@ -8,11 +8,25 @@ #ifndef kern_config_hpp #define kern_config_hpp -// As for now claim to support all the features +/** + * Enable kext patching support + */ #define LILU_KEXTPATCH_SUPPORT 1 + +/** + * Enable compression and decompression support + */ #define LILU_COMPRESSION_SUPPORT 1 -// Use these in plugins in Xcode Project Preprocessor Macros section +/** + * Enable advanced disassembly API based on capstone + */ +// #define LILU_ADVANCED_DISASSEMBLY 1 + +/** + * Specify custom initialisation code + * Use these in plugins in Xcode Project Preprocessor Macros section. + */ // #define LILU_CUSTOM_IOKIT_INIT 1 // #define LILU_CUSTOM_KMOD_INIT 1 diff --git a/Lilu.kext/Contents/Resources/Headers/kern_crypto.hpp b/Lilu.kext/Contents/Resources/Headers/kern_crypto.hpp new file mode 100644 index 0000000..d8fc594 --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_crypto.hpp @@ -0,0 +1,111 @@ +// +// kern_crypto.hpp +// Lilu +// +// Copyright © 2017 vit9696. All rights reserved. +// + +#ifndef kern_crypto_h +#define kern_crypto_h + +#include +#include +#include + +namespace Crypto { + /** + * Currently this is equal to both key size and block size + */ + static constexpr uint32_t BlockSize = 16; + + /** + * Currently this is guaranteed hash size + */ + static constexpr uint32_t MinDigestSize = 32; + + /** + * Encrypted data format + */ + struct PACKED Encrypted { + uint8_t iv[BlockSize]; // Initialisation vector + struct PACKED Data { + uint32_t size; // Actual encrypted buffer size + uint8_t buf[BlockSize - sizeof(uint32_t)]; // Encrypted buffer >= BlockSize + }; + + union { + Data enc; + uint8_t buf[BlockSize]; + }; + }; + + /** + * Securely erase memory buffer + * Based off cc_clear from corecrypto (src/cc_clear.c) + * + * @param len buffer length + * @param dst buffer pointer + */ + inline void zeroMemory(size_t len, void *dst) { + auto vptr = reinterpret_cast(dst); + while (len--) + *vptr++ = '\0'; + } + + /** + * Generates a platform specific encryption key to be used for later encryption/decryption. + * Use very cautiously, this generates a key that should be reproducible on the same hardware. + * This means that the key is NOT meant protect the data from decryption on the same machine, + * but it only tries to circumvent cases when some blobs containing sensitive information + * (e.g. nvram dumps) were accidentally shared. + * + * This is currently UNIMPLEMENTED + * + * @param seed prefixed data blob used for key generation + * @param size seed size + * + * @return generated key of at least BlockSize bits long (must be freeded by Buffer::deleter) or nullptr + */ + EXPORT uint8_t *genPlatformKey(const uint8_t *seed=nullptr, uint32_t size=0); + + /** + * Generates cryptographically secure encryption key (from /dev/random) + * + * @return generated key of at least BlockSize bits long (must be freeded by Buffer::deleter) or nullptr + */ + EXPORT uint8_t *genUniqueKey(uint32_t size=BlockSize); + + /** + * Encrypts data of specified size and stores in Encrypted format + * + * @param key encryption key returned by genUniqueKey, genPlatformKey (default if null) + * @param src source data + * @param size data size, encrypted size is returned on success + * + * @param encrypted data in Encrypted format (must be freeded by Buffer::deleter) or nullptr + */ + EXPORT uint8_t *encrypt(const uint8_t *key, const uint8_t *src, uint32_t &size); + + /** + * Decrypts data of specified size stored in Encrypted format + * + * @param key encryption key returned by genUniqueKey, genPlatformKey (default if null) + * @param src source data + * @param size data size, decrypted size is returned on success + * + * @param decrypted data (must be freeded by Buffer::deleter) or nullptr + */ + EXPORT uint8_t *decrypt(const uint8_t *key, const uint8_t *src, uint32_t &size); + + /** + * Calculate digest of given size + * + * @param src source data + * @param size data size + * + * @return digest hash of at least MinDigestSize bytes (must be freeded by Buffer::deleter) or nullptr + */ + EXPORT uint8_t *hash(const uint8_t *src, uint32_t size); +} + +#endif /* kern_crypto_h */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp b/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp index 2243217..ba1b9ca 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp @@ -8,13 +8,15 @@ #ifndef kern_disasm_hpp #define kern_disasm_hpp +#include +#include + +#ifdef LILU_ADVANCED_DISASSEMBLY #ifndef CAPSTONE_HAS_OSXKERNEL #define CAPSTONE_HAS_OSXKERNEL 1 #endif - -#include -#include #include +#endif /* LILU_ADVANCED_DISASSEMBLY */ #include #include @@ -36,6 +38,8 @@ class Disassembler { static constexpr size_t MaxInstruction {15}; public: +#ifdef LILU_ADVANCED_DISASSEMBLY + /** * Initialise dissassembling framework * @@ -49,6 +53,8 @@ class Disassembler { * Deinitialise dissassembling framework, must be called regardless of the init error */ EXPORT void deinit(); + +#endif /* LILU_ADVANCED_DISASSEMBLY */ /** * Return the real instruction size contained within min bytes @@ -60,6 +66,8 @@ class Disassembler { * @return instruction size >= min on success or 0 */ EXPORT static size_t quickInstructionSize(mach_vm_address_t ptr, size_t min); + +#ifdef LILU_ADVANCED_DISASSEMBLY /** * Reads size bytes from addr and disassembles them. @@ -148,6 +156,8 @@ class Disassembler { * @return direct address of pattern start on success, else 0 */ EXPORT mach_vm_address_t disasmSig(mach_vm_address_t addr, evector &sig, size_t num, size_t lookup_size); + +#endif /* LILU_ADVANCED_DISASSEMBLY */ }; #endif /* kern_disasm_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp b/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp index b37953b..7958311 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp @@ -39,13 +39,13 @@ namespace WIOKit { auto data = OSDynamicCast(OSData, obj); if (data && data->getLength() == sizeof(T)) { value = *static_cast(data->getBytesNoCopy()); - DBGLOG("iokit @ getOSData %s has %llX value", name, static_cast(value)); + DBGLOG("iokit", "getOSData %s has %llX value", name, static_cast(value)); return true; } else { - SYSLOG("iokit @ getOSData %s has unexpected format", name); + SYSLOG("iokit", "getOSData %s has unexpected format", name); } } else { - DBGLOG("iokit @ getOSData %s was not found", name); + DBGLOG("iokit", "getOSData %s was not found", name); } return false; } @@ -86,7 +86,7 @@ namespace WIOKit { struct ComputerModel { enum { ComputerInvalid = 0x0, - ComputerLaptop = 0x1, + ComputerLaptop = 0x1, ComputerDesktop = 0x2, ComputerAny = ComputerLaptop | ComputerDesktop }; diff --git a/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp b/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp index aa16c9b..a31b754 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp @@ -18,14 +18,17 @@ #include #include #include +#include class MachInfo { mach_vm_address_t running_text_addr {0}; // the address of running __TEXT segment mach_vm_address_t disk_text_addr {0}; // the same address at from a file mach_vm_address_t kaslr_slide {0}; // the kernel aslr slide, computed as the difference between above's addresses -#ifdef LILU_COMPRESSION_SUPPORT - uint8_t *file_buf {nullptr}; // read file data if decompression was used -#endif /* LILU_COMPRESSION_SUPPORT */ + uint8_t *file_buf {nullptr}; // read file data + OSDictionary *prelink_dict {nullptr}; // read prealinked kext dictionary + uint8_t *prelink_addr {nullptr}; // prelink text base address + mach_vm_address_t prelink_vmaddr {0}; // prelink text base vm address (for kexts this is their actual slide) + uint32_t file_buf_size {0}; // read file data size uint8_t *linkedit_buf {nullptr}; // pointer to __LINKEDIT buffer containing symbols to solve uint64_t linkedit_fileoff {0}; // __LINKEDIT file offset so we can read uint64_t linkedit_size {0}; @@ -37,7 +40,8 @@ class MachInfo { size_t memory_size {HeaderSize}; // memory size bool kaslr_slide_set {false}; // kaslr can be null, used for disambiguation bool allow_decompress {true}; // allows mach decompression - + bool prelink_slid {false}; // assume kaslr-slid kext addresses + /** * 16 byte IDT descriptor, used for 32 and 64 bits kernels (64 bit capable cpus!) */ @@ -52,21 +56,21 @@ class MachInfo { }; /** - * retrieve the address of the IDT + * Retrieve the address of the IDT * * @return always returns the IDT address */ mach_vm_address_t getIDTAddress(); /** - * calculate the address of the kernel int80 handler + * Calculate the address of the kernel int80 handler * * @return always returns the int80 handler address */ mach_vm_address_t calculateInt80Address(); /** - * retrieve LC_UUID command value from a mach header + * Retrieve LC_UUID command value from a mach header * * @param header mach header pointer * @@ -75,7 +79,7 @@ class MachInfo { uint64_t *getUUID(void *header); /** - * enable/disable the Write Protection bit in CR0 register + * Enable/disable the Write Protection bit in CR0 register * * @param enable the desired value * @@ -84,8 +88,8 @@ class MachInfo { static kern_return_t setWPBit(bool enable); /** - * retrieve the first pages of a binary at disk into a buffer - * version that uses KPI VFS functions and a ripped uio_createwithbuffer() from XNU + * Retrieve the first pages of a binary at disk into a buffer + * Version that uses KPI VFS functions and a ripped uio_createwithbuffer() from XNU * * @param buffer allocated buffer sized no less than HeaderSize * @param vnode file node @@ -98,7 +102,7 @@ class MachInfo { kern_return_t readMachHeader(uint8_t *buffer, vnode_t vnode, vfs_context_t ctxt, off_t off=0); /** - * retrieve the whole linkedit segment into target buffer from kernel binary at disk + * Retrieve the whole linkedit segment into target buffer from kernel binary at disk * * @param vnode file node * @param ctxt filesystem context @@ -108,14 +112,31 @@ class MachInfo { kern_return_t readLinkedit(vnode_t vnode, vfs_context_t ctxt); /** - * retrieve necessary mach-o header information from the mach header + * Retrieve necessary mach-o header information from the mach header * * @param header read header sized no less than HeaderSize */ void processMachHeader(void *header); + + /** + * Load kext info dictionary and addresses if they were not loaded previously + */ + void updatePrelinkInfo(); + + /** + * Lookup mach image in prelinked image + * + * @param identifier identifier + * @param imageSize size of the returned buffer + * @param slide actual slide for symbols (normally kaslr or 0) + * @param missing set to true on successful prelink parsing when image is not needed + * + * @return pointer to const buffer on success or nullptr + */ + uint8_t *findImage(const char *identifier, uint32_t &imageSize, mach_vm_address_t &slide, bool &missing); MachInfo(bool asKernel, const char *id) : isKernel(asKernel), objectId(id) { - DBGLOG("mach @ MachInfo asKernel %d object constructed", asKernel); + DBGLOG("mach", "MachInfo asKernel %d object constructed", asKernel); } MachInfo(const MachInfo &) = delete; MachInfo &operator =(const MachInfo &) = delete; @@ -135,12 +156,13 @@ class MachInfo { /** * Specified file identifier */ - const char *objectId {nullptr}; + EXPORT const char *objectId {nullptr}; /** * MachInfo object generator * * @param asKernel this MachInfo represents a kernel + * @param id kinfo identifier (e.g. CFBundleIdentifier) * * @return MachInfo object or nullptr */ @@ -150,12 +172,14 @@ class MachInfo { /** * Resolve mach data in the kernel * - * @param paths filesystem paths for lookup - * @param num the number of paths passed + * @param paths filesystem paths for lookup + * @param num the number of paths passed + * @param prelink prelink information source (i.e. Kernel MachInfo) + * @param fsfallback fallback to reading from filesystem if prelink failed * * @return KERN_SUCCESS if loaded */ - EXPORT kern_return_t init(const char * const paths[], size_t num = 1); + EXPORT kern_return_t init(const char * const paths[], size_t num = 1, MachInfo *prelink=nullptr, bool fsfallback=false); /** * Release the allocated memory, must be called regardless of the init error @@ -221,12 +245,12 @@ class MachInfo { /** * enable/disable kernel memory write protection * - * @param enable the desired value - * @param sync for synchronous execution, calls in the middle will be ignored + * @param enable the desired value + * @param lock use spinlock to disable cpu preemption (see KernelPatcher::kernelWriteLock) * * @return KERN_SUCCESS if succeeded */ - EXPORT static kern_return_t setKernelWriting(bool enable, bool sync=false); + EXPORT static kern_return_t setKernelWriting(bool enable, IOSimpleLock *lock); /** * Compare the loaded kernel with the passed kernel header @@ -250,6 +274,11 @@ class MachInfo { * @param cpu cpu to look for in case of fat binaries */ EXPORT static void findSectionBounds(void *ptr, vm_address_t &vmsegment, vm_address_t &vmsection, void *§ionptr, size_t &size, const char *segmentName="__TEXT", const char *sectionName="__text", cpu_type_t cpu=CPU_TYPE_X86_64); + + /** + * Request to free file buffer resources (not including linkedit symtable) + */ + void freeFileBufferResources(); }; #endif /* kern_mach_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp b/Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp new file mode 100644 index 0000000..941f75c --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp @@ -0,0 +1,190 @@ +// +// kern_nvram.hpp +// Lilu +// +// Copyright © 2017 vit9696. All rights reserved. +// + +#ifndef kern_nvram_hpp +#define kern_nvram_hpp + +#include +#include +#include +#include + +/** + * Some of the most common GUIDs used for variable storage on macOS + */ +#define NVRAM_GLOBAL_GUID "8BE4DF61-93CA-11D2-AA0D-00E098032B8C" +#define NVRAM_APPLE_BOOT_GUID "7C436110-AB2A-4BBB-A880-FE41995C9F82" +#define NVRAM_APPLE_VENDOR_GUID "4D1EDE05-38C7-4A6A-9CC6-4BCCA8B38C14" +#define NVRAM_APPLE_FILEVAULT_GUID "8D63D4FE-BD3C-4AAD-881D-86FD974BC1DF" +#define NVRAM_APPLE_PASSWORD_UI_GUID "9EBA2D25-BBE3-4AC2-A2C6-C87F44A1278C" + +/** + * Prefix variable name with a GUID + */ +#define NVRAM_PREFIX(x, y) x ":" y + +class NVStorage { + /** + * Local nvram controller reference + */ + IORegistryEntry *dtEntry {nullptr}; + +public: + /** + * Compress data with a default compression algorithm + * + * @param src source data + * @param size data size (updated with new size) + * @param sensitive contains sensitive data + * + * @return compressed data (must be freed with Buffer::deleter) or nullptr + */ + EXPORT uint8_t *compress(const uint8_t *src, uint32_t &size, bool sensitive=false); + + /** + * Decompress data compressed with compress + * + * @param src compressed data + * @param size data size (updated with new size) + * @param sensitive contains sensitive data + * + * @return decompressed data (must be freed with Buffer::deleter) or nullptr + */ + EXPORT uint8_t *decompress(const uint8_t *src, uint32_t &size, bool sensitive=false); + +public: + /** + * Value storage options + */ + enum Options { + OptAuto = 0, // Default options + OptRaw = 1, // i/o as raw buffer + OptCompressed = 2, // Apply compression (see kern_compression.hpp) + OptEncrypted = 4, // Apply encryption with device-unique key (see kern_crypto.hpp) + OptChecksum = 8, // Append CRC32 checksum to the end + OptSensitive = 16 // Value contains sensitive data + }; + + /** + * Prepended value header unless OptRaw is used + * After the header the following fields should go: + * uint8_t iv[16]; aes initialisation vector (if OptEncrypted is set) + * uint32_t size; decryption size (if OptEncrypted is set, encrypted) + * uint32_t size; decompression size (if OptCompressed is set, encrypted if OptEncrypted) + * uint8_t data[]; content data (encrypted if OptEncrypted) + * uint32_t crc32; CRC32 cheksum (if OptChecksum is set) + */ + struct PACKED Header { + static constexpr uint16_t Magic = 0xC717; + static constexpr uint8_t MaxVer = 1; + using Checksum = uint32_t; + + uint16_t magic {Magic}; + uint8_t version {MaxVer}; + uint8_t opts; + }; + + /** + * Attempt to connect to active nvram, may fail at early stages + * + * @return true on success + */ + EXPORT bool init(); + + /** + * Relinquish resources used, must be called regardless of the init error + */ + EXPORT void deinit(); + + /** + * Read data from nvram + * + * @param key key name + * @param size amount of data read + * @param opts bitmask of Options, may set option requirements + * @param enckey encryption key (platform-defined if OptEncrypted is set) + * + * @return pointer to data (must be freed via Buffer::deleter), nullptr on failure + */ + EXPORT uint8_t *read(const char *key, uint32_t &size, uint8_t opts=OptAuto, const uint8_t *enckey=nullptr); + + /** + * Read data from nvram + * + * @param key key name + * @param opts bitmask of Options, may set option requirements + * @param enckey encryption key (platform-defined if OptEncrypted is set) + * + * @return pointer to data (must be freed via OSData::release), nullptr on failure + */ + EXPORT OSData *read(const char *key, uint8_t opts=OptAuto, const uint8_t *enckey=nullptr); + + /** + * Write data to nvram + * + * @param key key name + * @param src source buffer + * @param size buffer size + * @param opts bitmask of Options + * @param enckey encryption key (platform-defined if OptEncrypted is set) + * + * @return true on success + */ + EXPORT bool write(const char *key, const uint8_t *src, uint32_t sz, uint8_t opts=OptAuto, const uint8_t *enckey=nullptr); + + /** + * Write data to nvram + * + * @param key key name + * @param data data object to write + * @param opts bitmask of Options + * @param enckey encryption key (platform-defined if OptEncrypted is set) + * + * @return true on success + */ + EXPORT bool write(const char *key, const OSData *data, uint8_t opts=OptAuto, const uint8_t *enckey=nullptr); + + /** + * Delete key from nvram + * + * @param key key name + * @param sensitive sensitive data + * + * @return true on successful deletion or if key is missing + */ + EXPORT bool remove(const char *key, bool sensitive=false); + + /** + * Synchronize with nvram controller + * This method might fail if synchronisation was done recently. + * + * @return true if synchronised + */ + EXPORT bool sync(); + + /** + * Exports nvram to a plist file + * + * @param filename file path + * @oaram max max output size + * @param sensitive contains sensitive data + * + * @return true if saved + */ + EXPORT bool save(const char *filename, uint32_t max=0x20000, bool sensitive=false); + + /** + * Check whether key exists + * + * @param key key name + * + * @return true if key exists + */ + EXPORT bool exists(const char *key); +}; + +#endif /* kern_nvram_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp b/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp index 684981b..ff66f39 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp @@ -9,6 +9,7 @@ #define kern_patcher_hpp #include +#include #include #include #include @@ -38,7 +39,9 @@ class KernelPatcher { MemoryIssue, MemoryProtection, PointerRange, - AlreadyDone + AlreadyDone, + LockError, + Unsupported }; /** @@ -63,6 +66,12 @@ class KernelPatcher { */ void deinit(); + /** + * Kernel write lock used for performing kernel & kext writes to disable cpu preemption + * See MachInfo::setKernelWriting + */ + EXPORT static IOSimpleLock *kernelWriteLock; + /** * Kext information */ @@ -71,27 +80,41 @@ class KernelPatcher { #ifdef LILU_KEXTPATCH_SUPPORT struct KextInfo { static constexpr size_t Unloaded {0}; - const char *id; - const char **paths; - size_t pathNum; - bool loaded; // invoke for kext if it is already loaded - bool reloadable; // allow the kext to unload and get patched again - bool user[6]; - size_t loadIndex; // Updated after loading + enum SysFlags : size_t { + Loaded, // invoke for kext if it is already loaded + Reloadable, // allow the kext to unload and get patched again + Disabled, // do not load this kext (formerly achieved pathNum = 0, this no longer works) + FSOnly, // do not use prelinkedkernel (kextcache) as a symbol source + FSFallback, // perform fs fallback if kextcache failed + Reserved, + SysFlagNum, + UserFlagNum = sizeof(size_t)-SysFlagNum + }; + static_assert(UserFlagNum > 0, "There should be at least one user flag"); + const char *id {nullptr}; + const char **paths {nullptr}; + size_t pathNum {0}; + bool sys[SysFlagNum] {}; + bool user[UserFlagNum] {}; + size_t loadIndex {Unloaded}; // Updated after loading }; + + static_assert(sizeof(KextInfo) == 5 * sizeof(size_t), "KextInfo is no longer ABI compatible"); #endif /* LILU_KEXTPATCH_SUPPORT */ /** * Loads and stores kinfo information locally * - * @param id kernel item identifier - * @param paths item filesystem path array - * @param num number of path entries - * @param isKernel kinfo is kernel info + * @param id kernel item identifier + * @param paths item filesystem path array + * @param num number of path entries + * @param isKernel kinfo is kernel info + * @param fsonly avoid using prelinkedkernel for kexts + * @param fsfallback fallback to reading from filesystem if prelink failed * * @return loaded kinfo id */ - EXPORT size_t loadKinfo(const char *id, const char * const paths[], size_t num=1, bool isKernel=false); + EXPORT size_t loadKinfo(const char *id, const char * const paths[], size_t num=1, bool isKernel=false, bool fsonly=false, bool fsfallback=false); #ifdef LILU_KEXTPATCH_SUPPORT /** @@ -148,7 +171,12 @@ class KernelPatcher { * Hook kext loading and unloading to access kexts at early stage */ EXPORT void setupKextListening(); - + + /** + * Free file buffer resources and effectively make prelinked kext loading impossible + */ + void freeFileBufferResources(); + /** * Activates monitoring functions if necessary */ @@ -220,10 +248,11 @@ class KernelPatcher { * @param to routed function * @param buildWrapper create entrance wrapper * @param kernelRoute kernel change requiring memory protection changes and patch reverting at unload + * @param revertible patches could be reverted * * @return wrapper pointer or 0 on success */ - EXPORT mach_vm_address_t routeFunction(mach_vm_address_t from, mach_vm_address_t to, bool buildWrapper=false, bool kernelRoute=true); + EXPORT mach_vm_address_t routeFunction(mach_vm_address_t from, mach_vm_address_t to, bool buildWrapper=false, bool kernelRoute=true, bool revertible=true); /** * Route block at assembly level @@ -347,20 +376,25 @@ class KernelPatcher { * Possible kernel paths */ #ifdef LILU_COMPRESSION_SUPPORT - static constexpr size_t kernelPathsNum {6}; + static constexpr size_t kernelPathsNum {10}; #else static constexpr size_t kernelPathsNum {4}; #endif /* LILU_COMPRESSION_SUPPORT */ const char *kernelPaths[kernelPathsNum] { - "/mach_kernel", - "/System/Library/Kernels/kernel", //since 10.10 - "/System/Library/Kernels/kernel.debug", - "/System/Library/Kernels/kernel.development", #ifdef LILU_COMPRESSION_SUPPORT "/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache", - "/System/Library/PrelinkedKernels/prelinkedkernel" + "/System/Library/PrelinkedKernels/prelinkedkernel", #endif /* LILU_COMPRESSION_SUPPORT */ - + "/System/Library/Kernels/kernel", //since 10.10 + "/mach_kernel", +#ifdef LILU_COMPRESSION_SUPPORT + "/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache.debug", + "/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache.development", + "/System/Library/PrelinkedKernels/prelinkedkernel.debug", + "/System/Library/PrelinkedKernels/prelinkedkernel.development", +#endif /* LILU_COMPRESSION_SUPPORT */ + "/System/Library/Kernels/kernel.debug", + "/System/Library/Kernels/kernel.development" }; }; diff --git a/Lilu.kext/Contents/Resources/Headers/kern_policy.hpp b/Lilu.kext/Contents/Resources/Headers/kern_policy.hpp index ec17f3d..6f61320 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_policy.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_policy.hpp @@ -34,7 +34,7 @@ class Policy { * @param conf policy configuration */ static void dummyPolicyInitBSD(mac_policy_conf *conf) { - DBGLOG("policy @ init bsd"); + DBGLOG("policy", "init bsd"); } /** diff --git a/Lilu.kext/Contents/Resources/Headers/kern_user.hpp b/Lilu.kext/Contents/Resources/Headers/kern_user.hpp index 0816828..7a81aa3 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_user.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_user.hpp @@ -114,14 +114,26 @@ class UserPatcher { vm_address_t startDATA; vm_address_t endDATA; }; - + /** * Structure describing relevant processes run */ struct ProcInfo { + /** + * Process matching flags + */ + enum ProcFlags { + MatchExact = 0, + MatchAny = 1, + MatchPrefix = 2, + MatchSuffix = 4, + MatchMask = MatchExact | MatchAny | MatchPrefix | MatchSuffix + }; + const char *path; uint32_t len; uint32_t section; + uint32_t flags {MatchExact}; }; /** diff --git a/Lilu.kext/Contents/Resources/Headers/kern_util.hpp b/Lilu.kext/Contents/Resources/Headers/kern_util.hpp index ddc64bb..a80616b 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_util.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_util.hpp @@ -9,10 +9,13 @@ #define kern_util_hpp #include +#include #include +#include #include #include +#include #include #define xStringify(a) Stringify(a) @@ -21,30 +24,159 @@ #define xConcat(a, b) Concat(a, b) #define Concat(a, b) a ## b +/** + * Prefix name with your plugin name (to ease symbolication and avoid conflicts) + */ #define ADDPR(a) xConcat(xConcat(PRODUCT_NAME, _), a) +/** + * Debugging state exported for your plugin + */ extern bool ADDPR(debugEnabled); -// Kernel version major + +/** + * Kernel version major + */ extern const int version_major; -// Kernel version minor + +/** + * Kernel version minor + */ extern const int version_minor; -// Kernel map + +/** + * Kernel map + */ extern vm_map_t kernel_map; -#define SYSLOG(str, ...) IOLog( xStringify(PRODUCT_NAME) ": " str "\n", ## __VA_ARGS__) +/** + * Kernel proc + */ +extern proc_t kernproc; + +/** + * Conditional logging to system log prefixed with you plugin name + * + * @param cond precondition + * @param str printf-like string + */ +#define SYSLOG_COND(cond, module, str, ...) \ + do { \ + if (cond) \ + IOLog( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + } while (0) + +/** + * Write to system log prefixed with you plugin name + * + * @param module log module + * @param str printf-like string + */ +#define SYSLOG(module, str, ...) SYSLOG_COND(true, module, str, ## __VA_ARGS__) + +/** + * Conditional tracing to system log prefixed with you plugin name + * + * @param cond precondition + * @param module log module + * @param str printf-like string + */ +#define SYSTRACE_COND(cond, module, str, ...) \ + do { \ + if (cond) \ + OSReportWithBacktrace( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + } while (0) + +/** + * Write call trace to system log prefixed with you plugin name + * + * @param module log module + * @param str printf-like string + */ +#define SYSTRACE(module, str, ...) SYSTRACE_COND(true, module, str, ## __VA_ARGS__) + +/** + * Conditional panic prefixed with you plugin name + * + * @param cond precondition + * @param module log module + * @param str printf-like string + */ +#define PANIC_COND(cond, module, str, ...) \ + do { \ + if (cond) \ + (panic)( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + } while (0) + +/** + * Cause immediate kernel panic prefixed with you plugin name + * + * @param module log module + * @param str printf-like string + */ +#define PANIC(module, str, ...) PANIC_COND(true, module, str, ## __VA_ARGS__) #ifdef DEBUG -#define DBGLOG(str, ...) \ - do { \ - if (ADDPR(debugEnabled)) \ - SYSLOG( "(DEBUG) " str, ## __VA_ARGS__); \ - } while(0) -#else -#define DBGLOG(str, ...) do { } while(0) + +/** + * Conditional debug logging to system log prefixed with you plugin name + * + * @param cond precondition + * @param module log module + * @param str printf-like string + */ +#define DBGLOG_COND(cond, module, str, ...) \ + do { \ + SYSLOG_COND(ADDPR(debugEnabled) && (cond), module, "%s" str, "(DBG) ", ## __VA_ARGS__); \ + } while (0) + +/** + * Write debug message to system log prefixed with you plugin name + * + * @param module log module + * @param str printf-like string + */ +#define DBGLOG(module, str, ...) DBGLOG_COND(true, module, str, ## __VA_ARGS__) + +/** + * Conditional debug tracing to system log prefixed with you plugin name + * + * @param cond precondition + * @param module log module + * @param str printf-like string + */ +#define DBGTRACE_COND(cond, module, str, ...) \ + do { \ + SYSTRACE_COND(ADDPR(debugEnabled) && (cond), module, "%s" str, "(DBG) ", ## __VA_ARGS__); \ + } while (0) + +/** + * Write debug call trace to system log prefixed with you plugin name + * + * @param module log module + * @param str printf-like string + */ +#define DBGTRACE(module, str, ...) DBGTRACE_COND(true, module, str, ## __VA_ARGS__) + +#else /* DEBUG */ + +#define DBGLOG_COND(module, str, ...) do { } while (0) +#define DBGLOG(module, str, ...) do { } while (0) +#define DBGTRACE_COND(module, str, ...) do { } while (0) +#define DBGTRACE(module, str, ...) do { } while (0) + #endif +/** + * Export function or symbol for linking + */ #define EXPORT __attribute__((visibility("default"))) +/** + * Remove padding between fields + */ +#define PACKED __attribute__((packed)) + /** * Two-way substring search * @@ -85,22 +217,22 @@ extern "C" { void *kern_os_malloc(size_t size); void *kern_os_calloc(size_t num, size_t size); void kern_os_free(void *addr); - void kern_os_cfree(void *addr); void *kern_os_realloc(void *addr, size_t nsize); + EXPORT void lilu_os_free(void *addr); } /** * Known kernel versions */ enum KernelVersion { - SnowLeopard = 10, - Lion = 11, - MountainLion = 12, - Mavericks = 13, - Yosemite = 14, - ElCapitan = 15, - Sierra = 16, - HighSierra = 17 + SnowLeopard = 10, + Lion = 11, + MountainLion = 12, + Mavericks = 13, + Yosemite = 14, + ElCapitan = 15, + Sierra = 16, + HighSierra = 17 }; /** @@ -143,12 +275,23 @@ constexpr size_t parseModuleVersion(const char *version) { namespace Buffer { template T *create(size_t size) { - return new T[size]; + return static_cast(kern_os_malloc(sizeof(T) * size)); + } + + template + bool resize(T *&buf, size_t size) { + auto nbuf = static_cast(kern_os_realloc(buf, sizeof(T) * size)); + if (nbuf) { + buf = nbuf; + return true; + } + + return false; } template void deleter(T *buf) { - delete[] buf; + lilu_os_free(buf); } } @@ -217,6 +360,7 @@ struct ppair { /** * Embedded vector-like container * You muse call deinit before destruction + * Ugh, someone, please, port libc++ to XNU... * * @param T held type * @param deleter type destructor @@ -225,6 +369,7 @@ template > class evector { T *ptr {nullptr}; size_t cnt {0}; + size_t rsvd {0}; public: /** * Return evector size @@ -276,6 +421,27 @@ class evector { return ptr[index]; } + /** + * Reserve memory for at least N elements + * + * @param num amount of elements + * + * @return elements ptr or null + */ + T *reserve(size_t num) { + if (rsvd < num) { + T *nPtr = static_cast(kern_os_realloc(ptr, num * sizeof(T))); + if (nPtr) { + ptr = nPtr; + rsvd = num; + } else { + return nullptr; + } + } + + return ptr; + } + /** * Erase evector element * @@ -284,22 +450,14 @@ class evector { * @return true on success */ bool erase(size_t index) { - // Free the memory deleter(ptr[index]); - // Shift the items - for (size_t i = index+1; i < cnt; i++) ptr[i-1] = ptr[i]; - // Reduce the memory used - cnt--; + if (--cnt != index) + lilu_os_memmove(&ptr[index], &ptr[index + 1], (cnt - index) * sizeof(T)); + if (cnt == 0) { kern_os_free(ptr); ptr = nullptr; - } else { - T *nPtr = static_cast(kern_os_realloc(ptr, (cnt)*sizeof(T))); - if (nPtr) { - ptr = nPtr; - } else { - return false; - } + rsvd = 0; } return true; @@ -313,15 +471,13 @@ class evector { * @return true on success */ bool push_back(T &element) { - T *nPtr = static_cast(kern_os_realloc(ptr, (cnt+1)*sizeof(T))); - if (nPtr) { - ptr = nPtr; + if (reserve(cnt+1)) { ptr[cnt] = element; cnt++; return true; } - SYSLOG("evector @ insertion failure"); + SYSLOG("evector", "insertion failure"); return false; } @@ -333,15 +489,13 @@ class evector { * @return true on success */ bool push_back(T &&element) { - T *nPtr = static_cast(kern_os_realloc(ptr, (cnt+1)*sizeof(T))); - if (nPtr) { - ptr = nPtr; + if (reserve(cnt+1)) { ptr[cnt] = element; cnt++; return true; } - SYSLOG("evector @ insertion failure"); + SYSLOG("evector", "insertion failure"); return false; } @@ -354,12 +508,11 @@ class evector { */ void deinit() { if (ptr) { - for (size_t i = 0; i < cnt; i++) { + for (size_t i = 0; i < cnt; i++) deleter(ptr[i]); - } kern_os_free(ptr); ptr = nullptr; - cnt = 0; + cnt = rsvd = 0; } } }; diff --git a/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp b/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp index 731b5e8..0f190b1 100644 --- a/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp +++ b/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp @@ -14,23 +14,26 @@ #include struct PluginConfiguration { - const char *product; // Product name (e.g. xStringify(PRODUCT_NAME)) - size_t version; // Product version (e.g. parseModuleVersion(xStringify(MODULE_VERSION))) - const char **disableArg; // Pointer to disabling boot arguments array - size_t disableArgNum; // Number of disabling boot arguments - const char **debugArg; // Pointer to debug boot arguments array - size_t debugArgNum; // Number of debug boot arguments - const char **betaArg; // Pointer to beta boot arguments array - size_t betaArgNum; // Number of beta boot arguments - KernelVersion minKernel; // Minimal required kernel version - KernelVersion maxKernel; // Maximum supported kernel version - void (*pluginStart)(); // Main function + const char *product; // Product name (e.g. xStringify(PRODUCT_NAME)) + size_t version; // Product version (e.g. parseModuleVersion(xStringify(MODULE_VERSION))) + uint32_t runmode; // Product supported environments (e.g. LiluAPI::AllowNormal) + const char **disableArg; // Pointer to disabling boot arguments array + size_t disableArgNum; // Number of disabling boot arguments + const char **debugArg; // Pointer to debug boot arguments array + size_t debugArgNum; // Number of debug boot arguments + const char **betaArg; // Pointer to beta boot arguments array + size_t betaArgNum; // Number of beta boot arguments + KernelVersion minKernel; // Minimal required kernel version + KernelVersion maxKernel; // Maximum supported kernel version + void (*pluginStart)(); // Main function }; #ifndef LILU_CUSTOM_KMOD_INIT extern PluginConfiguration ADDPR(config); +extern bool ADDPR(startSuccess); + #endif /* LILU_CUSTOM_KMOD_INIT */ #ifndef LILU_CUSTOM_IOKIT_INIT @@ -38,7 +41,7 @@ extern PluginConfiguration ADDPR(config); class EXPORT PRODUCT_NAME : public IOService { OSDeclareDefaultStructors(PRODUCT_NAME) public: - bool init(OSDictionary *dict) override; + IOService *probe(IOService *provider, SInt32 *score) override; bool start(IOService *provider) override; void stop(IOService *provider) override; }; diff --git a/Lilu.kext/Contents/Resources/Library/.DS_Store b/Lilu.kext/Contents/Resources/Library/.DS_Store new file mode 100644 index 0000000000000000000000000000000000000000..1ff526e54fa78b60c922c1638efa76d8d2ff55cc GIT binary patch literal 6148 zcmeH~+iDX*7{_PYsIzUPD+sON#e#@8xk#GQdLt|`y$}S&4feuAx+j{go1JA34RMXE zFW|k^TMy5nS3ZC!K8FwBH;2ZyS?Pr!V&{XI{~W$=X6LurnG8Y*cXF?Vkd6={keJpM zAgeIe&(e&|$rcS1^D$hMpfQS3hUkp9YET3efq#tv`*s(Q3*T#ke9-Cl>x|Oa38@49 zKb$xW(yZD1hUeyMXU?7@nzmTi>Pz)U)_{(z%+B((V^QL z`^&)zxne#MOf{nQ_2r^iUu!jt>+MOyC^j~l4P&jnKAC9b(zW)z$Gb0H?!SKX_TBpr zA4L#`eT&-#sR!~23YA>;tRxC)v;+MtmY|e#%Yj?~``-8vx6cRMzW(AywDY8bnp}=R z@dsEWeRx5P#!6ANSAoWA`xp*Fman#M+}a+FpBB$1&tHjEPhl*H`ZV9KTBw)0p#zV~ zyk;nbJ1xtl!+1JGh0l<7yI!8T2z`ma_qgZGI78~4=o1f4p6l3KJM>tmxF~=7WbqU; zP)keY-NZg>$U #include +#ifndef LILU_CUSTOM_KMOD_INIT +bool ADDPR(startSuccess) = false; +#else +// Workaround custom kmod code and enable by default +bool ADDPR(startSuccess) = true; +#endif + +bool ADDPR(debugEnabled) = false; + #ifndef LILU_CUSTOM_IOKIT_INIT OSDefineMetaClassAndStructors(PRODUCT_NAME, IOService) -bool PRODUCT_NAME::init(OSDictionary *dict) { - if (!IOService::init(dict)) { - SYSLOG("init @ failed to initalise the parent"); - return false; - } - - return true; +IOService *PRODUCT_NAME::probe(IOService *provider, SInt32 *score) { + auto service = IOService::probe(provider, score); + return ADDPR(startSuccess) ? service : nullptr; } bool PRODUCT_NAME::start(IOService *provider) { if (!IOService::start(provider)) { - SYSLOG("init @ failed to start the parent"); + SYSLOG("init", "failed to start the parent"); return false; } - return true; + return ADDPR(startSuccess); } void PRODUCT_NAME::stop(IOService *provider) { @@ -37,37 +42,35 @@ void PRODUCT_NAME::stop(IOService *provider) { #endif /* LILU_CUSTOM_IOKIT_INIT */ -bool ADDPR(debugEnabled) = false; - #ifndef LILU_CUSTOM_KMOD_INIT EXPORT extern "C" kern_return_t ADDPR(kern_start)(kmod_info_t *, void *) { - kern_return_t ret = KERN_FAILURE; LiluAPI::Error error = lilu.requestAccess(); - if (error == LiluAPI::Error::NoError) { - error = lilu.shouldLoad(ADDPR(config).product, ADDPR(config).version, ADDPR(config).disableArg, ADDPR(config).disableArgNum, - ADDPR(config).debugArg, ADDPR(config).debugArgNum, ADDPR(config).betaArg, ADDPR(config).betaArgNum, - ADDPR(config).minKernel, ADDPR(config).maxKernel, ADDPR(debugEnabled)); + error = lilu.shouldLoad(ADDPR(config).product, ADDPR(config).version, ADDPR(config).runmode, ADDPR(config).disableArg, ADDPR(config).disableArgNum, + ADDPR(config).debugArg, ADDPR(config).debugArgNum, ADDPR(config).betaArg, ADDPR(config).betaArgNum, ADDPR(config).minKernel, + ADDPR(config).maxKernel, ADDPR(debugEnabled)); if (error == LiluAPI::Error::NoError) { + ADDPR(startSuccess) = true; ADDPR(config).pluginStart(); - ret = KERN_SUCCESS; } else { - SYSLOG("init @ parent said we should not continue %d", error); + SYSLOG("init", "parent said we should not continue %d", error); } lilu.releaseAccess(); } else { - SYSLOG("init @ failed to call parent %d", error); + SYSLOG("init", "failed to call parent %d", error); } - - return ret; + + // Report success but actually do not start and let I/O Kit unload us. + // This works better and increases boot speed in some cases. + return KERN_SUCCESS; } EXPORT extern "C" kern_return_t ADDPR(kern_stop)(kmod_info_t *, void *) { - // It is not safe to unload Lilu plugins! - return KERN_FAILURE; + // It is not safe to unload Lilu plugins unless they were disabled! + return ADDPR(startSuccess) ? KERN_FAILURE : KERN_SUCCESS; } #endif /* LILU_CUSTOM_KMOD_INIT */ diff --git a/README.md b/README.md index 4f3e566..6acbb91 100644 --- a/README.md +++ b/README.md @@ -20,3 +20,4 @@ Boot args: - [Pike R. Alpha](https://github.com/Piker-Alpha) for patch - [lvs1974](https://applelife.ru/members/lvs1974.53809/) for original source code and idea - [chunnann](http://www.insanelymac.com/forum/user/1977171-chunnann/) for writing the software and maintaining it +- [black.dragon74] (http://forum.osxlatitude.com/index.php?/user/86692-blackdragon74/) For adding support for Lilu 1.2.0 From a772ae099cca034c6f6d942441904282410d69ad Mon Sep 17 00:00:00 2001 From: Psychic-74 Date: Thu, 2 Nov 2017 19:27:59 +0530 Subject: [PATCH 2/8] Update Injector Kext to match Kext version Signed-off-by: Psychic-74 --- ATH9KInjector.kext/Contents/Info.plist | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/ATH9KInjector.kext/Contents/Info.plist b/ATH9KInjector.kext/Contents/Info.plist index 1cb83ca..773e4e2 100644 --- a/ATH9KInjector.kext/Contents/Info.plist +++ b/ATH9KInjector.kext/Contents/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.0.0 + 1.2.0 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -23,7 +23,7 @@ MacOSX CFBundleVersion - 1.0.0 + 1.2.0 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild From 1843d50669895a327b472206afebe2af96701514 Mon Sep 17 00:00:00 2001 From: "black.dragon74" Date: Thu, 2 Nov 2017 19:34:23 +0530 Subject: [PATCH 3/8] Update README.md --- README.md | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/README.md b/README.md index 6acbb91..34a28a5 100644 --- a/README.md +++ b/README.md @@ -14,10 +14,18 @@ Boot args: - AR9565: -ath9565 +#### Installation +- This kext version requires LILU plugin version 1.2.0+ +- Download Lilu.kext, ATH9KInjector.kext and ATH9KFixup.kext +- Install them to /S/L/E (Clover injection won't work) +- User -ath9485 boot arg for AR9485 and -ath9565 for AR9565 (If you don't use any boot args it will do the patching for AR946X by default) +- Optional (Rebuild Caches) + + #### Credits - [Apple](https://www.apple.com) for macOS - [vit9696](https://github.com/vit9696) for [Lilu.kext](https://github.com/vit9696/Lilu) & for patch - [Pike R. Alpha](https://github.com/Piker-Alpha) for patch - [lvs1974](https://applelife.ru/members/lvs1974.53809/) for original source code and idea - [chunnann](http://www.insanelymac.com/forum/user/1977171-chunnann/) for writing the software and maintaining it -- [black.dragon74] (http://forum.osxlatitude.com/index.php?/user/86692-blackdragon74/) For adding support for Lilu 1.2.0 +- [black.dragon74](http://forum.osxlatitude.com/index.php?/user/86692-blackdragon74/) for adding support for Lilu 1.2.0 From bd9fc8372d56768283a16b3260af0a7eb8d5ef82 Mon Sep 17 00:00:00 2001 From: "black.dragon74" Date: Thu, 2 Nov 2017 19:37:08 +0530 Subject: [PATCH 4/8] Update changelog for version 1.2.0 --- Changelog.md | 3 +++ 1 file changed, 3 insertions(+) diff --git a/Changelog.md b/Changelog.md index 010c868..f5df896 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,6 +1,9 @@ ATH9KFixup Changelog ==================== +#### v1.2.0 +- Added Lilu 1.2.0 compatibility + #### v1.1.0 - Added High Sierra compatibility From 0070681c3fa87e061ad7bbdcfda519b4fe5813ff Mon Sep 17 00:00:00 2001 From: "black.dragon74" Date: Wed, 29 Aug 2018 20:18:04 +0530 Subject: [PATCH 5/8] Update Lilu to 1.2.6 Signed-off-by: black.dragon74 --- Lilu.kext/Contents/Info.plist | 14 +- Lilu.kext/Contents/MacOS/Lilu | Bin 376384 -> 447920 bytes .../Contents/Resources/Headers/.DS_Store | Bin 6148 -> 0 bytes .../Resources/Headers/Guid/LiluVariables.h | 38 ++ .../Contents/Resources/Headers/capstone/arm.h | 0 .../Resources/Headers/capstone/arm64.h | 4 +- .../Resources/Headers/capstone/capstone.h | 4 - .../Resources/Headers/capstone/mips.h | 0 .../Resources/Headers/capstone/platform.h | 0 .../Contents/Resources/Headers/capstone/ppc.h | 0 .../Resources/Headers/capstone/sparc.h | 0 .../Resources/Headers/capstone/systemz.h | 0 .../Contents/Resources/Headers/capstone/x86.h | 0 .../Resources/Headers/capstone/xcore.h | 0 .../Contents/Resources/Headers/kern_api.hpp | 179 ++++++-- .../Contents/Resources/Headers/kern_cpu.hpp | 409 ++++++++++++++++++ .../Resources/Headers/kern_devinfo.hpp | 255 +++++++++++ .../Resources/Headers/kern_disasm.hpp | 35 +- .../Contents/Resources/Headers/kern_efi.hpp | 86 ++++ .../Contents/Resources/Headers/kern_iokit.hpp | 184 +++++++- .../Contents/Resources/Headers/kern_mach.hpp | 88 ++-- .../Contents/Resources/Headers/kern_nvram.hpp | 14 +- .../Resources/Headers/kern_patcher.hpp | 184 +++++++- .../Contents/Resources/Headers/kern_rtc.hpp | 229 ++++++++++ .../Contents/Resources/Headers/kern_time.hpp | 135 ++++++ .../Contents/Resources/Headers/kern_user.hpp | 100 +++-- .../Contents/Resources/Headers/kern_util.hpp | 280 +++++++++++- .../Resources/Headers/plugin_start.hpp | 2 + .../Contents/Resources/Library/.DS_Store | Bin 6148 -> 0 bytes .../Resources/Library/plugin_start.cpp | 23 +- .../Resources/Library/wrappers/build.tool | 57 +++ .../Resources/Library/wrappers/entry32.S | 41 ++ .../Resources/Library/wrappers/entry64.S | 41 ++ .../Resources/Library/wrappers/wrappers.inc | 28 ++ 34 files changed, 2246 insertions(+), 184 deletions(-) delete mode 100644 Lilu.kext/Contents/Resources/Headers/.DS_Store create mode 100644 Lilu.kext/Contents/Resources/Headers/Guid/LiluVariables.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/arm.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/arm64.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/capstone.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/mips.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/platform.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/ppc.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/sparc.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/systemz.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/x86.h mode change 100755 => 100644 Lilu.kext/Contents/Resources/Headers/capstone/xcore.h create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_cpu.hpp create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_devinfo.hpp create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_efi.hpp create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_rtc.hpp create mode 100644 Lilu.kext/Contents/Resources/Headers/kern_time.hpp delete mode 100644 Lilu.kext/Contents/Resources/Library/.DS_Store create mode 100755 Lilu.kext/Contents/Resources/Library/wrappers/build.tool create mode 100644 Lilu.kext/Contents/Resources/Library/wrappers/entry32.S create mode 100644 Lilu.kext/Contents/Resources/Library/wrappers/entry64.S create mode 100644 Lilu.kext/Contents/Resources/Library/wrappers/wrappers.inc diff --git a/Lilu.kext/Contents/Info.plist b/Lilu.kext/Contents/Info.plist index 69dc308..91296fd 100644 --- a/Lilu.kext/Contents/Info.plist +++ b/Lilu.kext/Contents/Info.plist @@ -3,7 +3,7 @@ BuildMachineOSBuild - 16G29 + 17D102 CFBundleDevelopmentRegion en CFBundleExecutable @@ -17,7 +17,7 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.2.0 + 1.2.6 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -25,21 +25,21 @@ MacOSX CFBundleVersion - 1.2.0 + 1.2.6 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild - 9A235 + 9F2000 DTPlatformVersion GM DTSDKBuild - 17A360 + 17E189 DTSDKName macosx10.13 DTXcode - 0900 + 0941 DTXcodeBuild - 9A235 + 9F2000 IOKitPersonalities as.vit9696.Lilu diff --git a/Lilu.kext/Contents/MacOS/Lilu b/Lilu.kext/Contents/MacOS/Lilu index 9295776f3a6fff9422ad2fd37c26632a7c0cf3ab..5bf4ab28b37a50028be3b595286c1aa517b8389c 100755 GIT binary patch literal 447920 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

@@18_I=HLs>Tevf$=r%k8=%s| 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 z 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 delta 96494 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

%>) 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

si~R6nmfm`I3ASr+6u1t33hN9S2332W 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%0DIqyzxM7Oeoj{`iy9Ad6z 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 +This program and the accompanying materials +are licensed and made available under the terms and conditions of the BSD License +which accompanies this distribution. The full text of the license may be found at +http://opensource.org/licenses/bsd-license.php + +THE PROGRAM IS DISTRIBUTED UNDER THE BSD LICENSE ON AN "AS IS" BASIS, +WITHOUT WARRANTIES OR REPRESENTATIONS OF ANY KIND, EITHER EXPRESS OR IMPLIED. + +**/ + +// +// 2660DD78-81D2-419D-8138-7B1F363F79A6 +// This GUID is specifically used for normal variable access by Lilu kernel extension and its plugins. +// +#define LILU_NORMAL_VARIABLE_GUID \ + { 0x2660DD78, 0x81D2, 0x419D, { 0x81, 0x38, 0x7B, 0x1F, 0x36, 0x3F, 0x79, 0xA6 } } + +// +// E09B9297-7928-4440-9AAB-D1F8536FBF0A +// This GUID is specifically used for reading variables by Lilu kernel extension and its plugins. +// Any writes to this GUID should be prohibited via EFI_RUNTIME_SERVICES after EXIT_BOOT_SERVICES. +// The expected return code on variable write is EFI_SECURITY_VIOLATION. +// +#define LILU_READ_ONLY_VARIABLE_GUID \ + { 0xE09B9297, 0x7928, 0x4440, { 0x9A, 0xAB, 0xD1, 0xF8, 0x53, 0x6F, 0xBF, 0x0A } } + +// +// F0B9AF8F-2222-4840-8A37-ECF7CC8C12E1 +// This GUID is specifically used for reading variables by Lilu and plugins. +// Any reads from this GUID should be prohibited via EFI_RUNTIME_SERVICES after EXIT_BOOT_SERVICES. +// The expected return code on variable read is EFI_SECURITY_VIOLATION. +// +#define LILU_WRITE_ONLY_VARIABLE_GUID \ + { 0xF0B9AF8F, 0x2222, 0x4840, { 0x8A, 0x37, 0xEC, 0xF7, 0xCC, 0x8C, 0x12, 0xE1 } } diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/arm.h b/Lilu.kext/Contents/Resources/Headers/capstone/arm.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/arm64.h b/Lilu.kext/Contents/Resources/Headers/capstone/arm64.h old mode 100755 new mode 100644 index 8814709..87504ba --- a/Lilu.kext/Contents/Resources/Headers/capstone/arm64.h +++ b/Lilu.kext/Contents/Resources/Headers/capstone/arm64.h @@ -659,8 +659,8 @@ typedef enum arm64_reg { //> alias registers - ARM64_REG_IP1 = ARM64_REG_X16, - ARM64_REG_IP0 = ARM64_REG_X17, + ARM64_REG_IP0 = ARM64_REG_X16, + ARM64_REG_IP1 = ARM64_REG_X17, ARM64_REG_FP = ARM64_REG_X29, ARM64_REG_LR = ARM64_REG_X30, } arm64_reg; diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/capstone.h b/Lilu.kext/Contents/Resources/Headers/capstone/capstone.h old mode 100755 new mode 100644 index 72fd1d1..172c7b8 --- a/Lilu.kext/Contents/Resources/Headers/capstone/capstone.h +++ b/Lilu.kext/Contents/Resources/Headers/capstone/capstone.h @@ -8,10 +8,6 @@ extern "C" { #endif -#ifdef CAPSTONE_HAS_OSXKERNEL -#include -#endif - #if !defined(_MSC_VER) || !defined(_KERNEL_MODE) #include #endif diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/mips.h b/Lilu.kext/Contents/Resources/Headers/capstone/mips.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/platform.h b/Lilu.kext/Contents/Resources/Headers/capstone/platform.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/ppc.h b/Lilu.kext/Contents/Resources/Headers/capstone/ppc.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/sparc.h b/Lilu.kext/Contents/Resources/Headers/capstone/sparc.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/systemz.h b/Lilu.kext/Contents/Resources/Headers/capstone/systemz.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/x86.h b/Lilu.kext/Contents/Resources/Headers/capstone/x86.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/capstone/xcore.h b/Lilu.kext/Contents/Resources/Headers/capstone/xcore.h old mode 100755 new mode 100644 diff --git a/Lilu.kext/Contents/Resources/Headers/kern_api.hpp b/Lilu.kext/Contents/Resources/Headers/kern_api.hpp index 5aaa976..15711b1 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_api.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_api.hpp @@ -23,12 +23,12 @@ class LiluAPI { * Initialise lilu api */ void init(); - + /** * Deinitialise lilu api */ void deinit(); - + /** * Errors returned by functions */ @@ -42,13 +42,13 @@ class LiluAPI { TooLate, Offline }; - + /** * Minimal API version that guarantees forward ABI compatibility * Present due to lack of OSBundleCompatibleVersion at kext injection */ static constexpr size_t CompatibilityVersion {parseModuleVersion("1.2.0")}; - + /** * Obtains api access by holding a lock, which is required when accessing out of the main context * @@ -58,7 +58,7 @@ class LiluAPI { * @return Error::NoError on success */ EXPORT Error requestAccess(size_t version=CompatibilityVersion, bool check=false); - + /** * Releases api lock * @@ -71,12 +71,24 @@ class LiluAPI { * It is assumed that single user mode is equal to normal, because it is generally * used to continue the load of a complete OS, and by default Lilu itself ignores it. */ - enum Requirements : uint32_t { - AllowNormal = 1, - AllowInstallerRecovery = 2, - AllowSafeMode = 4 + enum RunningMode : uint32_t { + RunningNormal = 1, + AllowNormal = RunningNormal, + RunningInstallerRecovery = 2, + AllowInstallerRecovery = RunningInstallerRecovery, + RunningSafeMode = 4, + AllowSafeMode = RunningSafeMode }; + /** + * Obtain current run mode similarly to requirements + * + * @return run mode mask (RunningMode) + */ + inline uint32_t getRunMode() { + return currentRunMode; + } + /** * Decides whether you are eligible to continue * @@ -96,7 +108,7 @@ class LiluAPI { * @return Error::NoError on success */ EXPORT Error shouldLoad(const char *product, size_t version, uint32_t runmode, const char **disableArg, size_t disableArgNum, const char **debugArg, size_t debugArgNum, const char **betaArg, size_t betaArgNum, KernelVersion min, KernelVersion max, bool &printDebug); - + /** * Kernel patcher loaded callback * @@ -104,7 +116,7 @@ class LiluAPI { * @param patcher kernel patcher instance */ using t_patcherLoaded = void (*)(void *user, KernelPatcher &patcher); - + /** * Registers custom provided callbacks for later invocation on kernel patcher initialisation * @@ -114,7 +126,22 @@ class LiluAPI { * @return Error::NoError on success */ EXPORT Error onPatcherLoad(t_patcherLoaded callback, void *user=nullptr); - + + /** + * Registers custom provided callbacks for later invocation on kernel patcher initialisation + * Enforced version, which panics on registration failure (assuming your code cannot continue otherwise) + * + * @param callback your callback function + * @param user your pointer that will be passed to the callback function + * + * @return Error::NoError on success + */ + inline void onPatcherLoadForce(t_patcherLoaded callback, void *user=nullptr) { + auto err = onPatcherLoad(callback, user); + if (err != Error::NoError) + PANIC("api", "onPatcherLoad failed with code %d", err); + } + /** * Kext loaded callback * Note that you will get notified of all the requested kexts for speed reasons @@ -126,21 +153,53 @@ class LiluAPI { * @param size loaded memory size */ using t_kextLoaded = void (*)(void *user, KernelPatcher &patcher, size_t id, mach_vm_address_t slide, size_t size); - + /** * Registers custom provided callbacks for later invocation on kext load * * @param infos your kext list (make sure to point to const memory) * @param num number of provided kext entries - * @param callback your callback function + * @param callback your callback function (optional) + * @param user your pointer that will be passed to the callback function (optional) + * + * @return Error::NoError on success + */ + EXPORT Error onKextLoad(KernelPatcher::KextInfo *infos, size_t num=1, t_kextLoaded callback=nullptr, void *user=nullptr); + + /** + * Registers custom provided callbacks for later invocation on kext load + * Enforced version, which panics on registration failure (assuming your code cannot continue otherwise) + * + * @param infos your kext list (make sure to point to const memory) + * @param num number of provided kext entries + * @param callback your callback function (optional) + * @param user your pointer that will be passed to the callback function (optional) + * + * @return Error::NoError on success + */ + inline void onKextLoadForce(KernelPatcher::KextInfo *infos, size_t num=1, t_kextLoaded callback=nullptr, void *user=nullptr) { + auto err = onKextLoad(infos, num, callback, user); + if (err != Error::NoError) + PANIC("api", "onKextLoad failed with code %d", err); + } + + /** + * Registers custom provided callbacks for later invocation on binary load + * + * @param infos your binary list (make sure to point to const memory) + * @param num number of provided binary entries + * @param callback your callback function (could be null) * @param user your pointer that will be passed to the callback function + * @param mods optional mod list (make sure to point to const memory) + * @param modnum number of provided mod entries * * @return Error::NoError on success */ - EXPORT Error onKextLoad(KernelPatcher::KextInfo *infos, size_t num, t_kextLoaded callback, void *user=nullptr); - + EXPORT Error onProcLoad(UserPatcher::ProcInfo *infos, size_t num=1, UserPatcher::t_BinaryLoaded callback=nullptr, void *user=nullptr, UserPatcher::BinaryModInfo *mods=nullptr, size_t modnum=0); + /** * Registers custom provided callbacks for later invocation on binary load + * Enforced version, which panics on registration failure (assuming your code cannot continue otherwise) * * @param infos your binary list (make sure to point to const memory) * @param num number of provided binary entries @@ -151,7 +210,47 @@ class LiluAPI { * * @return Error::NoError on success */ - EXPORT Error onProcLoad(UserPatcher::ProcInfo *infos, size_t num, UserPatcher::t_BinaryLoaded callback, void *user=nullptr, UserPatcher::BinaryModInfo *mods=nullptr, size_t modnum=0); + inline void onProcLoadForce(UserPatcher::ProcInfo *infos, size_t num=1, UserPatcher::t_BinaryLoaded callback=nullptr, void *user=nullptr, UserPatcher::BinaryModInfo *mods=nullptr, size_t modnum=0) { + auto err = onProcLoad(infos, num, callback, user, mods, modnum); + if (err != Error::NoError) + PANIC("api", "onProcLoad failed with code %d", err); + } + + /** + * Kext loaded callback + * Note that you will get notified of all the requested kexts for speed reasons + * + * @param user user provided pointer at registering + * @param task task + * @param entitlement loaded kinfo id + * @param original original entitlement value + */ + using t_entitlementRequested = void (*)(void *user, task_t task, const char *entitlement, OSObject *&original); + + /** + * Registers custom provided callbacks for later invocation on entitlement registration + * + * @param callback your callback function + * @param user your pointer that will be passed to the callback function + * + * @return Error::NoError on success + */ + EXPORT Error onEntitlementRequest(t_entitlementRequested callback, void *user=nullptr); + + /** + * Registers custom provided callbacks for later invocation on entitlement registration + * Enforced version, which panics on registration failure (assuming your code cannot continue otherwise) + * + * @param callback your callback function + * @param user your pointer that will be passed to the callback function + * + * @return Error::NoError on success + */ + inline void onEntitlementRequestForce(t_entitlementRequested callback, void *user=nullptr) { + auto err = onEntitlementRequest(callback, user); + if (err != Error::NoError) + PANIC("api", "onEntitlementRequest failed with code %d", err); + } /** * Processes all the registered patcher load callbacks @@ -170,14 +269,14 @@ class LiluAPI { * @param reloadable kinfo could be unloaded */ void processKextLoadCallbacks(KernelPatcher &patcher, size_t id, mach_vm_address_t slide, size_t size, bool reloadable); - + /** * Processes all the registered user patcher load callbacks * * @param patcher user patcher instance */ void processUserLoadCallbacks(UserPatcher &patcher); - + /** * Processes all the registered binary load callbacks * @@ -187,7 +286,7 @@ class LiluAPI { * @param len path length excluding null terminator */ void processBinaryLoadCallbacks(UserPatcher &patcher, vm_map_t map, const char *path, size_t len); - + /** * Activates patchers * @@ -195,9 +294,9 @@ class LiluAPI { * @param upatcher user patcher instance */ void activate(KernelPatcher &kpatcher, UserPatcher &upatcher); - + private: - + /** * Api lock */ @@ -212,48 +311,68 @@ class LiluAPI { * No longer accept any requests */ bool apiRequestsOver {false}; - + /** * Stores call function and user pointer */ template using stored_pair = ppair; - + /** * Stores multiple callbacks */ template using stored_vector = evector *, stored_pair::deleter>; - + /** * List of patcher callbacks */ stored_vector patcherLoadedCallbacks; - + /** * List of kext callbacks */ stored_vector kextLoadedCallbacks; - + /** * List of binary callbacks */ stored_vector binaryLoadedCallbacks; - + + /** + * List of entitlement callbacks + */ + stored_vector entitlementRequestedCallbacks; + /** * List of processed kexts */ stored_vector storedKexts; - + /** * List of processed procs */ evector storedProcs; - + /** * List of processed binary mods */ evector storedBinaryMods; + + /** + * Copy client entitlement type (see IOUserClient) + */ + using t_copyClientEntitlement = OSObject *(*)(task_t, const char *); + + /** + * Hooked entitlement copying method + */ + static OSObject *copyClientEntitlement(task_t task, const char *entitlement); + + /** + * Trampoline for original entitlement copying method + */ + t_copyClientEntitlement orgCopyClientEntitlement {nullptr}; }; EXPORT extern LiluAPI lilu; diff --git a/Lilu.kext/Contents/Resources/Headers/kern_cpu.hpp b/Lilu.kext/Contents/Resources/Headers/kern_cpu.hpp new file mode 100644 index 0000000..31e4d70 --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_cpu.hpp @@ -0,0 +1,409 @@ +// +// kern_cpu.hpp +// Lilu +// +// Copyright © 2018 vit9696. All rights reserved. +// + +#ifndef kern_cpu_h +#define kern_cpu_h + +#include +#include +#include + +#include + +/** + * XNU CPU-related exports missing from headers + */ +extern "C" { + int cpu_number(void); + void mp_rendezvous_no_intrs(void (*action_func)(void *), void *arg); +}; + +namespace CPUInfo { + /** + * Keep this in sync to XNU MAX_CPUS from osfmk/i386/mp.h + */ + static constexpr size_t MaxCpus {64}; + + /** + * Contents of CPUID(1) eax register contents describing model version + */ + struct CpuVersion { + uint32_t stepping : 4; + uint32_t model : 4; + uint32_t family : 4; + uint32_t type : 2; + uint32_t reserved1 : 2; + uint32_t extendedModel : 4; + uint32_t extendedFamily : 8; + uint32_t reserved2 : 4; + }; + + static_assert(sizeof(CpuVersion) == sizeof(uint32_t), "CpuVersion size mismatch!"); + + /** + * Intel CPU models as returned by CPUID + * The list is synchronised and updated with XNU source code (osfmk/i386/cpuid.h). + * Names are altered to avoid conflicts just in case. + * Last update: xnu-4570.41.2 + * Some details could be found on http://instlatx64.atw.hu and https://en.wikichip.org/wiki/64-bit_architecture#x86 + */ + enum CpuModel { + CPU_MODEL_UNKNOWN = 0x00, + CPU_MODEL_PENRYN = 0x17, + CPU_MODEL_NEHALEM = 0x1A, + CPU_MODEL_FIELDS = 0x1E, /* Lynnfield, Clarksfield */ + CPU_MODEL_DALES = 0x1F, /* Havendale, Auburndale */ + CPU_MODEL_NEHALEM_EX = 0x2E, + CPU_MODEL_DALES_32NM = 0x25, /* Clarkdale, Arrandale */ + CPU_MODEL_WESTMERE = 0x2C, /* Gulftown, Westmere-EP/-WS */ + CPU_MODEL_WESTMERE_EX = 0x2F, + CPU_MODEL_SANDYBRIDGE = 0x2A, + CPU_MODEL_JAKETOWN = 0x2D, + CPU_MODEL_IVYBRIDGE = 0x3A, + CPU_MODEL_IVYBRIDGE_EP = 0x3E, + CPU_MODEL_CRYSTALWELL = 0x46, + CPU_MODEL_HASWELL = 0x3C, + CPU_MODEL_HASWELL_EP = 0x3F, + CPU_MODEL_HASWELL_ULT = 0x45, + CPU_MODEL_BROADWELL = 0x3D, + CPU_MODEL_BROADWELL_ULX = 0x3D, + CPU_MODEL_BROADWELL_ULT = 0x3D, + CPU_MODEL_BRYSTALWELL = 0x47, + CPU_MODEL_SKYLAKE = 0x4E, + CPU_MODEL_SKYLAKE_ULT = 0x4E, + CPU_MODEL_SKYLAKE_ULX = 0x4E, + CPU_MODEL_SKYLAKE_DT = 0x5E, + CPU_MODEL_SKYLAKE_W = 0x55, + CPU_MODEL_KABYLAKE = 0x8E, + CPU_MODEL_KABYLAKE_ULT = 0x8E, + CPU_MODEL_KABYLAKE_ULX = 0x8E, + CPU_MODEL_KABYLAKE_DT = 0x9E, + CPU_MODEL_COFFEELAKE = 0x9E, + CPU_MODEL_COFFEELAKE_ULT = 0x9E, + CPU_MODEL_COFFEELAKE_ULX = 0x9E, + CPU_MODEL_COFFEELAKE_DT = 0x9E, + CPU_MODEL_CANNONLAKE = 0x66, + CPU_MODEL_ICELAKE = 0x7E + }; + + /** + * Known CPU vendors + */ + enum class CpuVendor { + Unknown, + AMD, + Intel + /* Add more processors here if needed */ + }; + + /** + * Intel CPU generations (starting from 0) + */ + enum class CpuGeneration { + Unknown, + Penryn, + Nehalem, + Westmere, + SandyBridge, + IvyBridge, + Haswell, + Broadwell, + Skylake, + KabyLake, + CoffeeLake, + CannonLake, + IceLake, + MaxGeneration + }; + + /* Responses identification request with %eax 0 */ + /* AMD: "AuthenticAMD" */ + static constexpr uint32_t signature_AMD_ebx = 0x68747541; + static constexpr uint32_t signature_AMD_edx = 0x69746e65; + static constexpr uint32_t signature_AMD_ecx = 0x444d4163; + /* CENTAUR: "CentaurHauls" */ + static constexpr uint32_t signature_CENTAUR_ebx = 0x746e6543; + static constexpr uint32_t signature_CENTAUR_edx = 0x48727561; + static constexpr uint32_t signature_CENTAUR_ecx = 0x736c7561; + /* CYRIX: "CyrixInstead" */ + static constexpr uint32_t signature_CYRIX_ebx = 0x69727943; + static constexpr uint32_t signature_CYRIX_edx = 0x736e4978; + static constexpr uint32_t signature_CYRIX_ecx = 0x64616574; + /* INTEL: "GenuineIntel" */ + static constexpr uint32_t signature_INTEL_ebx = 0x756e6547; + static constexpr uint32_t signature_INTEL_edx = 0x49656e69; + static constexpr uint32_t signature_INTEL_ecx = 0x6c65746e; + /* TM1: "TransmetaCPU" */ + static constexpr uint32_t signature_TM1_ebx = 0x6e617254; + static constexpr uint32_t signature_TM1_edx = 0x74656d73; + static constexpr uint32_t signature_TM1_ecx = 0x55504361; + /* TM2: "GenuineTMx86" */ + static constexpr uint32_t signature_TM2_ebx = 0x756e6547; + static constexpr uint32_t signature_TM2_edx = 0x54656e69; + static constexpr uint32_t signature_TM2_ecx = 0x3638784d; + /* NSC: "Geode by NSC" */ + static constexpr uint32_t signature_NSC_ebx = 0x646f6547; + static constexpr uint32_t signature_NSC_edx = 0x43534e20; + static constexpr uint32_t signature_NSC_ecx = 0x79622065; + /* NEXGEN: "NexGenDriven" */ + static constexpr uint32_t signature_NEXGEN_ebx = 0x4778654e; + static constexpr uint32_t signature_NEXGEN_edx = 0x72446e65; + static constexpr uint32_t signature_NEXGEN_ecx = 0x6e657669; + /* RISE: "RiseRiseRise" */ + static constexpr uint32_t signature_RISE_ebx = 0x65736952; + static constexpr uint32_t signature_RISE_edx = 0x65736952; + static constexpr uint32_t signature_RISE_ecx = 0x65736952; + /* SIS: "SiS SiS SiS " */ + static constexpr uint32_t signature_SIS_ebx = 0x20536953; + static constexpr uint32_t signature_SIS_edx = 0x20536953; + static constexpr uint32_t signature_SIS_ecx = 0x20536953; + /* UMC: "UMC UMC UMC " */ + static constexpr uint32_t signature_UMC_ebx = 0x20434d55; + static constexpr uint32_t signature_UMC_edx = 0x20434d55; + static constexpr uint32_t signature_UMC_ecx = 0x20434d55; + /* VIA: "VIA VIA VIA " */ + static constexpr uint32_t signature_VIA_ebx = 0x20414956; + static constexpr uint32_t signature_VIA_edx = 0x20414956; + static constexpr uint32_t signature_VIA_ecx = 0x20414956; + /* VORTEX: "Vortex86 SoC" */ + static constexpr uint32_t signature_VORTEX_ebx = 0x74726f56; + static constexpr uint32_t signature_VORTEX_edx = 0x36387865; + static constexpr uint32_t signature_VORTEX_ecx = 0x436f5320; + + /* Features in %ecx for leaf 1 */ + static constexpr uint32_t bit_SSE3 = 0x00000001; + static constexpr uint32_t bit_PCLMULQDQ = 0x00000002; + static constexpr uint32_t bit_DTES64 = 0x00000004; + static constexpr uint32_t bit_MONITOR = 0x00000008; + static constexpr uint32_t bit_DSCPL = 0x00000010; + static constexpr uint32_t bit_VMX = 0x00000020; + static constexpr uint32_t bit_SMX = 0x00000040; + static constexpr uint32_t bit_EIST = 0x00000080; + static constexpr uint32_t bit_TM2 = 0x00000100; + static constexpr uint32_t bit_SSSE3 = 0x00000200; + static constexpr uint32_t bit_CNXTID = 0x00000400; + static constexpr uint32_t bit_FMA = 0x00001000; + static constexpr uint32_t bit_CMPXCHG16B = 0x00002000; + static constexpr uint32_t bit_xTPR = 0x00004000; + static constexpr uint32_t bit_PDCM = 0x00008000; + static constexpr uint32_t bit_PCID = 0x00020000; + static constexpr uint32_t bit_DCA = 0x00040000; + static constexpr uint32_t bit_SSE41 = 0x00080000; + static constexpr uint32_t bit_SSE42 = 0x00100000; + static constexpr uint32_t bit_x2APIC = 0x00200000; + static constexpr uint32_t bit_MOVBE = 0x00400000; + static constexpr uint32_t bit_POPCNT = 0x00800000; + static constexpr uint32_t bit_TSCDeadline = 0x01000000; + static constexpr uint32_t bit_AESNI = 0x02000000; + static constexpr uint32_t bit_XSAVE = 0x04000000; + static constexpr uint32_t bit_OSXSAVE = 0x08000000; + static constexpr uint32_t bit_AVX = 0x10000000; + static constexpr uint32_t bit_F16C = 0x20000000; + static constexpr uint32_t bit_RDRND = 0x40000000; + + /* Features in %edx for leaf 1 */ + static constexpr uint32_t bit_FPU = 0x00000001; + static constexpr uint32_t bit_VME = 0x00000002; + static constexpr uint32_t bit_DE = 0x00000004; + static constexpr uint32_t bit_PSE = 0x00000008; + static constexpr uint32_t bit_TSC = 0x00000010; + static constexpr uint32_t bit_MSR = 0x00000020; + static constexpr uint32_t bit_PAE = 0x00000040; + static constexpr uint32_t bit_MCE = 0x00000080; + static constexpr uint32_t bit_CX8 = 0x00000100; + static constexpr uint32_t bit_APIC = 0x00000200; + static constexpr uint32_t bit_SEP = 0x00000800; + static constexpr uint32_t bit_MTRR = 0x00001000; + static constexpr uint32_t bit_PGE = 0x00002000; + static constexpr uint32_t bit_MCA = 0x00004000; + static constexpr uint32_t bit_CMOV = 0x00008000; + static constexpr uint32_t bit_PAT = 0x00010000; + static constexpr uint32_t bit_PSE36 = 0x00020000; + static constexpr uint32_t bit_PSN = 0x00040000; + static constexpr uint32_t bit_CLFSH = 0x00080000; + static constexpr uint32_t bit_DS = 0x00200000; + static constexpr uint32_t bit_ACPI = 0x00400000; + static constexpr uint32_t bit_MMX = 0x00800000; + static constexpr uint32_t bit_FXSR = 0x01000000; + static constexpr uint32_t bit_SSE = 0x02000000; + static constexpr uint32_t bit_SSE2 = 0x04000000; + static constexpr uint32_t bit_SS = 0x08000000; + static constexpr uint32_t bit_HTT = 0x10000000; + static constexpr uint32_t bit_TM = 0x20000000; + static constexpr uint32_t bit_PBE = 0x80000000; + + /* Features in %ebx for leaf 7 sub-leaf 0 */ + static constexpr uint32_t bit_FSGSBASE = 0x00000001; + static constexpr uint32_t bit_SGX = 0x00000004; + static constexpr uint32_t bit_BMI = 0x00000008; + static constexpr uint32_t bit_HLE = 0x00000010; + static constexpr uint32_t bit_AVX2 = 0x00000020; + static constexpr uint32_t bit_SMEP = 0x00000080; + static constexpr uint32_t bit_BMI2 = 0x00000100; + static constexpr uint32_t bit_ENH_MOVSB = 0x00000200; + static constexpr uint32_t bit_RTM = 0x00000800; + static constexpr uint32_t bit_MPX = 0x00004000; + static constexpr uint32_t bit_AVX512F = 0x00010000; + static constexpr uint32_t bit_AVX512DQ = 0x00020000; + static constexpr uint32_t bit_RDSEED = 0x00040000; + static constexpr uint32_t bit_ADX = 0x00080000; + static constexpr uint32_t bit_AVX512IFMA = 0x00200000; + static constexpr uint32_t bit_CLFLUSHOPT = 0x00800000; + static constexpr uint32_t bit_CLWB = 0x01000000; + static constexpr uint32_t bit_AVX512PF = 0x04000000; + static constexpr uint32_t bit_AVX51SER = 0x08000000; + static constexpr uint32_t bit_AVX512CD = 0x10000000; + static constexpr uint32_t bit_SHA = 0x20000000; + static constexpr uint32_t bit_AVX512BW = 0x40000000; + static constexpr uint32_t bit_AVX512VL = 0x80000000; + + /* Features in %ecx for leaf 7 sub-leaf 0 */ + static constexpr uint32_t bit_PREFTCHWT1 = 0x00000001; + static constexpr uint32_t bit_AVX512VBMI = 0x00000002; + static constexpr uint32_t bit_PKU = 0x00000004; + static constexpr uint32_t bit_OSPKE = 0x00000010; + static constexpr uint32_t bit_AVX512VPOPCNTDQ = 0x00004000; + static constexpr uint32_t bit_RDPID = 0x00400000; + + /* Features in %edx for leaf 7 sub-leaf 0 */ + static constexpr uint32_t bit_AVX5124VNNIW = 0x00000004; + static constexpr uint32_t bit_AVX5124FMAPS = 0x00000008; + + /* Features in %eax for leaf 13 sub-leaf 1 */ + static constexpr uint32_t bit_XSAVEOPT = 0x00000001; + static constexpr uint32_t bit_XSAVEC = 0x00000002; + static constexpr uint32_t bit_XSAVES = 0x00000008; + + /* Features in %ecx for leaf = 0x80000001 */; + static constexpr uint32_t bit_LAHF_LM = 0x00000001; + static constexpr uint32_t bit_ABM = 0x00000020; + static constexpr uint32_t bit_SSE4a = 0x00000040; + static constexpr uint32_t bit_PRFCHW = 0x00000100; + static constexpr uint32_t bit_XOP = 0x00000800; + static constexpr uint32_t bit_LWP = 0x00008000; + static constexpr uint32_t bit_FMA4 = 0x00010000; + static constexpr uint32_t bit_TBM = 0x00200000; + static constexpr uint32_t bit_MWAITX = 0x20000000; + + /* Features in %edx for leaf = 0x80000001 */; + static constexpr uint32_t bit_MMXEXT = 0x00400000; + static constexpr uint32_t bit_LM = 0x20000000; + static constexpr uint32_t bit_3DNOWP = 0x40000000; + static constexpr uint32_t bit_3DNOW = 0x80000000; + + /* Features in %ebx for leaf = 0x80000001 */; + static constexpr uint32_t bit_CLZERO = 0x00000001; + + /** + * Reads CPU information and other data. + */ + void loadCpuInformation(); + + /** + * Installed CPU information mapping + */ + struct CpuTopology { + /** + * Number of physical processors installed + */ + uint8_t packageCount {0}; + + /** + * Number of physical cores per package + */ + uint8_t physicalCount[MaxCpus] {}; + + /** + * Number of logical cores per package + */ + uint8_t logicalCount[MaxCpus] {}; + + /** + * Total number of physical cores + */ + inline uint8_t totalPhysical() { + uint8_t count = physicalCount[0]; + for (uint8_t i = 1; i < packageCount; i++) + count += physicalCount[i]; + return count; + } + + /** + * Total number of logical cores + */ + inline uint8_t totalLogical() { + uint8_t count = logicalCount[0]; + for (uint8_t i = 1; i < packageCount; i++) + count += logicalCount[i]; + return count; + } + + /** + * Mapping of cpu_number() to CPU package from 0 to packageCount + */ + uint8_t numberToPackage[MaxCpus] {}; + + /** + * Mapping of cpu_number() to physical core from 0 to physicalCount in package + */ + uint8_t numberToPhysical[MaxCpus] {}; + + /** + * Mapping of cpu_number() to physical cores from 0 to totalPhysical. + */ + inline uint8_t numberToPhysicalUnique(uint8_t i) { + uint8_t num = 0; + uint8_t package = numberToPackage[i]; + for (uint8_t i = 0; i < package; i++) + num += physicalCount[i]; + return num + numberToPhysical[i]; + } + + /** + * Mapping of cpu_number() to logical thread from 0 to logicalCount in package + * Note, that the list is sorted, and the first physicalCount logical threads + * correspond to their corresponding physical cores. + */ + uint8_t numberToLogical[MaxCpus] {}; + }; + + /** + * Get running CPU generation. + * + * @param ofamily a pointer to store CPU family in + * @param omodel a pointer to store CPU model in + * @param ostepping a pointer to store CPU stepping in + * + * @return detected Intel CPU generation + */ + EXPORT CpuGeneration getGeneration(uint32_t *ofamily=nullptr, uint32_t *omodel=nullptr, uint32_t *ostepping=nullptr); + + /** + * Obtain CPU topology. + * + * @param topology parsed cpu topology, must be passed zeroed. + * + * @return true on success + */ + EXPORT bool getCpuTopology(CpuTopology &topology); + + /** + * Obtain cpuid registers + * + * @param no cpuid number + * @param count cpuid count + * @param a eax output pointer (optional) + * @param b ebx output pointer (optional) + * @param c ecx output pointer (optional) + * @param d edx output pointer (optional) + * + * @return true if supported + */ + EXPORT bool getCpuid(uint32_t no, uint32_t count, uint32_t *a, uint32_t *b=nullptr, uint32_t *c=nullptr, uint32_t *d=nullptr); +} + +#endif /* kern_cpu_h */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_devinfo.hpp b/Lilu.kext/Contents/Resources/Headers/kern_devinfo.hpp new file mode 100644 index 0000000..ab22669 --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_devinfo.hpp @@ -0,0 +1,255 @@ +// +// kern_devinfo.hpp +// Lilu +// +// Copyright © 2018 vit9696. All rights reserved. +// + +#ifndef kern_devinfo_h +#define kern_devinfo_h + +#include +#include +#include + +/** + * Obtain installed devices split into categories. + * Should be used from onPatcherLoad and onwards. + */ +class DeviceInfo { + /** + * Updates reportedLayoutId + */ + void updateLayoutId(); + + /** + * Updates reportedFramebufferId + */ + void updateFramebufferId(); + + /** + * Updates firmwareVendor + */ + void updateFirmwareVendor(); + + /** + * Obtains devices from PCI root + * + * @param pciRoot PCI root instance (commonly PCI0@0 device) + */ + void grabDevicesFromPciRoot(IORegistryEntry *pciRoot); + +public: + /** + * Obtains autodetected legacy framebuffer if applicable + * + * @return framebuffer or 0xFFFFFFFF + */ + static uint32_t getLegacyFramebufferId(); + + /** + * Checks whether the framebuffer has connectors or not. + * + * @return true if the framebuffer has no connectors + */ + static bool isConnectorLessPlatformId(uint32_t id); + + /** + * Common external GPU parameter list + */ + struct ExternalVideo { + /** + * Aka GFX0 device + */ + IORegistryEntry *video {nullptr}; + + /** + * Aka HDAU device + */ + IORegistryEntry *audio {nullptr}; + + /** + * External GPU vendor + */ + uint32_t vendor {0}; + }; + + /** + * Aka HDEF device + */ + IORegistryEntry *audioBuiltinAnalog {nullptr}; + + /** + * Aka HDAU device for builtin GPU + */ + IORegistryEntry *audioBuiltinDigital {nullptr}; + + /** + * Aka IGPU device + */ + IORegistryEntry *videoBuiltin {nullptr}; + + /** + * Aka IMEI device + */ + IORegistryEntry *managementEngine {nullptr}; + + /** + * Aka GFX0 devices (kept in sync with audioExternal) + */ + evector videoExternal; + +private: + /** + * This is the default reported layout-id passed to reportedLayoutId. + * The reason for choosing 7 is its presence in 10.14 and the fact + * Apple frameworks still communicate to the files present on disk. + * For information purposes only! Use reportedLayoutId! + */ + static constexpr uint32_t DefaultReportedLayoutId = 7; + + /** + * The boot-arg to override the reported layout-id to AppleHDA. + * For user configuration only! Use reportedLayoutId! + */ + static constexpr const char *ReportedLayoutIdArg = "alcapplid"; + + /** + * The property to override the reported layout-id to AppleHDA. + * For user configuration only! Use reportedLayoutId! + */ + static constexpr const char *ReportedLayoutIdName = "apple-layout-id"; + +public: + /** + * Layout id to be reported by all audio devices (you must update it yourself). + * This follows the standard convention initially found in AppleALC: + * alcapplid=X boot-arg has highest priority and overrides any other value. + * apple-layout-id HDEF prop has normal priority, you may use it if you need. + * DefaultReportedLayoutId will be used if both of the above are not set. + */ + uint32_t reportedLayoutId {0}; + +private: + /** + * The boot-arg to override the reported AAPL,ig-platform-id to Intel drivers. + * For user configuration only! Use reportedFramebufferId! + */ + static constexpr const char *ReportedFrameIdArg = "igfxframe"; + + /** + * The boot-arg to override the reported AAPL,ig-platform-id to Intel drivers. + * Sets VESA framebuffer id (0xFFFFFFFF). + * For user configuration only! Use reportedFramebufferId! + */ + static constexpr const char *ReportedVesaIdArg = "-igfxvesa"; + + /** + * The property to set your platform id for Intel drivers (Ivy and newer). + * For user configuration only! Use reportedFramebufferName! + */ + static constexpr const char *ReportedFrameIdName = "AAPL,ig-platform-id"; + + /** + * The property to set your platform id for Intel drivers (Sandy). + * For user configuration only! Use reportedFramebufferName! + */ + static constexpr const char *ReportedFrameIdLegacyName = "AAPL,snb-platform-id"; + + /** + * Known platform ids used by Intel GPU kexts + * For user configuration only! + */ + static constexpr uint32_t DefaultAppleSkylakePlatformId {0x19120000}; + static constexpr uint32_t DefaultAppleKabyLakePlatformId {0x59160000}; + static constexpr uint32_t DefaultAppleCoffeeLakePlatformId {0x3EA50000}; + static constexpr uint32_t DefaultAppleCannonLakePlatformId {0x5A520000}; + static constexpr uint32_t DefaultAppleIceLakeRealPlatformId {0x8A520000}; + static constexpr uint32_t DefaultAppleIceLakeSimulatorPlatformId {0xFF050000}; + + /** + * Framebuffers without any ports used for hardware acceleration only + * Note 1: Broadwell framebuffers all have connectors added. + * Note 2: Coffee Lake framebuffers without connectors are only present in 10.14. + * Note 3: prerelease Cannon Lake and Ice Lake framebuffers are without connectors. + * For user configuration only! + */ + static constexpr uint32_t ConnectorLessSandyBridgePlatformId1 {0x00030030}; + static constexpr uint32_t ConnectorLessSandyBridgePlatformId2 {0x00050000}; + static constexpr uint32_t ConnectorLessIvyBridgePlatformId1 {0x01620006}; + static constexpr uint32_t ConnectorLessIvyBridgePlatformId2 {0x01620007}; + static constexpr uint32_t ConnectorLessHaswellPlatformId1 {0x04120004}; + static constexpr uint32_t ConnectorLessHaswellPlatformId2 {0x0412000B}; + static constexpr uint32_t ConnectorLessSkylakePlatformId1 {0x19020001}; + static constexpr uint32_t ConnectorLessSkylakePlatformId2 {0x19170001}; + static constexpr uint32_t ConnectorLessSkylakePlatformId3 {0x19120001}; + static constexpr uint32_t ConnectorLessSkylakePlatformId4 {0x19320001}; + static constexpr uint32_t ConnectorLessKabyLakePlatformId1 {0x59180002}; + static constexpr uint32_t ConnectorLessKabyLakePlatformId2 {0x59120003}; + static constexpr uint32_t ConnectorLessCoffeeLakePlatformId1 {0x3E920003}; + static constexpr uint32_t ConnectorLessCoffeeLakePlatformId2 {0x3E910003}; + +public: + /** + * Vesa framebuffer identifier + */ + static constexpr uint32_t DefaultVesaPlatformId {0xFFFFFFFF}; + + /** + * Framebuffer id to be reported to IGPU. + * This follows the standard convention initially found in IntelGraphicsFixup: + * igfxframe=X boot-arg has highest priority and overrides any other value. + * -igfxvesa forces 0xFFFFFFFF frame to get into VESA mode. + * Manually specified AAPL,ig-platform-id or AAPL,snb-platform-id go next. + * On Sandy Bridge processors a default AAPL,snb-platform-id will be tried afterwards. + * On Skylake and Kaby Lake processors some default id will be tried afterwards. + */ + uint32_t reportedFramebufferId {0}; + + /** + * Compatible platform id property name for this IGPU + */ + const char *reportedFramebufferName {nullptr}; + + /** + * Set to true if the framebuffer has no connectors + */ + bool reportedFramebufferIsConnectorLess {false}; + + /** + * Known variants of firmware vendors + * Please note, that it may not be possible to always detect the right vendor + */ + enum class FirmwareVendor { + Unknown, + Apple, + VMware, + EDKII, + Parallels, + AMI, + Insyde, + Phoenix, + HP + }; + + /** + * Firmware vendor manufacturer + */ + FirmwareVendor firmwareVendor {FirmwareVendor::Unknown}; + + /** + * Allocate and initialise the device list. + * + * @return device list or nullptr + */ + EXPORT static DeviceInfo *create(); + + /** + * Release initialised device list. + * + * @param d device list + */ + EXPORT static void deleter(DeviceInfo *d); +}; + +#endif /* kern_devinfo_h */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp b/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp index ba1b9ca..fbabac7 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_disasm.hpp @@ -22,6 +22,7 @@ #include class Disassembler { +#ifdef LILU_ADVANCED_DISASSEMBLY /** * Because captsone handle can be 0 */ @@ -30,7 +31,8 @@ class Disassembler { /** * Internal capstone handle */ - size_t handle; + size_t handle {}; +#endif /** * Max instruction size @@ -38,10 +40,22 @@ class Disassembler { static constexpr size_t MaxInstruction {15}; public: + /** + * Return the real instruction size contained within min bytes + * Unlike instructionSize this uses HDE engine and at the cost of reduced compatibility it is much faster + * Note: instruction pointer should point to at least min + 32 valid bytes. + * + * @param ptr instruction pointer + * @param min minimal possible size + * + * @return instruction size >= min on success or 0 + */ + EXPORT static size_t quickInstructionSize(mach_vm_address_t ptr, size_t min); + #ifdef LILU_ADVANCED_DISASSEMBLY /** - * Initialise dissassembling framework + * Initialise advanced dissassembling framework * * @param detailed debugging output necessity * @@ -50,25 +64,10 @@ class Disassembler { EXPORT bool init(bool detailed=false); /** - * Deinitialise dissassembling framework, must be called regardless of the init error + * Deinitialise advanced dissassembling framework, must be called regardless of the init error */ EXPORT void deinit(); -#endif /* LILU_ADVANCED_DISASSEMBLY */ - - /** - * Return the real instruction size contained within min bytes - * Unlike instructionSize this uses HDE engine and at the cost of reduced compatibility it is much faster - * - * @param ptr instruction pointer - * @param min minimal possible size - * - * @return instruction size >= min on success or 0 - */ - EXPORT static size_t quickInstructionSize(mach_vm_address_t ptr, size_t min); - -#ifdef LILU_ADVANCED_DISASSEMBLY - /** * Reads size bytes from addr and disassembles them. * diff --git a/Lilu.kext/Contents/Resources/Headers/kern_efi.hpp b/Lilu.kext/Contents/Resources/Headers/kern_efi.hpp new file mode 100644 index 0000000..48c6fa5 --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_efi.hpp @@ -0,0 +1,86 @@ +// +// kern_efi.hpp +// Lilu +// +// Copyright © 2018 vit9696. All rights reserved. +// + +#ifndef kern_efi_h +#define kern_efi_h + +#include + +#include + +/** + * Convert 32-bit EFI errors provided by Apple to 64-bit EFI errors + */ +#define EFI_ERROR64(x) (((x) & ~(1ULL << 31)) | (1ULL << 63)) +static_assert(EFI_LOAD_ERROR == 0x80000001 && EFI_ERROR64(EFI_LOAD_ERROR) == 0x8000000000000001, + "Apple has finally upgraded EFI headers!"); + +class EfiRuntimeServices { + IOLock *accessLock {nullptr}; + static EfiRuntimeServices *instance; +public: + /** + * Activates EFI Runtime Services + */ + static void activate(); + + /** + * Lilu custom GUIDs exports, see Headers/Guid/LiluVariables.h + */ + EXPORT static const EFI_GUID LiluNormalGuid; + EXPORT static const EFI_GUID LiluReadOnlyGuid; + EXPORT static const EFI_GUID LiluWriteOnlyGuid; + + /** + * Get EFI Runtime Services wrapper if supported + * + * @param lock lock instance during the run, must be put back + * + * @return wrapper instance + */ + EXPORT static EfiRuntimeServices *get(bool lock=false); + + /** + * Put EFI Runtime Services wrapper to unlock + */ + EXPORT void put(); + + /** + * Perform system reset (does not return on success) + * + * @param type reset type + */ + EXPORT void resetSystem(EFI_RESET_TYPE type); + + /** + * Obtain EFI variable, invokes EFI_RUNTIME_SERVICES::GetVariable. + * + * @param name variable name + * @param guid vendor guid + * @param attr variable attributes + * @param size data buffer size updated on read + * @param data read data + * + * @return EFI_STATUS code + */ + EXPORT uint64_t getVariable(const char16_t *name, const EFI_GUID *guid, uint32_t *attr, uint64_t *size, void *data); + + /** + * Set EFI variable, invokes EFI_RUNTIME_SERVICES::SetVariable. + * + * @param name variable name + * @param guid vendor guid + * @param attr variable attributes + * @param size data buffer size + * @param data data to write + * + * @return EFI_STATUS code + */ + EXPORT uint64_t setVariable(const char16_t *name, const EFI_GUID *guid, uint32_t attr, uint64_t size, void *data); +}; + +#endif /* kern_efi_h */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp b/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp index 7958311..6c753dd 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_iokit.hpp @@ -34,7 +34,7 @@ namespace WIOKit { * @return true on success */ template - bool getOSDataValue(const OSObject *obj, const char *name, T &value) { + inline bool getOSDataValue(const OSObject *obj, const char *name, T &value) { if (obj) { auto data = OSDynamicCast(OSData, obj); if (data && data->getLength() == sizeof(T)) { @@ -49,27 +49,67 @@ namespace WIOKit { } return false; } - + + /** + * Read typed OSData through a temp type + * + * @param obj read object + * @param value read value + * @param name propert name + * + * @return true on success + */ + template + inline bool getOSDataValue(const OSObject *obj, const char *name, T &value) { + AS tmp; + if (getOSDataValue(obj, name, tmp)) { + value = static_cast(tmp); + return true; + } + + return false; + } + /** * Read typed OSData from IORegistryEntry * * @see getOSDataValue */ template - bool getOSDataValue(const IORegistryEntry *sect, const char *name, T &value) { + inline bool getOSDataValue(const IORegistryEntry *sect, const char *name, T &value) { return getOSDataValue(sect->getProperty(name), name, value); } - + + /** + * Read typed OSData from IORegistryEntry + * + * @see getOSDataValue + */ + template + inline bool getOSDataValue(const IORegistryEntry *sect, const char *name, T &value) { + return getOSDataValue(sect->getProperty(name), name, value); + } + /** * Read typed OSData from IORegistryEntry * * @see getOSDataValue */ template - bool getOSDataValue(const OSDictionary *dict, const char *name, T &value) { + inline bool getOSDataValue(const OSDictionary *dict, const char *name, T &value) { return getOSDataValue(dict->getObject(name), name, value); } + /** + * Read typed OSData from IORegistryEntry + * + * @see getOSDataValue + */ + template + inline bool getOSDataValue(const OSDictionary *dict, const char *name, T &value) { + return getOSDataValue(dict->getObject(name), name, value); + } + /** * Retrieve property object * @@ -79,7 +119,7 @@ namespace WIOKit { * @return property object (must be released) or nullptr */ EXPORT OSSerialize *getProperty(IORegistryEntry *entry, const char *property); - + /** * Model variants */ @@ -91,14 +131,120 @@ namespace WIOKit { ComputerAny = ComputerLaptop | ComputerDesktop }; }; - + + /** + * PCI GPU Vendor identifiers + */ + struct VendorID { + enum : uint16_t { + ATIAMD = 0x1002, + NVIDIA = 0x10de, + Intel = 0x8086 + }; + }; + + /** + * PCI class codes + */ + struct ClassCode { + enum : uint32_t { + VGAController = 0x30000, + DisplayController = 0x38000, + PCIBridge = 0x60400, + HDADevice = 0x040300, + // This does not seem to be documented. It works on Haswell at least. + IMEI = 0x78000 + }; + }; + + /** + * Definitions of PCI Config Registers + */ + enum PCIRegister : uint8_t { + kIOPCIConfigVendorID = 0x00, + kIOPCIConfigDeviceID = 0x02, + kIOPCIConfigCommand = 0x04, + kIOPCIConfigStatus = 0x06, + kIOPCIConfigRevisionID = 0x08, + kIOPCIConfigClassCode = 0x09, + kIOPCIConfigCacheLineSize = 0x0C, + kIOPCIConfigLatencyTimer = 0x0D, + kIOPCIConfigHeaderType = 0x0E, + kIOPCIConfigBIST = 0x0F, + kIOPCIConfigBaseAddress0 = 0x10, + kIOPCIConfigBaseAddress1 = 0x14, + kIOPCIConfigBaseAddress2 = 0x18, + kIOPCIConfigBaseAddress3 = 0x1C, + kIOPCIConfigBaseAddress4 = 0x20, + kIOPCIConfigBaseAddress5 = 0x24, + kIOPCIConfigCardBusCISPtr = 0x28, + kIOPCIConfigSubSystemVendorID = 0x2C, + kIOPCIConfigSubSystemID = 0x2E, + kIOPCIConfigExpansionROMBase = 0x30, + kIOPCIConfigCapabilitiesPtr = 0x34, + kIOPCIConfigInterruptLine = 0x3C, + kIOPCIConfigInterruptPin = 0x3D, + kIOPCIConfigMinimumGrant = 0x3E, + kIOPCIConfigMaximumLatency = 0x3F + }; + + /** + * Fixed offsets for PCI Config I/O virtual methods + */ + struct PCIConfigOffset { + enum : size_t { + ConfigRead32 = 0x10A, + ConfigWrite32 = 0x10B, + ConfigRead16 = 0x10C, + ConfigWrite16 = 0x10D, + ConfigRead8 = 0x10E, + ConfigWrite8 = 0x10F, + GetBusNumber = 0x11D, + GetDeviceNumber = 0x11E, + GetFunctionNumber = 0x11F + }; + }; + + /** + * PCI Config I/O method prototypes + */ + using t_PCIConfigRead32 = uint32_t (*)(IORegistryEntry *service, uint32_t space, uint8_t offset); + using t_PCIConfigRead16 = uint16_t (*)(IORegistryEntry *service, uint32_t space, uint8_t offset); + using t_PCIConfigRead8 = uint8_t (*)(IORegistryEntry *service, uint32_t space, uint8_t offset); + using t_PCIConfigWrite32 = void (*)(IORegistryEntry *service, uint32_t space, uint8_t offset, uint32_t data); + using t_PCIConfigWrite16 = void (*)(IORegistryEntry *service, uint32_t space, uint8_t offset, uint16_t data); + using t_PCIConfigWrite8 = void (*)(IORegistryEntry *service, uint32_t space, uint8_t offset, uint8_t data); + using t_PCIGetBusNumber = uint8_t (*)(IORegistryEntry *service); + using t_PCIGetDeviceNumber = uint8_t (*)(IORegistryEntry *service); + using t_PCIGetFunctionNumber = uint8_t (*)(IORegistryEntry *service); + + /** + * Read PCI Config register + * + * @param service IOPCIDevice-compatible service. + * @param reg PCI config register + * @param space adress space + * @param size read size for reading custom registers + */ + EXPORT uint32_t readPCIConfigValue(IORegistryEntry *service, uint32_t reg, uint32_t space = 0, uint32_t size = 0); + + /** + * Retrieve PCI device address + * + * @param service IOPCIDevice-compatible service. + * @param bus bus address + * @param device device address + * @param function function address + */ + EXPORT void getDeviceAddress(IORegistryEntry *service, uint8_t &bus, uint8_t &device, uint8_t &function); + /** * Retrieve the computer type * * @return valid computer type or ComputerAny */ EXPORT int getComputerModel(); - + /** * Retrieve computer model and/or board-id properties * @@ -110,7 +256,7 @@ namespace WIOKit { * @return true if relevant properties already are available, otherwise buffers are unchanged */ EXPORT bool getComputerInfo(char *model, size_t modelsz, char *board, size_t boardsz); - + /** * Retrieve an ioreg entry by path/prefix * @@ -124,7 +270,7 @@ namespace WIOKit { * @return entry pointer (must NOT be released) or nullptr (on failure or in proc mode) */ EXPORT IORegistryEntry *findEntryByPrefix(const char *path, const char *prefix, const IORegistryPlane *plane, bool (*proc)(void *, IORegistryEntry *)=nullptr, bool brute=false, void *user=nullptr); - + /** * Retrieve an ioreg entry by path/prefix * @@ -138,6 +284,24 @@ namespace WIOKit { * @return entry pointer (must NOT be released) or nullptr (on failure or in proc mode) */ EXPORT IORegistryEntry *findEntryByPrefix(IORegistryEntry *entry, const char *prefix, const IORegistryPlane *plane, bool (*proc)(void *, IORegistryEntry *)=nullptr, bool brute=false, void *user=nullptr); + + /** + * Check if we are using prelinked kernel/kexts or not + * + * @return true when confirmed that we definitely are + */ + EXPORT bool usingPrelinkedCache(); + + /** + * Properly rename the device + * + * @param entry device to rename + * @param name new name + * @param compat correct compatible + * + * @return true on success + */ + EXPORT bool renameDevice(IORegistryEntry *entry, const char *name, bool compat=true); } #endif /* kern_iokit_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp b/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp index a31b754..329ee08 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_mach.hpp @@ -41,42 +41,30 @@ class MachInfo { bool kaslr_slide_set {false}; // kaslr can be null, used for disambiguation bool allow_decompress {true}; // allows mach decompression bool prelink_slid {false}; // assume kaslr-slid kext addresses + uint64_t self_uuid[2] {}; // saved uuid of the loaded kext or kernel /** - * 16 byte IDT descriptor, used for 32 and 64 bits kernels (64 bit capable cpus!) + * Kernel slide is aligned by 20 bits */ - struct descriptor_idt { - uint16_t offset_low; - uint16_t seg_selector; - uint8_t reserved; - uint8_t flag; - uint16_t offset_middle; - uint32_t offset_high; - uint32_t reserved2; - }; - + static constexpr size_t KASLRAlignment {0x100000}; + /** - * Retrieve the address of the IDT + * Retrieve LC_UUID command value from a mach header * - * @return always returns the IDT address - */ - mach_vm_address_t getIDTAddress(); - - /** - * Calculate the address of the kernel int80 handler + * @param header mach header pointer * - * @return always returns the int80 handler address + * @return UUID or nullptr */ - mach_vm_address_t calculateInt80Address(); - + uint64_t *getUUID(void *header); + /** - * Retrieve LC_UUID command value from a mach header + * Retrieve and preserve LC_UUID command value from a mach header * * @param header mach header pointer * - * @return UUID or nullptr + * @return true on success */ - uint64_t *getUUID(void *header); + bool loadUUID(void *header); /** * Enable/disable the Write Protection bit in CR0 register @@ -140,7 +128,26 @@ class MachInfo { } MachInfo(const MachInfo &) = delete; MachInfo &operator =(const MachInfo &) = delete; - + + /** + * Resolve mach data in the kernel via prelinked cache + * + * @param prelink prelink information source (i.e. Kernel MachInfo) + * + * @return KERN_SUCCESS if loaded + */ + kern_return_t initFromPrelinked(MachInfo *prelink); + + /** + * Resolve mach data in the kernel via filesystem access + * + * @param paths filesystem paths for lookup + * @param num the number of paths passed + * + * @return KERN_SUCCESS if loaded + */ + kern_return_t initFromFileSystem(const char * const paths[], size_t num); + public: /** @@ -187,7 +194,7 @@ class MachInfo { EXPORT void deinit(); /** - * retrieve the mach header and __TEXT addresses + * Retrieve the mach header and __TEXT addresses * * @param slide load slide if calculating for kexts * @param size memory size @@ -208,7 +215,7 @@ class MachInfo { EXPORT kern_return_t setRunningAddresses(mach_vm_address_t slide=0, size_t size=0); /** - * retrieve running mach positions + * Retrieve running mach positions * * @param header pointer to header * @param size file size @@ -216,7 +223,7 @@ class MachInfo { EXPORT void getRunningPosition(uint8_t * &header, size_t &size); /** - * solve a mach symbol (running addresses must be calculated) + * Solve a mach symbol (running addresses must be calculated) * * @param symbol symbol to solve * @@ -225,15 +232,23 @@ class MachInfo { EXPORT mach_vm_address_t solveSymbol(const char *symbol); /** - * find the kernel base address (mach-o header) - * by searching backwards using the int80 handler as starting point + * Find the kernel base address (mach-o header) * * @return kernel base address or 0 */ EXPORT mach_vm_address_t findKernelBase(); /** - * enable/disable interrupt handling + * Compare the loaded kernel with the current UUID (see loadUUID) + * + * @param base image base, pass 0 to use kernel base + * + * @return true if image uuids match + */ + EXPORT bool isCurrentBinary(mach_vm_address_t base=0); + + /** + * Enable/disable interrupt handling * this is similar to ml_set_interrupts_enabled except the return value * * @param enable the desired value @@ -243,7 +258,7 @@ class MachInfo { EXPORT static bool setInterrupts(bool enable); /** - * enable/disable kernel memory write protection + * Enable/disable kernel memory write protection * * @param enable the desired value * @param lock use spinlock to disable cpu preemption (see KernelPatcher::kernelWriteLock) @@ -252,15 +267,6 @@ class MachInfo { */ EXPORT static kern_return_t setKernelWriting(bool enable, IOSimpleLock *lock); - /** - * Compare the loaded kernel with the passed kernel header - * - * @param kernel_header 64-bit mach header of at least HeaderSize size - * - * @return true if the kernel uuids match - */ - EXPORT bool isCurrentKernel(void *kernelHeader); - /** * Find section bounds in a passed binary for provided cpu * diff --git a/Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp b/Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp index 941f75c..2dcb07d 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_nvram.hpp @@ -8,9 +8,10 @@ #ifndef kern_nvram_hpp #define kern_nvram_hpp +#include #include #include -#include +#include #include /** @@ -22,6 +23,14 @@ #define NVRAM_APPLE_FILEVAULT_GUID "8D63D4FE-BD3C-4AAD-881D-86FD974BC1DF" #define NVRAM_APPLE_PASSWORD_UI_GUID "9EBA2D25-BBE3-4AC2-A2C6-C87F44A1278C" +/** + * Custom GUIDs used for Lilu preferences + * Must be kept in sync to Headers/Guid/LiluVariables.h + */ +#define LILU_NORMAL_GUID "2660DD78-81D2-419D-8138-7B1F363F79A6" +#define LILU_READ_ONLY_GUID "E09B9297-7928-4440-9AAB-D1F8536FBF0A" +#define LILU_WRITE_ONLY_GUID "F0B9AF8F-2222-4840-8A37-ECF7CC8C12E1" + /** * Prefix variable name with a GUID */ @@ -56,7 +65,6 @@ class NVStorage { */ EXPORT uint8_t *decompress(const uint8_t *src, uint32_t &size, bool sensitive=false); -public: /** * Value storage options */ @@ -85,7 +93,7 @@ class NVStorage { uint16_t magic {Magic}; uint8_t version {MaxVer}; - uint8_t opts; + uint8_t opts {OptAuto}; }; /** diff --git a/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp b/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp index ff66f39..1ca78e1 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_patcher.hpp @@ -41,7 +41,8 @@ class KernelPatcher { PointerRange, AlreadyDone, LockError, - Unsupported + Unsupported, + InvalidSymbolFound }; /** @@ -88,8 +89,8 @@ class KernelPatcher { FSFallback, // perform fs fallback if kextcache failed Reserved, SysFlagNum, - UserFlagNum = sizeof(size_t)-SysFlagNum }; + static constexpr size_t UserFlagNum {sizeof(size_t)-SysFlagNum}; static_assert(UserFlagNum > 0, "There should be at least one user flag"); const char *id {nullptr}; const char **paths {nullptr}; @@ -97,6 +98,14 @@ class KernelPatcher { bool sys[SysFlagNum] {}; bool user[UserFlagNum] {}; size_t loadIndex {Unloaded}; // Updated after loading + + /** + * Disable this info from being used + * May be called from onPatcherLoad callbacks to disable certain kexts + */ + void switchOff() { + sys[KernelPatcher::KextInfo::Disabled] = true; + } }; static_assert(sizeof(KextInfo) == 5 * sizeof(size_t), "KextInfo is no longer ABI compatible"); @@ -166,7 +175,36 @@ class KernelPatcher { * @return running symbol address or 0 */ EXPORT mach_vm_address_t solveSymbol(size_t id, const char *symbol); - + + /** + * Solve a kinfo symbol in range with designated type + * + * @param id loaded kinfo id + * @param symbol symbol to solve + * @param start start address range + * @param size address range size + * @param crash kernel panic on invalid non-zero address + * + * @return running symbol address or 0 casted to type T (mach_vm_address_t) + */ + template + inline T solveSymbol(size_t id, const char *symbol, mach_vm_address_t start, size_t size, bool crash=false) { + auto addr = solveSymbol(id, symbol); + if (addr) { + if (addr >= start && addr < start + size) + return (T)addr; + + code = Error::InvalidSymbolFound; + SYSTRACE("patcher", "address " PRIKADDR " is out of range " PRIKADDR " with size %lX", + CASTKADDR(addr), CASTKADDR(start), size); + + PANIC_COND(crash, "patcher", "address " PRIKADDR " is out of range " PRIKADDR " with size %lX", + CASTKADDR(addr), CASTKADDR(start), size); + } + + return (T)nullptr; + } + /** * Hook kext loading and unloading to access kexts at early stage */ @@ -239,6 +277,15 @@ class KernelPatcher { * @param patch patch to apply */ EXPORT void applyLookupPatch(const LookupPatch *patch); + + /** + * Apply a find/replace patch with additional constraints + * + * @param patch patch to apply + * @param startingAddress start with this address (or kext/kernel lowest address) + * @param maxSize maximum size to look for (or kext/kernel max size) + */ + EXPORT void applyLookupPatch(const LookupPatch *patch, uint8_t *startingAddress, size_t maxSize); #endif /* LILU_KEXTPATCH_SUPPORT */ /** @@ -267,6 +314,98 @@ class KernelPatcher { */ EXPORT mach_vm_address_t routeBlock(mach_vm_address_t from, const uint8_t *opcodes, size_t opnum, bool buildWrapper=false, bool kernelRoute=true); + /** + * Route virtual function to function + * + * @param obj OSObject-compatible instance + * @param off function offset in a virtual table (arch-neutral, i.e. divided by sizeof(uintptr_t) + * @param func function to replace with + * @param orgFunc pointer to store the original function + * + * @return true on success + */ + template + static inline bool routeVirtual(void *obj, size_t off, T func, T *orgFunc=nullptr) { + // First OSObject (and similar) field is its virtual table. + auto vt = obj ? reinterpret_cast(obj)[0] : nullptr; + if (vt) { + // Do not try to replace twice! + if (vt[off] == func) + return false; + if (orgFunc) *orgFunc = vt[off]; + vt[off] = func; + return true; + } + return false; + } + + /** + * Route request to simplify casting and error handling + * See routeMultiple. + * + * symbol symbol to lookup + * from solved symbol (assigned by routeMultiple) + * to destination address + * org trampoline storage to the original symbol + */ + struct RouteRequest { + const char *symbol {nullptr}; + mach_vm_address_t from {0}; + const mach_vm_address_t to {0}; + mach_vm_address_t *org {nullptr}; + + /** + * Construct RouteRequest for wrapping a function + * @param s symbol to lookup + * @param t destination address + * @param o trampoline storage to the original symbol + */ + template + RouteRequest(const char *s, T t, mach_vm_address_t &o) : + symbol(s), to(reinterpret_cast(t)), org(&o) { } + + /** + * Construct RouteRequest for routing a function + * @param s symbol to lookup + * @param t destination address + */ + template + RouteRequest(const char *s, T t) : + symbol(s), to(reinterpret_cast(t)) { } + }; + + /** + * Simple route multiple functions with basic error handling + * + * @param id kernel item identifier + * @param requests an array of requests to replace + * @param num requests array size + * @param start start address range + * @param size address range size + * @param kernelRoute kernel change requiring memory protection changes and patch reverting at unload + * @param force continue on first error + * + * @return false if it at least one error happened + */ + EXPORT bool routeMultiple(size_t id, RouteRequest *requests, size_t num, mach_vm_address_t start=0, size_t size=0, bool kernelRoute=true, bool force=false); + + /** + * Simple route multiple functions with basic error handling + * + * @param id kernel item identifier + * @param requests an array of requests to replace + * @param start start address range + * @param size address range size + * @param kernelRoute kernel change requiring memory protection changes and patch reverting at unload + * @param force continue on first error + * + * @return false if it at least one error happened + */ + template + inline bool routeMultiple(size_t id, RouteRequest (&requests)[N], mach_vm_address_t start=0, size_t size=0, bool kernelRoute=true, bool force=false) { + return routeMultiple(id, requests, N, start, size, kernelRoute, force); + } + private: /** @@ -282,7 +421,7 @@ class KernelPatcher { /** * Offset to tempExecutableMemory that is safe to use */ - off_t tempExecutableMemoryOff {0}; + size_t tempExecutableMemoryOff {0}; /** * Patcher status @@ -328,9 +467,9 @@ class KernelPatcher { #endif /* LILU_KEXTPATCH_SUPPORT */ /** - * Local disassmebler instance, initialised on demand + * Kernel prelink image in case prelink is used */ - Disassembler disasm; + MachInfo *prelinkInfo {nullptr}; /** * Loaded kernel items @@ -370,31 +509,28 @@ class KernelPatcher { * Jump instruction sizes */ static constexpr size_t SmallJump {1 + sizeof(int32_t)}; - static constexpr size_t LongJump {2 * sizeof(uint64_t)}; + static constexpr size_t LongJump {6 + sizeof(uint64_t)}; /** * Possible kernel paths */ #ifdef LILU_COMPRESSION_SUPPORT - static constexpr size_t kernelPathsNum {10}; -#else - static constexpr size_t kernelPathsNum {4}; -#endif /* LILU_COMPRESSION_SUPPORT */ - const char *kernelPaths[kernelPathsNum] { -#ifdef LILU_COMPRESSION_SUPPORT + const char *prelinkKernelPaths[6] { + // This is the usual kernel cache place, which often the best thing to use "/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache", - "/System/Library/PrelinkedKernels/prelinkedkernel", -#endif /* LILU_COMPRESSION_SUPPORT */ + // Otherwise fallback to one of the prelinked kernels + // Since we always verify the LC_UUID value, trying the kernels could be done in any order. + "/System/Library/PrelinkedKernels/prelinkedkernel", // normal + "/macOS Install Data/Locked Files/Boot Files/prelinkedkernel", // 10.13 installer + "/com.apple.boot.R/prelinkedkernel", // 10.12+ fusion drive installer + "/com.apple.boot.S/System/Library/PrelinkedKernels/prelinkedkernel", // 10.11 fusion drive installer + "/com.apple.recovery.boot/prelinkedkernel" // recovery + }; +#endif + + const char *kernelPaths[2] { "/System/Library/Kernels/kernel", //since 10.10 - "/mach_kernel", -#ifdef LILU_COMPRESSION_SUPPORT - "/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache.debug", - "/System/Library/Caches/com.apple.kext.caches/Startup/kernelcache.development", - "/System/Library/PrelinkedKernels/prelinkedkernel.debug", - "/System/Library/PrelinkedKernels/prelinkedkernel.development", -#endif /* LILU_COMPRESSION_SUPPORT */ - "/System/Library/Kernels/kernel.debug", - "/System/Library/Kernels/kernel.development" + "/mach_kernel" }; }; diff --git a/Lilu.kext/Contents/Resources/Headers/kern_rtc.hpp b/Lilu.kext/Contents/Resources/Headers/kern_rtc.hpp new file mode 100644 index 0000000..c4bd831 --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_rtc.hpp @@ -0,0 +1,229 @@ +// +// kern_rtc.hpp +// Lilu +// +// Copyright © 2018 vit9696. All rights reserved. +// + +#ifndef kern_rtc_h +#define kern_rtc_h + +#include +#include + +#pragma clang diagnostic push +#pragma clang diagnostic ignored "-Winconsistent-missing-override" +#include +#pragma clang diagnostic pop + +class RTCStorage { + /** + * General access RTC ports on x86 systems. + */ + static constexpr uint8_t R_PCH_RTC_INDEX = 0x70; + static constexpr uint8_t R_PCH_RTC_TARGET = 0x71; + static constexpr uint8_t R_PCH_RTC_EXT_INDEX = 0x72; + static constexpr uint8_t R_PCH_RTC_EXT_TARGET = 0x73; + + /** + * RTC has N banks (we support up to 2) of memory. + */ + static constexpr uint8_t RTC_BANK_SIZE = 0x80; + + /** + * Non-ext RTC index register uses higher bit for nmi. + */ + static constexpr uint8_t RTC_DATA_MASK = 0x7F; + static constexpr uint8_t RTC_NMI_MASK = 0x80; + + /** + * Apple-specific RTC checksum addresses + */ + static constexpr uint8_t APPLERTC_HASHED_ADDR = 0x0E; + static constexpr uint8_t APPLERTC_CHECKSUM_ADDR1 = 0x58; + static constexpr uint8_t APPLERTC_CHECKSUM_ADDR2 = 0x59; + + /** + * AppleRTC service handle + */ + IOService *rtcSrv {nullptr}; + + /** + * Low-level RTC read (does not check memory availability). + * + * @param dev RTC ACPI device + * @param offset offset + * + * @result read value + */ + static uint8_t readByte(IOACPIPlatformDevice *dev, uint8_t offset); + + /** + * Low-level RTC write (does not check memory availability). + * + * @param dev RTC ACPI device + * @param offset offset + * @param value value + */ + static void writeByte(IOACPIPlatformDevice *dev, uint8_t offset, uint8_t value); +public: + /** + * Attempt to connect to active RTC service + * + * @param wait wait for service availability + * + * @return true on success + */ + EXPORT bool init(bool wait=true); + + /** + * Release obtained RTC service + */ + EXPORT void deinit(); + + /** + * Check whether extended (higher 128 bytes) is available + * + * @return true on success + */ + EXPORT bool checkExtendedMemory(); + + /** + * Read memory from RTC + * + * @param off offset to read data from + * @param size data size + * @param buffer data buffer to read to + * + * @return true on success + */ + EXPORT bool read(uint64_t off, uint32_t size, uint8_t *buffer); + + /** + * Write memory to RTC + * + * @param off offset to write data to + * @param size data size + * @param buffer data buffer to write from + * + * @return true on success + */ + EXPORT bool write(uint64_t off, uint32_t size, uint8_t *buffer); + + /** + * Obtain RTC device for direct writing. + * Written as inline to avoid IOACPIPlatformDevice dependency. + * + * @param name device name + * + * @return RTC ACPI device for I/O access, must be released + */ + static inline IOACPIPlatformDevice *getRTCDevice(const char *name = "PNP0B00") { + IOService *rtcDev = nullptr; + auto matching = IOService::nameMatching(name); + if (matching) { + rtcDev = IOService::waitForMatchingService(matching); + matching->release(); + } else { + SYSLOG("rtc", "failed to allocate rtc device matching"); + } + + if (rtcDev) { + DBGLOG("rtc", "got rtc device"); + auto acpiDev = OSDynamicCast(IOACPIPlatformDevice, rtcDev); + if (acpiDev) { + DBGLOG("rtc", "got rtc acpi device"); + return acpiDev; + } else { + SYSLOG("rtc", "failed to obtain rtc acpi device"); + rtcDev->release(); + } + } + + SYSLOG("rtc", "failed to get rtc device"); + return nullptr; + } + + /** + * Directly read RTC memory (UNSAFE, usage with caution!) + * + * @param dev RTC device + * @param off offset to read data from + * @param size data size + * @param buffer data buffer to read to + * @param introff turn interrupts off + * + * @return true on success + */ + EXPORT static void readDirect(IOACPIPlatformDevice *dev, uint8_t off, uint16_t size, uint8_t *buffer, bool introff); + + /** + * Directly write RTC memory (UNSAFE, usage with caution!) + * + * @param dev RTC device + * @param off offset to read data from + * @param size data size + * @param buffer data buffer to read to + * @param updatecrc recalculate crc on write + * @param introff turn interrupts off + * + * @return true on success + */ + EXPORT static void writeDirect(IOACPIPlatformDevice *dev, uint8_t off, uint16_t size, uint8_t *buffer, bool updatecrc, bool introff); + + + /** + * Directly read RTC memory (UNSAFE, usage with caution!), this is just a compatibility function. + * + * @param off offset to read data from + * @param size data size + * @param buffer data buffer to read to + * @param introff turn interrupts off + * + * @return true on success + */ + static inline bool readDirect(uint8_t off, uint16_t size, uint8_t *buffer, bool introff) { + if (size > RTC_BANK_SIZE*2 - off) { + SYSLOG("rtc", "reading unsupported size"); + return false; + } + + auto rtc = getRTCDevice(); + if (rtc) { + readDirect(rtc, off, size, buffer, introff); + rtc->release(); + return true; + } + + return false; + } + + /** + * Directly write RTC memory (UNSAFE, usage with caution!), this is just a compatibility function. + * + * @param off offset to read data from + * @param size data size + * @param buffer data buffer to read to + * @param updatecrc recalculate crc on write + * @param introff turn interrupts off + * + * @return true on success + */ + static inline bool writeDirect(uint8_t off, uint16_t size, uint8_t *buffer, bool updatecrc, bool introff) { + if (size > RTC_BANK_SIZE*2 - off) { + SYSLOG("rtc", "writing unsupported size"); + return false; + } + + auto rtc = getRTCDevice(); + if (rtc) { + writeDirect(rtc, off, size, buffer, updatecrc, introff); + rtc->release(); + return true; + } + + return false; + } +}; + +#endif /* kern_rtc_h */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_time.hpp b/Lilu.kext/Contents/Resources/Headers/kern_time.hpp new file mode 100644 index 0000000..41d2f91 --- /dev/null +++ b/Lilu.kext/Contents/Resources/Headers/kern_time.hpp @@ -0,0 +1,135 @@ +// +// kern_time.hpp +// Lilu +// +// Copyright © 2018 vit9696. All rights reserved. +// + +#ifndef kern_time_hpp +#define kern_time_hpp + +#include + +/** + * Obtain current system time in nanoseconds + * + * @return current time + */ +inline uint64_t getCurrentTimeNs() { + uint64_t currt = 0; + absolutetime_to_nanoseconds(mach_absolute_time(), &currt); + return currt; +} + +/** + * Obtain current calendar system time in nanoseconds + * + * @return current time + */ +inline uint64_t getCalendarTimeNs() { + clock_sec_t sc; + clock_nsec_t ns; + clock_get_calendar_nanotime(&sc, &ns); + return static_cast(sc) * NSEC_PER_SEC + ns; +} + +/** + * Obtain time passed since some timestamp in nanoseconds + * + * @param start starting timestamp + * @param current timestamp to check against (pass 0 for current time) + * + * @return delta or 0 (if current time equals or precedeces the start) + */ +inline uint64_t getTimeSinceNs(uint64_t start, uint64_t current = 0) { + if (current == 0) + current = getCurrentTimeNs(); + if (current > start) + return current - start; + return 0; +} + +/** + * Obtain time left till a timestamp in the future in nanoseconds + * + * @param start starting timestamp + * @param timeout timeout for the event + * @param current timestamp to check against (pass 0 for current time) + * + * @return delta or 0 (if the timeout is over) + */ +inline uint64_t getTimeLeftNs(uint64_t start, uint64_t timeout, uint64_t current = 0) { + if (current == 0) + current = getCurrentTimeNs(); + if (start + timeout > current) + return start + timeout - current; + return 0; +} + +/** + * Convert from nanoseconds to milliseconds + * + * @param t timestamp in ns + * + * @return timestamp in ms + */ +constexpr uint64_t convertNsToMs(uint64_t t) { + return t / 1000000; +} + +/** + * Convert from nanoseconds to seconds + * + * @param t timestamp in ns + * + * @return timestamp in s + */ +constexpr uint64_t convertNsToSc(uint64_t t) { + return t / 1000000000; +} + +/** + * Convert from milliseconds to seconds + * + * @param t timestamp in ms + * + * @return timestamp in s + */ +constexpr uint64_t convertMsToSc(uint64_t t) { + return t / 1000; +} + +/** + * Convert from milliseconds to nanoseconds + * + * @param t timestamp in ms + * + * @return timestamp in ns + */ +constexpr uint64_t convertMsToNs(uint64_t t) { + return t * 1000000; +} + +/** + * Convert from seconds to nanoseconds + * + * @param t timestamp in s + * + * @return timestamp in ns + */ +constexpr uint64_t convertScToNs(uint64_t t) { + return t * 1000000000; +} + +/** + * Convert from seconds to milliseconds + * + * @param t timestamp in s + * + * @return timestamp in ms + */ +constexpr uint64_t convertScToMs(uint64_t t) { + return t * 1000; +} + +#endif /* kern_time_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/kern_user.hpp b/Lilu.kext/Contents/Resources/Headers/kern_user.hpp index 7a81aa3..26df5a0 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_user.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_user.hpp @@ -130,9 +130,14 @@ class UserPatcher { MatchMask = MatchExact | MatchAny | MatchPrefix | MatchSuffix }; - const char *path; - uint32_t len; - uint32_t section; + /** + * Unused (aka disabled) proc info section + */ + static constexpr uint32_t SectionDisabled {0}; + + const char *path {nullptr}; + uint32_t len {0}; + uint32_t section {SectionDisabled}; uint32_t flags {MatchExact}; }; @@ -158,7 +163,51 @@ class UserPatcher { * @param user pointer that will be passed to the callback function */ bool registerPatches(ProcInfo **procs, size_t procNum, BinaryModInfo **mods, size_t modNum, t_BinaryLoaded callback, void *user); - + + /** + * Reads current process header + * + * @param map vm map + * @param header Mach-O header + * + * @return false on failure + */ + EXPORT bool getTaskHeader(vm_map_t map, mach_header_64 &header); + + /** + * Disables dyld_shared_cache for the current process + * + * @param map vm map + * + * @return false on mach image failure + */ + EXPORT bool injectRestrict(vm_map_t map); + + /** + * Injects payload into the process right after the header with EP replacement. + * + * @param map vm map + * @param payload code + * @param size code size (up to PAGE_SIZE) + * @param ep original entrypoint (may be written to code before copying) + * + * @return false on mach image failure + */ + EXPORT bool injectPayload(vm_map_t map, uint8_t *payload, size_t size, void *ep=nullptr); + + /** + * Allocates a new segment in the process. + * + * @param map vm map + * @param addr allocation address (e.g. a little below SHARED_REGION_BASE_X86_64) + * @param payload code + * @param size code size (must be PAGE_SIZE-aligned) + * @param prot segment protection + * + * @return allocated address or 0 on failure + */ + EXPORT vm_address_t injectSegment(vm_map_t taskPort, vm_address_t addr, uint8_t *payload, size_t size, vm_prot_t prot); + /** * Activates monitoring functions if necessary */ @@ -175,6 +224,7 @@ class UserPatcher { using t_codeSignValidateRangeWrapper = boolean_t (*)(void *, memory_object_t, memory_object_offset_t, const void *, memory_object_size_t, unsigned *); using t_vmSharedRegionMapFile = kern_return_t (*)(vm_shared_region_t, unsigned int, shared_file_mapping_np *, memory_object_control_t, memory_object_size_t, void *, uint32_t, user_addr_t slide_start, user_addr_t); using t_vmSharedRegionSlide = int (*)(uint32_t, mach_vm_offset_t, mach_vm_size_t, mach_vm_offset_t, mach_vm_size_t, memory_object_control_t); + using t_vmSharedRegionSlideMojave = int (*)(uint32_t, mach_vm_offset_t, mach_vm_size_t, mach_vm_offset_t, mach_vm_size_t, mach_vm_offset_t, memory_object_control_t); using t_currentMap = vm_map_t (*)(void); using t_getTaskMap = vm_map_t (*)(task_t); using t_getMapMin = vm_map_offset_t (*)(vm_map_t); @@ -190,6 +240,7 @@ class UserPatcher { t_codeSignValidateRangeWrapper orgCodeSignValidateRangeWrapper {nullptr}; t_vmSharedRegionMapFile orgVmSharedRegionMapFile {nullptr}; t_vmSharedRegionSlide orgVmSharedRegionSlide {nullptr}; + t_vmSharedRegionSlideMojave orgVmSharedRegionSlideMojave {nullptr}; t_currentMap orgCurrentMap {nullptr}; t_getMapMin orgGetMapMin {nullptr}; t_getTaskMap orgGetTaskMap {nullptr}; @@ -208,6 +259,7 @@ class UserPatcher { static kern_return_t vmSharedRegionMapFile(vm_shared_region_t shared_region, unsigned int mappings_count, shared_file_mapping_np *mappings, memory_object_control_t file_control, memory_object_size_t file_size, void *root_dir, uint32_t slide, user_addr_t slide_start, user_addr_t slide_size); static void execsigs(proc_t p, thread_t thread); static int vmSharedRegionSlide(uint32_t slide, mach_vm_offset_t entry_start_address, mach_vm_size_t entry_size, mach_vm_offset_t slide_start, mach_vm_size_t slide_size, memory_object_control_t sr_file_control); + static int vmSharedRegionSlideMojave(uint32_t slide, mach_vm_offset_t entry_start_address, mach_vm_size_t entry_size, mach_vm_offset_t slide_start, mach_vm_size_t slide_size, mach_vm_offset_t slid_mapping, memory_object_control_t sr_file_control); static proc_t procExecSwitchTask(proc_t p, task_t current_task, task_t new_task, thread_t new_thread); /** @@ -305,7 +357,7 @@ class UserPatcher { /** * Provided global callback for on proc invocation */ - ppair userCallback; + ppair userCallback {}; /** * Applies dyld shared cache patches @@ -363,7 +415,7 @@ class UserPatcher { }; struct Lookup { - uint32_t offs[4]; + uint32_t offs[4] {}; static constexpr size_t matchNum {4}; evector c[matchNum]; }; @@ -379,7 +431,7 @@ class UserPatcher { sizeof(segment_command_64), "__RESTRICT", SHARED_REGION_BASE_X86_64, - 1 + 1, 0, 0, 0, 0, 0, 0 }; /** @@ -390,14 +442,14 @@ class UserPatcher { sizeof(segment_command), "__RESTRICT", SHARED_REGION_BASE_I386, - 1 + 1, 0, 0, 0, 0, 0, 0 }; /** - * Temporary header for reading data + * Temporary buffer for reading image data */ - mach_header_64 tmpHeader; - + uint8_t tmpBufferData[PAGE_SIZE*3] {}; + /** * Kernel auth listener handle */ @@ -411,7 +463,7 @@ class UserPatcher { /** * Validation cookie */ - void *cookie = {reinterpret_cast(0xB16B00B5)}; + void *cookie {nullptr}; /** * Exec callback @@ -463,16 +515,7 @@ class UserPatcher { * @return true on success */ bool hookMemoryAccess(); - - /** - * Disables dyld_shared_cache for the current process - * - * @param map vm map - * - * @return false on mach image failure - */ - bool injectRestrict(vm_map_t map); - + /** * Peforms the actual binary patching * @@ -483,13 +526,14 @@ class UserPatcher { void patchBinary(vm_map_t map, const char *path, uint32_t len); /** - * Possible dyld shared cache map paths + * Dyld shared cache map path for 10.10+ on Haswell */ - static constexpr size_t sharedCacheMapPathsNum {2}; - const char *sharedCacheMap[sharedCacheMapPathsNum] { - "/private/var/db/dyld/dyld_shared_cache_x86_64h.map", //since 10.10 - "/private/var/db/dyld/dyld_shared_cache_x86_64.map" - }; + static constexpr const char *SharedCacheMapHaswell {"/private/var/db/dyld/dyld_shared_cache_x86_64h.map"}; + + /** + * Dyld shared cache map path for all other systems and older CPUs + */ + static constexpr const char *SharedCacheMapLegacy {"/private/var/db/dyld/dyld_shared_cache_x86_64.map"}; }; diff --git a/Lilu.kext/Contents/Resources/Headers/kern_util.hpp b/Lilu.kext/Contents/Resources/Headers/kern_util.hpp index a80616b..727f086 100644 --- a/Lilu.kext/Contents/Resources/Headers/kern_util.hpp +++ b/Lilu.kext/Contents/Resources/Headers/kern_util.hpp @@ -34,6 +34,13 @@ */ extern bool ADDPR(debugEnabled); +/** + * Debugging print delay used as an ugly hack around printf bufferisation, + * which results in messages not appearing in the boot log. + * Use liludelay=1000 (1 second) boot-arg to put a second after each message. + */ +extern uint32_t ADDPR(debugPrintDelay); + /** * Kernel version major */ @@ -54,6 +61,11 @@ extern vm_map_t kernel_map; */ extern proc_t kernproc; +/** + * For noreturn failures + */ +#define UNREACHABLE() do { __builtin_unreachable(); } while (0) + /** * Conditional logging to system log prefixed with you plugin name * @@ -62,8 +74,10 @@ extern proc_t kernproc; */ #define SYSLOG_COND(cond, module, str, ...) \ do { \ - if (cond) \ - IOLog( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + if (cond) { \ + IOLog( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + if (ADDPR(debugPrintDelay) > 0) IOSleep(ADDPR(debugPrintDelay)); \ + } \ } while (0) /** @@ -83,8 +97,10 @@ extern proc_t kernproc; */ #define SYSTRACE_COND(cond, module, str, ...) \ do { \ - if (cond) \ - OSReportWithBacktrace( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + if (cond) { \ + SYSLOG(module, str, ## __VA_ARGS__); \ + OSReportWithBacktrace( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + } \ } while (0) /** @@ -104,8 +120,10 @@ extern proc_t kernproc; */ #define PANIC_COND(cond, module, str, ...) \ do { \ - if (cond) \ - (panic)( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + if (cond) { \ + (panic)( "%s%10s" str "\n", xStringify(PRODUCT_NAME) ": ", module " @ ", ## __VA_ARGS__); \ + UNREACHABLE(); \ + } \ } while (0) /** @@ -127,7 +145,7 @@ extern proc_t kernproc; */ #define DBGLOG_COND(cond, module, str, ...) \ do { \ - SYSLOG_COND(ADDPR(debugEnabled) && (cond), module, "%s" str, "(DBG) ", ## __VA_ARGS__); \ + SYSLOG_COND(ADDPR(debugEnabled) && (cond), module, "%s" str, "(DBG) ", ## __VA_ARGS__); \ } while (0) /** @@ -147,7 +165,7 @@ extern proc_t kernproc; */ #define DBGTRACE_COND(cond, module, str, ...) \ do { \ - SYSTRACE_COND(ADDPR(debugEnabled) && (cond), module, "%s" str, "(DBG) ", ## __VA_ARGS__); \ + SYSTRACE_COND(ADDPR(debugEnabled) && (cond), module, "%s" str, "(DBG) ", ## __VA_ARGS__); \ } while (0) /** @@ -167,6 +185,41 @@ extern proc_t kernproc; #endif +/** + * Deprecate the interface + */ +#define DEPRECATE(x) __attribute__((deprecated(x))) + +/** + * Macros to bypass kernel address printing protection + */ +#define PRIKADDR "0x%08X%08X" +#define CASTKADDR(x) \ + static_cast(reinterpret_cast(x) >> 32), \ + static_cast(reinterpret_cast(x)) + +/** + * Macros to print the UUID + */ +#define PRIUUID "%02X%02X%02X%02X-%02X%02X-%02X%02X-%02X%02X-%02X%02X%02X%02X%02X%02X" +#define CASTUUID(uuid) \ + reinterpret_cast(uuid)[0], \ + reinterpret_cast(uuid)[1], \ + reinterpret_cast(uuid)[2], \ + reinterpret_cast(uuid)[3], \ + reinterpret_cast(uuid)[4], \ + reinterpret_cast(uuid)[5], \ + reinterpret_cast(uuid)[6], \ + reinterpret_cast(uuid)[7], \ + reinterpret_cast(uuid)[8], \ + reinterpret_cast(uuid)[9], \ + reinterpret_cast(uuid)[10], \ + reinterpret_cast(uuid)[11], \ + reinterpret_cast(uuid)[12], \ + reinterpret_cast(uuid)[13], \ + reinterpret_cast(uuid)[14], \ + reinterpret_cast(uuid)[15] + /** * Export function or symbol for linking */ @@ -198,6 +251,16 @@ EXPORT const char *strstr(const char *stack, const char *needle, size_t len=0); */ EXPORT char *strrchr(const char *stack, int ch); +/** + * XNU kernel implementation of a C-standard qsort function normally not exported by the kernel. + * + * @param a array to sort + * @param n array length + * @param es array element size + * @param cmp array element comparator + */ +EXPORT void qsort(void *a, size_t n, size_t es, int (*cmp)(const void *, const void *)); + /** * Count array elements * @@ -218,6 +281,7 @@ extern "C" { void *kern_os_calloc(size_t num, size_t size); void kern_os_free(void *addr); void *kern_os_realloc(void *addr, size_t nsize); + // kern_os_free does not check its argument for nullptr EXPORT void lilu_os_free(void *addr); } @@ -232,7 +296,8 @@ enum KernelVersion { Yosemite = 14, ElCapitan = 15, Sierra = 16, - HighSierra = 17 + HighSierra = 17, + Mojave = 18, }; /** @@ -258,6 +323,18 @@ inline KernelMinorVersion getKernelMinorVersion() { return static_cast(version_minor); } +/** + * Check whether kernel boot argument is passed ignoring the value (e.g. -arg or arg). + * + * @param name argument name + * + * @return true if argument was passed + */ +inline bool checkKernelArgument(const char *name) { + int val[16]; + return PE_parse_boot_argn(name, val, sizeof(val)); +} + /** * Parse apple version at compile time * @@ -269,17 +346,137 @@ constexpr size_t parseModuleVersion(const char *version) { return (version[0] - '0') * 100 + (version[2] - '0') * 10 + (version[4] - '0'); } +/** + * Access struct member by its offset + * + * @param T pointer to the field you need + * @param that pointer to struct + * @param off offset in bytes to the member + * + * @return reference to the struct member + */ +template +inline T &getMember(void *that, size_t off) { + return *reinterpret_cast(static_cast(that) + off); +} + +/** + * Align value by align (page size by default) + * + * @param size value + * + * @return algined value + */ +template +inline T alignValue(T size, T align = 4096) { + return (size + align - 1) & (~(align - 1)); +} + +/** + * Obtain bit value of size sizeof(T) + * Warning, you are suggested to always pass the type explicitly! + * + * @param n bit no + * + * @return bit value + */ +template +constexpr T getBit(T n) { + return static_cast(1U) << n; +} + +/** + * Obtain bit mask of size sizeof(T) + * Warning, you are suggested to always pass the type explicitly! + * + * @param hi starting high bit + * @param lo ending low bit + * + * @return bit mask + */ +template +constexpr T getBitMask(T hi, T lo) { + return (getBit(hi)|(getBit(hi)-1U)) & ~(getBit(lo)-1U); +} + +/** + * Obtain bit field of size sizeof(T) + * Warning, you are suggested to always pass the type explicitly! + * + * @param so source + * @param hi starting high bit + * @param lo ending low bit + * + * @return bit field value + */ +template +constexpr T getBitField(T so, T hi, T lo) { + return (so & getBitMask(hi, lo)) >> lo; +} + +/** + * Set bit field of size sizeof(T) + * Warning, you are suggested to always pass the type explicitly! + * + * @param va value + * @param hi starting high bit + * @param lo ending low bit + * + * @return bit field value + */ +template +constexpr T setBitField(T so, T hi, T lo) { + return (so << lo) & getBitMask(hi, lo); +} + +/** + * This is an ugly replacement to std::find_if, allowing you + * to check whether a container consists only of value values. + * + * @param in container + * @param size container size + * @param value value to look for + * + * @return true if an element different from value was found + */ +template +inline bool findNotEquals(T &in, size_t size, Y value) { + for (size_t i = 0; i < size; i++) + if (in[i] != value) + return true; + return false; +} + +/** + * Returns non-null string when they can be null + * + * @param str original string + * + * @return non-null string + */ +inline const char *safeString(const char *str) { + return str ? str : "(null)"; +} + +/** + * A shorter form of writing reinterpret_cast(ptr) + */ +template +inline T FunctionCast(T org, mach_vm_address_t ptr) { + return reinterpret_cast(ptr); +} + /** * Typed buffer allocator */ namespace Buffer { template - T *create(size_t size) { + inline T *create(size_t size) { return static_cast(kern_os_malloc(sizeof(T) * size)); } template - bool resize(T *&buf, size_t size) { + inline bool resize(T *&buf, size_t size) { auto nbuf = static_cast(kern_os_realloc(buf, sizeof(T) * size)); if (nbuf) { buf = nbuf; @@ -290,7 +487,7 @@ namespace Buffer { } template - void deleter(T *buf) { + inline void deleter(T *buf) { lilu_os_free(buf); } } @@ -376,7 +573,7 @@ class evector { * * @return element count */ - const size_t size() const { + size_t size() const { return cnt; } @@ -395,7 +592,7 @@ class evector { * * @return element id */ - const size_t last() const { + size_t last() const { return cnt-1; } @@ -449,12 +646,12 @@ class evector { * * @return true on success */ - bool erase(size_t index) { + bool erase(size_t index, bool free=true) { deleter(ptr[index]); if (--cnt != index) lilu_os_memmove(&ptr[index], &ptr[index + 1], (cnt - index) * sizeof(T)); - if (cnt == 0) { + if (free && cnt == 0) { kern_os_free(ptr); ptr = nullptr; rsvd = 0; @@ -517,4 +714,55 @@ class evector { } }; +/** + * Slightly non-standard helpers to get the date in a YYYY-MM-DD format. + */ +template +inline constexpr char getBuildYear() { + static_assert(i < 4, "Year consists of four digits"); + return __DATE__[7+i]; +} + +template +inline constexpr char getBuildMonth() { + static_assert(i < 2, "Month consists of two digits"); + auto mon = *reinterpret_cast(__DATE__); + switch (mon) { + case ' naJ': + return "01"[i]; + case ' beF': + return "02"[i]; + case ' raM': + return "03"[i]; + case ' rpA': + return "04"[i]; + case ' yaM': + return "05"[i]; + case ' nuJ': + return "06"[i]; + case ' luJ': + return "07"[i]; + case ' guA': + return "08"[i]; + case ' peS': + return "09"[i]; + case ' tcO': + return "10"[i]; + case ' voN': + return "11"[i]; + case ' ceD': + return "12"[i]; + } + + return '0'; +} + +template +inline constexpr char getBuildDay() { + static_assert(i < 2, "Day consists of two digits"); + if (i == 0 && __DATE__[4+i] == ' ') + return '0'; + return __DATE__[4+i]; +} + #endif /* kern_util_hpp */ diff --git a/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp b/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp index 0f190b1..7920882 100644 --- a/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp +++ b/Lilu.kext/Contents/Resources/Headers/plugin_start.hpp @@ -46,6 +46,8 @@ class EXPORT PRODUCT_NAME : public IOService { void stop(IOService *provider) override; }; +extern PRODUCT_NAME *ADDPR(selfInstance); + #endif /* LILU_CUSTOM_IOKIT_INIT */ #endif /* kern_start_hpp */ diff --git a/Lilu.kext/Contents/Resources/Library/.DS_Store b/Lilu.kext/Contents/Resources/Library/.DS_Store deleted file mode 100644 index 1ff526e54fa78b60c922c1638efa76d8d2ff55cc..0000000000000000000000000000000000000000 GIT binary patch literal 0 HcmV?d00001 literal 6148 zcmeH~+iDX*7{_PYsIzUPD+sON#e#@8xk#GQdLt|`y$}S&4feuAx+j{go1JA34RMXE zFW|k^TMy5nS3ZC!K8FwBH;2ZyS?Pr!V&{XI{~W$=X6LurnG8Y*cXF?Vkd6={keJpM zAgeIe&(e&|$rcS1^D$hMpfQS3hUkp9YET3efq#tv`*s(Q3*T#ke9-Cl>x|Oa38@49 zKb$xW(yZD1hUeyMXU?7@nzmTi>Pz)U)_{(z%+B((V^QL z`^&)zxne#MOf{nQ_2r^iUu!jt>+MOyC^j~l4P&jnKAC9b(zW)z$Gb0H?!SKX_TBpr zA4L#`eT&-#sR!~23YA>;tRxC)v;+MtmY|e#%Yj?~``-8vx6cRMzW(AywDY8bnp}=R z@dsEWeRx5P#!6ANSAoWA`xp*Fman#M+}a+FpBB$1&tHjEPhl*H`ZV9KTBw)0p#zV~ zyk;nbJ1xtl!+1JGh0l<7yI!8T2z`ma_qgZGI78~4=o1f4p6l3KJM>tmxF~=7WbqU; zP)keY-NZg>$U(), getBuildYear<1>(), getBuildYear<2>(), getBuildYear<3>(), '-', + getBuildMonth<0>(), getBuildMonth<1>(), '-', getBuildDay<0>(), getBuildDay<1>(), '\0' +}; + OSDefineMetaClassAndStructors(PRODUCT_NAME, IOService) +PRODUCT_NAME *ADDPR(selfInstance) = nullptr; + IOService *PRODUCT_NAME::probe(IOService *provider, SInt32 *score) { + ADDPR(selfInstance) = this; + setProperty("VersionInfo", kextVersion); auto service = IOService::probe(provider, score); return ADDPR(startSuccess) ? service : nullptr; } bool PRODUCT_NAME::start(IOService *provider) { + ADDPR(selfInstance) = this; if (!IOService::start(provider)) { SYSLOG("init", "failed to start the parent"); return false; @@ -37,6 +54,7 @@ bool PRODUCT_NAME::start(IOService *provider) { } void PRODUCT_NAME::stop(IOService *provider) { + ADDPR(selfInstance) = nullptr; IOService::stop(provider); } @@ -45,7 +63,10 @@ void PRODUCT_NAME::stop(IOService *provider) { #ifndef LILU_CUSTOM_KMOD_INIT EXPORT extern "C" kern_return_t ADDPR(kern_start)(kmod_info_t *, void *) { - LiluAPI::Error error = lilu.requestAccess(); + // This is an ugly hack necessary on some systems where buffering kills most of debug output. + PE_parse_boot_argn("liludelay", &ADDPR(debugPrintDelay), sizeof(ADDPR(debugPrintDelay))); + + auto error = lilu.requestAccess(); if (error == LiluAPI::Error::NoError) { error = lilu.shouldLoad(ADDPR(config).product, ADDPR(config).version, ADDPR(config).runmode, ADDPR(config).disableArg, ADDPR(config).disableArgNum, ADDPR(config).debugArg, ADDPR(config).debugArgNum, ADDPR(config).betaArg, ADDPR(config).betaArgNum, ADDPR(config).minKernel, diff --git a/Lilu.kext/Contents/Resources/Library/wrappers/build.tool b/Lilu.kext/Contents/Resources/Library/wrappers/build.tool new file mode 100755 index 0000000..14c6dae --- /dev/null +++ b/Lilu.kext/Contents/Resources/Library/wrappers/build.tool @@ -0,0 +1,57 @@ +#!/bin/bash +# +# build.tool +# Lilu +# +# Copyright © 2018 vit9696. All rights reserved. +# + +cd $(dirname "$0") || exit 1 + +rm -f *.o *.bin wrappers.inc entry32 entry64 + +clang -m32 -c entry32.S || exit 1 +clang -m64 -c entry64.S || exit 1 + +clang -m32 entry32.o -o entry32 || exit 1 +clang -m64 entry64.o -o entry64 || exit 1 + +if [ "$(nm entry32.o | grep '00000000 T _main')" == "" ] || [ "$(nm entry64.o | grep '0000000000000000 T _main')" == "" ]; then + echo "Invalid main address" + exit 1 +fi + +otool -t entry32 | grep -E '^0000' | sed 's#^[0-9a-f]*##' | xxd -r -p > entry32.bin +otool -t entry64 | grep -E '^0000' | sed 's#^[0-9a-f]*##' | xxd -r -p > entry64.bin + +sz32=$(stat -f '%z' entry32.bin) +sz64=$(stat -f '%z' entry64.bin) + +btr32=$(nm entry32.o | grep -E 't booter$' | cut -f1 -d' ') +btr64=$(nm entry64.o | grep -E 't booter$' | cut -f1 -d' ') + +ep32=$(nm entry32.o | grep -E 't entrypoint$' | cut -f1 -d' ') +ep64=$(nm entry64.o | grep -E 't entrypoint$' | cut -f1 -d' ') + +echo '//' > wrappers.inc +echo '// wrappers.inc' >> wrappers.inc +echo '// Lilu' >> wrappers.inc +echo '//' >> wrappers.inc +echo '// Copyright © 2018 vit9696. All rights reserved.' >> wrappers.inc +echo '//' >> wrappers.inc +echo '' >> wrappers.inc +echo '// This is an autogenerated file, do not edit!' >> wrappers.inc +echo 'static uint8_t entryWrapper32[] = {' >> wrappers.inc +cat entry32.bin | xxd -i >> wrappers.inc +echo '};' >> wrappers.inc +echo 'static uint8_t entryWrapper64[] = {' >> wrappers.inc +cat entry64.bin | xxd -i >> wrappers.inc +echo '};' >> wrappers.inc +echo "static_assert(sizeof(entryWrapper32) == ${sz32}, \"Invalid entryWrapper32 size\");" >> wrappers.inc +echo "static_assert(sizeof(entryWrapper64) == ${sz64}, \"Invalid entryWrapper64 size\");" >> wrappers.inc +echo "static constexpr size_t EntryWrapper32Booter {0x${btr32}};" >> wrappers.inc +echo "static constexpr size_t EntryWrapper64Booter {0x${btr64}};" >> wrappers.inc +echo "static constexpr size_t EntryWrapper32Entry {0x${ep32}};" >> wrappers.inc +echo "static constexpr size_t EntryWrapper64Entry {0x${ep64}};" >> wrappers.inc + +rm -f *.o *.bin entry32 entry64 diff --git a/Lilu.kext/Contents/Resources/Library/wrappers/entry32.S b/Lilu.kext/Contents/Resources/Library/wrappers/entry32.S new file mode 100644 index 0000000..249172e --- /dev/null +++ b/Lilu.kext/Contents/Resources/Library/wrappers/entry32.S @@ -0,0 +1,41 @@ +# +# entry32.S +# Lilu +# +# Copyright © 2018 vit9696. All rights reserved. +# + +.text +.global _main +_main: + push %ebp + mov %esp, %ebp + # ensure 16-byte alignment + and $0xfffffff0, %esp + # int main(int argc, const char* argv[], const char* envp[], const char* apple[]); + push 20(%ebp) + push 16(%ebp) + push 12(%ebp) + push 8(%ebp) + call get_booter +# entrypoint-compatible wrapper +booter: + .word 0xFFFF + .word 0xFFFF +get_booter: + pop %edx + mov (%edx), %edx + call *%edx + xor %eax, %eax + mov %ebp, %esp + pop %ebp + call get_entrypoint +# original entrypoint (main) +entrypoint: + .word 0xFFFF + .word 0xFFFF +get_entrypoint: + pop %edx + mov (%edx), %edx + jmp *%edx +_end: diff --git a/Lilu.kext/Contents/Resources/Library/wrappers/entry64.S b/Lilu.kext/Contents/Resources/Library/wrappers/entry64.S new file mode 100644 index 0000000..01ccc45 --- /dev/null +++ b/Lilu.kext/Contents/Resources/Library/wrappers/entry64.S @@ -0,0 +1,41 @@ +# +# entry64.S +# Lilu +# +# Copyright © 2018 vit9696. All rights reserved. +# + +.text +.global _main +_main: + push %rbp + mov %rsp, %rbp + # ensure 16-byte alignment + and $0xfffffffffffffff0, %rsp + # int main(int argc, const char* argv[], const char* envp[], const char* apple[]); + push %rdi + push %rsi + push %rdx + push %rcx + call *booter(%rip) + xor %eax, %eax + pop %rcx + pop %rdx + pop %rsi + pop %rdi + mov %rbp, %rsp + pop %rbp + jmp *entrypoint(%rip) +# original entrypoint (main) +entrypoint: + .word 0xFFFF + .word 0xFFFF + .word 0xFFFF + .word 0xFFFF +# entrypoint-compatible wrapper +booter: + .word 0xFFFF + .word 0xFFFF + .word 0xFFFF + .word 0xFFFF +_end: diff --git a/Lilu.kext/Contents/Resources/Library/wrappers/wrappers.inc b/Lilu.kext/Contents/Resources/Library/wrappers/wrappers.inc new file mode 100644 index 0000000..62d919c --- /dev/null +++ b/Lilu.kext/Contents/Resources/Library/wrappers/wrappers.inc @@ -0,0 +1,28 @@ +// +// wrappers.inc +// Lilu +// +// Copyright © 2018 vit9696. All rights reserved. +// + +// This is an autogenerated file, do not edit! +static uint8_t entryWrapper32[] = { + 0x55, 0x89, 0xe5, 0x83, 0xe4, 0xf0, 0xff, 0x75, 0x14, 0xff, 0x75, 0x10, + 0xff, 0x75, 0x0c, 0xff, 0x75, 0x08, 0xe8, 0x04, 0x00, 0x00, 0x00, 0xff, + 0xff, 0xff, 0xff, 0x5a, 0x8b, 0x12, 0xff, 0xd2, 0x31, 0xc0, 0x89, 0xec, + 0x5d, 0xe8, 0x04, 0x00, 0x00, 0x00, 0xff, 0xff, 0xff, 0xff, 0x5a, 0x8b, + 0x12, 0xff, 0xe2 +}; +static uint8_t entryWrapper64[] = { + 0x55, 0x48, 0x89, 0xe5, 0x48, 0x83, 0xe4, 0xf0, 0x57, 0x56, 0x52, 0x51, + 0xff, 0x15, 0x18, 0x00, 0x00, 0x00, 0x31, 0xc0, 0x59, 0x5a, 0x5e, 0x5f, + 0x48, 0x89, 0xec, 0x5d, 0xff, 0x25, 0x00, 0x00, 0x00, 0x00, 0xff, 0xff, + 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, 0xff, + 0xff, 0xff +}; +static_assert(sizeof(entryWrapper32) == 51, "Invalid entryWrapper32 size"); +static_assert(sizeof(entryWrapper64) == 50, "Invalid entryWrapper64 size"); +static constexpr size_t EntryWrapper32Booter {0x00000017}; +static constexpr size_t EntryWrapper64Booter {0x000000000000002a}; +static constexpr size_t EntryWrapper32Entry {0x0000002a}; +static constexpr size_t EntryWrapper64Entry {0x0000000000000022}; From 387aba427e2833d709c2a8fd2e52f1ec4e7c42d4 Mon Sep 17 00:00:00 2001 From: "black.dragon74" Date: Wed, 29 Aug 2018 21:12:22 +0530 Subject: [PATCH 6/8] Added patcher support for macOS Mojave Signed-off-by: black.dragon74 --- ATH9KFixup.xcodeproj/project.pbxproj | 6 +- .../UserInterfaceState.xcuserstate | Bin 47524 -> 91602 bytes ATH9KFixup/Info.plist | 4 +- ATH9KFixup/kern_ath9k.cpp | 152 ++++++++++-------- ATH9KFixup/kern_start.cpp | 2 +- 5 files changed, 96 insertions(+), 68 deletions(-) diff --git a/ATH9KFixup.xcodeproj/project.pbxproj b/ATH9KFixup.xcodeproj/project.pbxproj index c8012e7..fe62890 100644 --- a/ATH9KFixup.xcodeproj/project.pbxproj +++ b/ATH9KFixup.xcodeproj/project.pbxproj @@ -287,6 +287,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; ONLY_ACTIVE_ARCH = YES; SDKROOT = macosx; }; @@ -328,6 +329,7 @@ GCC_WARN_UNINITIALIZED_AUTOS = YES_AGGRESSIVE; GCC_WARN_UNUSED_FUNCTION = YES; GCC_WARN_UNUSED_VARIABLE = YES; + MACOSX_DEPLOYMENT_TARGET = 10.13; SDKROOT = macosx; }; name = Release; @@ -356,7 +358,7 @@ MODULE_NAME = com.chunnann.ATH9KFixup; MODULE_START = "$(PRODUCT_NAME)_kern_start"; MODULE_STOP = "$(PRODUCT_NAME)_kern_stop"; - MODULE_VERSION = 1.2.0; + MODULE_VERSION = 1.2.6; OTHER_CFLAGS = ( "-mmmx", "-msse", @@ -400,7 +402,7 @@ MODULE_NAME = com.chunnann.ATH9KFixup; MODULE_START = "$(PRODUCT_NAME)_kern_start"; MODULE_STOP = "$(PRODUCT_NAME)_kern_stop"; - MODULE_VERSION = 1.2.0; + MODULE_VERSION = 1.2.6; OTHER_CFLAGS = ( "-mmmx", "-msse", diff --git a/ATH9KFixup.xcodeproj/project.xcworkspace/xcuserdata/nick.xcuserdatad/UserInterfaceState.xcuserstate b/ATH9KFixup.xcodeproj/project.xcworkspace/xcuserdata/nick.xcuserdatad/UserInterfaceState.xcuserstate index b5b7e12143a4b8b44de28a710fb949c230f9e541..dc238dad6d694392b87e1a96b72d21f48bed72cd 100644 GIT binary patch literal 91602 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 >!Y3cj)GnRU?_x;`PG(ReC+h1rH()1v+8n$v*JR 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Μ*D9|VZV6LCPZJhnDVAd; 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 XpKTxQcKGl6p1=P0{r|5GT~7WNe-bb_ delta 25351 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 P=lfs6pNtNpQSSQ(IsW1o diff --git a/ATH9KFixup/Info.plist b/ATH9KFixup/Info.plist index 39cb905..f2cad96 100644 --- a/ATH9KFixup/Info.plist +++ b/ATH9KFixup/Info.plist @@ -37,13 +37,13 @@ NSHumanReadableCopyright - Copyright © 2017 chunnann. All rights reserved. + Copyright © 2017 chunnann, black.dragon74. All rights reserved. OSBundleCompatibleVersion 1.0 OSBundleLibraries as.vit9696.Lilu - 1.2.0 + 1.2.6 com.apple.kpi.bsd 12.0.0 com.apple.kpi.dsep diff --git a/ATH9KFixup/kern_ath9k.cpp b/ATH9KFixup/kern_ath9k.cpp index 025e947..d8bf312 100644 --- a/ATH9KFixup/kern_ath9k.cpp +++ b/ATH9KFixup/kern_ath9k.cpp @@ -27,6 +27,9 @@ static KernelPatcher::KextInfo kextList[] { static size_t kextListSize {1}; bool ATH9K::init() { + // So that user can identify successful kext injection. + SYSLOG("ATH9KFixup", "Kext loaded. Patching will start now.\n"); + LiluAPI::Error error = lilu.onKextLoad(kextList, kextListSize, [](void *user, KernelPatcher &patcher, size_t index, mach_vm_address_t address, size_t size) { ATH9K *ath9k = static_cast(user); @@ -156,12 +159,35 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t progressState |= ProcessingState::AirPortAtheros40Patched; DBGLOG("ath9k", " patched ___ath_attach"); } + + // Patch is same as macOS High Sierra (as of now), Just adding patcher support for Mojave + else if (getKernelVersion() == KernelVersion::Mojave){ + const uint8_t find1[] = {0x66, 0x89, 0x83, 0x38, 0x04, 0x00, 0x00}; + const uint8_t replace1[] = {0xC6, 0x83, 0x38, 0x04, 0x00, 0x00, 0x30}; + KextPatch kext_patch1 { + {&kextList[i], find1, replace1, sizeof(find1), 1}, + KernelVersion::Mojave, KernelVersion::Mojave + }; + applyPatches(patcher, index, &kext_patch1, 1); + progressState |= ProcessingState::AirPortAtheros40Patched; + DBGLOG("ath9k", "patched 10.14.x start"); + + const uint8_t find2[] = {0x41, 0x0F, 0xB7, 0xFD, 0x83, 0xFF, 0x30}; + const uint8_t replace2[] = {0x41, 0x0F, 0xB7, 0xFD, 0x83, 0xFF, 0x00}; + KextPatch kext_patch2 { + {&kextList[i], find2, replace2, sizeof(find2), 1}, + KernelVersion::Mojave, KernelVersion::Mojave + }; + applyPatches(patcher, index, &kext_patch2, 1); + progressState |= ProcessingState::AirPortAtheros40Patched; + DBGLOG("ath9k", "patched ___ath_attach"); + } const uint8_t find3[] = {0xC1, 0xE9, 0x0C, 0x81, 0xE1, 0xC0, 0xFF, 0x0F, 0x00}; const uint8_t replace3[] = {0xC1, 0xE9, 0x0C, 0x90, 0xB9, 0xC0, 0x01, 0x00, 0x00}; KextPatch kext_patch3 { {&kextList[i], find3, replace3, sizeof(find3), 4}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch3, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -181,7 +207,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace5[] = {0x90, 0xB9, 0x02, 0x00, 0x00, 0x00}; KextPatch kext_patch5 { {&kextList[i], find5, replace5, sizeof(find5), 5}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch5, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -191,7 +217,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace6[] = {0x90, 0xB8, 0x02, 0x00, 0x00, 0x00}; KextPatch kext_patch6 { {&kextList[i], find6, replace6, sizeof(find6), 3}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch6, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -201,7 +227,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace7[] = {0x0F, 0xB6, 0x87, 0x00, 0xB2, 0x00, 0x00, 0x90, 0x31, 0xC0}; KextPatch kext_patch7 { {&kextList[i], find7, replace7, sizeof(find7), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch7, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -211,7 +237,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace8[] = {0x0F, 0xB6, 0x87, 0x00, 0xB2, 0x00, 0x00, 0x90, 0x31, 0xC0}; KextPatch kext_patch8 { {&kextList[i], find8, replace8, sizeof(find8), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch8, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -221,7 +247,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace9[] = {0xC6, 0x83, 0x16, 0x09, 0x00, 0x00, 0x00}; KextPatch kext_patch9 { {&kextList[i], find9, replace9, sizeof(find9), 4}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch9, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -231,7 +257,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace10[] = {0x48, 0xB9, 0x00, 0x00, 0x00, 0x00, 0x00, 0x20, 0x10, 0x00}; KextPatch kext_patch10 { {&kextList[i], find10, replace10, sizeof(find10), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch10, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -243,7 +269,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace[] = {0x39, 0x34, 0x38, 0x35}; KextPatch kext_patch { {&kextList[i], find, replace, sizeof(find), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -316,7 +342,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace12[] = {0xA2, 0x00, 0x00, 0xBA, 0x01, 0x00, 0x00, 0x00}; KextPatch kext_patch12 { {&kextList[i], find12, replace12, sizeof(find12), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -326,7 +352,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace13[] = {0x83, 0x00, 0x00, 0xBA, 0x01, 0x00, 0x00, 0x00}; KextPatch kext_patch13 { {&kextList[i], find13, replace13, sizeof(find13), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -336,7 +362,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace14[] = {0xBE, 0x84, 0x62, 0x01, 0x00}; KextPatch kext_patch14 { {&kextList[i], find14, replace14, sizeof(find14), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch14, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -346,7 +372,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace15[] = {0xBE, 0x8C, 0x62, 0x01, 0x00}; KextPatch kext_patch15 { {&kextList[i], find15, replace15, sizeof(find15), 4}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch15, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -354,7 +380,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch51 { {&kextList[i], _ar9300_osprey_2p0_mac_core, _ar9485_osprey_2p0_mac_core, sizeof(_ar9300_osprey_2p0_mac_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch51, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -362,7 +388,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch52 { {&kextList[i], _ar9300_osprey_2p0_mac_postamble, _ar9485_osprey_2p0_mac_postamble, sizeof(_ar9300_osprey_2p0_mac_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch52, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -370,7 +396,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch53 { {&kextList[i], _ar9300_osprey_2p0_baseband_core, _ar9485_osprey_2p0_baseband_core, sizeof(_ar9300_osprey_2p0_baseband_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch53, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -378,7 +404,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch54 { {&kextList[i], _ar9300_osprey_2p0_baseband_postamble, _ar9485_osprey_2p0_baseband_postamble, sizeof(_ar9300_osprey_2p0_baseband_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch54, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -386,7 +412,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch55 { {&kextList[i], _ar9300_osprey_2p0_radio_core, _ar9485_osprey_2p0_radio_core, sizeof(_ar9300_osprey_2p0_radio_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch55, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -394,7 +420,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch56 { {&kextList[i], _ar9300_osprey_2p0_radio_postamble, _ar9485_osprey_2p0_radio_postamble, sizeof(_ar9300_osprey_2p0_radio_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch56, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -402,7 +428,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch57 { {&kextList[i], _ar9300_osprey_2p0_soc_preamble, _ar9485_osprey_2p0_soc_preamble, sizeof(_ar9300_osprey_2p0_soc_preamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch57, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -410,7 +436,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch58 { {&kextList[i], _ar9300_osprey_2p0_soc_postamble, _ar9485_osprey_2p0_soc_postamble, sizeof(_ar9300_osprey_2p0_soc_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch58, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -418,7 +444,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch59 { {&kextList[i], _ar9300Common_rx_gain_table_osprey_2p0, _ar9485Common_rx_gain_table_osprey_2p0, sizeof(_ar9300Common_rx_gain_table_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch59, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -426,7 +452,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch60 { {&kextList[i], _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0, _ar9485Modes_lowest_ob_db_tx_gain_table_osprey_2p0, sizeof(_ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch60, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -434,7 +460,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch61 { {&kextList[i], _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, _ar9485PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, sizeof(_ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch61, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -442,7 +468,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch62 { {&kextList[i], _ar9300PciePhy_clkreq_enable_L1_osprey_2p0, _ar9485PciePhy_clkreq_enable_L1_osprey_2p0, sizeof(_ar9300PciePhy_clkreq_enable_L1_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch62, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -450,7 +476,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch63 { {&kextList[i], _ar9300Modes_fast_clock_osprey_2p0, _ar9485Modes_fast_clock_osprey_2p0, sizeof(_ar9300Modes_fast_clock_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch63, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -461,7 +487,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace[] = {0x39, 0x35, 0x36, 0x35}; KextPatch kext_patch { {&kextList[i], find, replace, sizeof(find), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -471,7 +497,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace11[] = {0x8D, 0x90, 0x00, 0x04, 0x08, 0x00}; KextPatch kext_patch11 { {&kextList[i], find11, replace11, sizeof(find11), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch11, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -524,7 +550,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace12[] = {0xA2, 0x00, 0x00, 0xBA, 0x01, 0x00, 0x00, 0x00}; KextPatch kext_patch12 { {&kextList[i], find12, replace12, sizeof(find12), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -534,7 +560,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace13[] = {0x83, 0x00, 0x00, 0xBA, 0x01, 0x00, 0x00, 0x00}; KextPatch kext_patch13 { {&kextList[i], find13, replace13, sizeof(find13), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -544,7 +570,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace14[] = {0xBE, 0x8C, 0x62, 0x01, 0x00}; KextPatch kext_patch14 { {&kextList[i], find14, replace14, sizeof(find14), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch14, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -554,7 +580,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace15[] = {0xBE, 0x94, 0x62, 0x01, 0x00}; KextPatch kext_patch15 { {&kextList[i], find15, replace15, sizeof(find15), 4}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch15, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -562,7 +588,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch51 { {&kextList[i], _ar9300_osprey_2p0_mac_core, _ar9565_osprey_2p0_mac_core, sizeof(_ar9300_osprey_2p0_mac_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch51, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -570,7 +596,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch52 { {&kextList[i], _ar9300_osprey_2p0_mac_postamble, _ar9565_osprey_2p0_mac_postamble, sizeof(_ar9300_osprey_2p0_mac_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch52, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -578,7 +604,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch53 { {&kextList[i], _ar9300_osprey_2p0_baseband_core, _ar9565_osprey_2p0_baseband_core, sizeof(_ar9300_osprey_2p0_baseband_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch53, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -586,7 +612,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch54 { {&kextList[i], _ar9300_osprey_2p0_baseband_postamble, _ar9565_osprey_2p0_baseband_postamble, sizeof(_ar9300_osprey_2p0_baseband_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch54, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -594,7 +620,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch55 { {&kextList[i], _ar9300_osprey_2p0_radio_core, _ar9565_osprey_2p0_radio_core, sizeof(_ar9300_osprey_2p0_radio_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch55, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -602,7 +628,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch56 { {&kextList[i], _ar9300_osprey_2p0_radio_postamble, _ar9565_osprey_2p0_radio_postamble, sizeof(_ar9300_osprey_2p0_radio_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch56, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -610,7 +636,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch57 { {&kextList[i], _ar9300_osprey_2p0_soc_preamble, _ar9565_osprey_2p0_soc_preamble, sizeof(_ar9300_osprey_2p0_soc_preamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch57, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -618,7 +644,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch58 { {&kextList[i], _ar9300_osprey_2p0_soc_postamble, _ar9565_osprey_2p0_soc_postamble, sizeof(_ar9300_osprey_2p0_soc_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch58, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -626,7 +652,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch59 { {&kextList[i], _ar9300Common_rx_gain_table_osprey_2p0, _ar9565Common_rx_gain_table_osprey_2p0, sizeof(_ar9300Common_rx_gain_table_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch59, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -634,7 +660,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch60 { {&kextList[i], _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0, _ar9565Modes_lowest_ob_db_tx_gain_table_osprey_2p0, sizeof(_ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch60, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -642,7 +668,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch61 { {&kextList[i], _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, _ar9565PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, sizeof(_ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch61, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -650,7 +676,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch62 { {&kextList[i], _ar9300PciePhy_clkreq_enable_L1_osprey_2p0, _ar9565PciePhy_clkreq_enable_L1_osprey_2p0, sizeof(_ar9300PciePhy_clkreq_enable_L1_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch62, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -658,7 +684,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch63 { {&kextList[i], _ar9300Modes_fast_clock_osprey_2p0, _ar9565Modes_fast_clock_osprey_2p0, sizeof(_ar9300Modes_fast_clock_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch63, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -669,7 +695,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace[] = {0x39, 0x34, 0x36, 0x58}; KextPatch kext_patch { {&kextList[i], find, replace, sizeof(find), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -679,7 +705,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace11[] = {0x8D, 0x90, 0x00, 0x04, 0x08, 0x00}; KextPatch kext_patch11 { {&kextList[i], find11, replace11, sizeof(find11), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch11, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -732,7 +758,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace12[] = {0xA2, 0x00, 0x00, 0xBA, 0x03, 0x00, 0x00, 0x00}; KextPatch kext_patch12 { {&kextList[i], find12, replace12, sizeof(find12), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch12, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -742,7 +768,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace13[] = {0x83, 0x00, 0x00, 0xBA, 0x03, 0x00, 0x00, 0x00}; KextPatch kext_patch13 { {&kextList[i], find13, replace13, sizeof(find13), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch13, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -752,7 +778,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace14[] = {0xBE, 0x8C, 0x62, 0x01, 0x00}; KextPatch kext_patch14 { {&kextList[i], find14, replace14, sizeof(find14), 2}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch14, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -762,7 +788,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t const uint8_t replace15[] = {0xBE, 0x94, 0x62, 0x01, 0x00}; KextPatch kext_patch15 { {&kextList[i], find15, replace15, sizeof(find15), 4}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch15, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -770,7 +796,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch51 { {&kextList[i], _ar9300_osprey_2p0_mac_core, _ar946x_osprey_2p0_mac_core, sizeof(_ar9300_osprey_2p0_mac_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch51, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -778,7 +804,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch52 { {&kextList[i], _ar9300_osprey_2p0_mac_postamble, _ar946x_osprey_2p0_mac_postamble, sizeof(_ar9300_osprey_2p0_mac_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch52, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -786,7 +812,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch53 { {&kextList[i], _ar9300_osprey_2p0_baseband_core, _ar946x_osprey_2p0_baseband_core, sizeof(_ar9300_osprey_2p0_baseband_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch53, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -794,7 +820,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch54 { {&kextList[i], _ar9300_osprey_2p0_baseband_postamble, _ar946x_osprey_2p0_baseband_postamble, sizeof(_ar9300_osprey_2p0_baseband_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch54, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -802,7 +828,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch55 { {&kextList[i], _ar9300_osprey_2p0_radio_core, _ar946x_osprey_2p0_radio_core, sizeof(_ar9300_osprey_2p0_radio_core), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch55, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -810,7 +836,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch56 { {&kextList[i], _ar9300_osprey_2p0_radio_postamble, _ar946x_osprey_2p0_radio_postamble, sizeof(_ar9300_osprey_2p0_radio_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch56, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -818,7 +844,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch57 { {&kextList[i], _ar9300_osprey_2p0_soc_preamble, _ar946x_osprey_2p0_soc_preamble, sizeof(_ar9300_osprey_2p0_soc_preamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch57, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -826,7 +852,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch58 { {&kextList[i], _ar9300_osprey_2p0_soc_postamble, _ar946x_osprey_2p0_soc_postamble, sizeof(_ar9300_osprey_2p0_soc_postamble), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch58, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -834,7 +860,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch59 { {&kextList[i], _ar9300Common_rx_gain_table_osprey_2p0, _ar946xCommon_rx_gain_table_osprey_2p0, sizeof(_ar9300Common_rx_gain_table_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch59, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -842,7 +868,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch60 { {&kextList[i], _ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0, _ar946xModes_lowest_ob_db_tx_gain_table_osprey_2p0, sizeof(_ar9300Modes_lowest_ob_db_tx_gain_table_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch60, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -850,7 +876,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch61 { {&kextList[i], _ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0, _ar946xPciePhy_pll_on_clkreq_disable_L1_osprey_2p0, sizeof(_ar9300PciePhy_pll_on_clkreq_disable_L1_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch61, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -858,7 +884,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch62 { {&kextList[i], _ar9300PciePhy_clkreq_enable_L1_osprey_2p0, _ar946xPciePhy_clkreq_enable_L1_osprey_2p0, sizeof(_ar9300PciePhy_clkreq_enable_L1_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch62, 1); progressState |= ProcessingState::AirPortAtheros40Patched; @@ -866,7 +892,7 @@ void ATH9K::processKext(KernelPatcher &patcher, size_t index, mach_vm_address_t KextPatch kext_patch63 { {&kextList[i], _ar9300Modes_fast_clock_osprey_2p0, _ar946xModes_fast_clock_osprey_2p0, sizeof(_ar9300Modes_fast_clock_osprey_2p0), 1}, - KernelVersion::Mavericks, KernelVersion::HighSierra + KernelVersion::Mavericks, KernelVersion::Mojave }; applyPatches(patcher, index, &kext_patch63, 1); progressState |= ProcessingState::AirPortAtheros40Patched; diff --git a/ATH9KFixup/kern_start.cpp b/ATH9KFixup/kern_start.cpp index e71771b..3027c3b 100644 --- a/ATH9KFixup/kern_start.cpp +++ b/ATH9KFixup/kern_start.cpp @@ -37,7 +37,7 @@ PluginConfiguration ADDPR(config) { bootargBeta, arrsize(bootargBeta), KernelVersion::Mavericks, - KernelVersion::HighSierra, + KernelVersion::Mojave, []() { ath9k.init(); } From 93095e8ddede4c8018ad45b54d959dd40f76f769 Mon Sep 17 00:00:00 2001 From: "black.dragon74" Date: Wed, 29 Aug 2018 21:13:01 +0530 Subject: [PATCH 7/8] Update injector kext to match plugin version Signed-off-by: black.dragon74 --- ATH9KInjector.kext/Contents/Info.plist | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/ATH9KInjector.kext/Contents/Info.plist b/ATH9KInjector.kext/Contents/Info.plist index 773e4e2..85c0a38 100644 --- a/ATH9KInjector.kext/Contents/Info.plist +++ b/ATH9KInjector.kext/Contents/Info.plist @@ -15,7 +15,7 @@ CFBundlePackageType KEXT CFBundleShortVersionString - 1.2.0 + 1.2.6 CFBundleSignature ???? CFBundleSupportedPlatforms @@ -23,7 +23,7 @@ MacOSX CFBundleVersion - 1.2.0 + 1.2.6 DTCompiler com.apple.compilers.llvm.clang.1_0 DTPlatformBuild @@ -61,6 +61,6 @@ NSHumanReadableCopyright - Copyright © 2017 chunnann. All rights reserved. + Copyright © 2017 chunnann, black.dragon74. All rights reserved. From 1089aee9e941e379a8cbb796ba3231284239a07b Mon Sep 17 00:00:00 2001 From: "black.dragon74" Date: Wed, 29 Aug 2018 21:21:57 +0530 Subject: [PATCH 8/8] Update README and CHANGELOG Signed-off-by: black.dragon74 --- Changelog.md | 4 ++++ README.md | 9 +++++---- 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/Changelog.md b/Changelog.md index f5df896..7520fab 100644 --- a/Changelog.md +++ b/Changelog.md @@ -1,5 +1,9 @@ ATH9KFixup Changelog ==================== +#### v1.2.6 +- Added Lilu 1.2.6 compatibility +- Added macOS Mojave support (untested) +- Updated injector kext to be in sync with plugin version. #### v1.2.0 - Added Lilu 1.2.0 compatibility diff --git a/README.md b/README.md index 34a28a5..e44ffa2 100644 --- a/README.md +++ b/README.md @@ -15,17 +15,18 @@ Boot args: #### Installation -- This kext version requires LILU plugin version 1.2.0+ +- This kext version requires LILU plugin version 1.2.6+ - Download Lilu.kext, ATH9KInjector.kext and ATH9KFixup.kext -- Install them to /S/L/E (Clover injection won't work) +- Inject Lilu.kext and ATH9KFixup.kext using CLOVER bootloader. +- Install ATH9KInjector.kext to /System/Library/Extensions (CLOVER injection won't work). - User -ath9485 boot arg for AR9485 and -ath9565 for AR9565 (If you don't use any boot args it will do the patching for AR946X by default) - Optional (Rebuild Caches) #### Credits - [Apple](https://www.apple.com) for macOS -- [vit9696](https://github.com/vit9696) for [Lilu.kext](https://github.com/vit9696/Lilu) & for patch +- [Acidanthera](https://github.com/acidanthera) for [Lilu.kext](https://github.com/acidanthera/Lilu) & for patch - [Pike R. Alpha](https://github.com/Piker-Alpha) for patch - [lvs1974](https://applelife.ru/members/lvs1974.53809/) for original source code and idea - [chunnann](http://www.insanelymac.com/forum/user/1977171-chunnann/) for writing the software and maintaining it -- [black.dragon74](http://forum.osxlatitude.com/index.php?/user/86692-blackdragon74/) for adding support for Lilu 1.2.0 +- [black.dragon74](https://github.com/black-dragon74) for adding support for Lilu 1.2.0+ and macOS Mojave