getprop("ro.product.device") == "tucana" || abort("E3004: This package is for \"tucana\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/tucana/tucana:11/RKQ1.200826.002/V12.5.5.0.RFDMIXM:user/release-keys");
ui_print("Target: Xiaomi/tucana/tucana:11/RKQ1.200826.002/V12.5.6.0.RFDMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/tucana/tucana:11/RKQ1.200826.002/V12.5.5.0.RFDMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/tucana/tucana:11/RKQ1.200826.002/V12.5.6.0.RFDMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/tucana/tucana:11/RKQ1.200826.002/V12.5.5.0.RFDMIXM:user/release-keys or Xiaomi/tucana/tucana:11/RKQ1.200826.002/V12.5.6.0.RFDMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:994e02614dd5a7a7b18dbdaa11fefa0ca7a62dea"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c7f50488b05753102239a1c9afc0949f3864cddc")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:994e02614dd5a7a7b18dbdaa11fefa0ca7a62dea"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c7f50488b05753102239a1c9afc0949f3864cddc"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1("/dev/block/bootdevice/by-name/system", "290,1,416,508,522,533,536,537,546,548,553,555,556,932,933,934,935,1124,1125,1453,1454,1456,1457,2011,2012,2015,2016,2316,2317,3705,3706,7758,7759,13783,13784,22103,22104,22106,22107,22111,22112,22113,22114,22222,22223,22276,22277,22349,22350,22352,22354,23505,23506,23508,23510,29654,29655,29657,29659,29660,29661,29783,29784,29786,29788,29791,29792,29895,29897,30135,30212,30579,30580,30582,30583,30587,30588,30597,30598,30601,30602,32768,32771,33837,33867,34062,34098,35693,35694,35696,35698,35699,35700,35711,36613,36615,36616,37246,37247,38111,38112,38114,38115,38368,38369,38370,38371,38401,38402,38452,38453,38526,38527,38529,38530,38535,38537,40725,40726,40728,40729,40948,40949,40951,40952,41569,41571,41916,41918,42365,42366,42368,42369,42433,42434,42435,42436,42437,42438,42440,42441,42455,42457,42633,42634,42636,42638,42697,42698,42833,42834,42836,42837,42842,42843,44634,44646,46413,46414,46842,46860,46965,46971,49664,49675,49752,49753,51023,51024,51553,51646,54572,54573,57068,57085,59552,59553,60155,60181,60330,60339,64157,64172,64282,64283,65536,65537,66558,66559,67295,67431,71497,71498,71500,71502,71556,71559,71565,71566,72650,72652,72780,72782,72842,72874,72886,72887,74322,74325,74331,74332,74337,74338,76914,76915,77075,77076,77107,77108,77351,77352,77472,98307,98812,131073,131578,163843,164348,196609,197114,229379,229884,236454,236455,262145,262650,294915,295420,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,649204,655360,655361,657513,657514,658738,688129,688634,720897,721402,753665,754170,786433,786938,819203,819708,851969,852474,884739,885244,917505,918010,950273,950778,983041,983546,1013552,1146880,1146881,1161015,1179411,1179647,1179648") == "4ec455f46a4f3180b90ad815ec12060ab99dabb5" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "290,1,416,508,522,533,536,537,546,548,553,555,556,932,933,934,935,1124,1125,1453,1454,1456,1457,2011,2012,2015,2016,2316,2317,3705,3706,7758,7759,13783,13784,22103,22104,22106,22107,22111,22112,22113,22114,22222,22223,22276,22277,22349,22350,22352,22354,23505,23506,23508,23510,29654,29655,29657,29659,29660,29661,29783,29784,29786,29788,29791,29792,29895,29897,30135,30212,30579,30580,30582,30583,30587,30588,30597,30598,30601,30602,32768,32771,33837,33867,34062,34098,35693,35694,35696,35698,35699,35700,35711,36613,36615,36616,37246,37247,38111,38112,38114,38115,38368,38369,38370,38371,38401,38402,38452,38453,38526,38527,38529,38530,38535,38537,40725,40726,40728,40729,40948,40949,40951,40952,41569,41571,41916,41918,42365,42366,42368,42369,42433,42434,42435,42436,42437,42438,42440,42441,42455,42457,42633,42634,42636,42638,42697,42698,42833,42834,42836,42837,42842,42843,44634,44646,46413,46414,46842,46860,46965,46971,49664,49675,49752,49753,51023,51024,51553,51646,54572,54573,57068,57085,59552,59553,60155,60181,60330,60339,64157,64172,64282,64283,65536,65537,66558,66559,67295,67431,71497,71498,71500,71502,71556,71559,71565,71566,72650,72652,72780,72782,72842,72874,72886,72887,74322,74325,74331,74332,74337,74338,76914,76915,77075,77076,77107,77108,77351,77352,77472,98307,98812,131073,131578,163843,164348,196609,197114,229379,229884,236454,236455,262145,262650,294915,295420,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,649204,655360,655361,657513,657514,658738,688129,688634,720897,721402,753665,754170,786433,786938,819203,819708,851969,852474,884739,885244,917505,918010,950273,950778,983041,983546,1013552,1146880,1146881,1161015,1179411,1179647,1179648") && block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/vendor", "354,1,197,508,515,525,526,604,609,2283,2284,2346,2347,2349,2353,2355,2356,2595,2596,2756,2757,2760,2761,2764,2765,2774,2775,3439,3490,3592,3593,3765,3771,6018,6019,14612,14613,14625,14626,15549,15550,16184,16185,17168,17176,19429,19430,32768,32771,47781,47783,51549,51550,58174,58175,65536,65537,66090,66091,69768,69769,75941,75942,89001,89002,98304,98307,98881,98882,105849,105850,113888,113889,115708,115709,124072,124073,125303,125305,125333,125335,125785,125786,125870,125871,131072,131073,159237,159238,163840,163843,167949,167950,167954,167956,167974,167975,168020,168021,168039,168040,168042,168043,168093,168094,168097,168098,168164,168165,168171,168172,168197,168198,168233,168234,168339,168340,168392,168393,169217,169218,169231,169232,172488,172489,177941,177942,177953,177954,178632,178634,178682,178683,178797,178798,185143,185144,188194,188195,188196,188197,188244,188245,188668,188669,188725,188726,189028,189030,189031,189037,189083,189085,189090,189100,189115,189116,189118,189122,189142,189143,189284,189285,190167,190168,190399,190400,195303,195304,196608,196609,200629,200630,201902,201903,203175,203176,204678,204679,206383,206384,211771,211772,217051,217052,222340,222341,227516,227517,228173,228174,228839,228840,229376,229379,230225,230226,231006,231007,234528,234529,235609,235610,236273,236457,236467,238248,239969,239979,244956,244965,246239,246240,251935,251939,262144,262145,265050,265051,270482,270483,270545,270578,272273,272274,272290,272291,272809,275398,275404,278590,278647,278649,281469,281470,283740,283742,286479,286480,286797,286798,286883,286884,287101,287102,287990,287991,288222,288223,293126,293127,294912,294915,298454,298455,299727,299728,301000,301001,302503,302504,304208,304209,309596,309597,314876,314877,320165,320166,325341,325342,325998,325999,326664,326665,327542,327543,327680,327681,328829,328830,332685,332686,333945,333946,335487,335488,336420,336604,336619,338235,341168,341182,349218,349231,351760,351761,360448,360449,365707,365708,393216,393217,404388,404389,423404,423410,424366,424367,425984,425985,439644,439645,458752,458753,466881,466882,470949,470950,472575,472576,472598,472599,473419,473421,473626,473627,478416,478418,482184,482185,483651,483653,483654,483655,483663,483664,483665,483666,483697,483704,483706,486157,486169,486171,486195,486196,486227,490681,491520,491521,515995,524173,524287,524288") == "aa0a902f4afd54de222bce3bc4d03e0fafb8b3f3" || block_image_verify("/dev/block/bootdevice/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/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "354,1,197,508,515,525,526,604,609,2283,2284,2346,2347,2349,2353,2355,2356,2595,2596,2756,2757,2760,2761,2764,2765,2774,2775,3439,3490,3592,3593,3765,3771,6018,6019,14612,14613,14625,14626,15549,15550,16184,16185,17168,17176,19429,19430,32768,32771,47781,47783,51549,51550,58174,58175,65536,65537,66090,66091,69768,69769,75941,75942,89001,89002,98304,98307,98881,98882,105849,105850,113888,113889,115708,115709,124072,124073,125303,125305,125333,125335,125785,125786,125870,125871,131072,131073,159237,159238,163840,163843,167949,167950,167954,167956,167974,167975,168020,168021,168039,168040,168042,168043,168093,168094,168097,168098,168164,168165,168171,168172,168197,168198,168233,168234,168339,168340,168392,168393,169217,169218,169231,169232,172488,172489,177941,177942,177953,177954,178632,178634,178682,178683,178797,178798,185143,185144,188194,188195,188196,188197,188244,188245,188668,188669,188725,188726,189028,189030,189031,189037,189083,189085,189090,189100,189115,189116,189118,189122,189142,189143,189284,189285,190167,190168,190399,190400,195303,195304,196608,196609,200629,200630,201902,201903,203175,203176,204678,204679,206383,206384,211771,211772,217051,217052,222340,222341,227516,227517,228173,228174,228839,228840,229376,229379,230225,230226,231006,231007,234528,234529,235609,235610,236273,236457,236467,238248,239969,239979,244956,244965,246239,246240,251935,251939,262144,262145,265050,265051,270482,270483,270545,270578,272273,272274,272290,272291,272809,275398,275404,278590,278647,278649,281469,281470,283740,283742,286479,286480,286797,286798,286883,286884,287101,287102,287990,287991,288222,288223,293126,293127,294912,294915,298454,298455,299727,299728,301000,301001,302503,302504,304208,304209,309596,309597,314876,314877,320165,320166,325341,325342,325998,325999,326664,326665,327542,327543,327680,327681,328829,328830,332685,332686,333945,333946,335487,335488,336420,336604,336619,338235,341168,341182,349218,349231,351760,351761,360448,360449,365707,365708,393216,393217,404388,404389,423404,423410,424366,424367,425984,425985,439644,439645,458752,458753,466881,466882,470949,470950,472575,472576,472598,472599,473419,473421,473626,473627,478416,478418,482184,482185,483651,483653,483654,483655,483663,483664,483665,483666,483697,483704,483706,486157,486169,486171,486195,486196,486227,490681,491520,491521,515995,524173,524287,524288") && block_image_verify("/dev/block/bootdevice/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;

# ---- 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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
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/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/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
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/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
ui_print("Patching system image after verification.");
show_progress(0.800000, 0);
block_image_update("/dev/block/bootdevice/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/bootdevice/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 boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:994e02614dd5a7a7b18dbdaa11fefa0ca7a62dea"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c7f50488b05753102239a1c9afc0949f3864cddc"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:c7f50488b05753102239a1c9afc0949f3864cddc")));

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