getprop("ro.product.device") == "cmi" || abort("E3004: This package is for \"cmi\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/cmi/cmi:10/QKQ1.191117.002/20.3.26:user/release-keys");
ui_print("Target: Xiaomi/cmi/cmi:10/QKQ1.191117.002/20.3.28:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/cmi/cmi:10/QKQ1.191117.002/20.3.26:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/cmi/cmi:10/QKQ1.191117.002/20.3.28:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/cmi/cmi:10/QKQ1.191117.002/20.3.26:user/release-keys or Xiaomi/cmi/cmi:10/QKQ1.191117.002/20.3.28: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:824d88623da8609c66df4e348a96b668a0be91a2",
                      "EMMC:/dev/block/bootdevice/by-name/boot:134217728:39afd69bcf5270e9ee06496e7c75117f146e47aa") ||
    abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:824d88623da8609c66df4e348a96b668a0be91a2\" or \"EMMC:/dev/block/bootdevice/by-name/boot:134217728:39afd69bcf5270e9ee06496e7c75117f146e47aa\" 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(map_partition("system"), "1208,1,236,264,273,275,276,537,541,557,558,32768,32770,32974,32990,34396,34398,34740,34744,34757,34758,34913,34917,34925,34926,34934,34938,34943,34944,34973,34977,34981,34982,35471,35475,35491,35492,35501,35505,35509,35510,36554,36560,36592,36593,36599,36603,36607,36608,36613,36617,36621,36622,36666,36672,36678,36679,36690,36694,36698,36699,36890,36894,36902,36903,36906,36907,36924,36928,36932,38241,39996,40000,40022,40023,40031,40035,40039,40040,40046,40050,40054,40055,40057,40058,42880,42884,42912,42913,43041,43045,43051,43052,43455,43459,43474,43475,45476,45480,45508,45509,46167,46171,46193,46194,49885,49886,50047,50048,50803,50807,50823,50824,50828,50832,50836,50837,50859,50863,50887,50888,53063,53067,53097,53098,53134,53138,53142,53143,53226,53230,53236,53237,57880,57882,62485,62486,62758,62762,62774,62775,62785,62789,62793,62794,62807,62811,62833,62834,63456,63460,63476,63477,65008,65012,65049,65050,65421,65422,65536,65552,65781,65785,65792,65793,66187,66191,66204,66205,69763,69764,70689,70693,70718,70719,81897,81901,81915,81916,81955,81959,81964,81965,91745,91749,91852,91853,91928,91932,91936,91937,91975,91981,91986,91987,94762,94766,94784,94785,96180,96181,96321,96322,96675,96681,96695,96696,98304,98306,98510,98526,98705,98706,99125,99128,99356,99360,99368,99369,99711,99717,99731,99732,102435,102441,102493,102494,103498,103502,103524,103525,103567,103571,103576,103577,103626,103630,103635,103636,103639,103645,103650,103651,106211,106212,106270,106274,106280,106281,106326,106330,106334,106335,106888,106894,106911,106912,107148,107154,107164,107165,107361,107365,107370,107371,109167,109173,109199,109200,109238,109242,109246,109247,110413,110417,110441,110442,110559,110563,110569,110570,110636,110640,110645,110646,111359,111363,111381,111382,111648,111652,111661,111662,119830,119834,122459,122460,122529,122533,122539,122540,127372,127378,127447,127448,131072,131088,131700,131704,131778,131779,131787,131791,131795,131796,132002,132006,132014,132015,132715,132719,132735,132736,132747,132751,132755,132756,135681,135685,136166,136167,136966,136972,136988,136989,155999,156001,161208,161209,161853,161855,163379,163380,163840,163842,164046,164062,164495,164499,164526,164527,164531,164535,164539,164540,164562,164566,164570,164571,164575,164579,164587,164588,164603,164607,164611,164612,165014,165018,165023,165024,165048,165052,165056,165057,167854,167858,167904,167905,167908,167914,167919,167920,168186,168190,168200,168201,168354,168360,168369,168370,168645,168649,168661,168662,168712,168716,168723,168724,168750,168756,168761,168762,170226,170230,170258,170259,171135,171138,175595,175599,177796,177797,178216,178220,178232,180019,180395,180399,180407,180408,180421,180425,180429,180430,183057,183062,183097,183102,183119,183120,183456,183457,186011,186012,186445,186446,188230,188231,190766,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190784,191990,191991,195631,195632,196305,196306,196608,196624,200493,200494,211226,211227,211591,211592,214753,214754,222481,222482,226500,226501,229376,229378,229582,229598,241153,241154,241910,241911,244281,244282,252584,252585,253201,253202,255781,255782,258293,258294,260488,260489,261284,261285,262144,262160,265489,265490,269753,269754,274497,274498,275316,275317,280411,280412,289147,289148,294912,294914,295118,295134,301157,301158,301498,301499,318710,318711,325808,325809,327680,327696,346527,346528,347000,347001,347290,347291,347302,347303,347313,347316,347317,347318,347319,347320,347322,347323,347352,347353,347440,347443,347445,347446,348553,348554,348794,348795,348797,348798,348821,348822,348888,348889,348892,348897,348898,348899,348900,348901,348902,348903,349682,349683,349689,349690,350153,350155,350618,350620,350621,350622,350623,350624,350625,350626,350627,350628,350629,350630,350631,350632,350633,350634,350635,350638,351558,351560,351642,351643,351645,351646,351649,351651,351909,351910,351917,351919,352408,352410,352534,352535,352546,352547,352813,352814,352927,352928,352945,352947,354263,354264,360448,360464,367978,367979,375862,375863,377893,377894,378364,378365,383491,383492,393216,393232,394076,395166,397015,397531,400128,400228,400290,400291,401630,401666,406367,406368,418952,420235,422295,422328,422436,423122,425984,426000,426180,426181,427484,427485,439470,439927,439999,440273,440302,440306,440311,440313,440317,440319,440323,440325,440329,440331,440709,440711,440816,440818,440822,440824,440828,440830,440834,440836,440840,440842,440846,440848,440852,440854,440858,440860,440864,440866,440870,440872,440886,440888,440892,440894,440903,440905,440909,440911,440915,440917,440921,440926,440931,440933,440937,440939,440943,440945,440950,440952,440956,440958,440962,440964,440968,440970,441038,441040,441045,441047,441051,441053,441057,441059,441063,441065,441069,441071,441075,441077,441082,441084,441093,441095,441099,441101,441105,441107,441111,441113,441193,441195,441199,441201,441206,441208,441212,441214,441218,441220,441224,441226,441230,441232,441236,441238,441244,441246,441250,441252,441256,441258,441262,441264,441269,441271,441275,441277,441281,441283,441287,441289,441293,441295,441299,441301,441305,441307,441312,441314,441320,441322,441327,441330,441335,441337,441341,441343,441347,441349,441353,441355,441797,441799,441924,441926,441930,441932,441936,441938,441942,441944,441948,441950,441954,441956,441960,441962,441966,441968,441972,441974,441978,441980,441994,441996,442000,442002,442012,442014,442018,442020,442024,442026,442030,442035,442040,442042,442046,442048,442052,442054,442059,442061,442065,442067,442071,442073,442094,442096,442100,442102,442181,442183,442188,442190,442194,442196,442200,442202,442206,442208,442212,442214,442218,442220,442225,442227,442236,442238,442242,442244,442248,442250,442254,442256,442348,442350,442354,442356,442361,442363,442367,442369,442373,442736,450113,450115,450119,450121,450125,450127,450131,450133,450139,450141,450145,450147,450151,450153,450157,450159,450164,450166,450170,450172,450176,450178,450182,450184,450188,450190,450194,450196,450200,450202,450207,450209,452023,452025,452031,452033,458212,458213,458752,458768,462408,462409,463053,463054,463386,463387,463402,463403,463431,463432,463466,463467,464293,464305,466040,467525,471023,471024,471985,472026,477553,477554,486015,486017,486600,486602,486839,486840,490475,490476,491520,491536,495953,495954,496346,496347,496521,496522,497812,497813,502532,502533,512089,512100,516563,516564,521434,521435,524288,524309,540837,540838,557056,557072,571454,571455,572041,572043,589824,589840,592389,592390,596105,596106,608109,608110,613001,613002,620339,620340,622592,622610,643469,643482,643487,647816,648420,648453,650774,650776,653336,653338,653392,653394,653472,653474,655360,655414,675971,675973,676178,676180,676194,676196,677128,677130,677201,677203,682497,682499,685933,685935,687256,687258,688128,688182,688276,688278,688314,688316,688328,688330,688601,688603,688618,688620,689856,689858,689911,689913,690318,690320,690424,690426,690454,690456,690466,690468,691989,691991,692095,692097,704293,704295,706729,706731,713081,713083,713109,723456,724487,724493,724526,724528,732855,732857,735517,735519,739202,739204,747455,747456,753664,753693,769783,769787,773049,773050,786432,786445,786449,786450,788461,788465,788598,788599,791649,791653,791698,791699,791716,791720,791724,791725,791751,791755,791759,791760,799766,799767,799785,799789,799793,799794,799804,799808,799812,799813,800280,800284,800293,800294,801108,801112,801130,801131,806766,806767,808711,808713,810908,810909,810911,810915,810919,810920,812097,812101,812108,812109,812113,812117,812121,812122,814773,814777,814816,814817,814878,814882,814887,814890,814895,814896,819200,819202,819406,819407,820322,820326,820370,820371,820438,820442,820538,820539,820542,820546,820550,820551,820603,820607,820612,820613,823098,823102,823145,823146,823161,823165,823169,823170,823569,823573,823583,823584,823721,823725,823733,823734,825056,825060,825087,825088,825856,825860,827030,827031,827178,827182,827187,827188,827193,827197,827201,827202,827214,827218,827222,827223,827251,827257,827262,827263,828634,828638,828663,828664,829445,829449,829475,833860,836362,849615,849789,849790") == "b8bb94663caec8bdb0b70a1f0eab25818f0adb33" || block_image_verify(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block(map_partition("system"));
