getprop("ro.product.device") == "lancelot" || abort("E3004: This package is for \"lancelot\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/lancelot/lancelot:10/QP1A.190711.020/V11.0.3.0.QJCCNXM:user/release-keys");
ui_print("Target: Redmi/lancelot/lancelot:10/QP1A.190711.020/V11.0.4.0.QJCCNXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/lancelot/lancelot:10/QP1A.190711.020/V11.0.3.0.QJCCNXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/lancelot/lancelot:10/QP1A.190711.020/V11.0.4.0.QJCCNXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/lancelot/lancelot:10/QP1A.190711.020/V11.0.3.0.QJCCNXM:user/release-keys or Redmi/lancelot/lancelot:10/QP1A.190711.020/V11.0.4.0.QJCCNXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 10);
patch_partition_check("EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:4bb9e10dcaf04b0b085685d43dff8674d8f2e63b",
                      "EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:aa40eae3a7ba184736ecee3da0f1cb212bb0a174") ||
    abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:4bb9e10dcaf04b0b085685d43dff8674d8f2e63b\" or \"EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:aa40eae3a7ba184736ecee3da0f1cb212bb0a174\" has unexpected contents.");
apply_patch_space(67108864) || abort("E3006: Not enough free space on /cache to apply patches.");
patch_partition_check("EMMC:/dev/block/platform/bootdevice/by-name/md1img:59009216:35c9a2a10856061157011495c78fe230a6a137ac",
                      "EMMC:/dev/block/platform/bootdevice/by-name/md1img:59009216:7a82988595afe1c9947a146a07126dc3d8810c88") ||
    abort("E3005: \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:59009216:35c9a2a10856061157011495c78fe230a6a137ac\" or \"EMMC:/dev/block/platform/bootdevice/by-name/md1img:59009216:7a82988595afe1c9947a146a07126dc3d8810c88\" has unexpected contents.");
