//
// Maxon algo by indear
// "new" and "new new" tables from Crux
//
// www.geocities.com/indearcito
// www.indear.tk
//

#include <stdio.h>

long codigo_maxon(long snr, int tabla[])
{
	long var1C1A, var1816, var10E, var64, varC, varA8, var201E, var1214;

	varA8 = snr - ((snr/10) * 10);
	var1C1A = (snr/100) * 10;
	varA8 = varA8 + ((snr/10) - var1C1A);
	var1C1A = (snr/1000) * 10;
	varA8 = varA8 + ((snr/100) - var1C1A);

	if (varA8 >  10)
	{
		var1C1A = varA8 - ((varA8/10) * 10);
		varA8 = (varA8/10) + var1C1A;
	}

	var1816 = snr % 0x17B;
	var10E = (snr % 0x07) * 10;
	var64 = (snr % 0x3CD) * 100;

	for (varC = 0; varC < varA8; varC++)
		var1816 = var1816 * var1816;

	var1C1A = var64 * tabla[0];
	var201E = var10E * tabla[1];
	var1214 = var1816 * tabla[2];
	var1214 = var1214 + var201E + var1C1A;

	if (var1214 < 0)
		var1214 = (var1214 ^ 0xFFFFFFFF) + 1;

	var1214 = var1214 - ((var1214 / 100000000) * 100000000);

	return var1214;
}

void main ()
{
	int i;
	long snr;

	static int tabla[][3] = {
		// old
		{0x0077, 0x00D9, 0x03AF},		// Simlock(SLPUK)
		{0x008B, 0x0197, 0x0323},		// NetworkLock
		{0x02E3, 0x00CF, 0x0341},		// IMSI
		{0x0086, 0x00DE, 0x0152},		// Part IMSI
		// new
		{0x00B7, 0x015F, 0x0206},		// Simlock(SLPUK)
		{0x00B1, 0x021F, 0x03AA},		// NetworkLock
		{0x00E3, 0x0291, 0x015C},		// IMSI
		{0x033A, 0x01D8, 0x0183},		// Part IMSI
		// new new
		{0x03D9, 0x01D3, 0x019F},		// Simlock(SLPUK)
		{0x015A, 0x0283, 0x01CA},		// NetworkLock
		{0x00EA, 0x0162, 0x0249},		// IMSI
		{0x0299, 0x0178, 0x01D0}		// Part IMSI
	};
	
	//               snr
	//              ______
	//IMEI 12345678'901234'7
	
	snr = 901234;
	for(i=0;i<12;i++)
		printf("%.8ld\n", codigo_maxon(snr, tabla[i]));
}
