#include <iostream>
#include <sstream>
#include <string>
#include <algorithm>
using namespace std;
#define all(v) ((v).begin()), ((v).end())
#define sz(v) ((int)((v).size()))
#define clr(v, d) memset(v, d, sizeof(v))
const int MAX = 300;
typedef int big[MAX];
void big_zero (big num) // b = 0
{
int i;
for (i=0 ; i<MAX ; i++)
num[i] = 0;
}
void big_copy(big to, big from) // to <-- from
{
int i;
for(i=0;i<MAX;i++)
to[i] = from[i];
}
int big_len(big num)
{
int j;
for (j=MAX-1; j && !num[j]; j--);
return j;
}
void big_print(big num)
{
int i;
for (i=big_len(num); i>=0; i--)
{
cout<<num[i];
if (i && !(i % 3))
cout<<',';
}
cout<<"\n";
}
void big_from_str(big num, string str) // num = reverse(str)
{
int i, len = str.size()-1;
big_zero(num);
for(i=len;i>-1;i--)
num[len-i] = str[i]-'0';
}//153-->153 00153-->153
string bit_to_str(big num)
{
ostringstream oss;
for (int i=big_len(num); i>=0; i--)
oss<<num[i];
return oss.str();
}
void big_from_int(big num, int x)
{
int len = 0;
big_zero(num);
while(x)
{
num[len++] = x%10;
x /= 10;
}
}
int big_cmp (big a, big b) // a <=> b return 1, 0, -1
{
int i;
for (i=MAX-1 ; i>=0 ; i--)
{
if (a[i] > b[i])
return 1;
else if (a[i] < b[i])
return -1;
}
return 0;
}
void big_add(big ac, int n) //add n over a
{
int i, num, carry = n;
for(i=0;i<MAX && carry;i++)
{
num = ac[i] + carry;
ac[i] = num%10;
carry = num/10;
}
}
void big_add (big a, big b, big result) // result = a + b
{
int i, carry=0;
for (i=0 ; i<MAX ; i++)
{
result[i] = carry + a[i] + b[i];
carry = result[i] / 10;
result[i] %= 10;
}
}
char big_sub (big a, big b, big result, char sign='+')
{
if(big_cmp(a, b) < 0)
return big_sub(b, a, result, '-');
big_zero(result);
int len_a = big_len(a);
int len_b = big_len(b);
int i, max = len_a > len_b ? len_a : len_b;
for(i=0;i<=max;i++)
result[i] = a[i] - b[i];
for(i=0;i<=max;i++)
{
while(result[i] < 0)
{
result[i] += 10;
result[i+1] -= 1;
}
}
return sign;
}
void big_product(big result, int factor)
{
int carry = 0;
for (int i=0; i<MAX; i++)
{
carry += result[i] * factor;
result[i] = carry % 10;
carry /= 10;
}
}
//Work with leading zeros
void big_product(big a, big b, big result)
{
int len_a = big_len(a);
int len_b = big_len(b);
if(len_a < len_b)
{
big_product(b, a, result);
return;
}
big_zero(result);
int i, j;
int cursor = 0, pos = 0;
for(i=0; i<=len_b; pos = 0, cursor++, i++)
{
for(j=0; j<=len_a; j++, pos++)
{
result[pos+cursor] += b[i]*a[j];
if(result[pos+cursor] >= 10)
{
result[pos+cursor+1] += result[pos+cursor]/10;
result[pos+cursor] %= 10;
}
}
}
}
int big_divide(big ac, int div)
{
int i = big_len(ac);
int reminder = 0;
while (i >= 0)
{
reminder = reminder * 10;
reminder = reminder + ac[i];
ac[i] = 0;
if (div <= reminder)
{
ac[i] = reminder / div;
reminder %= div;
}
i--;
}
return reminder;
}
void big_divide(big ac, big div, big reminder)
{
big cpy;
big_zero(reminder);
int i = big_len(ac);
while (i >= 0)
{
big_product(reminder, 10);
big_add(reminder, ac[i]);
ac[i] = 0;
while( big_cmp(reminder, div) >=0 ) //Insted of /, % is >= right or only >
{
big_sub(reminder, div, cpy); //cpy = reminder-div
big_copy(reminder, cpy); //reminder = cpy
ac[i]++;
}
i--;
}
big_print(reminder);
big_print(ac);
}
void big_mod(big a, big div, big reminder)
{
big cpy;
big_zero(reminder);
int i = big_len(a);
while (i >= 0)
{
big_product(reminder, 10);
big_add(reminder, a[i]);
while( big_cmp(reminder, div) >=0 ) //Insted of /, %
{
big_sub(reminder, div, cpy); //cpy = reminder-div
big_copy(reminder, cpy); //reminder = cpy
}
i--;
}
}
void big_gcd(big ac, big bc) //ac: means big a will be changed
{
big t;
while(!(bc[0] == 0 && big_len(bc) == 0))
{
big_mod(ac, bc, t); //t = a % b
big_copy(ac, bc); //a = b
big_copy(bc, t); //b = t
} //a now represent the gcd
}
void factorial(int n, big fact) /* Fast untill !1200 */
{
int i, j, len;
big_zero(fact);
fact[0] = 1, len = 1;
for(i=2; i<=n ; i++)
{
for(j=0; j<len; j++)
fact[j] *= i;
for(j=0; j<len; j++)
{
if(fact[j]>=10)
fact[j+1] += fact[j]/10, fact[j] %= 10;
}
while(fact[len])
if(fact[len++]>=10)
fact[len] += fact[len-1]/10, fact[len-1] %= 10;
}
}
big remain, odd, answer, temp; //Set them out side to save memory
void big_squareRoot(string s) //Using Pell's equation // TLE
{
long int group, count;
big_zero(remain);
big_zero(odd);
big_zero(answer);
if(s.size()%2 ==1)
s = "0" + s;
for(int i=0;i<s.size();i+=2)
{
group = (s[i]-'0') * 10 + s[i+1]-'0';
big_copy(odd, answer);
big_product(odd, 20);
big_add(odd, 1);
big_product(remain, 100);
big_add(remain, group);
count = 0;
while( big_cmp(remain, odd) >= 0)
{
count++;
big_sub(remain, odd, temp);
big_copy(remain, temp);
big_add(odd, 2);
}
big_product(answer, 10);
big_add(answer, count);
}
big_print(answer); //Contain only the int value //Give TLE
}
string big_to_str(big num) {
ostringstream oss;
int i;
for (i = big_len(num); i >= 0; i--) {
oss << num[i];
}
return oss.str();
}
string toBinay(string str) {
big a;
big_from_str(a, str);
big zero;
big_from_int(zero, 0);
big two;
big_from_int(two, 2);
big mod;
string ret = "";
while (big_cmp(a, zero) != 0) {
big_mod(a, two, mod);
ret += big_to_str(mod);
big_divide(a, 2);
}
reverse(all(ret));
return ret;
}
string toDecimal(string binary) {
big twoPow;
big_from_int(twoPow, 1);
big a;
big_zero(a);
big temp;
for (int i = sz(binary) - 1; i >= 0; --i) {
if (binary[i] == '1') {
big_add(a, twoPow, temp);
big_copy(a, temp);
}
big_product(twoPow, 2);
}
return big_to_str(a);
}
string fibonaccie(int n)
{
int fib[3][MAX];
big_from_int(fib[0], 1);
big_from_int(fib[1], 1);
big_from_int(fib[2], 1);
for(int i=2;i<n;i++)
{
big_add(fib[0], fib[1], fib[2]);
big_copy(fib[0], fib[1]);
big_copy(fib[1], fib[2]);
}
return bit_to_str(fib[2]);
}
int main()
{
string num1, num2;
big a, b, c;
while(cin>>num1>>num2)
{
big_from_str(a, num1);
big_from_str(b, num2);
big_product(a, b, c);
big_print(c);
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8c3N0cmVhbT4KI2luY2x1ZGUgPHN0cmluZz4KI2luY2x1ZGUgPGFsZ29yaXRobT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCiNkZWZpbmUgYWxsKHYpCQkJKCh2KS5iZWdpbigpKSwgKCh2KS5lbmQoKSkKI2RlZmluZSBzeih2KQkJCSgoaW50KSgodikuc2l6ZSgpKSkKI2RlZmluZSBjbHIodiwgZCkJCW1lbXNldCh2LCBkLCBzaXplb2YodikpCgpjb25zdCBpbnQgTUFYID0gMzAwOwp0eXBlZGVmIGludCBiaWdbTUFYXTsKCnZvaWQgYmlnX3plcm8gKGJpZyBudW0pCQkJLy8gYiA9IDAKewoJaW50IGk7Cglmb3IgKGk9MCA7IGk8TUFYIDsgaSsrKQoJCW51bVtpXSA9IDA7Cn0KCnZvaWQgYmlnX2NvcHkoYmlnIHRvLCBiaWcgZnJvbSkJLy8gdG8gPC0tIGZyb20KewoJaW50IGk7Cglmb3IoaT0wO2k8TUFYO2krKykKCQl0b1tpXSA9IGZyb21baV07Cn0KCmludCBiaWdfbGVuKGJpZyBudW0pCnsKCWludCBqOwoJZm9yIChqPU1BWC0xOyBqICYmICFudW1bal07IGotLSk7CglyZXR1cm4gajsKfQoKdm9pZCBiaWdfcHJpbnQoYmlnIG51bSkKewoJaW50IGk7Cglmb3IgKGk9YmlnX2xlbihudW0pOyBpPj0wOyBpLS0pCgl7CgkJY291dDw8bnVtW2ldOwoJCWlmIChpICYmICEoaSAlIDMpKQoJCQljb3V0PDwnLCc7Cgl9Cgljb3V0PDwiXG4iOwp9Cgp2b2lkIGJpZ19mcm9tX3N0cihiaWcgbnVtLCBzdHJpbmcgc3RyKQkvLyBudW0gPSByZXZlcnNlKHN0cikKewoJaW50IGksIGxlbiA9IHN0ci5zaXplKCktMTsKCWJpZ196ZXJvKG51bSk7CgoJZm9yKGk9bGVuO2k+LTE7aS0tKQoJCW51bVtsZW4taV0gPSBzdHJbaV0tJzAnOwp9Ly8xNTMtLT4xNTMgIDAwMTUzLS0+MTUzCgpzdHJpbmcgYml0X3RvX3N0cihiaWcgbnVtKSAKewoJb3N0cmluZ3N0cmVhbSBvc3M7Cglmb3IgKGludCBpPWJpZ19sZW4obnVtKTsgaT49MDsgaS0tKQoJCW9zczw8bnVtW2ldOwoJcmV0dXJuIG9zcy5zdHIoKTsKfQoKCnZvaWQgYmlnX2Zyb21faW50KGJpZyBudW0sIGludCB4KQp7CglpbnQgbGVuID0gMDsKCWJpZ196ZXJvKG51bSk7CgoJd2hpbGUoeCkKCXsKCQludW1bbGVuKytdID0geCUxMDsKCQl4IC89IDEwOwoJfQp9CgppbnQgYmlnX2NtcCAoYmlnIGEsIGJpZyBiKQkJLy8gYSA8PT4gYiByZXR1cm4gMSwgMCwgLTEKewoJaW50IGk7Cglmb3IgKGk9TUFYLTEgOyBpPj0wIDsgaS0tKQoJewoJCWlmIChhW2ldID4gYltpXSkKCQkJcmV0dXJuIDE7CgkJZWxzZSBpZiAoYVtpXSA8IGJbaV0pCgkJCXJldHVybiAtMTsKCX0KCXJldHVybiAwOwp9Cgp2b2lkIGJpZ19hZGQoYmlnIGFjLCBpbnQgbikJLy9hZGQgbiBvdmVyIGEKewoJaW50IGksIG51bSwgY2FycnkgPSBuOwoJZm9yKGk9MDtpPE1BWCAmJiBjYXJyeTtpKyspCgl7CgkJbnVtICA9IGFjW2ldICsgY2Fycnk7CgkJYWNbaV0gPSBudW0lMTA7CgkJY2FycnkgPSBudW0vMTA7Cgl9Cn0KCnZvaWQgYmlnX2FkZCAoYmlnIGEsIGJpZyBiLCBiaWcgcmVzdWx0KQkvLyByZXN1bHQgPSBhICsgYgp7CglpbnQgaSwgY2Fycnk9MDsKCWZvciAoaT0wIDsgaTxNQVggOyBpKyspCgl7CgkJcmVzdWx0W2ldID0gY2FycnkgKyBhW2ldICsgYltpXTsKCQljYXJyeSA9IHJlc3VsdFtpXSAvIDEwOwoJCXJlc3VsdFtpXSAlPSAxMDsKCX0KfQoKY2hhciBiaWdfc3ViIChiaWcgYSwgYmlnIGIsIGJpZyByZXN1bHQsIGNoYXIgc2lnbj0nKycpCnsKCWlmKGJpZ19jbXAoYSwgYikgPCAwKQoJCXJldHVybiBiaWdfc3ViKGIsIGEsIHJlc3VsdCwgJy0nKTsKCgliaWdfemVybyhyZXN1bHQpOwoJaW50IGxlbl9hID0gYmlnX2xlbihhKTsKCWludCBsZW5fYiA9IGJpZ19sZW4oYik7CgoJaW50IGksIG1heCA9IGxlbl9hID4gbGVuX2IgPyBsZW5fYSA6IGxlbl9iOwoKCWZvcihpPTA7aTw9bWF4O2krKykKCQlyZXN1bHRbaV0gPSBhW2ldIC0gYltpXTsKCglmb3IoaT0wO2k8PW1heDtpKyspCgl7CgkJd2hpbGUocmVzdWx0W2ldIDwgMCkKCQl7CgkJCXJlc3VsdFtpXSAgICs9IDEwOwoJCQlyZXN1bHRbaSsxXSAtPSAxOwoJCX0KCX0KCXJldHVybiBzaWduOwp9Cgp2b2lkIGJpZ19wcm9kdWN0KGJpZyByZXN1bHQsIGludCBmYWN0b3IpCnsKICAgIGludCBjYXJyeSA9IDA7CiAgICBmb3IgKGludCBpPTA7IGk8TUFYOyBpKyspCiAgICB7CiAgICAgICAgY2FycnkgKz0gcmVzdWx0W2ldICogZmFjdG9yOwogICAgICAgIHJlc3VsdFtpXSA9IGNhcnJ5ICUgMTA7CiAgICAgICAgY2FycnkgLz0gMTA7CiAgICB9Cn0KLy9Xb3JrIHdpdGggbGVhZGluZyB6ZXJvcwp2b2lkIGJpZ19wcm9kdWN0KGJpZyBhLCBiaWcgYiwgYmlnIHJlc3VsdCkKewoJaW50IGxlbl9hID0gYmlnX2xlbihhKTsKCWludCBsZW5fYiA9IGJpZ19sZW4oYik7CgoJaWYobGVuX2EgPCBsZW5fYikKCXsKCQliaWdfcHJvZHVjdChiLCBhLCByZXN1bHQpOwoJCXJldHVybjsKCX0KCgliaWdfemVybyhyZXN1bHQpOwoJaW50IGksIGo7CgoJaW50IGN1cnNvciA9IDAsIHBvcyA9IDA7CgoJZm9yKGk9MDsgaTw9bGVuX2I7IHBvcyA9IDAsIGN1cnNvcisrLCBpKyspCgl7CgkJZm9yKGo9MDsgajw9bGVuX2E7IGorKywgcG9zKyspCgkJewoJCQlyZXN1bHRbcG9zK2N1cnNvcl0gKz0gYltpXSphW2pdOwoKCQkJaWYocmVzdWx0W3BvcytjdXJzb3JdID49IDEwKQoJCQl7CgkJCQlyZXN1bHRbcG9zK2N1cnNvcisxXSArPSByZXN1bHRbcG9zK2N1cnNvcl0vMTA7CgkJCQlyZXN1bHRbcG9zK2N1cnNvcl0gICAlPSAxMDsKCQkJfQoJCX0KCX0KfQoKaW50IGJpZ19kaXZpZGUoYmlnIGFjLCBpbnQgZGl2KQp7CiAgICBpbnQgaSA9IGJpZ19sZW4oYWMpOwogICAgaW50IHJlbWluZGVyID0gMDsKCiAgICB3aGlsZSAoaSA+PSAwKQogICAgewogICAgICAgIHJlbWluZGVyID0gcmVtaW5kZXIgKiAxMDsKCQlyZW1pbmRlciA9IHJlbWluZGVyICsgYWNbaV07CiAgICAgICAgYWNbaV0gPSAwOwoKICAgICAgICBpZiAoZGl2IDw9IHJlbWluZGVyKQogICAgICAgIHsKICAgICAgICAgICAgYWNbaV0gPSByZW1pbmRlciAvIGRpdjsKICAgICAgICAgICAgcmVtaW5kZXIgJT0gZGl2OwogICAgICAgIH0KICAgICAgICBpLS07CiAgICB9CglyZXR1cm4gcmVtaW5kZXI7Cn0KCnZvaWQgYmlnX2RpdmlkZShiaWcgYWMsIGJpZyBkaXYsIGJpZyByZW1pbmRlcikKewogICAgYmlnIGNweTsKCWJpZ196ZXJvKHJlbWluZGVyKTsKCglpbnQgaSA9IGJpZ19sZW4oYWMpOwoKICAgIHdoaWxlIChpID49IDApCiAgICB7CgkJYmlnX3Byb2R1Y3QocmVtaW5kZXIsIDEwKTsKICAgICAgICBiaWdfYWRkKHJlbWluZGVyLCBhY1tpXSk7CiAgICAgICAgYWNbaV0gPSAwOwoKICAgICAgICB3aGlsZSggYmlnX2NtcChyZW1pbmRlciwgZGl2KSA+PTAgKSAvL0luc3RlZCBvZiAvLCAlIGlzID49IHJpZ2h0IG9yIG9ubHkgPgoJCXsKCQkJYmlnX3N1YihyZW1pbmRlciwgZGl2LCBjcHkpOwkvL2NweSA9IHJlbWluZGVyLWRpdgoJCQliaWdfY29weShyZW1pbmRlciwgY3B5KTsJCS8vcmVtaW5kZXIgPSBjcHkKCQkJYWNbaV0rKzsKCQl9CgkJaS0tOwogICAgfQogICAgYmlnX3ByaW50KHJlbWluZGVyKTsKCWJpZ19wcmludChhYyk7Cn0KCnZvaWQgYmlnX21vZChiaWcgYSwgYmlnIGRpdiwgYmlnIHJlbWluZGVyKQp7CgliaWcgY3B5OwoJYmlnX3plcm8ocmVtaW5kZXIpOwoKCWludCBpID0gYmlnX2xlbihhKTsKCiAgICB3aGlsZSAoaSA+PSAwKQogICAgewoJCWJpZ19wcm9kdWN0KHJlbWluZGVyLCAxMCk7CiAgICAgICAgYmlnX2FkZChyZW1pbmRlciwgYVtpXSk7CgogICAgICAgIHdoaWxlKCBiaWdfY21wKHJlbWluZGVyLCBkaXYpID49MCApIC8vSW5zdGVkIG9mIC8sICUKCQl7CgkJCWJpZ19zdWIocmVtaW5kZXIsIGRpdiwgY3B5KTsJLy9jcHkgPSByZW1pbmRlci1kaXYKCQkJYmlnX2NvcHkocmVtaW5kZXIsIGNweSk7CQkvL3JlbWluZGVyID0gY3B5CgkJfQoJCWktLTsKICAgIH0KfQoKdm9pZCBiaWdfZ2NkKGJpZyBhYywgYmlnIGJjKQkvL2FjOiBtZWFucyBiaWcgYSB3aWxsIGJlIGNoYW5nZWQKewoJYmlnIHQ7CgoJd2hpbGUoIShiY1swXSA9PSAwICYmIGJpZ19sZW4oYmMpID09IDApKQoJewoJCWJpZ19tb2QoYWMsIGJjLCB0KTsJLy90ID0gYSAlIGIKCQliaWdfY29weShhYywgYmMpOwkJLy9hID0gYgoJCWJpZ19jb3B5KGJjLCB0KTsJCS8vYiA9IHQKCX0JLy9hIG5vdyByZXByZXNlbnQgdGhlIGdjZAp9CgoKdm9pZCBmYWN0b3JpYWwoaW50IG4sIGJpZyBmYWN0KQkvKiBGYXN0IHVudGlsbCAhMTIwMCAqLwp7CglpbnQgaSwgaiwgbGVuOwoKCWJpZ196ZXJvKGZhY3QpOwoJZmFjdFswXSA9IDEsIGxlbiA9IDE7CgoJZm9yKGk9MjsgaTw9biA7IGkrKykKICAgIHsKCQlmb3Ioaj0wOyBqPGxlbjsgaisrKQoJCQlmYWN0W2pdICo9IGk7CgoJCWZvcihqPTA7IGo8bGVuOyBqKyspCgkJewoJCQlpZihmYWN0W2pdPj0xMCkKCQkJCWZhY3RbaisxXSArPSBmYWN0W2pdLzEwLCBmYWN0W2pdICU9IDEwOwoJCX0KCgkJd2hpbGUoZmFjdFtsZW5dKQoJCQlpZihmYWN0W2xlbisrXT49MTApCgkJCQlmYWN0W2xlbl0gKz0gZmFjdFtsZW4tMV0vMTAsIGZhY3RbbGVuLTFdICU9IDEwOwogICAgfQp9CgpiaWcgcmVtYWluLCBvZGQsIGFuc3dlciwgdGVtcDsJLy9TZXQgdGhlbSBvdXQgc2lkZSB0byBzYXZlIG1lbW9yeQp2b2lkIGJpZ19zcXVhcmVSb290KHN0cmluZyBzKQkvL1VzaW5nIFBlbGwncyBlcXVhdGlvbiAvLyBUTEUKewoJbG9uZyBpbnQgZ3JvdXAsIGNvdW50OwoKCWJpZ196ZXJvKHJlbWFpbik7CgliaWdfemVybyhvZGQpOwoJYmlnX3plcm8oYW5zd2VyKTsKCglpZihzLnNpemUoKSUyID09MSkKCQlzID0gIjAiICsgczsKCglmb3IoaW50IGk9MDtpPHMuc2l6ZSgpO2krPTIpCgl7CgkJZ3JvdXAgPSAoc1tpXS0nMCcpICogMTAgKyBzW2krMV0tJzAnOwoKCQliaWdfY29weShvZGQsIGFuc3dlcik7CgkJYmlnX3Byb2R1Y3Qob2RkLCAyMCk7CgkJYmlnX2FkZChvZGQsIDEpOwoKCQliaWdfcHJvZHVjdChyZW1haW4sIDEwMCk7CgkJYmlnX2FkZChyZW1haW4sIGdyb3VwKTsKCgkJY291bnQgPSAwOwoJCXdoaWxlKCBiaWdfY21wKHJlbWFpbiwgb2RkKSA+PSAwKQoJCXsKCQkJY291bnQrKzsKCQkJYmlnX3N1YihyZW1haW4sIG9kZCwgdGVtcCk7CgkJCWJpZ19jb3B5KHJlbWFpbiwgdGVtcCk7CgkJCWJpZ19hZGQob2RkLCAyKTsKCQl9CgkJYmlnX3Byb2R1Y3QoYW5zd2VyLCAxMCk7CgkJYmlnX2FkZChhbnN3ZXIsIGNvdW50KTsKCX0KCWJpZ19wcmludChhbnN3ZXIpOwkvL0NvbnRhaW4gb25seSB0aGUgaW50IHZhbHVlIC8vR2l2ZSBUTEUKfQoKc3RyaW5nIGJpZ190b19zdHIoYmlnIG51bSkgewoJb3N0cmluZ3N0cmVhbSBvc3M7CglpbnQgaTsKCWZvciAoaSA9IGJpZ19sZW4obnVtKTsgaSA+PSAwOyBpLS0pIHsKCQlvc3MgPDwgbnVtW2ldOwoJfQoJcmV0dXJuIG9zcy5zdHIoKTsKfQoKc3RyaW5nIHRvQmluYXkoc3RyaW5nIHN0cikgewoJYmlnIGE7CgliaWdfZnJvbV9zdHIoYSwgc3RyKTsKCgliaWcgemVybzsKCWJpZ19mcm9tX2ludCh6ZXJvLCAwKTsKCgliaWcgdHdvOwoJYmlnX2Zyb21faW50KHR3bywgMik7CgoJYmlnIG1vZDsKCXN0cmluZyByZXQgPSAiIjsKCgl3aGlsZSAoYmlnX2NtcChhLCB6ZXJvKSAhPSAwKSB7CgkJYmlnX21vZChhLCB0d28sIG1vZCk7CgkJcmV0ICs9IGJpZ190b19zdHIobW9kKTsKCQliaWdfZGl2aWRlKGEsIDIpOwoJfQoKCXJldmVyc2UoYWxsKHJldCkpOwoJcmV0dXJuIHJldDsKfQoKc3RyaW5nIHRvRGVjaW1hbChzdHJpbmcgYmluYXJ5KSB7CgliaWcgdHdvUG93OwoJYmlnX2Zyb21faW50KHR3b1BvdywgMSk7CgoJYmlnIGE7CgliaWdfemVybyhhKTsKCgliaWcgdGVtcDsKCWZvciAoaW50IGkgPSBzeihiaW5hcnkpIC0gMTsgaSA+PSAwOyAtLWkpIHsKCQlpZiAoYmluYXJ5W2ldID09ICcxJykgewoJCQliaWdfYWRkKGEsIHR3b1BvdywgdGVtcCk7CgkJCWJpZ19jb3B5KGEsIHRlbXApOwoJCX0KCgkJYmlnX3Byb2R1Y3QodHdvUG93LCAyKTsKCX0KCXJldHVybiBiaWdfdG9fc3RyKGEpOwp9CgpzdHJpbmcgZmlib25hY2NpZShpbnQgbikKewoJaW50IGZpYlszXVtNQVhdOwoKCWJpZ19mcm9tX2ludChmaWJbMF0sIDEpOwoJYmlnX2Zyb21faW50KGZpYlsxXSwgMSk7CgliaWdfZnJvbV9pbnQoZmliWzJdLCAxKTsKCglmb3IoaW50IGk9MjtpPG47aSsrKQoJewoJCWJpZ19hZGQoZmliWzBdLCBmaWJbMV0sIGZpYlsyXSk7CgkJYmlnX2NvcHkoZmliWzBdLCBmaWJbMV0pOwoJCWJpZ19jb3B5KGZpYlsxXSwgZmliWzJdKTsKCX0KCXJldHVybiBiaXRfdG9fc3RyKGZpYlsyXSk7Cn0KCmludCBtYWluKCkKewoJc3RyaW5nIG51bTEsIG51bTI7CgliaWcgYSwgYiwgYzsKCgl3aGlsZShjaW4+Pm51bTE+Pm51bTIpCgl7CgkJYmlnX2Zyb21fc3RyKGEsIG51bTEpOwoJCWJpZ19mcm9tX3N0cihiLCBudW0yKTsKCgkJYmlnX3Byb2R1Y3QoYSwgYiwgYyk7CgkJYmlnX3ByaW50KGMpOwoJfQoJcmV0dXJuIDA7Cn0=