apply_patch_space(59009216) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1(map_partition("system"), "890,1,205,233,240,490,494,510,511,32768,32770,32941,32959,34115,34117,34132,34134,34140,34141,34483,34485,34500,34501,34656,34658,34668,34669,34685,34687,34693,34694,34707,34709,34715,34716,34725,34727,34733,34734,34766,34767,35670,35674,35705,35706,35712,35714,35720,35721,35765,35769,35777,35778,38774,38775,41352,41353,41364,41366,41372,41373,41376,41377,41394,41396,41402,44171,45445,45447,45476,45477,45485,45487,45493,45494,45496,45497,45650,45652,45660,45661,48940,48942,48985,48986,48988,48990,48996,48997,49125,49127,49135,49136,49539,49541,49558,49559,51560,51562,51592,51593,52252,52254,52278,52279,55970,55971,56132,56133,56204,56206,56213,56214,56691,56693,56711,56712,58889,58891,58923,58924,58960,58962,58968,58969,59052,59054,59062,59063,63706,63708,65536,65554,68329,68330,68605,68607,68621,68622,68632,68634,68640,68641,68654,68656,68680,68681,68987,68989,69002,69003,69625,69627,69645,69646,69819,69821,69830,69831,71362,71364,71403,71404,71775,71776,72170,72172,72187,72188,73802,73803,74728,74730,74757,74758,82279,82281,82388,82389,84254,84256,84264,84265,84304,84306,84313,84314,94094,94096,94201,94202,94278,94280,94286,94287,94324,94328,94335,94336,97123,97125,97145,97146,98304,98306,98477,98495,98732,98733,98872,98873,99223,99225,99241,99242,101179,101180,101599,101602,101939,101943,101959,101960,102964,102966,102990,102991,103231,103233,103243,103244,103246,103248,103254,103255,103257,103259,103265,103266,103315,103317,103324,103325,103328,103332,103339,103340,105900,105901,105959,105961,105969,105970,106014,106016,106022,106600,106628,106630,106636,106637,106873,106877,106889,106890,106924,106926,106932,106933,108167,108169,108195,108196,108313,108315,108323,108324,108390,108392,108399,108400,108666,108668,108679,108680,116848,116850,119477,119478,123714,123716,123792,123793,123801,123803,123809,123810,124016,124018,124028,124029,124728,124730,124748,124749,124760,124762,124768,124769,125559,125563,125581,125582,126527,126529,126555,126556,131072,131090,145584,145586,150793,150794,151687,151689,151718,151719,151741,151743,151749,151750,151754,151756,151766,151767,152169,152171,152178,152179,152203,152205,152211,152212,154585,154587,154637,154638,154904,154906,154918,154919,155077,155081,155092,155093,155366,155368,155382,155383,155443,155445,155452,155453,155503,155505,155514,155515,155541,155545,155552,155553,155558,155560,155566,155567,157030,157032,157062,157063,157067,157069,157075,157076,157972,157975,162432,162434,163840,163842,164013,164031,164825,164826,165987,165989,166017,166020,168179,168181,168198,168199,168575,168577,168587,168588,171215,171216,171687,171688,173442,173443,173880,173881,175700,175701,178222,178224,178225,178227,178228,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178243,179449,179450,182745,182746,183412,183413,187584,187585,196608,196626,198335,198336,201688,201689,202252,202254,202272,202273,210000,210001,214019,214020,228450,228451,229207,229208,229376,229378,229549,229567,231769,231770,240072,240073,240689,240690,243269,243270,245781,245782,247976,247977,248772,248773,252961,252962,256512,256513,261256,261257,262075,262076,262144,262162,267188,267189,275924,275925,284980,284981,285300,285301,285306,285307,285317,285318,285322,285323,285369,285370,285403,285404,285473,285474,285480,285481,285539,285540,285543,285548,285549,285550,285551,285552,285553,285554,286333,286334,286340,286341,286804,286806,287269,287271,287272,287273,287274,287275,287276,287277,287278,287279,287280,287281,287282,287283,287284,287285,287286,287289,288209,288211,288295,288297,288298,288299,288300,288301,288302,288303,288304,288305,288311,288312,288315,288317,288575,288576,288583,288585,289097,289098,289107,289108,289375,289376,289483,289484,289503,289505,290821,290822,294912,294914,295085,295103,304711,304712,312595,312596,314626,314627,315096,315097,320188,320189,327680,327698,338238,338239,338407,338408,344443,344444,360448,360466,367187,367188,380601,381066,381138,381412,381442,381444,382474,382475,382495,382496,391475,391476,393216,393234,399229,399230,403549,403550,403880,403881,404162,404164,404196,404197,404237,404238,410405,410406,417369,417370,422228,422229,425805,425806,425984,426002,431178,431179,431539,431540,431710,431711,432941,432942,437609,437610,439818,439819,440195,440197,440239,440240,440273,440274,440592,440593,451056,451057,455707,455708,458752,458770,472267,472268,479472,479473,485560,485562,491520,491538,499129,499130,508408,508409,510018,510019,514888,514889,522140,522141,524288,524308,524550,524553,526421,526422,526636,526637,530479,530480,537870,537883,537888,541902,542049,542082,557056,557133,589824,589937,590098,590100,590118,590119,590208,590210,590218,590219,596255,596256,597828,597831,599187,599188,603464,603466,603506,603507,606368,606370,606434,606435,615335,615337,622592,622614,624127,624129,624239,624240,626812,626814,629308,629309,630507,630509,630537,630538,636214,636216,639364,639365,653637,653638,654760,654762,654897,654898,655360,655373,657892,657894,657941,657942,657955,657957,657963,657964,657987,657989,657995,657996,659341,659343,659372,659373,660162,660164,660183,660184,660196,660198,660204,660205,660231,660233,660239,660240,668246,668247,668265,668267,668273,668274,668284,668286,668292,668293,668760,668762,668773,668774,669588,669590,669610,669611,675246,675247,677191,677193,679388,679389,679391,679393,679399,679400,680586,680588,680598,680599,680603,680605,680611,680612,683263,683265,683306,683307,683926,683927,683988,683990,683997,683998,684005,684006,684639,684640,688128,688129,689404,689406,689452,689453,689519,689521,689619,689620,689623,689625,689631,689632,689684,689686,689693,689694,692179,692181,692226,692227,692242,692244,692250,692251,692338,692340,692348,692349,692753,692754,692891,692893,692903,692904,693051,693053,693060,693061,693066,693068,693074,693075,693087,693089,693095,693096,693167,693172,693179,693180,693187,693188,694559,694561,694588,698899,700996,712104,712255,712256") == "41c1873b16032eb704bbca4fb9276a6c4f6b2311" || 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"), "890,1,205,233,240,490,494,510,511,32768,32770,32941,32959,34115,34117,34132,34134,34140,34141,34483,34485,34500,34501,34656,34658,34668,34669,34685,34687,34693,34694,34707,34709,34715,34716,34725,34727,34733,34734,34766,34767,35670,35674,35705,35706,35712,35714,35720,35721,35765,35769,35777,35778,38774,38775,41352,41353,41364,41366,41372,41373,41376,41377,41394,41396,41402,44171,45445,45447,45476,45477,45485,45487,45493,45494,45496,45497,45650,45652,45660,45661,48940,48942,48985,48986,48988,48990,48996,48997,49125,49127,49135,49136,49539,49541,49558,49559,51560,51562,51592,51593,52252,52254,52278,52279,55970,55971,56132,56133,56204,56206,56213,56214,56691,56693,56711,56712,58889,58891,58923,58924,58960,58962,58968,58969,59052,59054,59062,59063,63706,63708,65536,65554,68329,68330,68605,68607,68621,68622,68632,68634,68640,68641,68654,68656,68680,68681,68987,68989,69002,69003,69625,69627,69645,69646,69819,69821,69830,69831,71362,71364,71403,71404,71775,71776,72170,72172,72187,72188,73802,73803,74728,74730,74757,74758,82279,82281,82388,82389,84254,84256,84264,84265,84304,84306,84313,84314,94094,94096,94201,94202,94278,94280,94286,94287,94324,94328,94335,94336,97123,97125,97145,97146,98304,98306,98477,98495,98732,98733,98872,98873,99223,99225,99241,99242,101179,101180,101599,101602,101939,101943,101959,101960,102964,102966,102990,102991,103231,103233,103243,103244,103246,103248,103254,103255,103257,103259,103265,103266,103315,103317,103324,103325,103328,103332,103339,103340,105900,105901,105959,105961,105969,105970,106014,106016,106022,106600,106628,106630,106636,106637,106873,106877,106889,106890,106924,106926,106932,106933,108167,108169,108195,108196,108313,108315,108323,108324,108390,108392,108399,108400,108666,108668,108679,108680,116848,116850,119477,119478,123714,123716,123792,123793,123801,123803,123809,123810,124016,124018,124028,124029,124728,124730,124748,124749,124760,124762,124768,124769,125559,125563,125581,125582,126527,126529,126555,126556,131072,131090,145584,145586,150793,150794,151687,151689,151718,151719,151741,151743,151749,151750,151754,151756,151766,151767,152169,152171,152178,152179,152203,152205,152211,152212,154585,154587,154637,154638,154904,154906,154918,154919,155077,155081,155092,155093,155366,155368,155382,155383,155443,155445,155452,155453,155503,155505,155514,155515,155541,155545,155552,155553,155558,155560,155566,155567,157030,157032,157062,157063,157067,157069,157075,157076,157972,157975,162432,162434,163840,163842,164013,164031,164825,164826,165987,165989,166017,166020,168179,168181,168198,168199,168575,168577,168587,168588,171215,171216,171687,171688,173442,173443,173880,173881,175700,175701,178222,178224,178225,178227,178228,178230,178231,178232,178233,178234,178235,178236,178237,178238,178239,178240,178241,178243,179449,179450,182745,182746,183412,183413,187584,187585,196608,196626,198335,198336,201688,201689,202252,202254,202272,202273,210000,210001,214019,214020,228450,228451,229207,229208,229376,229378,229549,229567,231769,231770,240072,240073,240689,240690,243269,243270,245781,245782,247976,247977,248772,248773,252961,252962,256512,256513,261256,261257,262075,262076,262144,262162,267188,267189,275924,275925,284980,284981,285300,285301,285306,285307,285317,285318,285322,285323,285369,285370,285403,285404,285473,285474,285480,285481,285539,285540,285543,285548,285549,285550,285551,285552,285553,285554,286333,286334,286340,286341,286804,286806,287269,287271,287272,287273,287274,287275,287276,287277,287278,287279,287280,287281,287282,287283,287284,287285,287286,287289,288209,288211,288295,288297,288298,288299,288300,288301,288302,288303,288304,288305,288311,288312,288315,288317,288575,288576,288583,288585,289097,289098,289107,289108,289375,289376,289483,289484,289503,289505,290821,290822,294912,294914,295085,295103,304711,304712,312595,312596,314626,314627,315096,315097,320188,320189,327680,327698,338238,338239,338407,338408,344443,344444,360448,360466,367187,367188,380601,381066,381138,381412,381442,381444,382474,382475,382495,382496,391475,391476,393216,393234,399229,399230,403549,403550,403880,403881,404162,404164,404196,404197,404237,404238,410405,410406,417369,417370,422228,422229,425805,425806,425984,426002,431178,431179,431539,431540,431710,431711,432941,432942,437609,437610,439818,439819,440195,440197,440239,440240,440273,440274,440592,440593,451056,451057,455707,455708,458752,458770,472267,472268,479472,479473,485560,485562,491520,491538,499129,499130,508408,508409,510018,510019,514888,514889,522140,522141,524288,524308,524550,524553,526421,526422,526636,526637,530479,530480,537870,537883,537888,541902,542049,542082,557056,557133,589824,589937,590098,590100,590118,590119,590208,590210,590218,590219,596255,596256,597828,597831,599187,599188,603464,603466,603506,603507,606368,606370,606434,606435,615335,615337,622592,622614,624127,624129,624239,624240,626812,626814,629308,629309,630507,630509,630537,630538,636214,636216,639364,639365,653637,653638,654760,654762,654897,654898,655360,655373,657892,657894,657941,657942,657955,657957,657963,657964,657987,657989,657995,657996,659341,659343,659372,659373,660162,660164,660183,660184,660196,660198,660204,660205,660231,660233,660239,660240,668246,668247,668265,668267,668273,668274,668284,668286,668292,668293,668760,668762,668773,668774,669588,669590,669610,669611,675246,675247,677191,677193,679388,679389,679391,679393,679399,679400,680586,680588,680598,680599,680603,680605,680611,680612,683263,683265,683306,683307,683926,683927,683988,683990,683997,683998,684005,684006,684639,684640,688128,688129,689404,689406,689452,689453,689519,689521,689619,689620,689623,689625,689631,689632,689684,689686,689693,689694,692179,692181,692226,692227,692242,692244,692250,692251,692338,692340,692348,692349,692753,692754,692891,692893,692903,692904,693051,693053,693060,693061,693066,693068,693074,693075,693087,693089,693095,693096,693167,693172,693179,693180,693187,693188,694559,694561,694588,698899,700996,712104,712255,712256") && 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"), "202,1,80,785,789,809,810,815,816,1302,1303,1305,1306,1442,1443,1454,1456,1462,1463,1677,1678,1757,1758,1828,1829,2014,2015,2093,2094,2173,2174,2253,2254,3137,3138,4627,4628,7236,7237,8471,8475,8476,8478,32768,32770,32814,32845,32846,32847,34999,35000,42378,42379,44876,44879,54627,54629,54679,54680,54748,54749,55080,55081,55431,55432,55545,55546,56447,56449,59091,59093,59427,59428,59728,59729,59762,59763,59801,59802,65536,65583,79822,79823,82976,84243,84829,84830,96343,96344,97376,97377,97711,97712,98051,98052,98304,98306,98350,98386,98450,98451,102498,102499,120126,120127,122989,122990,127884,127885,131072,131102,136116,136117,137998,137999,149017,149018,155725,155726,161645,161646,161908,161909,162246,162247,162600,162601,162933,162934,163272,163273,163599,163600,163840,163842,163886,163907,163912,163915,164007,164008,164335,164336,164669,164670,165006,165007,165346,165347,165681,165682,166029,166030,166362,166363,166701,166702,166787,166788,167025,167026,167351,167352,167667,167668,167989,167990,168306,168307,168629,168630,168946,168947,169044,169045,173234,173236,173346,173348,173349,173353,173355,173357,173362,173363,173371,173372,173394,173395,173415,173417,173425,173426,178860,178862,180811,180812,181321,181323,183591,186504,186555,186556") == "766d494b2ceb48d05942cb524703456f1389c194" || 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"), "202,1,80,785,789,809,810,815,816,1302,1303,1305,1306,1442,1443,1454,1456,1462,1463,1677,1678,1757,1758,1828,1829,2014,2015,2093,2094,2173,2174,2253,2254,3137,3138,4627,4628,7236,7237,8471,8475,8476,8478,32768,32770,32814,32845,32846,32847,34999,35000,42378,42379,44876,44879,54627,54629,54679,54680,54748,54749,55080,55081,55431,55432,55545,55546,56447,56449,59091,59093,59427,59428,59728,59729,59762,59763,59801,59802,65536,65583,79822,79823,82976,84243,84829,84830,96343,96344,97376,97377,97711,97712,98051,98052,98304,98306,98350,98386,98450,98451,102498,102499,120126,120127,122989,122990,127884,127885,131072,131102,136116,136117,137998,137999,149017,149018,155725,155726,161645,161646,161908,161909,162246,162247,162600,162601,162933,162934,163272,163273,163599,163600,163840,163842,163886,163907,163912,163915,164007,164008,164335,164336,164669,164670,165006,165007,165346,165347,165681,165682,166029,166030,166362,166363,166701,166702,166787,166788,167025,167026,167351,167352,167667,167668,167989,167990,168306,168307,168629,168630,168946,168947,169044,169045,173234,173236,173346,173348,173349,173353,173355,173357,173362,173363,173371,173372,173394,173395,173415,173417,173425,173426,178860,178862,180811,180812,181321,181323,183591,186504,186555,186556") && 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"), "138,1,37,571,575,594,595,597,598,14911,14912,30170,30171,31410,31411,32768,32770,32782,32796,34550,34554,34557,34558,34570,34571,34572,34573,34618,34619,34678,34681,35130,35131,35502,35503,36988,36989,37079,37081,37083,37084,37086,37087,37089,37090,37092,37093,37095,37096,37098,37099,37101,37102,37104,37105,37107,37108,37110,37111,37113,37114,37133,37134,37139,37140,37159,37160,37175,37176,37180,37181,37197,37198,37203,37204,37222,37223,37236,37237,37241,37242,37259,37260,37265,37266,37285,37286,37300,37301,37303,37304,37306,37307,37309,37310,37312,37313,37315,37316,37318,37319,37321,37322,37324,37325,37327,37328,37330,37332,37397,37399,37405,37406,38143,38145,38163,38164,38168,38170,38176,38177,45327,45328,47977,47978,48443,48445,48461,48462,49128,49130,49148,49149,49176,49178,49334,50120,50146,50147") == "f549705830dc04fa7f39aad703a367976bd490bf" || 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"), "138,1,37,571,575,594,595,597,598,14911,14912,30170,30171,31410,31411,32768,32770,32782,32796,34550,34554,34557,34558,34570,34571,34572,34573,34618,34619,34678,34681,35130,35131,35502,35503,36988,36989,37079,37081,37083,37084,37086,37087,37089,37090,37092,37093,37095,37096,37098,37099,37101,37102,37104,37105,37107,37108,37110,37111,37113,37114,37133,37134,37139,37140,37159,37160,37175,37176,37180,37181,37197,37198,37203,37204,37222,37223,37236,37237,37241,37242,37259,37260,37265,37266,37285,37286,37300,37301,37303,37304,37306,37307,37309,37310,37312,37313,37315,37316,37318,37319,37321,37322,37324,37325,37327,37328,37330,37332,37397,37399,37405,37406,38143,38145,38163,38164,38168,38170,38176,38177,45327,45328,47977,47978,48443,48445,48461,48462,49128,49130,49148,49149,49176,49178,49334,50120,50146,50147") && 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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:4bb9e10dcaf04b0b085685d43dff8674d8f2e63b",
                "EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:aa40eae3a7ba184736ecee3da0f1cb212bb0a174",
                package_extract_file("boot.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/platform/bootdevice/by-name/boot:67108864:aa40eae3a7ba184736ecee3da0f1cb212bb0a174");
