getprop("ro.product.device") == "cactus" || abort("E3004: This package is for \"cactus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/cactus/cactus:9/PPR1.180610.011/V10.4.3.0.PCBMIXM:user/release-keys");
ui_print("Target: xiaomi/cactus/cactus:9/PPR1.180610.011/V10.4.4.0.PCBMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/cactus/cactus:9/PPR1.180610.011/V10.4.3.0.PCBMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/cactus/cactus:9/PPR1.180610.011/V10.4.4.0.PCBMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/cactus/cactus:9/PPR1.180610.011/V10.4.3.0.PCBMIXM:user/release-keys or xiaomi/cactus/cactus:9/PPR1.180610.011/V10.4.4.0.PCBMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_space(208146432) || abort("E3006: Not enough free space on /cache to apply patches.");
apply_patch_check("EMMC:/dev/block/platform/bootdevice/by-name/md1img:56758960:1fda9fb4f7267f75f9c595822cfb194a5ee36e6a:56758960:5d133fb055bbe8b212253751335d0d2db3712c76", "1fda9fb4f7267f75f9c595822cfb194a5ee36e6a", "5d133fb055bbe8b212253751335d0d2db3712c76") || abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:56758960:1fda9fb4f7267f75f9c595822cfb194a5ee36e6a:56758960:5d133fb055bbe8b212253751335d0d2db3712c76\" has unexpected contents.");
apply_patch_space(56758960) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/platform/bootdevice/by-name/system", "582,1,423,665,11874,12109,32770,32927,32928,33433,65537,66042,75298,75299,76977,76979,79542,79543,85402,85446,85465,85808,85817,85882,85939,85990,86002,86139,86144,86146,86160,86199,86225,86710,86715,86768,87017,87091,87133,87500,87519,88869,89060,89432,89439,89802,89828,89928,89967,90160,90214,90701,91178,91247,91250,91328,91343,91387,91394,91425,91455,91485,91502,91652,91690,92071,92256,92320,92525,92888,92922,92938,95427,95428,98304,98969,102326,102328,109505,109511,109593,109594,123422,123425,124199,124200,124205,124207,124213,124214,124217,124219,124230,124233,124287,124288,124534,124536,124836,124841,124875,124880,125259,125260,126700,126701,126706,126708,126792,126793,126847,126849,126931,126932,127971,127973,128655,128658,128674,128675,128680,128682,129071,129076,131072,131578,132533,132536,132557,132558,132733,132735,133152,133155,133163,133164,137617,137620,138347,138349,138895,138898,140234,140237,140392,140393,140409,140412,140817,140818,140822,140824,140844,140847,140866,140867,140886,140888,141538,141539,155283,155284,158711,158716,158726,158729,159375,159376,159812,159814,159825,159828,160159,160162,160177,160178,160188,160190,160199,160200,161451,161452,161497,161499,161906,161907,162202,162204,162277,162278,163840,164505,170848,170851,172431,173512,175935,175937,178182,178183,178187,178189,178195,178198,178248,178249,178556,178558,179789,179792,180042,180045,180098,180101,180142,180145,180175,180176,183177,183178,187092,187097,189180,189183,191577,191580,194190,194191,194546,194548,194602,194603,196608,197114,200495,200498,200541,200949,209723,209726,209783,209784,210623,210625,211302,211305,211321,211324,211449,211450,214116,214117,214119,214122,214851,214854,214897,214900,216161,216162,216723,216725,217714,217717,217960,217962,218365,218368,220109,220112,220125,220128,221465,223141,226184,226185,226194,226196,226205,226206,226343,226345,227112,227115,227402,227407,227762,227765,227777,227778,227781,227783,227794,227795,227804,227805,227807,227809,227823,227824,229376,230041,243215,243216,244982,244983,246278,246280,247953,247956,248137,248140,248160,248161,248165,248167,248173,248174,248176,248178,248195,248198,248656,248657,248664,248666,248673,248676,248863,248864,250012,250014,251126,251129,253220,253223,253247,253937,253943,253945,254095,254107,254112,254113,254155,254157,254184,254187,254189,254672,262144,262650,263113,263114,266008,266009,268774,268777,268928,268931,269370,269371,280824,280825,281694,281695,281697,281699,281707,281710,281724,281726,286594,286595,286610,286612,286809,286812,286829,286830,287569,287571,287975,287976,287985,287990,289270,289273,289558,289559,289647,289649,289664,289665,294912,295577,296290,296291,303148,303150,303234,307636,307716,307718,308883,308888,309569,309570,309609,309611,310520,310521,310776,310778,310784,310785,313151,313152,317722,317726,317928,317931,321263,321264,321271,321273,321283,321286,323957,323960,327012,327015,327680,328186,328578,328581,328671,328672,328678,328679,328684,328686,328692,328693,331805,331808,331828,331831,331845,331846,335470,335472,336706,336707,336767,336769,336777,336780,336934,336935,337030,337032,337040,337041,346563,346565,353276,353277,359162,359164,359271,359274,359292,368989,387543,387546,389746,389747,390277,390279,390297,390300,390941,390944,391465,391466,393044,393046,393065,393068,393216,393722,394878,394883,394961,394962,402899,402902,403071,403074,403122,403127,403140,403143,407481,407484,407646,407649,408719,408722,408734,408737,408827,408828,425984,426490,428077,428078,430622,430625,430688,430691,431256,431259,433489,433492,437652,437655,437665,437666,437990,437992,438002,438003,438592,438593,439262,439264,439276,439277,448270,452935,452936,456463,458753,459258,465161,467086,491521,492026,507708,511642,524289,524794,551402,553002,557057,557562,566781,566802,571658,577703,582027,582126,582155,582196,582201,582219,582313,582333,582364,582445,582473,582489,589825,590330,602171,622592,622593,644999,655221,655359,655360") == "7cd9c55a487c5075f210550248b2b0dfb4af46de" || block_image_verify("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/platform/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/system", "582,1,423,665,11874,12109,32770,32927,32928,33433,65537,66042,75298,75299,76977,76979,79542,79543,85402,85446,85465,85808,85817,85882,85939,85990,86002,86139,86144,86146,86160,86199,86225,86710,86715,86768,87017,87091,87133,87500,87519,88869,89060,89432,89439,89802,89828,89928,89967,90160,90214,90701,91178,91247,91250,91328,91343,91387,91394,91425,91455,91485,91502,91652,91690,92071,92256,92320,92525,92888,92922,92938,95427,95428,98304,98969,102326,102328,109505,109511,109593,109594,123422,123425,124199,124200,124205,124207,124213,124214,124217,124219,124230,124233,124287,124288,124534,124536,124836,124841,124875,124880,125259,125260,126700,126701,126706,126708,126792,126793,126847,126849,126931,126932,127971,127973,128655,128658,128674,128675,128680,128682,129071,129076,131072,131578,132533,132536,132557,132558,132733,132735,133152,133155,133163,133164,137617,137620,138347,138349,138895,138898,140234,140237,140392,140393,140409,140412,140817,140818,140822,140824,140844,140847,140866,140867,140886,140888,141538,141539,155283,155284,158711,158716,158726,158729,159375,159376,159812,159814,159825,159828,160159,160162,160177,160178,160188,160190,160199,160200,161451,161452,161497,161499,161906,161907,162202,162204,162277,162278,163840,164505,170848,170851,172431,173512,175935,175937,178182,178183,178187,178189,178195,178198,178248,178249,178556,178558,179789,179792,180042,180045,180098,180101,180142,180145,180175,180176,183177,183178,187092,187097,189180,189183,191577,191580,194190,194191,194546,194548,194602,194603,196608,197114,200495,200498,200541,200949,209723,209726,209783,209784,210623,210625,211302,211305,211321,211324,211449,211450,214116,214117,214119,214122,214851,214854,214897,214900,216161,216162,216723,216725,217714,217717,217960,217962,218365,218368,220109,220112,220125,220128,221465,223141,226184,226185,226194,226196,226205,226206,226343,226345,227112,227115,227402,227407,227762,227765,227777,227778,227781,227783,227794,227795,227804,227805,227807,227809,227823,227824,229376,230041,243215,243216,244982,244983,246278,246280,247953,247956,248137,248140,248160,248161,248165,248167,248173,248174,248176,248178,248195,248198,248656,248657,248664,248666,248673,248676,248863,248864,250012,250014,251126,251129,253220,253223,253247,253937,253943,253945,254095,254107,254112,254113,254155,254157,254184,254187,254189,254672,262144,262650,263113,263114,266008,266009,268774,268777,268928,268931,269370,269371,280824,280825,281694,281695,281697,281699,281707,281710,281724,281726,286594,286595,286610,286612,286809,286812,286829,286830,287569,287571,287975,287976,287985,287990,289270,289273,289558,289559,289647,289649,289664,289665,294912,295577,296290,296291,303148,303150,303234,307636,307716,307718,308883,308888,309569,309570,309609,309611,310520,310521,310776,310778,310784,310785,313151,313152,317722,317726,317928,317931,321263,321264,321271,321273,321283,321286,323957,323960,327012,327015,327680,328186,328578,328581,328671,328672,328678,328679,328684,328686,328692,328693,331805,331808,331828,331831,331845,331846,335470,335472,336706,336707,336767,336769,336777,336780,336934,336935,337030,337032,337040,337041,346563,346565,353276,353277,359162,359164,359271,359274,359292,368989,387543,387546,389746,389747,390277,390279,390297,390300,390941,390944,391465,391466,393044,393046,393065,393068,393216,393722,394878,394883,394961,394962,402899,402902,403071,403074,403122,403127,403140,403143,407481,407484,407646,407649,408719,408722,408734,408737,408827,408828,425984,426490,428077,428078,430622,430625,430688,430691,431256,431259,433489,433492,437652,437655,437665,437666,437990,437992,438002,438003,438592,438593,439262,439264,439276,439277,448270,452935,452936,456463,458753,459258,465161,467086,491521,492026,507708,511642,524289,524794,551402,553002,557057,557562,566781,566802,571658,577703,582027,582126,582155,582196,582201,582219,582313,582333,582364,582445,582473,582489,589825,590330,602171,622592,622593,644999,655221,655359,655360") && block_image_verify("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat"), ui_print("system recovered successfully."), abort("E1004: system partition fails to recover"));
endif;
if (range_sha1("/dev/block/platform/bootdevice/by-name/vendor", "20,1,135,555,32770,32817,32818,33323,65537,66042,70272,98304,98306,163840,163842,163889,163890,193485,196553,196607,196608") == "2ad4aaa9a18051e50f9a918be5ad12fad1dd13bc" || block_image_verify("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/platform/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/platform/bootdevice/by-name/vendor", "20,1,135,555,32770,32817,32818,33323,65537,66042,70272,98304,98306,163840,163842,163889,163890,193485,196553,196607,196608") && block_image_verify("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat"), ui_print("vendor recovered successfully."), abort("E2004: vendor partition fails to recover"));
endif;

