getprop("ro.product.device") == "citrus" || abort("E3004: This package is for \"citrus\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.6.0.RJFMIXM:user/release-keys");
ui_print("Target: POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.7.0.RJFMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.6.0.RJFMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.7.0.RJFMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.6.0.RJFMIXM:user/release-keys or POCO/citrus_global/citrus:11/RKQ1.201004.002/V12.5.7.0.RJFMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:8435d4cd0cc5b4b4ef0db5af9b6f7bbd06a243a3"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:15e858c1acb8639f4b532ed5fd8de2c16b026055")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:8435d4cd0cc5b4b4ef0db5af9b6f7bbd06a243a3"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:15e858c1acb8639f4b532ed5fd8de2c16b026055"),"\" has unexpected contents."));
apply_patch_space(100663296) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "1372,1,33,45,55,75,79,107,108,21363,21364,21394,21395,27559,27560,28974,43326,50492,56687,56694,56695,58037,58038,60195,60196,62748,62749,63491,63492,65022,65023,65213,65214,65536,65553,66457,66458,70811,70812,71926,71927,73924,73925,74405,74406,77556,77557,78135,78136,78323,78324,79028,79029,79245,79247,79408,79412,79420,79421,84299,84300,84312,84316,84320,84321,85741,85747,85780,85781,85787,85793,85794,85795,85800,85806,85807,85808,89304,89308,89348,89349,90330,90331,90981,90982,92913,92916,92924,92925,92947,92948,92952,92953,93388,93389,93563,93564,93595,93601,93602,93603,93723,93729,93730,93731,95065,95066,98033,98034,98304,98323,99063,99067,99105,99106,99120,99126,99127,99128,104856,104860,104926,104927,106015,106019,106040,106041,106689,106690,106794,106809,106814,106817,106818,106854,107140,107141,107157,107158,107289,107290,107292,107293,107295,107296,114587,114591,114617,114618,114747,114751,114757,114758,114891,114895,114902,114903,120186,120190,120259,120260,120288,120289,120327,120333,120334,120335,120583,120584,120617,120623,120624,120625,121100,121104,121120,121121,121673,121679,121680,121681,123551,123555,123600,123601,123605,123611,123612,123613,123644,123650,123651,123652,125342,125346,125370,125371,125395,125396,125398,125399,125400,125401,125402,125403,125433,125434,129374,129378,129415,129416,131072,131089,131198,131202,131220,131221,131250,131251,131256,131262,131263,131264,133069,133073,133115,133116,135649,135650,136765,136767,136768,136769,136803,136807,136824,136825,136830,136831,137281,137285,137687,137688,138378,138382,138398,138399,140514,140518,140546,140547,140558,140559,140842,140846,140856,140857,140894,140895,143593,143594,149712,149716,149803,149804,151018,151019,151163,151164,151329,151333,151360,151361,152002,152006,152026,152027,155300,155301,158572,158576,158601,158602,158621,158622,161029,161030,161680,161684,161740,161741,163534,163538,163576,163577,163618,163624,163630,163631,163840,163859,167302,167303,167954,167960,168001,168002,168023,168024,171348,171349,173448,173452,173483,173484,174615,174621,174644,174645,174822,174823,176141,176147,176169,176170,178119,178123,178153,178154,178848,178849,179510,179514,179536,179537,181738,181742,181774,181775,196608,196625,204544,204545,206412,206413,206588,206589,208338,208342,208510,208511,208603,208604,215950,215952,220160,220161,225346,225350,225421,225422,225474,225475,227173,227174,228087,228091,228116,228117,228130,228131,228134,228140,228145,228146,229376,229395,231534,231535,233183,233187,233234,233235,233266,233267,233269,233273,233274,233275,233319,233327,233328,233329,236149,236155,236200,236201,236232,236238,236239,236240,236282,236288,236289,236290,238612,238613,239626,239630,239669,239670,239752,239756,239761,239762,239773,239779,239780,239781,240348,240352,240367,240368,241591,241595,241621,241622,250993,251070,252985,252986,253012,253013,255948,255952,256118,256119,256198,256199,256207,256213,256214,256215,257504,257508,257530,257531,259204,259208,259225,259226,260282,260283,261918,261922,261950,261951,261958,261964,261965,261966,261971,261975,261980,261981,261985,261986,262001,262007,262008,262009,262144,262161,263009,263013,264761,264762,264786,264792,264793,264794,267210,267211,269534,269538,269609,269610,269958,269962,269975,269976,271320,271326,271345,271346,271355,271361,271362,271363,272810,272814,274251,274252,274276,274277,279108,279109,280144,280145,281269,281270,282921,282925,283008,283009,283045,283049,285563,285567,285581,285582,286079,286083,286091,286092,287738,287739,289080,289081,289087,289094,289107,289108,289718,289719,290719,290735,291258,291259,294531,294532,294912,294931,297359,297364,297365,297366,297367,297368,297369,297370,297371,297372,297373,297374,297375,297376,297377,297378,297379,297380,297381,297382,297383,297384,297385,297386,297387,297388,297389,297390,297391,297392,297393,297394,297395,297396,297397,297398,297399,297400,297401,297402,297403,297404,297405,297406,297407,297408,297409,297410,297411,297412,297413,297414,297415,297416,297417,297418,297419,297420,297421,297422,297423,297424,297425,297426,297427,297428,297429,297430,297431,297432,297433,297434,297435,297436,297437,297438,297439,297440,297441,297442,297443,297444,297445,297446,297447,297448,297449,297450,297451,297452,297453,297454,297455,297456,297457,297458,297459,297460,297461,297462,297463,297464,297465,297466,297467,297468,297469,297470,297471,297472,297473,297474,297475,297476,297477,297478,297479,297480,297481,297482,297483,297484,297485,297486,297487,297488,297489,297490,297491,297492,297493,297494,297495,297496,297497,297498,297499,297500,297501,297502,297503,297504,297505,297506,297507,297508,297509,297510,297511,297512,297513,297514,297515,297516,297517,297518,297519,297520,297521,297522,297523,297524,297525,297526,297527,297528,297529,297530,297531,297532,297533,297534,297535,297536,297537,297538,297539,297540,297541,297542,297543,297544,297545,297546,297547,297548,297549,297550,297551,297552,297553,297554,297555,297556,297557,297558,297559,297560,297561,297562,297563,297564,297565,297566,297567,297568,297569,297570,297571,297572,297573,297574,297575,297576,297577,297578,297579,297580,297581,297582,297583,297584,297585,297586,297587,297588,297589,297590,297591,297592,297593,297594,297595,297596,297597,297598,297599,297600,297601,297602,297603,297604,297605,297606,297607,297608,297609,297610,297611,297612,297613,297614,297615,297616,297617,297618,297619,297620,297621,297622,297623,297624,297625,297626,297627,297628,297629,297630,297631,297632,297633,297634,297635,297636,297637,297638,297639,297640,297641,297642,297643,297644,297645,297646,297647,297648,297649,297650,297651,297652,297653,297654,297655,297656,297657,297658,297659,297660,297661,297662,297663,297664,297665,297666,297667,297668,297669,297670,297671,297672,297673,297674,297675,297676,297677,297678,297679,297680,297681,297682,297683,297684,297685,297686,297687,297688,297689,297690,297691,297692,297693,297694,297695,297696,297697,297698,297699,297700,297701,297702,297703,297704,297705,297706,297707,297708,297709,297710,297711,297712,297713,297714,297715,297716,297717,297718,297719,297720,297721,297722,297723,297724,297725,297726,297727,297728,297729,297730,297731,297732,297733,297734,297735,297736,297737,297738,297739,297740,297741,297742,297743,297744,297745,297746,297747,297748,297749,297750,297751,297752,297753,297754,297755,297756,297757,297758,297759,297760,297761,297762,297763,297764,297765,297766,297767,297768,297769,297770,297771,297772,297773,297774,297775,297776,297777,297778,297779,297780,297781,297782,297783,297784,297785,297786,297787,297788,297789,297790,297791,297792,297793,297794,297795,297796,297797,297798,297799,297800,297801,297802,297803,297804,297805,297806,297807,297809,297814,297815,303715,303716,305055,305056,305060,305061,309393,309394,309540,309541,312326,312327,312652,312653,312655,312677,312689,312690,312697,312698,312732,312733,312738,312739,312764,312765,312848,312851,312857,312858,312920,312921,312924,312929,312930,312931,312932,312933,312934,312935,313858,313859,313866,313867,314420,314421,314422,314426,314427,314428,314429,314430,314431,314432,314433,314434,314435,314436,314437,314438,314439,314440,314442,314443,314444,314447,315691,315693,315833,315834,315838,315840,316098,316099,316101,316103,316646,316647,316662,316663,316680,316681,316827,316828,316836,316838,316840,316841,325864,325865,327680,327697,333816,333817,335801,335802,336432,336435,336441,336442,336447,336448,336453,336504,336509,339844,339849,339856,339870,339876,339886,339887,339892,339893,339898,340011,340023,340024,340028,340072,340081,340083,340089,340090,340095,340096,340101,340156,340161,343945,343950,343957,343969,343974,343982,343983,343988,343989,343994,344111,344116,344117,344121,344167,344188,344199,345301,345302,349971,349972,350098,350099,350225,350226,350260,350261,350584,350585,350933,350934,350950,350951,350957,350958,350964,350965,351269,351270,351434,351435,351440,351441,351442,351443,351444,351445,351446,351447,351448,351449,351451,351452,351453,351454,351455,351456,351457,351458,351459,351460,351461,351462,351463,351464,351465,351466,351467,351468,351469,351470,351471,351472,351473,351474,351475,351476,351477,351478,351479,351480,351481,351482,351483,351484,351487,351488,351489,351490,351491,351492,351493,351494,351495,351496,351497,351498,351500,351501,351502,351503,351634,351635,351662,351663,351684,351685,351692,351693,351712,351713,351755,351756,351808,351809,351877,351878,351932,351933,351934,351935,351936,351937,351938,351939,351941,351942,351943,351944,351945,351946,351947,351948,351949,351950,351951,351952,351953,351954,351955,351956,351957,351958,351959,351960,351961,351962,351963,351964,351965,351966,351967,351968,351969,351970,351971,351972,352068,352069,352070,352071,352072,352073,352074,352075,352076,352077,352078,352079,352080,352081,352083,352084,352085,352086,352087,352088,352089,352090,352091,352092,352093,352094,352095,352096,352097,352098,352099,352100,352101,352102,352103,352104,352105,352106,352107,352108,352109,352110,352111,352112,352113,352114,352115,352116,352117,352118,352119,352120,352121,352122,352123,352124,352125,352126,352127,352128,352129,352130,352152,352153,352323,352324,352401,352402,352437,352438,352449,352450,352493,352495,352606,352607,352650,352651,352667,352668,352679,352680,353040,353041,353311,353312,353561,353562,354493,655372,655377,662202,664206,674731,674875,674876") == "1ee0508da4c388e90ba8b57045263630404e4af8" || 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"), "1372,1,33,45,55,75,79,107,108,21363,21364,21394,21395,27559,27560,28974,43326,50492,56687,56694,56695,58037,58038,60195,60196,62748,62749,63491,63492,65022,65023,65213,65214,65536,65553,66457,66458,70811,70812,71926,71927,73924,73925,74405,74406,77556,77557,78135,78136,78323,78324,79028,79029,79245,79247,79408,79412,79420,79421,84299,84300,84312,84316,84320,84321,85741,85747,85780,85781,85787,85793,85794,85795,85800,85806,85807,85808,89304,89308,89348,89349,90330,90331,90981,90982,92913,92916,92924,92925,92947,92948,92952,92953,93388,93389,93563,93564,93595,93601,93602,93603,93723,93729,93730,93731,95065,95066,98033,98034,98304,98323,99063,99067,99105,99106,99120,99126,99127,99128,104856,104860,104926,104927,106015,106019,106040,106041,106689,106690,106794,106809,106814,106817,106818,106854,107140,107141,107157,107158,107289,107290,107292,107293,107295,107296,114587,114591,114617,114618,114747,114751,114757,114758,114891,114895,114902,114903,120186,120190,120259,120260,120288,120289,120327,120333,120334,120335,120583,120584,120617,120623,120624,120625,121100,121104,121120,121121,121673,121679,121680,121681,123551,123555,123600,123601,123605,123611,123612,123613,123644,123650,123651,123652,125342,125346,125370,125371,125395,125396,125398,125399,125400,125401,125402,125403,125433,125434,129374,129378,129415,129416,131072,131089,131198,131202,131220,131221,131250,131251,131256,131262,131263,131264,133069,133073,133115,133116,135649,135650,136765,136767,136768,136769,136803,136807,136824,136825,136830,136831,137281,137285,137687,137688,138378,138382,138398,138399,140514,140518,140546,140547,140558,140559,140842,140846,140856,140857,140894,140895,143593,143594,149712,149716,149803,149804,151018,151019,151163,151164,151329,151333,151360,151361,152002,152006,152026,152027,155300,155301,158572,158576,158601,158602,158621,158622,161029,161030,161680,161684,161740,161741,163534,163538,163576,163577,163618,163624,163630,163631,163840,163859,167302,167303,167954,167960,168001,168002,168023,168024,171348,171349,173448,173452,173483,173484,174615,174621,174644,174645,174822,174823,176141,176147,176169,176170,178119,178123,178153,178154,178848,178849,179510,179514,179536,179537,181738,181742,181774,181775,196608,196625,204544,204545,206412,206413,206588,206589,208338,208342,208510,208511,208603,208604,215950,215952,220160,220161,225346,225350,225421,225422,225474,225475,227173,227174,228087,228091,228116,228117,228130,228131,228134,228140,228145,228146,229376,229395,231534,231535,233183,233187,233234,233235,233266,233267,233269,233273,233274,233275,233319,233327,233328,233329,236149,236155,236200,236201,236232,236238,236239,236240,236282,236288,236289,236290,238612,238613,239626,239630,239669,239670,239752,239756,239761,239762,239773,239779,239780,239781,240348,240352,240367,240368,241591,241595,241621,241622,250993,251070,252985,252986,253012,253013,255948,255952,256118,256119,256198,256199,256207,256213,256214,256215,257504,257508,257530,257531,259204,259208,259225,259226,260282,260283,261918,261922,261950,261951,261958,261964,261965,261966,261971,261975,261980,261981,261985,261986,262001,262007,262008,262009,262144,262161,263009,263013,264761,264762,264786,264792,264793,264794,267210,267211,269534,269538,269609,269610,269958,269962,269975,269976,271320,271326,271345,271346,271355,271361,271362,271363,272810,272814,274251,274252,274276,274277,279108,279109,280144,280145,281269,281270,282921,282925,283008,283009,283045,283049,285563,285567,285581,285582,286079,286083,286091,286092,287738,287739,289080,289081,289087,289094,289107,289108,289718,289719,290719,290735,291258,291259,294531,294532,294912,294931,297359,297364,297365,297366,297367,297368,297369,297370,297371,297372,297373,297374,297375,297376,297377,297378,297379,297380,297381,297382,297383,297384,297385,297386,297387,297388,297389,297390,297391,297392,297393,297394,297395,297396,297397,297398,297399,297400,297401,297402,297403,297404,297405,297406,297407,297408,297409,297410,297411,297412,297413,297414,297415,297416,297417,297418,297419,297420,297421,297422,297423,297424,297425,297426,297427,297428,297429,297430,297431,297432,297433,297434,297435,297436,297437,297438,297439,297440,297441,297442,297443,297444,297445,297446,297447,297448,297449,297450,297451,297452,297453,297454,297455,297456,297457,297458,297459,297460,297461,297462,297463,297464,297465,297466,297467,297468,297469,297470,297471,297472,297473,297474,297475,297476,297477,297478,297479,297480,297481,297482,297483,297484,297485,297486,297487,297488,297489,297490,297491,297492,297493,297494,297495,297496,297497,297498,297499,297500,297501,297502,297503,297504,297505,297506,297507,297508,297509,297510,297511,297512,297513,297514,297515,297516,297517,297518,297519,297520,297521,297522,297523,297524,297525,297526,297527,297528,297529,297530,297531,297532,297533,297534,297535,297536,297537,297538,297539,297540,297541,297542,297543,297544,297545,297546,297547,297548,297549,297550,297551,297552,297553,297554,297555,297556,297557,297558,297559,297560,297561,297562,297563,297564,297565,297566,297567,297568,297569,297570,297571,297572,297573,297574,297575,297576,297577,297578,297579,297580,297581,297582,297583,297584,297585,297586,297587,297588,297589,297590,297591,297592,297593,297594,297595,297596,297597,297598,297599,297600,297601,297602,297603,297604,297605,297606,297607,297608,297609,297610,297611,297612,297613,297614,297615,297616,297617,297618,297619,297620,297621,297622,297623,297624,297625,297626,297627,297628,297629,297630,297631,297632,297633,297634,297635,297636,297637,297638,297639,297640,297641,297642,297643,297644,297645,297646,297647,297648,297649,297650,297651,297652,297653,297654,297655,297656,297657,297658,297659,297660,297661,297662,297663,297664,297665,297666,297667,297668,297669,297670,297671,297672,297673,297674,297675,297676,297677,297678,297679,297680,297681,297682,297683,297684,297685,297686,297687,297688,297689,297690,297691,297692,297693,297694,297695,297696,297697,297698,297699,297700,297701,297702,297703,297704,297705,297706,297707,297708,297709,297710,297711,297712,297713,297714,297715,297716,297717,297718,297719,297720,297721,297722,297723,297724,297725,297726,297727,297728,297729,297730,297731,297732,297733,297734,297735,297736,297737,297738,297739,297740,297741,297742,297743,297744,297745,297746,297747,297748,297749,297750,297751,297752,297753,297754,297755,297756,297757,297758,297759,297760,297761,297762,297763,297764,297765,297766,297767,297768,297769,297770,297771,297772,297773,297774,297775,297776,297777,297778,297779,297780,297781,297782,297783,297784,297785,297786,297787,297788,297789,297790,297791,297792,297793,297794,297795,297796,297797,297798,297799,297800,297801,297802,297803,297804,297805,297806,297807,297809,297814,297815,303715,303716,305055,305056,305060,305061,309393,309394,309540,309541,312326,312327,312652,312653,312655,312677,312689,312690,312697,312698,312732,312733,312738,312739,312764,312765,312848,312851,312857,312858,312920,312921,312924,312929,312930,312931,312932,312933,312934,312935,313858,313859,313866,313867,314420,314421,314422,314426,314427,314428,314429,314430,314431,314432,314433,314434,314435,314436,314437,314438,314439,314440,314442,314443,314444,314447,315691,315693,315833,315834,315838,315840,316098,316099,316101,316103,316646,316647,316662,316663,316680,316681,316827,316828,316836,316838,316840,316841,325864,325865,327680,327697,333816,333817,335801,335802,336432,336435,336441,336442,336447,336448,336453,336504,336509,339844,339849,339856,339870,339876,339886,339887,339892,339893,339898,340011,340023,340024,340028,340072,340081,340083,340089,340090,340095,340096,340101,340156,340161,343945,343950,343957,343969,343974,343982,343983,343988,343989,343994,344111,344116,344117,344121,344167,344188,344199,345301,345302,349971,349972,350098,350099,350225,350226,350260,350261,350584,350585,350933,350934,350950,350951,350957,350958,350964,350965,351269,351270,351434,351435,351440,351441,351442,351443,351444,351445,351446,351447,351448,351449,351451,351452,351453,351454,351455,351456,351457,351458,351459,351460,351461,351462,351463,351464,351465,351466,351467,351468,351469,351470,351471,351472,351473,351474,351475,351476,351477,351478,351479,351480,351481,351482,351483,351484,351487,351488,351489,351490,351491,351492,351493,351494,351495,351496,351497,351498,351500,351501,351502,351503,351634,351635,351662,351663,351684,351685,351692,351693,351712,351713,351755,351756,351808,351809,351877,351878,351932,351933,351934,351935,351936,351937,351938,351939,351941,351942,351943,351944,351945,351946,351947,351948,351949,351950,351951,351952,351953,351954,351955,351956,351957,351958,351959,351960,351961,351962,351963,351964,351965,351966,351967,351968,351969,351970,351971,351972,352068,352069,352070,352071,352072,352073,352074,352075,352076,352077,352078,352079,352080,352081,352083,352084,352085,352086,352087,352088,352089,352090,352091,352092,352093,352094,352095,352096,352097,352098,352099,352100,352101,352102,352103,352104,352105,352106,352107,352108,352109,352110,352111,352112,352113,352114,352115,352116,352117,352118,352119,352120,352121,352122,352123,352124,352125,352126,352127,352128,352129,352130,352152,352153,352323,352324,352401,352402,352437,352438,352449,352450,352493,352495,352606,352607,352650,352651,352667,352668,352679,352680,353040,353041,353311,353312,353561,353562,354493,655372,655377,662202,664206,674731,674875,674876") && 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"), "48,1,31,41,45,50,51,129,137,143,144,1821,1825,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2590,2594,2598,2599,2622,2623,2659,2663,2713,2714,2873,2874,2877,2883,2884,2891,2904,2905,4816,294928,294936,312041,312989,317951,318028,318029") == "8d3d5635dc6c0943984ee4b0c2afd1460d3ee2df" || 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"), "48,1,31,41,45,50,51,129,137,143,144,1821,1825,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2590,2594,2598,2599,2622,2623,2659,2663,2713,2714,2873,2874,2877,2883,2884,2891,2904,2905,4816,294928,294936,312041,312989,317951,318028,318029") && 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"), "372,1,16,3205,3206,6293,6294,6310,6314,6318,6319,11086,11087,11514,11516,13553,13557,13650,13651,14653,14654,16351,16354,16360,16361,16402,16403,24816,24817,32768,32777,34633,34634,35976,35977,36111,36112,36167,36168,37782,37783,38145,38149,38668,38669,38681,38687,38688,38689,40529,40533,40575,40576,41966,41967,51715,51716,55589,55590,55840,55845,55857,55858,55922,55925,56118,56123,56380,56382,59864,59865,65536,65543,69713,69714,79258,79265,80741,80742,86117,86118,89267,89268,98304,98313,98828,98829,98834,98835,98963,98969,98970,98971,98983,98989,98990,98991,106449,106450,107705,107709,108771,108772,112620,112622,126105,126106,126175,126176,128397,128399,131072,131079,148904,148905,150913,150914,158215,158216,163840,163849,164596,164597,168581,168582,168883,168884,168936,168938,168947,168948,169042,169044,169833,169834,169841,169842,169848,169849,174186,174187,174412,174414,174424,174426,174472,174474,174484,174486,174495,174496,176314,176315,176316,176319,179704,179705,179868,179869,179870,179871,179873,179874,179891,179892,179895,179897,179898,179900,179916,179917,179929,179930,179969,179973,179977,179981,179982,179986,179987,180003,180418,180419,180790,180791,182276,182277,182366,182368,182370,182371,182373,182374,182376,182377,182379,182380,182382,182383,182385,182386,182397,182398,182402,182403,182408,182409,182414,182415,182419,182420,182425,182426,182455,182456,182476,182477,182483,182484,182504,182505,182521,182522,182526,182527,182544,182545,182550,182551,182570,182571,182585,182586,182590,182591,182610,182611,182617,182618,182638,182639,182654,182655,182659,182660,182662,182663,182665,182666,182668,182669,182671,182672,183244,183246,185692,185693,196608,196628,196629,196630,203051,203053,204194,204195,212395,212397,213447,213449,215689,215690,215864,215868,215916,215917,215932,215933,216173,216177,216428,216429,224989,224990,228525,228526,228575,228576,229376,229385,230154,230158,230226,230227,230257,230258,230394,230398,230406,230407,231795,231799,231834,231835,231975,231981,231982,231983,231987,231988,232104,232108,232109,232110,233511,233515,236281,236282,237014,237015,243453,243454,247675,247676,249203,249204,249867,249871,249887,249888,251461,251465,251490,251491,262144,262147,262326,262327,287472,287473,287498,287499,287702,287703,288180,288181,288420,288421,289159,289160,289739,289740,289917,289918,290893,290895,291367,291368,292009,292010,294912,294915,294941,294942,295879,295884,298102,298104,301438,301439,308796,313692,313768,313769") == "d2849314a110b127574f142723b0e71945ae8252" || 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"), "372,1,16,3205,3206,6293,6294,6310,6314,6318,6319,11086,11087,11514,11516,13553,13557,13650,13651,14653,14654,16351,16354,16360,16361,16402,16403,24816,24817,32768,32777,34633,34634,35976,35977,36111,36112,36167,36168,37782,37783,38145,38149,38668,38669,38681,38687,38688,38689,40529,40533,40575,40576,41966,41967,51715,51716,55589,55590,55840,55845,55857,55858,55922,55925,56118,56123,56380,56382,59864,59865,65536,65543,69713,69714,79258,79265,80741,80742,86117,86118,89267,89268,98304,98313,98828,98829,98834,98835,98963,98969,98970,98971,98983,98989,98990,98991,106449,106450,107705,107709,108771,108772,112620,112622,126105,126106,126175,126176,128397,128399,131072,131079,148904,148905,150913,150914,158215,158216,163840,163849,164596,164597,168581,168582,168883,168884,168936,168938,168947,168948,169042,169044,169833,169834,169841,169842,169848,169849,174186,174187,174412,174414,174424,174426,174472,174474,174484,174486,174495,174496,176314,176315,176316,176319,179704,179705,179868,179869,179870,179871,179873,179874,179891,179892,179895,179897,179898,179900,179916,179917,179929,179930,179969,179973,179977,179981,179982,179986,179987,180003,180418,180419,180790,180791,182276,182277,182366,182368,182370,182371,182373,182374,182376,182377,182379,182380,182382,182383,182385,182386,182397,182398,182402,182403,182408,182409,182414,182415,182419,182420,182425,182426,182455,182456,182476,182477,182483,182484,182504,182505,182521,182522,182526,182527,182544,182545,182550,182551,182570,182571,182585,182586,182590,182591,182610,182611,182617,182618,182638,182639,182654,182655,182659,182660,182662,182663,182665,182666,182668,182669,182671,182672,183244,183246,185692,185693,196608,196628,196629,196630,203051,203053,204194,204195,212395,212397,213447,213449,215689,215690,215864,215868,215916,215917,215932,215933,216173,216177,216428,216429,224989,224990,228525,228526,228575,228576,229376,229385,230154,230158,230226,230227,230257,230258,230394,230398,230406,230407,231795,231799,231834,231835,231975,231981,231982,231983,231987,231988,232104,232108,232109,232110,233511,233515,236281,236282,237014,237015,243453,243454,247675,247676,249203,249204,249867,249871,249887,249888,251461,251465,251490,251491,262144,262147,262326,262327,287472,287473,287498,287499,287702,287703,288180,288181,288420,288421,289159,289160,289739,289740,289917,289918,290893,290895,291367,291368,292009,292010,294912,294915,294941,294942,295879,295884,298102,298104,301438,301439,308796,313692,313768,313769") && 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("system_ext"), "348,1,31,38,42,46,47,53,59,60,61,75,81,82,83,141,145,150,151,705,707,764,768,783,784,811,817,818,819,1707,1713,1736,1737,1743,1749,1750,1751,1977,1981,1990,1991,2021,2027,2028,2029,2223,2227,2231,2232,2235,2239,2244,2245,2248,2249,2271,2277,2278,2279,2283,2289,2290,2291,2293,2294,2305,2311,2312,2313,2323,2324,2329,2333,2337,2338,2342,2348,2352,2353,2360,2366,2367,2368,2380,2386,2387,2388,2398,2404,2405,2406,2408,2415,2421,2428,2495,2502,2507,2514,2549,2554,2573,2580,2598,2605,2621,2622,2832,2834,2843,2844,2856,2857,2858,2859,2860,2861,2870,2871,2894,2895,2943,2948,2951,2954,2957,2960,2963,2965,2969,2970,2974,2977,2981,2982,3505,3507,3511,3515,3516,3520,3525,3527,3532,3536,3537,3541,3542,3546,3547,3551,3552,3556,3557,3561,3562,3566,3567,3571,3572,3574,3581,3585,3586,3590,3591,3595,3596,3600,3601,3605,3606,3610,3611,3615,3616,3618,3619,3623,3624,3628,3629,3631,3632,3636,3637,3641,3642,3646,3647,3651,3652,3656,3657,3659,3663,3667,3668,3672,3673,3675,3676,3678,3679,3683,3684,3688,3689,3691,3692,3696,3697,3701,3702,3706,3707,3711,3712,3714,3715,3719,3720,3722,3726,3743,3748,3782,3785,3898,6310,6311,7546,7547,8736,8737,9883,9884,11065,11066,11116,11117,11426,11427,16752,16753,16783,16784,16973,16974,17034,17035,17214,17215,17335,17336,17544,17545,22437,22438,22440,22441,22470,22471,22664,22665,22838,22839,22864,22865,22882,22883,22959,22960,22983,22984,23040,23041,23146,23147,28120,28121,28140,28141,28419,28420,28506,28507,28545,28546,28623,28624,28879,28880,32768,32807,37063,37064,44253,44254,45888,45889,45940,45941,46259,46260,48387,48388,54532,54536,56220,56222,56405,56407,56455,56457,58041,58043,65536,65565,66590,66591,66593,66594,66601,66602,66606,66607,66618,66619,66920,66921,66937,66938,66947,66948,68640,68642,73861,73865,74796,74798,74822,98326,98328,118941,119302,121197,121236,121237") == "1f2526afdf40899d6cecb8f92f647eb06d125fa5" || 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"), "348,1,31,38,42,46,47,53,59,60,61,75,81,82,83,141,145,150,151,705,707,764,768,783,784,811,817,818,819,1707,1713,1736,1737,1743,1749,1750,1751,1977,1981,1990,1991,2021,2027,2028,2029,2223,2227,2231,2232,2235,2239,2244,2245,2248,2249,2271,2277,2278,2279,2283,2289,2290,2291,2293,2294,2305,2311,2312,2313,2323,2324,2329,2333,2337,2338,2342,2348,2352,2353,2360,2366,2367,2368,2380,2386,2387,2388,2398,2404,2405,2406,2408,2415,2421,2428,2495,2502,2507,2514,2549,2554,2573,2580,2598,2605,2621,2622,2832,2834,2843,2844,2856,2857,2858,2859,2860,2861,2870,2871,2894,2895,2943,2948,2951,2954,2957,2960,2963,2965,2969,2970,2974,2977,2981,2982,3505,3507,3511,3515,3516,3520,3525,3527,3532,3536,3537,3541,3542,3546,3547,3551,3552,3556,3557,3561,3562,3566,3567,3571,3572,3574,3581,3585,3586,3590,3591,3595,3596,3600,3601,3605,3606,3610,3611,3615,3616,3618,3619,3623,3624,3628,3629,3631,3632,3636,3637,3641,3642,3646,3647,3651,3652,3656,3657,3659,3663,3667,3668,3672,3673,3675,3676,3678,3679,3683,3684,3688,3689,3691,3692,3696,3697,3701,3702,3706,3707,3711,3712,3714,3715,3719,3720,3722,3726,3743,3748,3782,3785,3898,6310,6311,7546,7547,8736,8737,9883,9884,11065,11066,11116,11117,11426,11427,16752,16753,16783,16784,16973,16974,17034,17035,17214,17215,17335,17336,17544,17545,22437,22438,22440,22441,22470,22471,22664,22665,22838,22839,22864,22865,22882,22883,22959,22960,22983,22984,23040,23041,23146,23147,28120,28121,28140,28141,28419,28420,28506,28507,28545,28546,28623,28624,28879,28880,32768,32807,37063,37064,44253,44254,45888,45889,45940,45941,46259,46260,48387,48388,54532,54536,56220,56222,56405,56407,56455,56457,58041,58043,65536,65565,66590,66591,66593,66594,66601,66602,66606,66607,66618,66619,66920,66921,66937,66938,66947,66948,68640,68642,73861,73865,74796,74798,74822,98326,98328,118941,119302,121197,121236,121237") && 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 ---


# Update dynamic partition metadata

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

# Patch partition system

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

# 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 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",":100663296:8435d4cd0cc5b4b4ef0db5af9b6f7bbd06a243a3"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:15e858c1acb8639f4b532ed5fd8de2c16b026055"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":100663296:15e858c1acb8639f4b532ed5fd8de2c16b026055")));

# ---- 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);