show_progress(0.600000, 600);

# --- Start patching dynamic partitions ---


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

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

# --- End patching dynamic partitions ---

show_progress(0.100000, 2);
show_mtupdate_stage("/cache/recovery/last_mtupdate_stage");
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "1") ,
(
ui_print("start to update general image");
package_extract_file("logo.bin", "/dev/block/platform/bootdevice/by-name/logo");
package_extract_file("dtbo.img", "/dev/block/platform/bootdevice/by-name/dtbo");
package_extract_file("exaid.img", "/dev/block/platform/bootdevice/by-name/exaid");
ui_print("Patching md1img image...");
show_progress(0.100000, 10);
patch_partition("EMMC:/dev/block/platform/bootdevice/by-name/md1img:59009216:35c9a2a10856061157011495c78fe230a6a137ac",
                "EMMC:/dev/block/platform/bootdevice/by-name/md1img:59009216:7a82988595afe1c9947a146a07126dc3d8810c88",
                package_extract_file("patch/md1img.img.p")) ||
    abort("E3008: Failed to apply patch to EMMC:/dev/block/platform/bootdevice/by-name/md1img:59009216:7a82988595afe1c9947a146a07126dc3d8810c88");
package_extract_file("spmfw.img", "/dev/block/platform/bootdevice/by-name/spmfw");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "1");
),
ui_print("general images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "3") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "2") then

ui_print("start to update alt loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_2");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp2");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk2");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee2");
if get_storage_type() then 
 assert(package_extract_file("preloader_ufs.img", "/dev/block/mmcblk0boot1"));
