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:11/RKQ1.200710.002/V12.1.1.0.RJACNXM:user/release-keys");
ui_print("Target: Xiaomi/cmi/cmi:11/RKQ1.200710.002/V12.1.2.0.RJACNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/cmi/cmi:11/RKQ1.200710.002/V12.1.1.0.RJACNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/cmi/cmi:11/RKQ1.200710.002/V12.1.2.0.RJACNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/cmi/cmi:11/RKQ1.200710.002/V12.1.1.0.RJACNXM:user/release-keys or Xiaomi/cmi/cmi:11/RKQ1.200710.002/V12.1.2.0.RJACNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:619e46e943f8b2be0242fb631e213bac3d05330e"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:03a81ed2d268a01835b47367b03a13ec2ee594e5")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:619e46e943f8b2be0242fb631e213bac3d05330e"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:03a81ed2d268a01835b47367b03a13ec2ee594e5"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "930,1,30,40,50,52,56,1989,1990,2015,2016,2058,2059,22422,22423,23141,23142,24154,24155,30320,30321,30467,30468,31409,31410,32768,32784,35690,35691,36514,36515,37868,37869,38304,38305,39543,39544,39790,39791,41081,41082,41174,41175,41372,41373,41596,41597,65536,65550,67240,67241,68405,68407,68765,68767,68782,68783,68943,68945,68955,68956,68985,68987,68993,68994,69003,69005,69010,69011,70197,70201,70236,70237,70243,70245,70250,70251,70256,70258,70263,70264,70275,70277,70282,70283,70477,70479,70489,70490,70493,70494,70514,70516,70521,71775,73081,73083,73112,73113,73121,73123,73128,73129,73135,73137,73142,73143,76429,76431,76474,76475,76603,76605,76613,76614,76876,76877,77070,77072,77089,77090,79825,79827,79874,79875,80286,80288,80306,80307,80555,80556,81311,81313,81331,81332,81336,81338,81343,81344,81375,81377,81382,81383,82815,82817,82844,82845,83640,83642,83667,83668,83751,83753,83760,83761,89380,89382,94752,94753,95087,95089,95090,95091,95101,95103,95108,95109,95123,95125,95150,95151,95779,95781,95798,95799,97331,97333,97372,97373,97558,97559,97950,97952,97967,97968,98304,98320,100536,100537,101464,101466,101493,101494,114077,114079,114105,114106,130089,130090,131072,131086,136077,136078,139203,139204,139206,139207,139291,139292,139766,139768,139873,139874,141658,141659,143368,143370,143406,143407,143445,143449,143456,143457,145941,145942,146199,146201,146241,146242,148907,148908,149046,149047,150173,150177,150202,150203,152341,152342,153340,153342,153365,153366,154407,154409,154437,154438,154591,154593,154600,154601,155406,155410,155434,155435,157802,157806,157854,157855,160398,160400,160440,160441,160474,160476,160481,160482,160485,160489,160495,160496,163059,163060,163122,163124,163131,163132,163176,163178,163183,164783,164827,164828,165077,165081,165093,165094,165113,165115,165120,165121,165164,165166,165171,165172,167552,167554,167594,167595,167711,167713,167720,167721,167790,167792,167798,167799,168065,168067,168078,168079,174829,174830,176243,176245,178869,178870,181553,181555,181560,181561,182073,182075,182091,182092,187029,187033,187106,187107,190765,190841,190843,190844,192648,192650,192739,192740,192748,192750,192755,192756,193381,193383,193400,193401,194135,194137,194156,194157,194168,194170,194175,194176,194638,194639,196285,196322,196608,196622,196749,196751,197234,197235,199254,199256,199284,199285,208992,208993,213672,213674,218976,218977,220355,220357,229376,229392,230384,230385,231275,231277,231305,231306,231328,231330,231335,231336,231341,231343,231355,231356,231371,231373,231378,231379,231781,231783,231789,231790,231814,231816,231821,231822,234200,234202,234251,234252,234255,234259,234265,234266,234529,234531,234543,234544,234702,234706,234717,234718,234744,234748,234754,234755,236209,236211,236241,236242,236246,236247,237012,237015,241472,241474,243673,243674,246278,246279,247429,247430,248624,248625,249071,249073,249125,249128,249152,249153,249155,249156,249157,249158,249159,249160,249190,249191,251295,251297,251313,251314,251707,251709,251718,251719,254882,254885,254923,254924,255281,255282,255801,255802,255982,256000,256071,256072,257428,257437,257767,257768,260921,260922,262144,262158,263557,263562,263563,263564,263565,263566,263567,263568,263569,263570,263571,263572,263573,263575,265599,265600,269566,269568,269675,269676,269677,269678,269686,269687,271240,271241,271267,271268,271269,271270,271272,271273,271274,271275,271304,271305,273119,273120,277018,277019,280489,280490,285388,285389,285752,285753,287772,287773,288331,288333,288350,288351,294912,294928,294929,294930,299644,299645,303456,303457,303659,303660,304242,304243,324775,324776,325566,325567,327140,327141,327680,327694,330858,330859,330861,330862,333175,333176,340219,340220,340877,340878,344234,344235,345271,345272,346815,346816,350962,350963,353246,353247,353772,353773,354568,354569,354618,354619,356301,356302,356303,356304,356306,356307,356311,356312,356424,356425,359398,359399,359422,359423,360448,360462,363850,363851,370531,370532,370550,370568,370571,370572,371327,371328,376422,376423,386358,386359,393216,393230,397323,397324,397451,397452,397627,397628,412666,412667,413331,413332,425202,425203,425984,425998,428312,428313,445524,445525,452622,452623,453225,453226,458752,458766,473703,473704,485105,485106,485584,485585,491520,491534,495396,495397,495803,495804,495827,495828,495840,495841,495848,495849,495888,495889,495911,495912,495978,495981,495983,495984,495986,495987,496048,496049,496052,496057,496058,496059,496060,496061,496062,496063,496857,496858,496864,496865,497418,497422,497423,497424,497425,497426,497427,497428,497429,497430,497431,497432,497433,497434,497435,497436,497437,497440,498898,498900,499039,499040,499043,499045,499303,499304,499306,499308,499847,499848,499863,499864,499880,499881,500027,500028,500037,500039,501355,501356,506296,506298,515163,515164,523031,523032,524288,524302,525132,525133,525746,525747,529388,529389,534585,534586,536828,536829,546420,546920,546992,547271,547300,547302,548215,548216,548223,548224,548236,548237,548970,548971,548975,548976,549081,549082,549096,549097,557056,557070,557813,557814,557856,557857,557874,557875,563883,563884,564296,564297,564499,564500,564528,564529,564553,564554,564826,564827,565116,565124,569335,569336,570581,570582,573948,573949,574247,574248,575577,575578,579461,579462,579620,579621,580464,580465,580815,580816,581707,581708,585359,585360,588153,588154,588209,588210,588270,588271,588568,588569,588673,588674,589824,589838,593375,593376,593437,593438,594276,594287,594932,594933,598620,598621,606552,606553,606894,606940,699518,699531,699536,711078,711217,711250,758761,758762,758764,758765,758766,758767,758768,758769,758771,758772,758773,758774,758778,758779,758780,758781,758782,758783,758785,758786,758787,758788,758794,758795,758802,758803,758805,758806,758807,758808,758809,758810,758812,758813,758814,758815,758816,758817,758819,758820,758821,758822,758823,758824,758826,758827,758830,758831,758833,758834,758835,758836,769144,769145,776070,776071,777570,777571,777744,777745,777848,777849,780830,780831,783571,783572,786432,786518,796007,796008,811776,811777,817128,817129,819200,819268,826333,826334,827395,827397,827512,827513,830714,830716,834478,834479,835544,835546,835572,917055,917504,917508,917518,917524,919841,934417,934609,934610") == "c2211b7a15b19fb12038a0a2abd90ebee9bf8aaf" || 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"), "930,1,30,40,50,52,56,1989,1990,2015,2016,2058,2059,22422,22423,23141,23142,24154,24155,30320,30321,30467,30468,31409,31410,32768,32784,35690,35691,36514,36515,37868,37869,38304,38305,39543,39544,39790,39791,41081,41082,41174,41175,41372,41373,41596,41597,65536,65550,67240,67241,68405,68407,68765,68767,68782,68783,68943,68945,68955,68956,68985,68987,68993,68994,69003,69005,69010,69011,70197,70201,70236,70237,70243,70245,70250,70251,70256,70258,70263,70264,70275,70277,70282,70283,70477,70479,70489,70490,70493,70494,70514,70516,70521,71775,73081,73083,73112,73113,73121,73123,73128,73129,73135,73137,73142,73143,76429,76431,76474,76475,76603,76605,76613,76614,76876,76877,77070,77072,77089,77090,79825,79827,79874,79875,80286,80288,80306,80307,80555,80556,81311,81313,81331,81332,81336,81338,81343,81344,81375,81377,81382,81383,82815,82817,82844,82845,83640,83642,83667,83668,83751,83753,83760,83761,89380,89382,94752,94753,95087,95089,95090,95091,95101,95103,95108,95109,95123,95125,95150,95151,95779,95781,95798,95799,97331,97333,97372,97373,97558,97559,97950,97952,97967,97968,98304,98320,100536,100537,101464,101466,101493,101494,114077,114079,114105,114106,130089,130090,131072,131086,136077,136078,139203,139204,139206,139207,139291,139292,139766,139768,139873,139874,141658,141659,143368,143370,143406,143407,143445,143449,143456,143457,145941,145942,146199,146201,146241,146242,148907,148908,149046,149047,150173,150177,150202,150203,152341,152342,153340,153342,153365,153366,154407,154409,154437,154438,154591,154593,154600,154601,155406,155410,155434,155435,157802,157806,157854,157855,160398,160400,160440,160441,160474,160476,160481,160482,160485,160489,160495,160496,163059,163060,163122,163124,163131,163132,163176,163178,163183,164783,164827,164828,165077,165081,165093,165094,165113,165115,165120,165121,165164,165166,165171,165172,167552,167554,167594,167595,167711,167713,167720,167721,167790,167792,167798,167799,168065,168067,168078,168079,174829,174830,176243,176245,178869,178870,181553,181555,181560,181561,182073,182075,182091,182092,187029,187033,187106,187107,190765,190841,190843,190844,192648,192650,192739,192740,192748,192750,192755,192756,193381,193383,193400,193401,194135,194137,194156,194157,194168,194170,194175,194176,194638,194639,196285,196322,196608,196622,196749,196751,197234,197235,199254,199256,199284,199285,208992,208993,213672,213674,218976,218977,220355,220357,229376,229392,230384,230385,231275,231277,231305,231306,231328,231330,231335,231336,231341,231343,231355,231356,231371,231373,231378,231379,231781,231783,231789,231790,231814,231816,231821,231822,234200,234202,234251,234252,234255,234259,234265,234266,234529,234531,234543,234544,234702,234706,234717,234718,234744,234748,234754,234755,236209,236211,236241,236242,236246,236247,237012,237015,241472,241474,243673,243674,246278,246279,247429,247430,248624,248625,249071,249073,249125,249128,249152,249153,249155,249156,249157,249158,249159,249160,249190,249191,251295,251297,251313,251314,251707,251709,251718,251719,254882,254885,254923,254924,255281,255282,255801,255802,255982,256000,256071,256072,257428,257437,257767,257768,260921,260922,262144,262158,263557,263562,263563,263564,263565,263566,263567,263568,263569,263570,263571,263572,263573,263575,265599,265600,269566,269568,269675,269676,269677,269678,269686,269687,271240,271241,271267,271268,271269,271270,271272,271273,271274,271275,271304,271305,273119,273120,277018,277019,280489,280490,285388,285389,285752,285753,287772,287773,288331,288333,288350,288351,294912,294928,294929,294930,299644,299645,303456,303457,303659,303660,304242,304243,324775,324776,325566,325567,327140,327141,327680,327694,330858,330859,330861,330862,333175,333176,340219,340220,340877,340878,344234,344235,345271,345272,346815,346816,350962,350963,353246,353247,353772,353773,354568,354569,354618,354619,356301,356302,356303,356304,356306,356307,356311,356312,356424,356425,359398,359399,359422,359423,360448,360462,363850,363851,370531,370532,370550,370568,370571,370572,371327,371328,376422,376423,386358,386359,393216,393230,397323,397324,397451,397452,397627,397628,412666,412667,413331,413332,425202,425203,425984,425998,428312,428313,445524,445525,452622,452623,453225,453226,458752,458766,473703,473704,485105,485106,485584,485585,491520,491534,495396,495397,495803,495804,495827,495828,495840,495841,495848,495849,495888,495889,495911,495912,495978,495981,495983,495984,495986,495987,496048,496049,496052,496057,496058,496059,496060,496061,496062,496063,496857,496858,496864,496865,497418,497422,497423,497424,497425,497426,497427,497428,497429,497430,497431,497432,497433,497434,497435,497436,497437,497440,498898,498900,499039,499040,499043,499045,499303,499304,499306,499308,499847,499848,499863,499864,499880,499881,500027,500028,500037,500039,501355,501356,506296,506298,515163,515164,523031,523032,524288,524302,525132,525133,525746,525747,529388,529389,534585,534586,536828,536829,546420,546920,546992,547271,547300,547302,548215,548216,548223,548224,548236,548237,548970,548971,548975,548976,549081,549082,549096,549097,557056,557070,557813,557814,557856,557857,557874,557875,563883,563884,564296,564297,564499,564500,564528,564529,564553,564554,564826,564827,565116,565124,569335,569336,570581,570582,573948,573949,574247,574248,575577,575578,579461,579462,579620,579621,580464,580465,580815,580816,581707,581708,585359,585360,588153,588154,588209,588210,588270,588271,588568,588569,588673,588674,589824,589838,593375,593376,593437,593438,594276,594287,594932,594933,598620,598621,606552,606553,606894,606940,699518,699531,699536,711078,711217,711250,758761,758762,758764,758765,758766,758767,758768,758769,758771,758772,758773,758774,758778,758779,758780,758781,758782,758783,758785,758786,758787,758788,758794,758795,758802,758803,758805,758806,758807,758808,758809,758810,758812,758813,758814,758815,758816,758817,758819,758820,758821,758822,758823,758824,758826,758827,758830,758831,758833,758834,758835,758836,769144,769145,776070,776071,777570,777571,777744,777745,777848,777849,780830,780831,783571,783572,786432,786518,796007,796008,811776,811777,817128,817129,819200,819268,826333,826334,827395,827397,827512,827513,830714,830716,834478,834479,835544,835546,835572,917055,917504,917508,917518,917524,919841,934417,934609,934610") && 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"), "652,1,221,505,512,522,524,531,532,610,616,624,625,2298,2300,2779,2780,2785,2787,2793,2794,2800,2802,2807,2808,2813,2815,2820,2821,3065,3067,3074,3075,3077,3081,8176,8177,8852,8853,12629,12630,12632,12633,12722,12723,20743,20745,20748,20749,20759,20760,20762,20763,20786,20787,20823,20825,20877,20878,20889,20891,20896,20897,20900,20902,20907,20908,20911,20912,20917,20918,22422,22423,25014,25015,25454,25455,32768,32771,34805,34806,34874,34875,35771,35773,35774,35775,35777,35780,35781,35782,35784,35786,35787,35788,35790,35792,35793,35794,35796,35798,35799,35800,35802,35804,35805,35806,35808,35810,35815,35817,35820,35822,35825,35827,35835,35837,35840,35842,35843,35844,35846,35848,35849,35850,35853,35855,35856,35857,35859,35861,35862,35863,35865,35867,35868,35869,35871,35873,35874,35875,35877,35879,35880,35881,35890,35891,35910,35911,35912,35913,35917,35918,35919,35920,35923,35924,35925,35926,35929,35930,35931,35932,35935,35936,35937,35938,35942,35943,35944,35945,35948,35949,35950,35951,35955,35956,35960,35961,35965,35966,35970,35971,35975,35976,35977,35978,35987,35988,35989,35990,35993,35994,35995,35996,35999,36000,36001,36002,36005,36006,36007,36008,36010,36012,36304,36305,36420,36421,37463,37472,41152,41153,65536,65537,81943,81944,82572,82574,88649,88650,88797,88798,88976,88977,90219,90220,91520,91521,91523,91524,91576,91577,98304,98307,119281,119282,126342,126343,126424,126426,127203,127206,127304,127305,129754,129755,129779,129780,131072,131073,137603,137605,137653,137654,142273,142274,142908,142910,143544,143545,143634,143635,147975,147976,148592,148593,150320,150321,153002,153003,163840,163843,166425,166428,166429,166430,166431,166432,166438,166440,166457,166458,166493,166494,166503,166504,166647,166648,166698,166699,166705,166706,167411,167412,167421,167422,169761,169762,169787,169788,169823,169824,169933,169934,169978,169979,170457,170458,174384,174385,174399,174400,174453,174454,174521,174522,174524,174526,174590,174591,174661,174662,174729,174730,174732,174733,174735,174736,174795,174797,174799,174800,174864,174865,174935,174936,175003,175004,175006,175007,175009,175015,175017,175018,175020,175022,175024,175035,175095,175096,175098,175099,175109,175110,175176,175177,175254,175255,175265,175266,175332,175333,175409,175410,175489,175490,175566,175567,175643,175644,175720,175721,175735,175736,175799,175800,175875,175876,175886,175887,175953,175954,176030,176031,176103,176104,176106,176107,176119,176125,176185,176186,176187,176189,176191,176192,176261,176262,176338,176339,176416,176417,176491,176492,176494,176495,176638,176639,176716,176717,176730,176731,176795,176796,176874,176875,176949,176950,176952,176953,177030,177031,177105,177106,177108,177109,177175,177176,177178,177179,177244,177245,177247,177248,177317,177318,177320,177321,177386,177387,177389,177390,177458,177459,177461,177462,177529,177530,177606,177607,177681,177682,177684,177685,177753,177754,177756,177757,177765,177766,177826,177827,177829,177830,177899,177900,177902,177903,177973,177974,177976,177977,178048,178049,178051,178052,178124,178125,178126,178127,178199,178200,178201,178202,178275,178276,178278,178279,178348,178349,178352,178353,178421,178422,178424,178425,178494,178495,178497,178498,178571,178572,178574,178575,178644,178645,178647,178648,178716,178717,178719,178721,178790,178791,178793,178794,178865,178866,178932,178933,179001,179002,179069,179070,179139,179140,179206,179207,179274,179275,179345,179346,179410,179411,179413,179414,179481,179482,179484,179485,179581,179582,179594,179595,180053,180055,180113,180114,180231,180232,180394,180395,183456,183457,183458,183459,183509,183510,183925,183926,183935,183936,183961,183962,184064,184065,184178,184179,184584,184585,184646,184647,184786,184787,184908,184909,184977,184978,185146,185147,185262,185263,185308,185309,185525,185526,185567,185568,185605,185606,185783,185784,185917,185918,186088,186089,186301,186302,186403,186404,186458,186459,186509,186510,186608,186609,186695,186696,186697,186698,186787,186789,186796,186798,186799,186800,186807,186808,186811,186812,186963,186964,186966,186972,187110,187111,188157,196609,197111,229379,229881,262145,262647,294915,295417,327681,328183,360449,360951,393217,393719,425985,426487,458753,459255,460261,491520,491521,512971,521101,521215,521216") == "ba28c7b8c32bdffc58cca46f7c5e11e514f03dcc" || 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"), "652,1,221,505,512,522,524,531,532,610,616,624,625,2298,2300,2779,2780,2785,2787,2793,2794,2800,2802,2807,2808,2813,2815,2820,2821,3065,3067,3074,3075,3077,3081,8176,8177,8852,8853,12629,12630,12632,12633,12722,12723,20743,20745,20748,20749,20759,20760,20762,20763,20786,20787,20823,20825,20877,20878,20889,20891,20896,20897,20900,20902,20907,20908,20911,20912,20917,20918,22422,22423,25014,25015,25454,25455,32768,32771,34805,34806,34874,34875,35771,35773,35774,35775,35777,35780,35781,35782,35784,35786,35787,35788,35790,35792,35793,35794,35796,35798,35799,35800,35802,35804,35805,35806,35808,35810,35815,35817,35820,35822,35825,35827,35835,35837,35840,35842,35843,35844,35846,35848,35849,35850,35853,35855,35856,35857,35859,35861,35862,35863,35865,35867,35868,35869,35871,35873,35874,35875,35877,35879,35880,35881,35890,35891,35910,35911,35912,35913,35917,35918,35919,35920,35923,35924,35925,35926,35929,35930,35931,35932,35935,35936,35937,35938,35942,35943,35944,35945,35948,35949,35950,35951,35955,35956,35960,35961,35965,35966,35970,35971,35975,35976,35977,35978,35987,35988,35989,35990,35993,35994,35995,35996,35999,36000,36001,36002,36005,36006,36007,36008,36010,36012,36304,36305,36420,36421,37463,37472,41152,41153,65536,65537,81943,81944,82572,82574,88649,88650,88797,88798,88976,88977,90219,90220,91520,91521,91523,91524,91576,91577,98304,98307,119281,119282,126342,126343,126424,126426,127203,127206,127304,127305,129754,129755,129779,129780,131072,131073,137603,137605,137653,137654,142273,142274,142908,142910,143544,143545,143634,143635,147975,147976,148592,148593,150320,150321,153002,153003,163840,163843,166425,166428,166429,166430,166431,166432,166438,166440,166457,166458,166493,166494,166503,166504,166647,166648,166698,166699,166705,166706,167411,167412,167421,167422,169761,169762,169787,169788,169823,169824,169933,169934,169978,169979,170457,170458,174384,174385,174399,174400,174453,174454,174521,174522,174524,174526,174590,174591,174661,174662,174729,174730,174732,174733,174735,174736,174795,174797,174799,174800,174864,174865,174935,174936,175003,175004,175006,175007,175009,175015,175017,175018,175020,175022,175024,175035,175095,175096,175098,175099,175109,175110,175176,175177,175254,175255,175265,175266,175332,175333,175409,175410,175489,175490,175566,175567,175643,175644,175720,175721,175735,175736,175799,175800,175875,175876,175886,175887,175953,175954,176030,176031,176103,176104,176106,176107,176119,176125,176185,176186,176187,176189,176191,176192,176261,176262,176338,176339,176416,176417,176491,176492,176494,176495,176638,176639,176716,176717,176730,176731,176795,176796,176874,176875,176949,176950,176952,176953,177030,177031,177105,177106,177108,177109,177175,177176,177178,177179,177244,177245,177247,177248,177317,177318,177320,177321,177386,177387,177389,177390,177458,177459,177461,177462,177529,177530,177606,177607,177681,177682,177684,177685,177753,177754,177756,177757,177765,177766,177826,177827,177829,177830,177899,177900,177902,177903,177973,177974,177976,177977,178048,178049,178051,178052,178124,178125,178126,178127,178199,178200,178201,178202,178275,178276,178278,178279,178348,178349,178352,178353,178421,178422,178424,178425,178494,178495,178497,178498,178571,178572,178574,178575,178644,178645,178647,178648,178716,178717,178719,178721,178790,178791,178793,178794,178865,178866,178932,178933,179001,179002,179069,179070,179139,179140,179206,179207,179274,179275,179345,179346,179410,179411,179413,179414,179481,179482,179484,179485,179581,179582,179594,179595,180053,180055,180113,180114,180231,180232,180394,180395,183456,183457,183458,183459,183509,183510,183925,183926,183935,183936,183961,183962,184064,184065,184178,184179,184584,184585,184646,184647,184786,184787,184908,184909,184977,184978,185146,185147,185262,185263,185308,185309,185525,185526,185567,185568,185605,185606,185783,185784,185917,185918,186088,186089,186301,186302,186403,186404,186458,186459,186509,186510,186608,186609,186695,186696,186697,186698,186787,186789,186796,186798,186799,186800,186807,186808,186811,186812,186963,186964,186966,186972,187110,187111,188157,196609,197111,229379,229881,262145,262647,294915,295417,327681,328183,360449,360951,393217,393719,425985,426487,458753,459255,460261,491520,491521,512971,521101,521215,521216") && 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"), "134,1,21,37,39,45,46,51,52,54,55,171,173,178,179,191,193,198,199,1043,1044,14743,14744,14762,14763,30434,30435,30716,30717,31096,31097,31847,31848,32768,32782,34958,34959,37281,37282,37305,37306,37352,37354,37360,37361,37568,37569,37576,37577,37718,37719,38823,38824,38831,38833,38996,38997,38998,38999,39001,39002,39016,39017,39020,39022,39038,39039,39045,39046,39084,39086,39097,39098,39106,39109,39524,39525,39896,39897,41382,41383,48156,48157,48160,48161,50190,50192,52205,52206,52207,52208,52747,52748,54151,54152,56125,56126,56162,56164,65536,65547,65548,65593,67088,67089,67091,67092,67695,67697,67745,67746,67869,67871,67880,67881,68164,68165,69801,69803,71293,71294,71487,71490,73215,73217,73309,73310,73358,73359,73996,73998,74239,75418,75450,75451") == "a1d5d9e10be5e8f89a6894a01fcf717df0cccf03" || 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
ifelse (block_image_recover(map_partition("product"), "134,1,21,37,39,45,46,51,52,54,55,171,173,178,179,191,193,198,199,1043,1044,14743,14744,14762,14763,30434,30435,30716,30717,31096,31097,31847,31848,32768,32782,34958,34959,37281,37282,37305,37306,37352,37354,37360,37361,37568,37569,37576,37577,37718,37719,38823,38824,38831,38833,38996,38997,38998,38999,39001,39002,39016,39017,39020,39022,39038,39039,39045,39046,39084,39086,39097,39098,39106,39109,39524,39525,39896,39897,41382,41383,48156,48157,48160,48161,50190,50192,52205,52206,52207,52208,52747,52748,54151,54152,56125,56126,56162,56164,65536,65547,65548,65593,67088,67089,67091,67092,67695,67697,67745,67746,67869,67871,67880,67881,68164,68165,69801,69803,71293,71294,71487,71490,73215,73217,73309,73310,73358,73359,73996,73998,74239,75418,75450,75451") && 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"), "12,1,6,2019,2025,2026,2027,2035,2036,32231,32745,32767,32768") == "af42597d658d1483101ea2f056c0fa396d1bd3c0" || 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
ifelse (block_image_recover(map_partition("odm"), "12,1,6,2019,2025,2026,2027,2035,2036,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;
if (range_sha1(map_partition("system_ext"), "274,1,46,53,55,61,62,68,70,75,76,90,92,97,98,156,158,165,166,172,174,179,180,374,376,382,383,386,388,395,396,399,400,406,408,413,414,436,438,443,444,1155,1157,1177,1178,1182,1184,1189,1190,1192,1193,1204,1206,1211,1212,1222,1223,1228,1230,1236,1237,1241,1245,1251,1252,1259,1261,1266,1267,1279,1281,1286,1287,1289,1292,1302,1305,1314,1317,1351,1354,1377,1380,1402,1405,1423,1426,1446,1447,1538,1540,1543,1544,1556,1557,1558,1559,1560,1561,1568,1569,1592,1593,1637,1642,1645,1648,1651,1654,1657,1659,1662,1663,1666,1669,1674,1675,1678,1680,1756,1757,1758,1759,1767,1768,2152,2154,2349,2350,2356,2357,2458,2459,2501,2502,3669,3670,4269,4270,4289,4290,4898,4899,5943,5944,6705,6706,7531,7532,7746,7747,8056,8057,13116,13117,13212,13213,13217,13218,13266,13267,13316,13317,13373,13374,13633,13634,13738,13739,13789,13790,18466,18467,18474,18475,18523,18524,18527,18528,18535,18536,18540,18541,18678,18679,18804,18805,18958,18959,19688,19689,23032,23033,26756,26757,27665,27666,32653,32654,32768,32806,32807,32812,32887,32888,33206,33207,34133,34134,35268,35269,39996,39997,40853,40855,40902,40904,40909,40910,41724,41726,41743,41744,42518,42520,42539,42540,42583,42585,42591,42592,44172,44174,44193,44194,44843,44845,44871,44872,52453,52454,55946,55948,62063,62064,62746,62748,62766,62767,62794,62796,62801,62802,62830,62834,62840,62841,63635,63637,63662,63663,63670,63672,63677,63678,63956,63960,63971,63974,64000,64003,64214,65234,65262,65263") == "fa408228f6a1fcb8f7080b484d92062e7468f8bd" || block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat")) then
ui_print("Verified system_ext image...");
else
check_first_block(map_partition("system_ext"));
ifelse (block_image_recover(map_partition("system_ext"), "274,1,46,53,55,61,62,68,70,75,76,90,92,97,98,156,158,165,166,172,174,179,180,374,376,382,383,386,388,395,396,399,400,406,408,413,414,436,438,443,444,1155,1157,1177,1178,1182,1184,1189,1190,1192,1193,1204,1206,1211,1212,1222,1223,1228,1230,1236,1237,1241,1245,1251,1252,1259,1261,1266,1267,1279,1281,1286,1287,1289,1292,1302,1305,1314,1317,1351,1354,1377,1380,1402,1405,1423,1426,1446,1447,1538,1540,1543,1544,1556,1557,1558,1559,1560,1561,1568,1569,1592,1593,1637,1642,1645,1648,1651,1654,1657,1659,1662,1663,1666,1669,1674,1675,1678,1680,1756,1757,1758,1759,1767,1768,2152,2154,2349,2350,2356,2357,2458,2459,2501,2502,3669,3670,4269,4270,4289,4290,4898,4899,5943,5944,6705,6706,7531,7532,7746,7747,8056,8057,13116,13117,13212,13213,13217,13218,13266,13267,13316,13317,13373,13374,13633,13634,13738,13739,13789,13790,18466,18467,18474,18475,18523,18524,18527,18528,18535,18536,18540,18541,18678,18679,18804,18805,18958,18959,19688,19689,23032,23033,26756,26757,27665,27666,32653,32654,32768,32806,32807,32812,32887,32888,33206,33207,34133,34134,35268,35269,39996,39997,40853,40855,40902,40904,40909,40910,41724,41726,41743,41744,42518,42520,42539,42540,42583,42585,42591,42592,44172,44174,44193,44194,44843,44845,44871,44872,52453,52454,55946,55948,62063,62064,62746,62748,62766,62767,62794,62796,62801,62802,62830,62834,62840,62841,63635,63637,63662,63663,63670,63672,63677,63678,63956,63960,63971,63974,64000,64003,64214,65234,65262,65263") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

# ---- start making changes here ----


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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/abl.elf", "/dev/block/bootdevice/by-name/ablbak");

# --- Start patching dynamic partitions ---


# Patch partition system

ui_print("Patching system image after verification.");
show_progress(0.500000, 0);
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.");

# Update dynamic partition metadata

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

# Patch partition vendor

ui_print("Patching vendor image after verification.");
show_progress(0.100000, 0);
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.");

# Patch partition product

ui_print("Patching product image after verification.");
show_progress(0.100000, 0);
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 odm

ui_print("Patching odm image after verification.");
show_progress(0.100000, 0);
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.");

# Patch partition system_ext

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

# --- End patching dynamic partitions ---

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:619e46e943f8b2be0242fb631e213bac3d05330e"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:03a81ed2d268a01835b47367b03a13ec2ee594e5"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:03a81ed2d268a01835b47367b03a13ec2ee594e5")));

# ---- 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");
package_extract_file("firmware-update/vbmeta_system.img", "/dev/block/bootdevice/by-name/vbmeta_system");
set_progress(1.000000);
