getprop("ro.product.device") == "olive" || abort("E3004: This package is for \"olive\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/olive/olive:10/QKQ1.191014.001/V12.5.1.0.QCNINXM:user/release-keys");
ui_print("Target: Xiaomi/olive/olive:10/QKQ1.191014.001/V12.5.2.0.QCNINXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/olive/olive:10/QKQ1.191014.001/V12.5.1.0.QCNINXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/olive/olive:10/QKQ1.191014.001/V12.5.2.0.QCNINXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/olive/olive:10/QKQ1.191014.001/V12.5.1.0.QCNINXM:user/release-keys or Xiaomi/olive/olive:10/QKQ1.191014.001/V12.5.2.0.QCNINXM: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:67108864:b85ccf0bcab1de581b2b88bdf52c46068991909a",
                      "EMMC:/dev/block/bootdevice/by-name/boot:67108864:b1c3c23dea7ac3333a0f9b4c60b2dd990ca58ca2") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:b85ccf0bcab1de581b2b88bdf52c46068991909a\" or \"EMMC:/dev/block/bootdevice/by-name/boot:67108864:b1c3c23dea7ac3333a0f9b4c60b2dd990ca58ca2\" has unexpected contents.");
apply_patch_space(145973248) || 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", "576,1,731,791,805,816,819,836,843,863,864,1124,1129,1131,1132,1238,1239,1719,1720,2408,2409,2411,2413,2414,2415,2430,2431,2612,2613,3499,3671,3782,3783,3785,3786,3790,3791,3799,3800,3801,3802,5893,6117,7819,7991,9128,9129,9131,9132,9536,9537,9539,9540,10533,10535,16474,16475,16608,16609,19378,19380,25946,25948,32768,32770,33053,33054,35580,35581,35583,35585,35644,35645,35778,35942,35952,35963,35970,35995,36001,40891,40897,42170,42204,42213,42219,42227,42233,42355,42362,45097,45140,50750,50756,50858,50864,55206,55247,55263,55269,59476,59528,59901,59911,59993,60000,60203,60211,65537,66042,69078,69086,69492,69509,75362,75487,75495,75501,79426,79433,79903,79921,95388,95495,95969,95975,97740,97785,97792,97798,97823,97849,98306,98589,98590,99095,100335,100361,103748,103781,105843,105871,107490,109654,110007,110060,110095,110119,110572,110977,111661,111679,113673,113716,114116,114131,122268,122358,123286,123313,127080,127142,130685,130723,131073,131578,133625,133677,133725,133731,133774,133781,137666,137706,143030,143061,143414,143430,145744,145777,146826,146849,146862,146871,155653,155766,158065,158108,158162,158169,158177,158184,162018,162089,162176,162184,162189,162195,162243,162249,163842,164125,164126,164631,164868,164912,165269,165281,165942,165967,166007,166013,169675,169725,170092,170099,170837,170857,170962,170970,172187,172216,179438,179444,180069,180087,181568,181586,184361,184391,184392,185282,185284,185313,185320,185326,185336,185342,185349,185359,185377,185383,185621,185627,188840,188891,189242,189257,190652,190677,190706,190712,191692,192628,196609,197114,201886,202009,204645,204662,205172,205182,207659,207666,216455,216456,229378,229661,229662,230167,262145,262650,294914,295197,295198,295703,310137,310723,310734,311149,311150,311165,311166,311837,311849,311895,311918,312197,320058,320157,320158,320172,321911,321926,326758,326764,327681,328186,360449,360954,393217,393722,407894,407962,409372,410534,423823,423834,425985,426490,458753,459258,461858,461869,467815,467912,467974,467980,468060,468068,468197,468203,468403,468413,468422,468428,477753,477844,480142,480170,480233,480240,486564,486634,486970,486981,487689,487713,491521,492026,492233,492334,492345,492351,492367,492373,493678,493704,493714,493724,496131,496178,503939,503965,503997,504003,504474,504485,506085,506109,506773,506788,506886,506895,506955,506962,506970,506976,508795,508813,508945,508953,516760,516880,519564,519629,524289,524794,531813,531858,546571,554577,557057,557562,557995,558001,574444,574597,579713,584409,589825,590330,597318,597487,604475,604521,613880,617745,622593,623098,627874,627963,627983,627989,628029,628035,628065,628071,628084,628090,628110,628116,628121,628127,629894,629911,629918,629924,629989,629996,629997,630004,646985,647113,647188,647287,647294,647300,647393,647400,651290,651347,651365,651371,651531,651541,655361,655866,657223,657266,658879,660054,660213,660220,660231,660237,660282,660288,666812,666898,666927,666934,669027,669066,669842,669870,669960,669969,670281,670297,670300,670308,670426,670432,676171,679112,679113,682065,682075,682081,682801,682810,682819,682825,682888,682895,688129,688634,699315,700087,700454,700963,700978,700984,720897,721402,749277,749283,749298,749304,749313,749319,749345,749351,753665,754170,786433,786938,802432,802438,802451,802457,802472,802478,802491,802497,802503,802509,809137,809143,809199,809205,809227,809233,809253,809259,809612,809851,809852,810091,819202,819485,819486,819991,826601,826613,826661,826667,829477,829495,851969,852474,856751,856799,856973,856982,857025,857032,857171,857181,858572,858611,859663,859674,884738,885021,885022,885527,898066,905119,905609,905625,908405,908423,910740,910769,917505,918010,950273,950778,965824,965830,969547,969553,969837,969848,969851,969857,969881,969888,983041,983546,983885,1146880,1146881,1161015,1178988") == "3ae254e0545a689296a3559238408fc767456734" || 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", "576,1,731,791,805,816,819,836,843,863,864,1124,1129,1131,1132,1238,1239,1719,1720,2408,2409,2411,2413,2414,2415,2430,2431,2612,2613,3499,3671,3782,3783,3785,3786,3790,3791,3799,3800,3801,3802,5893,6117,7819,7991,9128,9129,9131,9132,9536,9537,9539,9540,10533,10535,16474,16475,16608,16609,19378,19380,25946,25948,32768,32770,33053,33054,35580,35581,35583,35585,35644,35645,35778,35942,35952,35963,35970,35995,36001,40891,40897,42170,42204,42213,42219,42227,42233,42355,42362,45097,45140,50750,50756,50858,50864,55206,55247,55263,55269,59476,59528,59901,59911,59993,60000,60203,60211,65537,66042,69078,69086,69492,69509,75362,75487,75495,75501,79426,79433,79903,79921,95388,95495,95969,95975,97740,97785,97792,97798,97823,97849,98306,98589,98590,99095,100335,100361,103748,103781,105843,105871,107490,109654,110007,110060,110095,110119,110572,110977,111661,111679,113673,113716,114116,114131,122268,122358,123286,123313,127080,127142,130685,130723,131073,131578,133625,133677,133725,133731,133774,133781,137666,137706,143030,143061,143414,143430,145744,145777,146826,146849,146862,146871,155653,155766,158065,158108,158162,158169,158177,158184,162018,162089,162176,162184,162189,162195,162243,162249,163842,164125,164126,164631,164868,164912,165269,165281,165942,165967,166007,166013,169675,169725,170092,170099,170837,170857,170962,170970,172187,172216,179438,179444,180069,180087,181568,181586,184361,184391,184392,185282,185284,185313,185320,185326,185336,185342,185349,185359,185377,185383,185621,185627,188840,188891,189242,189257,190652,190677,190706,190712,191692,192628,196609,197114,201886,202009,204645,204662,205172,205182,207659,207666,216455,216456,229378,229661,229662,230167,262145,262650,294914,295197,295198,295703,310137,310723,310734,311149,311150,311165,311166,311837,311849,311895,311918,312197,320058,320157,320158,320172,321911,321926,326758,326764,327681,328186,360449,360954,393217,393722,407894,407962,409372,410534,423823,423834,425985,426490,458753,459258,461858,461869,467815,467912,467974,467980,468060,468068,468197,468203,468403,468413,468422,468428,477753,477844,480142,480170,480233,480240,486564,486634,486970,486981,487689,487713,491521,492026,492233,492334,492345,492351,492367,492373,493678,493704,493714,493724,496131,496178,503939,503965,503997,504003,504474,504485,506085,506109,506773,506788,506886,506895,506955,506962,506970,506976,508795,508813,508945,508953,516760,516880,519564,519629,524289,524794,531813,531858,546571,554577,557057,557562,557995,558001,574444,574597,579713,584409,589825,590330,597318,597487,604475,604521,613880,617745,622593,623098,627874,627963,627983,627989,628029,628035,628065,628071,628084,628090,628110,628116,628121,628127,629894,629911,629918,629924,629989,629996,629997,630004,646985,647113,647188,647287,647294,647300,647393,647400,651290,651347,651365,651371,651531,651541,655361,655866,657223,657266,658879,660054,660213,660220,660231,660237,660282,660288,666812,666898,666927,666934,669027,669066,669842,669870,669960,669969,670281,670297,670300,670308,670426,670432,676171,679112,679113,682065,682075,682081,682801,682810,682819,682825,682888,682895,688129,688634,699315,700087,700454,700963,700978,700984,720897,721402,749277,749283,749298,749304,749313,749319,749345,749351,753665,754170,786433,786938,802432,802438,802451,802457,802472,802478,802491,802497,802503,802509,809137,809143,809199,809205,809227,809233,809253,809259,809612,809851,809852,810091,819202,819485,819486,819991,826601,826613,826661,826667,829477,829495,851969,852474,856751,856799,856973,856982,857025,857032,857171,857181,858572,858611,859663,859674,884738,885021,885022,885527,898066,905119,905609,905625,908405,908423,910740,910769,917505,918010,950273,950778,965824,965830,969547,969553,969837,969848,969851,969857,969881,969888,983041,983546,983885,1146880,1146881,1161015,1178988") && 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", "54,1,525,602,610,620,622,629,713,720,992,999,1239,1249,1269,1275,1281,1287,32770,32864,32865,33370,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,315284,315290,317862,360448,360449,386991,393125,393215,393216") == "20a1a4362506a0075c89864a2ced0802ac6cb675" || 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", "54,1,525,602,610,620,622,629,713,720,992,999,1239,1249,1269,1275,1281,1287,32770,32864,32865,33370,65537,66042,98306,98400,98401,98906,131073,131578,163842,163936,163937,164442,196609,197114,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,315284,315290,317862,360448,360449,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:67108864:b85ccf0bcab1de581b2b88bdf52c46068991909a",
                "EMMC:/dev/block/bootdevice/by-name/boot:67108864:b1c3c23dea7ac3333a0f9b4c60b2dd990ca58ca2",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:67108864:b1c3c23dea7ac3333a0f9b4c60b2dd990ca58ca2");

# ---- radio update tasks ----

ui_print("Patching firmware images...");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
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/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/aboot");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1");
package_extract_file("firmware-update/cmnlib64_30.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib_30.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
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/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/abootbak");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1bak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
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");
