getprop("ro.product.device") == "rk3568_mtb720" || abort("E3004: This package is for \"rk3568_mtb720\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: rockchip/rk3568_mtb720/rk3568_mtb720:11/RQ3A.210705.001/eng.kcy15.20250212.113409:userdebug/release-keys");
ui_print("Target: rockchip/rk3568_mtb720/rk3568_mtb720:11/RQ3A.210705.001/eng.kcy15.20250212.120556:userdebug/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "rockchip/rk3568_mtb720/rk3568_mtb720:11/RQ3A.210705.001/eng.kcy15.20250212.113409:userdebug/release-keys" ||
    getprop("ro.build.fingerprint") == "rockchip/rk3568_mtb720/rk3568_mtb720:11/RQ3A.210705.001/eng.kcy15.20250212.120556:userdebug/release-keys" ||
    abort("E3001: Package expects build fingerprint of rockchip/rk3568_mtb720/rk3568_mtb720:11/RQ3A.210705.001/eng.kcy15.20250212.113409:userdebug/release-keys or rockchip/rk3568_mtb720/rk3568_mtb720:11/RQ3A.210705.001/eng.kcy15.20250212.120556:userdebug/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/by-name/boot",":34320384:3ba7fea63fd66a2bc528831dff61c7ede8929d51"),
                      concat("EMMC:","/dev/block/by-name/boot",":34320384:7c8308c5bc32dc87de31289d4feecd06e42c756b")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/by-name/boot",":34320384:3ba7fea63fd66a2bc528831dff61c7ede8929d51"),"\" or \"",concat("EMMC:","/dev/block/by-name/boot",":34320384:7c8308c5bc32dc87de31289d4feecd06e42c756b"),"\" has unexpected contents."));
