getprop("ro.product.device") == "px30_evb" || abort("E3004: This package is for \"px30_evb\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/155321:userdebug/test-keys");
ui_print("Target: rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/101728:userdebug/test-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/155321:userdebug/test-keys" ||
    getprop("ro.build.fingerprint") == "rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/101728:userdebug/test-keys" ||
    abort("E3001: Package expects build fingerprint of rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/155321:userdebug/test-keys or rockchip/px30_evb/px30_evb:8.1.0/OPM8.190605.003/101728:userdebug/test-keys; this device has " + getprop("ro.build.fingerprint") + ".");
apply_patch_check("EMMC:/dev/block/by-name/boot:22267904:e2dbdf179627381a9abd62afa75b197b139c6de5:22267904:0b4e435e6e5f350e9cfe692e02dcbdc9ccf8c60a") || abort("E3005: \"EMMC:/dev/block/by-name/boot:22267904:e2dbdf179627381a9abd62afa75b197b139c6de5:22267904:0b4e435e6e5f350e9cfe692e02dcbdc9ccf8c60a\" has unexpected contents.");
apply_patch_space(50331648) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/by-name/system", "104,1,203,214,382,6262,6270,7852,7856,7864,7867,7889,7892,7906,7909,7926,7929,11983,11986,11996,12001,12109,12112,32768,32770,48376,48377,88259,88260,98304,98306,108163,108166,109718,109720,110647,110650,110939,110941,115219,115222,115488,115489,115491,115494,115793,115798,115813,115816,115845,115846,115850,115852,115863,115868,116498,116501,116556,116559,116570,116573,116584,116587,116683,116686,116824,116827,116898,116901,116910,116912,116921,116922,117925,117928,119169,119172,119282,119285,119297,119300,119369,119372,119930,119937,119952,119985,120080,120082,120103,131073,139264,148012,160300,163842,164030,229378,229566,294914,295102,382803,387072,390122,390129,393216") == "86f4b8d92826ef6f65ea26d76aab28d9763b6405" || block_image_verify("/dev/block/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/by-name/system");
ifelse (block_image_recover("/dev/block/by-name/system", "104,1,203,214,382,6262,6270,7852,7856,7864,7867,7889,7892,7906,7909,7926,7929,11983,11986,11996,12001,12109,12112,32768,32770,48376,48377,88259,88260,98304,98306,108163,108166,109718,109720,110647,110650,110939,110941,115219,115222,115488,115489,115491,115494,115793,115798,115813,115816,115845,115846,115850,115852,115863,115868,116498,116501,116556,116559,116570,116573,116584,116587,116683,116686,116824,116827,116898,116901,116910,116912,116921,116922,117925,117928,119169,119172,119282,119285,119297,119300,119369,119372,119930,119937,119952,119985,120080,120082,120103,131073,139264,148012,160300,163842,164030,229378,229566,294914,295102,382803,387072,390122,390129,393216") && block_image_verify("/dev/block/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/by-name/vendor", "110,1,53,55,96,3079,3087,3126,3127,3404,3405,3406,3407,6947,6948,7213,7219,7301,7311,7598,7603,7839,7872,7978,7979,9182,9183,14090,14091,16417,16418,16464,16465,17550,17669,17675,17685,17694,17695,18171,18203,18282,18283,20672,20679,20754,20764,21353,21358,21572,21601,21691,21692,22077,22079,26407,27253,32768,32770,32817,32818,42519,42520,47324,47325,49545,49546,49601,49602,50613,50710,50717,50728,50738,50739,51199,51200,51430,51459,51494,51495,51661,51662,51667,51668,51866,51867,52069,52070,52462,52463,52807,52808,57274,57275,58849,58850,59267,59268,61141,61142,61143,61144,61539,61540,61840,66061,96760,97524,97531,98304") == "84c8e77c4436501d51391bcb5b339e83330a8434" || block_image_verify("/dev/block/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/by-name/vendor");
ifelse (block_image_recover("/dev/block/by-name/vendor", "110,1,53,55,96,3079,3087,3126,3127,3404,3405,3406,3407,6947,6948,7213,7219,7301,7311,7598,7603,7839,7872,7978,7979,9182,9183,14090,14091,16417,16418,16464,16465,17550,17669,17675,17685,17694,17695,18171,18203,18282,18283,20672,20679,20754,20764,21353,21358,21572,21601,21691,21692,22077,22079,26407,27253,32768,32770,32817,32818,42519,42520,47324,47325,49545,49546,49601,49602,50613,50710,50717,50728,50738,50739,51199,51200,51430,51459,51494,51495,51661,51662,51667,51668,51866,51867,52069,52070,52462,52463,52807,52808,57274,57275,58849,58850,59267,59268,61141,61142,61143,61144,61539,61540,61840,66061,96760,97524,97531,98304") && block_image_verify("/dev/block/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;
if (range_sha1("/dev/block/by-name/oem", "24,1,36,37,39,2053,2060,4968,4969,5394,5396,7799,7801,8704,8705,8707,8739,32768,32770,32801,32802,64504,65014,65021,65536") == "456427ffa8ddb7dfc6de26f7280a5b59dcd78f59" || block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat")) then
ui_print("Verified oem image...");
else
check_first_block("/dev/block/by-name/oem");
ifelse (block_image_recover("/dev/block/by-name/oem", "24,1,36,37,39,2053,2060,4968,4969,5394,5396,7799,7801,8704,8705,8707,8739,32768,32770,32801,32802,64504,65014,65021,65536") && block_image_verify("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat"), ui_print("oem recovered successfully."), abort("E2004: oem partition fails to recover"));
endif;

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

ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update("/dev/block/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.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");
ui_print("Patching oem image after verification.");
show_progress(0.100000, 0);
block_image_update("/dev/block/by-name/oem", package_extract_file("oem.transfer.list"), "oem.new.dat", "oem.patch.dat") ||
  abort("E2001: Failed to update oem image.");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/by-name/boot:22267904:e2dbdf179627381a9abd62afa75b197b139c6de5:22267904:0b4e435e6e5f350e9cfe692e02dcbdc9ccf8c60a",
            "-", 0b4e435e6e5f350e9cfe692e02dcbdc9ccf8c60a, 22267904,
            e2dbdf179627381a9abd62afa75b197b139c6de5,
            package_extract_file("patch/boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/by-name/boot:22267904:e2dbdf179627381a9abd62afa75b197b139c6de5:22267904:0b4e435e6e5f350e9cfe692e02dcbdc9ccf8c60a");
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