# ---- start making changes here ----

ui_print("Installing boot image...");
package_extract_file("boot.img", "/dev/block/platform/bootdevice/by-name/boot");
show_progress(0.600000, 400);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/platform/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/platform/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_mtupdate_stage("/cache/recovery/last_mtupdate_stage");
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "1") ,
(
ui_print("start to update general image");
package_extract_file("logo.bin", "/dev/block/platform/bootdevice/by-name/logo");
package_extract_file("odmdtbo.img", "/dev/block/platform/bootdevice/by-name/odmdtbo");
ui_print("Patching md1img image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/platform/bootdevice/by-name/md1img:56758960:1fda9fb4f7267f75f9c595822cfb194a5ee36e6a:56758960:5d133fb055bbe8b212253751335d0d2db3712c76",
            "-", 5d133fb055bbe8b212253751335d0d2db3712c76, 56758960,
            1fda9fb4f7267f75f9c595822cfb194a5ee36e6a, package_extract_file("patch/md1img.img.p")) || abort("Failed to apply patch \"patch/md1img.img.p \".");
package_extract_file("spmfw.img", "/dev/block/platform/bootdevice/by-name/spmfw");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "1");
),
ui_print("general images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "3") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "2") then

ui_print("start to update alt loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_2");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee2");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk2");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp2");
assert(set_emmc_writable("/sys/block/mmcblk0boot1/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot1"));

set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "2");
endif;

switch_active("sspm_1", "sspm_2");
switch_active("tee1", "tee2");
switch_active("lk", "lk2");
switch_active("scp1", "scp2");
switch_active("preloader", "preloader2");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "3");
),
ui_print("alt loder images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "5") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "4") then

ui_print("start to update main loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_1");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee1");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp1");
assert(set_emmc_writable("/sys/block/mmcblk0boot0/force_ro"),
       package_extract_file("preloader.img", "/dev/block/mmcblk0boot0"));

set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "4");
endif;

switch_active("sspm_2", "sspm_1");
switch_active("tee2", "tee1");
switch_active("lk2", "lk");
switch_active("scp2", "scp1");
switch_active("preloader2", "preloader");
),
ui_print("main loader images are already updated");
);
delete("/cache/recovery/last_mtupdate_stage");
package_extract_file("vbmeta.img", "/dev/block/platform/bootdevice/by-name/vbmeta");
set_ota_result_for_dm_verity();
show_progress(0.100000, 2);
