getprop("ro.product.device") == "rk3568_r" || abort("E3004: This package is for \"rk3568_r\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: rockchip/rk3568_r/rk3568_r:11/RQ3A.210705.001/eng.jiangb.20260130.175618:userdebug/release-keys");
ui_print("Target: rockchip/rk3568_r/rk3568_r:11/RQ3A.210705.001/eng.jiangb.20260205.104652:userdebug/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "rockchip/rk3568_r/rk3568_r:11/RQ3A.210705.001/eng.jiangb.20260130.175618:userdebug/release-keys" ||
    getprop("ro.build.fingerprint") == "rockchip/rk3568_r/rk3568_r:11/RQ3A.210705.001/eng.jiangb.20260205.104652:userdebug/release-keys" ||
    abort("E3001: Package expects build fingerprint of rockchip/rk3568_r/rk3568_r:11/RQ3A.210705.001/eng.jiangb.20260130.175618:userdebug/release-keys or rockchip/rk3568_r/rk3568_r:11/RQ3A.210705.001/eng.jiangb.20260205.104652:userdebug/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/by-name/boot",":35915776:4a91c749394a8245210b31c005ef523245bc9820"),
                      concat("EMMC:","/dev/block/by-name/boot",":35897344:85110a7414b2c05350885a9bdf80940b11fd499a")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/by-name/boot",":35915776:4a91c749394a8245210b31c005ef523245bc9820"),"\" or \"",concat("EMMC:","/dev/block/by-name/boot",":35897344:85110a7414b2c05350885a9bdf80940b11fd499a"),"\" has unexpected contents."));
