getprop("ro.product.device") == "sakura_india" || abort("E3004: This package is for \"sakura_india\" devices; this is a \"" + getprop("ro.product.device") + "\".");
ui_print("Source: xiaomi/sakura_india/sakura_india:9/PKQ1.180917.001/V12.0.2.0.PDMMIXM:user/release-keys");
ui_print("Target: xiaomi/sakura_india/sakura_india:9/PKQ1.180917.001/V12.0.4.0.PDMMIXM:user/release-keys");
ui_print("Verifying current system...");
getprop("ro.build.fingerprint") == "xiaomi/sakura_india/sakura_india:9/PKQ1.180917.001/V12.0.2.0.PDMMIXM:user/release-keys" ||
    getprop("ro.build.fingerprint") == "xiaomi/sakura_india/sakura_india:9/PKQ1.180917.001/V12.0.4.0.PDMMIXM:user/release-keys" ||
    abort("E3001: Package expects build fingerprint of xiaomi/sakura_india/sakura_india:9/PKQ1.180917.001/V12.0.2.0.PDMMIXM:user/release-keys or xiaomi/sakura_india/sakura_india:9/PKQ1.180917.001/V12.0.4.0.PDMMIXM:user/release-keys; this device has " + getprop("ro.build.fingerprint") + ".");
