getprop("ro.product.device") == "lime" || abort("E3004: This package is for \"lime\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/lime/lime:10/QKQ1.200830.002/V12.0.18.0.QJQCNXM:user/release-keys");
ui_print("Target: Redmi/lime/lime:10/QKQ1.200830.002/V12.0.20.0.QJQCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/lime/lime:10/QKQ1.200830.002/V12.0.18.0.QJQCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/lime/lime:10/QKQ1.200830.002/V12.0.20.0.QJQCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/lime/lime:10/QKQ1.200830.002/V12.0.18.0.QJQCNXM:user/release-keys or Redmi/lime/lime:10/QKQ1.200830.002/V12.0.20.0.QJQCNXM: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:100663296:fa1aa6667348296794df9e257d302925245060e8",
                      "EMMC:/dev/block/bootdevice/by-name/boot:100663296:095361f9a7e6e536d2377174bb33e983b4212567") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:fa1aa6667348296794df9e257d302925245060e8\" or \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:095361f9a7e6e536d2377174bb33e983b4212567\" has unexpected contents.");
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "18,1,32770,32971,98306,98507,163842,164043,229378,229579,294914,295115,819202,819403,822962,825510,838591,838765,838766") == "6cd24cbbe44d7e00434ed417b85834655101db33" || 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"), "18,1,32770,32971,98306,98507,163842,164043,229378,229579,294914,295115,819202,819403,822962,825510,838591,838765,838766") && 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"), "230,1,114,124,128,133,134,216,220,225,226,1900,1904,2381,2382,2645,2649,2653,2654,2656,2660,2662,2673,2696,2697,2733,2737,2787,2788,2924,2925,2937,2941,2945,2946,2949,2955,2956,2957,2969,2973,2977,2984,2993,2994,3005,3022,4262,4287,4752,4755,4925,5264,5350,5351,6387,6549,8254,8661,8746,8785,8855,8856,8976,9029,9627,9628,9632,9633,9637,9638,9642,9643,9648,9649,9653,9654,9655,9656,9659,9660,9661,9662,9665,9666,9667,9668,9670,9672,9673,9674,9677,9678,9679,9680,9683,9684,9685,9686,9689,9690,9696,9697,9701,9702,9705,9707,9710,9712,9716,9717,9721,9722,9723,9724,9727,9728,9729,9730,9733,9734,9735,9736,9739,9740,9741,9742,9745,9746,9747,9748,9751,9752,9757,9758,9759,9760,9764,9765,10177,10178,10378,10381,11267,11275,14828,14829,14831,14832,14884,14885,32768,32770,32855,32880,42196,42197,49245,49246,49351,49352,49353,49354,49852,49854,49859,49861,49867,49869,49874,49876,49935,49937,50157,50162,55383,55384,58630,58632,58670,58671,63290,63291,63925,63927,64568,64570,65095,65096,65536,65555,65691,65692,66598,66599,66607,66608,66704,66705,68629,68631,79608,79609,79826,86106,86107,86109,86111,86112,86118,86119,86121,86122,86125,86126,86136,98306,98391,163842,163927,229378,229463,294914,294999,327697,327699,349160,350263,355816,355898,355899") == "96d1403e70a55856961778f0bb50213c85be987c" || 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"), "230,1,114,124,128,133,134,216,220,225,226,1900,1904,2381,2382,2645,2649,2653,2654,2656,2660,2662,2673,2696,2697,2733,2737,2787,2788,2924,2925,2937,2941,2945,2946,2949,2955,2956,2957,2969,2973,2977,2984,2993,2994,3005,3022,4262,4287,4752,4755,4925,5264,5350,5351,6387,6549,8254,8661,8746,8785,8855,8856,8976,9029,9627,9628,9632,9633,9637,9638,9642,9643,9648,9649,9653,9654,9655,9656,9659,9660,9661,9662,9665,9666,9667,9668,9670,9672,9673,9674,9677,9678,9679,9680,9683,9684,9685,9686,9689,9690,9696,9697,9701,9702,9705,9707,9710,9712,9716,9717,9721,9722,9723,9724,9727,9728,9729,9730,9733,9734,9735,9736,9739,9740,9741,9742,9745,9746,9747,9748,9751,9752,9757,9758,9759,9760,9764,9765,10177,10178,10378,10381,11267,11275,14828,14829,14831,14832,14884,14885,32768,32770,32855,32880,42196,42197,49245,49246,49351,49352,49353,49354,49852,49854,49859,49861,49867,49869,49874,49876,49935,49937,50157,50162,55383,55384,58630,58632,58670,58671,63290,63291,63925,63927,64568,64570,65095,65096,65536,65555,65691,65692,66598,66599,66607,66608,66704,66705,68629,68631,79608,79609,79826,86106,86107,86109,86111,86112,86118,86119,86121,86122,86125,86126,86136,98306,98391,163842,163927,229378,229463,294914,294999,327697,327699,349160,350263,355816,355898,355899") && 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"), "8,1,32770,32790,84784,85044,86395,86428,86429") == "bfb2654863f10fc3601a1aaf110d5f62c9cc2368" || 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"), "8,1,32770,32790,84784,85044,86395,86428,86429") && 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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:100663296:fa1aa6667348296794df9e257d302925245060e8",
                "EMMC:/dev/block/bootdevice/by-name/boot:100663296:095361f9a7e6e536d2377174bb33e983b4212567",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:100663296:095361f9a7e6e536d2377174bb33e983b4212567");

# ---- 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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
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/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecappbak");
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/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

# Patch partition product

ui_print("Patching product image after verification.");
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 vendor

ui_print("Patching vendor image after verification.");
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 system

ui_print("Patching system image after verification.");
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.");

# --- End patching dynamic partitions ---

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