getprop("ro.product.device") == "cereus" || abort("E3004: This package is for \"cereus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.3.0.PCGMIXM:user/release-keys");
ui_print("Target: xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.4.0.PCGMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.3.0.PCGMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.4.0.PCGMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.3.0.PCGMIXM:user/release-keys or xiaomi/cereus/cereus:9/PPR1.180610.011/V11.0.4.0.PCGMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_space(209809408) || abort("E3006: Not enough free space on /cache to apply patches.");
apply_patch_check("EMMC:/dev/block/platform/bootdevice/by-name/md1img:56802896:2e98fdf0f3a45cefd45332b59ce3bb8f203caae8:56802896:00320038b071e551f11cecccb123b17ef45a96a2", "2e98fdf0f3a45cefd45332b59ce3bb8f203caae8", "00320038b071e551f11cecccb123b17ef45a96a2") || abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:56802896:2e98fdf0f3a45cefd45332b59ce3bb8f203caae8:56802896:00320038b071e551f11cecccb123b17ef45a96a2\" has unexpected contents.");
apply_patch_space(56802896) || 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", "708,1,373,665,14092,14133,24293,24352,24421,24890,24895,24976,24982,25075,25101,26838,26995,27348,27507,27530,27540,27590,27595,27616,27626,27633,28763,28819,28846,28928,28957,29069,29075,29085,29100,29449,29588,29831,30135,30184,30254,30461,30929,31242,32770,32927,32928,33433,38794,38813,38847,38852,38920,38925,38975,39010,39021,39054,39070,39100,39106,39145,39160,39182,39202,39246,39342,39582,39584,39641,39683,39717,39795,40112,40197,40208,40213,40253,40294,40313,40331,40342,40364,40604,41574,41601,41728,41889,41894,41978,41989,41999,42055,42214,42288,42293,42299,42370,42383,42411,42438,42457,42938,43125,43943,43967,44033,44105,65537,66042,98306,98463,98464,98969,122621,123014,131073,131578,149606,157798,163842,163999,164000,164505,177915,186107,196609,197114,229378,229535,229536,230041,238679,244564,253134,253147,253148,253168,253187,253205,253234,253235,253250,253251,253450,253452,253473,253475,253510,253515,253523,253543,253568,253586,253620,253622,253645,253646,253955,253958,253986,253988,262145,262650,276373,276374,276378,276379,294912,295577,298066,298067,302426,302427,309422,309423,311820,311821,311879,311880,311895,311896,312474,312475,314528,314529,315705,315706,315766,315767,317005,317006,317023,317024,317109,317110,317311,317313,317573,317574,317581,317582,317658,317659,317664,317665,318488,318489,318805,318806,318932,318934,318973,318974,318981,318982,319116,319117,319167,319168,319185,319190,319191,319192,319193,319194,319195,319196,319197,319198,319200,319201,319202,319203,319204,319205,319206,319208,319209,319212,319879,319881,320344,320345,320346,320347,320348,320349,320355,320357,320820,320821,321600,321601,321602,321603,321606,321607,321611,321612,321910,321911,321921,321922,321934,321935,321940,321941,321953,321954,321955,321956,321959,321961,322005,322007,322139,322140,322149,322151,327680,328186,332439,332440,338319,338320,338323,338324,338343,338344,338720,338721,339883,339885,340014,340016,343513,343514,343756,343759,343760,343761,343762,343763,343765,343766,343767,343768,343770,343771,343772,343773,343774,343775,343777,343778,343779,343780,343781,343782,343783,343784,343785,343786,343790,343791,343792,343793,343794,343795,343796,343797,343799,343800,343801,343802,343804,343805,343806,343807,343808,343809,343810,343811,343812,343814,343919,343921,343923,343924,346106,346108,346148,346150,346154,346155,346161,346162,346168,346170,346180,346182,346190,346191,346197,346199,346217,346219,346222,346223,346242,346243,346288,346289,346359,346360,346374,346375,346383,346384,346397,346398,346421,346422,346443,346444,346452,346453,346534,346536,346761,346762,350259,350260,350503,350504,351196,351197,352090,352092,353153,353254,353472,353507,354172,354315,354584,354794,355337,355522,356129,356220,356379,356380,356594,356595,357230,359112,359138,359140,359277,360314,360320,360321,360448,360954,362111,362112,362118,362119,362123,362124,362130,362131,362583,362584,362586,362587,362641,362642,362649,362650,362817,362818,363092,363093,363513,363514,363610,363611,363822,363823,363830,363831,365421,365422,367487,367488,385086,385089,385399,385402,385450,385451,385453,385454,385651,385652,385674,385675,385701,385702,385718,385719,385739,385740,385743,385744,385836,385837,387132,387133,387246,387247,387252,387253,387262,387263,387265,387266,393216,393722,401051,401052,401058,401059,401347,401348,401485,401486,404596,404597,408125,408126,408149,408150,408354,408355,408441,408442,411214,411215,411742,411743,412972,412973,419116,419117,419121,419122,425984,426490,432074,432075,432104,432107,432766,432767,432786,432787,432792,432793,433093,433094,433183,433184,433204,433205,434520,434521,439859,439860,441459,441460,441905,441906,447302,447303,448365,448366,448620,448623,453474,453475,453480,453481,454714,454715,457089,457090,457104,457105,457423,457424,457468,457469,458752,459258,464166,464169,465132,465133,465394,465395,467770,467771,467781,467782,468282,468283,468292,468295,468655,468656,468666,468667,474693,474694,484814,484815,484929,484930,484954,484957,485047,485048,485054,485055,485072,485073,485094,485095,487892,487895,490818,490819,491169,491172,491520,492026,499350,499351,499538,499539,499945,499946,506766,506767,510301,510304,510306,510307,510315,510316,511224,511225,512144,512145,512362,512363,512497,512498,514593,514594,524288,524794,530045,530046,530963,530964,531672,531673,531690,531691,531757,531758,533470,533471,533802,533803,533839,533840,533843,533844,533933,533934,537908,537909,546132,546135,548037,548040,548442,548443,548808,548809,551260,551261,551271,551272,553909,553910,553922,553923,553939,553942,554218,554219,555888,555889,557056,557562,557647,557648,561127,561128,563946,563948,575302,575303,576202,576203,584957,584958,589824,590330,599408,599409,599786,599787,599789,599790,599791,599792,600214,645177,655221,655359,655360") == "efcfc15f5f5f87104430b9b7030b894892833fdc" || 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", "708,1,373,665,14092,14133,24293,24352,24421,24890,24895,24976,24982,25075,25101,26838,26995,27348,27507,27530,27540,27590,27595,27616,27626,27633,28763,28819,28846,28928,28957,29069,29075,29085,29100,29449,29588,29831,30135,30184,30254,30461,30929,31242,32770,32927,32928,33433,38794,38813,38847,38852,38920,38925,38975,39010,39021,39054,39070,39100,39106,39145,39160,39182,39202,39246,39342,39582,39584,39641,39683,39717,39795,40112,40197,40208,40213,40253,40294,40313,40331,40342,40364,40604,41574,41601,41728,41889,41894,41978,41989,41999,42055,42214,42288,42293,42299,42370,42383,42411,42438,42457,42938,43125,43943,43967,44033,44105,65537,66042,98306,98463,98464,98969,122621,123014,131073,131578,149606,157798,163842,163999,164000,164505,177915,186107,196609,197114,229378,229535,229536,230041,238679,244564,253134,253147,253148,253168,253187,253205,253234,253235,253250,253251,253450,253452,253473,253475,253510,253515,253523,253543,253568,253586,253620,253622,253645,253646,253955,253958,253986,253988,262145,262650,276373,276374,276378,276379,294912,295577,298066,298067,302426,302427,309422,309423,311820,311821,311879,311880,311895,311896,312474,312475,314528,314529,315705,315706,315766,315767,317005,317006,317023,317024,317109,317110,317311,317313,317573,317574,317581,317582,317658,317659,317664,317665,318488,318489,318805,318806,318932,318934,318973,318974,318981,318982,319116,319117,319167,319168,319185,319190,319191,319192,319193,319194,319195,319196,319197,319198,319200,319201,319202,319203,319204,319205,319206,319208,319209,319212,319879,319881,320344,320345,320346,320347,320348,320349,320355,320357,320820,320821,321600,321601,321602,321603,321606,321607,321611,321612,321910,321911,321921,321922,321934,321935,321940,321941,321953,321954,321955,321956,321959,321961,322005,322007,322139,322140,322149,322151,327680,328186,332439,332440,338319,338320,338323,338324,338343,338344,338720,338721,339883,339885,340014,340016,343513,343514,343756,343759,343760,343761,343762,343763,343765,343766,343767,343768,343770,343771,343772,343773,343774,343775,343777,343778,343779,343780,343781,343782,343783,343784,343785,343786,343790,343791,343792,343793,343794,343795,343796,343797,343799,343800,343801,343802,343804,343805,343806,343807,343808,343809,343810,343811,343812,343814,343919,343921,343923,343924,346106,346108,346148,346150,346154,346155,346161,346162,346168,346170,346180,346182,346190,346191,346197,346199,346217,346219,346222,346223,346242,346243,346288,346289,346359,346360,346374,346375,346383,346384,346397,346398,346421,346422,346443,346444,346452,346453,346534,346536,346761,346762,350259,350260,350503,350504,351196,351197,352090,352092,353153,353254,353472,353507,354172,354315,354584,354794,355337,355522,356129,356220,356379,356380,356594,356595,357230,359112,359138,359140,359277,360314,360320,360321,360448,360954,362111,362112,362118,362119,362123,362124,362130,362131,362583,362584,362586,362587,362641,362642,362649,362650,362817,362818,363092,363093,363513,363514,363610,363611,363822,363823,363830,363831,365421,365422,367487,367488,385086,385089,385399,385402,385450,385451,385453,385454,385651,385652,385674,385675,385701,385702,385718,385719,385739,385740,385743,385744,385836,385837,387132,387133,387246,387247,387252,387253,387262,387263,387265,387266,393216,393722,401051,401052,401058,401059,401347,401348,401485,401486,404596,404597,408125,408126,408149,408150,408354,408355,408441,408442,411214,411215,411742,411743,412972,412973,419116,419117,419121,419122,425984,426490,432074,432075,432104,432107,432766,432767,432786,432787,432792,432793,433093,433094,433183,433184,433204,433205,434520,434521,439859,439860,441459,441460,441905,441906,447302,447303,448365,448366,448620,448623,453474,453475,453480,453481,454714,454715,457089,457090,457104,457105,457423,457424,457468,457469,458752,459258,464166,464169,465132,465133,465394,465395,467770,467771,467781,467782,468282,468283,468292,468295,468655,468656,468666,468667,474693,474694,484814,484815,484929,484930,484954,484957,485047,485048,485054,485055,485072,485073,485094,485095,487892,487895,490818,490819,491169,491172,491520,492026,499350,499351,499538,499539,499945,499946,506766,506767,510301,510304,510306,510307,510315,510316,511224,511225,512144,512145,512362,512363,512497,512498,514593,514594,524288,524794,530045,530046,530963,530964,531672,531673,531690,531691,531757,531758,533470,533471,533802,533803,533839,533840,533843,533844,533933,533934,537908,537909,546132,546135,548037,548040,548442,548443,548808,548809,551260,551261,551271,551272,553909,553910,553922,553923,553939,553942,554218,554219,555888,555889,557056,557562,557647,557648,561127,561128,563946,563948,575302,575303,576202,576203,584957,584958,589824,590330,599408,599409,599786,599787,599789,599790,599791,599792,600214,645177,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,140,555,32770,32817,32818,33323,65537,66042,80119,98304,98306,163840,163842,163889,163890,193485,196553,196607,196608") == "16db79fc5556fb87e3e76c2c7298b6574635ff24" || 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,140,555,32770,32817,32818,33323,65537,66042,80119,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:56802896:2e98fdf0f3a45cefd45332b59ce3bb8f203caae8:56802896:00320038b071e551f11cecccb123b17ef45a96a2",
            "-", 00320038b071e551f11cecccb123b17ef45a96a2, 56802896,
            2e98fdf0f3a45cefd45332b59ce3bb8f203caae8, 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);