show_progress(0.100000, 5);
apply_patch_check("EMMC:/dev/block/bootdevice/by-name/boot:23569738:d7074bf122a9568d18a76f989c9a6aa602935b34:23571786:6b97c3405e6d7db48c97939533f971bed9c794c6") || abort("E3005: \"EMMC:/dev/block/bootdevice/by-name/boot:23569738:d7074bf122a9568d18a76f989c9a6aa602935b34:23571786:6b97c3405e6d7db48c97939533f971bed9c794c6\" has unexpected contents.");
apply_patch_space(214659072) || abort("E3006: Not enough free space on /cache to apply patches.");
show_progress(0.100000, 70);
if (range_sha1("/dev/block/bootdevice/by-name/system", "1048,1,208,223,513,8303,20401,20402,20411,20412,20544,20546,30328,30329,30332,30333,30334,30335,30349,30350,30353,30354,30371,30372,31702,31708,32565,32567,32568,32570,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32589,32590,32591,32768,32959,33335,33336,33337,33338,33339,33340,33347,33348,34278,34279,34850,34851,34858,34859,34907,34908,34910,34911,35213,35214,35290,35292,35551,35552,35559,35560,35561,35562,35566,35567,35570,35571,36433,36435,36437,36438,36525,36526,36546,36547,36613,36614,36622,36623,36628,36629,36636,36637,36645,36646,36856,36857,36870,36871,36879,36880,36911,36913,37206,37207,37284,37285,37329,37901,38195,38197,50263,51047,51309,51310,51318,51381,52169,52170,52289,52834,52922,52923,54647,54686,60388,60389,74227,74228,74303,74304,74880,74881,74984,74985,75816,75817,75944,75945,98304,98495,99790,99791,99849,99850,101024,101025,108443,108444,120014,120015,120072,120073,120580,120581,120690,120691,121403,121404,121524,121525,126724,126726,127045,127046,127055,127056,127059,127060,128457,128458,135230,135231,136642,136643,140794,140795,148701,148702,148895,148896,153064,153147,157665,157724,158284,158285,163840,164031,165831,166013,166045,166168,166457,166588,166624,166640,166673,166718,166849,166980,166986,167027,167086,167110,167115,167424,167527,167531,167537,169230,169283,169491,169544,169549,169631,169829,169890,169898,169903,169969,169972,169998,170311,170333,170354,170579,170589,170818,171575,171583,172109,172257,181163,181165,193415,193416,193420,193421,194496,194497,199008,199009,199679,199680,199979,200023,200080,200648,200837,201440,201485,201490,201509,201758,201803,201844,201961,201984,201989,202031,202037,202327,203818,203829,203833,203851,203856,203871,203882,203976,204879,206252,206385,206386,208151,208152,215119,215120,219088,219089,219814,219861,219921,219975,220135,220263,220426,220477,220532,220536,220547,220775,220781,220799,220935,220953,221206,221414,221572,221794,222775,223717,224315,224316,229376,229567,229952,229954,230812,230818,230858,230860,230862,230863,231972,231974,231992,231994,232000,232001,232005,232006,232012,232014,232024,232025,232130,232132,232140,232141,232147,232148,232149,232151,232153,232154,232155,232156,232157,232158,232159,232160,232161,232162,232163,232164,232165,232166,232167,232168,232169,232170,232171,232172,232173,232174,232176,232177,232179,232180,232184,232185,232186,232187,232188,232189,232190,232191,232192,232193,232195,232196,232198,232199,232200,232201,232202,232204,232249,232250,232258,232259,232278,232279,232282,232283,232297,232298,232319,232320,232391,232392,232405,232406,232414,232415,232438,232439,232616,232617,244174,244175,244179,244180,244184,244185,244189,244190,244194,244195,244197,244198,244202,244203,244210,244211,244216,244217,244221,244222,244224,244225,244232,244233,244244,244245,244251,244252,244263,244264,244266,244267,244272,244273,244282,244283,244285,244286,244297,244298,244309,244310,244315,244316,244318,244319,244325,244326,244336,244337,244343,244344,244352,244353,244362,244363,244365,244366,244368,244369,244372,244373,244379,244380,244385,244386,244389,244390,244393,244394,244404,244405,244410,244411,244419,244420,244422,244423,244428,244429,244434,244435,244441,244442,244447,244448,244451,244452,244456,244457,244472,244473,244487,244488,244498,244499,244511,244512,244522,244523,244528,244529,244531,244532,244536,244537,244545,244546,244552,244553,244556,244557,244560,244561,244571,244572,244576,244577,244589,244590,244593,244594,244604,244605,244612,244613,244625,244626,244641,244642,244650,244651,244656,244657,244659,244660,244679,244680,244683,244684,244687,244688,244695,244696,244709,244710,244715,244716,244734,244735,244745,244746,244754,244755,244757,244758,244768,244769,244773,244774,244776,244777,244780,244781,244787,244788,244792,244793,244810,244811,244817,244818,244833,244834,244840,244841,244844,244845,244860,244861,244863,244864,244869,244870,244884,244885,244890,244891,244904,244905,244916,244917,244921,244922,244927,244928,244932,244933,244935,244936,244940,244941,244945,244946,244965,244966,244974,244975,244979,244980,244986,244987,244993,244994,244996,244997,245007,245008,245020,245021,245024,245025,245040,245041,245054,245055,245062,245063,245070,245071,245083,245084,245088,245089,245100,245101,245112,245113,245126,245127,245131,245132,245145,245146,245156,245157,245159,245160,245164,245165,245168,245169,245171,245172,245177,245178,245191,245192,245206,245207,245221,245222,245229,245230,245233,245234,245238,245239,245242,245243,245250,245251,245261,245262,245264,245265,245275,245276,245282,245283,245288,245289,245293,245294,245296,245297,245301,245302,245304,245305,245320,245321,245328,245329,245331,245332,245341,245342,245349,245350,245353,245354,245364,245365,245371,245372,245376,245377,245386,245387,245391,245392,245396,245397,245400,245401,245403,245404,245409,245410,245423,245424,245430,245431,245439,245440,245443,245444,245448,245449,245463,245464,245478,245479,245487,245488,245509,245510,245515,245516,245523,245524,245535,245536,245545,245546,245553,245554,245556,245557,245564,245565,245567,245568,245584,245585,245587,245588,245593,245594,245602,245603,245606,245607,245609,245610,245629,245630,245632,245633,245635,245636,245642,245643,245649,245650,245660,245662,245667,245668,245670,245671,245674,245675,245688,245689,245691,245692,245704,245705,245716,245717,245719,245720,245722,245723,245726,245727,245741,245742,245750,245751,245759,245760,245766,245767,245785,245786,245807,245808,245816,245817,245830,245831,245840,245841,245844,245845,245849,245850,245852,245853,245865,245866,245880,245881,245886,245887,245898,245899,245904,245905,245912,245913,245922,245923,245928,245929,245934,245935,245943,245944,245949,245950,245961,245962,245964,245965,245971,245972,245986,245987,246000,246001,246011,246012,246018,246019,246033,246034,246047,246048,246051,246052,246054,246055,246059,246060,246065,246066,246073,246074,246087,246088,246104,246105,246117,246118,246134,246135,246141,246142,246155,246156,246158,246159,246161,246162,246166,246167,246174,246175,246183,246184,246188,246189,246197,246199,248067,248068,252355,252356,252993,252994,253322,253325,254725,254726,254778,254779,257807,257808,258170,258171,259433,259434,260932,260933,271109,271110,278374,278375,278500,278502,279052,279053,279884,279885,279896,279897,292699,292700,294912,295103,311679,311680,311683,313021,313051,315744,320302,320303,320313,320314,321110,321111,321116,321117,322663,322664,322825,322826,322893,322894,322900,322901,322921,322922,331394,331395,331454,331455,332464,332465,332471,332472,334676,334677,334787,337344,337664,337665,340832,340833,347250,347251,347311,357472,358726,358727,366389,366390,366780,366781,368983,371811,374584,374585,374627,374628,377307,377308,377312,377313,380003,380005,380049,380050,392071,392072,400009,400010,401047,401048,406578,406579,410834,410835,415229,415230,415356,415357,415396,415397,416730,416731,416876,416877,416907,416908,416941,416942,417302,417303,417360,417361,417368,417371,417445,417446,436585,440537,524296,528344,593204,593214,652717,653245,757357,774155,780254,780261,786432") == "928de006a3d8e959147172823212d6e22d61672c" || block_image_verify("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat")) then
ui_print("Verified system image...");
else
check_first_block("/dev/block/bootdevice/by-name/system");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/system", "1048,1,208,223,513,8303,20401,20402,20411,20412,20544,20546,30328,30329,30332,30333,30334,30335,30349,30350,30353,30354,30371,30372,31702,31708,32565,32567,32568,32570,32572,32573,32574,32575,32576,32577,32578,32579,32580,32581,32582,32583,32584,32585,32586,32589,32590,32591,32768,32959,33335,33336,33337,33338,33339,33340,33347,33348,34278,34279,34850,34851,34858,34859,34907,34908,34910,34911,35213,35214,35290,35292,35551,35552,35559,35560,35561,35562,35566,35567,35570,35571,36433,36435,36437,36438,36525,36526,36546,36547,36613,36614,36622,36623,36628,36629,36636,36637,36645,36646,36856,36857,36870,36871,36879,36880,36911,36913,37206,37207,37284,37285,37329,37901,38195,38197,50263,51047,51309,51310,51318,51381,52169,52170,52289,52834,52922,52923,54647,54686,60388,60389,74227,74228,74303,74304,74880,74881,74984,74985,75816,75817,75944,75945,98304,98495,99790,99791,99849,99850,101024,101025,108443,108444,120014,120015,120072,120073,120580,120581,120690,120691,121403,121404,121524,121525,126724,126726,127045,127046,127055,127056,127059,127060,128457,128458,135230,135231,136642,136643,140794,140795,148701,148702,148895,148896,153064,153147,157665,157724,158284,158285,163840,164031,165831,166013,166045,166168,166457,166588,166624,166640,166673,166718,166849,166980,166986,167027,167086,167110,167115,167424,167527,167531,167537,169230,169283,169491,169544,169549,169631,169829,169890,169898,169903,169969,169972,169998,170311,170333,170354,170579,170589,170818,171575,171583,172109,172257,181163,181165,193415,193416,193420,193421,194496,194497,199008,199009,199679,199680,199979,200023,200080,200648,200837,201440,201485,201490,201509,201758,201803,201844,201961,201984,201989,202031,202037,202327,203818,203829,203833,203851,203856,203871,203882,203976,204879,206252,206385,206386,208151,208152,215119,215120,219088,219089,219814,219861,219921,219975,220135,220263,220426,220477,220532,220536,220547,220775,220781,220799,220935,220953,221206,221414,221572,221794,222775,223717,224315,224316,229376,229567,229952,229954,230812,230818,230858,230860,230862,230863,231972,231974,231992,231994,232000,232001,232005,232006,232012,232014,232024,232025,232130,232132,232140,232141,232147,232148,232149,232151,232153,232154,232155,232156,232157,232158,232159,232160,232161,232162,232163,232164,232165,232166,232167,232168,232169,232170,232171,232172,232173,232174,232176,232177,232179,232180,232184,232185,232186,232187,232188,232189,232190,232191,232192,232193,232195,232196,232198,232199,232200,232201,232202,232204,232249,232250,232258,232259,232278,232279,232282,232283,232297,232298,232319,232320,232391,232392,232405,232406,232414,232415,232438,232439,232616,232617,244174,244175,244179,244180,244184,244185,244189,244190,244194,244195,244197,244198,244202,244203,244210,244211,244216,244217,244221,244222,244224,244225,244232,244233,244244,244245,244251,244252,244263,244264,244266,244267,244272,244273,244282,244283,244285,244286,244297,244298,244309,244310,244315,244316,244318,244319,244325,244326,244336,244337,244343,244344,244352,244353,244362,244363,244365,244366,244368,244369,244372,244373,244379,244380,244385,244386,244389,244390,244393,244394,244404,244405,244410,244411,244419,244420,244422,244423,244428,244429,244434,244435,244441,244442,244447,244448,244451,244452,244456,244457,244472,244473,244487,244488,244498,244499,244511,244512,244522,244523,244528,244529,244531,244532,244536,244537,244545,244546,244552,244553,244556,244557,244560,244561,244571,244572,244576,244577,244589,244590,244593,244594,244604,244605,244612,244613,244625,244626,244641,244642,244650,244651,244656,244657,244659,244660,244679,244680,244683,244684,244687,244688,244695,244696,244709,244710,244715,244716,244734,244735,244745,244746,244754,244755,244757,244758,244768,244769,244773,244774,244776,244777,244780,244781,244787,244788,244792,244793,244810,244811,244817,244818,244833,244834,244840,244841,244844,244845,244860,244861,244863,244864,244869,244870,244884,244885,244890,244891,244904,244905,244916,244917,244921,244922,244927,244928,244932,244933,244935,244936,244940,244941,244945,244946,244965,244966,244974,244975,244979,244980,244986,244987,244993,244994,244996,244997,245007,245008,245020,245021,245024,245025,245040,245041,245054,245055,245062,245063,245070,245071,245083,245084,245088,245089,245100,245101,245112,245113,245126,245127,245131,245132,245145,245146,245156,245157,245159,245160,245164,245165,245168,245169,245171,245172,245177,245178,245191,245192,245206,245207,245221,245222,245229,245230,245233,245234,245238,245239,245242,245243,245250,245251,245261,245262,245264,245265,245275,245276,245282,245283,245288,245289,245293,245294,245296,245297,245301,245302,245304,245305,245320,245321,245328,245329,245331,245332,245341,245342,245349,245350,245353,245354,245364,245365,245371,245372,245376,245377,245386,245387,245391,245392,245396,245397,245400,245401,245403,245404,245409,245410,245423,245424,245430,245431,245439,245440,245443,245444,245448,245449,245463,245464,245478,245479,245487,245488,245509,245510,245515,245516,245523,245524,245535,245536,245545,245546,245553,245554,245556,245557,245564,245565,245567,245568,245584,245585,245587,245588,245593,245594,245602,245603,245606,245607,245609,245610,245629,245630,245632,245633,245635,245636,245642,245643,245649,245650,245660,245662,245667,245668,245670,245671,245674,245675,245688,245689,245691,245692,245704,245705,245716,245717,245719,245720,245722,245723,245726,245727,245741,245742,245750,245751,245759,245760,245766,245767,245785,245786,245807,245808,245816,245817,245830,245831,245840,245841,245844,245845,245849,245850,245852,245853,245865,245866,245880,245881,245886,245887,245898,245899,245904,245905,245912,245913,245922,245923,245928,245929,245934,245935,245943,245944,245949,245950,245961,245962,245964,245965,245971,245972,245986,245987,246000,246001,246011,246012,246018,246019,246033,246034,246047,246048,246051,246052,246054,246055,246059,246060,246065,246066,246073,246074,246087,246088,246104,246105,246117,246118,246134,246135,246141,246142,246155,246156,246158,246159,246161,246162,246166,246167,246174,246175,246183,246184,246188,246189,246197,246199,248067,248068,252355,252356,252993,252994,253322,253325,254725,254726,254778,254779,257807,257808,258170,258171,259433,259434,260932,260933,271109,271110,278374,278375,278500,278502,279052,279053,279884,279885,279896,279897,292699,292700,294912,295103,311679,311680,311683,313021,313051,315744,320302,320303,320313,320314,321110,321111,321116,321117,322663,322664,322825,322826,322893,322894,322900,322901,322921,322922,331394,331395,331454,331455,332464,332465,332471,332472,334676,334677,334787,337344,337664,337665,340832,340833,347250,347251,347311,357472,358726,358727,366389,366390,366780,366781,368983,371811,374584,374585,374627,374628,377307,377308,377312,377313,380003,380005,380049,380050,392071,392072,400009,400010,401047,401048,406578,406579,410834,410835,415229,415230,415356,415357,415396,415397,416730,416731,416876,416877,416907,416908,416941,416942,417302,417303,417360,417361,417368,417371,417445,417446,436585,440537,524296,528344,593204,593214,652717,653245,757357,774155,780254,780261,786432") && block_image_verify("/dev/block/bootdevice/by-name/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("/dev/block/bootdevice/by-name/vendor", "18,1,73,80,327,4112,32770,32832,98306,98368,163842,163904,197039,229376,229378,258044,260078,260085,262144") == "a34eb006a09aa85ed0733cac8c55edf65be4e5ac" || block_image_verify("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat")) then
ui_print("Verified vendor image...");
else
check_first_block("/dev/block/bootdevice/by-name/vendor");
ifelse (block_image_recover("/dev/block/bootdevice/by-name/vendor", "18,1,73,80,327,4112,32770,32832,98306,98368,163842,163904,197039,229376,229378,258044,260078,260085,262144") && block_image_verify("/dev/block/bootdevice/by-name/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;

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

ui_print("Patching boot image...");
show_progress(0.100000, 10);
apply_patch("EMMC:/dev/block/bootdevice/by-name/boot:23569738:d7074bf122a9568d18a76f989c9a6aa602935b34:23571786:6b97c3405e6d7db48c97939533f971bed9c794c6",
            "-", 6b97c3405e6d7db48c97939533f971bed9c794c6, 23571786,
            d7074bf122a9568d18a76f989c9a6aa602935b34, package_extract_file("patch/boot.img.p")) || abort("Failed to apply patch \"patch/boot.img.p \".");
show_progress(0.600000, 600);
ui_print("Patching system image after verification.");
block_image_update("/dev/block/bootdevice/by-name/system", package_extract_file("system.transfer.list"), "system.new.dat", "system.patch.dat") ||
  abort("E1001: Failed to update system image.");
ui_print("Patching vendor image after verification.");
block_image_update("/dev/block/bootdevice/by-name/vendor", package_extract_file("vendor.transfer.list"), "vendor.new.dat", "vendor.patch.dat") ||
  abort("E2001: Failed to update vendor image.");

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

ui_print("Patching firmware images...");
package_extract_file("firmware-update/splash.img", "/dev/block/bootdevice/by-name/splash");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpm");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tz");
package_extract_file("firmware-update/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/aboot");
package_extract_file("firmware-update/lksecapp.mbn", "/dev/block/bootdevice/by-name/lksecapp");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymaster");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1");
package_extract_file("firmware-update/cmnlib64_30.mbn", "/dev/block/bootdevice/by-name/cmnlib64");
package_extract_file("firmware-update/cmnlib_30.mbn", "/dev/block/bootdevice/by-name/cmnlib");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfg");
package_extract_file("firmware-update/rpm.mbn", "/dev/block/bootdevice/by-name/rpmbak");
package_extract_file("firmware-update/tz.mbn", "/dev/block/bootdevice/by-name/tzbak");
package_extract_file("firmware-update/emmc_appsboot.mbn", "/dev/block/bootdevice/by-name/abootbak");
package_extract_file("firmware-update/lksecapp.mbn", "/dev/block/bootdevice/by-name/lksecappbak");
package_extract_file("firmware-update/keymaster64.mbn", "/dev/block/bootdevice/by-name/keymasterbak");
package_extract_file("firmware-update/sbl1.mbn", "/dev/block/bootdevice/by-name/sbl1bak");
package_extract_file("firmware-update/cmnlib64_30.mbn", "/dev/block/bootdevice/by-name/cmnlib64bak");
package_extract_file("firmware-update/cmnlib_30.mbn", "/dev/block/bootdevice/by-name/cmnlibbak");
package_extract_file("firmware-update/devcfg.mbn", "/dev/block/bootdevice/by-name/devcfgbak");
package_extract_file("firmware-update/NON-HLOS.bin", "/dev/block/bootdevice/by-name/modem");
package_extract_file("firmware-update/adspso.bin", "/dev/block/bootdevice/by-name/dsp");
show_progress(0.100000, 2);
