getprop("ro.product.device") == "pine" || abort("E3004: This package is for \"pine\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/pine/pine:10/QKQ1.191014.001/V11.0.2.0.QCMMIXM:user/release-keys");
ui_print("Target: Xiaomi/pine/pine:10/QKQ1.191014.001/V11.0.3.0.QCMMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/pine/pine:10/QKQ1.191014.001/V11.0.2.0.QCMMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/pine/pine:10/QKQ1.191014.001/V11.0.3.0.QCMMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/pine/pine:10/QKQ1.191014.001/V11.0.2.0.QCMMIXM:user/release-keys or Xiaomi/pine/pine:10/QKQ1.191014.001/V11.0.3.0.QCMMIXM: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:33554432:6225fbceee276c6023091ce9f0551c6ecc98bdab",
                      "EMMC:/dev/block/bootdevice/by-name/boot:33554432:88663f7e97b56165fb9e6c80e66dc476312231fe") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:33554432:6225fbceee276c6023091ce9f0551c6ecc98bdab\" or \"EMMC:/dev/block/bootdevice/by-name/boot:33554432:88663f7e97b56165fb9e6c80e66dc476312231fe\" has unexpected contents.");
apply_patch_space(40583168) || abort("E3006: Not enough free space on /cache to apply patches.");

# ---- radio update verification ----

ui_print("Verifying radio-update...");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/aboot:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18",
                      "EMMC:/dev/block/bootdevice/by-name/aboot:774108:7021956d8e6e053fb6784284f9b606ad0b9448af") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/aboot:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18\" or \"EMMC:/dev/block/bootdevice/by-name/aboot:774108:7021956d8e6e053fb6784284f9b606ad0b9448af\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/abootbak:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18",
                      "EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7021956d8e6e053fb6784284f9b606ad0b9448af") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/abootbak:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18\" or \"EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7021956d8e6e053fb6784284f9b606ad0b9448af\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:1094280522ff219c2be074842fe34d7b5da5dbd3",
                      "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:d9ffecd13962a9ce10a6240b72ef8ff4bc7e2891") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:1094280522ff219c2be074842fe34d7b5da5dbd3\" or \"EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:d9ffecd13962a9ce10a6240b72ef8ff4bc7e2891\" has unexpected contents.");
patch_partition_check("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:6b51ed843c97e2c89b28cd108199588576ff804e",
                      "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:f5808313ddcf14bc050f6892757539a4c20c2a41") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:6b51ed843c97e2c89b28cd108199588576ff804e\" or \"EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:f5808313ddcf14bc050f6892757539a4c20c2a41\" has unexpected contents.");
