getprop("ro.product.device") == "cepheus" || abort("E3004: This package is for \"cepheus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/cepheus/cepheus:10/QKQ1.190825.002/V12.0.4.0.QFACNXM:user/release-keys");
ui_print("Target: Xiaomi/cepheus/cepheus:10/QKQ1.190825.002/V12.0.5.0.QFACNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/cepheus/cepheus:10/QKQ1.190825.002/V12.0.4.0.QFACNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/cepheus/cepheus:10/QKQ1.190825.002/V12.0.5.0.QFACNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/cepheus/cepheus:10/QKQ1.190825.002/V12.0.4.0.QFACNXM:user/release-keys or Xiaomi/cepheus/cepheus:10/QKQ1.190825.002/V12.0.5.0.QFACNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:134217728:7d443f70e255ef62a9306c9d8a38952c3f92b7f9",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:4a90cdca6daf113688a9662c69437eafecf141c9") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:7d443f70e255ef62a9306c9d8a38952c3f92b7f9\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:4a90cdca6daf113688a9662c69437eafecf141c9\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "492,1,622,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,3696,3697,3699,3700,3704,3705,3713,3714,3715,3716,9073,9074,9076,9077,9481,9482,9484,9485,10481,10483,16422,16423,16556,16557,19326,19328,25594,25596,32768,32770,32990,32991,34762,34763,34765,34767,34826,34827,34960,34962,35015,35016,35030,35031,35040,35041,35489,35492,35498,35499,35504,35505,35549,35552,37763,37764,37775,37776,37903,37904,37907,37908,37925,39224,40064,40065,40073,40074,40079,40080,40082,40083,42547,42548,42634,42635,42846,42847,44601,44602,44884,44885,45133,45134,45138,45139,45161,45162,46170,46171,46532,46533,46569,46570,52189,52191,57561,57562,57700,57701,57707,57708,57721,57722,58344,58345,58353,58354,59244,59245,59507,59508,59682,59683,61298,61299,61784,61785,64331,64332,65536,65537,70322,70323,72089,72090,72162,72163,72182,72185,74361,74362,76985,76986,77126,77127,77274,77275,80045,80046,80058,80059,80710,80711,96808,96809,96970,96973,97983,97986,98304,98306,98526,98527,100362,100363,100389,100390,100439,100440,100443,100446,102493,102494,102552,102553,102574,102575,103302,103305,103553,103556,103722,103723,103762,103763,105063,105064,105134,105135,105181,105182,105508,105509,105663,105664,113832,113833,113838,113839,113878,113879,113902,113903,113932,113933,116541,116544,120013,120014,120019,120020,120416,120417,121117,121118,121124,121125,124050,124051,125595,125596,131072,131073,140228,140230,145406,145407,145791,145793,146318,146319,146767,146768,146772,146773,146785,146786,146790,146791,146802,146803,147178,147179,147202,147203,148487,148488,148490,148491,148629,148630,148711,148714,148727,148730,148733,148734,149303,149304,150200,150203,154112,154113,154379,154382,156344,156345,156566,156567,159196,159197,159209,159210,159549,159550,161901,161902,162335,162336,163840,163842,164062,164063,164799,164800,167350,167355,172145,172146,180348,180349,180713,180714,185924,185925,186244,186245,190263,190264,191696,191697,196608,196609,197570,197571,199536,199537,200332,200333,205147,205148,209786,209787,216348,216349,217141,217142,222236,222237,229376,229378,229598,229599,233549,233550,240759,240760,241066,241067,241079,241080,241090,241093,241094,241095,241096,241097,241099,241100,241101,241102,241175,241176,241264,241265,241269,241270,241272,241273,241296,241297,241365,241366,241369,241374,241375,241376,241377,241378,241379,241380,242174,242175,242181,242182,242735,242737,243290,243292,243293,243294,243295,243296,243297,243298,243299,243300,243301,243302,243303,243304,243305,243306,243307,243310,244770,244772,244853,244854,244856,244857,244860,244862,245120,245121,245128,245130,245619,245621,245730,245731,245761,245762,245773,245774,246041,246042,246155,246156,246172,246174,247490,247491,261184,261185,262144,262145,269561,269562,271626,271627,271904,271993,272474,272552,273179,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,858247,884736,884738,884958,884959,903007,917316,917503,917504") == "97860bf4cd8237d5d3c4b017eb0aa619230ee78d" || block_image_verify("/dev/block/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/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "492,1,622,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,3696,3697,3699,3700,3704,3705,3713,3714,3715,3716,9073,9074,9076,9077,9481,9482,9484,9485,10481,10483,16422,16423,16556,16557,19326,19328,25594,25596,32768,32770,32990,32991,34762,34763,34765,34767,34826,34827,34960,34962,35015,35016,35030,35031,35040,35041,35489,35492,35498,35499,35504,35505,35549,35552,37763,37764,37775,37776,37903,37904,37907,37908,37925,39224,40064,40065,40073,40074,40079,40080,40082,40083,42547,42548,42634,42635,42846,42847,44601,44602,44884,44885,45133,45134,45138,45139,45161,45162,46170,46171,46532,46533,46569,46570,52189,52191,57561,57562,57700,57701,57707,57708,57721,57722,58344,58345,58353,58354,59244,59245,59507,59508,59682,59683,61298,61299,61784,61785,64331,64332,65536,65537,70322,70323,72089,72090,72162,72163,72182,72185,74361,74362,76985,76986,77126,77127,77274,77275,80045,80046,80058,80059,80710,80711,96808,96809,96970,96973,97983,97986,98304,98306,98526,98527,100362,100363,100389,100390,100439,100440,100443,100446,102493,102494,102552,102553,102574,102575,103302,103305,103553,103556,103722,103723,103762,103763,105063,105064,105134,105135,105181,105182,105508,105509,105663,105664,113832,113833,113838,113839,113878,113879,113902,113903,113932,113933,116541,116544,120013,120014,120019,120020,120416,120417,121117,121118,121124,121125,124050,124051,125595,125596,131072,131073,140228,140230,145406,145407,145791,145793,146318,146319,146767,146768,146772,146773,146785,146786,146790,146791,146802,146803,147178,147179,147202,147203,148487,148488,148490,148491,148629,148630,148711,148714,148727,148730,148733,148734,149303,149304,150200,150203,154112,154113,154379,154382,156344,156345,156566,156567,159196,159197,159209,159210,159549,159550,161901,161902,162335,162336,163840,163842,164062,164063,164799,164800,167350,167355,172145,172146,180348,180349,180713,180714,185924,185925,186244,186245,190263,190264,191696,191697,196608,196609,197570,197571,199536,199537,200332,200333,205147,205148,209786,209787,216348,216349,217141,217142,222236,222237,229376,229378,229598,229599,233549,233550,240759,240760,241066,241067,241079,241080,241090,241093,241094,241095,241096,241097,241099,241100,241101,241102,241175,241176,241264,241265,241269,241270,241272,241273,241296,241297,241365,241366,241369,241374,241375,241376,241377,241378,241379,241380,242174,242175,242181,242182,242735,242737,243290,243292,243293,243294,243295,243296,243297,243298,243299,243300,243301,243302,243303,243304,243305,243306,243307,243310,244770,244772,244853,244854,244856,244857,244860,244862,245120,245121,245128,245130,245619,245621,245730,245731,245761,245762,245773,245774,246041,246042,246155,246156,246172,246174,247490,247491,261184,261185,262144,262145,269561,269562,271626,271627,271904,271993,272474,272552,273179,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,858247,884736,884738,884958,884959,903007,917316,917503,917504") && block_image_verify("/dev/block/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/bootdevice/by-name/vendor", "302,1,273,602,610,620,621,702,703,767,768,770,771,773,784,786,787,795,796,804,805,1702,1703,12176,12177,12294,12295,13087,13088,13720,13721,14720,14725,16978,16979,18628,18629,19900,19901,32768,32770,32864,32865,41713,41715,63119,63120,64309,64310,65536,65537,68494,68496,68530,68531,68908,68909,69271,69273,69746,69747,69806,69807,84014,84017,84035,84036,84081,84082,84100,84101,84244,84245,84293,84294,84350,84351,84561,84562,84587,84588,84623,84624,84739,84740,85297,85298,85446,85447,85460,85461,91416,91417,93628,93630,98304,98306,98400,98401,100368,100369,100372,100373,100939,100941,107327,107328,110366,110367,110368,110369,110390,110391,110816,110817,110873,110874,111235,111237,111238,111244,111271,111273,111281,111294,111295,111297,111307,111322,111348,111349,111351,111355,111503,111504,112371,112372,112609,112610,119325,119326,119968,119969,122644,122645,126609,126610,127203,127204,127678,127679,130352,130353,131072,131073,134984,134985,135533,135534,136038,136039,136476,136477,139266,139267,140244,140245,141087,142646,151849,151850,163840,163842,163936,163937,171257,171258,179450,179451,180411,180412,180434,180435,181106,181107,181418,181542,184193,187148,187949,188001,188018,188020,188140,188141,189704,189705,192296,192298,193965,193966,194058,194059,194251,194252,195110,195111,195348,195349,196608,196609,202570,202571,203213,203214,205889,205890,209854,209855,210448,210449,210923,210924,213597,213598,217723,217724,218272,218273,218777,218778,219215,219216,221063,221064,221850,221851,222854,222855,223883,223884,224197,224198,225203,226639,229376,229378,229472,229473,237512,237513,262144,262145,270599,270600,286498,286499,294078,294079,294912,294914,295008,295009,307689,307690,310964,310965,319518,319519,327342,327343,327680,327681,329690,329691,329715,329716,331096,331097,337158,337160,340085,340089,340091,340092,340130,340131,342632,342633,342641,342643,342667,342668,342693,342724,342730,342741,360448,360449,386991,393125,393215,393216") == "e0c14777ab87f9f1b13f520eb4218d494c0b40a8" || block_image_verify("/dev/block/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/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "302,1,273,602,610,620,621,702,703,767,768,770,771,773,784,786,787,795,796,804,805,1702,1703,12176,12177,12294,12295,13087,13088,13720,13721,14720,14725,16978,16979,18628,18629,19900,19901,32768,32770,32864,32865,41713,41715,63119,63120,64309,64310,65536,65537,68494,68496,68530,68531,68908,68909,69271,69273,69746,69747,69806,69807,84014,84017,84035,84036,84081,84082,84100,84101,84244,84245,84293,84294,84350,84351,84561,84562,84587,84588,84623,84624,84739,84740,85297,85298,85446,85447,85460,85461,91416,91417,93628,93630,98304,98306,98400,98401,100368,100369,100372,100373,100939,100941,107327,107328,110366,110367,110368,110369,110390,110391,110816,110817,110873,110874,111235,111237,111238,111244,111271,111273,111281,111294,111295,111297,111307,111322,111348,111349,111351,111355,111503,111504,112371,112372,112609,112610,119325,119326,119968,119969,122644,122645,126609,126610,127203,127204,127678,127679,130352,130353,131072,131073,134984,134985,135533,135534,136038,136039,136476,136477,139266,139267,140244,140245,141087,142646,151849,151850,163840,163842,163936,163937,171257,171258,179450,179451,180411,180412,180434,180435,181106,181107,181418,181542,184193,187148,187949,188001,188018,188020,188140,188141,189704,189705,192296,192298,193965,193966,194058,194059,194251,194252,195110,195111,195348,195349,196608,196609,202570,202571,203213,203214,205889,205890,209854,209855,210448,210449,210923,210924,213597,213598,217723,217724,218272,218273,218777,218778,219215,219216,221063,221064,221850,221851,222854,222855,223883,223884,224197,224198,225203,226639,229376,229378,229472,229473,237512,237513,262144,262145,270599,270600,286498,286499,294078,294079,294912,294914,295008,295009,307689,307690,310964,310965,319518,319519,327342,327343,327680,327681,329690,329691,329715,329716,331096,331097,337158,337160,340085,340089,340091,340092,340130,340131,342632,342633,342641,342643,342667,342668,342693,342724,342730,342741,360448,360449,386991,393125,393215,393216") && block_image_verify("/dev/block/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("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:134217728:7d443f70e255ef62a9306c9d8a38952c3f92b7f9",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:4a90cdca6daf113688a9662c69437eafecf141c9",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:4a90cdca6daf113688a9662c69437eafecf141c9");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/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/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
show_progress(0.100000, 2);

# ---- radio update tasks 2 ----

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/dtbo.img", "/dev/block/bootdevice/by-name/dtbo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