apply_patch_space(50331648) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "366,1,48,49,61,102,107,109,110,476,477,478,479,666,667,992,993,995,996,2543,2544,2547,2548,2848,2849,4236,4237,8288,8289,17948,17949,31686,31687,31689,31690,31694,31695,31696,31697,31805,31806,31861,31862,31936,31937,31939,31941,32768,32803,32942,32943,32945,32947,39091,39092,39094,39096,39097,39098,39220,39221,39223,39225,39228,39229,39333,39335,40051,40052,40054,40055,40059,40060,40069,40070,40073,40074,44774,44775,44777,44779,44780,44781,44792,44794,45682,45683,45685,45686,46272,46273,47084,47085,47087,47088,47339,47340,47341,47342,47372,47373,47423,47424,47497,47498,47500,47501,47506,47508,49627,49628,49630,49631,49847,49848,49850,49851,50461,50463,50743,50745,51109,51110,51112,51113,51176,51177,51178,51179,51180,51181,51183,51184,51198,51200,51384,51385,51387,51389,51448,51449,51584,51585,51587,51588,51593,51594,55840,55841,59852,59853,61422,61423,64877,64878,65536,65569,70800,70801,76522,76523,78751,78752,83557,83558,83560,83562,83619,83622,83628,83629,84619,84621,84773,84775,84789,84791,84797,84798,86743,86747,86795,86796,86803,86805,86811,86812,86819,86821,86827,86828,88102,88106,89209,89210,89329,89331,89339,89340,89376,89378,89384,89385,89522,89524,89530,89531,89547,89549,89555,89556,89558,89559,90649,90651,90675,90676,90933,90935,91232,91233,91237,91239,91245,91246,91253,91255,91261,91262,91298,91300,91325,91326,92330,92331,93035,93037,93055,93056,93931,93935,93957,93958,93966,93968,93974,93975,93980,93984,93991,93992,94022,94024,94030,94031,94291,94295,94306,94307,95033,95035,95039,95040,95170,95172,95179,95180,95223,95225,95231,95232,96947,96948,96990,96992,96998,96999,97086,97088,97095,97096,97143,97145,97170,97171,98304,98339,99116,99118,99137,99138,99144,99146,99158,99159,102523,102524,104802,104803,107911,107912,110816,110818,111053,111054,111076,111077,111089,111090,111120,111121,111146,111147,111206,111207,111230,111231,111381,111382,111388,111390,131072,131115,131852,131853,132088,132089,135635,135636,157872,157874,163840,163876,171372,171373,174258,174259,174529,174530,174776,174777,174798,174799,185499,185500,188200,188224,196608,196643,197826,197827,198864,198865,199188,199189,199243,199244,212102,212103,221577,221578,222378,222409,226550,226552,229376,229378") == "92442c4e37ae33547d864376fdc97db58a519e4d" || 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"), "366,1,48,49,61,102,107,109,110,476,477,478,479,666,667,992,993,995,996,2543,2544,2547,2548,2848,2849,4236,4237,8288,8289,17948,17949,31686,31687,31689,31690,31694,31695,31696,31697,31805,31806,31861,31862,31936,31937,31939,31941,32768,32803,32942,32943,32945,32947,39091,39092,39094,39096,39097,39098,39220,39221,39223,39225,39228,39229,39333,39335,40051,40052,40054,40055,40059,40060,40069,40070,40073,40074,44774,44775,44777,44779,44780,44781,44792,44794,45682,45683,45685,45686,46272,46273,47084,47085,47087,47088,47339,47340,47341,47342,47372,47373,47423,47424,47497,47498,47500,47501,47506,47508,49627,49628,49630,49631,49847,49848,49850,49851,50461,50463,50743,50745,51109,51110,51112,51113,51176,51177,51178,51179,51180,51181,51183,51184,51198,51200,51384,51385,51387,51389,51448,51449,51584,51585,51587,51588,51593,51594,55840,55841,59852,59853,61422,61423,64877,64878,65536,65569,70800,70801,76522,76523,78751,78752,83557,83558,83560,83562,83619,83622,83628,83629,84619,84621,84773,84775,84789,84791,84797,84798,86743,86747,86795,86796,86803,86805,86811,86812,86819,86821,86827,86828,88102,88106,89209,89210,89329,89331,89339,89340,89376,89378,89384,89385,89522,89524,89530,89531,89547,89549,89555,89556,89558,89559,90649,90651,90675,90676,90933,90935,91232,91233,91237,91239,91245,91246,91253,91255,91261,91262,91298,91300,91325,91326,92330,92331,93035,93037,93055,93056,93931,93935,93957,93958,93966,93968,93974,93975,93980,93984,93991,93992,94022,94024,94030,94031,94291,94295,94306,94307,95033,95035,95039,95040,95170,95172,95179,95180,95223,95225,95231,95232,96947,96948,96990,96992,96998,96999,97086,97088,97095,97096,97143,97145,97170,97171,98304,98339,99116,99118,99137,99138,99144,99146,99158,99159,102523,102524,104802,104803,107911,107912,110816,110818,111053,111054,111076,111077,111089,111090,111120,111121,111146,111147,111206,111207,111230,111231,111381,111382,111388,111390,131072,131115,131852,131853,132088,132089,135635,135636,157872,157874,163840,163876,171372,171373,174258,174259,174529,174530,174776,174777,174798,174799,185499,185500,188200,188224,196608,196643,197826,197827,198864,198865,199188,199189,199243,199244,212102,212103,221577,221578,222378,222409,226550,226552,229376,229378") && 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"), "38,1,42,320,322,393,394,577,578,1784,1785,3246,3247,3248,3249,3271,3272,3274,3275,3442,3443,10512,10513,10847,10848,18036,18037,30057,30081,32768,32812,35539,37520,55353,55384,60109,65567,65569,78763") == "6273f67c353faeae672f0c916110d00d08a9e78d" || 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"), "38,1,42,320,322,393,394,577,578,1784,1785,3246,3247,3248,3249,3271,3272,3274,3275,3442,3443,10512,10513,10847,10848,18036,18037,30057,30081,32768,32812,35539,37520,55353,55384,60109,65567,65569,78763") && 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;

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


# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

# 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.");

# 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/by-name/boot",":34320384:3ba7fea63fd66a2bc528831dff61c7ede8929d51"),
                concat("EMMC:","/dev/block/by-name/boot",":34320384:7c8308c5bc32dc87de31289d4feecd06e42c756b"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/by-name/boot",":34320384:7c8308c5bc32dc87de31289d4feecd06e42c756b")));
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