apply_patch_space(8388608) || 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", "174,1,554,696,710,739,746,766,767,954,959,961,962,1068,1069,1549,1550,1552,1554,1555,1556,1571,1572,1709,1710,2537,2538,2540,2541,2544,2545,2553,2554,2555,2556,6977,6978,6980,6981,7265,7266,7268,7269,7832,7834,13773,13774,13907,13908,16677,16679,20884,22243,22609,22610,22612,22614,22673,22674,22807,22809,22969,22973,22981,22982,22990,22994,22999,23000,23022,23026,23030,23031,27905,27906,27918,27922,27926,27927,29139,29145,29174,29175,29181,29185,29189,29190,29195,29199,29203,29204,29318,29324,29329,29330,31501,31505,31534,31535,31565,31569,31573,31574,31671,31675,31679,31680,32768,32770,32958,32959,34593,34597,34624,34625,34638,34642,34646,34647,34649,65537,66042,98306,98494,98495,99000,131073,131578,163842,164030,164031,164536,196609,197114,229378,229566,229567,230072,262145,262650,294914,295102,295103,295608,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,699776,753664,753665,774003,786268,786431,786432") == "883cb573307b506556cbafb8e025290629e0185e" || 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", "174,1,554,696,710,739,746,766,767,954,959,961,962,1068,1069,1549,1550,1552,1554,1555,1556,1571,1572,1709,1710,2537,2538,2540,2541,2544,2545,2553,2554,2555,2556,6977,6978,6980,6981,7265,7266,7268,7269,7832,7834,13773,13774,13907,13908,16677,16679,20884,22243,22609,22610,22612,22614,22673,22674,22807,22809,22969,22973,22981,22982,22990,22994,22999,23000,23022,23026,23030,23031,27905,27906,27918,27922,27926,27927,29139,29145,29174,29175,29181,29185,29189,29190,29195,29199,29203,29204,29318,29324,29329,29330,31501,31505,31534,31535,31565,31569,31573,31574,31671,31675,31679,31680,32768,32770,32958,32959,34593,34597,34624,34625,34638,34642,34646,34647,34649,65537,66042,98306,98494,98495,99000,131073,131578,163842,164030,164031,164536,196609,197114,229378,229566,229567,230072,262145,262650,294914,295102,295103,295608,327681,328186,360449,360954,393217,393722,425985,426490,458753,459258,491521,492026,524289,524794,557057,557562,589825,590330,622593,623098,655361,655866,688129,688634,699776,753664,753665,774003,786268,786431,786432") && 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", "616,1,456,570,578,588,592,597,598,679,683,688,689,952,956,961,962,1186,1194,1202,1203,1246,1254,1259,1260,1263,1267,1271,1272,1845,1846,3759,3760,3898,3942,4328,4329,4961,4962,5700,5705,13046,13047,17311,17312,20164,20165,24139,24140,32768,32770,32832,32833,36742,36743,41499,41500,42505,42507,42527,42529,42848,42849,43175,43176,43470,43471,43779,43780,44062,44063,44357,44358,44729,44730,44804,44805,48234,48235,48445,48446,48501,48504,48522,48523,48568,48569,48587,48589,48638,48639,48670,48671,49558,49559,49572,49573,49603,49604,49702,49703,49977,49978,49994,49995,50142,50143,50145,50146,50712,50713,50789,50790,50791,50792,50804,50806,52072,52073,53210,53212,53633,53634,53908,53909,54333,54334,54508,54512,55353,55354,56262,56263,56914,57034,65536,65537,66347,66348,67341,67342,77068,77069,78547,78548,80190,80192,81882,81883,83674,83675,85337,85338,87062,87063,88740,88741,89971,89972,91298,91299,92620,92621,93847,93848,95171,95172,96558,96559,97851,97852,98304,98306,98368,98369,99724,99725,101079,101080,102374,102375,103631,103632,104867,104868,106220,106221,107403,107404,108756,108757,109995,109996,110805,110806,110830,110831,110855,110856,111112,111113,111137,111138,111162,111163,111187,111188,111212,111213,111313,111314,111555,111556,111580,111581,111718,111719,111743,111744,111768,111769,112378,112379,112403,112404,112428,112429,112641,112642,112686,112687,112711,112712,112736,112737,112761,112762,112786,112787,113128,113129,113153,113154,113291,113292,113316,113317,113341,113342,113978,113979,115180,115181,116500,116501,116691,116692,116716,116717,116741,116742,117783,117784,119077,119078,120230,120231,121478,121479,122695,122696,123886,123887,125137,125138,126351,126352,127500,127501,128641,128642,129786,129787,130936,130937,131072,131073,131580,131581,131909,131910,131934,131935,131959,131960,132216,132217,132241,132242,132266,132267,132291,132292,132316,132317,132658,132659,132683,132684,132727,132728,132822,132823,132847,132848,132872,132873,133482,133483,133507,133508,133532,133533,133789,133790,133814,133815,133839,133840,133864,133865,133889,133890,133942,133943,134232,134233,134257,134258,134395,134396,134420,134421,134445,134446,135158,135159,135397,135398,135422,135423,135447,135448,136311,136312,138064,138065,139786,139787,141527,141528,141750,141751,141775,141776,141800,141801,141825,141826,141850,141851,142192,142193,142217,142218,143276,143277,144766,144767,146131,146132,147477,147478,148755,148756,150114,150115,151455,151456,152712,152713,154029,154030,155741,155742,157457,157458,163840,163842,163904,163905,170793,170794,175827,176043,176149,176187,176372,176616,176686,176823,176861,176862,177768,177769,177795,177796,177831,177832,177878,177879,177911,177912,177940,177941,177973,177974,178009,178010,178045,178046,178066,178067,178099,178100,178171,178172,178591,178592,178610,178611,178629,178630,178649,178650,178691,178692,178733,178734,178774,178775,178794,178795,178818,178819,178833,178834,178868,178869,178894,178895,178933,178934,178964,178965,178993,178994,179022,179023,179051,179052,179070,179071,179086,179087,179108,179109,179128,179129,179157,179158,179184,179185,179207,179208,179230,179231,179279,179280,179305,179306,179330,179331,179353,179354,179382,179383,179410,179411,179428,179429,179446,179447,179474,179475,179496,179497,179528,179529,179547,179548,179569,179570,179592,179593,179609,179610,179631,179632,179653,179654,179675,179676,179698,179699,179773,179774,179802,179803,179831,179832,179861,179862,179900,179901,179939,179940,179981,179982,180020,180021,180110,180111,180148,180149,180182,180183,180206,180207,180228,180229,180252,180253,180278,180279,180299,180300,180316,180317,180334,180335,180498,180499,181645,181646,181661,181662,193470,193471,193952,193953,194580,194581,196608,196609,197766,197767,203959,203960,203983,203984,204756,206014,206017,207372,207462,207464,207718,207719,208481,208482,211153,211154,213120,213121,213208,213212,213218,213219,213239,213243,215684,215686,215710,215711,215736,215767,215773,215783,229376,229378,229440,229441,257987,262077,262143,262144") == "72122bdebc80d60ab49b6fce436e7156c31a9e76" || 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", "616,1,456,570,578,588,592,597,598,679,683,688,689,952,956,961,962,1186,1194,1202,1203,1246,1254,1259,1260,1263,1267,1271,1272,1845,1846,3759,3760,3898,3942,4328,4329,4961,4962,5700,5705,13046,13047,17311,17312,20164,20165,24139,24140,32768,32770,32832,32833,36742,36743,41499,41500,42505,42507,42527,42529,42848,42849,43175,43176,43470,43471,43779,43780,44062,44063,44357,44358,44729,44730,44804,44805,48234,48235,48445,48446,48501,48504,48522,48523,48568,48569,48587,48589,48638,48639,48670,48671,49558,49559,49572,49573,49603,49604,49702,49703,49977,49978,49994,49995,50142,50143,50145,50146,50712,50713,50789,50790,50791,50792,50804,50806,52072,52073,53210,53212,53633,53634,53908,53909,54333,54334,54508,54512,55353,55354,56262,56263,56914,57034,65536,65537,66347,66348,67341,67342,77068,77069,78547,78548,80190,80192,81882,81883,83674,83675,85337,85338,87062,87063,88740,88741,89971,89972,91298,91299,92620,92621,93847,93848,95171,95172,96558,96559,97851,97852,98304,98306,98368,98369,99724,99725,101079,101080,102374,102375,103631,103632,104867,104868,106220,106221,107403,107404,108756,108757,109995,109996,110805,110806,110830,110831,110855,110856,111112,111113,111137,111138,111162,111163,111187,111188,111212,111213,111313,111314,111555,111556,111580,111581,111718,111719,111743,111744,111768,111769,112378,112379,112403,112404,112428,112429,112641,112642,112686,112687,112711,112712,112736,112737,112761,112762,112786,112787,113128,113129,113153,113154,113291,113292,113316,113317,113341,113342,113978,113979,115180,115181,116500,116501,116691,116692,116716,116717,116741,116742,117783,117784,119077,119078,120230,120231,121478,121479,122695,122696,123886,123887,125137,125138,126351,126352,127500,127501,128641,128642,129786,129787,130936,130937,131072,131073,131580,131581,131909,131910,131934,131935,131959,131960,132216,132217,132241,132242,132266,132267,132291,132292,132316,132317,132658,132659,132683,132684,132727,132728,132822,132823,132847,132848,132872,132873,133482,133483,133507,133508,133532,133533,133789,133790,133814,133815,133839,133840,133864,133865,133889,133890,133942,133943,134232,134233,134257,134258,134395,134396,134420,134421,134445,134446,135158,135159,135397,135398,135422,135423,135447,135448,136311,136312,138064,138065,139786,139787,141527,141528,141750,141751,141775,141776,141800,141801,141825,141826,141850,141851,142192,142193,142217,142218,143276,143277,144766,144767,146131,146132,147477,147478,148755,148756,150114,150115,151455,151456,152712,152713,154029,154030,155741,155742,157457,157458,163840,163842,163904,163905,170793,170794,175827,176043,176149,176187,176372,176616,176686,176823,176861,176862,177768,177769,177795,177796,177831,177832,177878,177879,177911,177912,177940,177941,177973,177974,178009,178010,178045,178046,178066,178067,178099,178100,178171,178172,178591,178592,178610,178611,178629,178630,178649,178650,178691,178692,178733,178734,178774,178775,178794,178795,178818,178819,178833,178834,178868,178869,178894,178895,178933,178934,178964,178965,178993,178994,179022,179023,179051,179052,179070,179071,179086,179087,179108,179109,179128,179129,179157,179158,179184,179185,179207,179208,179230,179231,179279,179280,179305,179306,179330,179331,179353,179354,179382,179383,179410,179411,179428,179429,179446,179447,179474,179475,179496,179497,179528,179529,179547,179548,179569,179570,179592,179593,179609,179610,179631,179632,179653,179654,179675,179676,179698,179699,179773,179774,179802,179803,179831,179832,179861,179862,179900,179901,179939,179940,179981,179982,180020,180021,180110,180111,180148,180149,180182,180183,180206,180207,180228,180229,180252,180253,180278,180279,180299,180300,180316,180317,180334,180335,180498,180499,181645,181646,181661,181662,193470,193471,193952,193953,194580,194581,196608,196609,197766,197767,203959,203960,203983,203984,204756,206014,206017,207372,207462,207464,207718,207719,208481,208482,211153,211154,213120,213121,213208,213212,213218,213219,213239,213243,215684,215686,215710,215711,215736,215767,215773,215783,229376,229378,229440,229441,257987,262077,262143,262144") && 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...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/aboot:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18",
                "EMMC:/dev/block/bootdevice/by-name/aboot:774108:7021956d8e6e053fb6784284f9b606ad0b9448af",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/aboot:774108:7021956d8e6e053fb6784284f9b606ad0b9448af");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abootbak:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18",
                "EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7021956d8e6e053fb6784284f9b606ad0b9448af",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7021956d8e6e053fb6784284f9b606ad0b9448af");
ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/bootdevice/by-name/boot:33554432:6225fbceee276c6023091ce9f0551c6ecc98bdab",
                "EMMC:/dev/block/bootdevice/by-name/boot:33554432:88663f7e97b56165fb9e6c80e66dc476312231fe",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:33554432:88663f7e97b56165fb9e6c80e66dc476312231fe");

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

