getprop("ro.product.device") == "PSG1" || abort("E3004: This package is for \"PSG1\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: PlaySolana/PSG1/PSG1:15/AP4A.241205.013.C1/playsolana-20260324-174045:user/dev-keys");
ui_print("Target: PlaySolana/PSG1/PSG1:15/AP4A.241205.013.C1/playsolana-20260521-145647:user/dev-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "PlaySolana/PSG1/PSG1:15/AP4A.241205.013.C1/playsolana-20260324-174045:user/dev-keys" ||
    getprop("ro.build.fingerprint") == "PlaySolana/PSG1/PSG1:15/AP4A.241205.013.C1/playsolana-20260521-145647:user/dev-keys" ||
    abort("E3001: Package expects build fingerprint of PlaySolana/PSG1/PSG1:15/AP4A.241205.013.C1/playsolana-20260324-174045:user/dev-keys or PlaySolana/PSG1/PSG1:15/AP4A.241205.013.C1/playsolana-20260521-145647:user/dev-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/by-name/boot",":67108864:602bd4062fa37cd58161c7ddfbe868b24d6fa1b4"),
                      concat("EMMC:","/dev/block/by-name/boot",":67108864:8f743dca79acf28300b8afeea22fd06d1a44e878")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/by-name/boot",":67108864:602bd4062fa37cd58161c7ddfbe868b24d6fa1b4"),"\" or \"",concat("EMMC:","/dev/block/by-name/boot",":67108864:8f743dca79acf28300b8afeea22fd06d1a44e878"),"\" has unexpected contents."));
apply_patch_space(67108864) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "14,0,12288,24576,36864,61440,73728,98304,110592,159744,172032,221184,233472,258048,447569") == "fdaf98c46a39e573f2f8cf5d19eca3274e33a222" || 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"), "14,0,12288,24576,36864,61440,73728,98304,110592,159744,172032,221184,233472,258048,447569") && 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"), "4,0,12288,24576,83852") == "c461605d110af631b7bac42d5b8c556f56133a7a" || 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"), "4,0,12288,24576,83852") && 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"), "16,0,12288,24576,36864,98304,110592,122880,135168,159744,172032,221184,233472,294912,307200,528384,548572") == "8f91d8ca269964955120679cf3dafad058dcfa04" || 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"), "16,0,12288,24576,36864,98304,110592,122880,135168,159744,172032,221184,233472,294912,307200,528384,548572") && 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"), "2,0,7836") == "d6d5e86fcaf8b0d77a1de9d600c6da985a696e02" || 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"), "2,0,7836") && 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"), "4,0,12288,24576,43592") == "8fbcabd50b97641767df605c0291c8c2765a6287" || 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"), "4,0,12288,24576,43592") && 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;
if (range_sha1(map_partition("vendor_dlkm"), "2,0,6250") == "331587a76c86d16d7cffc741eaa1ab87d85fa48b" || block_image_verify(map_partition("vendor_dlkm"), package_extract_file("vendor_dlkm.transfer.list"), "vendor_dlkm.new.dat", "vendor_dlkm.patch.dat")) then
ui_print("Verified vendor_dlkm image...");
else
ifelse (block_image_recover(map_partition("vendor_dlkm"), "2,0,6250") && block_image_verify(map_partition("vendor_dlkm"), package_extract_file("vendor_dlkm.transfer.list"), "vendor_dlkm.new.dat", "vendor_dlkm.patch.dat"), ui_print("vendor_dlkm recovered successfully."), abort("E2004: vendor_dlkm partition fails to recover"));
endif;
if (range_sha1(map_partition("odm_dlkm"), "2,0,85") == "d59d8cf2b3371073c5ef415a36188b3fa97dda4d" || block_image_verify(map_partition("odm_dlkm"), package_extract_file("odm_dlkm.transfer.list"), "odm_dlkm.new.dat", "odm_dlkm.patch.dat")) then
ui_print("Verified odm_dlkm image...");
else
ifelse (block_image_recover(map_partition("odm_dlkm"), "2,0,85") && block_image_verify(map_partition("odm_dlkm"), package_extract_file("odm_dlkm.transfer.list"), "odm_dlkm.new.dat", "odm_dlkm.patch.dat"), ui_print("odm_dlkm recovered successfully."), abort("E2004: odm_dlkm partition fails to recover"));
endif;
if (range_sha1(map_partition("system_dlkm"), "2,0,85") == "01d584b52885d43d4385700ca0d357ef3085be20" || block_image_verify(map_partition("system_dlkm"), package_extract_file("system_dlkm.transfer.list"), "system_dlkm.new.dat", "system_dlkm.patch.dat")) then
ui_print("Verified system_dlkm image...");
else
ifelse (block_image_recover(map_partition("system_dlkm"), "2,0,85") && block_image_verify(map_partition("system_dlkm"), package_extract_file("system_dlkm.transfer.list"), "system_dlkm.new.dat", "system_dlkm.patch.dat"), ui_print("system_dlkm recovered successfully."), abort("E2004: system_dlkm 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.200000, 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.");

# Patch partition vendor_dlkm

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

# Patch partition odm_dlkm

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

# Patch partition system_dlkm

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

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/by-name/boot",":67108864:602bd4062fa37cd58161c7ddfbe868b24d6fa1b4"),
                concat("EMMC:","/dev/block/by-name/boot",":67108864:8f743dca79acf28300b8afeea22fd06d1a44e878"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/by-name/boot",":67108864:8f743dca79acf28300b8afeea22fd06d1a44e878")));
ui_print("Writing vbmeta img...");
package_extract_file("vbmeta.img", "/dev/block/by-name/vbmeta");
ui_print("Writing dtbo img...");
package_extract_file("dtbo.img", "/dev/block/by-name/dtbo");
ui_print("Writing uboot loader img...");
package_extract_file("uboot.img", "/dev/block/by-name/uboot");
set_progress(1.000000);
