getprop("ro.product.device") == "cas" || abort("E3004: This package is for \"cas\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/cas/cas:11/RKQ1.200826.002/V12.5.3.0.RJJCNXM:user/release-keys");
ui_print("Target: Xiaomi/cas/cas:11/RKQ1.200826.002/V12.5.5.0.RJJCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/cas/cas:11/RKQ1.200826.002/V12.5.3.0.RJJCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/cas/cas:11/RKQ1.200826.002/V12.5.5.0.RJJCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/cas/cas:11/RKQ1.200826.002/V12.5.3.0.RJJCNXM:user/release-keys or Xiaomi/cas/cas:11/RKQ1.200826.002/V12.5.5.0.RJJCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:47f8c62c99344ae439bd0a51e76aa2da7ff972f7"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b7d47e4983de030d1dad7cf844f108bd5a4a80ab")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:47f8c62c99344ae439bd0a51e76aa2da7ff972f7"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b7d47e4983de030d1dad7cf844f108bd5a4a80ab"),"\" has unexpected contents."));
apply_patch_space(180035584) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "306,1,30,37,50,52,56,1989,1990,2035,2036,2052,427059,438934,442027,458752,458766,459252,459253,459993,459994,460011,460012,482171,742462,742475,742483,742489,742490,742496,742497,742502,742503,742517,742518,742524,742525,742528,742529,742534,742535,742542,742543,742545,742546,742550,742551,742555,742556,742560,742568,742578,742593,742596,742597,742607,742642,742646,742648,742662,742682,742695,742708,742717,742720,742722,742729,742734,742735,742737,742738,742742,742743,742748,742749,742754,742755,742759,742760,742765,742766,742770,742771,742776,742777,742781,742782,742785,742786,742793,742794,742798,742799,742810,742811,742815,742816,742820,742821,742826,742827,742829,742830,742836,742837,742838,742839,742844,742845,742848,742849,742861,742871,742877,742878,742881,742882,742883,742884,742888,742889,742890,742891,742906,742907,742909,742910,742911,742912,742915,742916,742921,742922,742934,742935,742938,742939,742940,742941,742943,742944,742945,742946,742947,742948,742949,742950,742951,742952,742953,742954,742955,742956,742958,742959,742960,742961,742963,742964,742966,742967,742968,742969,742970,742971,742973,742974,742977,742978,742979,742980,742981,742982,742984,742985,742986,742987,742989,742990,742991,742992,742993,742994,742997,742998,743002,743003,743006,743007,743009,743010,743012,743013,743015,743016,743017,743018,743020,743022,743025,743026,743029,743030,743032,743033,743040,743041,743055,743056,743060,743061,743063,743064,743070,743074,743081,743082,743089,743090,743092,743093,743098,743099,743111,743112,743117,743118,743121,743122,743139,743140,743142,743143,743148,743149,743156,743157,743158,743159,743161,743162,743167,743168,743173,743174,743180,743181,743192,743193,743195,743196,743200,743201,743210,743211,743221,743222,743226,743227,743230,743231,743245,743246,743249,743250,743263,743264,743266,743267,743271,743272,743275,743276,743279,743280,743283,743284,743286,743298,743308,743332,743335,743345,743356,743376,743399,743409,743762,743765,743867,743868,743904,743909,743923,743945,743975,743978,744046,744050,744075,744096,744111,950275,950286,975536,978477,993895") == "7ad26d5e9378b4b43c7a179dd6c6e805a2d14d46" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "306,1,30,37,50,52,56,1989,1990,2035,2036,2052,427059,438934,442027,458752,458766,459252,459253,459993,459994,460011,460012,482171,742462,742475,742483,742489,742490,742496,742497,742502,742503,742517,742518,742524,742525,742528,742529,742534,742535,742542,742543,742545,742546,742550,742551,742555,742556,742560,742568,742578,742593,742596,742597,742607,742642,742646,742648,742662,742682,742695,742708,742717,742720,742722,742729,742734,742735,742737,742738,742742,742743,742748,742749,742754,742755,742759,742760,742765,742766,742770,742771,742776,742777,742781,742782,742785,742786,742793,742794,742798,742799,742810,742811,742815,742816,742820,742821,742826,742827,742829,742830,742836,742837,742838,742839,742844,742845,742848,742849,742861,742871,742877,742878,742881,742882,742883,742884,742888,742889,742890,742891,742906,742907,742909,742910,742911,742912,742915,742916,742921,742922,742934,742935,742938,742939,742940,742941,742943,742944,742945,742946,742947,742948,742949,742950,742951,742952,742953,742954,742955,742956,742958,742959,742960,742961,742963,742964,742966,742967,742968,742969,742970,742971,742973,742974,742977,742978,742979,742980,742981,742982,742984,742985,742986,742987,742989,742990,742991,742992,742993,742994,742997,742998,743002,743003,743006,743007,743009,743010,743012,743013,743015,743016,743017,743018,743020,743022,743025,743026,743029,743030,743032,743033,743040,743041,743055,743056,743060,743061,743063,743064,743070,743074,743081,743082,743089,743090,743092,743093,743098,743099,743111,743112,743117,743118,743121,743122,743139,743140,743142,743143,743148,743149,743156,743157,743158,743159,743161,743162,743167,743168,743173,743174,743180,743181,743192,743193,743195,743196,743200,743201,743210,743211,743221,743222,743226,743227,743230,743231,743245,743246,743249,743250,743263,743264,743266,743267,743271,743272,743275,743276,743279,743280,743283,743284,743286,743298,743308,743332,743335,743345,743356,743376,743399,743409,743762,743765,743867,743868,743904,743909,743923,743945,743975,743978,744046,744050,744075,744096,744111,950275,950286,975536,978477,993895") && block_image_verify(map_partition("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(map_partition("vendor"), "74,1,25,35,39,44,45,123,131,137,138,1812,1816,2293,2294,2299,2303,2307,2308,2314,2320,2321,2322,2566,2570,2575,2576,2578,2582,7963,7964,8493,8494,8500,8501,12338,12339,12341,12342,12431,12432,19834,19836,19839,19840,19843,19844,19846,19847,19849,19850,19873,19874,19910,19914,19964,19965,19968,19974,19975,19976,19979,19980,19985,19986,20022,491534,491536,524289,524304,541940,543574,552189,552309,552310") == "1c727524458c70e43b3c89897c86619ba8ccd4cb" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "74,1,25,35,39,44,45,123,131,137,138,1812,1816,2293,2294,2299,2303,2307,2308,2314,2320,2321,2322,2566,2570,2575,2576,2578,2582,7963,7964,8493,8494,8500,8501,12338,12339,12341,12342,12431,12432,19834,19836,19839,19840,19843,19844,19846,19847,19849,19850,19873,19874,19910,19914,19964,19965,19968,19974,19975,19976,19979,19980,19985,19986,20022,491534,491536,524289,524304,541940,543574,552189,552309,552310") && block_image_verify(map_partition("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;
if (range_sha1(map_partition("product"), "20,1,21,26,27,29,30,146,150,154,155,167,173,174,65547,65548,82420,82668,83982,84015,84016") == "26f6caf10335b8f49dda8246ee307daf7a7ddec3" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
ifelse (block_image_recover(map_partition("product"), "20,1,21,26,27,29,30,146,150,154,155,167,173,174,65547,65548,82420,82668,83982,84015,84016") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "12,1,6,2019,2025,2026,2027,2035,2259,32231,32745,32767,32768") == "93e400f6bd0824ca8f4e9ee7d6779b315550bd8d" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
ifelse (block_image_recover(map_partition("odm"), "12,1,6,2019,2025,2026,2027,2035,2259,32231,32745,32767,32768") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_ext"), "222,1,29,36,40,44,45,51,57,58,59,73,79,80,81,139,143,148,149,155,161,162,163,357,361,365,366,369,373,378,379,382,383,389,395,396,397,419,425,426,427,1138,1142,1160,1161,1165,1171,1172,1173,1175,1176,1187,1193,1194,1195,1205,1206,1211,1215,1219,1220,1224,1230,1234,1235,1242,1248,1249,1250,1262,1268,1269,1270,1272,1279,1285,1292,1297,1304,1334,1341,1360,1367,1385,1390,1407,1414,1430,1431,1526,1528,1531,1532,1544,1545,1546,1547,1548,1549,1557,1558,1581,1582,1612,1613,1627,1632,1635,1638,1641,1644,1647,1649,1653,1654,1658,1661,1666,1667,1670,1677,1681,1684,1685,1751,2145,2149,2154,2156,2161,2163,2167,2171,2172,2176,2177,2181,2182,2186,2187,2191,2192,2196,2197,2199,2204,2210,2211,2215,2216,2220,2221,2225,2226,2230,2231,2235,2236,2240,2241,2243,2244,2248,2249,2253,2254,2258,2259,2263,2264,2268,2269,2273,2274,2278,2279,2281,2285,2289,2290,2292,2293,2295,2296,2300,2301,2305,2306,2308,2309,2313,2314,2318,2319,2323,2324,2328,2329,2331,2332,2336,2337,2339,2343,2352,2357,2387,2390,2498,4302,4321,4929,4930,4986,5061,5064,98325,98326,103307,103621,105266,105303,105304") == "e01134f05ff57bc94980bc27b98defb26d96904c" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "222,1,29,36,40,44,45,51,57,58,59,73,79,80,81,139,143,148,149,155,161,162,163,357,361,365,366,369,373,378,379,382,383,389,395,396,397,419,425,426,427,1138,1142,1160,1161,1165,1171,1172,1173,1175,1176,1187,1193,1194,1195,1205,1206,1211,1215,1219,1220,1224,1230,1234,1235,1242,1248,1249,1250,1262,1268,1269,1270,1272,1279,1285,1292,1297,1304,1334,1341,1360,1367,1385,1390,1407,1414,1430,1431,1526,1528,1531,1532,1544,1545,1546,1547,1548,1549,1557,1558,1581,1582,1612,1613,1627,1632,1635,1638,1641,1644,1647,1649,1653,1654,1658,1661,1666,1667,1670,1677,1681,1684,1685,1751,2145,2149,2154,2156,2161,2163,2167,2171,2172,2176,2177,2181,2182,2186,2187,2191,2192,2196,2197,2199,2204,2210,2211,2215,2216,2220,2221,2225,2226,2230,2231,2235,2236,2240,2241,2243,2244,2248,2249,2253,2254,2258,2259,2263,2264,2268,2269,2273,2274,2278,2279,2281,2285,2289,2290,2292,2293,2295,2296,2300,2301,2305,2306,2308,2309,2313,2314,2318,2319,2323,2324,2328,2329,2331,2332,2336,2337,2339,2343,2352,2357,2387,2390,2498,4302,4321,4929,4930,4986,5061,5064,98325,98326,103307,103621,105266,105303,105304") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

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


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/xbl_config_5.elf", "/dev/block/bootdevice/by-name/xbl_config_5");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/xbl_5.elf", "/dev/block/bootdevice/by-name/xbl_5");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/xbl_config_4.elf", "/dev/block/bootdevice/by-name/xbl_config_4");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/xbl_4.elf", "/dev/block/bootdevice/by-name/xbl_4");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");

# --- Start patching dynamic partitions ---


# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.500000, 0);
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# Patch partition system_ext

ui_print("Patching system_ext image after verification.");
show_progress(0.100000, 0);
block_image_update(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat") ||
  abort("E2001: Failed to update system_ext image.");

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:47f8c62c99344ae439bd0a51e76aa2da7ff972f7"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b7d47e4983de030d1dad7cf844f108bd5a4a80ab"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:b7d47e4983de030d1dad7cf844f108bd5a4a80ab")));

# ---- 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");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");

# ---- update tasks: exaid part 2----


package_extract_file("exaid.img", "/dev/block/bootdevice/by-name/exaid");
    
set_progress(1.000000);
