getprop("ro.product.device") == "toco" || abort("E3004: This package is for \"toco\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: Xiaomi/toco_ru/toco:11/RKQ1.200826.002/V12.5.3.0.RFNRUXM:user/release-keys");
ui_print("Target: Xiaomi/toco_ru/toco:11/RKQ1.200826.002/V12.5.4.0.RFNRUXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "Xiaomi/toco_ru/toco:11/RKQ1.200826.002/V12.5.3.0.RFNRUXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "Xiaomi/toco_ru/toco:11/RKQ1.200826.002/V12.5.4.0.RFNRUXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of Xiaomi/toco_ru/toco:11/RKQ1.200826.002/V12.5.3.0.RFNRUXM:user/release-keys or Xiaomi/toco_ru/toco:11/RKQ1.200826.002/V12.5.4.0.RFNRUXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
patch_partition_check(concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:52c33979f50f880b68619bb9511fa2fcd5aa09fc"),
                      concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:e7f4696536f7aee43ec40ca5a375dc819131f727")) ||
    abort(concat("E3005: \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:52c33979f50f880b68619bb9511fa2fcd5aa09fc"),"\" or \"",concat("EMMC:","/dev/block/bootdevice/by-name/boot",":134217728:e7f4696536f7aee43ec40ca5a375dc819131f727"),"\" 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,32,43,53,55,59,87,88,21341,21342,21372,21373,27537,27538,28952,56664,56671,56672,57974,57975,59096,59097,60827,60828,61663,61664,62871,62872,63023,63024,63948,63949,65536,65552,68329,68330,69315,69316,70681,70682,71131,71132,73301,73302,73563,73564,73656,73657,73907,73908,74124,74126,74264,74268,74276,74277,74289,74293,74297,74298,75735,75741,75775,75776,75782,75788,75789,75790,75795,75801,75802,75803,79299,79303,79343,79344,80309,80310,80960,80961,82892,82895,82903,82904,82926,82927,82931,82932,83365,83366,83490,83491,83522,83528,83529,83530,83841,83845,83853,83854,83974,83980,83981,85348,86574,86712,86734,86735,90529,90533,90571,90572,90586,90592,90593,90594,90600,90606,90607,90608,94232,94233,96263,96267,96299,96300,96331,96332,97420,97424,97445,97446,97575,97579,97585,97586,97719,97723,97730,97731,98304,98322,103603,103607,103699,103700,103727,103728,104485,104489,104504,104505,105057,105063,105064,105065,106818,106822,106865,106866,106870,106876,106877,106878,106909,106915,106916,106917,108607,108611,108635,108636,108660,108661,108663,108664,108665,108666,108667,108668,108698,108699,112581,112585,112621,688143,688144,693296,695392,706412,706561,706562") == "3c6316a0702034265ef180473430c1aeb3d42070" || 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,32,43,53,55,59,87,88,21341,21342,21372,21373,27537,27538,28952,56664,56671,56672,57974,57975,59096,59097,60827,60828,61663,61664,62871,62872,63023,63024,63948,63949,65536,65552,68329,68330,69315,69316,70681,70682,71131,71132,73301,73302,73563,73564,73656,73657,73907,73908,74124,74126,74264,74268,74276,74277,74289,74293,74297,74298,75735,75741,75775,75776,75782,75788,75789,75790,75795,75801,75802,75803,79299,79303,79343,79344,80309,80310,80960,80961,82892,82895,82903,82904,82926,82927,82931,82932,83365,83366,83490,83491,83522,83528,83529,83530,83841,83845,83853,83854,83974,83980,83981,85348,86574,86712,86734,86735,90529,90533,90571,90572,90586,90592,90593,90594,90600,90606,90607,90608,94232,94233,96263,96267,96299,96300,96331,96332,97420,97424,97445,97446,97575,97579,97585,97586,97719,97723,97730,97731,98304,98322,103603,103607,103699,103700,103727,103728,104485,104489,104504,104505,105057,105063,105064,105065,106818,106822,106865,106866,106870,106876,106877,106878,106909,106915,106916,106917,108607,108611,108635,108636,108660,108661,108663,108664,108665,108666,108667,108668,108698,108699,112581,112585,112621,688143,688144,693296,695392,706412,706561,706562") && 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"), "460,1,32,42,46,51,52,130,138,144,145,1819,1823,1836,2301,2545,2549,2554,2555,2557,2561,2563,2564,2587,2588,2624,2628,2678,2679,2682,2686,2690,2691,2694,2695,2704,2708,2712,2713,3379,3430,3532,3533,3705,3711,5941,5942,14538,14539,15462,15464,15465,15466,15468,15471,15472,15473,15475,15477,15478,15479,15481,15483,15484,15485,15487,15489,15490,15491,15493,15495,15496,15497,15499,15501,15506,15508,15511,15513,15516,15518,15526,15528,15531,15533,15534,15535,15537,15539,15540,15541,15544,15546,15547,15548,15550,15552,15553,15554,15556,15558,15559,15560,15562,15564,15565,15566,15568,15570,15571,15572,15581,15582,15601,15602,15603,15604,15608,15609,15610,15611,15614,15615,15616,15617,15620,15621,15622,15623,15626,15627,15628,15629,15633,15634,15635,15636,15639,15640,15641,15642,15646,15647,15651,15652,15656,15657,15661,15662,15666,15667,15668,15669,15678,15679,15680,15681,15684,15685,15686,15687,15690,15691,15692,15693,15696,15697,15698,15699,15701,15703,15995,15996,16111,16112,17008,17013,32509,32510,32609,32611,32768,32800,33443,33444,34674,34676,34715,34717,35166,35167,35249,35250,41119,41120,41124,41126,41143,41144,41179,41180,41189,41190,41192,41193,41243,41244,41247,41248,41310,41311,41317,41318,41343,41344,41483,41484,42307,42308,42466,42467,42469,42471,42535,42536,42606,42607,42674,42675,42677,42678,42680,42690,42749,42750,42752,42754,42814,42815,42817,42818,42882,42883,42951,42952,42954,42955,43018,43019,43088,43089,43091,43092,43155,43156,43225,43226,43292,43293,43295,43296,43357,43358,43360,43361,43421,43422,43424,43425,43486,43487,43489,43490,43550,43551,43553,43554,43615,43616,43618,43619,43679,43680,43682,43683,43747,43748,43750,43751,43815,43816,43818,43819,43883,43884,43886,43887,43953,43955,43956,43957,44023,44024,44025,44026,44033,44035,44039,44040,44112,44113,44115,44116,44179,44180,44182,44183,44247,44248,44250,44251,44314,44315,44384,44385,44451,44452,44454,44455,44516,44517,44519,44520,44580,44581,44583,44584,44645,44646,44648,44649,44709,44710,44712,44713,44774,44775,44777,44778,44838,44839,44841,44842,44906,44907,44909,44910,44974,44975,44977,44978,45042,45043,45045,45046,45111,45112,45113,45114,45115,45116,45182,45183,45184,45185,45191,45192,45255,45256,45324,45325,45327,45328,45391,45392,45394,45395,45459,45460,45462,45463,45529,45530,45596,45597,45599,45600,45661,45662,45664,45665,45725,45726,45728,45729,45790,45791,45793,45794,45854,45855,45857,45858,45919,45920,45922,45923,45983,45984,45986,45987,46051,46052,46054,46055,46119,46120,46122,46123,46187,46188,46190,46191,46256,46257,46258,46259,46260,46261,46327,46328,46329,46330,56956,56957,57255,57256,57257,57258,57304,57306,57311,57313,57451,57461,57821,270726,271554,275859,275927,275928") == "a5f6f7f1733b66abab71e30913f05ef0fe503f70" || 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"), "460,1,32,42,46,51,52,130,138,144,145,1819,1823,1836,2301,2545,2549,2554,2555,2557,2561,2563,2564,2587,2588,2624,2628,2678,2679,2682,2686,2690,2691,2694,2695,2704,2708,2712,2713,3379,3430,3532,3533,3705,3711,5941,5942,14538,14539,15462,15464,15465,15466,15468,15471,15472,15473,15475,15477,15478,15479,15481,15483,15484,15485,15487,15489,15490,15491,15493,15495,15496,15497,15499,15501,15506,15508,15511,15513,15516,15518,15526,15528,15531,15533,15534,15535,15537,15539,15540,15541,15544,15546,15547,15548,15550,15552,15553,15554,15556,15558,15559,15560,15562,15564,15565,15566,15568,15570,15571,15572,15581,15582,15601,15602,15603,15604,15608,15609,15610,15611,15614,15615,15616,15617,15620,15621,15622,15623,15626,15627,15628,15629,15633,15634,15635,15636,15639,15640,15641,15642,15646,15647,15651,15652,15656,15657,15661,15662,15666,15667,15668,15669,15678,15679,15680,15681,15684,15685,15686,15687,15690,15691,15692,15693,15696,15697,15698,15699,15701,15703,15995,15996,16111,16112,17008,17013,32509,32510,32609,32611,32768,32800,33443,33444,34674,34676,34715,34717,35166,35167,35249,35250,41119,41120,41124,41126,41143,41144,41179,41180,41189,41190,41192,41193,41243,41244,41247,41248,41310,41311,41317,41318,41343,41344,41483,41484,42307,42308,42466,42467,42469,42471,42535,42536,42606,42607,42674,42675,42677,42678,42680,42690,42749,42750,42752,42754,42814,42815,42817,42818,42882,42883,42951,42952,42954,42955,43018,43019,43088,43089,43091,43092,43155,43156,43225,43226,43292,43293,43295,43296,43357,43358,43360,43361,43421,43422,43424,43425,43486,43487,43489,43490,43550,43551,43553,43554,43615,43616,43618,43619,43679,43680,43682,43683,43747,43748,43750,43751,43815,43816,43818,43819,43883,43884,43886,43887,43953,43955,43956,43957,44023,44024,44025,44026,44033,44035,44039,44040,44112,44113,44115,44116,44179,44180,44182,44183,44247,44248,44250,44251,44314,44315,44384,44385,44451,44452,44454,44455,44516,44517,44519,44520,44580,44581,44583,44584,44645,44646,44648,44649,44709,44710,44712,44713,44774,44775,44777,44778,44838,44839,44841,44842,44906,44907,44909,44910,44974,44975,44977,44978,45042,45043,45045,45046,45111,45112,45113,45114,45115,45116,45182,45183,45184,45185,45191,45192,45255,45256,45324,45325,45327,45328,45391,45392,45394,45395,45459,45460,45462,45463,45529,45530,45596,45597,45599,45600,45661,45662,45664,45665,45725,45726,45728,45729,45790,45791,45793,45794,45854,45855,45857,45858,45919,45920,45922,45923,45983,45984,45986,45987,46051,46052,46054,46055,46119,46120,46122,46123,46187,46188,46190,46191,46256,46257,46258,46259,46260,46261,46327,46328,46329,46330,56956,56957,57255,57256,57257,57258,57304,57306,57311,57313,57451,57461,57821,270726,271554,275859,275927,275928") && 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"), "118,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,229383,229385,262145,262151,282260,283107,287595,287667,287668") == "4898383b5b5c90a914e0d468fa458e6ebf129642" || 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"), "118,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,229383,229385,262145,262151,282260,283107,287595,287667,287668") && 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,242,243,245,251,270,271") == "c6d3e2e3e1753b94e77842eab684bc10ed151d49" || 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,242,243,245,251,270,271") && 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,120695,121058,122980,123020,123021") == "d0e1207485b88ea317be540a364dd23c8e49ac4d" || 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,120695,121058,122980,123020,123021") && block_image_verify(map_partition("system_ext"), package_extract_file("system_ext.transfer.list"), "system_ext.new.dat", "system_ext.patch.dat"), ui_print("system_ext recovered successfully."), abort("E2004: system_ext partition fails to recover"));
endif;

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


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

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

# --- Start patching dynamic partitions ---


# Patch partition system

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

# Update dynamic partition metadata

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

# Patch partition vendor

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

# Patch partition product

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

# Patch partition odm

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

# Patch partition system_ext

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

# --- End patching dynamic partitions ---

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

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