ifelse (block_image_recover(map_partition("system"), "1208,1,236,264,273,275,276,537,541,557,558,32768,32770,32974,32990,34396,34398,34740,34744,34757,34758,34913,34917,34925,34926,34934,34938,34943,34944,34973,34977,34981,34982,35471,35475,35491,35492,35501,35505,35509,35510,36554,36560,36592,36593,36599,36603,36607,36608,36613,36617,36621,36622,36666,36672,36678,36679,36690,36694,36698,36699,36890,36894,36902,36903,36906,36907,36924,36928,36932,38241,39996,40000,40022,40023,40031,40035,40039,40040,40046,40050,40054,40055,40057,40058,42880,42884,42912,42913,43041,43045,43051,43052,43455,43459,43474,43475,45476,45480,45508,45509,46167,46171,46193,46194,49885,49886,50047,50048,50803,50807,50823,50824,50828,50832,50836,50837,50859,50863,50887,50888,53063,53067,53097,53098,53134,53138,53142,53143,53226,53230,53236,53237,57880,57882,62485,62486,62758,62762,62774,62775,62785,62789,62793,62794,62807,62811,62833,62834,63456,63460,63476,63477,65008,65012,65049,65050,65421,65422,65536,65552,65781,65785,65792,65793,66187,66191,66204,66205,69763,69764,70689,70693,70718,70719,81897,81901,81915,81916,81955,81959,81964,81965,91745,91749,91852,91853,91928,91932,91936,91937,91975,91981,91986,91987,94762,94766,94784,94785,96180,96181,96321,96322,96675,96681,96695,96696,98304,98306,98510,98526,98705,98706,99125,99128,99356,99360,99368,99369,99711,99717,99731,99732,102435,102441,102493,102494,103498,103502,103524,103525,103567,103571,103576,103577,103626,103630,103635,103636,103639,103645,103650,103651,106211,106212,106270,106274,106280,106281,106326,106330,106334,106335,106888,106894,106911,106912,107148,107154,107164,107165,107361,107365,107370,107371,109167,109173,109199,109200,109238,109242,109246,109247,110413,110417,110441,110442,110559,110563,110569,110570,110636,110640,110645,110646,111359,111363,111381,111382,111648,111652,111661,111662,119830,119834,122459,122460,122529,122533,122539,122540,127372,127378,127447,127448,131072,131088,131700,131704,131778,131779,131787,131791,131795,131796,132002,132006,132014,132015,132715,132719,132735,132736,132747,132751,132755,132756,135681,135685,136166,136167,136966,136972,136988,136989,155999,156001,161208,161209,161853,161855,163379,163380,163840,163842,164046,164062,164495,164499,164526,164527,164531,164535,164539,164540,164562,164566,164570,164571,164575,164579,164587,164588,164603,164607,164611,164612,165014,165018,165023,165024,165048,165052,165056,165057,167854,167858,167904,167905,167908,167914,167919,167920,168186,168190,168200,168201,168354,168360,168369,168370,168645,168649,168661,168662,168712,168716,168723,168724,168750,168756,168761,168762,170226,170230,170258,170259,171135,171138,175595,175599,177796,177797,178216,178220,178232,180019,180395,180399,180407,180408,180421,180425,180429,180430,183057,183062,183097,183102,183119,183120,183456,183457,186011,186012,186445,186446,188230,188231,190766,190771,190772,190773,190774,190775,190776,190777,190778,190779,190780,190781,190782,190784,191990,191991,195631,195632,196305,196306,196608,196624,200493,200494,211226,211227,211591,211592,214753,214754,222481,222482,226500,226501,229376,229378,229582,229598,241153,241154,241910,241911,244281,244282,252584,252585,253201,253202,255781,255782,258293,258294,260488,260489,261284,261285,262144,262160,265489,265490,269753,269754,274497,274498,275316,275317,280411,280412,289147,289148,294912,294914,295118,295134,301157,301158,301498,301499,318710,318711,325808,325809,327680,327696,346527,346528,347000,347001,347290,347291,347302,347303,347313,347316,347317,347318,347319,347320,347322,347323,347352,347353,347440,347443,347445,347446,348553,348554,348794,348795,348797,348798,348821,348822,348888,348889,348892,348897,348898,348899,348900,348901,348902,348903,349682,349683,349689,349690,350153,350155,350618,350620,350621,350622,350623,350624,350625,350626,350627,350628,350629,350630,350631,350632,350633,350634,350635,350638,351558,351560,351642,351643,351645,351646,351649,351651,351909,351910,351917,351919,352408,352410,352534,352535,352546,352547,352813,352814,352927,352928,352945,352947,354263,354264,360448,360464,367978,367979,375862,375863,377893,377894,378364,378365,383491,383492,393216,393232,394076,395166,397015,397531,400128,400228,400290,400291,401630,401666,406367,406368,418952,420235,422295,422328,422436,423122,425984,426000,426180,426181,427484,427485,439470,439927,439999,440273,440302,440306,440311,440313,440317,440319,440323,440325,440329,440331,440709,440711,440816,440818,440822,440824,440828,440830,440834,440836,440840,440842,440846,440848,440852,440854,440858,440860,440864,440866,440870,440872,440886,440888,440892,440894,440903,440905,440909,440911,440915,440917,440921,440926,440931,440933,440937,440939,440943,440945,440950,440952,440956,440958,440962,440964,440968,440970,441038,441040,441045,441047,441051,441053,441057,441059,441063,441065,441069,441071,441075,441077,441082,441084,441093,441095,441099,441101,441105,441107,441111,441113,441193,441195,441199,441201,441206,441208,441212,441214,441218,441220,441224,441226,441230,441232,441236,441238,441244,441246,441250,441252,441256,441258,441262,441264,441269,441271,441275,441277,441281,441283,441287,441289,441293,441295,441299,441301,441305,441307,441312,441314,441320,441322,441327,441330,441335,441337,441341,441343,441347,441349,441353,441355,441797,441799,441924,441926,441930,441932,441936,441938,441942,441944,441948,441950,441954,441956,441960,441962,441966,441968,441972,441974,441978,441980,441994,441996,442000,442002,442012,442014,442018,442020,442024,442026,442030,442035,442040,442042,442046,442048,442052,442054,442059,442061,442065,442067,442071,442073,442094,442096,442100,442102,442181,442183,442188,442190,442194,442196,442200,442202,442206,442208,442212,442214,442218,442220,442225,442227,442236,442238,442242,442244,442248,442250,442254,442256,442348,442350,442354,442356,442361,442363,442367,442369,442373,442736,450113,450115,450119,450121,450125,450127,450131,450133,450139,450141,450145,450147,450151,450153,450157,450159,450164,450166,450170,450172,450176,450178,450182,450184,450188,450190,450194,450196,450200,450202,450207,450209,452023,452025,452031,452033,458212,458213,458752,458768,462408,462409,463053,463054,463386,463387,463402,463403,463431,463432,463466,463467,464293,464305,466040,467525,471023,471024,471985,472026,477553,477554,486015,486017,486600,486602,486839,486840,490475,490476,491520,491536,495953,495954,496346,496347,496521,496522,497812,497813,502532,502533,512089,512100,516563,516564,521434,521435,524288,524309,540837,540838,557056,557072,571454,571455,572041,572043,589824,589840,592389,592390,596105,596106,608109,608110,613001,613002,620339,620340,622592,622610,643469,643482,643487,647816,648420,648453,650774,650776,653336,653338,653392,653394,653472,653474,655360,655414,675971,675973,676178,676180,676194,676196,677128,677130,677201,677203,682497,682499,685933,685935,687256,687258,688128,688182,688276,688278,688314,688316,688328,688330,688601,688603,688618,688620,689856,689858,689911,689913,690318,690320,690424,690426,690454,690456,690466,690468,691989,691991,692095,692097,704293,704295,706729,706731,713081,713083,713109,723456,724487,724493,724526,724528,732855,732857,735517,735519,739202,739204,747455,747456,753664,753693,769783,769787,773049,773050,786432,786445,786449,786450,788461,788465,788598,788599,791649,791653,791698,791699,791716,791720,791724,791725,791751,791755,791759,791760,799766,799767,799785,799789,799793,799794,799804,799808,799812,799813,800280,800284,800293,800294,801108,801112,801130,801131,806766,806767,808711,808713,810908,810909,810911,810915,810919,810920,812097,812101,812108,812109,812113,812117,812121,812122,814773,814777,814816,814817,814878,814882,814887,814890,814895,814896,819200,819202,819406,819407,820322,820326,820370,820371,820438,820442,820538,820539,820542,820546,820550,820551,820603,820607,820612,820613,823098,823102,823145,823146,823161,823165,823169,823170,823569,823573,823583,823584,823721,823725,823733,823734,825056,825060,825087,825088,825856,825860,827030,827031,827178,827182,827187,827188,827193,827197,827201,827202,827214,827218,827222,827223,827251,827257,827262,827263,828634,828638,828663,828664,829445,829449,829475,833860,836362,849615,849789,849790") && block_image_verify(map_partition("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(map_partition("vendor"), "214,1,135,145,149,154,155,236,240,245,246,252,256,260,261,524,528,533,534,6308,6309,18194,18196,22889,22890,22892,22903,23431,23435,23440,23441,23453,23457,23461,23462,23465,23469,23473,23474,24821,25143,25220,25221,32768,32770,32878,32895,36915,36916,36968,36969,37270,37322,38002,38003,38635,38636,39775,39781,43683,43684,44955,44956,65536,65557,66187,66189,69495,69496,91139,91140,92626,92627,98304,98306,98414,98431,99698,99699,102196,102201,111927,111929,111966,111967,116586,116587,117221,117223,117857,117858,117940,117941,131072,131089,139599,139602,139620,139621,139666,139667,139685,139686,139829,139832,140491,140492,141253,141254,141262,141263,143600,143601,143626,143627,143664,143665,143781,143782,143875,143876,144365,144366,148282,148283,148296,148297,156125,156126,156128,156129,156517,156519,156578,156579,156590,156591,156747,156748,159809,159810,159811,159812,159837,159838,160264,160265,160290,160291,160459,160460,160865,160866,160927,160928,161067,161068,161189,161190,161258,161259,161397,161398,161513,161514,161559,161560,161776,161777,161818,161819,161856,161857,162034,162035,162168,162169,162557,162558,162688,162689,162739,162740,162838,162839,162900,162902,162903,162909,163011,163013,163020,163032,163033,163035,163042,163054,163073,163074,163840,163842,163950,163973,164644,229378,229486,294914,295022,425990,426001,444462,445814,452879,452981,452982") == "cc106730ac33cfef42e3fced2bc612b127f5144d" || block_image_verify(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block(map_partition("vendor"));
ifelse (block_image_recover(map_partition("vendor"), "214,1,135,145,149,154,155,236,240,245,246,252,256,260,261,524,528,533,534,6308,6309,18194,18196,22889,22890,22892,22903,23431,23435,23440,23441,23453,23457,23461,23462,23465,23469,23473,23474,24821,25143,25220,25221,32768,32770,32878,32895,36915,36916,36968,36969,37270,37322,38002,38003,38635,38636,39775,39781,43683,43684,44955,44956,65536,65557,66187,66189,69495,69496,91139,91140,92626,92627,98304,98306,98414,98431,99698,99699,102196,102201,111927,111929,111966,111967,116586,116587,117221,117223,117857,117858,117940,117941,131072,131089,139599,139602,139620,139621,139666,139667,139685,139686,139829,139832,140491,140492,141253,141254,141262,141263,143600,143601,143626,143627,143664,143665,143781,143782,143875,143876,144365,144366,148282,148283,148296,148297,156125,156126,156128,156129,156517,156519,156578,156579,156590,156591,156747,156748,159809,159810,159811,159812,159837,159838,160264,160265,160290,160291,160459,160460,160865,160866,160927,160928,161067,161068,161189,161190,161258,161259,161397,161398,161513,161514,161559,161560,161776,161777,161818,161819,161856,161857,162034,162035,162168,162169,162557,162558,162688,162689,162739,162740,162838,162839,162900,162902,162903,162909,163011,163013,163020,163032,163033,163035,163042,163054,163073,163074,163840,163842,163950,163973,164644,229378,229486,294914,295022,425990,426001,444462,445814,452879,452981,452982") && block_image_verify(map_partition("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;
if (range_sha1(map_partition("product"), "330,1,57,73,77,81,82,89,93,97,98,104,108,112,113,173,177,182,183,185,186,192,196,200,201,316,320,324,325,337,341,345,346,349,350,356,360,364,365,388,392,396,397,14696,14697,29766,29767,30929,30930,30941,30945,30949,30950,30960,30961,30966,30970,30975,30976,30980,30986,30991,30992,30998,31002,31006,31007,31019,31023,31027,31028,31030,31035,31044,31045,32768,32770,32797,32817,34204,34209,34266,34271,34279,34284,34312,34317,34340,34345,34366,34371,34390,34391,34399,34401,34565,34566,34567,34568,34569,34570,34571,34572,34608,34609,34613,34615,34623,34624,34628,34629,34900,34904,34908,34910,34915,34917,34921,34923,34927,34929,34933,34935,34939,34941,34945,34947,34951,34953,34957,34959,34966,34968,34972,34974,34978,34980,34984,34986,34990,34992,34996,34998,35002,35004,35008,35010,35014,35016,35020,35022,35026,35028,35032,35034,35038,35040,35044,35046,35050,35052,35056,35058,35063,35065,35069,35071,35075,35077,35081,35083,35087,35089,35093,35095,35099,35101,35105,35107,35111,35113,35117,35119,35123,35125,35129,35131,35135,35138,35142,35144,35149,35151,35155,35157,35161,35163,35167,35169,35173,35175,35179,35181,35185,35187,35191,35193,35200,35202,35206,35208,35212,35214,35218,35220,35224,35226,35230,35232,35236,35238,35242,35244,35248,35250,35254,35256,35260,35262,35266,35268,35272,35274,35278,35280,35284,35286,35290,35292,35297,35299,35303,35305,35309,35311,35315,35317,35321,35323,35327,35329,35333,35335,35339,35341,35345,35347,35351,35353,35357,35359,35363,35365,36335,36336,39902,39903,41046,41047,45763,45764,50005,50007,52066,52068,65536,65561,65562,65563,77860,77862,77948,77950,78250,78252,85594,85596,86825,86827,87260,87261,92019,92021,98304,98306,98333,98351,98353,98419,99246,99247,103155,103568,109298,109299,109764,109768,109782,109783,110450,110454,110470,110471,110498,110502,110506,110507,110510,110514,110518,110519,110798,110804,110813,110818,110843,110848,111204,112970,113006,113007") == "6c563ad1c7dfec724888e9e3e2199c4837a9c0c3" || block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat")) then
ui_print("Verified product image...");
else
check_first_block(map_partition("product"));
ifelse (block_image_recover(map_partition("product"), "330,1,57,73,77,81,82,89,93,97,98,104,108,112,113,173,177,182,183,185,186,192,196,200,201,316,320,324,325,337,341,345,346,349,350,356,360,364,365,388,392,396,397,14696,14697,29766,29767,30929,30930,30941,30945,30949,30950,30960,30961,30966,30970,30975,30976,30980,30986,30991,30992,30998,31002,31006,31007,31019,31023,31027,31028,31030,31035,31044,31045,32768,32770,32797,32817,34204,34209,34266,34271,34279,34284,34312,34317,34340,34345,34366,34371,34390,34391,34399,34401,34565,34566,34567,34568,34569,34570,34571,34572,34608,34609,34613,34615,34623,34624,34628,34629,34900,34904,34908,34910,34915,34917,34921,34923,34927,34929,34933,34935,34939,34941,34945,34947,34951,34953,34957,34959,34966,34968,34972,34974,34978,34980,34984,34986,34990,34992,34996,34998,35002,35004,35008,35010,35014,35016,35020,35022,35026,35028,35032,35034,35038,35040,35044,35046,35050,35052,35056,35058,35063,35065,35069,35071,35075,35077,35081,35083,35087,35089,35093,35095,35099,35101,35105,35107,35111,35113,35117,35119,35123,35125,35129,35131,35135,35138,35142,35144,35149,35151,35155,35157,35161,35163,35167,35169,35173,35175,35179,35181,35185,35187,35191,35193,35200,35202,35206,35208,35212,35214,35218,35220,35224,35226,35230,35232,35236,35238,35242,35244,35248,35250,35254,35256,35260,35262,35266,35268,35272,35274,35278,35280,35284,35286,35290,35292,35297,35299,35303,35305,35309,35311,35315,35317,35321,35323,35327,35329,35333,35335,35339,35341,35345,35347,35351,35353,35357,35359,35363,35365,36335,36336,39902,39903,41046,41047,45763,45764,50005,50007,52066,52068,65536,65561,65562,65563,77860,77862,77948,77950,78250,78252,85594,85596,86825,86827,87260,87261,92019,92021,98304,98306,98333,98351,98353,98419,99246,99247,103155,103568,109298,109299,109764,109768,109782,109783,110450,110454,110470,110471,110498,110502,110506,110507,110510,110514,110518,110519,110798,110804,110813,110818,110843,110848,111204,112970,113006,113007") && block_image_verify(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat"), ui_print("product recovered successfully."), abort("E2004: product partition fails to recover"));
endif;
if (range_sha1(map_partition("odm"), "10,1,2,9,13,2026,2035,32231,32745,32767,32768") == "bed72f06c5fb96f51311f5505e303192cbee7af2" || block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat")) then
ui_print("Verified odm image...");
else
check_first_block(map_partition("odm"));
ifelse (block_image_recover(map_partition("odm"), "10,1,2,9,13,2026,2035,32231,32745,32767,32768") && block_image_verify(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat"), ui_print("odm recovered successfully."), abort("E2004: odm 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:824d88623da8609c66df4e348a96b668a0be91a2",
                "EMMC:/dev/block/bootdevice/by-name/boot:134217728:39afd69bcf5270e9ee06496e7c75117f146e47aa",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/bootdevice/by-name/boot:134217728:39afd69bcf5270e9ee06496e7c75117f146e47aa");

# ---- 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/xbl_config_5.elf", "/dev/block/bootdevice/by-name/xbl_config_5");
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/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/xbl_5.elf", "/dev/block/bootdevice/by-name/xbl_5");
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/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/xbl_config_4.elf", "/dev/block/bootdevice/by-name/xbl_config_4");
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/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_4.elf", "/dev/block/bootdevice/by-name/xbl_4");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
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/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/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
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/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


# Patch partition vendor

ui_print("Patching vendor image after verification.");
block_image_update(map_partition("vendor"), package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

# Update dynamic partition metadata

assert(update_dynamic_partitions(package_extract_file("dynamic_partitions_op_list")));

# Patch partition product

ui_print("Patching product image after verification.");
block_image_update(map_partition("product"), package_extract_file("product.transfer.list"), "product.new.dat", "product.patch.dat") ||
  abort("E2001: Failed to update product image.");

# Patch partition system

ui_print("Patching system image after verification.");
block_image_update(map_partition("system"), package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");

# Patch partition odm

ui_print("Patching odm image after verification.");
block_image_update(map_partition("odm"), package_extract_file("odm.transfer.list"), "odm.new.dat", "odm.patch.dat") ||
  abort("E2001: Failed to update odm image.");

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);

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

ui_print("Patching vbmeta dtbo logo binimages...");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
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");

# ---- update tasks: exaid part 2----


package_extract_file("exaid.img", "/dev/block/bootdevice/by-name/exaid");
    