apply_patch_space(81002496) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "186,1,35,36,48,89,94,96,97,463,464,465,466,653,654,979,980,982,983,2530,2531,2534,2535,2835,2836,4223,4224,8275,8276,17935,17936,31673,31674,31676,31677,31681,31682,31683,31684,31792,31793,32768,32794,32916,32917,32919,32921,39065,39066,39068,39070,39071,39072,39194,39195,39197,39199,39202,39203,39307,39309,40025,40026,40028,40029,40033,40034,40043,40044,40047,40048,40828,40866,44751,44752,44754,44756,44757,44758,44769,44771,45659,45660,45662,45663,46249,46250,47061,47062,47064,47065,47316,47317,47318,47319,47349,47350,47400,47401,47474,47475,47477,47478,47483,47485,49604,49605,49607,49608,49824,49825,49827,49828,50438,50440,50720,50722,51086,51087,51089,51090,51153,51154,51155,51156,51157,51158,51160,51161,51175,51177,51361,51362,51364,51366,51425,51426,51561,51562,51564,51565,51570,51571,55817,55818,59829,59830,61603,61631,65536,65558,70769,70770,76491,76492,78990,79028,97574,97575,98304,98329,104181,107308,124541,124559,124599,124600,124606,124643,124683,124684,124691,129974,131072,131229,131687,131688,134263,134266,138126,303995,303996,425807,425811,491525,491540,514946") == "b51726a91db1914777338ffc11768f32e19248a6" || 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"), "186,1,35,36,48,89,94,96,97,463,464,465,466,653,654,979,980,982,983,2530,2531,2534,2535,2835,2836,4223,4224,8275,8276,17935,17936,31673,31674,31676,31677,31681,31682,31683,31684,31792,31793,32768,32794,32916,32917,32919,32921,39065,39066,39068,39070,39071,39072,39194,39195,39197,39199,39202,39203,39307,39309,40025,40026,40028,40029,40033,40034,40043,40044,40047,40048,40828,40866,44751,44752,44754,44756,44757,44758,44769,44771,45659,45660,45662,45663,46249,46250,47061,47062,47064,47065,47316,47317,47318,47319,47349,47350,47400,47401,47474,47475,47477,47478,47483,47485,49604,49605,49607,49608,49824,49825,49827,49828,50438,50440,50720,50722,51086,51087,51089,51090,51153,51154,51155,51156,51157,51158,51160,51161,51175,51177,51361,51362,51364,51366,51425,51426,51561,51562,51564,51565,51570,51571,55817,55818,59829,59830,61603,61631,65536,65558,70769,70770,76491,76492,78990,79028,97574,97575,98304,98329,104181,107308,124541,124559,124599,124600,124606,124643,124683,124684,124691,129974,131072,131229,131687,131688,134263,134266,138126,303995,303996,425807,425811,491525,491540,514946") && 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"), "78,1,52,174,175,1357,1358,2747,2749,2750,2751,2775,2776,2778,2779,2783,2784,9972,9973,10506,10507,10508,10509,10525,10526,10572,10573,10595,10596,10598,10599,10902,10903,11098,11099,11302,11303,18428,18467,18587,18595,20185,20236,20818,20842,29041,32371,32768,32813,32814,32823,33285,33286,33489,33490,33539,33540,33563,33564,43131,43132,43376,43429,43599,43610,45624,45689,46385,46416,48122,48123,48145,48146,48279,48280,48351,48352,49265,59106") == "d47d89634db9ccd5b6b10589cf1a7257680116b5" || 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"), "78,1,52,174,175,1357,1358,2747,2749,2750,2751,2775,2776,2778,2779,2783,2784,9972,9973,10506,10507,10508,10509,10525,10526,10572,10573,10595,10596,10598,10599,10902,10903,11098,11099,11302,11303,18428,18467,18587,18595,20185,20236,20818,20842,29041,32371,32768,32813,32814,32823,33285,33286,33489,33490,33539,33540,33563,33564,43131,43132,43376,43429,43599,43610,45624,45689,46385,46416,48122,48123,48145,48146,48279,48280,48351,48352,49265,59106") && 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"), "168,1,25,4545,4549,4564,4565,4568,4569,4700,4702,4708,4709,4792,4794,4802,4805,4842,4843,24388,24389,32768,32785,37502,37504,37506,37507,37508,37509,37510,37511,37513,37514,37768,37771,38220,38221,38592,38593,40078,40079,40169,40171,40174,40175,40178,40179,40182,40183,40186,40187,40190,40191,40194,40195,40198,40199,40202,40203,40206,40207,40210,40211,40214,40215,40218,40219,40222,40223,40230,40231,40238,40239,40246,40247,40254,40255,40262,40263,40266,40267,40288,40289,40296,40297,40318,40319,40336,40337,40343,40344,40362,40363,40370,40371,40390,40391,40406,40407,40412,40413,40438,40439,40446,40447,40468,40469,40501,40502,40507,40508,40528,40529,40536,40537,40558,40559,40576,40577,40583,40584,40608,40609,40616,40617,40637,40638,40666,40667,40672,40673,40697,40698,40704,40705,40724,40725,40756,40757,40762,40763,40766,40767,40770,40771,40774,40775,40778,40779,40782,40783,40786,40787,40790,40791,40795,40796,40800,40801,40805,40806,40813,40815,40820,40822,40828,40829,41528,41530") == "a9c950e40b5bbe96eb176b5e84ce6b7516feb71d" || 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"), "168,1,25,4545,4549,4564,4565,4568,4569,4700,4702,4708,4709,4792,4794,4802,4805,4842,4843,24388,24389,32768,32785,37502,37504,37506,37507,37508,37509,37510,37511,37513,37514,37768,37771,38220,38221,38592,38593,40078,40079,40169,40171,40174,40175,40178,40179,40182,40183,40186,40187,40190,40191,40194,40195,40198,40199,40202,40203,40206,40207,40210,40211,40214,40215,40218,40219,40222,40223,40230,40231,40238,40239,40246,40247,40254,40255,40262,40263,40266,40267,40288,40289,40296,40297,40318,40319,40336,40337,40343,40344,40362,40363,40370,40371,40390,40391,40406,40407,40412,40413,40438,40439,40446,40447,40468,40469,40501,40502,40507,40508,40528,40529,40536,40537,40558,40559,40576,40577,40583,40584,40608,40609,40616,40617,40637,40638,40666,40667,40672,40673,40697,40698,40704,40705,40724,40725,40756,40757,40762,40763,40766,40767,40770,40771,40774,40775,40778,40779,40782,40783,40786,40787,40790,40791,40795,40796,40800,40801,40805,40806,40813,40815,40820,40822,40828,40829,41528,41530") && 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"), "6,1,12,13,14,15,16") == "0b03c821d886da2b7f68761e4cb0c59cbec722ff" || 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"), "6,1,12,13,14,15,16") && 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"), "40,1,9,10,17,23,25,31,33,35,36,37,38,43,44,55,56,57,58,129,130,229,231,235,237,243,244,15375,15377,19777,19778,21577,21579,21597,21598,27896,27898,27950,27951,27983,27985") == "b01778f89334f39f9b755a126ba120a10b3cd519" || 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
ifelse (block_image_recover(map_partition("system_ext"), "40,1,9,10,17,23,25,31,33,35,36,37,38,43,44,55,56,57,58,129,130,229,231,235,237,243,244,15375,15377,19777,19778,21577,21579,21597,21598,27896,27898,27950,27951,27983,27985") && 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 ----


# --- 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/by-name/boot",":35915776:4a91c749394a8245210b31c005ef523245bc9820"),
                concat("EMMC:","/dev/block/by-name/boot",":35897344:85110a7414b2c05350885a9bdf80940b11fd499a"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/by-name/boot",":35897344:85110a7414b2c05350885a9bdf80940b11fd499a")));
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