ui_print("Patching firmware images...");
patch_partition("EMMC:/dev/block/bootdevice/by-name/aboot:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18",
                "EMMC:/dev/block/bootdevice/by-name/aboot:774108:7021956d8e6e053fb6784284f9b606ad0b9448af",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/aboot:774108:7021956d8e6e053fb6784284f9b606ad0b9448af");
patch_partition("EMMC:/dev/block/bootdevice/by-name/abootbak:774108:4346fc3d0addef08ba7c8f0b344d9f5a09776f18",
                "EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7021956d8e6e053fb6784284f9b606ad0b9448af",
                package_extract_file("patch/firmware-update/emmc_appsboot.mbn.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/abootbak:774108:7021956d8e6e053fb6784284f9b606ad0b9448af");
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/splash.img", "/dev/block/bootdevice/by-name/splash");
patch_partition("EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:1094280522ff219c2be074842fe34d7b5da5dbd3",
                "EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:d9ffecd13962a9ce10a6240b72ef8ff4bc7e2891",
                package_extract_file("patch/firmware-update/dtbo.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/dtbo:8388608:d9ffecd13962a9ce10a6240b72ef8ff4bc7e2891");
patch_partition("EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:6b51ed843c97e2c89b28cd108199588576ff804e",
                "EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:f5808313ddcf14bc050f6892757539a4c20c2a41",
                package_extract_file("patch/firmware-update/vbmeta.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/vbmeta:4096:f5808313ddcf14bc050f6892757539a4c20c2a41");
