getprop("ro.product.device") == "monet" || abort("E3004: This package is for \"monet\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/monet_global/monet:11/RKQ1.200826.002/V12.5.5.0.RJIMIXM:user/release-keys");
ui_print("Target: Xiaomi/monet_global/monet:11/RKQ1.200826.002/V12.5.6.0.RJIMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/monet_global/monet:11/RKQ1.200826.002/V12.5.5.0.RJIMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/monet_global/monet:11/RKQ1.200826.002/V12.5.6.0.RJIMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/monet_global/monet:11/RKQ1.200826.002/V12.5.5.0.RJIMIXM:user/release-keys or Xiaomi/monet_global/monet:11/RKQ1.200826.002/V12.5.6.0.RJIMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:f20fdeced6566472b7842d8e276d295e4afa1798"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:95b38da92df0619c187510e050fd3afa75147255")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:f20fdeced6566472b7842d8e276d295e4afa1798"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:95b38da92df0619c187510e050fd3afa75147255"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "192,1,35,46,56,58,62,90,91,21344,21345,21375,21376,27540,27541,28955,56670,56677,56678,57981,57982,59103,59104,60834,60835,61670,61671,62878,62879,63030,63031,63955,63956,65536,65555,68339,68340,69325,69326,70691,70692,71141,71142,73311,73312,73573,73574,73666,73667,73917,73918,74134,74136,74274,74278,74286,74287,74299,74303,74307,75757,75762,75763,75773,75784,75790,75796,75797,75798,75803,75809,75810,75811,79307,79311,79351,79352,79784,79801,79818,79819,79833,79834,79919,79921,79926,79928,80010,80011,80054,80055,80115,80120,80197,80201,80202,80206,80261,80264,80265,80268,80294,80296,80309,80310,80316,80317,80318,80321,80452,80453,80921,80922,82850,82852,82860,82861,82883,82884,82888,82889,83322,83323,83447,83448,83479,83485,83486,83487,83796,83800,83808,83809,83929,83935,83936,90527,90541,90547,90548,90549,94209,94210,96256,96260,96325,96326,97414,97418,97439,97440,97569,97573,97579,97580,98058,98062,98078,98079,98304,98325,103954,103958,104050,104051,104078,104079,104631,104637,104638,104639,106392,106396,106439,106440,106444,106450,106451,106452,106483,106489,106490,106491,108181,108185,108209,655372,655379,679144,681201,691995,692142,692143") == "ea140bf51cde60fcc31236b47be2965c2443a0d7" || 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"), "192,1,35,46,56,58,62,90,91,21344,21345,21375,21376,27540,27541,28955,56670,56677,56678,57981,57982,59103,59104,60834,60835,61670,61671,62878,62879,63030,63031,63955,63956,65536,65555,68339,68340,69325,69326,70691,70692,71141,71142,73311,73312,73573,73574,73666,73667,73917,73918,74134,74136,74274,74278,74286,74287,74299,74303,74307,75757,75762,75763,75773,75784,75790,75796,75797,75798,75803,75809,75810,75811,79307,79311,79351,79352,79784,79801,79818,79819,79833,79834,79919,79921,79926,79928,80010,80011,80054,80055,80115,80120,80197,80201,80202,80206,80261,80264,80265,80268,80294,80296,80309,80310,80316,80317,80318,80321,80452,80453,80921,80922,82850,82852,82860,82861,82883,82884,82888,82889,83322,83323,83447,83448,83479,83485,83486,83487,83796,83800,83808,83809,83929,83935,83936,90527,90541,90547,90548,90549,94209,94210,96256,96260,96325,96326,97414,97418,97439,97440,97569,97573,97579,97580,98058,98062,98078,98079,98304,98325,103954,103958,104050,104051,104078,104079,104631,104637,104638,104639,106392,106396,106439,106440,106444,106450,106451,106452,106483,106489,106490,106491,108181,108185,108209,655372,655379,679144,681201,691995,692142,692143") && 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"), "574,1,28,38,42,47,48,127,135,141,142,1816,1820,1833,2298,2303,2307,2311,2312,2556,2560,2565,2566,2568,2572,2574,2575,2598,2599,2635,2639,2689,2690,2701,2707,2708,2709,2712,2718,2719,2720,2723,2724,4171,4222,4317,4318,4444,4450,6824,6825,16189,16190,17200,17202,17203,17204,17206,17209,17210,17211,17213,17215,17216,17217,17219,17221,17222,17223,17225,17227,17228,17229,17231,17233,17234,17235,17237,17239,17244,17246,17249,17251,17254,17256,17264,17266,17269,17271,17272,17273,17275,17277,17278,17279,17282,17284,17285,17286,17288,17290,17291,17292,17294,17296,17297,17298,17300,17302,17303,17304,17306,17308,17309,17310,17319,17320,17339,17340,17341,17342,17346,17347,17348,17349,17352,17353,17354,17355,17358,17359,17360,17361,17364,17365,17366,17367,17371,17372,17373,17374,17377,17378,17379,17380,17384,17385,17389,17390,17394,17395,17399,17400,17404,17405,17406,17407,17416,17417,17418,17419,17422,17423,17424,17425,17428,17429,17430,17431,17434,17435,17436,17437,17439,17441,17733,17734,17849,17850,18860,18866,32768,32794,61900,61901,62529,62531,65536,65555,68722,68723,75794,75795,75894,75896,76696,76697,77927,77929,77977,77978,82597,82598,83232,83234,83846,83848,84402,84404,84981,84982,85888,85889,85897,85898,85985,85986,90317,90318,90934,90935,92662,92663,98304,98325,108089,108090,108094,108096,108113,108114,108149,108150,108159,108160,108303,108304,108354,108355,108361,108362,109067,109068,109122,109123,109148,109149,109182,109183,109289,109290,109325,109326,109331,109332,109824,109825,113847,113848,113866,113867,113916,113917,113929,113930,113992,113993,113995,113997,114061,114062,114132,114133,114200,114201,114203,114204,114206,114207,114266,114268,114270,114271,114335,114336,114406,114407,114474,114475,114477,114478,114480,114486,114488,114489,114491,114493,114495,114506,114566,114567,114569,114570,114647,114648,114725,114726,114736,114737,114803,114804,114880,114881,114960,114961,115037,115038,115114,115115,115191,115192,115202,115203,115206,115207,115270,115271,115346,115347,115424,115425,115501,115502,115574,115575,115577,115578,115590,115596,115656,115657,115659,115660,115669,115670,115735,115736,115813,115814,115890,115891,115965,115966,116042,116043,116118,116119,116193,116194,116271,116272,116279,116280,116350,116351,116428,116429,116506,116507,116580,116581,116583,116584,116589,116590,116653,116654,116656,116657,116722,116723,116725,116726,116792,116793,116795,116796,116864,116865,116867,116868,116933,116934,116937,116938,116943,116944,117009,117010,117084,117085,117157,117158,117159,117160,117236,117237,117311,117312,117314,117315,117382,117383,117385,117386,117451,117452,117454,117455,117524,117525,117527,117528,117596,117597,117598,117599,117672,117673,117674,117675,117748,117749,117751,117752,117820,117821,117823,117824,117893,117894,117896,117898,117963,117964,117966,117967,118035,118036,118038,118039,118104,118105,118107,118108,118175,118176,118178,118179,118247,118248,118250,118251,118316,118317,118381,118382,118451,118452,118520,118521,118588,118589,118658,118659,118725,118726,118793,118794,118799,118801,118863,118864,118866,118867,118932,118933,118935,118936,119114,119115,119127,119128,119589,119591,119639,119640,129732,129733,129900,129901,130259,130260,130321,130322,130471,130472,130551,130552,130584,130585,130668,130669,130737,130738,130804,130805,130897,130898,130970,130971,131016,131017,131072,131098,131163,131164,131190,131191,131193,131194,131226,131227,131388,131389,131460,131461,131513,131514,131838,131839,131841,131842,131936,131937,132061,132062,132136,132137,132170,132171,132234,132235,132306,132307,132372,132374,132375,132377,132491,132493,132499,132501,132586,132587,133214,133215,133248,393223,393235,399140,400343,406688,406780,406781") == "ab11686479830e594b33721bfb11d0823d9eb669" || 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"), "574,1,28,38,42,47,48,127,135,141,142,1816,1820,1833,2298,2303,2307,2311,2312,2556,2560,2565,2566,2568,2572,2574,2575,2598,2599,2635,2639,2689,2690,2701,2707,2708,2709,2712,2718,2719,2720,2723,2724,4171,4222,4317,4318,4444,4450,6824,6825,16189,16190,17200,17202,17203,17204,17206,17209,17210,17211,17213,17215,17216,17217,17219,17221,17222,17223,17225,17227,17228,17229,17231,17233,17234,17235,17237,17239,17244,17246,17249,17251,17254,17256,17264,17266,17269,17271,17272,17273,17275,17277,17278,17279,17282,17284,17285,17286,17288,17290,17291,17292,17294,17296,17297,17298,17300,17302,17303,17304,17306,17308,17309,17310,17319,17320,17339,17340,17341,17342,17346,17347,17348,17349,17352,17353,17354,17355,17358,17359,17360,17361,17364,17365,17366,17367,17371,17372,17373,17374,17377,17378,17379,17380,17384,17385,17389,17390,17394,17395,17399,17400,17404,17405,17406,17407,17416,17417,17418,17419,17422,17423,17424,17425,17428,17429,17430,17431,17434,17435,17436,17437,17439,17441,17733,17734,17849,17850,18860,18866,32768,32794,61900,61901,62529,62531,65536,65555,68722,68723,75794,75795,75894,75896,76696,76697,77927,77929,77977,77978,82597,82598,83232,83234,83846,83848,84402,84404,84981,84982,85888,85889,85897,85898,85985,85986,90317,90318,90934,90935,92662,92663,98304,98325,108089,108090,108094,108096,108113,108114,108149,108150,108159,108160,108303,108304,108354,108355,108361,108362,109067,109068,109122,109123,109148,109149,109182,109183,109289,109290,109325,109326,109331,109332,109824,109825,113847,113848,113866,113867,113916,113917,113929,113930,113992,113993,113995,113997,114061,114062,114132,114133,114200,114201,114203,114204,114206,114207,114266,114268,114270,114271,114335,114336,114406,114407,114474,114475,114477,114478,114480,114486,114488,114489,114491,114493,114495,114506,114566,114567,114569,114570,114647,114648,114725,114726,114736,114737,114803,114804,114880,114881,114960,114961,115037,115038,115114,115115,115191,115192,115202,115203,115206,115207,115270,115271,115346,115347,115424,115425,115501,115502,115574,115575,115577,115578,115590,115596,115656,115657,115659,115660,115669,115670,115735,115736,115813,115814,115890,115891,115965,115966,116042,116043,116118,116119,116193,116194,116271,116272,116279,116280,116350,116351,116428,116429,116506,116507,116580,116581,116583,116584,116589,116590,116653,116654,116656,116657,116722,116723,116725,116726,116792,116793,116795,116796,116864,116865,116867,116868,116933,116934,116937,116938,116943,116944,117009,117010,117084,117085,117157,117158,117159,117160,117236,117237,117311,117312,117314,117315,117382,117383,117385,117386,117451,117452,117454,117455,117524,117525,117527,117528,117596,117597,117598,117599,117672,117673,117674,117675,117748,117749,117751,117752,117820,117821,117823,117824,117893,117894,117896,117898,117963,117964,117966,117967,118035,118036,118038,118039,118104,118105,118107,118108,118175,118176,118178,118179,118247,118248,118250,118251,118316,118317,118381,118382,118451,118452,118520,118521,118588,118589,118658,118659,118725,118726,118793,118794,118799,118801,118863,118864,118866,118867,118932,118933,118935,118936,119114,119115,119127,119128,119589,119591,119639,119640,129732,129733,129900,129901,130259,130260,130321,130322,130471,130472,130551,130552,130584,130585,130668,130669,130737,130738,130804,130805,130897,130898,130970,130971,131016,131017,131072,131098,131163,131164,131190,131191,131193,131194,131226,131227,131388,131389,131460,131461,131513,131514,131838,131839,131841,131842,131936,131937,132061,132062,132136,132137,132170,132171,132234,132235,132306,132307,132372,132374,132375,132377,132491,132493,132499,132501,132586,132587,133214,133215,133248,393223,393235,399140,400343,406688,406780,406781") && 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"), "146,1,15,3109,3110,3416,3417,3443,3444,6154,6155,9999,10000,10580,10581,12352,12356,12444,12445,12452,12453,12481,15091,15099,15100,15139,15140,23322,23323,31310,31312,31442,31447,32725,32726,32768,32776,34028,34029,34472,34473,35772,35773,36135,36139,36658,36659,36671,36675,36679,36680,38520,38524,38566,38567,38575,39958,41643,41644,41651,41652,41697,41698,41988,41989,41995,41996,42082,42083,42084,42085,44017,44021,44092,44093,44103,48213,57383,57384,61299,61303,61334,61336,61629,61632,65432,65433,65536,65542,75280,75281,84825,84832,86308,86309,91698,91699,98304,98312,103203,103204,103429,103430,103828,103829,104330,104331,104336,104337,104465,104471,104472,104473,104485,104491,104492,104493,112299,112300,113521,113525,114532,114533,115323,115324,117690,117691,130976,130977,131053,131054,131072,131078,133238,133239,149589,149590,149849,149850,150046,150047,151958,301274,302188,306978,307052,307053") == "9ba9190a21a65b59e8b9fe0817192e27efef21c6" || 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"), "146,1,15,3109,3110,3416,3417,3443,3444,6154,6155,9999,10000,10580,10581,12352,12356,12444,12445,12452,12453,12481,15091,15099,15100,15139,15140,23322,23323,31310,31312,31442,31447,32725,32726,32768,32776,34028,34029,34472,34473,35772,35773,36135,36139,36658,36659,36671,36675,36679,36680,38520,38524,38566,38567,38575,39958,41643,41644,41651,41652,41697,41698,41988,41989,41995,41996,42082,42083,42084,42085,44017,44021,44092,44093,44103,48213,57383,57384,61299,61303,61334,61336,61629,61632,65432,65433,65536,65542,75280,75281,84825,84832,86308,86309,91698,91699,98304,98312,103203,103204,103429,103430,103828,103829,104330,104331,104336,104337,104465,104471,104472,104473,104485,104491,104492,104493,112299,112300,113521,113525,114532,114533,115323,115324,117690,117691,130976,130977,131053,131054,131072,131078,133238,133239,149589,149590,149849,149850,150046,150047,151958,301274,302188,306978,307052,307053") && 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,12,13,14,22,23,244,245,247,253,272,273") == "404d7432415610f7786d93849c55644ed7dc8e88" || 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,12,13,14,22,23,244,245,247,253,272,273") && 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"), "220,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,706,763,767,782,783,789,795,796,797,991,995,999,1000,1003,1007,1012,1013,1016,1017,1023,1029,1030,1031,1053,1059,1060,1061,1796,1800,1818,1819,1823,1829,1830,1831,1833,1834,1845,1851,1852,1853,1863,1864,1869,1873,1877,1878,1882,1888,1892,1893,1900,1906,1907,1908,1920,1926,1927,1928,1930,1937,1943,1950,1955,1962,1992,1999,2018,2025,2043,2048,2065,2072,2088,2089,2180,2182,2192,2193,2205,2206,2207,2208,2209,2210,2217,2218,2241,2242,2288,2293,2296,2299,2302,2305,2308,2310,2314,2315,2319,2322,2327,2328,2331,2333,2807,2809,2813,2817,2822,2824,2829,2833,2834,2838,2839,2843,2844,2848,2849,2853,2854,2858,2859,2863,2864,2866,2873,2877,2878,2882,2883,2887,2888,2892,2893,2897,2898,2902,2903,2907,2908,2910,2911,2915,2916,2920,2921,2925,2926,2930,2931,2935,2936,2940,2941,2945,2946,2948,2952,2956,2957,2961,2962,2964,2965,2967,2968,2972,2973,2977,2978,2980,2981,2985,2986,2990,2991,2995,2996,3000,3001,3003,3004,3008,3009,3011,3015,3028,3033,3063,3066,3178,5638,5639,5773,98324,98327,121089,121453,123380,123420,123421") == "6a5037a0eb144d21c07013fec440e5763677be67" || 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"), "220,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,706,763,767,782,783,789,795,796,797,991,995,999,1000,1003,1007,1012,1013,1016,1017,1023,1029,1030,1031,1053,1059,1060,1061,1796,1800,1818,1819,1823,1829,1830,1831,1833,1834,1845,1851,1852,1853,1863,1864,1869,1873,1877,1878,1882,1888,1892,1893,1900,1906,1907,1908,1920,1926,1927,1928,1930,1937,1943,1950,1955,1962,1992,1999,2018,2025,2043,2048,2065,2072,2088,2089,2180,2182,2192,2193,2205,2206,2207,2208,2209,2210,2217,2218,2241,2242,2288,2293,2296,2299,2302,2305,2308,2310,2314,2315,2319,2322,2327,2328,2331,2333,2807,2809,2813,2817,2822,2824,2829,2833,2834,2838,2839,2843,2844,2848,2849,2853,2854,2858,2859,2863,2864,2866,2873,2877,2878,2882,2883,2887,2888,2892,2893,2897,2898,2902,2903,2907,2908,2910,2911,2915,2916,2920,2921,2925,2926,2930,2931,2935,2936,2940,2941,2945,2946,2948,2952,2956,2957,2961,2962,2964,2965,2967,2968,2972,2973,2977,2978,2980,2981,2985,2986,2990,2991,2995,2996,3000,3001,3003,3004,3008,3009,3011,3015,3028,3033,3063,3066,3178,5638,5639,5773,98324,98327,121089,121453,123380,123420,123421") && 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 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.");

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

# 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:f20fdeced6566472b7842d8e276d295e4afa1798"),
                concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:95b38da92df0619c187510e050fd3afa75147255"),
                package_extract_file("boot.img.p")) ||
    abort(concat(        "E3008: Failed to apply patch to ",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:95b38da92df0619c187510e050fd3afa75147255")));

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