From d14318e687b0cdcf1a8646127c7b0460db02b0ce Mon Sep 17 00:00:00 2001 From: Didgeridoohan Date: Fri, 14 Aug 2020 10:01:35 +0200 Subject: [PATCH] v5.3.1-v97 --- README.md | 36 ++-- common/prints.sh | 30 ++-- common/propsconf_conf | 18 +- common/propsconf_late | 4 +- common/util_functions.sh | 362 +++++++++++++++++++++++---------------- module.prop | 4 +- post-fs-data.sh | 6 +- service.sh | 1 + system/binpath/props | Bin 86791 -> 95150 bytes 9 files changed, 286 insertions(+), 175 deletions(-) diff --git a/README.md b/README.md index c65b44e..90f84e4 100644 --- a/README.md +++ b/README.md @@ -235,7 +235,7 @@ Just run the `props` command and the list will be updated automatically. Use the If you already have a device fingerprint set by the module, and it has been updated in the current fingerprints list, it will be automatically updated when the prints list gets an update. Just reboot to apply. This function can be turned of in the script settings (see ["Prop script settings"](https://github.com/Magisk-Modules-Repo/MagiskHide-Props-Config#prop-script-settings) below) -**_Current fingerprints list version - v96_** +**_Current fingerprints list version - v97_** ## Please add support for device X @@ -259,7 +259,7 @@ By default this feature will use an old devices model prop value, to make sure t It is also possible to pick a device manually from the list of fingerprints or set your own custom value. -Note that using the [Device simulation](https://github.com/Magisk-Modules-Repo/MagiskHidePropsConf/blob/master/README.md#device-simulation) feature to simulate `ro.product.model` (and related props) will be disabled when this feature is enabled. +Note that using the [Device simulation](https://github.com/Magisk-Modules-Repo/MagiskHidePropsConf/blob/master/README.md#device-simulation) feature to simulate `ro.product.model` (and related props) will be disabled when this feature is enabled (all other simiulation props will still work though). It is also worth noting that using the [Device simulation](https://github.com/Magisk-Modules-Repo/MagiskHidePropsConf/blob/master/README.md#device-simulation) feature and picking an old enough device will also force a basic attestation. Thanks to @Displax over at XDA-Developers for bringing this to everyones attention. @@ -314,14 +314,16 @@ It's quite easy to change prop values with Magisk. With this module it's even ea A custom prop can also be set by running the `props` command with the prop name and value directly in the command prompt (no need for using the ui). See [Run options](https://github.com/Magisk-Modules-Repo/MagiskHide-Props-Config/blob/master/README.md#run-options). -When setting a custom prop you can also pick in what boot stage it should be set in. This can also be changed later for each individual custom prop. There are three options: +When setting a custom prop you can also pick in what boot stage it should be set in. This can also be changed later for each individual custom prop. There are four options: - Default - The main module option will decide (see [Prop script settings](https://github.com/Magisk-Modules-Repo/MagiskHide-Props-Config/blob/master/README.md#boot-stage) below). - post-fs-data - The prop will always be set in post-fs-data, regardless of the main module option. - late_start service - The prop will always be set in late_start service, regardless of the main module option. - Both post-fs-data late_start service - In some special cases you would want the prop to be set during both boot stages. An example would be if the system reapplies the stock prop value late in the boot process (after post-fs-data). +**Note: post-fs-data runs earlier than late_start service.** -Note: post-fs-data runs earlier than late_start service. - +It is also possible to set a delay for when the prop is supposed to be set. This is useful if a prop value is originally set late during boot, or even a while after the device has finished booting. Pick this option while setting a new prop or editing one that has already been set and enter the amount of seconds you want the delay to be. By default the script will wait for "Boot completed" to be broadcast before starting to count the delay. This option can be disabled on a per prop level if necessary. +**Note 1: A prop with a delay will automatically be set during the late_start service boot stage. +Note 2: The delay will usually be sligtly longer (usually counted in tenths of a second) than the entered value, due to small delays in execution of the scripts.** ## Removing prop values If you would like to delete a certain prop value from your system, that can be done with the [Magisk resetprop tool](https://github.com/topjohnwu/Magisk/blob/master/docs/tools.md#resetprop). With this module you can easily set that up by adding whatever prop you want removed to the "Delete props" list. Be very careful when using this option, since removing the wrong prop may cause isses with your device. See ["Device issues because of the module"](https://github.com/Magisk-Modules-Repo/MagiskHide-Props-Config#device-issues-because-of-the-module) below if this happens. @@ -470,9 +472,9 @@ If you've had any help from me or this module, any kind of [donation](https://fo ## Credits and mentions @topjohnwu @ XDA Developers, for Magisk. @Zackptg5, @veez21 and @jenslody @ XDA Developers, for help and inspiration. -@Some_Random_Username, for all the OnePlus fingerprints. -@Displax, for all the prints and the basic attestation workaround. -@ipdev, for being always helpful and bringing tons of fingerprints to the module list. +@Some_Random_Username @ XDA Developers, for all the OnePlus fingerprints. +@Displax @ XDA Developers, for all the prints and the basic attestation workaround. +@ipdev @ XDA Developers, for being always helpful and bringing tons of fingerprints to the module list. And of course, everyone that provides fingerprints for me to add to the list. The module wouldn't be the same without you guys. Thank you! @@ -486,6 +488,13 @@ Releases from v5.0.0 are recommended for Magisk v19.4+. Releases from v5.2.5 will only install on Magisk v20+. ## Changelog +### v5.3.1 +- Added a feature to enable a delay for when custom props to be executed (during the late_start service boot stage). See the documentation for details. +- Fixed a possibly longstanding bug where props couldn't be set using the ui on some devices (would get stuck on "Working. Please wait..."). +- Fixed some of the settings in an exported settings file not being set correctly. +- Minor adjustments and bugfixes (mainly stupid bugs introduced in the last update). +- Added fingerprint for Nokia 6.1, Samsung Galaxy S5, S10 and Tab S4 and Xiaomi Mi 10 Lite 5G. Updated fingerprints for Asus ZenFone Max M1, Google Pixel 2-4 (all variants) and Xiaomi Pocofone F1. List updated to v97. + ### v5.3.0 - Added a new feature to force SafteyNet's bootloader check to use basic attestation rather than hardware. See the documentation for details. - Added fingerprints for Asus ZenFone Max Pro M2, Fxtec Pro 1, Huawei Honor 6X BLN-L22, Lenovo Tab 4 8 Plus, LG V30, OnePlus 7, 7 Pro, 7T, 7T Pro, 8 and 8 Pro (Chinese variants), OnePlus Nord, Redmi Note 9 Pro, Samsung Galaxy A3 2016 and 2027 and Galaxy Tab 4 7.0, 8.0 and 10.1 and Xiaomi Redmi K20 Pro India. Updated fingerprints for OnePlus 7 Pro NR and 7 Pro NR Spr, 8 (almost all variants) and 8 Pro (all variants), Redmi Note 8 Pro and Xiaomi Mi A1, Mi A3 and Redmi 8. List updated to v95. @@ -840,13 +849,13 @@ Releases from v5.2.5 will only install on Magisk v20+. ## Current fingerprints list -### List v96 +### List v97 - Asus Zenfone 2 Laser ASUS_Z00LD (6.0.1) - Asus Zenfone 3 Max ASUS_X00DD (7.1.1 & 8.1.0) - Asus Zenfone 4 Max ASUS_X00HD (7.1.1) - Asus ZenFone 5Z ASUS_Z01RD (9) - Asus Zenfone 6 ASUS_I01WD (9) -- Asus Zenfone Max M1 ASUS_X00PD (8.0.0) +- Asus Zenfone Max M1 ASUS_X00PD (8.0.0 & 9 & 10) - Asus Zenfone Max Pro M1 ASUS_X00TD (8.1.0) - Asus Zenfone Max Pro M2 ASUS_X01BD (9) - Asus ZenPad S 8.0 P01MA (6.0.1) @@ -947,6 +956,7 @@ Releases from v5.2.5 will only install on Magisk v20+. - Nokia 6 TA-1025 (9) - Nokia 6 TA-1033 (9) - Nokia 6 TA-1039 (9) +- Nokia 6.1 (10) - Nokia 6.1 Plus (9 & 10) - Nokia 6.2 (9) - Nokia 7 Plus (9 & 10) @@ -1047,7 +1057,8 @@ Releases from v5.2.5 will only install on Magisk v20+. - Samsung Galaxy S3 Neo GT-I9300I (4.4.4) - Samsung Galaxy S4 GT-I9505 (5.0.1) - Samsung Galaxy S4 Active GT-I9295 (5.0.1) -- Samsung Galaxy S5 SM-G900H (6.0.1) +- Samsung Galaxy S5 SM-G900F (6.0.1) +- Samsung Galaxy S5 SM-G900H )(6.0.1) - Samsung Galaxy S6 SM-G920F (7.0) - Samsung Galaxy S6 Edge SM-G925F (7.0) - Samsung Galaxy S7 SM-G930F (8.0.0) @@ -1056,6 +1067,7 @@ Releases from v5.2.5 will only install on Magisk v20+. - Samsung Galaxy S8 Plus SM-G955F (8.0.0) - Samsung Galaxy S9 SM-G960F (8.0.0) - Samsung Galaxy S9 Plus SM-G965F (8.0.0) +- Samsung Galaxy S10 SM-G973F (10) - Samsung Galaxy S10 Plus SM-G975F (10) - Samsung Galaxy S10 Plus SM-G975U (9) - Samsung Galaxy S10e SM-G970N (10) @@ -1070,6 +1082,7 @@ Releases from v5.2.5 will only install on Magisk v20+. - Samsung Galaxt Tab A LTE SM-T597 (9) - Samsung Galaxy Tab S2 SM-T813 (7.0) - Samsung Galaxy Tab S3 LTE SM-T825 (8.0.0) +- Samsung Galaxy Tab S4 SM-T380 (10) - Samsung Galaxy Tab S5e SM-T720 (9) - Sony Xperia M (4.3) - Sony Xperia X F5121 (8.0.0) @@ -1120,6 +1133,7 @@ Releases from v5.2.5 will only install on Magisk v20+. - Xiaomi Mi 9T Global (10) - Xiaomi Mi 9T Pro (9 & 10) - Xiaomi Mi 10 (10) +- Xiaomi Mi 10 Lite 5G (10) - Xiaomi Mi 10 Pro (10) - Xiaomi Mi A1 (7.1.2 & 8.0.0 & 8.1.0 & 9) - Xiaomi Mi A2 (8.1.0 & 9 & 10) diff --git a/common/prints.sh b/common/prints.sh index ab2434b..f2ba7d8 100644 --- a/common/prints.sh +++ b/common/prints.sh @@ -4,17 +4,18 @@ # Copyright (c) 2018-2020 Didgeridoohan @ XDA Developers # Licence: MIT -PRINTSV=96 +PRINTSV=97 PRINTSTRANSF=520 # Certified fingerprints +# Current fingerprints count=475 PRINTSLIST=" Asus ZenFone 2 Laser ASUS_Z00LD (6.0.1):Asus:ASUS_Z00LD=asus/WW_Z00L/ASUS_Z00L_63:6.0.1/MMB29P/WW_user_21.40.1220.2196_20180308:user/release-keys Asus ZenFone 3 Max ASUS_X00DD (7.1.1 & 8.1.0):Asus:ASUS_X00DD=asus/WW_Phone/ASUS_X00DD:7.1.1/NMF26F/14.0200.1712.347-20171214:user/release-keys;asus/WW_Phone/ASUS_X00DD:8.1.0/OPM1.171019.011/15.0200.1812.503-0:user/release-keys__2018-12-05 Asus ZenFone 4 Max ASUS_X00HD (7.1.1):Asus:ASUS_X00HD=asus/WW_Phone/ASUS_X00HD_4:7.1.1/NMF26F/14.2016.1801.372-20180119:user/release-keys Asus ZenFone 5Z ASUS_Z01RD (9):Asus:ASUS_Z01RD=asus/WW_Z01RD/ASUS_Z01R_1:9/PPR1.180610.009/WW_90.11.162.72_20190531:user/release-keys__2019-05-01 Asus ZenFone 6 ASUS_I01WD (9):Asus:ASUS_I01WD=asus/WW_I01WD/ASUS_I01WD:9/PPR2.181005.003/16.1220.1909.193-0:user/release-keys__2019-09-01 -Asus ZenFone Max M1 ASUS_X00PD (8.0.0):Asus:ASUS_X00PD=asus/WW_X00PD/ASUS_X00P_4:8.0.0/OPR1.170623.032/15.00.1907.103:user/release-keys__2019-07-05 +Asus ZenFone Max M1 ASUS_X00PD (8.0.0 & 9 & 10):Asus:ASUS_X00PD=asus/WW_X00PD/ASUS_X00P_1:8.0.0/OPR1.170623.032/15.00.2007.122:user/release-keys__2020-07-05;asus/WW_X00PD/ASUS_X00P_1:9/PPR1.180610.009/16.00.1906.411:user/release-keys__2019-06-05;asus/WW_X00PD/ASUS_X00P_1:10/QKQ1.191002.002/17.00.2003.23-20200401:user/release-keys__2020-03-05 Asus ZenFone Max Pro M1 ASUS_X00TD (8.1.0):Asus:ASUS_X00TD=asus/RU_X00TD/ASUS_X00T_6:8.1.0/OPM1/15.2016.1902.340-20190216:user/release-keys__2019-02-01 Asus ZenFone Max Pro M2 ASUS_X01BD (9):asus:ASUS_X01BD=asus/WW_X01BD/ASUS_X01BD_1:9/PKQ1/16.2017.2007.094-20200705:user/release-keys__2020-07-05 Asus ZenPad S 8.0 P01MA (6.0.1):Asus:P01MA=asus/WW_P01M/P01M_3:6.0.1/MMB29P/WW_P01M-V5.6.0-20170608:user/release-keys @@ -38,14 +39,14 @@ Google Nexus 10 (5.1.1):Samsung:Nexus 10=google/mantaray/manta:5.1.1/LMY49J/2640 Google Nexus Player (5.0 & 5.1 & 5.1.1 & 6.0.1 & 7.0 & 7.1.1 & 7.1.2 & 8.0.0):Asus:Nexus Player=google/fugu/fugu:5.0/LRX21V/1586762:user/release-keys;google/fugu/fugu:5.1/LMY47D/1743759:user/release-keys;google/fugu/fugu:5.1.1/LMY48N/2167335:user/release-keys;google/fugu/fugu:6.0.1/MOB30W/3031100:user/release-keys;google/fugu/fugu:7.0/NRD91N/3318108:user/release-keys;google/fugu/fugu:7.1.1/NMF27D/3783773:user/release-keys;google/fugu/fugu:7.1.2/N2G48C/4104010:user/release-keys;google/fugu/fugu:8.0.0/OPR2.170623.027/4397545:user/release-keys Google Pixel (7.1 & 7.1.1 & 7.1.2 & 8.0.0 & 8.1.0 & 9 & 10):Google:Pixel=google/sailfish/sailfish:7.1/NDE63V/3389651:user/release-keys;google/sailfish/sailfish:7.1.1/NOF27D/3757586:user/release-keys;google/sailfish/sailfish:7.1.2/NJH47F/4146041:user/release-keys;google/sailfish/sailfish:8.0.0/OPR3.170623.013/4397526:user/release-keys;google/sailfish/sailfish:8.1.0/OPM4.171019.021.P1/4820305:user/release-keys__2018-07-05;google/sailfish/sailfish:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/sailfish/sailfish:10/QP1A.191005.007.A3/5972272:user/release-keys__2019-10-06 Google Pixel XL (7.1 & 7.1.1 & 7.1.2 & 8.0.0 & 8.1.0 & 9 & 10):Google:Pixel XL=google/marlin/marlin:7.1/NDE63V/3389651:user/release-keys;google/marlin/marlin:7.1.1/NOF27D/3757586:user/release-keys;google/marlin/marlin:7.1.2/NJH47F/4146041:user/release-keys;google/marlin/marlin:8.0.0/OPR3.170623.013/4397526:user/release-keys;google/marlin/marlin:8.1.0/OPM4.171019.021.P1/4820305:user/release-keys__2018-07-05;google/marlin/marlin:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/marlin/marlin:10/QP1A.191005.007.A3/5972272:user/release-keys__2019-10-06 -Google Pixel 2 (8.0.0 & 8.1.0 & 9 & 10):Google:Pixel 2=google/walleye/walleye:8.0.0/OPD1.170816.025/4424668:user/release-keys;google/walleye/walleye:8.1.0/OPM2.171026.006.G1/4820017:user/release-keys__2018-07-05;google/walleye/walleye:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/walleye/walleye:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 -Google Pixel 2 XL (8.0.0 & 8.1.0 & 9 & 10):Google:Pixel 2 XL=google/taimen/taimen:8.0.0/OPD1.170816.025/4424668:user/release-keys;google/taimen/taimen:8.1.0/OPM2.171026.006.H1/4833802:user/release-keys__2018-07-05;google/taimen/taimen:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/taimen/taimen:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 -Google Pixel 3 (9 & 10):Google:Pixel 3=google/blueline/blueline:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/blueline/blueline:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 -Google Pixel 3 XL (9 & 10):Google:Pixel 3 XL=google/crosshatch/crosshatch:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/crosshatch/crosshatch:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 -Google Pixel 3a (9 & 10):Google:Pixel 3a=google/sargo/sargo:9/PQ3B.190801.002/5674421:user/release-keys__2019-08-01;google/sargo/sargo:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 -Google Pixel 3a XL (9 & 10):Google:Pixel 3a XL=google/bonito/bonito:9/PQ3B.190801.002/5674421:user/release-keys__2019-08-01;google/bonito/bonito:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 -Google Pixel 4 (10):Google:Pixel 4=google/flame/flame:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 -Google Pixel 4 XL (10):Google:Pixel 4 XL=google/coral/coral:10/QQ3A.200705.002/6506677:user/release-keys__2020-07-05 +Google Pixel 2 (8.0.0 & 8.1.0 & 9 & 10):Google:Pixel 2=google/walleye/walleye:8.0.0/OPD1.170816.025/4424668:user/release-keys;google/walleye/walleye:8.1.0/OPM2.171026.006.G1/4820017:user/release-keys__2018-07-05;google/walleye/walleye:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/walleye/walleye:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 +Google Pixel 2 XL (8.0.0 & 8.1.0 & 9 & 10):Google:Pixel 2 XL=google/taimen/taimen:8.0.0/OPD1.170816.025/4424668:user/release-keys;google/taimen/taimen:8.1.0/OPM2.171026.006.H1/4833802:user/release-keys__2018-07-05;google/taimen/taimen:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/taimen/taimen:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 +Google Pixel 3 (9 & 10):Google:Pixel 3=google/blueline/blueline:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/blueline/blueline:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 +Google Pixel 3 XL (9 & 10):Google:Pixel 3 XL=google/crosshatch/crosshatch:9/PQ3A.190801.002/5670241:user/release-keys__2019-08-01;google/crosshatch/crosshatch:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 +Google Pixel 3a (9 & 10):Google:Pixel 3a=google/sargo/sargo:9/PQ3B.190801.002/5674421:user/release-keys__2019-08-01;google/sargo/sargo:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 +Google Pixel 3a XL (9 & 10):Google:Pixel 3a XL=google/bonito/bonito:9/PQ3B.190801.002/5674421:user/release-keys__2019-08-01;google/bonito/bonito:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 +Google Pixel 4 (10):Google:Pixel 4=google/flame/flame:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 +Google Pixel 4 XL (10):Google:Pixel 4 XL=google/coral/coral:10/QQ3A.200805.001/6578210:user/release-keys__2020-08-05 Google Pixel C (6.0.1 & 7.0 & 7.1.1 & 7.1.2 & 8.0.0 & 8.1.0):Google:Pixel C=google/ryu/dragon:6.0.1/MXC89L/3084571:user/release-keys;google/ryu/dragon:7.0/NRD91N/3318108:user/release-keys;google/ryu/dragon:7.1.1/N4F26T/3687331:user/release-keys;google/ryu/dragon:7.1.2/N2G48C/4104010:user/release-keys;google/ryu/dragon:8.0.0/OPR1.170623.032/4397478:user/release-keys;google/ryu/dragon:8.1.0/OPM8.190605.005/5749003:user/release-keys__2019-06-05 HTC 10 (6.0.1):HTC:HTC 10=htc/HTCOneM10vzw/htc_pmewl:6.0.1/MMB29M/774095.8:user/release-keys HTC U11 (8.0.0):HTC:HTC U-3w=htc/ocndtwl_01405/htc_ocndtwl:8.0.0/OPR6.170623.013/1017190.2:user/release-keys @@ -115,6 +116,7 @@ Nokia 6 TA-1021 (9):Nokia:TA-1021=Nokia/TA-1021_00WW/PLE:9/PKQ1.181105.001/00WW_ Nokia 6 TA-1025 (9):Nokia:TA-1025=Nokia/TA-1025_00WW/PLE:9/PKQ1.181105.001/00WW_6_19C:user/release-keys__2020-01-01 Nokia 6 TA-1033 (9):Nokia:TA-1033=Nokia/TA-1033_00WW/PLE:9/PKQ1.181105.001/00WW_6_19C:user/release-keys__2020-01-01 Nokia 6 TA-1039 (9):Nokia:TA-1039=Nokia/TA-1039_00WW/PLE:9/PKQ1.181105.001/00WW_6_19C:user/release-keys__2020-01-01 +Nokia 6.1 (10):Nokia:Nokia 6.1=Nokia/Plate2_00WW/PL2_sprout:10/QKQ1.190828.002/00WW_4_15E:user/release-keys__2020-06-01 Nokia 6.1 Plus (9 & 10):Nokia:Nokia 6.1 Plus=Nokia/Dragon_00WW/DRG_sprout:9/PPR1.180610.011/00WW_3_54J:user/release-keys__2019-08-01;Nokia/Dragon_00WW/DRG_sprout:10/QKQ1.190828.002/00WW_4_15C:user/release-keys__2020-05-01 Nokia 6.2 (9):Nokia:Nokia 6.2=Nokia/Starlord_00WW/SLD_sprout:9/PKQ1.190118.001/00WW_1_170:user/release-keys__2020-01-05 Nokia 7 Plus (9 & 10):Nokia:Nokia 7 plus=Nokia/Onyx_00WW/B2N_sprout:9/PPR1.180610.011/00WW_3_53B:user/release-keys__2019-05-01;Nokia/Onyx_00WW/B2N_sprout:10/QKQ1.190828.002/00WW_4_15D:user/release-keys__2020-05-01 @@ -215,6 +217,7 @@ Samsung Galaxy Note 10.1 2014 SM-P600 (5.1.1):Samsung:SM-P600=samsung/lt03wifixx Samsung Galaxy S3 Neo GT-I9300I (4.4.4):Samsung:GT-I9300I=samsung/s3ve3gdd/s3ve3gdd:4.4.4/KTU84P/I9300IDDUBQE2:user/release-keys Samsung Galaxy S4 GT-I9505 (5.0.1):Samsung:GT-I9505=samsung/jfltexx/jflte:5.0.1/LRX22C/I9505XXUHPF4:user/release-keys Samsung Galaxy S4 Active GT-I9295 (5.0.1):Samsung:GT-I9295=samsung/jactiveltexx/jactivelte:5.0.1/LRX22C/I9295XXSDQD6:user/release-keys +Samsung Galaxy S5 SM-G900F (6.0.1):Samsung:SM-G900F=samsung/kltexx/klte:6.0.1/MMB29M/G900FXXU1CRH1:user/release-keys Samsung Galaxy S5 SM-G900H (6.0.1):Samsung:SM-G900H=samsung/k3gxx/k3g:6.0.1/MMB29K/G900HXXU1CPF2:user/release-keys Samsung Galaxy S6 SM-G920F (7.0):Samsung:SM-G920F=samsung/zerofltexx/zeroflte:7.0/NRD90M/G920FXXS5EQL1:user/release-keys Samsung Galaxy S6 Edge SM-G925F (7.0):Samsung:SM-G925F=samsung/zeroltexx/zerolte:7.0/NRD90M/G925FXXS5EQL1:user/release-keys @@ -224,6 +227,7 @@ Samsung Galaxy S8 SM-G950F (8.0.0):Samsung:SM-G950F=samsung/dreamltexx/dreamlte: Samsung Galaxy S8 Plus SM-G955F (8.0.0):Samsung:SM-G955F=samsung/dream2ltexx/dream2lte:8.0.0/R16NW/G955FXXU1CRC7:user/release-keys Samsung Galaxy S9 SM-G960F (8.0.0):Samsung:SM-G960F=samsung/starltexx/starlte:8.0.0/R16NW/G960FXXU1ARCC:user/release-keys Samsung Galaxy S9 Plus SM-G965F (8.0.0):Samsung:SM-G965F=samsung/star2ltexx/star2lte:8.0.0/R16NW/G965FXXU1ARCC:user/release-keys +Samsung Galaxy S10 SM-G973F (10):Samsung:SM-G973F=samsung/beyond1ltexx/beyond1:10/QP1A.190711.020/G973FXXS3BSL4:user/release-keys__2020-01-01 Samsung Galaxy S10 Plus SM-G975F (10):Samsung:SM-G975F=samsung/beyond2ltexx/beyond2:10/QP1A.190711.020/G975FXXU3BSKO:user/release-keys__2019-12-01 Samsung Galaxy S10 Plus SM-G975U (9):Samsung:SM-G975U=samsung/beyond2qlteue/beyond2q:9/PPR1.180610.011/G975U1UEU1ASD3:user/release-keys__2019-03-01 Samsung Galaxy S10e SM-G970N (10):Samsung:SM-G970N=samsung/beyond0lteks/beyond0:10/QP1A.190711.020/G970NKSU4CTC9:user/release-keys__2020-04-01 @@ -238,6 +242,7 @@ Samsung Galaxt Tab A LTE SM-T595 (9):Samsung:SM-T595=samsung/gta2xlltexx/gta2xll Samsung Galaxt Tab A LTE SM-T597 (9):Samsung:SM-T597=samsung/gta2xlltespr/gta2xlltespr:9/PPR1.180610.011/T597PVPU2BSH7:user/release-keys__2019-08-01 Samsung Galaxy Tab S2 SM-T813 (7.0):samsung:SM-T813=samsung/gts210vewifixx/gts210vewifi:7.0/NRD90M/T813XXS2BSJ3:user/release-keys__2019-08-01 Samsung Galaxy Tab S3 LTE SM-T825 (8.0.0):Samsung:SM-T825=samsung/gts3lltexx/gts3llte:8.0.0/R16NW/T825XXU2BRL2:user/release-keys__2018-12-01 +Samsung Galaxy Tab S4 SM-T830 (10):samsung:SM-T830=samsung/gts4lwifixx/gts4lwifi:10/QP1A.190711.020/T830XXU4CTF5:user/release-keys__2020-06-01 Samsung Galaxy Tab S5e SM-T720 (9):samsung:SM-T720=samsung/gts4lvwifixx/gts4lvwifi:9/PPR1.180610.011/T720XXS1ASL3:user/release-keys__2020-01-01 Sony Xperia M (4.3):Sony:C1905=Sony/C1905/C1905:4.3/15.4.A.1.9/eng.user.20140509.125022:user/release-keys Sony Xperia X F5121 (8.0.0):Sony:F5121=Sony/F5121/F5121:8.0.0/34.4.A.2.118/1631208121:user/release-keys__2018-09-01 @@ -288,6 +293,7 @@ Xiaomi Mi 9T European (9 & 10):Xiaomi:Mi 9T=Xiaomi/davinci_eea/davinci:9/PKQ1.19 Xiaomi Mi 9T Global (10):Xiaomi:Mi 9T=Xiaomi/davinci/davinci:10/QKQ1.190825.002/V11.0.1.0.QFJMIXM:user/release-keys__2019-12-01 Xiaomi Mi 9T Pro (9 & 10):Xiaomi:Mi 9T Pro=Xiaomi/raphael/raphael:9/PKQ1.181121.001/V10.3.14.0.PFKCNXM:user/release-keys__2019-06-01;Xiaomi/raphael/raphael:10/QKQ1.190825.002/V11.0.1.0.QFKMIXM:user/release-keys__2019-10-01 Xiaomi Mi 10 (10):Xiaomi:Mi 10=Xiaomi/umi/umi:10/QKQ1.191117.002/V11.0.15.0.QJBCNXM:user/release-keys__2020-02-01 +Xiaomi Mi 10 Lite 5G (10):Xiaomi:M2002J9G=Xiaomi/monet_eea/monet:10/QKQ1.191222.002/V12.0.1.0.QJIEUXM:user/release-keys__2020-06-01 Xiaomi Mi 10 Pro (10):Xiaomi:Mi 10 Pro=Xiaomi/cmi/cmi:10/QKQ1.191117.002/V11.0.13.0.QJACNXM:user/release-keys__2020-02-01 Xiaomi Mi A1 (7.1.2 & 8.0.0 & 8.1.0 & 9):Xiaomi:Mi A1=xiaomi/tissot/tissot_sprout:7.1.2/N2G47H/7.12.19:user/release-keys;xiaomi/tissot/tissot_sprout:8.0.0/OPR1.170623.026/V.9.5.10.0.ODHMIFA:user/release-keys__2018-04-01;xiaomi/tissot/tissot_sprout:8.1.0/OPM1.171019.026/V9.6.8.0.ODHMIFE:user/release-keys__2018-11-01;xiaomi/tissot/tissot_sprout:9/PKQ1.180917.001/V10.0.23.0.PDHMIXM:user/release-keys__2020-07-01 Xiaomi Mi A2 (8.1.0 & 9 & 10):Xiaomi:Mi A2=xiaomi/jasmine/jasmine_sprout:8.1.0/OPM1.171019.011/V9.6.17.0.ODIMIFE:user/release-keys__2018-11-05;xiaomi/jasmine/jasmine_sprout:9/PKQ1.180904.001/V10.0.18.0.PDIMIXM:user/release-keys__2019-12-05;xiaomi/jasmine/jasmine_sprout:10/QKQ1.190910.002/V11.0.11.0.QDIMIXM:user/release-keys__2020-06-01 @@ -305,7 +311,7 @@ Xiaomi Mi Note 3 (8.1.0):Xiaomi:Mi Note 3=Xiaomi/jason/jason:8.1.0/OPM1.171019.0 Xiaomi Mi Note 10 European (9):Xiaomi:Mi Note 10=Xiaomi/tucana_eea/tucana:9/PKQ1.190302.001/V11.0.11.0.PFDEUXM:user/release-keys__2019-11-01 Xiaomi Mi Pad (4.4.4):Xiaomi:MI PAD=Xiaomi/mocha/mocha:4.4.4/KTU84P/V7.5.2.0.KXFMIDE:user/release-keys Xiaomi Mi Pad 4 (8.1.0):Xiaomi:MI PAD 4=Xiaomi/clover/clover:8.1.0/OPM1.171019.019/V10.1.1.0.ODJCNFI:user/release-keys__2018-10-01 -Xiaomi Pocophone F1 (9 & 10):Xiaomi:POCOPHONE F1=Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/V11.0.5.0.PEJMIXM:user/release-keys__2019-10-01;Xiaomi/beryllium/beryllium:10/QKQ1.190828.002/V11.0.8.0.QEJMIXM:user/release-keys__2020-04-01 +Xiaomi Pocophone F1 (9 & 10):Xiaomi:POCOPHONE F1=Xiaomi/beryllium/beryllium:9/PKQ1.180729.001/V11.0.5.0.PEJMIXM:user/release-keys__2019-10-01;Xiaomi/beryllium/beryllium:10/QKQ1.190828.002/V11.0.9.0.QEJMIXM:user/release-keys__2020-06-01 Xiaomi Redmi 3/3 Pro (5.1.1):Xiaomi:Redmi 3=Xiaomi/ido/ido:5.1.1/LMY47V/V9.6.2.0.LAIMIFD:user/release-keys Xiaomi Redmi 3S/X Prime (6.0.1):Xiaomi:Redmi 3S=Xiaomi/land/land:6.0.1/MMB29M/V9.5.1.0.MALMIFA:user/release-keys Xiaomi Redmi 4 Pro (6.0.1):Xiaomi:Redmi 4=Xiaomi/markw/markw:6.0.1/MMB29M/V9.5.3.0.MBEMIFA:user/release-keys @@ -339,4 +345,4 @@ ZTE Axon 7 (7.1.1 & 8.0.0):ZTE:ZTE A2017=ZTE/P996A01_N/ailsa_ii:7.1.1/NMF26V/201 ZTE Blade (6.0.1):ZTE:Blade A310=ZTE/P809A50_MY_MAX/P809A50:6.0.1/MMB29M/20161017.095504:user/release-keys ZTE Nubia Z17 (7.1.1):ZTE:NX563J=nubia/NX563J/NX563J:7.1.1/NMF26X/eng.nubia.20171019.101529:user/release-keys Zuk Z2 Pro (7.0):Zuk:ZUK Z2121=ZUK/z2_row/z2_row:7.0/NRD90M/2.5.435_170525:user/release-keys -" +" \ No newline at end of file diff --git a/common/propsconf_conf b/common/propsconf_conf index 2d05be2..a022452 100644 --- a/common/propsconf_conf +++ b/common/propsconf_conf @@ -9,7 +9,7 @@ # ================================================================= # Required module version (or newer). Do not edit this value! -CONFTRANSF=520 +CONFTRANSF=531 # Device fingerprint CONFFINGERPRINT="" @@ -17,6 +17,10 @@ CONFVENDPRINT=false CONFPRINTBOOT=default CONFPATCHBOOT=late +# Force BASIC attestation +CONFBASICATTEST=false +CONFBASICATTCUST="" + # Device simulation CONFDEVSIM=false CONFBRAND=false @@ -44,6 +48,7 @@ CONFSELINUX="" CONFPROPS="" CONFPROPSPOST="" CONFPROPSLATE="" +CONFPROPSDELAY="" PROPOPTION=replace # Delete props @@ -69,7 +74,8 @@ CONFBACK=false # Example: # CONFFINGERPRINT=preserve -# When placed in /cache or /data, the module will load these +# When placed in the root of your internal storage (/sdcard), in /data +# or in /cache (or /data/cache if you're using an A/B device), the module will load these # values during boot and the configuration file will be deleted. Keep a backup of the # file if you want to reuse it at a later time (clean ROM flash, etc). @@ -105,6 +111,11 @@ CONFBACK=false # late_start service boot stage is used by default as to not cause issues for devices with # Keymaster 4 (bootloops). If the prop doesn't seem to set properly, try changing the stage. +# CONFBASICATTEST is used to enable Forced BASIC attestation, which is done by changing the +# variable to 'true'. To set a custom value, change CONFBASICATTCUST to the value you want. +# Example: +# CONFBASICATTCUST="randommodelname" + # CONFDEVSIM and the following CONFBRAND, CONFNAME, CONFDEVICE, CONFRELEASE # CONFID, CONFINCREMENTAL, CONFDESCRIPTION, CONFDISPLAY, CONFSDK, CONFMANUFACTURER and CONFMODEL # are used to set a number of props to simulate a certain deviced based on the fingerprint used. @@ -143,6 +154,9 @@ CONFBACK=false # use either CONFPROPSPOST or CONFPROPSLATE instead. Any props added to CONFPROPS # will run in the boot stage currently set in the module options (see CONFLATE below). # +# The CONFPROPSDELAY option is used to set a delay for when a specific custom prop is set. Will automacially +# set the prop during the late_start service boot stage. +# # With PROPOPTION you can decide if the current custom prop list should # be replaced, added to or preserved. Add the corresponding words "replace", # "add", or "preserve". The default option is to replace the list. diff --git a/common/propsconf_late b/common/propsconf_late index 99a6dc7..120e78d 100644 --- a/common/propsconf_late +++ b/common/propsconf_late @@ -8,7 +8,7 @@ # In that case, feel free to delete it. # Script version -SCRIPTV=34 +SCRIPTV=35 SETTRANSF=3 NOTTRANSF="BRANDSET;NAMESET;DEVICESET;RELEASESET;IDSET;INCREMENTALSET;SDKSET" @@ -117,8 +117,8 @@ SIMMODEL="" CUSTOMPROPS="" CUSTOMPROPSPOST="" CUSTOMPROPSLATE="" -CUSTOMPROPSLIST="$CUSTOMPROPS $CUSTOMPROPSPOST $CUSTOMPROPSLATE" CUSTOMPROPSDELAY="" +CUSTOMPROPSLIST="$CUSTOMPROPS $CUSTOMPROPSPOST $CUSTOMPROPSLATE $CUSTOMPROPSDELAY" # ---Delete prop values--- DELETEPROPS="" diff --git a/common/util_functions.sh b/common/util_functions.sh index dde7b55..62bfaf0 100644 --- a/common/util_functions.sh +++ b/common/util_functions.sh @@ -4,17 +4,41 @@ # Copyright (c) 2018-2020 Didgeridoohan @ XDA Developers # Licence: MIT -# Finding file values +ADBPATH=/data/adb +MHPCPATH=$ADBPATH/mhpc +if [ "$INSTFN" ]; then + LOGFILE=$MHPCPATH/propsconf_install.log +else + LOGFILE=$MHPCPATH/propsconf.log +fi + +# Finding and setting up installed Busybox +if [ -z "$INSTFN" ] && [ "$BOOTSTAGE" != "post" -a "$BOOTSTAGE" != "late" ]; then + BBPATH=$ADBPATH/magisk/busybox + if [ -f "$BBPATH" ]; then + for ITEM in $($BBPATH --list | tail -n +3); do + alias $ITEM="$BBPATH $ITEM" + done + fi + if [ -f "$BBPATH" ]; then + echo "" >> $LOGFILE 2>&1 + echo -e "$(date +"%Y-%m-%d %H:%M:%S.%3N") - Using $($BBPATH | head -1)." >> $LOGFILE 2>&1 + echo "$BBPATH" >> $LOGFILE 2>&1 + else + echo "" >> $LOGFILE 2>&1 + echo -e "$(date +"%Y-%m-%d %H:%M:%S.%3N") - No Busybox found." >> $LOGFILE 2>&1 + fi +fi + +# Finding file values, $1=file (with path), $2=string to look for get_file_value() { if [ -f "$1" ]; then - grep $2 $1 | sed "s|.*${2}||" | sed 's|\"||g' + echo $(grep $2 $1) | sed "s|.*${2}||" | sed 's|\"||g' fi } # ======================== Variables ======================== -ADBPATH=/data/adb MODULESPATH=$ADBPATH/modules -MHPCPATH=$ADBPATH/mhpc LATEFILE=$MHPCPATH/propsconf_late MIRRORLOC=/sbin/.magisk/mirror/system VENDLOC=/sbin/.magisk/mirror/vendor @@ -38,7 +62,6 @@ if [ "$INSTFN" ]; then $CACHELOC/propsconf_install.log $CACHELOC/propsconf_last.log " - LOGFILE=$MHPCPATH/propsconf_install.log SETTINGSLIST=" FINGERPRINTENB PRINTMODULE @@ -46,6 +69,8 @@ if [ "$INSTFN" ]; then PRINTVEND PRINTCHK BASICATTEST + BASICATTLIST + BASICATTCUST DEVSIM PROPCOUNT PROPEDIT @@ -99,11 +124,10 @@ if [ "$INSTFN" ]; then " else # Placeholder variables - MODVERSION=v5.3.0 - BIN=xbin + MODVERSIONPH=VER_PLACEHOLDER + BINPH=BIN_PLACEHOLDER # Log variables - LOGFILE=$MHPCPATH/propsconf.log LASTLOGFILE=$MHPCPATH/propsconf_last.log VLOGFILE=$MHPCPATH/propsconf_verbose.log VLASTLOGFILE=$MHPCPATH/propsconf_verbose_last.log @@ -242,25 +266,6 @@ APILVL=" 10=29 " -# List of aliases to set from Busybox -ALIASLIST=" -awk -cat -cp -cut -grep -head -id -mv -printf -sed -sort -tar -tr -wc -wget -" - # Values props list VALPROPSLIST=$PROPSLIST$PRINTPARTS$SNPROPS$ADNPROPS$ADNSIMPROPS @@ -276,46 +281,37 @@ if [ "$BOOTSTAGE" != "post" ]; then fi # ======================== General functions ======================== -# Log functions +# Log functions, $1=Log text +# Print to log log_handler() { if [ "$(id -u)" == 0 ] ; then echo "" >> $LOGFILE 2>&1 echo -e "$(date +"%Y-%m-%d %H:%M:%S.%3N") - $1" >> $LOGFILE 2>&1 fi } + +# Print to log and screen log_print() { if [ "$INSTFN" ]; then ui_print "$1" else - echo "$1" + echo -e "$1" fi log_handler "$1" } + +# Print to controll file for boot scripts log_script_chk() { log_handler "$1" echo -e "$(date +"%m-%d-%Y %H:%M:%S") - $1" >> $RUNFILE 2>&1 } -# Finding and setting up installed Busybox -if [ ! "$INSTFN" ] && [ "$BOOTSTAGE" != "post" -a "$BOOTSTAGE" != "late" ]; then - log_handler "Setting up Busybox." - BBPATH=$ADBPATH/magisk/busybox - if [ "$BBPATH" ]; then - log_handler "Using $($BBPATH | head -1)." - echo "$BBPATH" >> $LOGFILE 2>&1 - for ITEM in $ALIASLIST; do - alias $ITEM="$BBPATH $ITEM" - done - else - log_handler "No Busybox found." - fi -fi - #Divider DIVIDER="${Y}=====================================${N}" -# Header +# Header, $1=header text menu_header() { + # Don't clear screen if running from adb or if testing flag is active if [ -z "$ANDROID_SOCKET_adbd" ] && [ "$DEVTESTING" == "false" ]; then clear fi @@ -325,12 +321,12 @@ menu_header() { VERSIONTXT=$MODVERSION fi echo "" - echo "${W}MagiskHide Props Config $VERSIONTXT${N}" - echo "${W}by Didgeridoohan @ XDA Developers${N}" + echo -e "${W}MagiskHide Props Config $VERSIONTXT${N}" + echo -e "${W}by Didgeridoohan @ XDA Developers${N}" echo "" - echo $DIVIDER + echo -e $DIVIDER echo -e " $1" - echo $DIVIDER + echo -e $DIVIDER } # Get module version @@ -339,7 +335,7 @@ module_v_ctrl() { VERSIONTMP=$(echo $(get_file_value $MODPATH/module.prop "version=")) } -# Find prop type +# Find prop type, $1=prop name get_prop_type() { if [ "$1" == "ro.vendor.build.fingerprint" ]; then echo "vendprint" @@ -350,22 +346,22 @@ get_prop_type() { fi } -# Get left side of = +# Get left side of =, $1=string to check get_eq_left() { echo $1 | cut -f 1 -d '=' } -# Get right side of = +# Get right side of =, $1=string to check get_eq_right() { echo $1 | cut -f 2 -d '=' } -# Get the list of print version +# Get the list of print version, $1=Fingerprint device info with android versions get_print_versions() { echo "$1" | sed 's|.*(||' | sed 's|).*||' | sed 's| \& | |g' } -# Get Android version with 3 digits for input +# Get Android version with 3 digits for input, $1=version string to convert to three digits get_android_version() { VERTMP=$(echo $1 | sed 's|\.||g') if [ "${#VERTMP}" -lt 3 ]; then @@ -376,17 +372,37 @@ get_android_version() { echo $VERTMP } -# Get security patch date for current fingerprint +# Get security patch date for current fingerprint, $1=fingerprint string, including appended security patch date get_sec_patch() { echo $1 | sed 's|.*\_\_||' } -# Get the fingerprint for displaying in the ui +# Get the fingerprint for displaying in the ui, $1=fingerprint get_print_display() { echo $1 | sed 's|\_\_.*||' } -# Replace file values +# Get prop value for custom props, $1=full prop string with name and value +get_prop_value() { + echo "$(get_eq_right "$1")" | sed 's|_sp_| |g' | sed 's|\;.*$||' +} + +# Get delay for custom props, $1=full prop string with name, value and delay. If no delay is set, 0 is returned +get_prop_delay() { + TMPVAL="$(echo "$(get_eq_right "$1")" | sed 's|^.*\;||' | sed 's|\_\_.*$||')" + if [ "$TMPVAL" ]; then + echo "$TMPVAL" + else + echo "0" + fi +} + +# Get execution point for custom prop delay, $1=full prop string with name, value and delay +get_prop_delay_exec() { + echo "$(get_eq_right "$1")" | sed 's|^.*\_\_||' +} + +# Replace file values, $1=Variable to update, $2=Original variable value, $3=New variable value, $4=File, $5=control option for placeholder replacement replace_fn() { if [ "$5" == "placeholder" ]; then sed -i "s|${1}PH=${2}|${1}=${3}|" $4 >> $LOGFILE 2>&1 @@ -395,7 +411,7 @@ replace_fn() { fi } -# Format user files to remove Windows file endings +# Format user files to remove Windows file endings, $1=file to format format_file() { log_handler "Formating file (${1})." # Remove Windows line endings @@ -409,9 +425,9 @@ format_file() { # Reboot the device force_reboot() { echo "" - echo "${C}Rebooting...${N}" + echo -e "${C}Rebooting...${N}" log_handler "Rebooting." - [ "$(getprop sys.boot_completed)" == 1 ] && /system/bin/svc power reboot "" >> $LOGFILE 2>&1 || /system/bin/reboot "" >> $LOGFILE 2>&1 || setprop sys.powerctl reboot >> $LOGFILE 2>&1 + [ $(getprop sys.boot_completed) == 1 ] && /system/bin/svc power reboot "" >> $LOGFILE 2>&1 || /system/bin/reboot "" >> $LOGFILE 2>&1 || setprop sys.powerctl reboot >> $LOGFILE 2>&1 sleep 15 log_handler "Rebooting failed." echo "" @@ -421,7 +437,7 @@ force_reboot() { exit 0 } -# Updates placeholders +# Updates placeholders, $1=file, $2=Variable name to replace to, $3=Placeholder name, $4=Value to assign updated variable placeholder_update() { log_handler "Checking for ${3} in ${1}." if [ -f "$1" ]; then @@ -512,11 +528,11 @@ all_values() { before_change() { if [ -z "$INSTFN" ]; then echo "" - echo "${C}Working. Please wait...${N}" + echo -e "${C}Working. Please wait...${N}" fi } -# Run after updated props/settings +# Run after updated props/settings, $1=header, $2=Run options, $3=Reboot or not after_change() { if [ "$2" == "file" ]; then # Load module settings @@ -535,7 +551,7 @@ after_change() { fi } -# Reboot function +# Reboot function, $1=header, $2=Run options reboot_fn() { INPUT5="" while true @@ -556,13 +572,13 @@ reboot_fn() { echo "Reboot for changes to take effect." echo "" fi - echo "Do you want to reboot now (y/n)?" + echo -e "Do you want to reboot now (${G}y/n${N})?" echo "" if [ "$2" == "p" ] || [ "$2" == "r" ] || [ "$2" == "reset-script" ]; then - echo -n "Enter ${G}y${N}(es) or ${G}n${N}(o): " + echo -en "Enter ${G}y${N}(es) or ${G}n${N}(o): " INV1=2 else - echo -n "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): " + echo -en "Enter ${G}y${N}(es), ${G}n${N}(o) or ${G}e${N}(xit): " INV1=3 fi read -r INPUT5 @@ -595,7 +611,7 @@ reboot_fn() { done } -# Reset module +# Reset module, $1=header, $2=Run options reset_fn() { before_change @@ -1108,12 +1124,12 @@ script_install() { } # ======================== Fingerprint functions ======================== -# Get full device info from fingerprint string +# Get full device info from fingerprint string, $1=full fingerprint string, including device info get_device() { echo $1 | cut -f 1 -d '=' | sed "s|\:.*$||" } -# Get first word in fingerprint string +# Get first word in fingerprint string, $1=full fingerprint string, including device info get_first() { case $1 in *\ *) echo $1 | sed 's|\ .*||' @@ -1123,22 +1139,22 @@ get_first() { esac } -# Get the device for current fingerprint +# Get the device for current fingerprint, $1=fingerprint get_device_used() { PRINTTMP=$(cat $MODPATH/common/prints.sh | grep "$1") if [ "$PRINTTMP" ]; then - echo "${C}$(get_device "$PRINTTMP" | sed "s| (.*||")${N}" + echo -e "${C}$(get_device "$PRINTTMP" | sed "s| (.*||")${N}" echo "" elif [ -s "$CSTMPRINTS" ]; then PRINTTMP=$(cat $CSTMPRINTS | grep "$1") if [ "$PRINTTMP" ]; then - echo "${C}$(get_device "$PRINTTMP" | sed "s| (.*||")${N} (from custom list)" + echo -e "${C}$(get_device "$PRINTTMP" | sed "s| (.*||")${N} (from custom list)" echo "" fi fi } -# Set new fingerprint +# Set new fingerprint, $1=file to add prop info to print_edit() { if [ "$1" != "none" ]; then before_change @@ -1181,7 +1197,7 @@ print_edit() { fi } -# Edit security patch date if included +# Edit security patch date if included, $1=file to add prop info to patch_edit() { if [ "$1" != "none" ]; then before_change @@ -1246,6 +1262,7 @@ print_files() { device_print_update "Updating module fingerprint." } +# Check for and update used fingerprint, $1=header device_print_update() { log_handler "$1" if [ "$OPTIONUPDATE" == 1 ]; then @@ -1301,8 +1318,9 @@ device_print_update() { fi } -# Checks and updates the prints list +# Checks and updates the prints list, $1=run option download_prints() { + # Don't clear screen if running through adb or if testing flag is used if [ -z "$ANDROID_SOCKET_adbd" ] && [ "$DEVTESTING" == "false" ]; then clear fi @@ -1359,7 +1377,7 @@ download_prints() { fi } -# Reset the module fingerprint change +# Reset the module fingerprint change, $1=prop name, $2=run option reset_print() { before_change @@ -1380,7 +1398,7 @@ reset_print() { after_change "$1" "$2" } -# Use fingerprint +# Use fingerprint, $1=header, $2=fingerprint change_print() { before_change @@ -1406,7 +1424,7 @@ change_print() { after_change "$1" "$3" "$REBOOTCHK" } -# Use vendor fingerprint +# Use vendor fingerprint, $1=header, $2=Current state of option (enabled or disabled) change_print_vendor() { before_change @@ -1439,7 +1457,7 @@ change_print_vendor() { after_change "$1" "$3" } -# Save props values from fingerprint parts +# Save props values from fingerprint parts, $1=fingerprint print_parts() { DLIM1=1 DLIM2=1 @@ -1526,7 +1544,7 @@ set_partition_props() { } # ======================== Force BASIC attestation ======================== -# Switch/set forced basic attestation +# Switch/set forced basic attestation, $1=header/file to change (system.prop), $2=model prop value from fingerprint, $3=custom model prop value, $4=reset flag forced_basic() { # Find what brand is being used if [ "$FINGERPRINTENB" == 1 -o "$PRINTMODULE" == 0 ] && [ "$PRINTEDIT" == 1 ] && [ "$MODULEFINGERPRINT" ]; then @@ -1580,21 +1598,21 @@ forced_basic() { fi } -# Set a list value for forced basic attestation +# Set a list value for forced basic attestation, $1=header, $2=model prop value forced_list_confirm() { log_handler "Setting value for forced basic attestation to \"$2\" (from fingerprints list)." forced_basic "$1" "$2" } -# Set a custom value for forced basic attestation +# Set a custom value for forced basic attestation, $1=header, $2=custom model prop value forced_custom_confirm() { log_handler "Setting custom value for forced basic attestation to \"$2\"." forced_basic "$1" "" "$2" } -# Reset the values for forced basic attestation +# Reset the values for forced basic attestation, $1=header, $2=reset type forced_reset() { LISTVAL="$BASICATTLIST" CUSTVAL="$BASICATTCUST" @@ -1618,7 +1636,7 @@ forced_reset() { } # ======================== Device simulation functions ======================== -# Edit the simulation props +# Edit the simulation props, $1=file to edit (system.prop) dev_sim_edit() { if [ "$1" != "none" ]; then before_change @@ -1657,7 +1675,7 @@ dev_sim_edit() { fi } -# Enable/disable the option +# Enable/disable the option, $1=header, $2=run option change_dev_sim() { before_change @@ -1686,7 +1704,7 @@ change_dev_sim() { after_change "$1" "$2" } -# Change if prop should be simulated or not +# Change if prop should be simulated or not, $1=header, $2=prop name, $3=prop value, $4=run option change_sim_prop() { before_change @@ -1706,7 +1724,7 @@ change_sim_prop() { after_change "$1" "$4" } -# Change if description should be simulated or not +# Change if description should be simulated or not, $1=header, $2=Check if option is enabled or disabled, $3=run option change_sim_descr() { before_change @@ -1723,7 +1741,7 @@ change_sim_descr() { after_change "$1" "$3" } -# Change if partition specific props should be simulated or not +# Change if partition specific props should be simulated or not, $1=header, $2=Check if option is enabled or disabled, $3=run option change_sim_partprops() { before_change @@ -1741,7 +1759,7 @@ change_sim_partprops() { } # ======================== MagiskHide Props functions ======================== -# Check safe values +# Check safe values, $1=header, $2=Currently set prop value safe_props() { SAFE="" if [ "$2" ]; then @@ -1758,7 +1776,7 @@ safe_props() { fi } -# Find what prop value to change to +# Find what prop value to change to, $1=header, $2=Currently set prop value change_to() { CHANGE="" case "$1" in @@ -1779,7 +1797,7 @@ change_to() { esac } -# Reset the module prop change +# Reset the module prop change, $1=prop name, $2=run option reset_prop() { before_change @@ -1810,7 +1828,7 @@ reset_prop() { after_change "$1" "$2" } -# Use prop value +# Use prop value, $1=prop name, $2=new prop value, $3=run option change_prop() { before_change @@ -1837,7 +1855,7 @@ change_prop() { after_change "$1" "$3" } -# Reset all module prop changes +# Reset all module prop changes, $1=header reset_prop_all() { before_change @@ -1863,7 +1881,7 @@ reset_prop_all() { } # ======================== Custom Props functions ======================== -# Set custom props +# Set custom props, $1=custom type (default, post, late, delay) , $2=file to edit custom_edit() { if [ "$2" ]; then before_change @@ -1872,37 +1890,58 @@ custom_edit() { TMPLST="$(get_file_value $LATEFILE "${1}=")" if [ "$TMPLST" ]; then log_handler "Writing custom props." - for ITEM in $TMPLST; do - log_handler "Changing/writing $(get_eq_left "$ITEM")." - TMPITEM=$(echo $(get_eq_right "$ITEM") | sed 's|_sp_| |g') - if [ "$2" ]; then - echo "$(get_eq_left "$ITEM")=${TMPITEM}" >> $2 + for ITEM in $TMPLST; do + TMPITEM=$(get_prop_value "$ITEM") + if [ "$1" == "CUSTOMPROPSDELAY" ]; then + { + TMPBOOTTXT="" + TMPDELAY=$(get_prop_delay "$ITEM") + # Wait for "Boot completed", if enabled + if [ "$(get_prop_delay_exec "$ITEM")" == "boot" ]; then + TMPBOOTTXT=" after \"Boot completed\"" + until [ $(getprop sys.boot_completed) == 1 ]; do + sleep 0.1 + done + fi + TMPI=1 + until [ "$TMPI" -gt "$TMPDELAY" ]; do + sleep 1 + TMPI=$(($TMPI + 1)) + done + log_handler "Changing/writing $(get_eq_left "$ITEM") with a delay of $TMPDELAY seconds${TMPBOOTTXT}." + resetprop -nv $(get_eq_left "$ITEM") "${TMPITEM}" >> $LOGFILE 2>&1 + } & else - resetprop -nv $(get_eq_left "$ITEM") "$TMPITEM" >> $LOGFILE 2>&1 + log_handler "Changing/writing $(get_eq_left "$ITEM")." + if [ "$2" ]; then + echo "$(get_eq_left "$ITEM")=${TMPITEM}" >> $2 + else + resetprop -nv $(get_eq_left "$ITEM") "${TMPITEM}" >> $LOGFILE 2>&1 + fi fi done fi fi } -# Find custom props module set value +# Find custom props module set value, $1=prop name custprop_value() { TMPLST="$CUSTOMPROPSLIST" if [ "$TMPLST" ]; then for ITEM in $TMPLST; do case "$ITEM" in *$1*) - echo $(get_eq_right "$ITEM" | sed 's|_sp_| |g') + get_prop_value "$ITEM" ;; esac done fi } -# Set custom prop value +# Set custom prop value, $1=prop name, $2=prop value , $3=boot stage , $4=original value, $5=delay, $6=exectuion timing ("boot completed" or now) set_custprop() { before_change - + if [ "$2" ]; then # Reset the prop reset_custprop "$1" "$2" "bootstage" @@ -1918,26 +1957,31 @@ set_custprop() { elif [ "$3" == "both" ]; then PROPSBOOTSTAGE="CUSTOMPROPSPOST CUSTOMPROPSLATE" PROPSTXT="post-fs-data/late_start service" + elif [ "$3" == "delay" ]; then + PROPSBOOTSTAGE="CUSTOMPROPSDELAY" + PROPSTXT="late_start service" + fi + DELAYVAL="" + DELAYLOG="" + DELAYBOOT="" + if [ "$3" == "delay" ] && [ "$5" ]; then + DELAYVAL=";$5" + DELAYLOG=", with a delay of $5 seconds" + elif [ "$3" == "delay" ] && [ -z "$5" ]; then + DELAYVAL=";0" + fi + if [ "$3" == "delay" ] && [ "$6" == "boot" ]; then + DELAYBOOT="__boot" fi TMPVALUE=$(echo "$2" | sed 's| |_sp_|g') TMPORIG=$(echo "$4" | sed 's| |_sp_|g') DLIMTMP=1 for ITEM in $PROPSBOOTSTAGE; do CURRCUSTPROPS=$(get_file_value $LATEFILE "${ITEM}=") - case "$CURRCUSTPROPS" in - *$1*) - if [ "$(echo $CUSTOMPROPSLIST | grep -Eo "(^| )$1($| )")" ]; then - TMPCUSTPROPS=$(echo "$CURRCUSTPROPS" | sed "s|${1}=${TMPORIG}|${1}=${TMPVALUE}|") - else - TMPCUSTPROPS=$(echo "$CURRCUSTPROPS ${1}=${TMPVALUE}" | sed 's|^[ \t]*||') - fi - ;; - *) TMPCUSTPROPS=$(echo "$CURRCUSTPROPS ${1}=${TMPVALUE}" | sed 's|^[ \t]*||') - ;; - esac + TMPCUSTPROPS=$(echo "$CURRCUSTPROPS ${1}=${TMPVALUE}${DELAYVAL}${DELAYBOOT}" | sed 's|^[ \t]*||') SORTCUSTPROPS=$(echo $(printf '%s\n' $TMPCUSTPROPS | sort -u)) - log_handler "Setting custom prop $1 in $(echo $PROPSTXT | cut -f $DLIMTMP -d '/') stage." + log_handler "Setting custom prop $1 in $(echo $PROPSTXT | cut -f $DLIMTMP -d '/') stage${DELAYLOG}." replace_fn $ITEM "\"$CURRCUSTPROPS\"" "\"$SORTCUSTPROPS\"" $LATEFILE replace_fn CUSTOMEDIT 0 1 $LATEFILE DLIMTMP=$(($DLIMTMP + 1)) @@ -1947,36 +1991,59 @@ set_custprop() { fi } -# Reset all custom prop values +# Reset all custom prop values, $1=after_change option (run from configuration file or not) reset_all_custprop() { before_change - + log_handler "Resetting all custom props." # Removing all custom props replace_fn CUSTOMPROPS "\"$CUSTOMPROPS\"" "\"\"" $LATEFILE replace_fn CUSTOMPROPSPOST "\"$CUSTOMPROPSPOST\"" "\"\"" $LATEFILE replace_fn CUSTOMPROPSLATE "\"$CUSTOMPROPSLATE\"" "\"\"" $LATEFILE + replace_fn CUSTOMPROPSDELAY "\"$CUSTOMPROPSDELAY\"" "\"\"" $LATEFILE replace_fn CUSTOMEDIT 1 0 $LATEFILE after_change "Resetting all custom props" "$1" } -# Reset custom prop value +# Reset custom prop value, $1=prop name, $2=prop value, $3=run after_change or not reset_custprop() { before_change - + log_handler "Resetting custom prop $1." - PROPSBOOTSTAGE="CUSTOMPROPS CUSTOMPROPSPOST CUSTOMPROPSLATE" + PROPSBOOTSTAGE="CUSTOMPROPS CUSTOMPROPSPOST CUSTOMPROPSLATE CUSTOMPROPSDELAY" TMPVALUE=$(echo "$2" | sed 's| |_sp_|g') for ITEM in $PROPSBOOTSTAGE; do CURRCUSTPROPS=$(get_file_value $LATEFILE "${ITEM}=") - TMPCUSTPROPS=$(echo $CURRCUSTPROPS | sed "s|${1}=${TMPVALUE}||" | tr -s " " | sed 's|^[ \t]*||;s|[ \t]*$||') - # Updating custom props string - replace_fn $ITEM "\"$CURRCUSTPROPS\"" "\"$TMPCUSTPROPS\"" $LATEFILE + if [ "$CURRCUSTPROPS" ]; then + TMPDELAY="" + TMPBOOTEXEC="" + if [ "$ITEM" == "CUSTOMPROPSDELAY" ]; then + for PROP in $CURRCUSTPROPS; do + case $PROP in + *$TMPVALUE*) + TMPDELAY=";$(get_prop_delay "$PROP")" + case $PROP in + *\_\_*) + TMPBOOTEXEC="$(get_prop_delay_exec "$PROP")" + if [ "$TMPBOOTEXEC" ]; then + TMPBOOTEXEC="__$TMPBOOTEXEC" + fi + ;; + esac + break + ;; + esac + done + fi + TMPCUSTPROPS=$(echo $CURRCUSTPROPS | sed "s|${1}=${TMPVALUE}${TMPDELAY}${TMPBOOTEXEC}||" | tr -s " " | sed 's|^[ \t]*||;s|[ \t]*$||') + # Updating custom props string + replace_fn $ITEM "\"$CURRCUSTPROPS\"" "\"$TMPCUSTPROPS\"" $LATEFILE + fi done - if [ -z "$CUSTOMPROPS" ] && [ -z "$CUSTOMPROPSPOST" ] && [ -z "$CUSTOMPROPSLATE" ]; then + if [ -z "$CUSTOMPROPS" ] && [ -z "$CUSTOMPROPSPOST" ] && [ -z "$CUSTOMPROPSLATE" ] && [ -z "$CUSTOMPROPSDELAY" ]; then replace_fn CUSTOMEDIT 1 0 $LATEFILE fi @@ -1992,7 +2059,6 @@ prop_del() { log_handler "Deleting props." for ITEM in $DELETEPROPS; do log_handler "Deleting $ITEM." - TMPITEM=$( echo $(get_eq_right "$ITEM") | sed 's|_sp_| |g') case "$ITEM" in persist*) resetprop -pv --delete $ITEM >> $LOGFILE 2>&1 @@ -2005,11 +2071,11 @@ prop_del() { fi } -# Set prop to delete +# Set prop to delete, $1=prop name, $2=run option set_delprop() { if [ "$1" ]; then before_change - + TMPDELPROPS=$(echo "$DELETEPROPS ${1}" | sed 's|^[ \t]*||') SORTDELPROPS=$(echo $(printf '%s\n' $TMPDELPROPS | sort -u)) @@ -2021,10 +2087,10 @@ set_delprop() { fi } -# Reset all props to delete +# Reset all props to delete, $1=run option reset_all_delprop() { before_change - + log_handler "Resetting list of props to delete." # Removing all props to delete replace_fn DELETEPROPS "\"$DELETEPROPS\"" "\"\"" $LATEFILE @@ -2033,10 +2099,10 @@ reset_all_delprop() { after_change "Reset all props to delete." "$1" } -# Reset prop to delete +# Reset prop to delete, $1=prop name reset_delprop() { before_change - + log_handler "Resetting prop to delete, $1." TMPDELPROPS=$(echo $DELETEPROPS | sed "s|${1}||" | tr -s " " | sed 's|^[ \t]*||') @@ -2052,7 +2118,7 @@ reset_delprop() { } # ======================== Options functions ======================== -# Export all settings to a module configuration file +# Export all settings to a module configuration file, $1=header export_settings() { before_change log_handler "Exporting module settings to $EXPORTFILE." @@ -2063,10 +2129,15 @@ export_settings() { # Create file and Delete instructions head -n 59 $MODPATH/common/propsconf_conf > $EXPORTFILE # Export settings + # Fingerprint replace_fn CONFFINGERPRINT "\"\"" "\"$MODULEFINGERPRINT\"" $EXPORTFILE - replace_fn CONFVENDPRINT false $([ $PRINTEDIT == 0 ] && echo "false" || echo "true") $EXPORTFILE + replace_fn CONFVENDPRINT false $([ $PRINTVEND == 0 ] && echo "false" || echo "true") $EXPORTFILE replace_fn CONFPRINTBOOT default $([ $PRINTSTAGE == 0 ] && echo "default" || $([ $PRINTSTAGE == 1 ] && echo "post" || echo "late")) $EXPORTFILE - replace_fn CONFPATCHBOOT late $([ $PRINTSTAGE == 0 ] && echo "default" || $([ $PRINTSTAGE == 1 ] && echo "post" || echo "late")) $EXPORTFILE + replace_fn CONFPATCHBOOT late $([ $PATCHSTAGE == 0 ] && echo "default" || $([ $PATCHSTAGE == 1 ] && echo "post" || echo "late")) $EXPORTFILE + # Force BASIC attestation + replace_fn CONFBASICATTEST false $([ $BASICATTEST == 0 ] && echo "false" || echo "true") $EXPORTFILE + replace_fn CONFBASICATTCUST "\"\"" "\"$BASICATTCUST\"" $EXPORTFILE + # Device Simulation replace_fn CONFDEVSIM false $([ $DEVSIM == 0 ] && echo "false" || echo "true") $EXPORTFILE replace_fn CONFBRAND false $([ $BRANDSET == 0 ] && echo "false" || echo "true") $EXPORTFILE replace_fn CONFNAME false $([ $NAMESET == 0 ] && echo "false" || echo "true") $EXPORTFILE @@ -2081,15 +2152,20 @@ export_settings() { replace_fn CONFDESCRIPTION true $([ $DESCRIPTIONSET == 0 ] && echo "false" || echo "true") $EXPORTFILE replace_fn CONFPARTPROPS true $([ $PARTPROPSSET == 0 ] && echo "false" || echo "true") $EXPORTFILE replace_fn CONFSIMBOOT default $([ $SIMSTAGE == 0 ] && echo "default" || $([ $PRINTSTAGE == 1 ] && echo "post" || echo "late")) $EXPORTFILE - replace_fn CONFDEBUGGABLE "\"\"" $MODULEDEBUGGABLE $EXPORTFILE - replace_fn CONFSECURE "\"\"" $MODULESECURE $EXPORTFILE - replace_fn CONFTYPE "\"\"" $MODULETYPE $EXPORTFILE - replace_fn CONFTAGS "\"\"" $MODULETAGS $EXPORTFILE - replace_fn CONFSELINUX "\"\"" $MODULESELINUX $EXPORTFILE + # MagiskHide sensitive props + replace_fn CONFDEBUGGABLE "\"\"" "\"$MODULEDEBUGGABLE\"" $EXPORTFILE + replace_fn CONFSECURE "\"\"" "\"$MODULESECURE\"" $EXPORTFILE + replace_fn CONFTYPE "\"\"" "\"$MODULETYPE\"" $EXPORTFILE + replace_fn CONFTAGS "\"\"" "\"$MODULETAGS\"" $EXPORTFILE + replace_fn CONFSELINUX "\"\"" "\"$MODULESELINUX\"" $EXPORTFILE + # Custom props replace_fn CONFPROPS "\"\"" "\"$CUSTOMPROPS\"" $EXPORTFILE replace_fn CONFPROPSPOST "\"\"" "\"$CUSTOMPROPSPOST\"" $EXPORTFILE replace_fn CONFPROPSLATE "\"\"" "\"$CUSTOMPROPSLATE\"" $EXPORTFILE + replace_fn CONFPROPSDELAY "\"\"" "\"$CUSTOMPROPSDELAY\"" $EXPORTFILE + # Delete props replace_fn CONFDELPROPS "\"\"" "\"$DELETEPROPS\"" $EXPORTFILE + # Module settings replace_fn CONFBOOT default $([ $OPTIONBOOT == 0 ] && echo "default" || $([ $PRINTSTAGE == 1 ] && echo "post" || echo "late")) $EXPORTFILE replace_fn CONFCOLOUR true $([ $OPTIONCOLOUR == 0 ] && echo "false" || echo "true") $EXPORTFILE replace_fn CONFWEB true $([ $OPTIONWEB == 0 ] && echo "false" || echo "true") $EXPORTFILE @@ -2102,14 +2178,14 @@ export_settings() { echo "A module configuration file with" echo "your current settings have been" echo "saved to your internal storage," - echo "in the ${C}/mhcp${N} directory." + echo -e "in the ${C}/mhcp${N} directory." echo "" echo -n "Press enter to continue..." read -r INPUTTMP } # ======================== Log collecting functions ======================== -# Collects useful logs and info for troubleshooting +# Collects useful logs and info for troubleshooting, $1=header, $2=Run as a command flag or not collect_logs() { log_handler "Collecting logs and information." # Create temporary directory diff --git a/module.prop b/module.prop index c91a015..87b1f7a 100644 --- a/module.prop +++ b/module.prop @@ -1,6 +1,6 @@ id=MagiskHidePropsConf name=MagiskHide Props Config -version=v5.3.0-v95 -versionCode=61 +version=v5.3.1-v97 +versionCode=62 author=Didgeridoohan description=Change your device's fingerprint, to pass SafetyNet's CTS Profile check. Set/reset prop values set by MagiskHide. Change any prop values easily, and set your own custom props. diff --git a/post-fs-data.sh b/post-fs-data.sh index 0325175..7483c60 100644 --- a/post-fs-data.sh +++ b/post-fs-data.sh @@ -36,14 +36,14 @@ echo "***************** By Didgeridoohan ***************" >> $LOGFILE 2>&1 echo "***************************************************" >> $LOGFILE 2>&1 echo "" - STRST="$(date +"%m-%d-%Y %H:%M:%S:%N") - Log start (regular execution)." + STRST="$(date +"%m-%d-%Y %H:%M:%S.%3N") - Log start (regular execution)." echo -e $STRST >> $LOGFILE 2>&1 echo -e $STRST > $RUNFILE 2>&1 # Save default prop values getprop > $MHPCPATH/defaultprops echo "" >> $LOGFILE 2>&1 - echo -e "$(date +"%Y-%m-%d %H:%M:%S:%N") - Saved default values" >> $LOGFILE 2>&1 + echo -e "$(date +"%Y-%m-%d %H:%M:%S.%3N") - Saved default values" >> $LOGFILE 2>&1 { # Creates/updates the script control file @@ -52,7 +52,7 @@ # Logging log_handler() { echo "" >> $LOGFILE 2>&1 - echo -e "$(date +"%Y-%m-%d %H:%M:%S:%N") - $1" >> $LOGFILE 2>&1 + echo -e "$(date +"%Y-%m-%d %H:%M:%S.%3N") - $1" >> $LOGFILE 2>&1 } # Reset/disable file locations diff --git a/service.sh b/service.sh index 173e92d..7cde270 100644 --- a/service.sh +++ b/service.sh @@ -98,6 +98,7 @@ if [ "$OPTIONBOOT" != 2 ] && [ "$SIMSTAGE" == 2 ]; then fi # Edit custom props set for late_start service custom_edit "CUSTOMPROPSLATE" +custom_edit "CUSTOMPROPSDELAY" # Edit MagiskHide sensitive values if [ "$PROPEDIT" == 1 ]; then diff --git a/system/binpath/props b/system/binpath/props index 80be97b463d9d9bf43b9844477b8ac99446e09cd..e20150869045249e4bfe6a59d6faf72a095c3fba 100644 GIT binary patch delta 9190 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 delta 3167 zcma)82~?9;7Ctv5EJ4Cf0!WAsiS@~ zeWkQ6)oFV=)vB*EQL82ORBMm5&}D43YJs*>_oc{mx_F#F2?)%1Jd<<&ocF)~zWd(& z?svcY_I)qe^r~e4F_APQ&RA4e6jx*{Mwci>Is6(|Ra(6&uDZrjUAxL+E-_RV)tR`$ zWwKZlvyLxu`&NVuX$gN-S|`FXuai7N=1=@N?{+aJ1gw^7)@L?qbei=!jj-9ma3tUs z-V9s{x1ggq8MGEN zb(&xqEb%a{Dz%`uqmbt=%P01ek^+&VS;6;e%0)a%`y!!@+h-Jz8mD5fCWTi_m_>q% zdSSUz*dz!&0|ss@@gx3ubeM>w@Qso4d2tg6YvKz8!ysIZ&mCbr9bT16v|p3)o&;AB zr=(4UXOp+X#y!}P`ILmhXYkZ)O+LHx`0&2BLK-srA2nTv`mO|hWl5OlXmpwD~^ zfz69i)trPq&51bIoC3d=saV(&jg2j{aJnT0;#M>2Tg%bc+KD}zQgCro2Ey7VVQJe$ zSG8vS>_!z5CI$};^Ge3?uC{-<@$N0*L(KDl=e9|hwXFwpuMO6Xo$4>(Grs*#(GsK| z6ZqNQg|}Wjjm8cows(XNbBOnLw7ED<@;uP8BM94fDABni5&P6mXFP6aJ8|hN#RSXl zBs<&Lx*0TKm`L``7VJ6AwSU39lLBljS7a3IsUq6cjx<~M8YmOQcO8{0wEvt51SWGvw!%7w|;nmu=aE~ zI!?zjeJJT2kcNLWZ3xCt_G2h5!^MyOfQ@Hn;=?m5g_26d;~!hl_3`4t@f;MMal_kZ z{ID{>TWlA3_TFL&X1Apz#M%O|#;9hRDvQ>t>dLB2 zHEM@VNtqoa2S8rE>iX%YHXM}!Rg-KQkY&w0U~Jxf2MCCNgSMm z{xT|@GK8@ zGls%g^=~MMg+!7M7Tw}P5y|@Ge9G-qf~3C*$L=UG`FtoE?o7u&eo!L3e>`G;2ol@* zgrfe#*k}lX?(TT3xVsU(cPGMoAO_P0bf_Ol7}}Ee3@C^(83iNmqASapBt#bb<7S-u z@oAyo`l9mRmXUSg)Zoa=-gvdo2Om6Dja#RDajPhl+5AX??pQB`|Ll#@pKFjQWPI8Q zDH49w3SzBBXQajUkth*ft>rx(YHGQHeuYi zTm3h8iXrxlm_k?!(Gln9kD{SbyNfWY7YSd_izxvI;crJ#2A|Y4>jnu)2%B?)+3{eS z!vaI-CUXs?)Q8u#Rj6yVqhm8&7I%OmSg;gl(63pCUuVCKcX*3i?# zpb0{1C(Lp7@_5?$fLia92b&m4&saMnNjyT62CZFLdKB51&qO*akR%M9?VeaW$&-zZ zCSPlOGzpilk=H4EXS5!VArG>ijiq`QmXk<&wl$Gvv#%0qAxqFv0eenId8|iA}c6$~lAJIha}=|l35wAWW!!=_NB*m_z|6~xkJQ0&87 zh&3>idg$+2lu0z^<8U>@1R@^VD*tnoTj*rL%>A zhT{~LSwEXY2_kF!T*?$-Ua+H;c`^M0lEZY>+dg9zZkTeB^`8mTaLZtj