getprop("ro.product.device") == "gauguin" || abort("E3004: This package is for \"gauguin\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.2.0.RJSTRXM:user/release-keys");
ui_print("Target: Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.4.0.RJSTRXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.2.0.RJSTRXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.4.0.RJSTRXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.2.0.RJSTRXM:user/release-keys or Redmi/gauguin/gauguin:11/RKQ1.200826.002/V12.5.4.0.RJSTRXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9bf9e75b6c194192558df42340a32c7ac0d4847b"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:653ba68176f37a83efb2fdb6b180a45ce99b3d48")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:9bf9e75b6c194192558df42340a32c7ac0d4847b"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:653ba68176f37a83efb2fdb6b180a45ce99b3d48"),"\" has unexpected contents."));
apply_patch_space(134217728) || abort("E3006: Not enough free space on /cache to apply patches.");
if (range_sha1(map_partition("system"), "110,1,33,44,54,56,60,88,89,21347,21348,21378,21379,27543,27544,28958,57976,57982,57983,59104,59105,60835,60836,61671,61672,62879,62880,63031,63032,63956,63957,65536,65553,68338,68339,69324,69325,70690,70691,71140,71141,73310,73311,73572,73573,73665,73666,73916,73917,74133,74135,74273,74277,74285,74358,74370,74374,74378,74379,75829,75835,75869,75870,75876,75882,75883,75884,75889,75895,75896,75897,77995,77996,78620,78624,78646,78647,78664,78665,79630,79631,80281,80282,82213,82216,82224,82225,82247,82248,82252,82253,82687,82688,82848,82849,82880,82886,82887,83219,83339,83345,83346,655373,655377,688129,688145,698479,700592,711693,711844,711845") == "f0bacade098b9a3bf18e0aecbc32a822b40be80f" || 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"), "110,1,33,44,54,56,60,88,89,21347,21348,21378,21379,27543,27544,28958,57976,57982,57983,59104,59105,60835,60836,61671,61672,62879,62880,63031,63032,63956,63957,65536,65553,68338,68339,69324,69325,70690,70691,71140,71141,73310,73311,73572,73573,73665,73666,73916,73917,74133,74135,74273,74277,74285,74358,74370,74374,74378,74379,75829,75835,75869,75870,75876,75882,75883,75884,75889,75895,75896,75897,77995,77996,78620,78624,78646,78647,78664,78665,79630,79631,80281,80282,82213,82216,82224,82225,82247,82248,82252,82253,82687,82688,82848,82849,82880,82886,82887,83219,83339,83345,83346,655373,655377,688129,688145,698479,700592,711693,711844,711845") && 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"), "714,1,29,39,43,48,49,128,136,142,143,1817,1821,1834,2299,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2591,2592,2628,2632,2682,2683,2842,2843,2846,2850,2854,2855,2858,2859,3004,3073,5128,5179,5266,5267,5394,5400,7768,7769,16912,16913,17929,17931,17932,17933,17935,17938,17939,17940,17942,17944,17945,17946,17948,17950,17951,17952,17954,17956,17957,17958,17960,17962,17963,17964,17966,17968,17973,17975,17978,17980,17983,17985,17993,17995,17998,18000,18001,18002,18004,18006,18007,18008,18011,18013,18014,18015,18017,18019,18020,18021,18023,18025,18026,18027,18029,18031,18032,18033,18035,18037,18038,18039,18048,18049,18068,18069,18070,18071,18075,18076,18077,18078,18081,18082,18083,18084,18087,18088,18089,18090,18093,18094,18095,18096,18100,18101,18102,18103,18106,18107,18108,18109,18113,18114,18118,18119,18123,18124,18128,18129,18133,18134,18135,18136,18145,18146,18147,18148,18151,18152,18153,18154,18157,18158,18159,18160,18163,18164,18165,18166,18168,18170,18462,18463,18578,18579,19614,19622,32768,32795,34261,34262,34284,34285,34555,34557,34630,34631,35165,35166,36396,36398,36446,36447,41156,41158,41825,41827,42381,42383,42966,42967,43873,43874,43882,43883,44104,44105,47474,47475,48091,48092,49819,49820,65536,65559,77152,77153,77157,77159,77176,77177,77212,77213,77222,77223,77366,77367,77417,77418,77424,77425,78130,78131,78140,78141,78192,78193,78218,78219,78252,78253,78360,78361,78396,78397,78402,78403,78464,78465,78888,78889,82919,82920,83061,83062,83064,83066,83130,83131,83201,83202,83269,83270,83272,83273,83275,83276,83335,83337,83339,83340,83404,83405,83475,83476,83543,83544,83546,83547,83549,83555,83557,83558,83560,83562,83564,83575,83635,83636,83638,83639,83649,83650,83716,83717,83794,83795,83872,83873,83949,83950,84029,84030,84106,84107,84183,84184,84260,84261,84275,84276,84339,84340,84415,84416,84493,84494,84570,84571,84643,84644,84646,84647,84659,84665,84725,84726,84728,84729,84795,84796,84798,84799,84863,84864,84866,84867,84930,84931,84933,84934,84997,84998,85000,85001,85064,85065,85067,85068,85131,85132,85134,85135,85199,85200,85202,85203,85268,85269,85338,85339,85415,85416,85491,85492,85569,85570,85572,85573,85636,85637,85639,85640,85704,85705,85707,85708,85771,85772,85774,85775,85838,85839,85841,85842,85904,85905,85907,85908,85969,85970,85972,85973,86049,86050,86123,86124,86126,86127,86191,86192,86194,86195,86262,86263,86265,86266,86331,86332,86334,86335,86402,86403,86405,86406,86472,86473,86475,86476,86479,86480,86545,86546,86547,86548,86618,86619,86620,86621,86694,86695,86697,86698,86766,86767,86769,86770,86778,86779,86838,86839,86841,86842,86907,86908,86910,86911,86980,86981,86983,86984,87049,87050,87052,87053,87121,87122,87124,87125,87190,87191,87193,87194,87260,87261,87263,87264,87324,87325,87327,87328,87390,87391,87459,87460,87525,87526,87528,87529,87589,87590,87592,87593,87655,87656,87721,87722,87724,87725,87784,87785,87787,87788,87856,87857,87859,87860,87928,87929,88001,88002,88078,88079,88092,88093,88157,88158,88232,88233,88235,88236,88299,88300,88302,88303,88366,88367,88369,88370,88433,88434,88436,88437,88500,88501,88503,88504,88565,88566,88568,88569,88630,88631,88633,88634,88710,88711,88783,88784,88786,88787,88851,88852,88854,88855,88921,88922,88924,88925,88990,88991,88993,88994,89061,89062,89064,89065,89133,89134,89136,89137,89205,89206,89207,89208,89280,89281,89282,89283,89355,89356,89358,89359,89427,89428,89430,89431,89433,89434,89500,89501,89503,89504,89572,89573,89641,89642,89644,89645,89710,89711,89713,89714,89781,89782,89784,89785,89850,89851,89853,89854,89919,89920,89922,89923,89983,89984,89986,89987,90049,90050,90117,90118,90183,90184,90186,90187,90247,90248,90250,90251,90313,90314,90379,90380,90382,90383,90442,90443,90445,90446,90513,90514,90516,90517,95123,95124,95256,95257,95348,95349,95699,95700,95761,95762,95911,95912,95991,95992,96024,96025,96101,96102,96170,96171,96267,96268,96360,96361,96433,96434,96479,96480,96600,96601,96627,96628,96630,96631,96663,96664,96825,96826,96897,96898,96950,96951,97275,97276,97278,97279,97373,97374,97498,97499,97592,97593,97632,97633,97660,97661,97724,97725,97796,97797,97862,97864,97865,97867,97968,97970,97976,97980,98304,98337,98589,360460,360468,361665,362757,368509,368592,368593") == "a4f7ee2fa08e08d3e4defb04f08e6e2ed3c5eb33" || 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"), "714,1,29,39,43,48,49,128,136,142,143,1817,1821,1834,2299,2304,2305,2549,2553,2558,2559,2561,2565,2567,2568,2591,2592,2628,2632,2682,2683,2842,2843,2846,2850,2854,2855,2858,2859,3004,3073,5128,5179,5266,5267,5394,5400,7768,7769,16912,16913,17929,17931,17932,17933,17935,17938,17939,17940,17942,17944,17945,17946,17948,17950,17951,17952,17954,17956,17957,17958,17960,17962,17963,17964,17966,17968,17973,17975,17978,17980,17983,17985,17993,17995,17998,18000,18001,18002,18004,18006,18007,18008,18011,18013,18014,18015,18017,18019,18020,18021,18023,18025,18026,18027,18029,18031,18032,18033,18035,18037,18038,18039,18048,18049,18068,18069,18070,18071,18075,18076,18077,18078,18081,18082,18083,18084,18087,18088,18089,18090,18093,18094,18095,18096,18100,18101,18102,18103,18106,18107,18108,18109,18113,18114,18118,18119,18123,18124,18128,18129,18133,18134,18135,18136,18145,18146,18147,18148,18151,18152,18153,18154,18157,18158,18159,18160,18163,18164,18165,18166,18168,18170,18462,18463,18578,18579,19614,19622,32768,32795,34261,34262,34284,34285,34555,34557,34630,34631,35165,35166,36396,36398,36446,36447,41156,41158,41825,41827,42381,42383,42966,42967,43873,43874,43882,43883,44104,44105,47474,47475,48091,48092,49819,49820,65536,65559,77152,77153,77157,77159,77176,77177,77212,77213,77222,77223,77366,77367,77417,77418,77424,77425,78130,78131,78140,78141,78192,78193,78218,78219,78252,78253,78360,78361,78396,78397,78402,78403,78464,78465,78888,78889,82919,82920,83061,83062,83064,83066,83130,83131,83201,83202,83269,83270,83272,83273,83275,83276,83335,83337,83339,83340,83404,83405,83475,83476,83543,83544,83546,83547,83549,83555,83557,83558,83560,83562,83564,83575,83635,83636,83638,83639,83649,83650,83716,83717,83794,83795,83872,83873,83949,83950,84029,84030,84106,84107,84183,84184,84260,84261,84275,84276,84339,84340,84415,84416,84493,84494,84570,84571,84643,84644,84646,84647,84659,84665,84725,84726,84728,84729,84795,84796,84798,84799,84863,84864,84866,84867,84930,84931,84933,84934,84997,84998,85000,85001,85064,85065,85067,85068,85131,85132,85134,85135,85199,85200,85202,85203,85268,85269,85338,85339,85415,85416,85491,85492,85569,85570,85572,85573,85636,85637,85639,85640,85704,85705,85707,85708,85771,85772,85774,85775,85838,85839,85841,85842,85904,85905,85907,85908,85969,85970,85972,85973,86049,86050,86123,86124,86126,86127,86191,86192,86194,86195,86262,86263,86265,86266,86331,86332,86334,86335,86402,86403,86405,86406,86472,86473,86475,86476,86479,86480,86545,86546,86547,86548,86618,86619,86620,86621,86694,86695,86697,86698,86766,86767,86769,86770,86778,86779,86838,86839,86841,86842,86907,86908,86910,86911,86980,86981,86983,86984,87049,87050,87052,87053,87121,87122,87124,87125,87190,87191,87193,87194,87260,87261,87263,87264,87324,87325,87327,87328,87390,87391,87459,87460,87525,87526,87528,87529,87589,87590,87592,87593,87655,87656,87721,87722,87724,87725,87784,87785,87787,87788,87856,87857,87859,87860,87928,87929,88001,88002,88078,88079,88092,88093,88157,88158,88232,88233,88235,88236,88299,88300,88302,88303,88366,88367,88369,88370,88433,88434,88436,88437,88500,88501,88503,88504,88565,88566,88568,88569,88630,88631,88633,88634,88710,88711,88783,88784,88786,88787,88851,88852,88854,88855,88921,88922,88924,88925,88990,88991,88993,88994,89061,89062,89064,89065,89133,89134,89136,89137,89205,89206,89207,89208,89280,89281,89282,89283,89355,89356,89358,89359,89427,89428,89430,89431,89433,89434,89500,89501,89503,89504,89572,89573,89641,89642,89644,89645,89710,89711,89713,89714,89781,89782,89784,89785,89850,89851,89853,89854,89919,89920,89922,89923,89983,89984,89986,89987,90049,90050,90117,90118,90183,90184,90186,90187,90247,90248,90250,90251,90313,90314,90379,90380,90382,90383,90442,90443,90445,90446,90513,90514,90516,90517,95123,95124,95256,95257,95348,95349,95699,95700,95761,95762,95911,95912,95991,95992,96024,96025,96101,96102,96170,96171,96267,96268,96360,96361,96433,96434,96479,96480,96600,96601,96627,96628,96630,96631,96663,96664,96825,96826,96897,96898,96950,96951,97275,97276,97278,97279,97373,97374,97498,97499,97592,97593,97632,97633,97660,97661,97724,97725,97796,97797,97862,97864,97865,97867,97968,97970,97976,97980,98304,98337,98589,360460,360468,361665,362757,368509,368592,368593") && 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"), "116,1,16,3863,3864,4442,4443,6214,6218,6314,6315,6343,8953,8961,8962,9001,9002,17184,17185,25172,25174,25304,25309,26587,26588,27263,27267,27293,28234,29570,29571,29972,29973,31272,31273,31635,31639,32158,32159,32171,32175,32179,32180,32768,32777,41360,41361,45276,45280,45311,45313,45606,45609,49409,49410,59252,59253,65536,65543,68803,68810,70286,70287,75676,75677,87174,87175,87400,87401,87799,87800,88301,88302,88307,88308,88436,88442,88443,88444,88456,88462,88463,88464,96270,96271,97492,97496,98304,98313,98512,98513,99303,99304,101670,101671,114956,114957,115033,115034,117212,117213,131072,131079,133570,133571,133830,133831,134027,134028,135939,262145,262151,286726,287586,292145,292217,292218") == "76550342841181552671f8bb4a66c9417745ea56" || 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"), "116,1,16,3863,3864,4442,4443,6214,6218,6314,6315,6343,8953,8961,8962,9001,9002,17184,17185,25172,25174,25304,25309,26587,26588,27263,27267,27293,28234,29570,29571,29972,29973,31272,31273,31635,31639,32158,32159,32171,32175,32179,32180,32768,32777,41360,41361,45276,45280,45311,45313,45606,45609,49409,49410,59252,59253,65536,65543,68803,68810,70286,70287,75676,75677,87174,87175,87400,87401,87799,87800,88301,88302,88307,88308,88436,88442,88443,88444,88456,88462,88463,88464,96270,96271,97492,97496,98304,98313,98512,98513,99303,99304,101670,101671,114956,114957,115033,115034,117212,117213,131072,131079,133570,133571,133830,133831,134027,134028,135939,262145,262151,286726,287586,292145,292217,292218") && 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,16,24,25,246,247,249,255,274,275") == "0bd674c7cdfba2ebf784e325ed9bdbed5c84cc9b" || 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,16,24,25,246,247,249,255,274,275") && 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"), "24,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,98324,98327,113041,113381,115180,115220,115221") == "6a5bbd55f50e375c0d58a271fa09d88bbea1c1f7" || 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"), "24,1,30,37,41,45,46,52,58,59,60,74,80,81,82,140,144,149,98324,98327,113041,113381,115180,115220,115221") && 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/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/abl_ecc.elf", "/dev/block/bootdevice/by-name/abl");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hyp");
package_extract_file("firmware-update/km4.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aop");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_config");
package_extract_file("firmware-update/BTFM.bin", "/dev/block/bootdevice/by-name/bluetooth");
package_extract_file("firmware-update/uefi_sec.mbn", "/dev/block/bootdevice/by-name/uefisecapp");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfw");
package_extract_file("firmware-update/featenabler.mbn", "/dev/block/bootdevice/by-name/featenabler");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsec");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xbl");
package_extract_file("firmware-update/cmnlib64.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/abl_ecc.elf", "/dev/block/bootdevice/by-name/ablbak");
package_extract_file("firmware-update/cmnlib.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/hyp.mbn", "/dev/block/bootdevice/by-name/hypbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/aop.mbn", "/dev/block/bootdevice/by-name/aopbak");
package_extract_file("firmware-update/xbl_config.elf", "/dev/block/bootdevice/by-name/xbl_configbak");
package_extract_file("firmware-update/qupv3fw.elf", "/dev/block/bootdevice/by-name/qupfwbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/storsec.mbn", "/dev/block/bootdevice/by-name/storsecbak");
package_extract_file("firmware-update/xbl.elf", "/dev/block/bootdevice/by-name/xblbak");

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

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