getprop("ro.product.device") == "davinci" || abort("E3004: This package is for \"davinci\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/davinci/davinci:10/QKQ1.190825.002/V12.0.8.0.QFJMIXM:user/release-keys");
ui_print("Target: Xiaomi/davinci/davinci:10/QKQ1.190825.002/V12.0.9.0.QFJMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/davinci/davinci:10/QKQ1.190825.002/V12.0.8.0.QFJMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/davinci/davinci:10/QKQ1.190825.002/V12.0.9.0.QFJMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/davinci/davinci:10/QKQ1.190825.002/V12.0.8.0.QFJMIXM:user/release-keys or Xiaomi/davinci/davinci:10/QKQ1.190825.002/V12.0.9.0.QFJMIXM: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:134217728:243c9b5d6238e1b71672b82109aae56619f6ee80",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:792bc9ce0119df2f6ba2dd837520507da8bd47f7") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:243c9b5d6238e1b71672b82109aae56619f6ee80\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:792bc9ce0119df2f6ba2dd837520507da8bd47f7\" has unexpected contents.");
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "454,1,575,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,3694,3695,3697,3698,3702,3703,3711,3712,3713,3714,9071,9072,9074,9075,9479,9480,9482,9483,10480,10482,16421,16422,16555,16556,19325,19327,25658,25660,32768,32770,32990,32991,34827,34828,34830,34832,34891,34892,35025,35027,35080,35081,35087,35088,35298,35299,35311,35312,35932,35935,35941,35942,35947,35948,36067,36070,37684,37685,39896,39897,39928,39929,40074,40075,40174,41590,43403,43418,43423,43424,43426,43427,45891,45892,46262,46263,46317,46320,46407,46408,46599,46600,49285,49286,49289,49290,49599,49600,49848,49849,50297,50298,51204,51205,51209,51210,51232,51233,52458,52459,52863,52864,52900,52901,56208,56210,59996,59997,60184,60185,61487,61488,61626,61627,61659,61660,62110,62111,62794,62795,64148,64149,64325,64326,65508,65509,65536,65537,68500,68501,68986,68987,73290,73291,76020,76021,77200,77201,77273,77274,77293,77296,80602,80603,83226,83227,84017,84018,84165,84166,84825,84826,84838,84839,84843,84844,85054,85057,85067,85068,90665,90666,92314,92315,92366,92367,92370,92373,92378,92379,94236,94237,94321,94322,94324,94325,94346,94347,95284,95287,95687,95690,95856,95857,95897,95898,97883,97884,97934,97935,98285,98286,98304,98306,98526,98527,99035,99036,99108,99109,99725,99726,103878,103879,103884,103885,104281,104282,105767,105768,107312,107313,107761,107762,107766,107767,107775,107776,107780,107781,107792,107793,107816,107817,109771,109772,109910,109911,110190,110193,110196,110197,111115,111116,111686,111687,115935,115938,118229,118230,118579,118580,121209,121210,121222,121223,121558,121559,123139,123148,123464,123465,123898,123899,125637,125638,128145,128150,128156,128157,128476,128477,128790,128791,128803,128804,128813,128816,128817,128818,128819,128820,128822,128823,128824,128825,128871,128872,128878,128879,128966,128969,128971,128972,128974,128975,128998,128999,129049,129055,129068,129069,129072,129077,129078,129079,129080,129081,129082,129083,130013,130014,130021,130022,130575,130577,131072,131073,131636,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131652,131653,131654,131657,132514,132516,132517,132518,132601,132602,132604,132605,132608,132610,132868,132869,132876,132878,133365,133367,133475,133476,133506,133507,133518,133519,133785,133786,133899,133900,133916,133918,133920,133921,142855,142856,150792,150793,152733,152734,153011,153100,154286,154539,155861,163842,164062,164063,164568,196609,197114,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,854333,884736,884738,884958,884959,903007,917316,917503,917504") == "02e5a418a3c098c95e070c460f89697d8edebb3c" || 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", "454,1,575,728,742,775,782,784,785,1031,1036,1038,1039,1145,1146,1631,1632,2320,2321,2323,2325,2326,2327,2342,2343,2524,2525,3694,3695,3697,3698,3702,3703,3711,3712,3713,3714,9071,9072,9074,9075,9479,9480,9482,9483,10480,10482,16421,16422,16555,16556,19325,19327,25658,25660,32768,32770,32990,32991,34827,34828,34830,34832,34891,34892,35025,35027,35080,35081,35087,35088,35298,35299,35311,35312,35932,35935,35941,35942,35947,35948,36067,36070,37684,37685,39896,39897,39928,39929,40074,40075,40174,41590,43403,43418,43423,43424,43426,43427,45891,45892,46262,46263,46317,46320,46407,46408,46599,46600,49285,49286,49289,49290,49599,49600,49848,49849,50297,50298,51204,51205,51209,51210,51232,51233,52458,52459,52863,52864,52900,52901,56208,56210,59996,59997,60184,60185,61487,61488,61626,61627,61659,61660,62110,62111,62794,62795,64148,64149,64325,64326,65508,65509,65536,65537,68500,68501,68986,68987,73290,73291,76020,76021,77200,77201,77273,77274,77293,77296,80602,80603,83226,83227,84017,84018,84165,84166,84825,84826,84838,84839,84843,84844,85054,85057,85067,85068,90665,90666,92314,92315,92366,92367,92370,92373,92378,92379,94236,94237,94321,94322,94324,94325,94346,94347,95284,95287,95687,95690,95856,95857,95897,95898,97883,97884,97934,97935,98285,98286,98304,98306,98526,98527,99035,99036,99108,99109,99725,99726,103878,103879,103884,103885,104281,104282,105767,105768,107312,107313,107761,107762,107766,107767,107775,107776,107780,107781,107792,107793,107816,107817,109771,109772,109910,109911,110190,110193,110196,110197,111115,111116,111686,111687,115935,115938,118229,118230,118579,118580,121209,121210,121222,121223,121558,121559,123139,123148,123464,123465,123898,123899,125637,125638,128145,128150,128156,128157,128476,128477,128790,128791,128803,128804,128813,128816,128817,128818,128819,128820,128822,128823,128824,128825,128871,128872,128878,128879,128966,128969,128971,128972,128974,128975,128998,128999,129049,129055,129068,129069,129072,129077,129078,129079,129080,129081,129082,129083,130013,130014,130021,130022,130575,130577,131072,131073,131636,131638,131639,131640,131641,131642,131643,131644,131645,131646,131647,131648,131649,131650,131652,131653,131654,131657,132514,132516,132517,132518,132601,132602,132604,132605,132608,132610,132868,132869,132876,132878,133365,133367,133475,133476,133506,133507,133518,133519,133785,133786,133899,133900,133916,133918,133920,133921,142855,142856,150792,150793,152733,152734,153011,153100,154286,154539,155861,163842,164062,164063,164568,196609,197114,229378,229598,229599,230104,262145,262650,294914,295134,295135,295640,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,720897,721402,753665,754170,786433,786938,819202,819422,819423,819928,851969,852474,854333,884736,884738,884958,884959,903007,917316,917503,917504") && 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", "172,1,271,602,610,620,621,702,703,2409,2410,2474,2475,2477,2488,2726,2727,2732,2733,2735,2736,3244,3245,3253,3254,3801,4106,4183,4184,4236,4276,14567,14568,14686,14687,14803,14855,15060,15112,15455,15456,16088,16089,17065,17071,19324,19325,20974,20975,22246,22247,32768,32770,32864,32865,44059,44061,47140,47141,65536,65537,66043,66044,66495,66496,71489,71490,84022,84023,93300,93301,94323,94325,94342,94344,94823,94824,94899,94900,98304,98306,98400,98401,115479,115482,115500,115501,115546,115547,115565,115566,115568,115569,115655,115656,115662,115663,115688,115689,115724,115725,115917,115918,116174,116175,116188,116189,120418,120419,124946,124948,131072,131073,131590,131591,131593,131594,132150,132152,138534,138535,138537,138538,141566,141567,141568,141569,141591,141592,142017,142018,142074,142075,142423,142425,142426,142432,142751,142753,142758,142768,142777,142778,142780,142784,142933,142962,143401,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,360449,360954,373594,386991,393125,393215,393216") == "705ef69259cb6ad16ba0ba34c2ba32d130a2de6a" || 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", "172,1,271,602,610,620,621,702,703,2409,2410,2474,2475,2477,2488,2726,2727,2732,2733,2735,2736,3244,3245,3253,3254,3801,4106,4183,4184,4236,4276,14567,14568,14686,14687,14803,14855,15060,15112,15455,15456,16088,16089,17065,17071,19324,19325,20974,20975,22246,22247,32768,32770,32864,32865,44059,44061,47140,47141,65536,65537,66043,66044,66495,66496,71489,71490,84022,84023,93300,93301,94323,94325,94342,94344,94823,94824,94899,94900,98304,98306,98400,98401,115479,115482,115500,115501,115546,115547,115565,115566,115568,115569,115655,115656,115662,115663,115688,115689,115724,115725,115917,115918,116174,116175,116188,116189,120418,120419,124946,124948,131072,131073,131590,131591,131593,131594,132150,132152,138534,138535,138537,138538,141566,141567,141568,141569,141591,141592,142017,142018,142074,142075,142423,142425,142426,142432,142751,142753,142758,142768,142777,142778,142780,142784,142933,142962,143401,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,360449,360954,373594,386991,393125,393215,393216") && 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 ----

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:134217728:243c9b5d6238e1b71672b82109aae56619f6ee80",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:792bc9ce0119df2f6ba2dd837520507da8bd47f7",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:792bc9ce0119df2f6ba2dd837520507da8bd47f7");

# ---- 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/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/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/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/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/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/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
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.");
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.");
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");
