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:10/QKQ1.200830.002/V12.0.1.0.QJFMIXM:user/release-keys");
ui_print("Target: POCO/citrus_global/citrus:10/QKQ1.200830.002/V12.0.3.0.QJFMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:10/QKQ1.200830.002/V12.0.1.0.QJFMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:10/QKQ1.200830.002/V12.0.3.0.QJFMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/citrus_global/citrus:10/QKQ1.200830.002/V12.0.1.0.QJFMIXM:user/release-keys or POCO/citrus_global/citrus:10/QKQ1.200830.002/V12.0.3.0.QJFMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/boot:100663296:c9f652bdc7a641e752f6e267bc2132eb7a76b16a",
                      "EMMC:/dev/block/bootdevice/by-name/boot:100663296:47fce77d6065887c8d2a550891cdc08fb6b7251b") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:c9f652bdc7a641e752f6e267bc2132eb7a76b16a\" or \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:47fce77d6065887c8d2a550891cdc08fb6b7251b\" has unexpected contents.");
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "54,1,195,223,232,252,253,513,517,529,530,549,550,1861,2292,2298,2299,26205,26206,27573,27574,32768,32770,32929,32949,32982,32983,33197,33199,33362,33375,33383,33387,33392,33393,38270,38271,38283,38287,38291,98306,98465,163842,164001,229378,229537,294914,295073,622607,622612,650290,652304,662641,662781,662782") == "c79400fd2f56c58acc048c4d4ef24592ad2250da" || 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"), "54,1,195,223,232,252,253,513,517,529,530,549,550,1861,2292,2298,2299,26205,26206,27573,27574,32768,32770,32929,32949,32982,32983,33197,33199,33362,33375,33383,33387,33392,33393,38270,38271,38283,38287,38291,98306,98465,163842,164001,229378,229537,294914,295073,622607,622612,650290,652304,662641,662781,662782") && 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"), "154,1,102,112,116,121,122,204,208,213,214,1888,1892,2369,2370,2633,2637,2641,2642,2644,2648,2650,2661,2684,2685,2721,2725,2775,2776,2937,2938,2950,2954,2958,2959,2962,2968,2969,2970,2982,2986,2990,2997,3006,3007,3178,4104,4297,4620,4793,8881,9476,9477,9481,9482,9486,9487,9491,9492,9497,9498,9502,9503,9504,9505,9508,9509,9510,9511,9514,9515,9516,9517,9519,9521,9522,9523,9526,9527,9528,9529,9532,9533,9534,9535,9538,9539,9545,9546,9550,9551,9554,9556,9559,9561,9565,9566,9570,9571,9572,9573,9576,9577,9578,9579,9582,9583,9584,9585,9588,9589,9590,9591,9594,9595,9596,9597,9600,9601,9606,9607,9608,9609,9613,9614,10026,10027,11116,11121,25290,25291,25390,25392,27232,27872,29972,32770,32842,98306,98378,163842,163914,229378,229450,294818,294912,294914,294986,295002,295006,295046,295877,300568,300641,300642") == "94b844d6f21eca1e7798f1f8816295244c9d6297" || 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"), "154,1,102,112,116,121,122,204,208,213,214,1888,1892,2369,2370,2633,2637,2641,2642,2644,2648,2650,2661,2684,2685,2721,2725,2775,2776,2937,2938,2950,2954,2958,2959,2962,2968,2969,2970,2982,2986,2990,2997,3006,3007,3178,4104,4297,4620,4793,8881,9476,9477,9481,9482,9486,9487,9491,9492,9497,9498,9502,9503,9504,9505,9508,9509,9510,9511,9514,9515,9516,9517,9519,9521,9522,9523,9526,9527,9528,9529,9532,9533,9534,9535,9538,9539,9545,9546,9550,9551,9554,9556,9559,9561,9565,9566,9570,9571,9572,9573,9576,9577,9578,9579,9582,9583,9584,9585,9588,9589,9590,9591,9594,9595,9596,9597,9600,9601,9606,9607,9608,9609,9613,9614,10026,10027,11116,11121,25290,25291,25390,25392,27232,27872,29972,32770,32842,98306,98378,163842,163914,229378,229450,294818,294912,294914,294986,295002,295006,295046,295877,300568,300641,300642") && 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"), "368,1,92,5382,5383,5399,5403,5407,5408,9698,9699,9744,9748,9839,11891,11895,11896,11937,11938,11945,11951,11952,11953,12670,12674,12681,12682,12688,12694,12695,12696,15451,15452,18924,18925,21332,21333,21696,21700,22207,22208,22220,22226,22227,22228,24068,24072,25509,25510,32403,32404,32768,32770,32841,32852,32889,32890,40055,40056,48058,48059,49522,49523,60592,60593,62851,62852,63228,63229,63307,63309,65536,65547,66688,66690,74170,74171,74177,74178,74184,74190,74191,74192,74320,74326,74327,74328,74340,74346,74347,74348,74351,74352,74358,74364,74365,74366,74389,74395,74396,74397,75241,75242,88940,88941,88960,88961,90927,90928,98304,98306,98377,98388,104830,104831,105007,105008,105375,105376,106127,106128,112511,112512,117264,117265,119516,119517,119704,119705,119716,119722,119723,119724,119734,119735,119740,119744,119749,119750,119754,119760,119764,119765,119771,119777,119778,119779,119791,119797,119798,119799,119809,119815,119816,119817,119819,119826,119832,119833,121590,121591,121597,121598,121732,121733,122941,122948,123017,123024,123029,123036,123066,123073,123092,123099,123117,123124,123140,123141,123152,123154,123323,123324,123325,123326,123327,123328,123329,123330,123368,123370,123378,123379,123381,123383,123384,123385,123746,123750,123754,123758,123759,123761,123766,123770,123771,123775,123776,123780,123781,123785,123786,123790,123791,123795,123796,123800,123801,123805,123806,123808,123809,123810,123813,123819,123820,123824,123825,123829,123830,123834,123835,123839,123840,123844,123845,123849,123850,123852,123853,123857,123858,123862,123863,123867,123868,123872,123873,123877,123878,123882,123883,123887,123888,123892,123893,123895,123899,123903,123904,123908,123909,123913,123914,123918,123919,123921,123922,123926,123927,123929,123930,123934,123935,123939,123940,123942,123943,123947,123948,123952,123953,123955,123956,123960,123961,123971,123974,124126,124163,124421,125144,125145,128953,128954,131072,131084,135233,135234,139759,139761,139771,139816,146688,146690,152039,152041,155973,155974,160023,160025,161555,161557,161783,161784,163474,163484,163840,163842,163913,163928,167082,167083,171793,171794,171797,171798,172400,172402,172828,172830,175052,175055,178104,178105,182141,182143,182188,182190,182330,182332,183588,183590,184667,184669,185129,185130,186757,186758,187402,187403,191035,191036,193669,193670,196608,196621,198446,198447,198472,198474,198492,229378,229449,290908,291878,296505,296579,296580") == "dce71227486ebbb6174640efcee85b207de5b73a" || 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"), "368,1,92,5382,5383,5399,5403,5407,5408,9698,9699,9744,9748,9839,11891,11895,11896,11937,11938,11945,11951,11952,11953,12670,12674,12681,12682,12688,12694,12695,12696,15451,15452,18924,18925,21332,21333,21696,21700,22207,22208,22220,22226,22227,22228,24068,24072,25509,25510,32403,32404,32768,32770,32841,32852,32889,32890,40055,40056,48058,48059,49522,49523,60592,60593,62851,62852,63228,63229,63307,63309,65536,65547,66688,66690,74170,74171,74177,74178,74184,74190,74191,74192,74320,74326,74327,74328,74340,74346,74347,74348,74351,74352,74358,74364,74365,74366,74389,74395,74396,74397,75241,75242,88940,88941,88960,88961,90927,90928,98304,98306,98377,98388,104830,104831,105007,105008,105375,105376,106127,106128,112511,112512,117264,117265,119516,119517,119704,119705,119716,119722,119723,119724,119734,119735,119740,119744,119749,119750,119754,119760,119764,119765,119771,119777,119778,119779,119791,119797,119798,119799,119809,119815,119816,119817,119819,119826,119832,119833,121590,121591,121597,121598,121732,121733,122941,122948,123017,123024,123029,123036,123066,123073,123092,123099,123117,123124,123140,123141,123152,123154,123323,123324,123325,123326,123327,123328,123329,123330,123368,123370,123378,123379,123381,123383,123384,123385,123746,123750,123754,123758,123759,123761,123766,123770,123771,123775,123776,123780,123781,123785,123786,123790,123791,123795,123796,123800,123801,123805,123806,123808,123809,123810,123813,123819,123820,123824,123825,123829,123830,123834,123835,123839,123840,123844,123845,123849,123850,123852,123853,123857,123858,123862,123863,123867,123868,123872,123873,123877,123878,123882,123883,123887,123888,123892,123893,123895,123899,123903,123904,123908,123909,123913,123914,123918,123919,123921,123922,123926,123927,123929,123930,123934,123935,123939,123940,123942,123943,123947,123948,123952,123953,123955,123956,123960,123961,123971,123974,124126,124163,124421,125144,125145,128953,128954,131072,131084,135233,135234,139759,139761,139771,139816,146688,146690,152039,152041,155973,155974,160023,160025,161555,161557,161783,161784,163474,163484,163840,163842,163913,163928,167082,167083,171793,171794,171797,171798,172400,172402,172828,172830,175052,175055,178104,178105,182141,182143,182188,182190,182330,182332,183588,183590,184667,184669,185129,185130,186757,186758,187402,187403,191035,191036,193669,193670,196608,196621,198446,198447,198472,198474,198492,229378,229449,290908,291878,296505,296579,296580") && 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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:100663296:c9f652bdc7a641e752f6e267bc2132eb7a76b16a",
                "EMMC:/dev/block/bootdevice/by-name/boot:100663296:47fce77d6065887c8d2a550891cdc08fb6b7251b",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:100663296:47fce77d6065887c8d2a550891cdc08fb6b7251b");

# ---- 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/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefv");
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/dspso.bin", "/dev/block/bootdevice/by-name/dsp");
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/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/imagefv.elf", "/dev/block/bootdevice/by-name/imagefvbak");
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");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Update dynamic partition metadata

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

# Patch partition product

ui_print("Patching product image after verification.");
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 vendor

ui_print("Patching vendor image after verification.");
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 system

ui_print("Patching system image after verification.");
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.");

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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