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_eea/citrus:10/QKQ1.200830.002/V12.0.4.0.QJFEUXM:user/release-keys");
ui_print("Target: POCO/citrus_eea/citrus:10/QKQ1.200830.002/V12.0.5.0.QJFEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/citrus_eea/citrus:10/QKQ1.200830.002/V12.0.4.0.QJFEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/citrus_eea/citrus:10/QKQ1.200830.002/V12.0.5.0.QJFEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/citrus_eea/citrus:10/QKQ1.200830.002/V12.0.4.0.QJFEUXM:user/release-keys or POCO/citrus_eea/citrus:10/QKQ1.200830.002/V12.0.5.0.QJFEUXM: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:1a0893c562cb425f0ab4a59e5665f5bf204c8a17",
                      "EMMC:/dev/block/bootdevice/by-name/boot:100663296:a408ec6dfcd801058d707a30c87657f34c6c3088") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:1a0893c562cb425f0ab4a59e5665f5bf204c8a17\" or \"EMMC:/dev/block/bootdevice/by-name/boot:100663296:a408ec6dfcd801058d707a30c87657f34c6c3088\" 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"), "404,1,200,228,237,257,258,518,522,534,535,554,555,1866,2297,2303,2304,26210,26211,27578,27579,32768,32770,32935,32954,32992,32993,33207,33209,33372,33376,33384,33385,33393,33397,33402,38281,38293,38297,38301,39616,39618,39619,39620,39621,39631,39641,39647,39653,39654,39655,39660,39666,39667,39668,39788,39794,39800,39801,41600,41601,41652,41653,41739,41740,41840,41841,41908,41909,42293,42297,42336,42337,43301,43302,43952,43954,45885,45887,45895,45896,45918,45919,45923,45924,46357,46358,46389,46395,46396,46397,46496,46502,46503,49329,49343,49349,49350,49351,49353,49354,52602,52606,52651,52652,53022,53026,53034,53035,53122,53128,53133,53134,53780,53781,53883,53898,53903,53906,53907,53943,54229,54230,54246,54247,54378,54379,54381,54382,54384,54385,61676,61680,61705,61706,61835,61839,61845,61846,62324,62328,62344,62345,65536,65555,67004,67008,67102,67103,67108,67114,67115,67116,67154,67160,67161,67162,67849,67853,67875,67876,68124,68125,68158,68164,68165,69140,69141,69142,70904,70908,70951,70952,70956,70962,70963,70964,70986,70990,71014,71015,72707,72711,72735,72736,73582,73586,73609,73610,73693,73697,73702,73703,77010,77012,80798,80799,82368,82372,84534,84535,84867,84869,84870,84871,84903,84907,84923,84924,84929,84930,85380,85384,85787,85788,86471,86475,86490,86491,88876,88880,88927,88928,89339,89343,89356,89357,91423,91424,96959,96963,97046,98306,98471,163842,164007,181614,181629,181638,181659,181660,181666,181667,181675,181676,181680,181709,181746,181752,181753,184872,184942,184946,184950,184951,185054,185058,185063,185064,186280,186284,186310,186311,191870,191946,191968,191969,193904,193908,194041,194042,194050,194056,194057,194058,194684,194688,194703,194704,196192,196196,196211,196212,196608,196627,198558,198562,198588,198589,199479,199483,199509,199510,199514,199520,199521,199522,199544,199550,199551,199552,199556,199560,199563,199564,199568,199569,199584,199590,199591,199592,200575,200579,202326,202327,202351,202357,202358,229378,229543,294914,295079,497098,502416,502418,502494,503547,503605,503607,503944,503946,504658,504660,507434,507436,507509,507513,507527,507531,507909,507911,507929,507931,507934,507935,509688,509689,510014,510016,517646,517648,517700,517704,518172,518174,519655,519657,519772,519774,519838,519840,519841,519842,519851,519855,520832,520833,521660,521662,521802,521804,524288,524313,524314,524315,542739,542741,542748,542752,543752,543753,543759,543760,543765,543766,545719,545720,549428,549430,553744,553746,557056,557125,558660,558661,560078,560080,560652,655377,655379,675974,678064,688810,688956,688957") == "ff6f9b5690d5054f036bfc21d24e5d32a67bb823" || 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"), "404,1,200,228,237,257,258,518,522,534,535,554,555,1866,2297,2303,2304,26210,26211,27578,27579,32768,32770,32935,32954,32992,32993,33207,33209,33372,33376,33384,33385,33393,33397,33402,38281,38293,38297,38301,39616,39618,39619,39620,39621,39631,39641,39647,39653,39654,39655,39660,39666,39667,39668,39788,39794,39800,39801,41600,41601,41652,41653,41739,41740,41840,41841,41908,41909,42293,42297,42336,42337,43301,43302,43952,43954,45885,45887,45895,45896,45918,45919,45923,45924,46357,46358,46389,46395,46396,46397,46496,46502,46503,49329,49343,49349,49350,49351,49353,49354,52602,52606,52651,52652,53022,53026,53034,53035,53122,53128,53133,53134,53780,53781,53883,53898,53903,53906,53907,53943,54229,54230,54246,54247,54378,54379,54381,54382,54384,54385,61676,61680,61705,61706,61835,61839,61845,61846,62324,62328,62344,62345,65536,65555,67004,67008,67102,67103,67108,67114,67115,67116,67154,67160,67161,67162,67849,67853,67875,67876,68124,68125,68158,68164,68165,69140,69141,69142,70904,70908,70951,70952,70956,70962,70963,70964,70986,70990,71014,71015,72707,72711,72735,72736,73582,73586,73609,73610,73693,73697,73702,73703,77010,77012,80798,80799,82368,82372,84534,84535,84867,84869,84870,84871,84903,84907,84923,84924,84929,84930,85380,85384,85787,85788,86471,86475,86490,86491,88876,88880,88927,88928,89339,89343,89356,89357,91423,91424,96959,96963,97046,98306,98471,163842,164007,181614,181629,181638,181659,181660,181666,181667,181675,181676,181680,181709,181746,181752,181753,184872,184942,184946,184950,184951,185054,185058,185063,185064,186280,186284,186310,186311,191870,191946,191968,191969,193904,193908,194041,194042,194050,194056,194057,194058,194684,194688,194703,194704,196192,196196,196211,196212,196608,196627,198558,198562,198588,198589,199479,199483,199509,199510,199514,199520,199521,199522,199544,199550,199551,199552,199556,199560,199563,199564,199568,199569,199584,199590,199591,199592,200575,200579,202326,202327,202351,202357,202358,229378,229543,294914,295079,497098,502416,502418,502494,503547,503605,503607,503944,503946,504658,504660,507434,507436,507509,507513,507527,507531,507909,507911,507929,507931,507934,507935,509688,509689,510014,510016,517646,517648,517700,517704,518172,518174,519655,519657,519772,519774,519838,519840,519841,519842,519851,519855,520832,520833,521660,521662,521802,521804,524288,524313,524314,524315,542739,542741,542748,542752,543752,543753,543759,543760,543765,543766,545719,545720,549428,549430,553744,553746,557056,557125,558660,558661,560078,560080,560652,655377,655379,675974,678064,688810,688956,688957") && 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"), "68,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,3035,3041,3178,4104,4297,4620,4793,32770,32842,98306,98378,163842,163914,229378,229450,294914,294986,295003,295006,297125,298063,302789,302863,302864") == "fe7a63d3818070886b22f54dce8ea3405785136e" || 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"), "68,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,3035,3041,3178,4104,4297,4620,4793,32770,32842,98306,98378,163842,163914,229378,229450,294914,294986,295003,295006,297125,298063,302789,302863,302864") && 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"), "374,1,93,5383,5384,5400,5404,5408,5409,9699,9700,9745,9749,11224,11225,11889,11892,11896,11897,11938,11939,11946,11952,11953,11954,12671,12675,12682,12683,12689,12695,12696,12697,15452,15453,18925,18926,21333,21334,21697,21701,22208,22209,22221,22227,22228,22229,24069,24073,25510,25511,32404,32405,32768,32770,32841,32853,32891,32892,40057,40058,48060,48061,49524,49525,60594,60595,62853,62854,63230,63231,63309,63311,65536,65548,66691,66693,74173,74174,74180,74181,74187,74193,74194,74195,74323,74329,74330,74331,74343,74349,74350,74351,74354,74355,74361,74367,74368,74369,74392,74398,74399,74400,75244,75245,88943,88944,88963,88964,90930,90931,98304,98306,98377,98389,104834,104835,105011,105012,105379,105380,106131,106132,112515,112516,117268,117269,119520,119521,119708,119709,119720,119726,119727,119728,119738,119739,119744,119748,119753,119754,119758,119764,119768,119769,119775,119781,119782,119783,119795,119801,119802,119803,119813,119819,119820,119821,119823,119830,119836,119837,121594,121595,121601,121602,121736,121737,122945,122952,123021,123028,123033,123040,123070,123077,123096,123103,123121,123128,123144,123145,123156,123158,123328,123329,123330,123331,123332,123333,123334,123335,123373,123375,123383,123384,123387,123389,123390,123391,123752,123756,123760,123764,123765,123767,123772,123776,123777,123781,123782,123786,123787,123791,123792,123796,123797,123801,123802,123806,123807,123811,123812,123814,123821,123825,123826,123830,123831,123835,123836,123840,123841,123845,123846,123850,123851,123855,123856,123858,123859,123863,123864,123868,123869,123873,123874,123878,123879,123883,123884,123888,123889,123893,123894,123898,123899,123901,123905,123909,123910,123914,123915,123919,123920,123924,123925,123927,123928,123932,123933,123935,123936,123940,123941,123945,123946,123948,123949,123953,123954,123958,123959,123961,123962,123966,123967,123977,123980,124132,125150,125151,128959,128960,130164,130165,131072,131084,135240,135241,136863,136866,139769,139771,139822,139826,146698,146700,152049,152051,155983,155984,160033,160035,161565,161567,161793,161794,163484,163494,163840,163842,163913,163927,167091,167092,171802,171803,171806,171807,172409,172411,172837,172839,175061,175064,178113,178114,182150,182152,182197,182199,182339,182341,183597,183599,184676,184678,185138,185139,186766,186767,187411,187412,191044,191045,193678,193679,196608,196673,198507,198508,198533,198535,198943,198945,198959,229378,229449,262148,262156,291372,292334,296968,297042,297043") == "736c5e4ac3ce5a828420e71a3cb07b65b3ba56f3" || 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"), "374,1,93,5383,5384,5400,5404,5408,5409,9699,9700,9745,9749,11224,11225,11889,11892,11896,11897,11938,11939,11946,11952,11953,11954,12671,12675,12682,12683,12689,12695,12696,12697,15452,15453,18925,18926,21333,21334,21697,21701,22208,22209,22221,22227,22228,22229,24069,24073,25510,25511,32404,32405,32768,32770,32841,32853,32891,32892,40057,40058,48060,48061,49524,49525,60594,60595,62853,62854,63230,63231,63309,63311,65536,65548,66691,66693,74173,74174,74180,74181,74187,74193,74194,74195,74323,74329,74330,74331,74343,74349,74350,74351,74354,74355,74361,74367,74368,74369,74392,74398,74399,74400,75244,75245,88943,88944,88963,88964,90930,90931,98304,98306,98377,98389,104834,104835,105011,105012,105379,105380,106131,106132,112515,112516,117268,117269,119520,119521,119708,119709,119720,119726,119727,119728,119738,119739,119744,119748,119753,119754,119758,119764,119768,119769,119775,119781,119782,119783,119795,119801,119802,119803,119813,119819,119820,119821,119823,119830,119836,119837,121594,121595,121601,121602,121736,121737,122945,122952,123021,123028,123033,123040,123070,123077,123096,123103,123121,123128,123144,123145,123156,123158,123328,123329,123330,123331,123332,123333,123334,123335,123373,123375,123383,123384,123387,123389,123390,123391,123752,123756,123760,123764,123765,123767,123772,123776,123777,123781,123782,123786,123787,123791,123792,123796,123797,123801,123802,123806,123807,123811,123812,123814,123821,123825,123826,123830,123831,123835,123836,123840,123841,123845,123846,123850,123851,123855,123856,123858,123859,123863,123864,123868,123869,123873,123874,123878,123879,123883,123884,123888,123889,123893,123894,123898,123899,123901,123905,123909,123910,123914,123915,123919,123920,123924,123925,123927,123928,123932,123933,123935,123936,123940,123941,123945,123946,123948,123949,123953,123954,123958,123959,123961,123962,123966,123967,123977,123980,124132,125150,125151,128959,128960,130164,130165,131072,131084,135240,135241,136863,136866,139769,139771,139822,139826,146698,146700,152049,152051,155983,155984,160033,160035,161565,161567,161793,161794,163484,163494,163840,163842,163913,163927,167091,167092,171802,171803,171806,171807,172409,172411,172837,172839,175061,175064,178113,178114,182150,182152,182197,182199,182339,182341,183597,183599,184676,184678,185138,185139,186766,186767,187411,187412,191044,191045,193678,193679,196608,196673,198507,198508,198533,198535,198943,198945,198959,229378,229449,262148,262156,291372,292334,296968,297042,297043") && 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:1a0893c562cb425f0ab4a59e5665f5bf204c8a17",
                "EMMC:/dev/block/bootdevice/by-name/boot:100663296:a408ec6dfcd801058d707a30c87657f34c6c3088",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:100663296:a408ec6dfcd801058d707a30c87657f34c6c3088");

# ---- 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 ---


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

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