getprop("ro.product.device") == "citrus" || abort("E3004: This package is for \"citrus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.9.0.RJFMIXM:user/release-keys");
ui_print("Target: POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.10.0.RJFMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.9.0.RJFMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.10.0.RJFMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.9.0.RJFMIXM:user/release-keys or POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.10.0.RJFMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:356e2c72c19566e7d021b3e878afb101d0e634d3"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:dfad56da49dd286aa1530d91379c4d05e213f3bf")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:356e2c72c19566e7d021b3e878afb101d0e634d3"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:dfad56da49dd286aa1530d91379c4d05e213f3bf"),"\" has unexpected contents."));
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "138,1,33,45,55,75,79,107,108,124,21387,21394,21395,27560,27561,28976,43328,50494,58032,58043,58044,60201,60202,63025,63026,63770,63771,65331,65332,65524,65525,65536,65553,66762,66763,71132,71133,72250,72251,74269,74270,74751,74752,77915,77916,78512,78513,78700,78701,79403,79404,79620,79622,79784,79788,79796,84679,84692,84696,84700,84701,86122,86128,86161,86162,86169,86175,86176,86177,86184,86190,86191,86192,89686,89690,89730,89731,90712,90713,91363,91364,93295,93298,93306,93307,93329,93330,93334,93335,93771,93772,93946,93947,93979,93985,93986,93987,94109,94115,94116,94117,95218,95356,95376,95377,98304,98323,98700,98704,98733,98734,98749,98755,98756,98757,103699,103700,104482,104486,104552,104553,105642,105646,105667,257175,258158,258160,259910,495861,496052,655372,655377,660290,660371,661137,663138,673646,673790,673791") == "602dd98bb03c07fff3580e15908928f54503dfcf" || 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"), "138,1,33,45,55,75,79,107,108,124,21387,21394,21395,27560,27561,28976,43328,50494,58032,58043,58044,60201,60202,63025,63026,63770,63771,65331,65332,65524,65525,65536,65553,66762,66763,71132,71133,72250,72251,74269,74270,74751,74752,77915,77916,78512,78513,78700,78701,79403,79404,79620,79622,79784,79788,79796,84679,84692,84696,84700,84701,86122,86128,86161,86162,86169,86175,86176,86177,86184,86190,86191,86192,89686,89690,89730,89731,90712,90713,91363,91364,93295,93298,93306,93307,93329,93330,93334,93335,93771,93772,93946,93947,93979,93985,93986,93987,94109,94115,94116,94117,95218,95356,95376,95377,98304,98323,98700,98704,98733,98734,98749,98755,98756,98757,103699,103700,104482,104486,104552,104553,105642,105646,105667,257175,258158,258160,259910,495861,496052,655372,655377,660290,660371,661137,663138,673646,673790,673791") && 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"), "62,1,31,42,46,51,52,132,140,146,147,1824,1828,2307,2308,2553,2557,2562,2563,2566,2570,2573,2574,2597,2601,2605,2606,2629,2630,2666,2670,2720,2721,2882,2883,2888,2894,2895,2902,2916,2917,4773,4822,4828,5166,5254,5255,5297,5338,7791,7792,9159,9160,9329,192411,192497,294928,294936,312519,313468,318437,318513,318514") == "f04fcfd55d9f8730984812b18e7fa08664ada618" || 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"), "62,1,31,42,46,51,52,132,140,146,147,1824,1828,2307,2308,2553,2557,2562,2563,2566,2570,2573,2574,2597,2601,2605,2606,2629,2630,2666,2670,2720,2721,2882,2883,2888,2894,2895,2902,2916,2917,4773,4822,4828,5166,5254,5255,5297,5338,7791,7792,9159,9160,9329,192411,192497,294928,294936,312519,313468,318437,318513,318514") && 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"), "372,1,16,3205,3206,6293,6294,6311,6315,6319,6320,11087,11088,11515,11517,13554,13558,13651,13652,14654,14655,16352,16355,16361,16362,16403,16404,24817,24818,32768,32777,34634,34635,35977,35978,36112,36113,36168,36169,37783,37784,38146,38150,38669,38670,38682,38688,38689,38690,40530,40534,40576,40577,41967,41968,51716,51717,55590,55591,55841,55846,55858,55859,55923,55926,56119,56124,56381,56383,59865,59866,65536,65543,69714,69715,79259,79266,80742,80743,86118,86119,89268,89269,98304,98313,98829,98830,98837,98838,98967,98973,98974,98975,98988,98994,98995,98996,106517,106518,107757,107761,108774,108775,112623,112625,126108,126109,126178,126179,128400,128402,131072,131079,148907,148908,150916,150917,158218,158219,163840,163849,164599,164600,168589,168590,168891,168892,168944,168946,168955,168956,169050,169052,169841,169842,169849,169850,169856,169857,174194,174195,174420,174422,174432,174434,174480,174482,174492,174494,174503,174504,176322,176323,176324,176327,179712,179713,179876,179877,179878,179879,179881,179882,179899,179900,179903,179905,179906,179908,179924,179925,179937,179938,179977,179981,179985,179989,179990,179994,179995,180011,180426,180427,180798,180799,182284,182285,182374,182376,182379,182380,182383,182384,182387,182388,182391,182392,182395,182396,182399,182400,182414,182415,182421,182422,182428,182429,182435,182436,182442,182443,182449,182450,182492,182493,182514,182515,182522,182523,182544,182545,182562,182563,182569,182570,182588,182589,182596,182597,182616,182617,182632,182633,182638,182639,182659,182660,182667,182668,182689,182690,182707,182708,182714,182715,182718,182719,182722,182723,182726,182727,182730,182731,183321,183323,185769,185770,196608,196628,196629,196630,203128,203130,204271,204272,212471,212473,213523,213525,215765,215766,215940,215944,215992,215993,216008,216009,216249,216253,216504,216505,225065,225066,228601,228602,228651,228652,229376,229385,230230,230234,230302,230303,230333,230334,230470,230474,230482,230483,231871,231875,231910,231911,232052,232058,232059,232060,232064,232065,232182,232186,232187,232188,233589,233593,236359,236360,237092,237093,243531,243532,247753,247754,249281,249282,249946,249950,249966,249967,251540,251544,251569,251570,262144,262147,262405,262406,287551,287552,287577,287578,287781,287782,288259,288260,288499,288500,289238,289239,289818,289819,289996,289997,290972,290974,291446,291447,292088,292089,294912,294915,295020,295021,295958,295963,298181,298183,301517,301518,308875,313772,313847,313848") == "ca4ab07b8c2d05164015310ef9f09d3d69416268" || 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"), "372,1,16,3205,3206,6293,6294,6311,6315,6319,6320,11087,11088,11515,11517,13554,13558,13651,13652,14654,14655,16352,16355,16361,16362,16403,16404,24817,24818,32768,32777,34634,34635,35977,35978,36112,36113,36168,36169,37783,37784,38146,38150,38669,38670,38682,38688,38689,38690,40530,40534,40576,40577,41967,41968,51716,51717,55590,55591,55841,55846,55858,55859,55923,55926,56119,56124,56381,56383,59865,59866,65536,65543,69714,69715,79259,79266,80742,80743,86118,86119,89268,89269,98304,98313,98829,98830,98837,98838,98967,98973,98974,98975,98988,98994,98995,98996,106517,106518,107757,107761,108774,108775,112623,112625,126108,126109,126178,126179,128400,128402,131072,131079,148907,148908,150916,150917,158218,158219,163840,163849,164599,164600,168589,168590,168891,168892,168944,168946,168955,168956,169050,169052,169841,169842,169849,169850,169856,169857,174194,174195,174420,174422,174432,174434,174480,174482,174492,174494,174503,174504,176322,176323,176324,176327,179712,179713,179876,179877,179878,179879,179881,179882,179899,179900,179903,179905,179906,179908,179924,179925,179937,179938,179977,179981,179985,179989,179990,179994,179995,180011,180426,180427,180798,180799,182284,182285,182374,182376,182379,182380,182383,182384,182387,182388,182391,182392,182395,182396,182399,182400,182414,182415,182421,182422,182428,182429,182435,182436,182442,182443,182449,182450,182492,182493,182514,182515,182522,182523,182544,182545,182562,182563,182569,182570,182588,182589,182596,182597,182616,182617,182632,182633,182638,182639,182659,182660,182667,182668,182689,182690,182707,182708,182714,182715,182718,182719,182722,182723,182726,182727,182730,182731,183321,183323,185769,185770,196608,196628,196629,196630,203128,203130,204271,204272,212471,212473,213523,213525,215765,215766,215940,215944,215992,215993,216008,216009,216249,216253,216504,216505,225065,225066,228601,228602,228651,228652,229376,229385,230230,230234,230302,230303,230333,230334,230470,230474,230482,230483,231871,231875,231910,231911,232052,232058,232059,232060,232064,232065,232182,232186,232187,232188,233589,233593,236359,236360,237092,237093,243531,243532,247753,247754,249281,249282,249946,249950,249966,249967,251540,251544,251569,251570,262144,262147,262405,262406,287551,287552,287577,287578,287781,287782,288259,288260,288499,288500,289238,289239,289818,289819,289996,289997,290972,290974,291446,291447,292088,292089,294912,294915,295020,295021,295958,295963,298181,298183,301517,301518,308875,313772,313847,313848") && 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("system_ext"), "308,1,31,40,44,48,63,64,65,81,87,88,89,148,152,157,158,719,721,778,782,797,798,827,833,834,835,1724,1730,1753,1754,1761,1767,1768,1769,1997,2001,2010,2011,2042,2048,2049,2050,2246,2250,2254,2255,2259,2263,2268,2269,2274,2275,2299,2305,2306,2307,2313,2319,2320,2321,2324,2325,2337,2343,2344,2345,2356,2357,2363,2367,2371,2372,2377,2383,2387,2388,2397,2403,2404,2405,2418,2424,2425,2426,2438,2444,2445,2446,2449,2456,2464,2471,2539,2546,2552,2559,2595,2600,2620,2627,2646,2653,2671,2672,2882,2884,2893,2894,2906,2907,2908,2909,2910,2911,2920,2921,2944,2945,2993,2998,3001,3004,3007,3010,3013,3015,3019,3020,3024,3027,3031,3032,3555,3557,3561,3565,3566,3570,3575,3577,3582,3586,3587,3591,3592,3596,3597,3601,3602,3606,3607,3611,3612,3616,3617,3621,3622,3624,3631,3635,3636,3640,3641,3645,3646,3650,3651,3655,3656,3660,3661,3665,3666,3668,3669,3673,3674,3678,3679,3681,3682,3686,3687,3691,3692,3696,3697,3701,3702,3706,3707,3709,3713,3717,3718,3722,3723,3725,3726,3728,3729,3733,3734,3738,3739,3741,3742,3746,3747,3751,3752,3756,3757,3761,3762,3764,3765,3769,3770,3772,3776,3793,3798,3832,3835,3948,6360,6361,6644,7314,7596,7597,8786,8787,8839,9063,9210,9376,9934,9935,10025,10185,11114,11115,11165,11166,11475,11476,16801,16802,16832,16833,17022,17023,17083,17084,17263,17264,17384,17385,17593,17594,22486,22487,22489,22490,22519,22520,22713,22714,22887,22888,22913,22914,22931,22932,23008,23009,23032,23033,23089,23090,23195,23196,28169,28170,28189,28190,28468,28469,28555,28556,28594,28595,28672,28673,28928,28929,32768,32807,35221,98326,98328,118968,119329,121224,121263,121264") == "c6102cc6e2953b907ea49278b8eb353f4de0c81b" || 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
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "308,1,31,40,44,48,63,64,65,81,87,88,89,148,152,157,158,719,721,778,782,797,798,827,833,834,835,1724,1730,1753,1754,1761,1767,1768,1769,1997,2001,2010,2011,2042,2048,2049,2050,2246,2250,2254,2255,2259,2263,2268,2269,2274,2275,2299,2305,2306,2307,2313,2319,2320,2321,2324,2325,2337,2343,2344,2345,2356,2357,2363,2367,2371,2372,2377,2383,2387,2388,2397,2403,2404,2405,2418,2424,2425,2426,2438,2444,2445,2446,2449,2456,2464,2471,2539,2546,2552,2559,2595,2600,2620,2627,2646,2653,2671,2672,2882,2884,2893,2894,2906,2907,2908,2909,2910,2911,2920,2921,2944,2945,2993,2998,3001,3004,3007,3010,3013,3015,3019,3020,3024,3027,3031,3032,3555,3557,3561,3565,3566,3570,3575,3577,3582,3586,3587,3591,3592,3596,3597,3601,3602,3606,3607,3611,3612,3616,3617,3621,3622,3624,3631,3635,3636,3640,3641,3645,3646,3650,3651,3655,3656,3660,3661,3665,3666,3668,3669,3673,3674,3678,3679,3681,3682,3686,3687,3691,3692,3696,3697,3701,3702,3706,3707,3709,3713,3717,3718,3722,3723,3725,3726,3728,3729,3733,3734,3738,3739,3741,3742,3746,3747,3751,3752,3756,3757,3761,3762,3764,3765,3769,3770,3772,3776,3793,3798,3832,3835,3948,6360,6361,6644,7314,7596,7597,8786,8787,8839,9063,9210,9376,9934,9935,10025,10185,11114,11115,11165,11166,11475,11476,16801,16802,16832,16833,17022,17023,17083,17084,17263,17264,17384,17385,17593,17594,22486,22487,22489,22490,22519,22520,22713,22714,22887,22888,22913,22914,22931,22932,23008,23009,23032,23033,23089,23090,23195,23196,28169,28170,28189,28190,28468,28469,28555,28556,28594,28595,28672,28673,28928,28929,32768,32807,35221,98326,98328,118968,119329,121224,121263,121264") && 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 ----


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

# --- Start patching dynamic partitions ---


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

# 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.600000, 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 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 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/bootdevice/by-name/boot",":100663296:356e2c72c19566e7d021b3e878afb101d0e634d3"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:dfad56da49dd286aa1530d91379c4d05e213f3bf"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:dfad56da49dd286aa1530d91379c4d05e213f3bf")));

# ---- 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");
set_progress(1.000000);
