#include <math.h>
#include <iostream>
#include <cstdlib>
#include <ctime>
using namespace std;
//функции для взешенного вещества и сухого остатка
double tranc( double x, int n = 4 )
{
int temp;
temp = x * pow ( 10 , n + 1 ) ;
if ( temp % 10 < 5 )
{
temp = temp / 10 ;
}
else
{
temp = temp / 10 + 1 ;
}
return ( temp / pow ( 10.0 , n) ) ;
}
void massa_and_result( double & m1, double & m2, double & m_dushes, int & final_res, bool part1 = true , int lower_lim = 0 , int high_lim = 1 , int var_for_result2 = 0 , int n = 19 )
{
double difference;
int temp1, temp2;
if ( part1)
{
final_res = lower_lim + rand ( ) % ( high_lim- lower_lim) ;
if ( final_res % 2 == 1 )
{
final_res++ ;
}
}
else
{
final_res = var_for_result2 + ( 4 + rand ( ) % 4 ) ;
if ( final_res % 2 ! = var_for_result2 % 2 )
{
final_res = final_res + 1 ;
}
}
difference = final_res * 50 / 1000.0 / 1000.0 ;
temp1 = difference * 10000 ;
temp2 = ( 1000 + temp1) + rand ( ) % 8700 ;
m2= n + temp2 / 10000.0 ;
m1 = m2 + 0.0001 ;
m_dushes = m2 - difference;
return ;
}
void show_begin( double m1, double m2, double m_dushes, int final_res, int v, bool part1= true )
{
setlocale( LC_ALL, "Russian" ) ;
if ( part1)
cout << " V= " << v << " мл Mпуст=" << m_dushes << "; m1=" << m1 << "; m2=" << m2 << ";" << endl
<< " (" << m2 << "-" << m_dushes << ")/" << v << "*1000*1000=" << final_res<< endl;
else
cout << " V= " << v << " мл Mпуст=" << m_dushes << "; m1=" << m1 << "; m2=" << m2 << ";" << endl
<< " (" << m2 << "-" << m_dushes << ") *1000*1000/" << v<< "=" << final_res << endl;
}
void show_end( int res1, int res2)
{
cout << "\t \t (" << res1 << " + " << res2 << ")/2 =" << ( res1 + res2) / 2 << endl
<< "\t \t \t c=" << ( res1 + res2) / 2 << "(мг/дм3)\n " ;
}
//__________________________________________________________________________________________________________________________________
////функции для азота нитрийного(azot)
void D_and_result_azot_nitrit( double & d1, double & d2, double & c1, double & c2, int lower_lim = 0 , int high_lim = 1 )
{
c1 = ( lower_lim + rand ( ) % ( high_lim - lower_lim) ) / 1000.0 ; //с*1000 всегда должно быть нечетное
d1 = tranc( ( c1 - 0.0032 ) / 1.9677 ,3 ) ;
c1 = tranc( 1.9677 * d1 + 0.0032 , 3 ) ;
d2 = d1 + ( - 1 + rand ( ) % 3 ) / 1000.0 ;
c2 = tranc( 1.9677 * d2 + 0.0032 ,3 ) ;
return ;
}
void show_begin_azot_nitr( double d1, double d2, double c1, double c2, int v = 50 )
{
setlocale( LC_ALL, "Russian" ) ;
cout << " V= " << v << " мл D1=" << d1 << "; D2=" << d2 << "; " << endl
<< " (1.9677*" << d1 << " ) + 0.0032) *" << v << "/ 50=" << c1 << endl
<< " (1.9677*" << d2 << " ) + 0.0032) *" << v<< "/ 50=" << c2 << endl;
return ;
}
void show_end_azot_nitr( double res1, double res2, double & c)
{
c = tranc( ( res1 + res2) / 2 * 0.304 ,3 ) ;
cout << "\t \t (" << res1 << " + " << res2 << ")/ 2 * 0,304 =" << c << endl
<< "\t \t \t c=" << c<< "(мг/дм3)\n "
<< "\t \t \t c=" << ( res1 + res2) / 2 * 0.304 << "(мг/дм3)\n " ;
}
void azot_nitr( )
{
double d1_input, d2_input, c1_input, c2_input, c_input; //вход
double d1_bior, d2_bior, c1_bior, c2_bior, c_bior; //bior
double d1_secondary, d2_secondary, c1_secondary, c2_secondary, c_secondary; //вторичная
double d1_output, d2_output, c1_output, c2_output, c_output; //выход
cout << "\t \t Азот нитрийный\n \n " ; //решение для входа
cout << " Вход " ;
D_and_result_azot_nitrit( d1_input, d2_input, c1_input, c2_input,263 ,559 ) ;
show_begin_azot_nitr( d1_input, d2_input, c1_input, c2_input) ;
show_end_azot_nitr( c1_input, c2_input, c_input) ;
cout << " После биор" ; //решение для биора
D_and_result_azot_nitrit( d1_bior, d2_bior, c1_bior, c2_bior, ( int ) ( ( c_input * 1000 + 30 ) / 0.304 ) , ( int ) ( ( c_input * 1000 + 60 ) / 0.304 ) ) ;
show_begin_azot_nitr( d1_bior, d2_bior, c1_bior, c2_bior) ;
show_end_azot_nitr( c1_bior, c2_bior, c_bior) ;
cout << " После вторичной" ; //решение для вторичной
D_and_result_azot_nitrit( d1_secondary, d2_secondary, c1_secondary, c2_secondary, ( int ) ( ( c_bior * 1000 + 25 ) / 0.304 ) , ( int ) ( ( c_bior * 1000 + 40 ) / 0.304 ) ) ;
show_begin_azot_nitr( d1_secondary, d2_secondary, c1_secondary, c2_secondary) ;
show_end_azot_nitr( c1_secondary, c2_secondary, c_secondary) ;
cout << " Выход" ; //решение для выхода
D_and_result_azot_nitrit( d1_output, d2_output, c1_output, c2_output, ( int ) ( ( c_secondary * 1000 + 45 ) / 0.304 ) , ( int ) ( ( c_secondary * 1000 + 85 ) / 0.304 ) ) ;
show_begin_azot_nitr( d1_output, d2_output, c1_output, c2_output) ;
show_end_azot_nitr( c1_output, c2_output, c_output) ;
cout << "________________________________________________________________________________\n \n " ;
return ;
}
//функции для нитратов
void D_and_result_nitrat( double & d1, double & d2, double & c1, double & c2, int lower_lim = 0 , int high_lim = 1 )
{
c1 = ( lower_lim + rand ( ) % ( high_lim - lower_lim) ) / 1000.0 ;
d1 = tranc( ( c1 - 0.091 ) / 11.821 , 3 ) ;
d2 = d1 + ( - 1 + rand ( ) % 3 ) / 1000.0 ;
c1 = tranc( 11.821 * d1 + 0.091 , 3 ) ;
c2 = tranc( 11.821 * d2 + 0.091 ,3 ) ;
return ;
}
void show_begin_nitrat( double d1, double d2, double c1, double c2, int v = 20 )
{
setlocale( LC_ALL, "Russian" ) ;
cout << " V= " << v << " мл D1=" << d1 << "; D2=" << d2 << "; " << endl
<< " (11.821*" << d1 << " + 0.091) =" << c1 << endl
<< " (11.821*" << d2 << " + 0.091) =" << c2 << endl;
return ;
}
void show_end_nitrat( double res1, double res2, double & c)
{
c = tranc( ( res1 + res2) / 2.0 ,3 ) ;
cout << "\t \t (" << res1 << " + " << res2 << ")/ 2 =" << c << endl
<< "\t \t \t c=" << c << "(мг/дм3)\n "
<< "\t \t \t c=" << ( res1 + res2) / 2.0 << "(мг/дм3)\n " ;
}
void nitrat( )
{
double d1_input, d2_input, c1_input, c2_input, c_input; //вход
double d1_bior, d2_bior, c1_bior, c2_bior, c_bior; //bior
double d1_secondary, d2_secondary, c1_secondary, c2_secondary, c_secondary; //вторичная
double d1_output, d2_output, c1_output, c2_output, c_output; //выход
cout << "\t \t Нитраты\n \n " ; //решение для входа
cout << " Вход " ;
D_and_result_nitrat( d1_input, d2_input, c1_input, c2_input, 4500 , 7800 ) ;
show_begin_nitrat( d1_input, d2_input, c1_input, c2_input) ;
show_end_nitrat( c1_input, c2_input, c_input) ;
cout << " После биор" ; //решение для биора
D_and_result_nitrat( d1_bior, d2_bior, c1_bior, c2_bior, ( int ) ( ( c_input - 1.90 ) * 1000 ) , ( int ) ( ( c_input - 1.20 ) * 1000 ) ) ;
show_begin_nitrat( d1_bior, d2_bior, c1_bior, c2_bior) ;
show_end_nitrat( c1_bior, c2_bior, c_bior) ;
cout << " После вторичной" ; //решение для вторичной
D_and_result_nitrat( d1_secondary, d2_secondary, c1_secondary, c2_secondary, ( int ) ( ( c_bior - 1.5 ) * 1000 ) , ( int ) ( ( c_bior - 0.7 ) * 1000 ) ) ;
show_begin_nitrat( d1_secondary, d2_secondary, c1_secondary, c2_secondary) ;
show_end_nitrat( c1_secondary, c2_secondary, c_secondary) ;
cout << " Выход" ; //решение для выхода
D_and_result_nitrat( d1_output, d2_output, c1_output, c2_output, ( int ) ( ( 0.5 * c_input - 0.8 ) * 1000 ) , ( int ) ( ( 0.5 * c_input - 0.2 ) * 1000 ) ) ;
show_begin_nitrat( d1_output, d2_output, c1_output, c2_output) ;
show_end_nitrat( c1_output, c2_output, c_output) ;
cout << "________________________________________________________________________________\n \n " ;
return ;
}
//азот амонийный
void D_and_result_azot_amon( double & d1, double & d2, double & c1, double & c2, int lower_lim = 0 , int high_lim = 1 )
{
c1 = ( lower_lim + rand ( ) % ( high_lim - lower_lim) ) / 100.0 ;
d1 = tranc( ( ( c1/ 100.0 ) - 0.00017 ) / 8.8994 ,3 ) ;
d2 = d1 + ( - 1 + rand ( ) % 3 ) / 1000.0 ;
c1 = tranc( ( 8.8994 * d1 + 0.0017 ) * 100 , 2 ) ;
c2 = tranc( ( 8.8994 * d2 + 0.0017 ) * 100 ,2 ) ;
return ;
}
void show_begin_azot_amon( double d1, double d2, double c1, double c2, double v = 0.5 )
{
setlocale( LC_ALL, "Russian" ) ;
cout << " V= " << v << " мл D1=" << d1 << "; D2=" << d2 << "; " << endl
<< " ((8.8994*" << d1 << ") + 0.0017)*50/ 0.5 =" << c1 << endl
<< " ((8.8994*" << d2 << ") + 0.0017)*50/ 0.5 =" << c2 << endl;
return ;
}
void show_end_azot_amon_and_hlor( double res1, double res2, double & c)
{
c = tranc( ( res1+ res2) / 2.0 ,2 ) ;
cout << "\t \t (" << res1 << " + " << res2 << ")/ 2 =" << c << endl
<< "\t \t \t c=" << c << "(мг/дм3)\n "
<< "\t \t \t c=" << ( res1 + res2) / 2.0 << "(мг/дм3)\n " ;
}
void amon( )
{
double d1_input, d2_input, c1_input, c2_input, c_input; //вход
double d1_bior, d2_bior, c1_bior, c2_bior, c_bior; //bior
double d1_secondary, d2_secondary;
double c1_secondary, c2_secondary, c_secondary; //вторичная
double d1_output, d2_output, c1_output, c2_output, c_output; //выход
cout << "\t \t Азот амонийный\n \n " ; //решение для входа
cout << " Вход " ;
D_and_result_azot_amon( d1_input, d2_input, c1_input, c2_input, 4200 , 6000 ) ;
show_begin_azot_amon( d1_input, d2_input, c1_input, c2_input) ;
show_end_azot_amon_and_hlor( c1_input, c2_input, c_input) ;
cout << " После биор" ; //решение для биора
D_and_result_azot_amon( d1_bior, d2_bior, c1_bior, c2_bior, ( c_input - 15 ) * 100 ,( c_input - 11 ) * 100 ) ;
show_begin_azot_amon( d1_bior, d2_bior, c1_bior, c2_bior) ;
show_end_azot_amon_and_hlor( c1_bior, c2_bior, c_bior) ;
cout << " После вторичной" ; //решение для вторичной
D_and_result_azot_amon( d1_secondary, d2_secondary, c1_secondary, c2_secondary, 2000 , 2700 ) ;
show_begin_azot_amon( d1_secondary, d2_secondary, c1_secondary, c2_secondary) ;
show_end_azot_amon_and_hlor( c1_secondary, c2_secondary, c_secondary) ;
cout << " Выход" ; //решение для выхода
D_and_result_azot_amon( d1_output, d2_output, c1_output, c2_output, 1700 , 1890 ) ;
show_begin_azot_amon( d1_output, d2_output, c1_output, c2_output) ;
show_end_azot_amon_and_hlor( c1_output, c2_output, c_output) ;
cout << "________________________________________________________________________________\n \n " ;
return ;
}
//хлориды
void D_and_result_hlor( double & d1, double & d2, double & c1, double & c2, int lower_lim = 0 , int high_lim = 1 )
{
c1 = ( lower_lim + rand ( ) % ( high_lim - lower_lim) ) / 100.0 ;
d1 = tranc( c1/ 354.5 / 0.05 / 0.9990 ,1 ) ;
d2 = d1 + ( - 1 + rand ( ) % 3 ) / 10.0 ;
c1 = tranc( d1* 0.05 * 354.5 * 0.9990 , 2 ) ;
c2 = tranc( d2* 0.05 * 354.5 * 0.9990 ,2 ) ;
return ;
}
void show_begin_hlor( double d1, double d2, double c1, double c2, int v= 100 )
{
setlocale( LC_ALL, "Russian" ) ;
cout << " V= " << v << " мл X1=" << d1 << "; X2=" << d2 << "; " << endl
<< " (" << d1 << "*0.05) *35.45)*0.9990)*1000/100 =" << c1 << endl
<< " (" << d2 << "*0.05) *35.45)*0.9990)*1000/100 =" << c2 << endl;
return ;
}
void hlor( )
{
double d1_input, d2_input, c1_input, c2_input, c_input; //вход
double d1_bior, d2_bior, c1_bior, c2_bior, c_bior; //bior
double d1_secondary, d2_secondary;
double c1_secondary, c2_secondary, c_secondary; //вторичная
double d1_output, d2_output, c1_output, c2_output, c_output; //выход
cout << "\t \t Хлориды\n \n " ; //решение для входа
cout << " Вход " ;
D_and_result_hlor( d1_input, d2_input, c1_input, c2_input, 11000 , 19000 ) ;
show_begin_hlor( d1_input, d2_input, c1_input, c2_input) ;
show_end_azot_amon_and_hlor( c1_input, c2_input, c_input) ;
cout << " После биор" ; //решение для биора
D_and_result_hlor( d1_bior, d2_bior, c1_bior, c2_bior, ( 0.7 * c_input - 10 ) * 100 , ( 0.7 * c_input + 10 ) * 100 ) ;
show_begin_hlor( d1_bior, d2_bior, c1_bior, c2_bior) ;
show_end_azot_amon_and_hlor( c1_bior, c2_bior, c_bior) ;
cout << " После вторичной" ; //решение для вторичной
D_and_result_hlor( d1_secondary, d2_secondary, c1_secondary, c2_secondary,( 0.5 * c_input - 3 ) * 100 , ( 0.5 * c_input + 15 ) * 100 ) ;
show_begin_hlor( d1_secondary, d2_secondary, c1_secondary, c2_secondary) ;
show_end_azot_amon_and_hlor( c1_secondary, c2_secondary, c_secondary) ;
cout << " Выход" ; //решение для выхода
D_and_result_hlor( d1_output, d2_output, c1_output, c2_output, ( c_secondary - 20 ) * 100 , ( c_secondary- 10 ) * 100 ) ;
show_begin_hlor( d1_output, d2_output, c1_output, c2_output) ;
show_end_azot_amon_and_hlor( c1_output, c2_output, c_output) ;
cout << "________________________________________________________________________________\n \n " ;
return ;
}
//cульфаты
void D_and_result_sylfat( double & d1, double & d2, double & c1, double & c2, int lower_lim = 0 , int high_lim = 1 )
{
c1 = ( lower_lim + rand ( ) % ( high_lim - lower_lim) ) / 100.0 ;
d1 = tranc( ( ( c1 / 100.0 ) - 0.0608 ) / 18.468 , 3 ) ;
d2 = d1 + ( - 1 + rand ( ) % 3 ) / 1000.0 ;
c1 = tranc( ( 18.468 * d1 + 0.0608 ) * 100 , 2 ) ;
c2 = tranc( ( 18.468 * d2 + 0.0608 ) * 100 , 2 ) ;
return ;
}
void show_begin_sylfat( double d1, double d2, double c1, double c2, double v = 0.5 )
{
setlocale( LC_ALL, "Russian" ) ;
cout << " V= " << v << " мл D1=" << d1 << "; D2=" << d2 << "; " << endl
<< " ((18.468*" << d1 << ") + 0.0608)*1000/ 10 =" << c1 << endl
<< " ((18.468*" << d2 << ") + 0.0608)*1000/ 10 =" << c2 << endl;
return ;
}
void sylfat( )
{
double d1_input, d2_input, c1_input, c2_input, c_input; //вход
double d1_bior, d2_bior, c1_bior, c2_bior, c_bior; //bior
double d1_secondary, d2_secondary;
double c1_secondary, c2_secondary, c_secondary; //вторичная
double d1_output, d2_output, c1_output, c2_output, c_output; //выход
cout << "\t \t Сульфаты\n \n " ; //решение для входа
cout << " Вход " ;
D_and_result_sylfat( d1_input, d2_input, c1_input, c2_input, 16000 , 21000 ) ;
show_begin_sylfat( d1_input, d2_input, c1_input, c2_input) ;
show_end_azot_amon_and_hlor( c1_input, c2_input, c_input) ;
cout << " После биор" ; //решение для биора
D_and_result_sylfat( d1_bior, d2_bior, c1_bior, c2_bior, ( 0.65 * c_input - 15 ) * 100 , ( 0.65 * c_input - 5 ) * 100 ) ;
show_begin_sylfat( d1_bior, d2_bior, c1_bior, c2_bior) ;
show_end_azot_amon_and_hlor( c1_bior, c2_bior, c_bior) ;
cout << " После вторичной" ; //решение для вторичной
D_and_result_sylfat( d1_secondary, d2_secondary, c1_secondary, c2_secondary, ( c_bior - 40 ) * 100 , ( c_bior - 30 ) * 100 ) ;
show_begin_sylfat( d1_secondary, d2_secondary, c1_secondary, c2_secondary) ;
show_end_azot_amon_and_hlor( c1_secondary, c2_secondary, c_secondary) ;
cout << " Выход" ; //решение для выхода
D_and_result_sylfat( d1_output, d2_output, c1_output, c2_output, ( c_secondary- 8 ) * 100 ,( c_secondary- 15 ) * 100 ) ;
show_begin_sylfat( d1_output, d2_output, c1_output, c2_output) ;
show_end_azot_amon_and_hlor( c1_output, c2_output, c_output) ;
cout << "________________________________________________________________________________\n \n " ;
return ;
}
//фосфар фосфатный
void D_and_result_fosfar( double & d1, double & d2, double & c1, double & c2, int lower_lim = 0 , int high_lim = 1 )
{
c1 = ( lower_lim + rand ( ) % ( high_lim - lower_lim) ) / 100.0 ;
d1 = tranc( ( c1/ 10.0 + 0.0038 ) / 3.818 , 3 ) ;
d2 = d1 + ( - 1 + rand ( ) % 3 ) / 1000.0 ;
c1 = tranc( ( 3.818 * d1 - 0.0038 ) * 10.0 , 2 ) ;
c2 = tranc( ( 3.818 * d2 - 0.0038 ) * 10.0 , 2 ) ;
return ;
}
void show_begin_fosfar( double d1, double d2, double c1, double c2, int v = 5 )
{
setlocale( LC_ALL, "Russian" ) ;
cout << " V= " << v << " мл D1=" << d1 << "; D2=" << d2 << "; " << endl
<< " ((3.818*" << d1 << ") - 0.0038)*50/" << v<< "=" << c1 << endl
<< " ((3.818*" << d2 << " )- 0.0038)*50/" << v << "=" << c2 << endl;
return ;
}
void show_end_fosfar( double res1, double res2, double & c)
{
c = tranc( ( res1 + res2) / 2.0 * 0.326 , 2 ) ;
cout << "\t \t (" << res1 << " + " << res2 << ")/ 2*0.326 =" << c << endl
<< "\t \t \t c=" << c << "(мг/дм3)\n "
<< "\t \t \t c=" << ( res1 + res2) / 2.0 * 0.326 << "(мг/дм3)\n " ;
}
void fosfar( )
{
double d1_input, d2_input, c1_input, c2_input, c_input; //вход
double d1_bior, d2_bior, c1_bior, c2_bior, c_bior; //bior
double d1_secondary, d2_secondary, c1_secondary, c2_secondary, c_secondary; //вторичная
double d1_output, d2_output, c1_output, c2_output, c_output; //выход
cout << "\t \t Фосфар фосфатный\n \n " ; //решение для входа
cout << " Вход " ;
D_and_result_fosfar( d1_input, d2_input, c1_input, c2_input, 250 / 0.304 , 390 / 0.304 ) ;
show_begin_fosfar( d1_input, d2_input, c1_input, c2_input) ;
show_end_fosfar( c1_input, c2_input, c_input) ;
cout << " После биор" ; //решение для биора
D_and_result_fosfar( d1_bior, d2_bior, c1_bior, c2_bior, ( int ) ( ( 0.65 * c_input - 0.22 ) * 100 / 0.304 ) , ( int ) ( ( 0.65 * c_input + 0.35 ) * 100 / 0.304 ) ) ;
show_begin_fosfar( d1_bior, d2_bior, c1_bior, c2_bior) ;
show_end_fosfar( c1_bior, c2_bior, c_bior) ;
cout << " После вторичной" ; //решение для вторичной
D_and_result_fosfar( d1_secondary, d2_secondary, c1_secondary, c2_secondary, ( int ) ( ( 0.56 * c_bior - 0.15 ) * 100 / 0.304 ) , ( int ) ( ( 0.56 * c_bior + 0.15 ) * 100 / 0.304 ) ) ;
show_begin_fosfar( d1_secondary, d2_secondary, c1_secondary, c2_secondary) ;
show_end_fosfar( c1_secondary, c2_secondary, c_secondary) ;
cout << " Выход" ; //решение для выхода
D_and_result_fosfar( d1_output, d2_output, c1_output, c2_output, ( int ) ( ( c_secondary - 0.3 ) * 100 / 0.304 ) , ( int ) ( ( c_secondary - 0.1 ) * 100 / 0.304 ) ) ;
show_begin_fosfar( d1_output, d2_output, c1_output, c2_output) ;
show_end_fosfar( c1_output, c2_output, c_output) ;
cout << "________________________________________________________________________________\n \n " ;
return ;
}
//железо(ferum)
void D_and_result_ferum( double & d1, double & d2, double & c1, double & c2, int lower_lim = 0 , int high_lim = 1 )
{
c1 = ( lower_lim + rand ( ) % ( high_lim - lower_lim) ) / 100.0 ;
d1 = tranc( ( c1 * 8 / 10.0 + 0.2511 ) / 56.582 , 3 ) ;
d2 = d1 + ( - 1 + rand ( ) % 3 ) / 1000.0 ;
c1 = tranc( ( 56.582 * d1 - 0.2511 ) * 10 / 8.0 , 2 ) ;
c2 = tranc( ( 56.582 * d2 - 0.2511 ) * 10 / 8.0 , 2 ) ;
return ;
}
void show_begin_ferum( double d1, double d2, double c1, double c2, int v = 80 )
{
setlocale( LC_ALL, "Russian" ) ;
cout << " V= " << v << " мл D1=" << d1 << "; D2=" << d2 << "; " << endl
<< " ((56.582*" << d1 << ") - 0.2511)*100/" << v << "=" << c1 << endl
<< " ((56.582*" << d2 << " )- 0.2511)*100/" << v << "=" << c2 << endl;
return ;
}
void show_end_ferum( double res1, double res2, double & c)
{
c = tranc( ( res1 + res2) / 2.0 , 2 ) ;
cout << "\t \t (" << res1 << " + " << res2 << ")/ 2=" << c << endl
<< "\t \t \t c=" << c << "(мг/дм3)\n "
<< "\t \t \t c=" << ( res1 + res2) / 2.0 << "(мг/дм3)\n " ;
}
void ferum( )
{
double d1_input, d2_input, c1_input, c2_input, c_input; //вход
double d1_bior, d2_bior, c1_bior, c2_bior, c_bior; //bior
double d1_secondary, d2_secondary, c1_secondary, c2_secondary, c_secondary; //вторичная
double d1_output, d2_output, c1_output, c2_output, c_output; //выход
cout << "\t \t Железо общее\n \n " ; //решение для входа
cout << " Вход " ;
D_and_result_ferum( d1_input, d2_input, c1_input, c2_input, 120 , 310 ) ;
show_begin_ferum( d1_input, d2_input, c1_input, c2_input) ;
show_end_ferum( c1_input, c2_input, c_input) ;
cout << " После биор" ; //решение для биора
D_and_result_ferum( d1_bior, d2_bior, c1_bior, c2_bior, ( int ) ( ( 0.65 * c_input - 0.1 ) * 100 ) , ( int ) ( ( 0.65 * c_input + 0.2 ) * 100 ) ) ;
show_begin_ferum( d1_bior, d2_bior, c1_bior, c2_bior) ;
show_end_ferum( c1_bior, c2_bior, c_bior) ;
cout << " После вторичной" ; //решение для вторичной
D_and_result_ferum( d1_secondary, d2_secondary, c1_secondary, c2_secondary, ( int ) ( ( 0.75 * c_bior - 0.15 ) * 100 ) , ( int ) ( ( 0.75 * c_bior + 0.15 ) * 100 ) ) ;
show_begin_ferum( d1_secondary, d2_secondary, c1_secondary, c2_secondary) ;
show_end_ferum( c1_secondary, c2_secondary, c_secondary) ;
cout << " Выход" ; //решение для выхода
D_and_result_ferum( d1_output, d2_output, c1_output, c2_output, ( int ) ( ( c_secondary - 0.2 ) * 100 ) , ( int ) ( ( c_secondary - 0.1 ) * 100 ) ) ;
show_begin_ferum( d1_output, d2_output, c1_output, c2_output) ;
show_end_ferum( c1_output, c2_output, c_output) ;
cout << "________________________________________________________________________________\n \n " ;
return ;
}
int main( int argc, char * argv[ ] )
{
srand ( time ( NULL ) ) ;
setlocale( LC_ALL, "Russian" ) ;
const int Value = 50 ;
int final_res1= 0 , final_res2= 0 ;
double m1_1 = 0 , m2_1 = 0 , m_dushes_1 = 0 ;
double m1_2 = 0 , m2_2 = 0 , m_dushes_2 = 0 ; //для входа перменые
int result_1_bior = 0 , result_2_bior = 0 ; //для биора
double m1_1_bior = 0 , m2_1_bior = 0 , m_dushes_1_bior = 0 ;
double m1_2_bior = 0 , m2_2_bior = 0 , m_dushes_2_bior = 0 ;
int result_1_secondary = 0 , result_2_secondary = 0 ; //для вторичеой
double m1_1_secondary = 0 , m2_1_secondary = 0 , m_dushes_1_secondary = 0 ;
double m1_2_secondary = 0 , m2_2_secondary = 0 , m_dushes_2_secondary = 0 ;
int result_1_output = 0 , result_2_output = 0 ; //для выхода
double m1_1_output = 0 , m2_1_output = 0 , m_dushes_1_output = 0 ;
double m1_2_output = 0 , m2_2_output = 0 , m_dushes_2_output = 0 ;
cout << "\t \t Взвешивание вещества\n \n " ;
massa_and_result( m1_1, m2_1, m_dushes_1, final_res1,true ,230 ,370 ) ; //решение задачи для входа
cout << " Вход " ;
show_begin( m1_1, m2_1, m_dushes_1, final_res1, Value) ;
massa_and_result( m1_2, m2_2, m_dushes_2, final_res2, false ,230 ,370 , final_res1) ;
show_begin( m1_2, m2_2, m_dushes_2, final_res2, Value) ;
show_end( final_res1, final_res2) ;
cout << " После биор. " ; //решение задачи биор
massa_and_result( m1_1_bior, m2_1_bior, m_dushes_1_bior, result_1_bior, true , 90 , 140 , 0 , 20 ) ;
show_begin( m1_1_bior, m2_1_bior, m_dushes_1_bior, result_1_bior, Value) ;
massa_and_result( m1_2_bior, m2_2_bior, m_dushes_2_bior, result_2_bior, false , 90 , 140 , result_1_bior, 20 ) ;
show_begin( m1_2_bior, m2_2_bior, m_dushes_2_bior, result_2_bior, Value) ;
show_end( result_1_bior, result_2_bior) ;
cout << " После втор. " ; //Решение для вторичной
massa_and_result( m1_1_secondary, m2_1_secondary, m_dushes_1_secondary, result_1_secondary, true , 40 , 60 ) ;
show_begin( m1_1_secondary, m2_1_secondary, m_dushes_1_secondary, result_1_secondary, Value) ;
massa_and_result( m1_2_secondary, m2_2_secondary, m_dushes_2_secondary, result_2_secondary, false , 40 , 60 , result_1_secondary) ;
show_begin( m1_2_secondary, m2_2_secondary, m_dushes_2_secondary, result_2_secondary, Value) ;
show_end( result_1_secondary, result_2_secondary) ;
cout << " Выход " ; //Решение для выхода
massa_and_result( m1_1_output, m2_1_output, m_dushes_1_output, result_1_output, true , 16 , 24 ) ;
show_begin( m1_1_output, m2_1_output, m_dushes_1_output, result_1_output, Value) ;
massa_and_result( m1_2_output, m2_2_output, m_dushes_2_output, result_2_output, false , 0 , 0 , result_1_output ) ;
show_begin( m1_2_output, m2_2_output, m_dushes_2_output, result_2_output, Value) ;
show_end( result_1_output, result_2_output) ;
cout << "________________________________________________________________________________\n \n " ;
//____________________________________________Сухой остаток(dry)__________________________________________________________________
int final_res1_dry = 0 , final_res2_dry = 0 ;
double m1_1_dry = 0 , m2_1_dry = 0 , m_dushes_1_dry = 0 ;
double m1_2_dry = 0 , m2_2_dry = 0 , m_dushes_2_dry = 0 ; //для входа перменые(сухой остаток)
int result_1_bior_dry = 0 , result_2_bior_dry = 0 ; //для биора(сухой остаток)
double m1_1_bior_dry = 0 , m2_1_bior_dry = 0 , m_dushes_1_bior_dry = 0 ;
double m1_2_bior_dry = 0 , m2_2_bior_dry = 0 , m_dushes_2_bior_dry = 0 ;
int result_1_secondary_dry = 0 , result_2_secondary_dry = 0 ; //для вторичеой(сухой остаток)
double m1_1_secondary_dry = 0 , m2_1_secondary_dry = 0 , m_dushes_1_secondary_dry = 0 ;
double m1_2_secondary_dry = 0 , m2_2_secondary_dry = 0 , m_dushes_2_secondary_dry = 0 ;
int result_1_output_dry = 0 , result_2_output_dry = 0 ; //для выхода(сухой остаток)
double m1_1_output_dry = 0 , m2_1_output_dry = 0 , m_dushes_1_output_dry = 0 ;
double m1_2_output_dry = 0 , m2_2_output_dry = 0 , m_dushes_2_output_dry = 0 ;
cout << "\t \t \t Сухой остаток\n \n " ;
massa_and_result( m1_1_dry, m2_1_dry, m_dushes_1_dry, final_res1_dry, true , 500 , 700 ,0 ,75 ) ; //решение задачи для входа(сухой остаток)
cout << " Вход " ;
show_begin( m1_1_dry, m2_1_dry, m_dushes_1_dry, final_res1_dry, Value, false ) ;
massa_and_result( m1_2_dry, m2_2_dry, m_dushes_2_dry, final_res2_dry, false , 500 , 700 , final_res1_dry,75 ) ;
show_begin( m1_2_dry, m2_2_dry, m_dushes_2_dry, final_res2_dry, Value,false ) ;
show_end( final_res1_dry, final_res2_dry) ;
cout << " После биор. " ; //решение задачи биор(сухой остаток)
massa_and_result( m1_1_bior_dry, m2_1_bior_dry, m_dushes_1_bior_dry, result_1_bior_dry, true , final_res1_dry- 180 , final_res1_dry- 120 , 0 , 76 ) ;
show_begin( m1_1_bior_dry, m2_1_bior_dry, m_dushes_1_bior_dry, result_1_bior_dry, Value,false ) ;
massa_and_result( m1_2_bior_dry, m2_2_bior_dry, m_dushes_2_bior_dry, result_2_bior_dry, false , final_res1_dry - 180 , final_res1_dry - 120 , result_1_bior_dry,76 ) ;
show_begin( m1_2_bior_dry, m2_2_bior_dry, m_dushes_2_bior_dry, result_2_bior_dry, Value,false ) ;
show_end( result_1_bior_dry, result_2_bior_dry) ;
//Решение для выхода(сухой остаток)
massa_and_result( m1_1_output_dry, m2_1_output_dry, m_dushes_1_output_dry, result_1_output_dry, true , final_res1_dry / 2 - 15 , final_res1_dry / 2 ,0 ,75 ) ;
massa_and_result( m1_2_output_dry, m2_2_output_dry, m_dushes_2_output_dry, result_2_output_dry, false , 0 , 0 , result_1_output_dry,75 ) ;
cout << " После втор. " ; //Решение для вторичной(сухой остаток)
massa_and_result( m1_1_secondary_dry, m2_1_secondary_dry, m_dushes_1_secondary_dry, result_1_secondary_dry, true , result_1_output_dry + 35 , result_1_output_dry + 70 , 0 ,75 ) ;
show_begin( m1_1_secondary_dry, m2_1_secondary_dry, m_dushes_1_secondary_dry, result_1_secondary_dry, Value,false ) ;
massa_and_result( m1_2_secondary_dry, m2_2_secondary_dry, m_dushes_2_secondary_dry, result_2_secondary_dry, false , 0 , 0 , result_1_secondary_dry,75 ) ;
show_begin( m1_2_secondary_dry, m2_2_secondary_dry, m_dushes_2_secondary_dry, result_2_secondary_dry, Value,false ) ;
show_end( result_1_secondary_dry, result_2_secondary_dry) ;
cout << " Выход " ;
show_begin( m1_1_output_dry, m2_1_output_dry, m_dushes_1_output_dry, result_1_output_dry, Value,false ) ;
show_begin( m1_2_output_dry, m2_2_output_dry, m_dushes_2_output_dry, result_2_output_dry, Value,false ) ;
show_end( result_1_output_dry, result_2_output_dry) ;
cout << "________________________________________________________________________________\n \n " ;
azot_nitr( ) ;
nitrat( ) ;
amon( ) ;
hlor( ) ;
sylfat( ) ;
fosfar( ) ;
ferum( ) ;
system ( "pause" ) ;
return 0 ;
}
CiNpbmNsdWRlIDxtYXRoLmg+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNzdGRsaWI+CiNpbmNsdWRlIDxjdGltZT4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8v0YTRg9C90LrRhtC40Lgg0LTQu9GPINCy0LfQtdGI0LXQvdC90L7Qs9C+INCy0LXRidC10YHRgtCy0LAg0Lgg0YHRg9GF0L7Qs9C+INC+0YHRgtCw0YLQutCwCgpkb3VibGUgdHJhbmMoZG91YmxlIHgsIGludCBuID0gNCkKewoJaW50IHRlbXA7CgoJdGVtcCA9IHggKiBwb3coMTAsIG4gKyAxKTsKCWlmICh0ZW1wICUgMTAgPCA1KQoJewoJCXRlbXAgPSB0ZW1wIC8gMTA7Cgl9CgllbHNlCgl7CgkJdGVtcCA9IHRlbXAgLyAxMCArIDE7Cgl9CglyZXR1cm4gKHRlbXAgLyBwb3coMTAuMCwgbikpOwoKfQp2b2lkIG1hc3NhX2FuZF9yZXN1bHQoZG91YmxlICZtMSwgZG91YmxlICZtMiwgZG91YmxlICZtX2R1c2hlcywgaW50ICZmaW5hbF9yZXMsIGJvb2wgcGFydDEgPSB0cnVlLCBpbnQgbG93ZXJfbGltID0gMCwgaW50IGhpZ2hfbGltID0gMSwgaW50IHZhcl9mb3JfcmVzdWx0MiA9IDAsIGludCBuID0gMTkpCnsKCQoJZG91YmxlIGRpZmZlcmVuY2U7CglpbnQgdGVtcDEsIHRlbXAyOwoJaWYgKHBhcnQxKQoJewoJCWZpbmFsX3JlcyA9IGxvd2VyX2xpbSArIHJhbmQoKSAlIChoaWdoX2xpbS1sb3dlcl9saW0pOwoJCWlmIChmaW5hbF9yZXMgJSAyID09IDEpCgkJewoJCQlmaW5hbF9yZXMrKzsKCQl9Cgl9CgllbHNlCgl7CgkJZmluYWxfcmVzID0gdmFyX2Zvcl9yZXN1bHQyICsgKDQgKyByYW5kKCkgJSA0KTsKCQlpZiAoZmluYWxfcmVzICUgMiAhPSB2YXJfZm9yX3Jlc3VsdDIgJSAyKQoJCXsKCQkJZmluYWxfcmVzID0gZmluYWxfcmVzICsgMTsKCQl9Cgl9CglkaWZmZXJlbmNlID0gZmluYWxfcmVzICogNTAgLyAxMDAwLjAgLyAxMDAwLjA7Cgl0ZW1wMSA9IGRpZmZlcmVuY2UgKiAxMDAwMDsKCXRlbXAyID0gKDEwMDAgKyB0ZW1wMSkrcmFuZCgpICUgODcwMCA7CgltMj1uICsgdGVtcDIgLyAxMDAwMC4wOwoJbTEgPSBtMiArIDAuMDAwMTsKCW1fZHVzaGVzID0gbTIgLSBkaWZmZXJlbmNlOwoJcmV0dXJuOwoKfQp2b2lkIHNob3dfYmVnaW4oZG91YmxlIG0xLCBkb3VibGUgbTIsIGRvdWJsZSBtX2R1c2hlcywgaW50IGZpbmFsX3JlcywgaW50IHYsIGJvb2wgcGFydDE9dHJ1ZSApCnsKCXNldGxvY2FsZShMQ19BTEwsICJSdXNzaWFuIik7CglpZiAocGFydDEpCgljb3V0IDw8ICIgIFY9ICIgPDwgdiA8PCAiINC80LsgIE3Qv9GD0YHRgj0iIDw8IG1fZHVzaGVzIDw8ICI7ICBtMT0iIDw8IG0xIDw8ICI7ICBtMj0iIDw8IG0yIDw8ICI7IiA8PCBlbmRsCgkJPDwgIiAgKCIgPDwgbTIgPDwgIi0iIDw8IG1fZHVzaGVzIDw8ICIpLyIgPDwgdiA8PCAiKjEwMDAqMTAwMD0iIDw8IGZpbmFsX3Jlczw8ZW5kbDsKCWVsc2UKCQljb3V0IDw8ICIgIFY9ICIgPDwgdiA8PCAiINC80LsgIE3Qv9GD0YHRgj0iIDw8IG1fZHVzaGVzIDw8ICI7ICBtMT0iIDw8IG0xIDw8ICI7ICBtMj0iIDw8IG0yIDw8ICI7IiA8PCBlbmRsCgkJPDwgIiAgKCIgPDwgbTIgPDwgIi0iIDw8IG1fZHVzaGVzIDw8ICIpICoxMDAwKjEwMDAvIjw8djw8Ij0iIDw8IGZpbmFsX3JlcyA8PCBlbmRsOwoKCn0Kdm9pZCBzaG93X2VuZChpbnQgcmVzMSwgaW50IHJlczIpCnsKCWNvdXQgPDwgIlx0XHQoIiA8PCByZXMxIDw8ICIgKyAiIDw8IHJlczIgPDwgIikvMiA9IiA8PCAocmVzMSArIHJlczIpIC8gMiA8PCBlbmRsCgkJPDwgIlx0XHRcdGM9IiA8PCAocmVzMSArIHJlczIpIC8gMiA8PCAiKNC80LMv0LTQvDMpXG4iOwp9Ci8vX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwovLy8v0YTRg9C90LrRhtC40Lgg0LTQu9GPINCw0LfQvtGC0LAg0L3QuNGC0YDQuNC50L3QvtCz0L4oYXpvdCkKCnZvaWQgRF9hbmRfcmVzdWx0X2F6b3Rfbml0cml0KGRvdWJsZSAmZDEsIGRvdWJsZSAmZDIsIGRvdWJsZSAmYzEsIGRvdWJsZSAmYzIsIGludCBsb3dlcl9saW0gPSAwLCBpbnQgaGlnaF9saW0gPSAxKQp7CgoJYzEgPSAobG93ZXJfbGltICsgcmFuZCgpICUgKGhpZ2hfbGltIC0gbG93ZXJfbGltKSkvMTAwMC4wOy8v0YEqMTAwMCDQstGB0LXQs9C00LAg0LTQvtC70LbQvdC+INCx0YvRgtGMINC90LXRh9C10YLQvdC+0LUgCglkMSA9IHRyYW5jKChjMSAtIDAuMDAzMikgLyAxLjk2NzcsMyk7CgljMSA9IHRyYW5jKDEuOTY3NypkMSArIDAuMDAzMiwgMyk7CglkMiA9IGQxICsgKC0xK3JhbmQoKSAlIDMpIC8gMTAwMC4wOwoJYzIgPSB0cmFuYygxLjk2NzcqZDIgKyAwLjAwMzIsMyk7CglyZXR1cm47Cn0Kdm9pZCBzaG93X2JlZ2luX2F6b3Rfbml0cihkb3VibGUgZDEsIGRvdWJsZSBkMiwgZG91YmxlIGMxLCBkb3VibGUgYzIsIGludCB2ID0gNTApCnsKCXNldGxvY2FsZShMQ19BTEwsICJSdXNzaWFuIik7Cgljb3V0IDw8ICIgIFY9ICIgPDwgdiA8PCAiINC80LsgIEQxPSIgPDwgZDEgPDwgIjsgIEQyPSIgPDwgZDIgPDwgIjsgIiA8PCBlbmRsCgkJPDwgIiAgKDEuOTY3NyoiIDw8IGQxIDw8ICIgKSArIDAuMDAzMikgKiIgPDx2IDw8Ii8gNTA9IiA8PCBjMSA8PCBlbmRsCgkJPDwgIiAgKDEuOTY3NyoiIDw8IGQyIDw8ICIgKSArIDAuMDAzMikgKiIgPDx2PDwiLyA1MD0iIDw8IGMyIDw8IGVuZGw7CglyZXR1cm47Cn0Kdm9pZCBzaG93X2VuZF9hem90X25pdHIoZG91YmxlIHJlczEsIGRvdWJsZSByZXMyLCBkb3VibGUgJmMpCnsKCWMgPSB0cmFuYygocmVzMSArIHJlczIpIC8gMiAqIDAuMzA0LDMpOwoJY291dCA8PCAiXHRcdCgiIDw8IHJlczEgPDwgIiArICIgPDwgcmVzMiA8PCAiKS8gMiAqIDAsMzA0ID0iIDw8IGMgPDwgZW5kbAoJCTw8ICJcdFx0XHRjPSIgPDwgYzw8ICIo0LzQsy/QtNC8MylcbiIKCTw8ICJcdFx0XHRjPSIgPDwgKHJlczEgKyByZXMyKSAvIDIgKiAwLjMwNCA8PCAiKNC80LMv0LTQvDMpXG4iOwp9CnZvaWQgIGF6b3Rfbml0cigpCnsKCWRvdWJsZSBkMV9pbnB1dCwgZDJfaW5wdXQsIGMxX2lucHV0LCBjMl9pbnB1dCwgY19pbnB1dDsvL9Cy0YXQvtC0CgoJZG91YmxlIGQxX2Jpb3IsIGQyX2Jpb3IsIGMxX2Jpb3IsIGMyX2Jpb3IsIGNfYmlvcjsvL2Jpb3IKCglkb3VibGUgZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCBjX3NlY29uZGFyeTsvL9Cy0YLQvtGA0LjRh9C90LDRjwoKCWRvdWJsZSBkMV9vdXRwdXQsIGQyX291dHB1dCwgYzFfb3V0cHV0LCBjMl9vdXRwdXQsIGNfb3V0cHV0Oy8v0LLRi9GF0L7QtAoJCgljb3V0IDw8ICJcdFx0ICAg0JDQt9C+0YIg0L3QuNGC0YDQuNC50L3Ri9C5XG5cbiI7Ly/RgNC10YjQtdC90LjQtSDQtNC70Y8g0LLRhdC+0LTQsAoJY291dCA8PCAiICAg0JLRhdC+0LQgICI7CglEX2FuZF9yZXN1bHRfYXpvdF9uaXRyaXQoZDFfaW5wdXQsIGQyX2lucHV0LCBjMV9pbnB1dCwgYzJfaW5wdXQsMjYzLDU1OSk7CglzaG93X2JlZ2luX2F6b3Rfbml0cihkMV9pbnB1dCwgZDJfaW5wdXQsIGMxX2lucHV0LCBjMl9pbnB1dCk7CglzaG93X2VuZF9hem90X25pdHIoYzFfaW5wdXQsIGMyX2lucHV0LCBjX2lucHV0KTsKCgljb3V0IDw8ICIgINCf0L7RgdC70LUg0LHQuNC+0YAiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQsdC40L7RgNCwCglEX2FuZF9yZXN1bHRfYXpvdF9uaXRyaXQoZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvciwgKGludCkoKGNfaW5wdXQgKiAxMDAwICsgMzApIC8gMC4zMDQpLCAoaW50KSgoY19pbnB1dCAqIDEwMDAgKyA2MCkgLyAwLjMwNCkpOwoJc2hvd19iZWdpbl9hem90X25pdHIoZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvcik7CglzaG93X2VuZF9hem90X25pdHIoYzFfYmlvciwgYzJfYmlvciwgY19iaW9yKTsKCgljb3V0IDw8ICIgINCf0L7RgdC70LUg0LLRgtC+0YDQuNGH0L3QvtC5IjsgLy/RgNC10YjQtdC90LjQtSDQtNC70Y8g0LLRgtC+0YDQuNGH0L3QvtC5CglEX2FuZF9yZXN1bHRfYXpvdF9uaXRyaXQoZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCAoaW50KSgoY19iaW9yICogMTAwMCArIDI1KSAvIDAuMzA0KSwgKGludCkoKGNfYmlvciAqIDEwMDAgKyA0MCkgLyAwLjMwNCkpOwoJc2hvd19iZWdpbl9hem90X25pdHIoZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5KTsKCXNob3dfZW5kX2F6b3Rfbml0cihjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwgY19zZWNvbmRhcnkpOwoKCWNvdXQgPDwgIiAg0JLRi9GF0L7QtCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YvRhdC+0LTQsAoJRF9hbmRfcmVzdWx0X2F6b3Rfbml0cml0KGQxX291dHB1dCwgZDJfb3V0cHV0LCBjMV9vdXRwdXQsIGMyX291dHB1dCwgKGludCkoKGNfc2Vjb25kYXJ5ICogMTAwMCArIDQ1KSAvIDAuMzA0KSwgKGludCkoKGNfc2Vjb25kYXJ5ICogMTAwMCArIDg1KSAvIDAuMzA0KSk7CglzaG93X2JlZ2luX2F6b3Rfbml0cihkMV9vdXRwdXQsIGQyX291dHB1dCwgYzFfb3V0cHV0LCBjMl9vdXRwdXQpOwoJc2hvd19lbmRfYXpvdF9uaXRyKGMxX291dHB1dCwgYzJfb3V0cHV0LCBjX291dHB1dCk7Cgljb3V0IDw8ICJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuXG4iOwoJcmV0dXJuOwp9Ci8v0YTRg9C90LrRhtC40Lgg0LTQu9GPINC90LjRgtGA0LDRgtC+0LIKdm9pZCBEX2FuZF9yZXN1bHRfbml0cmF0KGRvdWJsZSAmZDEsIGRvdWJsZSAmZDIsIGRvdWJsZSAmYzEsIGRvdWJsZSAmYzIsIGludCBsb3dlcl9saW0gPSAwLCBpbnQgaGlnaF9saW0gPSAxKQp7CgljMSA9IChsb3dlcl9saW0gKyByYW5kKCkgJSAoaGlnaF9saW0gLSBsb3dlcl9saW0pKSAvIDEwMDAuMDsKCWQxID0gdHJhbmMoKGMxIC0gMC4wOTEpIC8gMTEuODIxLCAzKTsKCWQyID0gZDEgKyAoLTEgKyByYW5kKCkgJSAzKSAvIDEwMDAuMDsKCWMxID0gdHJhbmMoMTEuODIxKmQxICsgMC4wOTEsIDMpOwoJYzIgPSB0cmFuYygxMS44MjEqZDIgKyAwLjA5MSwzKTsKCXJldHVybjsKfQp2b2lkIHNob3dfYmVnaW5fbml0cmF0KGRvdWJsZSBkMSwgZG91YmxlIGQyLCBkb3VibGUgYzEsIGRvdWJsZSBjMiwgaW50IHYgPSAyMCkKewoJc2V0bG9jYWxlKExDX0FMTCwgIlJ1c3NpYW4iKTsKCWNvdXQgPDwgIiAgVj0gIiA8PCB2IDw8ICIg0LzQuyAgRDE9IiA8PCBkMSA8PCAiOyAgRDI9IiA8PCBkMiA8PCAiOyAiIDw8IGVuZGwKCQk8PCAiICAoMTEuODIxKiIgPDwgZDEgPDwgIiArIDAuMDkxKSA9IiA8PCBjMSA8PCBlbmRsCgkJPDwgIiAgKDExLjgyMSoiIDw8IGQyIDw8ICIgKyAwLjA5MSkgPSIgPDwgYzIgPDwgZW5kbDsKCXJldHVybjsKfQp2b2lkIHNob3dfZW5kX25pdHJhdChkb3VibGUgcmVzMSwgZG91YmxlIHJlczIsIGRvdWJsZSAmYykKewoJYyA9IHRyYW5jKChyZXMxICsgcmVzMikgLyAyLjAgLDMpOwoJY291dCA8PCAiXHRcdCgiIDw8IHJlczEgPDwgIiArICIgPDwgcmVzMiA8PCAiKS8gMiA9IiA8PCBjIDw8IGVuZGwKCQk8PCAiXHRcdFx0Yz0iIDw8IGMgPDwgIijQvNCzL9C00LwzKVxuIgoJPDwgIlx0XHRcdGM9IiA8PCAocmVzMSArIHJlczIpIC8gMi4wIDw8ICIo0LzQsy/QtNC8MylcbiI7Cn0KCnZvaWQgIG5pdHJhdCgpCnsKCWRvdWJsZSBkMV9pbnB1dCwgZDJfaW5wdXQsIGMxX2lucHV0LCBjMl9pbnB1dCwgY19pbnB1dDsvL9Cy0YXQvtC0CgoJZG91YmxlIGQxX2Jpb3IsIGQyX2Jpb3IsIGMxX2Jpb3IsIGMyX2Jpb3IsIGNfYmlvcjsvL2Jpb3IKCglkb3VibGUgZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCBjX3NlY29uZGFyeTsvL9Cy0YLQvtGA0LjRh9C90LDRjwoKCWRvdWJsZSBkMV9vdXRwdXQsIGQyX291dHB1dCwgYzFfb3V0cHV0LCBjMl9vdXRwdXQsIGNfb3V0cHV0Oy8v0LLRi9GF0L7QtAoKCWNvdXQgPDwgIlx0XHQgICDQndC40YLRgNCw0YLRi1xuXG4iOy8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YXQvtC00LAKCWNvdXQgPDwgIiAgINCS0YXQvtC0ICAiOwoJRF9hbmRfcmVzdWx0X25pdHJhdChkMV9pbnB1dCwgZDJfaW5wdXQsIGMxX2lucHV0LCBjMl9pbnB1dCwgNDUwMCwgNzgwMCk7CglzaG93X2JlZ2luX25pdHJhdChkMV9pbnB1dCwgZDJfaW5wdXQsIGMxX2lucHV0LCBjMl9pbnB1dCk7CglzaG93X2VuZF9uaXRyYXQoYzFfaW5wdXQsIGMyX2lucHV0LCBjX2lucHV0KTsKCgljb3V0IDw8ICIgINCf0L7RgdC70LUg0LHQuNC+0YAiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQsdC40L7RgNCwCglEX2FuZF9yZXN1bHRfbml0cmF0KGQxX2Jpb3IsIGQyX2Jpb3IsIGMxX2Jpb3IsIGMyX2Jpb3IsIChpbnQpKChjX2lucHV0IC0gMS45MCkgKiAxMDAwKSwgKGludCkoKGNfaW5wdXQgLSAxLjIwKSAqIDEwMDApKTsKCXNob3dfYmVnaW5fbml0cmF0KGQxX2Jpb3IsIGQyX2Jpb3IsIGMxX2Jpb3IsIGMyX2Jpb3IpOwoJc2hvd19lbmRfbml0cmF0KGMxX2Jpb3IsIGMyX2Jpb3IsIGNfYmlvcik7CgoJY291dCA8PCAiICDQn9C+0YHQu9C1INCy0YLQvtGA0LjRh9C90L7QuSI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YLQvtGA0LjRh9C90L7QuQoJRF9hbmRfcmVzdWx0X25pdHJhdChkMV9zZWNvbmRhcnksIGQyX3NlY29uZGFyeSwgYzFfc2Vjb25kYXJ5LCBjMl9zZWNvbmRhcnksIChpbnQpKChjX2Jpb3IgLSAxLjUpICogMTAwMCksIChpbnQpKChjX2Jpb3IgLSAwLjcpICogMTAwMCkpOwoJc2hvd19iZWdpbl9uaXRyYXQoZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5KTsKCXNob3dfZW5kX25pdHJhdChjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwgY19zZWNvbmRhcnkpOwoKCWNvdXQgPDwgIiAg0JLRi9GF0L7QtCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YvRhdC+0LTQsAoJRF9hbmRfcmVzdWx0X25pdHJhdChkMV9vdXRwdXQsIGQyX291dHB1dCwgYzFfb3V0cHV0LCBjMl9vdXRwdXQsIChpbnQpKCgwLjUqY19pbnB1dCAtIDAuOCkgKiAxMDAwKSwgKGludCkoKDAuNSpjX2lucHV0IC0gMC4yKSAqIDEwMDApKTsKCXNob3dfYmVnaW5fbml0cmF0KGQxX291dHB1dCwgZDJfb3V0cHV0LCBjMV9vdXRwdXQsIGMyX291dHB1dCk7CglzaG93X2VuZF9uaXRyYXQoYzFfb3V0cHV0LCBjMl9vdXRwdXQsIGNfb3V0cHV0KTsKCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cbiI7CglyZXR1cm47Cn0KLy/QsNC30L7RgiDQsNC80L7QvdC40LnQvdGL0LkKCgoKdm9pZCBEX2FuZF9yZXN1bHRfYXpvdF9hbW9uKGRvdWJsZSAmZDEsIGRvdWJsZSAmZDIsIGRvdWJsZSAmYzEsIGRvdWJsZSAmYzIsIGludCBsb3dlcl9saW0gPSAwLCBpbnQgaGlnaF9saW0gPSAxKQp7CQoJYzEgPSAobG93ZXJfbGltICsgcmFuZCgpICUgKGhpZ2hfbGltIC0gbG93ZXJfbGltKSkvMTAwLjA7CglkMSA9IHRyYW5jKCgoYzEvMTAwLjApLTAuMDAwMTcpLzguODk5NCwzKTsKCWQyID0gZDEgKyAoLTEgKyByYW5kKCkgJSAzKSAvIDEwMDAuMDsKCWMxID0gdHJhbmMoKDguODk5NCpkMSArIDAuMDAxNykgKiAxMDAsIDIpOwoJYzIgPXRyYW5jKCAoOC44OTk0KmQyICsgMC4wMDE3KSoxMDAsMik7CglyZXR1cm47Cn0KCnZvaWQgc2hvd19iZWdpbl9hem90X2Ftb24oZG91YmxlIGQxLCBkb3VibGUgZDIsIGRvdWJsZSBjMSwgZG91YmxlIGMyLCBkb3VibGUgdiA9IDAuNSkKewoJc2V0bG9jYWxlKExDX0FMTCwgIlJ1c3NpYW4iKTsKCWNvdXQgPDwgIiAgVj0gIiA8PCB2IDw8ICIg0LzQuyAgRDE9IiA8PCBkMSA8PCAiOyAgRDI9IiA8PCBkMiA8PCAiOyAiIDw8IGVuZGwKCQk8PCAiICAoKDguODk5NCoiIDw8IGQxIDw8ICIpICsgMC4wMDE3KSo1MC8gMC41ID0iIDw8IGMxIDw8IGVuZGwKCQk8PCAiICAoKDguODk5NCoiIDw8IGQyIDw8ICIpICsgMC4wMDE3KSo1MC8gMC41ID0iIDw8IGMyIDw8IGVuZGw7CglyZXR1cm47Cn0Kdm9pZCBzaG93X2VuZF9hem90X2Ftb25fYW5kX2hsb3IoZG91YmxlIHJlczEsIGRvdWJsZSByZXMyLCBkb3VibGUgJmMpCnsKCWMgPSB0cmFuYygocmVzMStyZXMyKS8yLjAsMik7Cgljb3V0IDw8ICJcdFx0KCIgPDwgcmVzMSA8PCAiICsgIiA8PCByZXMyIDw8ICIpLyAyID0iIDw8IGMgPDwgZW5kbAoJCTw8ICJcdFx0XHRjPSIgPDwgYyA8PCAiKNC80LMv0LTQvDMpXG4iCgk8PCAiXHRcdFx0Yz0iIDw8IChyZXMxICsgcmVzMikgLyAyLjAgPDwgIijQvNCzL9C00LwzKVxuIjsKfQp2b2lkICBhbW9uKCkKewoJZG91YmxlIGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0LCBjX2lucHV0Oy8v0LLRhdC+0LQKCglkb3VibGUgZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvciwgY19iaW9yOy8vYmlvcgoKCWRvdWJsZSBkMV9zZWNvbmRhcnksIGQyX3NlY29uZGFyeTsKCWRvdWJsZSBjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwgY19zZWNvbmRhcnk7Ly/QstGC0L7RgNC40YfQvdCw0Y8KCglkb3VibGUgZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0LCBjX291dHB1dDsvL9Cy0YvRhdC+0LQKCgljb3V0IDw8ICJcdFx0ICAg0JDQt9C+0YIg0LDQvNC+0L3QuNC50L3Ri9C5XG5cbiI7Ly/RgNC10YjQtdC90LjQtSDQtNC70Y8g0LLRhdC+0LTQsAoJY291dCA8PCAiICAg0JLRhdC+0LQgICI7CglEX2FuZF9yZXN1bHRfYXpvdF9hbW9uKGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0LCA0MjAwLCA2MDAwKTsKCXNob3dfYmVnaW5fYXpvdF9hbW9uKGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0KTsKCXNob3dfZW5kX2F6b3RfYW1vbl9hbmRfaGxvcihjMV9pbnB1dCwgYzJfaW5wdXQsIGNfaW5wdXQpOwoKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQsdC40L7RgCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCx0LjQvtGA0LAKCURfYW5kX3Jlc3VsdF9hem90X2Ftb24oZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvciwgKGNfaW5wdXQgLSAxNSkqMTAwLCggY19pbnB1dCAtIDExKSoxMDApOwoJc2hvd19iZWdpbl9hem90X2Ftb24oZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvcik7CglzaG93X2VuZF9hem90X2Ftb25fYW5kX2hsb3IoYzFfYmlvciwgYzJfYmlvciwgY19iaW9yKTsKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQstGC0L7RgNC40YfQvdC+0LkiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGC0L7RgNC40YfQvdC+0LkKCURfYW5kX3Jlc3VsdF9hem90X2Ftb24oZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCAyMDAwLCAyNzAwKTsKCXNob3dfYmVnaW5fYXpvdF9hbW9uKGQxX3NlY29uZGFyeSwgZDJfc2Vjb25kYXJ5LCBjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSk7CglzaG93X2VuZF9hem90X2Ftb25fYW5kX2hsb3IoYzFfc2Vjb25kYXJ5LCBjMl9zZWNvbmRhcnksIGNfc2Vjb25kYXJ5KTsKCgljb3V0IDw8ICIgINCS0YvRhdC+0LQiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGL0YXQvtC00LAKCURfYW5kX3Jlc3VsdF9hem90X2Ftb24oZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0LCAxNzAwLCAxODkwKTsKCXNob3dfYmVnaW5fYXpvdF9hbW9uKGQxX291dHB1dCwgZDJfb3V0cHV0LCBjMV9vdXRwdXQsIGMyX291dHB1dCk7CglzaG93X2VuZF9hem90X2Ftb25fYW5kX2hsb3IoYzFfb3V0cHV0LCBjMl9vdXRwdXQsIGNfb3V0cHV0KTsKCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cbiI7CglyZXR1cm47Cn0KLy/RhdC70L7RgNC40LTRiwoKdm9pZCBEX2FuZF9yZXN1bHRfaGxvcihkb3VibGUgJmQxLCBkb3VibGUgJmQyLCBkb3VibGUgJmMxLCBkb3VibGUgJmMyLCBpbnQgbG93ZXJfbGltID0gMCwgaW50IGhpZ2hfbGltID0gMSkKewoJYzEgPSAobG93ZXJfbGltICsgcmFuZCgpICUgKGhpZ2hfbGltIC0gbG93ZXJfbGltKSkvMTAwLjA7CglkMSA9IHRyYW5jKGMxLzM1NC41LzAuMDUvMC45OTkwLDEpOwoJZDIgPSBkMSArICgtMSArIHJhbmQoKSAlIDMpIC8gMTAuMDsKCWMxID0gdHJhbmMoZDEqMC4wNSozNTQuNSowLjk5OTAsIDIpOwoJYzIgPSB0cmFuYyhkMiowLjA1KjM1NC41KjAuOTk5MCwyKTsKCXJldHVybjsKfQp2b2lkIHNob3dfYmVnaW5faGxvcihkb3VibGUgZDEsIGRvdWJsZSBkMiwgZG91YmxlIGMxLCBkb3VibGUgYzIsIGludCB2PTEwMCkKewoJc2V0bG9jYWxlKExDX0FMTCwgIlJ1c3NpYW4iKTsKCWNvdXQgPDwgIiAgVj0gIiA8PCB2IDw8ICIg0LzQuyAgWDE9IiA8PCBkMSA8PCAiOyAgWDI9IiA8PCBkMiA8PCAiOyAiIDw8IGVuZGwKCQk8PCAiICAoIiA8PCBkMSA8PCAiKjAuMDUpICozNS40NSkqMC45OTkwKSoxMDAwLzEwMCA9IiA8PCBjMSA8PCBlbmRsCgkJPDwgIiAgKCIgPDwgZDIgPDwgIiowLjA1KSAqMzUuNDUpKjAuOTk5MCkqMTAwMC8xMDAgPSIgPDwgYzIgPDwgZW5kbDsKCXJldHVybjsKfQp2b2lkICBobG9yKCkKewoJZG91YmxlIGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0LCBjX2lucHV0Oy8v0LLRhdC+0LQKCglkb3VibGUgZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvciwgY19iaW9yOy8vYmlvcgoKCWRvdWJsZSBkMV9zZWNvbmRhcnksIGQyX3NlY29uZGFyeTsKCWRvdWJsZSBjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwgY19zZWNvbmRhcnk7Ly/QstGC0L7RgNC40YfQvdCw0Y8KCglkb3VibGUgZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0LCBjX291dHB1dDsvL9Cy0YvRhdC+0LQKCgljb3V0IDw8ICJcdFx0ICAg0KXQu9C+0YDQuNC00YtcblxuIjsvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGF0L7QtNCwCgljb3V0IDw8ICIgICDQktGF0L7QtCAgIjsKCURfYW5kX3Jlc3VsdF9obG9yKGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0LCAxMTAwMCwgMTkwMDApOwoJc2hvd19iZWdpbl9obG9yKGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0KTsKCXNob3dfZW5kX2F6b3RfYW1vbl9hbmRfaGxvcihjMV9pbnB1dCwgYzJfaW5wdXQsIGNfaW5wdXQpOwoKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQsdC40L7RgCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCx0LjQvtGA0LAKCURfYW5kX3Jlc3VsdF9obG9yKGQxX2Jpb3IsIGQyX2Jpb3IsIGMxX2Jpb3IsIGMyX2Jpb3IsICgwLjcqIGNfaW5wdXQgLSAxMCkqMTAwLCAoMC43KiBjX2lucHV0ICsgMTApKjEwMCk7CglzaG93X2JlZ2luX2hsb3IoZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvcik7CglzaG93X2VuZF9hem90X2Ftb25fYW5kX2hsb3IoYzFfYmlvciwgYzJfYmlvciwgY19iaW9yKTsKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQstGC0L7RgNC40YfQvdC+0LkiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGC0L7RgNC40YfQvdC+0LkKCURfYW5kX3Jlc3VsdF9obG9yKGQxX3NlY29uZGFyeSwgZDJfc2Vjb25kYXJ5LCBjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwoIDAuNSogY19pbnB1dCAtIDMpKjEwMCwgKDAuNSogY19pbnB1dCArMTUpKjEwMCk7CglzaG93X2JlZ2luX2hsb3IoZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5KTsKCXNob3dfZW5kX2F6b3RfYW1vbl9hbmRfaGxvcihjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwgY19zZWNvbmRhcnkpOwoKCWNvdXQgPDwgIiAg0JLRi9GF0L7QtCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YvRhdC+0LTQsAoJRF9hbmRfcmVzdWx0X2hsb3IoZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0LCAoY19zZWNvbmRhcnkgLSAyMCkqMTAwLCAoY19zZWNvbmRhcnktMTApKjEwMCk7CglzaG93X2JlZ2luX2hsb3IoZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0KTsKCXNob3dfZW5kX2F6b3RfYW1vbl9hbmRfaGxvcihjMV9vdXRwdXQsIGMyX291dHB1dCwgY19vdXRwdXQpOwoJY291dCA8PCAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuIjsKCXJldHVybjsKfQovL2PRg9C70YzRhNCw0YLRiwp2b2lkIERfYW5kX3Jlc3VsdF9zeWxmYXQoZG91YmxlICZkMSwgZG91YmxlICZkMiwgZG91YmxlICZjMSwgZG91YmxlICZjMiwgaW50IGxvd2VyX2xpbSA9IDAsIGludCBoaWdoX2xpbSA9IDEpCnsKCWMxID0gKGxvd2VyX2xpbSArIHJhbmQoKSAlIChoaWdoX2xpbSAtIGxvd2VyX2xpbSkpLzEwMC4wOwoJZDEgPSB0cmFuYygoKGMxIC8gMTAwLjApIC0gMC4wNjA4KSAvIDE4LjQ2OCwgMyk7CglkMiA9IGQxICsgKC0xICsgcmFuZCgpICUgMykgLyAxMDAwLjA7CgljMSA9IHRyYW5jKCgxOC40NjgqZDEgKyAwLjA2MDgpICogMTAwLCAyKTsKCWMyID0gdHJhbmMoKDE4LjQ2OCpkMiArIDAuMDYwOCkgKiAxMDAsIDIpOwoJcmV0dXJuOwp9CnZvaWQgc2hvd19iZWdpbl9zeWxmYXQoZG91YmxlIGQxLCBkb3VibGUgZDIsIGRvdWJsZSBjMSwgZG91YmxlIGMyLCBkb3VibGUgdiA9IDAuNSkKewoJc2V0bG9jYWxlKExDX0FMTCwgIlJ1c3NpYW4iKTsKCWNvdXQgPDwgIiAgVj0gIiA8PCB2IDw8ICIg0LzQuyAgRDE9IiA8PCBkMSA8PCAiOyAgRDI9IiA8PCBkMiA8PCAiOyAiIDw8IGVuZGwKCQk8PCAiICAoKDE4LjQ2OCoiIDw8IGQxIDw8ICIpICsgMC4wNjA4KSoxMDAwLyAxMCA9IiA8PCBjMSA8PCBlbmRsCgkJPDwgIiAgKCgxOC40NjgqIiA8PCBkMiA8PCAiKSArIDAuMDYwOCkqMTAwMC8gMTAgPSIgPDwgYzIgPDwgZW5kbDsKCXJldHVybjsKfQp2b2lkICBzeWxmYXQoKQp7Cglkb3VibGUgZDFfaW5wdXQsIGQyX2lucHV0LCBjMV9pbnB1dCwgYzJfaW5wdXQsIGNfaW5wdXQ7Ly/QstGF0L7QtAoKCWRvdWJsZSBkMV9iaW9yLCBkMl9iaW9yLCBjMV9iaW9yLCBjMl9iaW9yLCBjX2Jpb3I7Ly9iaW9yCgoJZG91YmxlIGQxX3NlY29uZGFyeSwgZDJfc2Vjb25kYXJ5OwoJZG91YmxlIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCBjX3NlY29uZGFyeTsvL9Cy0YLQvtGA0LjRh9C90LDRjwoKCWRvdWJsZSBkMV9vdXRwdXQsIGQyX291dHB1dCwgYzFfb3V0cHV0LCBjMl9vdXRwdXQsIGNfb3V0cHV0Oy8v0LLRi9GF0L7QtAoKCWNvdXQgPDwgIlx0XHQgICDQodGD0LvRjNGE0LDRgtGLXG5cbiI7Ly/RgNC10YjQtdC90LjQtSDQtNC70Y8g0LLRhdC+0LTQsAoJY291dCA8PCAiICAg0JLRhdC+0LQgICI7CglEX2FuZF9yZXN1bHRfc3lsZmF0KGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0LCAxNjAwMCwgMjEwMDApOwoJc2hvd19iZWdpbl9zeWxmYXQoZDFfaW5wdXQsIGQyX2lucHV0LCBjMV9pbnB1dCwgYzJfaW5wdXQpOwoJc2hvd19lbmRfYXpvdF9hbW9uX2FuZF9obG9yKGMxX2lucHV0LCBjMl9pbnB1dCwgY19pbnB1dCk7CgoJY291dCA8PCAiICDQn9C+0YHQu9C1INCx0LjQvtGAIjsgLy/RgNC10YjQtdC90LjQtSDQtNC70Y8g0LHQuNC+0YDQsAoJRF9hbmRfcmVzdWx0X3N5bGZhdChkMV9iaW9yLCBkMl9iaW9yLCBjMV9iaW9yLCBjMl9iaW9yLCAoMC42NSogY19pbnB1dCAtIDE1KSoxMDAsICgwLjY1KiBjX2lucHV0IC01KSoxMDApOwoJc2hvd19iZWdpbl9zeWxmYXQoZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvcik7CglzaG93X2VuZF9hem90X2Ftb25fYW5kX2hsb3IoYzFfYmlvciwgYzJfYmlvciwgY19iaW9yKTsKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQstGC0L7RgNC40YfQvdC+0LkiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGC0L7RgNC40YfQvdC+0LkKCURfYW5kX3Jlc3VsdF9zeWxmYXQoZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCAgKGNfYmlvciAtIDQwKSoxMDAsICAoY19iaW9yIC0gMzApKjEwMCk7CglzaG93X2JlZ2luX3N5bGZhdChkMV9zZWNvbmRhcnksIGQyX3NlY29uZGFyeSwgYzFfc2Vjb25kYXJ5LCBjMl9zZWNvbmRhcnkpOwoJc2hvd19lbmRfYXpvdF9hbW9uX2FuZF9obG9yKGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCBjX3NlY29uZGFyeSk7CgoJY291dCA8PCAiICDQktGL0YXQvtC0IjsgLy/RgNC10YjQtdC90LjQtSDQtNC70Y8g0LLRi9GF0L7QtNCwCglEX2FuZF9yZXN1bHRfc3lsZmF0KGQxX291dHB1dCwgZDJfb3V0cHV0LCBjMV9vdXRwdXQsIGMyX291dHB1dCwgKGNfc2Vjb25kYXJ5LTgpKjEwMCwoY19zZWNvbmRhcnktMTUpKjEwMCk7CglzaG93X2JlZ2luX3N5bGZhdChkMV9vdXRwdXQsIGQyX291dHB1dCwgYzFfb3V0cHV0LCBjMl9vdXRwdXQpOwoJc2hvd19lbmRfYXpvdF9hbW9uX2FuZF9obG9yKGMxX291dHB1dCwgYzJfb3V0cHV0LCBjX291dHB1dCk7Cgljb3V0IDw8ICJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuXG4iOwoJcmV0dXJuOwp9Ci8v0YTQvtGB0YTQsNGAINGE0L7RgdGE0LDRgtC90YvQuQp2b2lkIERfYW5kX3Jlc3VsdF9mb3NmYXIoZG91YmxlICZkMSwgZG91YmxlICZkMiwgZG91YmxlICZjMSwgZG91YmxlICZjMiwgaW50IGxvd2VyX2xpbSA9IDAsIGludCBoaWdoX2xpbSA9IDEpCnsKCWMxID0gKGxvd2VyX2xpbSArIHJhbmQoKSAlIChoaWdoX2xpbSAtIGxvd2VyX2xpbSkpIC8gMTAwLjA7CglkMSA9IHRyYW5jKChjMS8xMC4wICsgMC4wMDM4KSAvIDMuODE4LCAzKTsKCWQyID0gZDEgKyAoLTEgKyByYW5kKCkgJSAzKSAvIDEwMDAuMDsKCWMxID0gdHJhbmMoKDMuODE4KmQxIC0gMC4wMDM4KSoxMC4wLCAyKTsKCWMyID0gdHJhbmMoKDMuODE4KmQyIC0gMC4wMDM4KSoxMC4wLCAyKTsKCXJldHVybjsKfQp2b2lkIHNob3dfYmVnaW5fZm9zZmFyKGRvdWJsZSBkMSwgZG91YmxlIGQyLCBkb3VibGUgYzEsIGRvdWJsZSBjMiwgaW50IHYgPSA1KQp7CglzZXRsb2NhbGUoTENfQUxMLCAiUnVzc2lhbiIpOwoJY291dCA8PCAiICBWPSAiIDw8IHYgPDwgIiDQvNC7ICBEMT0iIDw8IGQxIDw8ICI7ICBEMj0iIDw8IGQyIDw8ICI7ICIgPDwgZW5kbAoJCTw8ICIgICgoMy44MTgqIiA8PCBkMSA8PCAiKSAtIDAuMDAzOCkqNTAvIjw8djw8Ij0iIDw8IGMxIDw8IGVuZGwKCQk8PCAiICAoKDMuODE4KiIgPDwgZDIgPDwgIiApLSAwLjAwMzgpKjUwLyIgPDwgdiA8PCAiPSI8PCBjMiA8PCBlbmRsOwoJcmV0dXJuOwp9CnZvaWQgc2hvd19lbmRfZm9zZmFyKGRvdWJsZSByZXMxLCBkb3VibGUgcmVzMiwgZG91YmxlICZjKQp7CgljID0gdHJhbmMoKHJlczEgKyByZXMyKSAvIDIuMCowLjMyNiwgMik7Cgljb3V0IDw8ICJcdFx0KCIgPDwgcmVzMSA8PCAiICsgIiA8PCByZXMyIDw8ICIpLyAyKjAuMzI2ID0iIDw8IGMgPDwgZW5kbAoJCTw8ICJcdFx0XHRjPSIgPDwgYyA8PCAiKNC80LMv0LTQvDMpXG4iCgk8PCAiXHRcdFx0Yz0iIDw8IChyZXMxICsgcmVzMikgLyAyLjAqMC4zMjYgPDwgIijQvNCzL9C00LwzKVxuIjsKfQoKdm9pZCAgZm9zZmFyKCkKewoJZG91YmxlIGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0LCBjX2lucHV0Oy8v0LLRhdC+0LQKCglkb3VibGUgZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvciwgY19iaW9yOy8vYmlvcgoKCWRvdWJsZSBkMV9zZWNvbmRhcnksIGQyX3NlY29uZGFyeSwgYzFfc2Vjb25kYXJ5LCBjMl9zZWNvbmRhcnksIGNfc2Vjb25kYXJ5Oy8v0LLRgtC+0YDQuNGH0L3QsNGPCgoJZG91YmxlIGQxX291dHB1dCwgZDJfb3V0cHV0LCBjMV9vdXRwdXQsIGMyX291dHB1dCwgY19vdXRwdXQ7Ly/QstGL0YXQvtC0CgoJY291dCA8PCAiXHRcdCAgINCk0L7RgdGE0LDRgCDRhNC+0YHRhNCw0YLQvdGL0LlcblxuIjsvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGF0L7QtNCwCgljb3V0IDw8ICIgICDQktGF0L7QtCAgIjsKCURfYW5kX3Jlc3VsdF9mb3NmYXIoZDFfaW5wdXQsIGQyX2lucHV0LCBjMV9pbnB1dCwgYzJfaW5wdXQsIDI1MC8wLjMwNCwgMzkwLzAuMzA0KTsKCXNob3dfYmVnaW5fZm9zZmFyKGQxX2lucHV0LCBkMl9pbnB1dCwgYzFfaW5wdXQsIGMyX2lucHV0KTsKCXNob3dfZW5kX2Zvc2ZhcihjMV9pbnB1dCwgYzJfaW5wdXQsIGNfaW5wdXQpOwoKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQsdC40L7RgCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCx0LjQvtGA0LAKCURfYW5kX3Jlc3VsdF9mb3NmYXIoZDFfYmlvciwgZDJfYmlvciwgYzFfYmlvciwgYzJfYmlvciwgKGludCkoKDAuNjUqY19pbnB1dCAtIDAuMjIpICogMTAwLzAuMzA0KSwgKGludCkoKDAuNjUqY19pbnB1dCArIDAuMzUpICogMTAwLzAuMzA0KSk7CglzaG93X2JlZ2luX2Zvc2ZhcihkMV9iaW9yLCBkMl9iaW9yLCBjMV9iaW9yLCBjMl9iaW9yKTsKCXNob3dfZW5kX2Zvc2ZhcihjMV9iaW9yLCBjMl9iaW9yLCBjX2Jpb3IpOwoKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQstGC0L7RgNC40YfQvdC+0LkiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGC0L7RgNC40YfQvdC+0LkKCURfYW5kX3Jlc3VsdF9mb3NmYXIoZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCAoaW50KSgoMC41NipjX2Jpb3IgLSAwLjE1KSAqIDEwMC8wLjMwNCksIChpbnQpKCgwLjU2KmNfYmlvciArMC4xNSkgKiAxMDAvMC4zMDQpKTsKCXNob3dfYmVnaW5fZm9zZmFyKGQxX3NlY29uZGFyeSwgZDJfc2Vjb25kYXJ5LCBjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSk7CglzaG93X2VuZF9mb3NmYXIoYzFfc2Vjb25kYXJ5LCBjMl9zZWNvbmRhcnksIGNfc2Vjb25kYXJ5KTsKCgljb3V0IDw8ICIgINCS0YvRhdC+0LQiOyAvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGL0YXQvtC00LAKCURfYW5kX3Jlc3VsdF9mb3NmYXIoZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0LCAoaW50KSgoY19zZWNvbmRhcnkgLSAwLjMpICogMTAwLzAuMzA0KSwgKGludCkoKGNfc2Vjb25kYXJ5IC0gMC4xKSAqIDEwMC8wLjMwNCkpOwoJc2hvd19iZWdpbl9mb3NmYXIoZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0KTsKCXNob3dfZW5kX2Zvc2ZhcihjMV9vdXRwdXQsIGMyX291dHB1dCwgY19vdXRwdXQpOwoJY291dCA8PCAiX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19cblxuIjsKCXJldHVybjsKfQovL9C20LXQu9C10LfQvihmZXJ1bSkKdm9pZCBEX2FuZF9yZXN1bHRfZmVydW0oZG91YmxlICZkMSwgZG91YmxlICZkMiwgZG91YmxlICZjMSwgZG91YmxlICZjMiwgaW50IGxvd2VyX2xpbSA9IDAsIGludCBoaWdoX2xpbSA9IDEpCnsKCWMxID0gKGxvd2VyX2xpbSArIHJhbmQoKSAlIChoaWdoX2xpbSAtIGxvd2VyX2xpbSkpIC8gMTAwLjA7CglkMSA9IHRyYW5jKChjMSAqOC8gMTAuMCArIDAuMjUxMSkgLyA1Ni41ODIsIDMpOwoJZDIgPSBkMSArICgtMSArIHJhbmQoKSAlIDMpIC8gMTAwMC4wOwoJYzEgPSB0cmFuYygoNTYuNTgyKmQxIC0gMC4yNTExKSAqIDEwIC8gOC4wLCAyKTsKCWMyID0gdHJhbmMoKDU2LjU4MipkMiAtIDAuMjUxMSkqMTAvOC4wLCAyKTsKCXJldHVybjsKfQp2b2lkIHNob3dfYmVnaW5fZmVydW0oZG91YmxlIGQxLCBkb3VibGUgZDIsIGRvdWJsZSBjMSwgZG91YmxlIGMyLCBpbnQgdiA9IDgwKQp7CglzZXRsb2NhbGUoTENfQUxMLCAiUnVzc2lhbiIpOwoJY291dCA8PCAiICBWPSAiIDw8IHYgPDwgIiDQvNC7ICBEMT0iIDw8IGQxIDw8ICI7ICBEMj0iIDw8IGQyIDw8ICI7ICIgPDwgZW5kbAoJCTw8ICIgICgoNTYuNTgyKiIgPDwgZDEgPDwgIikgLSAwLjI1MTEpKjEwMC8iIDw8IHYgPDwgIj0iIDw8IGMxIDw8IGVuZGwKCQk8PCAiICAoKDU2LjU4MioiIDw8IGQyIDw8ICIgKS0gMC4yNTExKSoxMDAvIiA8PCB2IDw8ICI9IiA8PCBjMiA8PCBlbmRsOwoJcmV0dXJuOwp9CnZvaWQgc2hvd19lbmRfZmVydW0oZG91YmxlIHJlczEsIGRvdWJsZSByZXMyLCBkb3VibGUgJmMpCnsKCWMgPSB0cmFuYygocmVzMSArIHJlczIpIC8gMi4wICwgMik7Cgljb3V0IDw8ICJcdFx0KCIgPDwgcmVzMSA8PCAiICsgIiA8PCByZXMyIDw8ICIpLyAyPSIgPDwgYyA8PCBlbmRsCgkJPDwgIlx0XHRcdGM9IiA8PCBjIDw8ICIo0LzQsy/QtNC8MylcbiIKCTw8ICJcdFx0XHRjPSIgPDwgKHJlczEgKyByZXMyKSAvIDIuMCA8PCAiKNC80LMv0LTQvDMpXG4iOwp9CQoKdm9pZCAgZmVydW0oKQp7Cglkb3VibGUgZDFfaW5wdXQsIGQyX2lucHV0LCBjMV9pbnB1dCwgYzJfaW5wdXQsIGNfaW5wdXQ7Ly/QstGF0L7QtAoKCWRvdWJsZSBkMV9iaW9yLCBkMl9iaW9yLCBjMV9iaW9yLCBjMl9iaW9yLCBjX2Jpb3I7Ly9iaW9yCgoJZG91YmxlIGQxX3NlY29uZGFyeSwgZDJfc2Vjb25kYXJ5LCBjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwgY19zZWNvbmRhcnk7Ly/QstGC0L7RgNC40YfQvdCw0Y8KCglkb3VibGUgZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0LCBjX291dHB1dDsvL9Cy0YvRhdC+0LQKCgljb3V0IDw8ICJcdFx0ICAg0JbQtdC70LXQt9C+INC+0LHRidC10LVcblxuIjsvL9GA0LXRiNC10L3QuNC1INC00LvRjyDQstGF0L7QtNCwCgljb3V0IDw8ICIgICDQktGF0L7QtCAgIjsKCURfYW5kX3Jlc3VsdF9mZXJ1bShkMV9pbnB1dCwgZDJfaW5wdXQsIGMxX2lucHV0LCBjMl9pbnB1dCwgMTIwLCAzMTApOwoJc2hvd19iZWdpbl9mZXJ1bShkMV9pbnB1dCwgZDJfaW5wdXQsIGMxX2lucHV0LCBjMl9pbnB1dCk7CglzaG93X2VuZF9mZXJ1bShjMV9pbnB1dCwgYzJfaW5wdXQsIGNfaW5wdXQpOwoKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQsdC40L7RgCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCx0LjQvtGA0LAKCURfYW5kX3Jlc3VsdF9mZXJ1bShkMV9iaW9yLCBkMl9iaW9yLCBjMV9iaW9yLCBjMl9iaW9yLCAoaW50KSgoMC42NSpjX2lucHV0IC0gMC4xKSAqIDEwMCksIChpbnQpKCgwLjY1KmNfaW5wdXQgKyAwLjIpICogMTAwKSk7CglzaG93X2JlZ2luX2ZlcnVtKGQxX2Jpb3IsIGQyX2Jpb3IsIGMxX2Jpb3IsIGMyX2Jpb3IpOwoJc2hvd19lbmRfZmVydW0oYzFfYmlvciwgYzJfYmlvciwgY19iaW9yKTsKCgljb3V0IDw8ICIgINCf0L7RgdC70LUg0LLRgtC+0YDQuNGH0L3QvtC5IjsgLy/RgNC10YjQtdC90LjQtSDQtNC70Y8g0LLRgtC+0YDQuNGH0L3QvtC5CglEX2FuZF9yZXN1bHRfZmVydW0oZDFfc2Vjb25kYXJ5LCBkMl9zZWNvbmRhcnksIGMxX3NlY29uZGFyeSwgYzJfc2Vjb25kYXJ5LCAoaW50KSgoMC43NSpjX2Jpb3IgLSAwLjE1KSAqIDEwMCksIChpbnQpKCgwLjc1KmNfYmlvciArIDAuMTUpICogMTAwKSk7CglzaG93X2JlZ2luX2ZlcnVtKGQxX3NlY29uZGFyeSwgZDJfc2Vjb25kYXJ5LCBjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSk7CglzaG93X2VuZF9mZXJ1bShjMV9zZWNvbmRhcnksIGMyX3NlY29uZGFyeSwgY19zZWNvbmRhcnkpOwoKCWNvdXQgPDwgIiAg0JLRi9GF0L7QtCI7IC8v0YDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YvRhdC+0LTQsAoJRF9hbmRfcmVzdWx0X2ZlcnVtKGQxX291dHB1dCwgZDJfb3V0cHV0LCBjMV9vdXRwdXQsIGMyX291dHB1dCwgKGludCkoKGNfc2Vjb25kYXJ5IC0gMC4yKSAqIDEwMCksIChpbnQpKChjX3NlY29uZGFyeSAtIDAuMSkgKiAxMDApKTsKCXNob3dfYmVnaW5fZmVydW0oZDFfb3V0cHV0LCBkMl9vdXRwdXQsIGMxX291dHB1dCwgYzJfb3V0cHV0KTsKCXNob3dfZW5kX2ZlcnVtKGMxX291dHB1dCwgYzJfb3V0cHV0LCBjX291dHB1dCk7Cgljb3V0IDw8ICJfX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX1xuXG4iOwoJcmV0dXJuOwp9CgppbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQp7ICAKCXNyYW5kKHRpbWUoTlVMTCkpOwoJc2V0bG9jYWxlKExDX0FMTCwgIlJ1c3NpYW4iKTsKCWNvbnN0IGludCBWYWx1ZSA9IDUwOwoJaW50IGZpbmFsX3JlczE9MCwgZmluYWxfcmVzMj0wOwoJZG91YmxlIG0xXzEgPSAwLCBtMl8xID0gMCwgbV9kdXNoZXNfMSA9IDA7Cglkb3VibGUgbTFfMiA9IDAsIG0yXzIgPSAwLCBtX2R1c2hlc18yID0gMDsvL9C00LvRjyDQstGF0L7QtNCwINC/0LXRgNC80LXQvdGL0LUKCglpbnQgcmVzdWx0XzFfYmlvciA9IDAsIHJlc3VsdF8yX2Jpb3IgPSAwOy8v0LTQu9GPINCx0LjQvtGA0LAKCWRvdWJsZSBtMV8xX2Jpb3IgPSAwLCBtMl8xX2Jpb3IgPSAwLCBtX2R1c2hlc18xX2Jpb3IgPSAwOwoJZG91YmxlIG0xXzJfYmlvciA9IDAsIG0yXzJfYmlvciA9IDAsIG1fZHVzaGVzXzJfYmlvciA9IDA7CgoJaW50IHJlc3VsdF8xX3NlY29uZGFyeSA9IDAsIHJlc3VsdF8yX3NlY29uZGFyeSA9IDA7Ly/QtNC70Y8g0LLRgtC+0YDQuNGH0LXQvtC5Cglkb3VibGUgbTFfMV9zZWNvbmRhcnkgPSAwLCBtMl8xX3NlY29uZGFyeSA9IDAsIG1fZHVzaGVzXzFfc2Vjb25kYXJ5ID0gMDsKCWRvdWJsZSBtMV8yX3NlY29uZGFyeSA9IDAsIG0yXzJfc2Vjb25kYXJ5ID0gMCwgbV9kdXNoZXNfMl9zZWNvbmRhcnkgPSAwOwoKCWludCByZXN1bHRfMV9vdXRwdXQgPSAwLCByZXN1bHRfMl9vdXRwdXQgPSAwOy8v0LTQu9GPINCy0YvRhdC+0LTQsAoJZG91YmxlIG0xXzFfb3V0cHV0ID0gMCwgbTJfMV9vdXRwdXQgPSAwLCBtX2R1c2hlc18xX291dHB1dCA9IDA7Cglkb3VibGUgbTFfMl9vdXRwdXQgPSAwLCBtMl8yX291dHB1dCA9IDAsIG1fZHVzaGVzXzJfb3V0cHV0ID0gMDsKCWNvdXQgPDwgIlx0XHQgICDQktC30LLQtdGI0LjQstCw0L3QuNC1INCy0LXRidC10YHRgtCy0LBcblxuIjsKCW1hc3NhX2FuZF9yZXN1bHQobTFfMSwgbTJfMSwgbV9kdXNoZXNfMSwgZmluYWxfcmVzMSx0cnVlLDIzMCwzNzApOy8v0YDQtdGI0LXQvdC40LUg0LfQsNC00LDRh9C4INC00LvRjyDQstGF0L7QtNCwCgljb3V0IDw8ICIgICDQktGF0L7QtCAgIjsKCXNob3dfYmVnaW4obTFfMSwgbTJfMSwgbV9kdXNoZXNfMSwgZmluYWxfcmVzMSwgVmFsdWUpOwoJbWFzc2FfYW5kX3Jlc3VsdChtMV8yLCBtMl8yLCBtX2R1c2hlc18yLCBmaW5hbF9yZXMyLCBmYWxzZSwyMzAsMzcwLCBmaW5hbF9yZXMxKTsKCXNob3dfYmVnaW4obTFfMiwgbTJfMiwgbV9kdXNoZXNfMiwgZmluYWxfcmVzMiwgVmFsdWUpOwoJc2hvd19lbmQoZmluYWxfcmVzMSwgZmluYWxfcmVzMik7CgoJY291dCA8PCAiICDQn9C+0YHQu9C1INCx0LjQvtGALiAgIjsvL9GA0LXRiNC10L3QuNC1INC30LDQtNCw0YfQuCDQsdC40L7RgAoJbWFzc2FfYW5kX3Jlc3VsdChtMV8xX2Jpb3IsIG0yXzFfYmlvciwgbV9kdXNoZXNfMV9iaW9yLCByZXN1bHRfMV9iaW9yLCB0cnVlLCA5MCwgMTQwLCAwLCAyMCk7CglzaG93X2JlZ2luKG0xXzFfYmlvciwgbTJfMV9iaW9yLCBtX2R1c2hlc18xX2Jpb3IsIHJlc3VsdF8xX2Jpb3IsIFZhbHVlKTsKCW1hc3NhX2FuZF9yZXN1bHQobTFfMl9iaW9yLCBtMl8yX2Jpb3IsIG1fZHVzaGVzXzJfYmlvciwgcmVzdWx0XzJfYmlvciwgZmFsc2UsIDkwLCAxNDAsIHJlc3VsdF8xX2Jpb3IsIDIwKTsKCXNob3dfYmVnaW4obTFfMl9iaW9yLCBtMl8yX2Jpb3IsIG1fZHVzaGVzXzJfYmlvciwgcmVzdWx0XzJfYmlvciwgVmFsdWUpOwoJc2hvd19lbmQocmVzdWx0XzFfYmlvciwgcmVzdWx0XzJfYmlvcik7CgoJY291dCA8PCAiICDQn9C+0YHQu9C1INCy0YLQvtGALiAiOy8v0KDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YLQvtGA0LjRh9C90L7QuQoJbWFzc2FfYW5kX3Jlc3VsdChtMV8xX3NlY29uZGFyeSwgbTJfMV9zZWNvbmRhcnksIG1fZHVzaGVzXzFfc2Vjb25kYXJ5LCByZXN1bHRfMV9zZWNvbmRhcnksIHRydWUsIDQwLCA2MCApOwoJc2hvd19iZWdpbihtMV8xX3NlY29uZGFyeSwgbTJfMV9zZWNvbmRhcnksIG1fZHVzaGVzXzFfc2Vjb25kYXJ5LCByZXN1bHRfMV9zZWNvbmRhcnksIFZhbHVlKTsKCW1hc3NhX2FuZF9yZXN1bHQobTFfMl9zZWNvbmRhcnksIG0yXzJfc2Vjb25kYXJ5LCBtX2R1c2hlc18yX3NlY29uZGFyeSwgcmVzdWx0XzJfc2Vjb25kYXJ5LCBmYWxzZSwgNDAsIDYwLCByZXN1bHRfMV9zZWNvbmRhcnkpOwoJc2hvd19iZWdpbihtMV8yX3NlY29uZGFyeSwgbTJfMl9zZWNvbmRhcnksIG1fZHVzaGVzXzJfc2Vjb25kYXJ5LCByZXN1bHRfMl9zZWNvbmRhcnksIFZhbHVlKTsKCXNob3dfZW5kKHJlc3VsdF8xX3NlY29uZGFyeSwgcmVzdWx0XzJfc2Vjb25kYXJ5KTsKCgljb3V0IDw8ICIgINCS0YvRhdC+0LQgICI7Ly/QoNC10YjQtdC90LjQtSDQtNC70Y8g0LLRi9GF0L7QtNCwCgltYXNzYV9hbmRfcmVzdWx0KG0xXzFfb3V0cHV0LCBtMl8xX291dHB1dCwgbV9kdXNoZXNfMV9vdXRwdXQsIHJlc3VsdF8xX291dHB1dCwgdHJ1ZSwgMTYsIDI0KTsKCXNob3dfYmVnaW4obTFfMV9vdXRwdXQsIG0yXzFfb3V0cHV0LCBtX2R1c2hlc18xX291dHB1dCwgcmVzdWx0XzFfb3V0cHV0LCBWYWx1ZSk7CgltYXNzYV9hbmRfcmVzdWx0KG0xXzJfb3V0cHV0LCBtMl8yX291dHB1dCwgbV9kdXNoZXNfMl9vdXRwdXQsIHJlc3VsdF8yX291dHB1dCwgZmFsc2UsIDAsIDAsIHJlc3VsdF8xX291dHB1dCApOwoJc2hvd19iZWdpbihtMV8yX291dHB1dCwgbTJfMl9vdXRwdXQsIG1fZHVzaGVzXzJfb3V0cHV0LCByZXN1bHRfMl9vdXRwdXQsIFZhbHVlKTsKCXNob3dfZW5kKHJlc3VsdF8xX291dHB1dCwgcmVzdWx0XzJfb3V0cHV0KTsKCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cbiI7CgoJLy9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX9Ch0YPRhdC+0Lkg0L7RgdGC0LDRgtC+0LooZHJ5KV9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXwoKCWludCBmaW5hbF9yZXMxX2RyeSA9IDAsIGZpbmFsX3JlczJfZHJ5ID0gMDsKCWRvdWJsZSBtMV8xX2RyeSA9IDAsIG0yXzFfZHJ5ID0gMCwgbV9kdXNoZXNfMV9kcnkgPSAwOwoJZG91YmxlIG0xXzJfZHJ5ID0gMCwgbTJfMl9kcnkgPSAwLCBtX2R1c2hlc18yX2RyeSA9IDA7Ly/QtNC70Y8g0LLRhdC+0LTQsCDQv9C10YDQvNC10L3Ri9C1KNGB0YPRhdC+0Lkg0L7RgdGC0LDRgtC+0LopCgoJaW50IHJlc3VsdF8xX2Jpb3JfZHJ5ID0gMCwgcmVzdWx0XzJfYmlvcl9kcnkgPSAwOy8v0LTQu9GPINCx0LjQvtGA0LAo0YHRg9GF0L7QuSDQvtGB0YLQsNGC0L7QuikKCWRvdWJsZSBtMV8xX2Jpb3JfZHJ5ID0gMCwgbTJfMV9iaW9yX2RyeSA9IDAsIG1fZHVzaGVzXzFfYmlvcl9kcnkgPSAwOwoJZG91YmxlIG0xXzJfYmlvcl9kcnkgPSAwLCBtMl8yX2Jpb3JfZHJ5ID0gMCwgbV9kdXNoZXNfMl9iaW9yX2RyeSA9IDA7CgoJaW50IHJlc3VsdF8xX3NlY29uZGFyeV9kcnkgPSAwLCByZXN1bHRfMl9zZWNvbmRhcnlfZHJ5ID0gMDsvL9C00LvRjyDQstGC0L7RgNC40YfQtdC+0Lko0YHRg9GF0L7QuSDQvtGB0YLQsNGC0L7QuikKCWRvdWJsZSBtMV8xX3NlY29uZGFyeV9kcnkgPSAwLCBtMl8xX3NlY29uZGFyeV9kcnkgPSAwLCBtX2R1c2hlc18xX3NlY29uZGFyeV9kcnkgPSAwOwoJZG91YmxlIG0xXzJfc2Vjb25kYXJ5X2RyeSA9IDAsIG0yXzJfc2Vjb25kYXJ5X2RyeSA9IDAsIG1fZHVzaGVzXzJfc2Vjb25kYXJ5X2RyeSA9IDA7CgoJaW50IHJlc3VsdF8xX291dHB1dF9kcnkgPSAwLCByZXN1bHRfMl9vdXRwdXRfZHJ5ID0gMDsvL9C00LvRjyDQstGL0YXQvtC00LAo0YHRg9GF0L7QuSDQvtGB0YLQsNGC0L7QuikKCWRvdWJsZSBtMV8xX291dHB1dF9kcnkgPSAwLCBtMl8xX291dHB1dF9kcnkgPSAwLCBtX2R1c2hlc18xX291dHB1dF9kcnkgPSAwOwoJZG91YmxlIG0xXzJfb3V0cHV0X2RyeSA9IDAsIG0yXzJfb3V0cHV0X2RyeSA9IDAsIG1fZHVzaGVzXzJfb3V0cHV0X2RyeSA9IDA7Cgljb3V0IDw8ICJcdFx0XHQgICDQodGD0YXQvtC5INC+0YHRgtCw0YLQvtC6XG5cbiI7CgltYXNzYV9hbmRfcmVzdWx0KG0xXzFfZHJ5LCBtMl8xX2RyeSwgbV9kdXNoZXNfMV9kcnksIGZpbmFsX3JlczFfZHJ5LCB0cnVlLCA1MDAsIDcwMCwwLDc1KTsvL9GA0LXRiNC10L3QuNC1INC30LDQtNCw0YfQuCDQtNC70Y8g0LLRhdC+0LTQsCjRgdGD0YXQvtC5INC+0YHRgtCw0YLQvtC6KQoJY291dCA8PCAiICAg0JLRhdC+0LQgICI7CglzaG93X2JlZ2luKG0xXzFfZHJ5LCBtMl8xX2RyeSwgbV9kdXNoZXNfMV9kcnksIGZpbmFsX3JlczFfZHJ5LCBWYWx1ZSwgZmFsc2UpOwoJbWFzc2FfYW5kX3Jlc3VsdChtMV8yX2RyeSwgbTJfMl9kcnksIG1fZHVzaGVzXzJfZHJ5LCBmaW5hbF9yZXMyX2RyeSwgZmFsc2UsIDUwMCwgNzAwLCBmaW5hbF9yZXMxX2RyeSw3NSk7CglzaG93X2JlZ2luKG0xXzJfZHJ5LCBtMl8yX2RyeSwgbV9kdXNoZXNfMl9kcnksIGZpbmFsX3JlczJfZHJ5LCBWYWx1ZSxmYWxzZSk7CglzaG93X2VuZChmaW5hbF9yZXMxX2RyeSwgZmluYWxfcmVzMl9kcnkpOwoKCWNvdXQgPDwgIiAg0J/QvtGB0LvQtSDQsdC40L7RgC4gICI7Ly/RgNC10YjQtdC90LjQtSDQt9Cw0LTQsNGH0Lgg0LHQuNC+0YAo0YHRg9GF0L7QuSDQvtGB0YLQsNGC0L7QuikKCW1hc3NhX2FuZF9yZXN1bHQobTFfMV9iaW9yX2RyeSwgbTJfMV9iaW9yX2RyeSwgbV9kdXNoZXNfMV9iaW9yX2RyeSwgcmVzdWx0XzFfYmlvcl9kcnksIHRydWUsIGZpbmFsX3JlczFfZHJ5LTE4MCwgZmluYWxfcmVzMV9kcnktMTIwLCAwLCA3Nik7CglzaG93X2JlZ2luKG0xXzFfYmlvcl9kcnksIG0yXzFfYmlvcl9kcnksIG1fZHVzaGVzXzFfYmlvcl9kcnksIHJlc3VsdF8xX2Jpb3JfZHJ5LCBWYWx1ZSxmYWxzZSk7CgltYXNzYV9hbmRfcmVzdWx0KG0xXzJfYmlvcl9kcnksIG0yXzJfYmlvcl9kcnksIG1fZHVzaGVzXzJfYmlvcl9kcnksIHJlc3VsdF8yX2Jpb3JfZHJ5LCBmYWxzZSwgZmluYWxfcmVzMV9kcnkgLSAxODAsIGZpbmFsX3JlczFfZHJ5IC0gMTIwLCByZXN1bHRfMV9iaW9yX2RyeSw3NiApOwoJc2hvd19iZWdpbihtMV8yX2Jpb3JfZHJ5LCBtMl8yX2Jpb3JfZHJ5LCBtX2R1c2hlc18yX2Jpb3JfZHJ5LCByZXN1bHRfMl9iaW9yX2RyeSwgVmFsdWUsZmFsc2UpOwoJc2hvd19lbmQocmVzdWx0XzFfYmlvcl9kcnksIHJlc3VsdF8yX2Jpb3JfZHJ5KTsKCgkvL9Cg0LXRiNC10L3QuNC1INC00LvRjyDQstGL0YXQvtC00LAo0YHRg9GF0L7QuSDQvtGB0YLQsNGC0L7QuikKCW1hc3NhX2FuZF9yZXN1bHQobTFfMV9vdXRwdXRfZHJ5LCBtMl8xX291dHB1dF9kcnksIG1fZHVzaGVzXzFfb3V0cHV0X2RyeSwgcmVzdWx0XzFfb3V0cHV0X2RyeSwgdHJ1ZSwgZmluYWxfcmVzMV9kcnkgLyAyIC0gMTUsIGZpbmFsX3JlczFfZHJ5IC8gMiAsMCw3NSk7CgkKCW1hc3NhX2FuZF9yZXN1bHQobTFfMl9vdXRwdXRfZHJ5LCBtMl8yX291dHB1dF9kcnksIG1fZHVzaGVzXzJfb3V0cHV0X2RyeSwgcmVzdWx0XzJfb3V0cHV0X2RyeSwgZmFsc2UsIDAsIDAsIHJlc3VsdF8xX291dHB1dF9kcnksNzUpOwoJCgoJY291dCA8PCAiICDQn9C+0YHQu9C1INCy0YLQvtGALiAiOy8v0KDQtdGI0LXQvdC40LUg0LTQu9GPINCy0YLQvtGA0LjRh9C90L7QuSjRgdGD0YXQvtC5INC+0YHRgtCw0YLQvtC6KQoJbWFzc2FfYW5kX3Jlc3VsdChtMV8xX3NlY29uZGFyeV9kcnksIG0yXzFfc2Vjb25kYXJ5X2RyeSwgbV9kdXNoZXNfMV9zZWNvbmRhcnlfZHJ5LCByZXN1bHRfMV9zZWNvbmRhcnlfZHJ5LCB0cnVlLCByZXN1bHRfMV9vdXRwdXRfZHJ5ICsgMzUsIHJlc3VsdF8xX291dHB1dF9kcnkgKyA3MCwgMCw3NSk7CglzaG93X2JlZ2luKG0xXzFfc2Vjb25kYXJ5X2RyeSwgbTJfMV9zZWNvbmRhcnlfZHJ5LCBtX2R1c2hlc18xX3NlY29uZGFyeV9kcnksIHJlc3VsdF8xX3NlY29uZGFyeV9kcnksIFZhbHVlLGZhbHNlKTsKCW1hc3NhX2FuZF9yZXN1bHQobTFfMl9zZWNvbmRhcnlfZHJ5LCBtMl8yX3NlY29uZGFyeV9kcnksIG1fZHVzaGVzXzJfc2Vjb25kYXJ5X2RyeSwgcmVzdWx0XzJfc2Vjb25kYXJ5X2RyeSwgZmFsc2UsIDAsIDAsIHJlc3VsdF8xX3NlY29uZGFyeV9kcnksNzUpOwoJc2hvd19iZWdpbihtMV8yX3NlY29uZGFyeV9kcnksIG0yXzJfc2Vjb25kYXJ5X2RyeSwgbV9kdXNoZXNfMl9zZWNvbmRhcnlfZHJ5LCByZXN1bHRfMl9zZWNvbmRhcnlfZHJ5LCBWYWx1ZSxmYWxzZSk7CglzaG93X2VuZChyZXN1bHRfMV9zZWNvbmRhcnlfZHJ5LCByZXN1bHRfMl9zZWNvbmRhcnlfZHJ5KTsKCWNvdXQgPDwgIiAg0JLRi9GF0L7QtCAgIjsKCXNob3dfYmVnaW4obTFfMV9vdXRwdXRfZHJ5LCBtMl8xX291dHB1dF9kcnksIG1fZHVzaGVzXzFfb3V0cHV0X2RyeSwgcmVzdWx0XzFfb3V0cHV0X2RyeSwgVmFsdWUsZmFsc2UpOwoJc2hvd19iZWdpbihtMV8yX291dHB1dF9kcnksIG0yXzJfb3V0cHV0X2RyeSwgbV9kdXNoZXNfMl9vdXRwdXRfZHJ5LCByZXN1bHRfMl9vdXRwdXRfZHJ5LCBWYWx1ZSxmYWxzZSk7CglzaG93X2VuZChyZXN1bHRfMV9vdXRwdXRfZHJ5LCByZXN1bHRfMl9vdXRwdXRfZHJ5KTsKCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fX19fXG5cbiI7Cglhem90X25pdHIoKTsKCW5pdHJhdCgpOwoJYW1vbigpOwoJaGxvcigpOwoJc3lsZmF0KCk7Cglmb3NmYXIoKTsKCWZlcnVtKCk7CgkKCXN5c3RlbSgicGF1c2UiKTsKCXJldHVybiAwOwp9Cg==