else 
 assert(set_emmc_writable("/sys/block/mmcblk0boot1/force_ro"),
        package_extract_file("preloader_emmc.img", "/dev/block/mmcblk0boot1"));
endif;
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "2");
endif;

switch_active("sspm_1", "sspm_2");
switch_active("scp1", "scp2");
switch_active("lk", "lk2");
switch_active("tee1", "tee2");
switch_active("preloader", "preloader2");
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "3");
),
ui_print("alt loder images are already updated");
);
ifelse (
less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "5") ,
(
if less_than_int(get_mtupdate_stage("/cache/recovery/last_mtupdate_stage"), "4") then

ui_print("start to update main loader image");
package_extract_file("sspm.img", "/dev/block/platform/bootdevice/by-name/sspm_1");
package_extract_file("scp.img", "/dev/block/platform/bootdevice/by-name/scp1");
package_extract_file("lk.img", "/dev/block/platform/bootdevice/by-name/lk");
package_extract_file("tee.img", "/dev/block/platform/bootdevice/by-name/tee1");
if get_storage_type() then 
 assert(package_extract_file("preloader_ufs.img", "/dev/block/mmcblk0boot0"));
else 
 assert(set_emmc_writable("/sys/block/mmcblk0boot0/force_ro"),
        package_extract_file("preloader_emmc.img", "/dev/block/mmcblk0boot0"));
endif;
set_mtupdate_stage("/cache/recovery/last_mtupdate_stage", "4");
endif;

switch_active("sspm_2", "sspm_1");
switch_active("scp2", "scp1");
switch_active("lk2", "lk");
switch_active("tee2", "tee1");
switch_active("preloader2", "preloader");
),
ui_print("main loader images are already updated");
);
delete("/cache/recovery/last_mtupdate_stage");
package_extract_file("vbmeta_system.img", "/dev/block/platform/bootdevice/by-name/vbmeta_system");
package_extract_file("vbmeta.img", "/dev/block/platform/bootdevice/by-name/vbmeta");
package_extract_file("vbmeta_vendor.img", "/dev/block/platform/bootdevice/by-name/vbmeta_vendor");
post_ota_action();
