getprop("ro.product.device") == "pyxis" || abort("E3004: This package is for \"pyxis\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.5.0.QFCEUXM:user/release-keys");
ui_print("Target: Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.6.0.QFCEUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.5.0.QFCEUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.6.0.QFCEUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.5.0.QFCEUXM:user/release-keys or Xiaomi/pyxis_eea/pyxis:10/QKQ1.190828.002/V12.0.6.0.QFCEUXM: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:ae769c934e78187138d4f9a91af77ddb231643c9",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:621ef5efb3fcf60e5d8a61b657648bd9c1b865b5") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:ae769c934e78187138d4f9a91af77ddb231643c9\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:621ef5efb3fcf60e5d8a61b657648bd9c1b865b5\" 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", "468,1,573,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2522,2854,2964,2984,2995,3691,3692,3694,3695,3699,3700,3708,3709,3710,3711,5814,5931,9068,9069,9071,9072,9476,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,25589,25591,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,34957,35025,35026,35040,35041,35053,35679,35690,35691,35697,35698,35703,35704,35824,35827,37441,37442,39653,39654,39685,39686,39898,39899,39998,41415,43726,43727,43740,43741,43746,43747,43749,43750,46112,46113,46483,46484,46538,46541,46628,46629,46712,46713,49398,49399,49402,49403,49712,49713,49961,49962,50422,50423,51329,51330,51334,51335,51357,51358,52578,52579,52983,52984,53020,53021,56328,56330,60116,60117,60304,60305,61607,61608,61746,61747,61779,61780,62230,62231,62914,62915,64268,64269,64445,64446,65536,65537,66766,66767,70347,70348,70833,70834,75137,75138,77868,77869,79048,79049,79121,79122,79141,79144,82456,82457,85080,85081,85873,85874,86020,86021,86681,86682,86694,86695,86699,86700,87041,87044,87054,87055,92652,92653,94301,94302,94353,94354,94357,94360,96216,96217,96301,96302,96304,96305,96326,96327,97270,97273,97673,97676,97842,97843,97884,97885,98304,98306,98526,98527,100599,100600,100650,100651,101001,101002,101075,101076,101839,101840,105992,105993,105998,105999,106396,106397,107882,107883,109659,109660,110108,110109,110113,110114,110122,110123,110127,110128,110139,110140,110163,110164,112126,112127,112281,112282,112562,112565,113490,113491,114061,114062,118310,118313,120608,120609,120958,120959,124363,124364,124376,124377,124718,124719,126465,126466,126901,126902,127765,127876,128639,128640,129687,129726,130253,130305,131072,131073,131893,131899,131905,131906,132218,132219,132231,132232,132241,132244,132245,132246,132247,132248,132250,132251,132252,132253,132290,132291,132297,132298,132375,132376,132401,132404,132406,132407,132412,132414,132437,132438,132509,132510,132513,132518,132519,132520,132521,132522,132523,132524,133454,133455,133462,133463,134016,134018,134571,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134587,134588,134589,134592,135449,135451,135452,135453,135536,135537,135539,135540,135543,135545,135803,135804,135811,135813,136303,136305,136412,136413,136443,136444,136455,136456,136722,136723,136836,136837,136853,136855,136857,136858,145792,145793,153715,153716,155664,155665,155942,156031,157217,157503,158824,163842,164062,164063,164568,173628,173853,173894,173901,176027,178624,178726,178788,178789,180128,180479,182046,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,878318,884736,884738,884958,884959,903007,917316,917503,917504") == "5a0f6cc112ef2ca26baf9c48554a36b38a278228" || 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", "468,1,573,728,742,772,779,781,782,1028,1033,1035,1036,1142,1143,1628,1629,2317,2318,2320,2322,2323,2324,2339,2340,2521,2522,2854,2964,2984,2995,3691,3692,3694,3695,3699,3700,3708,3709,3710,3711,5814,5931,9068,9069,9071,9072,9476,9477,9479,9480,10476,10478,16417,16418,16551,16552,19321,19323,25589,25591,32768,32770,32990,32991,34757,34758,34760,34762,34821,34822,34955,34957,35025,35026,35040,35041,35053,35679,35690,35691,35697,35698,35703,35704,35824,35827,37441,37442,39653,39654,39685,39686,39898,39899,39998,41415,43726,43727,43740,43741,43746,43747,43749,43750,46112,46113,46483,46484,46538,46541,46628,46629,46712,46713,49398,49399,49402,49403,49712,49713,49961,49962,50422,50423,51329,51330,51334,51335,51357,51358,52578,52579,52983,52984,53020,53021,56328,56330,60116,60117,60304,60305,61607,61608,61746,61747,61779,61780,62230,62231,62914,62915,64268,64269,64445,64446,65536,65537,66766,66767,70347,70348,70833,70834,75137,75138,77868,77869,79048,79049,79121,79122,79141,79144,82456,82457,85080,85081,85873,85874,86020,86021,86681,86682,86694,86695,86699,86700,87041,87044,87054,87055,92652,92653,94301,94302,94353,94354,94357,94360,96216,96217,96301,96302,96304,96305,96326,96327,97270,97273,97673,97676,97842,97843,97884,97885,98304,98306,98526,98527,100599,100600,100650,100651,101001,101002,101075,101076,101839,101840,105992,105993,105998,105999,106396,106397,107882,107883,109659,109660,110108,110109,110113,110114,110122,110123,110127,110128,110139,110140,110163,110164,112126,112127,112281,112282,112562,112565,113490,113491,114061,114062,118310,118313,120608,120609,120958,120959,124363,124364,124376,124377,124718,124719,126465,126466,126901,126902,127765,127876,128639,128640,129687,129726,130253,130305,131072,131073,131893,131899,131905,131906,132218,132219,132231,132232,132241,132244,132245,132246,132247,132248,132250,132251,132252,132253,132290,132291,132297,132298,132375,132376,132401,132404,132406,132407,132412,132414,132437,132438,132509,132510,132513,132518,132519,132520,132521,132522,132523,132524,133454,133455,133462,133463,134016,134018,134571,134573,134574,134575,134576,134577,134578,134579,134580,134581,134582,134583,134584,134585,134587,134588,134589,134592,135449,135451,135452,135453,135536,135537,135539,135540,135543,135545,135803,135804,135811,135813,136303,136305,136412,136413,136443,136444,136455,136456,136722,136723,136836,136837,136853,136855,136857,136858,145792,145793,153715,153716,155664,155665,155942,156031,157217,157503,158824,163842,164062,164063,164568,173628,173853,173894,173901,176027,178624,178726,178788,178789,180128,180479,182046,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,878318,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", "214,1,256,602,610,620,621,702,703,767,768,770,771,773,784,789,790,792,793,801,802,1212,1262,1348,1349,1529,1936,2434,3181,4353,4354,4509,4510,5202,5203,5884,5885,6816,6821,9074,9075,10724,10725,11996,11997,32768,32770,32864,32865,33809,33811,41419,41420,46092,46093,50938,50939,65536,65537,66043,66044,70293,70294,77051,77052,89970,89971,93945,93946,98304,98306,98400,98401,107869,107870,112626,112627,120665,120666,121688,121690,121706,121708,122128,122129,122211,122212,131072,131073,131684,131687,131705,131706,131751,131752,131770,131771,131772,131773,131821,131822,131871,131872,132672,132673,132686,132687,132724,132725,132908,132909,133155,133156,133166,133167,138621,138623,144759,144760,144762,144763,145338,145340,145379,145380,150274,150275,153304,153305,153306,153307,153328,153329,153753,153754,153806,153807,154108,154113,154133,154135,154136,154142,154147,154155,154156,154158,154164,154175,154199,154203,154341,154342,163840,163842,163936,163937,166016,166017,171041,171042,171202,171227,171279,171309,171334,171353,171368,171380,171740,171901,171927,171965,173058,173060,173133,173848,174075,174076,174927,175729,176644,177212,178132,178579,183724,183742,185216,185217,196608,196609,206869,206870,210910,211230,212174,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,360449,360954,366418,386991,393125,393215,393216") == "eb35391b30bcf3a34cbfaf0428e0664b2c3c851d" || 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", "214,1,256,602,610,620,621,702,703,767,768,770,771,773,784,789,790,792,793,801,802,1212,1262,1348,1349,1529,1936,2434,3181,4353,4354,4509,4510,5202,5203,5884,5885,6816,6821,9074,9075,10724,10725,11996,11997,32768,32770,32864,32865,33809,33811,41419,41420,46092,46093,50938,50939,65536,65537,66043,66044,70293,70294,77051,77052,89970,89971,93945,93946,98304,98306,98400,98401,107869,107870,112626,112627,120665,120666,121688,121690,121706,121708,122128,122129,122211,122212,131072,131073,131684,131687,131705,131706,131751,131752,131770,131771,131772,131773,131821,131822,131871,131872,132672,132673,132686,132687,132724,132725,132908,132909,133155,133156,133166,133167,138621,138623,144759,144760,144762,144763,145338,145340,145379,145380,150274,150275,153304,153305,153306,153307,153328,153329,153753,153754,153806,153807,154108,154113,154133,154135,154136,154142,154147,154155,154156,154158,154164,154175,154199,154203,154341,154342,163840,163842,163936,163937,166016,166017,171041,171042,171202,171227,171279,171309,171334,171353,171368,171380,171740,171901,171927,171965,173058,173060,173133,173848,174075,174076,174927,175729,176644,177212,178132,178579,183724,183742,185216,185217,196608,196609,206869,206870,210910,211230,212174,229378,229472,229473,229978,262145,262650,294914,295008,295009,295514,327681,328186,360449,360954,366418,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:ae769c934e78187138d4f9a91af77ddb231643c9",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:621ef5efb3fcf60e5d8a61b657648bd9c1b865b5",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:621ef5efb3fcf60e5d8a61b657648bd9c1b865b5");

# ---- 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/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/logfs_ufs_8mb.bin", "/dev/block/bootdevice/by-name/logfs");
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/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/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
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");
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/logo.img", "/dev/block/bootdevice/by-name/logo");
package_extract_file("firmware-update/vbmeta.img", "/dev/block/bootdevice/by-name/vbmeta");
