#define _CRT_SECURE_NO_WARNINGS
#define NDEBUG
#include <string.h>
#include <stdio.h>
#include <ctype.h>
#include <assert.h>
#include <algorithm>
#include <string>
#include <vector>
#include <future>
#include <locale>
#include <thread>
using namespace std;
inline long long ipow(long long x, long long p)
{
if (x == 0 || x == 1) return x;
long long r = 1;
while(p)
{
if (p&0x1) r*= x;
x *= x;
p >>= 1;
}
return r;
}
inline unsigned long long isqrt(unsigned long long x)
{
unsigned long long x1, g0, g1;
if (x <= 1) return x;
int s = 1;
x1 = x - 1;
if (x1 > 0xFFFFFFFF) { s = s + 16; x1 >>= 32; }
if (x1 > 0xFFFF) { s = s + 8; x1 >>= 16; }
if (x1 > 0xFF) { s = s + 4; x1 >>= 8; }
if (x1 > 0xF) { s = s + 2; x1 >>= 4; }
if (x1 > 0x3) { s = s + 1; }
g0 = 1ll << s;
g1 = (g0 +(x>>s)) >> 1;
while( g1 < g0) {
g0 = g1;
g1 = (g0 + (x/g0)) >> 1;
}
return g0;
}
long long fact(long long x)
{
assert(x <= 20);
static long long vals[21] = {1,1,2,6,24,120,720,5040,0,0,0,0,0,0,0,0,0,0,0,0,0};
if (vals[x]) return vals[x];
long long s = 1;
for(int i = 1; i <= x; ++i)
{
s *= i;
vals[i] = s;
}
return s;
}
long long bifact(long long x)
{
assert(x <= 32);
static long long vals[33] = {1,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0};
if (vals[x]) return vals[x];
long long s = 1;
for(int i = 1; i <= 31; i += 2)
{
s *= i;
vals[i] = s;
}
s = 1;
for(int i = 2; i <= 32; i += 2)
{
s *= i;
vals[i] = s;
}
return vals[x];
}
typedef long long ALM_STYPE;
static int alm_parse( void * alm_param );
#define Number 257
#define Wrong 258
#define uminus 259
#define alm_IntError
#define alm_clearin alm_char = -1
#define alm_errok alm_errflag = 0
#ifndef ALM_MAXDEPTH
#define ALM_MAXDEPTH 150
#endif
#define ALM_ERRCODE 256
template< typename RandomAccess, typename Compare >
bool next_kpermutation( RandomAccess first, RandomAccess last,
typename std::iterator_traits< RandomAccess >::difference_type k,
Compare comp )
{
typedef typename std::iterator_traits< RandomAccess >::difference_type Int;
typedef typename std::iterator_traits< RandomAccess >::value_type Val;
if( first == last ) return false;
Int n = std::distance(first, last);
if (k > n) return false;
//Int n = distance(first, last);
//Int i = -1;
RandomAccess i = last;
for(RandomAccess j = first + k - 1;
j >= first; --j)
{
if (std::max_element(j,last) != j)
{
i = j;
break;
}
}
if (i == last) return false;
{
// Сначала ищем первый, больший p_[i]
RandomAccess j = i;
++j;
while(!comp(*i,*j)) ++j;
RandomAccess imin = j; // Индекс минимального
for(; j != last; ++j)
{
if (comp(*i,*j) &&
comp(*j,*imin))
{
imin = j;
}
}
std::swap( *i, *imin );
++i;
}
RandomAccess u = first + std::min(k,n-1);
while ( i < u )
{
RandomAccess imin = i;
for(RandomAccess j = i + 1; j != last; ++j)
{
if (comp(*j,*imin)) imin = j;
}
std::swap( *i, *imin );
++i;
}
return true;
}
template< typename RandomAccess >
bool next_kpermutation( RandomAccess first, RandomAccess last, int k )
{
return ( next_kpermutation( first, last, k,
std::less< typename std::iterator_traits< RandomAccess >::value_type >( )
) );
}
static void alm_error(int) {}
static int alm_lex(void*qq,ALM_STYPE*alm_lval)
{
const char *& alm_textpointer = *(const char **)qq;
while(*alm_textpointer==' ' /*||*alm_textpointer=='\t' */) ++alm_textpointer;
switch(*alm_textpointer)
{
case 0: return EOF;
case '0':
{
if (isdigit(*(alm_textpointer+1))) return Wrong;
}
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
{
*alm_lval = 0;
while(*alm_textpointer >= '0' && *alm_textpointer <= '9')
{
*alm_lval = (*alm_lval)*10 + (*alm_textpointer - '0');
++alm_textpointer;
}
return Number;
} break;
case '*':
if (*(alm_textpointer+1) == '*')
{
alm_textpointer += 2;
return '^';
}
case '+':
case '-':
case '(':
case ')':
case '/':
case '=':
case '^':
case ';':
case '!':
case '#':
case '%':
{
*alm_lval = 0;
return *alm_textpointer++;
} break;
}
++alm_textpointer;
return Wrong;
}
mutex mx;
int total_count = 0;
void almetis(int begin, int end,
const char * buf, const char * symbols, int symno)
{
char digs[] = "0123456789";
int no = 0;
do {
if (no >= end) break;
if (no < begin) continue;
char stmt[2048];
const char * c = buf;
char * t = stmt;
for(;*c; ++c,++t)
{
switch(*c)
{
case ' ':
case '0':
case '1':
case '2':
case '3':
case '4':
case '5':
case '6':
case '7':
case '8':
case '9':
case '(':
case ')':
case '+':
case '-':
case '*':
case '/':
case '=':
case '^':
case ';':
case '!':
case '#':
case '%':
case '\t':
case '\r':
case '\n': *t = *c; break;
default:
for(int j = 0; j < symno; ++j)
{
if (*c == symbols[j])
{
*t = digs[j];
break;
}
}
}
}
*t = 0;
const char * q = stmt;
if (alm_parse(&q) == 0)
{
lock_guard<mutex> lk(mx);
total_count++;
printf("%s\n",stmt);
}
} while(++no, next_kpermutation(digs,digs+10,symno));
};
int main(int argc, char* argv[])
{
setlocale(LC_ALL,"Rus");
int threads = thread::hardware_concurrency();
if (threads <= 1) threads = 1;
else if (threads > 8) threads = 8;
printf("Threads: %d\n",threads);
char buf[2048] = { 0 };
fgets(buf,2048,stdin);
char symbols[11] = { 0 };
int symno = 0;
for(const char * c = buf; *c; ++c)
{
if (strchr(" 01234567890()+-*/=^;#%!\t\r\n",*c)) continue;
bool found = false;
for(int j = 0; j < symno; ++j)
if (symbols[j] == *c)
{
found = true;
break;
}
if (!found) symbols[symno++] = *c;
if (symno == 11)
{
fprintf(stderr,"Too many symbols\n");
return 1;
}
}
printf("There are %d symbols: %s\n",symno,symbols);
int count = 1;
for(int i = 0; i < symno; ++i) count *= (10-i);
if ((count < 5000) || (threads == 1))
{
almetis(0,count,buf,symbols,symno);
}
else
{
int part = count / threads;
assert(threads * part == count);
vector<future<void>> fus;
for(int i = 0; i < threads; ++i)
{
fus.push_back(async(almetis,i*part,(i+1)*part,buf,symbols,symno));
}
for(auto& x: fus) x.get();
}
printf("Solutions: %d\n",total_count);
}
static const int alm_exca[] ={
-1, 1,
0, -1,
-2, 0,
};
#define ALM_NPROD 22
#define ALM_LAST 228
static const int alm_act[]={
9, 13, 4, 2, 9, 10, 1, 20, 8, 10,
7, 21, 8, 0, 7, 33, 17, 15, 20, 16,
20, 19, 21, 0, 21, 20, 0, 17, 15, 21,
16, 0, 19, 5, 17, 15, 20, 16, 0, 19,
21, 0, 0, 6, 0, 17, 14, 26, 0, 0,
19, 22, 23, 24, 25, 0, 0, 0, 27, 28,
29, 30, 31, 32, 0, 0, 0, 0, 18, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 18,
0, 18, 0, 0, 0, 0, 18, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 18, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 0, 0, 0, 0, 0, 0, 0, 0, 0,
0, 3, 11, 12, 0, 0, 11, 12 };
static const int alm_pact[]={
-35, -1000, -1000, -1000, -58, -1000, -15, -31, -31, -31,
-31, -1000, -1000, -31, -31, -31, -31, -31, -31, -31,
-1000, -1000, -13, -13, -1000, -26, -1000, -8, 3, 3,
-13, -13, -13, -1000 };
static const int alm_pgo[]={
0, 6, 3, 2, 33, 43 };
static const int alm_r1[]={
0, 1, 1, 2, 2, 3, 3, 4, 4, 5,
5, 5, 5, 5, 5, 5, 5, 5, 5, 5,
5, 5 };
static const int alm_r2[]={
0, 1, 1, 1, 2, 3, 1, 3, 1, 3,
3, 2, 2, 3, 3, 3, 2, 2, 2, 3,
1, 1 };
static const int alm_chk[]={
-1000, -1, -2, 256, -3, -4, -5, 45, 43, 35,
40, 257, 258, 59, 61, 43, 45, 42, 94, 47,
33, 37, -5, -5, -5, -5, -4, -5, -5, -5,
-5, -5, -5, 41 };
static const int alm_def[]={
0, -2, 1, 2, 3, 6, 8, 0, 0, 0,
0, 20, 21, 4, 0, 0, 0, 0, 0, 0,
16, 17, 11, 12, 18, 0, 5, 7, 9, 10,
13, 14, 15, 19 };
#define YACC_MEM_STACK
//#define alm_IntError
#ifdef alm_IntError
#define alm_errNoMemory -1
#define alm_errStackOvr -2
#define alm_errSyntax -3
#else
#define alm_errNoMemory "not enough memory"
#define alm_errStackOvr "internal stack overflow"
#define alm_errSyntax "syntax error"
#endif
#define ALM_FLAG (-1000)
#define ALM_ERROR goto alm_errlab
#define ALM_ACCEPT return(0)
#define ALM_ABORT return(1)
#if defined(YACC_MEM_HEAP)
template<typename T>
class alm__memory
{
T * ptr_;
public:
alm__memory(unsigned int size)
{
ptr_ = new T[size];
};
~alm__memory()
{
delete[] ptr_;
};
T* ptr()
{
return ptr_;
};
};
#endif
static int alm_parse( void * alm_param )
{
ALM_STYPE alm_lval = ALM_STYPE(), alm_val = ALM_STYPE();
int alm_char = -1;
int alm_nerrs = 0;
int alm_errflag = 0;
#if defined(YACC_MEM_HEAP)
int * alm_s;
ALM_STYPE * alm_v;
#endif
#if defined(YACC_MEM_STACK)
int alm_s[ALM_MAXDEPTH+2];
ALM_STYPE alm_v[ALM_MAXDEPTH+2];
#endif
int alm_j, alm_m;
ALM_STYPE * alm_pvt;
int alm_state, *alm_ps, alm_n;
ALM_STYPE * alm_pv;
const int * alm_xi;
#if defined(YACC_MEM_HEAP)
alm__memory<ALM_STYPE> ALM__M (ALM_MAXDEPTH+2);
alm__memory<int > ALM__M1(ALM_MAXDEPTH+2);
alm_v = ALM__M.ptr();
alm_s = ALM__M1.ptr();
if ((alm_v == NULL) || (alm_s == NULL))
{
alm_error(alm_errNoMemory);
return(1);
};
#endif
alm_state = 0;
alm_char = -1;
alm_nerrs = 0;
alm_errflag = 0;
alm_ps = &alm_s[-1];
alm_pv = &alm_v[-1];
alm_stack:
if( ++alm_ps > &alm_s[ALM_MAXDEPTH] )
{
alm_error(alm_errStackOvr);
return(1);
}
*alm_ps = alm_state;
++alm_pv;
*alm_pv = alm_val;
alm_newstate:
alm_n = alm_pact[alm_state];
if( alm_n <= ALM_FLAG )
goto alm_default;
if( alm_char < 0 )
if( (alm_char = (int )alm_lex(alm_param,&alm_lval)) < 0 )
alm_char = 0;
if( (alm_n += alm_char) < 0 || alm_n >= ALM_LAST )
goto alm_default;
if( alm_chk[alm_n = alm_act[alm_n]] == alm_char )
{
alm_char = -1;
alm_val = alm_lval;
alm_state = alm_n;
if( alm_errflag > 0 )
--alm_errflag;
goto alm_stack;
}
alm_default:
if( (alm_n = alm_def[alm_state]) == -2 )
{
if( alm_char < 0 )
if( (alm_char = (int )alm_lex(alm_param,&alm_lval)) < 0 )
alm_char = 0;
for(alm_xi=alm_exca; (*alm_xi!=(-1)) || (alm_xi[1]!=alm_state);alm_xi+=2)
;
while( *(alm_xi += 2) >= 0 )
if( *alm_xi == alm_char )
break;
if( (alm_n = alm_xi[1]) < 0 )
return(0);
}
if( alm_n == 0 )
{
switch( alm_errflag )
{
case 0:
alm_error(alm_errSyntax);
alm_errlab:
++alm_nerrs;
case 1:
case 2:
alm_errflag = 3;
while ( alm_ps >= alm_s )
{
alm_n = alm_pact[*alm_ps] + ALM_ERRCODE;
if( alm_n >= 0 && alm_n < ALM_LAST &&
alm_chk[alm_act[alm_n]] == ALM_ERRCODE )
{
alm_state = alm_act[alm_n];
goto alm_stack;
}
alm_n = alm_pact[*alm_ps];
--alm_ps;
--alm_pv;
}
alm_abort:
return(1);
case 3:
if( alm_char == 0 )
goto alm_abort;
alm_char = -1;
goto alm_newstate;
}
}
alm_ps -= alm_r2[alm_n];
alm_pvt = alm_pv;
alm_pv -= alm_r2[alm_n];
alm_val = alm_pv[1];
alm_m = alm_n;
alm_n = alm_r1[alm_n];
alm_j = alm_pgo[alm_n] + *alm_ps + 1;
if( alm_j >= ALM_LAST || alm_chk[alm_state = alm_act[alm_j]] != -alm_n )
alm_state = alm_act[alm_pgo[alm_n]];
switch(alm_m)
{
case 1:{
return alm_pvt[-0] ? 0 : -1;
} break;
case 2:{
return -1;
} break;
case 3:{
alm_val = alm_pvt[-0];
} break;
case 4:{
alm_val = alm_pvt[-1];
} break;
case 5:{
if (alm_pvt[-0] == 0) return -1;
alm_val = alm_pvt[-2] && alm_pvt[-0];
} break;
case 6:{
if (alm_pvt[-0] == 0) return -1;
alm_val = alm_pvt[-0];
} break;
case 7:{
alm_val = (alm_pvt[-2] == alm_pvt[-0]) ? 1 : 0;
} break;
case 8:{
alm_val = (alm_pvt[-0] == 0) ? 1 : 0;
} break;
case 9:{
alm_val = alm_pvt[-2] + alm_pvt[-0];
} break;
case 10:{
alm_val = alm_pvt[-2] - alm_pvt[-0];
} break;
case 11:{
alm_val = -alm_pvt[-0];
} break;
case 12:{
alm_val = alm_pvt[-0];
} break;
case 13:{
alm_val = alm_pvt[-2] * alm_pvt[-0];
} break;
case 14:{
if (alm_pvt[-0] < 0) return -1;
alm_val = 1;
for(int i = 0; i < alm_pvt[-0]; ++i) alm_val *= alm_pvt[-2];
} break;
case 15:{
if (alm_pvt[-0] == 0) return -1;
alm_val = alm_pvt[-2] / alm_pvt[-0];
if (alm_val*alm_pvt[-0] != alm_pvt[-2]) return -1;
} break;
case 16:{
if (alm_pvt[-1] < 0) return -1;
if (alm_pvt[-1] >=20) return -1;
alm_val = fact(alm_pvt[-1]);
} break;
case 17:{
if (alm_pvt[-1] < 0) return -1;
if (alm_pvt[-1] >=33) return -1;
alm_val = bifact(alm_pvt[-1]);
} break;
case 18:{
if (alm_pvt[-1] < 0) return -1;
alm_val = isqrt(alm_pvt[-0]);
if (alm_val*alm_val != alm_pvt[-0]) return -1;
} break;
case 19:{
alm_val = alm_pvt[-1];
} break;
case 20:{
alm_val = alm_pvt[-0];
} break;
case 21:{
return -1;
} break;
}
goto alm_stack;
}
ICAgICNkZWZpbmUgIF9DUlRfU0VDVVJFX05PX1dBUk5JTkdTCiAgICAjZGVmaW5lICBOREVCVUcKICAgIAogICAgI2luY2x1ZGUgPHN0cmluZy5oPgogICAgI2luY2x1ZGUgPHN0ZGlvLmg+CiAgICAjaW5jbHVkZSA8Y3R5cGUuaD4KICAgICNpbmNsdWRlIDxhc3NlcnQuaD4KICAgICNpbmNsdWRlIDxhbGdvcml0aG0+CiAgICAjaW5jbHVkZSA8c3RyaW5nPgogICAgI2luY2x1ZGUgPHZlY3Rvcj4KICAgICNpbmNsdWRlIDxmdXR1cmU+CiAgICAjaW5jbHVkZSA8bG9jYWxlPgogICAgI2luY2x1ZGUgPHRocmVhZD4KICAgIAogICAgdXNpbmcgbmFtZXNwYWNlIHN0ZDsKICAgIAogICAgaW5saW5lIGxvbmcgbG9uZyBpcG93KGxvbmcgbG9uZyB4LCBsb25nIGxvbmcgcCkKICAgIHsKICAgICAgICBpZiAoeCA9PSAwIHx8IHggPT0gMSkgcmV0dXJuIHg7CiAgICAgICAgbG9uZyBsb25nIHIgPSAxOwogICAgICAgIHdoaWxlKHApCiAgICAgICAgewogICAgICAgICAgICBpZiAocCYweDEpIHIqPSB4OwogICAgICAgICAgICB4ICo9IHg7CiAgICAgICAgICAgIHAgPj49IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiByOwogICAgfQogICAgCiAgICBpbmxpbmUgdW5zaWduZWQgbG9uZyBsb25nIGlzcXJ0KHVuc2lnbmVkIGxvbmcgbG9uZyB4KQogICAgewogICAgICAgIHVuc2lnbmVkIGxvbmcgbG9uZyB4MSwgZzAsIGcxOwogICAgICAgIGlmICh4IDw9IDEpIHJldHVybiB4OwogICAgICAgIGludCBzID0gMTsKICAgICAgICB4MSA9IHggLSAxOwogICAgICAgIGlmICh4MSA+IDB4RkZGRkZGRkYpIHsgcyA9IHMgKyAxNjsgeDEgPj49IDMyOyB9CiAgICAgICAgaWYgKHgxID4gMHhGRkZGKSAgICAgeyBzID0gcyArICA4OyB4MSA+Pj0gMTY7IH0KICAgICAgICBpZiAoeDEgPiAweEZGKSAgICAgICB7IHMgPSBzICsgIDQ7IHgxID4+PSAgODsgfQogICAgICAgIGlmICh4MSA+IDB4RikgICAgICAgIHsgcyA9IHMgKyAgMjsgeDEgPj49ICA0OyB9CiAgICAgICAgaWYgKHgxID4gMHgzKSAgICAgICAgeyBzID0gcyArICAxOyB9CiAgICAKICAgICAgICBnMCA9IDFsbCA8PCBzOwogICAgICAgIGcxID0gKGcwICsoeD4+cykpID4+IDE7CiAgICAgICAgd2hpbGUoIGcxIDwgZzApIHsKICAgICAgICAgICAgZzAgPSBnMTsKICAgICAgICAgICAgZzEgPSAoZzAgKyAoeC9nMCkpID4+IDE7CiAgICAgICAgfQogICAgICAgIHJldHVybiBnMDsKICAgIH0KICAgIAogICAgbG9uZyBsb25nIGZhY3QobG9uZyBsb25nIHgpCiAgICB7CiAgICAgICAgYXNzZXJ0KHggPD0gMjApOwogICAgICAgIHN0YXRpYyBsb25nIGxvbmcgdmFsc1syMV0gPSB7MSwxLDIsNiwyNCwxMjAsNzIwLDUwNDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMH07CiAgICAgICAgaWYgKHZhbHNbeF0pIHJldHVybiB2YWxzW3hdOwogICAgICAgIGxvbmcgbG9uZyBzID0gMTsKICAgICAgICBmb3IoaW50IGkgPSAxOyBpIDw9IHg7ICsraSkKICAgICAgICB7CiAgICAgICAgICAgIHMgKj0gaTsKICAgICAgICAgICAgdmFsc1tpXSA9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiBzOwogICAgfQogICAgCiAgICBsb25nIGxvbmcgYmlmYWN0KGxvbmcgbG9uZyB4KQogICAgewogICAgICAgIGFzc2VydCh4IDw9IDMyKTsKICAgICAgICBzdGF0aWMgbG9uZyBsb25nIHZhbHNbMzNdID0gezEsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwLDAsMCwwfTsKICAgICAgICBpZiAodmFsc1t4XSkgcmV0dXJuIHZhbHNbeF07CiAgICAgICAgbG9uZyBsb25nIHMgPSAxOwogICAgICAgIGZvcihpbnQgaSA9IDE7IGkgPD0gMzE7IGkgKz0gMikKICAgICAgICB7CiAgICAgICAgICAgIHMgKj0gaTsKICAgICAgICAgICAgdmFsc1tpXSA9IHM7CiAgICAgICAgfQogICAgICAgIHMgPSAxOwogICAgICAgIGZvcihpbnQgaSA9IDI7IGkgPD0gMzI7IGkgKz0gMikKICAgICAgICB7CiAgICAgICAgICAgIHMgKj0gaTsKICAgICAgICAgICAgdmFsc1tpXSA9IHM7CiAgICAgICAgfQogICAgICAgIHJldHVybiB2YWxzW3hdOwogICAgfQogICAgCiAgICAKICAgIAogICAgdHlwZWRlZiBsb25nIGxvbmcgQUxNX1NUWVBFOwogICAgc3RhdGljIGludCBhbG1fcGFyc2UoIHZvaWQgKiBhbG1fcGFyYW0gKTsKICAgIAogICAgI2RlZmluZSAgIE51bWJlciAgICAgICAgICAgICAgICAgMjU3CiAgICAjZGVmaW5lICAgV3JvbmcgICAgICAgICAgICAgICAgICAyNTgKICAgICNkZWZpbmUgICB1bWludXMgICAgICAgICAgICAgICAgIDI1OQogICAgI2RlZmluZSAgIGFsbV9JbnRFcnJvcgogICAgI2RlZmluZSAgIGFsbV9jbGVhcmluICBhbG1fY2hhciA9IC0xCiAgICAjZGVmaW5lICAgYWxtX2Vycm9rICAgIGFsbV9lcnJmbGFnID0gMAogICAgI2lmbmRlZiAgIEFMTV9NQVhERVBUSCAgICAgICAgCiAgICAjZGVmaW5lICAgQUxNX01BWERFUFRIICAgICAgICAgICAxNTAKICAgICNlbmRpZgogICAgI2RlZmluZSAgIEFMTV9FUlJDT0RFICAgICAgICAgICAgMjU2CiAgICAKICAgIAogICAgCiAgICB0ZW1wbGF0ZTwgdHlwZW5hbWUgUmFuZG9tQWNjZXNzLCB0eXBlbmFtZSBDb21wYXJlID4KICAgIGJvb2wgbmV4dF9rcGVybXV0YXRpb24oIFJhbmRvbUFjY2VzcyBmaXJzdCwgUmFuZG9tQWNjZXNzIGxhc3QsCiAgICAgICAgICAgICAgICAgICAgICAgICAgIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPCBSYW5kb21BY2Nlc3MgPjo6ZGlmZmVyZW5jZV90eXBlIGssCiAgICAgICAgICAgICAgICAgICAgICAgICAgIENvbXBhcmUgY29tcCApCiAgICB7CiAgICAKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPCBSYW5kb21BY2Nlc3MgPjo6ZGlmZmVyZW5jZV90eXBlIEludDsKICAgICAgICB0eXBlZGVmIHR5cGVuYW1lIHN0ZDo6aXRlcmF0b3JfdHJhaXRzPCBSYW5kb21BY2Nlc3MgPjo6dmFsdWVfdHlwZSAgICAgIFZhbDsKICAgIAogICAgICAgIGlmKCBmaXJzdCA9PSBsYXN0ICkgcmV0dXJuIGZhbHNlOwogICAgICAgIEludCBuID0gc3RkOjpkaXN0YW5jZShmaXJzdCwgbGFzdCk7CiAgICAgICAgaWYgKGsgPiBuKSByZXR1cm4gZmFsc2U7CiAgICAKICAgICAgICAvL0ludCBuID0gZGlzdGFuY2UoZmlyc3QsIGxhc3QpOwogICAgICAgIC8vSW50IGkgPSAtMTsKICAgIAogICAgICAgIFJhbmRvbUFjY2VzcyBpID0gbGFzdDsKICAgICAgICBmb3IoUmFuZG9tQWNjZXNzIGogPSBmaXJzdCArIGsgLSAxOwogICAgICAgICAgICBqID49IGZpcnN0OyAtLWopCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RkOjptYXhfZWxlbWVudChqLGxhc3QpICE9IGopCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGkgPSBqOwogICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAKICAgICAgICBpZiAoaSA9PSBsYXN0KSByZXR1cm4gZmFsc2U7CiAgICAKICAgICAgICB7ICAgIAogICAgICAgICAgICAvLyDQodC90LDRh9Cw0LvQsCDQuNGJ0LXQvCDQv9C10YDQstGL0LksINCx0L7Qu9GM0YjQuNC5IHBfW2ldCiAgICAgICAgICAgIFJhbmRvbUFjY2VzcyBqID0gaTsKICAgICAgICAgICAgKytqOwogICAgICAgICAgICB3aGlsZSghY29tcCgqaSwqaikpICsrajsKICAgICAgICAgICAgUmFuZG9tQWNjZXNzIGltaW4gPSBqOyAvLyDQmNC90LTQtdC60YEg0LzQuNC90LjQvNCw0LvRjNC90L7Qs9C+CiAgICAgICAgICAgIGZvcig7IGogIT0gbGFzdDsgKytqKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY29tcCgqaSwqaikgJiYKICAgICAgICAgICAgICAgICAgICBjb21wKCpqLCppbWluKSkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBpbWluID0gajsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgfQogICAgICAgICAgICBzdGQ6OnN3YXAoICppLCAqaW1pbiApOwogICAgICAgICAgICArK2k7CiAgICAgICAgfQogICAgCiAgICAgICAgUmFuZG9tQWNjZXNzIHUgPSBmaXJzdCArIHN0ZDo6bWluKGssbi0xKTsKICAgICAgICB3aGlsZSAoIGkgPCB1ICkKICAgICAgICB7CiAgICAgICAgICAgIFJhbmRvbUFjY2VzcyBpbWluID0gaTsKICAgICAgICAgICAgZm9yKFJhbmRvbUFjY2VzcyBqID0gaSArIDE7IGogIT0gbGFzdDsgKytqKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBpZiAoY29tcCgqaiwqaW1pbikpIGltaW4gPSBqOwogICAgICAgICAgICB9CiAgICAgICAgICAgIHN0ZDo6c3dhcCggKmksICppbWluICk7CiAgICAgICAgICAgICsraTsKICAgICAgICB9CiAgICAKICAgICAgICByZXR1cm4gdHJ1ZTsKICAgIH0KICAgIAogICAgdGVtcGxhdGU8IHR5cGVuYW1lIFJhbmRvbUFjY2VzcyA+CiAgICBib29sIG5leHRfa3Blcm11dGF0aW9uKCBSYW5kb21BY2Nlc3MgZmlyc3QsIFJhbmRvbUFjY2VzcyBsYXN0LCBpbnQgayApCiAgICB7CiAgICAgICAgcmV0dXJuICggbmV4dF9rcGVybXV0YXRpb24oIGZpcnN0LCBsYXN0LCBrLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN0ZDo6bGVzczwgdHlwZW5hbWUgc3RkOjppdGVyYXRvcl90cmFpdHM8IFJhbmRvbUFjY2VzcyA+Ojp2YWx1ZV90eXBlID4oICkKICAgICAgICApICk7CiAgICB9CiAgICAKICAgIHN0YXRpYyB2b2lkIGFsbV9lcnJvcihpbnQpIHt9CiAgICBzdGF0aWMgaW50IGFsbV9sZXgodm9pZCpxcSxBTE1fU1RZUEUqYWxtX2x2YWwpCiAgICB7CiAgICAgICAgY29uc3QgY2hhciAqJiBhbG1fdGV4dHBvaW50ZXIgPSAqKGNvbnN0IGNoYXIgKiopcXE7CiAgICAKICAgICAgICB3aGlsZSgqYWxtX3RleHRwb2ludGVyPT0nICcgLyp8fCphbG1fdGV4dHBvaW50ZXI9PSdcdCcgKi8pICsrYWxtX3RleHRwb2ludGVyOwogICAgICAgIHN3aXRjaCgqYWxtX3RleHRwb2ludGVyKQogICAgICAgIHsKICAgICAgICBjYXNlIDA6ICAgcmV0dXJuIEVPRjsKICAgICAgICBjYXNlICcwJzoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgaWYgKGlzZGlnaXQoKihhbG1fdGV4dHBvaW50ZXIrMSkpKSByZXR1cm4gV3Jvbmc7CiAgICAgICAgICAgIH0KICAgICAgICBjYXNlICcxJzoKICAgICAgICBjYXNlICcyJzoKICAgICAgICBjYXNlICczJzoKICAgICAgICBjYXNlICc0JzoKICAgICAgICBjYXNlICc1JzoKICAgICAgICBjYXNlICc2JzoKICAgICAgICBjYXNlICc3JzoKICAgICAgICBjYXNlICc4JzoKICAgICAgICBjYXNlICc5JzoKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgKmFsbV9sdmFsID0gMDsKICAgICAgICAgICAgICAgIHdoaWxlKCphbG1fdGV4dHBvaW50ZXIgPj0gJzAnICYmICphbG1fdGV4dHBvaW50ZXIgPD0gJzknKQogICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICphbG1fbHZhbCA9ICgqYWxtX2x2YWwpKjEwICsgKCphbG1fdGV4dHBvaW50ZXIgLSAnMCcpOwogICAgICAgICAgICAgICAgICAgICsrYWxtX3RleHRwb2ludGVyOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgcmV0dXJuIE51bWJlcjsKICAgICAgICAgICAgfSBicmVhazsKICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgaWYgKCooYWxtX3RleHRwb2ludGVyKzEpID09ICcqJykKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgYWxtX3RleHRwb2ludGVyICs9IDI7CiAgICAgICAgICAgICAgICByZXR1cm4gJ14nOwogICAgICAgICAgICB9CiAgICAgICAgY2FzZSAnKyc6CiAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgY2FzZSAnKSc6CiAgICAgICAgY2FzZSAnLyc6CiAgICAgICAgY2FzZSAnPSc6CiAgICAgICAgY2FzZSAnXic6CiAgICAgICAgY2FzZSAnOyc6CiAgICAgICAgY2FzZSAnISc6CiAgICAgICAgY2FzZSAnIyc6CiAgICAgICAgY2FzZSAnJSc6CiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICphbG1fbHZhbCA9IDA7CiAgICAgICAgICAgICAgICByZXR1cm4gKmFsbV90ZXh0cG9pbnRlcisrOwogICAgICAgICAgICB9IGJyZWFrOwogICAgCiAgICAgICAgfQogICAgICAgICsrYWxtX3RleHRwb2ludGVyOwogICAgICAgIHJldHVybiBXcm9uZzsKICAgIH0KICAgIAogICAgbXV0ZXggbXg7CiAgICBpbnQgdG90YWxfY291bnQgPSAwOwogICAgCiAgICB2b2lkIGFsbWV0aXMoaW50IGJlZ2luLCBpbnQgZW5kLAogICAgICAgICAgICAgICAgIGNvbnN0IGNoYXIgKiBidWYsIGNvbnN0IGNoYXIgKiBzeW1ib2xzLCBpbnQgc3ltbm8pCiAgICB7CiAgICAgICAgY2hhciBkaWdzW10gPSAiMDEyMzQ1Njc4OSI7CiAgICAgICAgaW50IG5vID0gMDsKICAgICAgICBkbyB7CiAgICAgICAgICAgIGlmIChubyA+PSBlbmQpIGJyZWFrOwogICAgICAgICAgICBpZiAobm8gPCBiZWdpbikgY29udGludWU7CiAgICAKICAgICAgICAgICAgY2hhciBzdG10WzIwNDhdOwogICAgICAgICAgICBjb25zdCBjaGFyICogYyA9IGJ1ZjsKICAgICAgICAgICAgY2hhciAqICAgICAgIHQgPSBzdG10OwogICAgICAgICAgICBmb3IoOypjOyArK2MsKyt0KQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBzd2l0Y2goKmMpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBjYXNlICcgJzoKICAgICAgICAgICAgICAgIGNhc2UgJzAnOgogICAgICAgICAgICAgICAgY2FzZSAnMSc6CiAgICAgICAgICAgICAgICBjYXNlICcyJzoKICAgICAgICAgICAgICAgIGNhc2UgJzMnOgogICAgICAgICAgICAgICAgY2FzZSAnNCc6CiAgICAgICAgICAgICAgICBjYXNlICc1JzoKICAgICAgICAgICAgICAgIGNhc2UgJzYnOgogICAgICAgICAgICAgICAgY2FzZSAnNyc6CiAgICAgICAgICAgICAgICBjYXNlICc4JzoKICAgICAgICAgICAgICAgIGNhc2UgJzknOgogICAgICAgICAgICAgICAgY2FzZSAnKCc6CiAgICAgICAgICAgICAgICBjYXNlICcpJzoKICAgICAgICAgICAgICAgIGNhc2UgJysnOgogICAgICAgICAgICAgICAgY2FzZSAnLSc6CiAgICAgICAgICAgICAgICBjYXNlICcqJzoKICAgICAgICAgICAgICAgIGNhc2UgJy8nOgogICAgICAgICAgICAgICAgY2FzZSAnPSc6CiAgICAgICAgICAgICAgICBjYXNlICdeJzoKICAgICAgICAgICAgICAgIGNhc2UgJzsnOgogICAgICAgICAgICAgICAgY2FzZSAnISc6CiAgICAgICAgICAgICAgICBjYXNlICcjJzoKICAgICAgICAgICAgICAgIGNhc2UgJyUnOgogICAgICAgICAgICAgICAgY2FzZSAnXHQnOgogICAgICAgICAgICAgICAgY2FzZSAnXHInOgogICAgICAgICAgICAgICAgY2FzZSAnXG4nOiAqdCA9ICpjOyBicmVhazsKICAgICAgICAgICAgICAgIGRlZmF1bHQ6CiAgICAgICAgICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHN5bW5vOyArK2opCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBpZiAoKmMgPT0gc3ltYm9sc1tqXSkKICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgKnQgPSBkaWdzW2pdOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIH0KICAgICAgICAgICAgKnQgPSAwOwogICAgICAgICAgICBjb25zdCBjaGFyICogcSA9IHN0bXQ7CiAgICAgICAgICAgIGlmIChhbG1fcGFyc2UoJnEpID09IDApCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGxvY2tfZ3VhcmQ8bXV0ZXg+IGxrKG14KTsKICAgICAgICAgICAgICAgIHRvdGFsX2NvdW50Kys7CiAgICAgICAgICAgICAgICBwcmludGYoIiVzXG4iLHN0bXQpOwogICAgICAgICAgICB9CiAgICAgICAgfSB3aGlsZSgrK25vLCBuZXh0X2twZXJtdXRhdGlvbihkaWdzLGRpZ3MrMTAsc3ltbm8pKTsKICAgIAogICAgfTsKICAgIAogICAgCiAgICBpbnQgbWFpbihpbnQgYXJnYywgY2hhciogYXJndltdKQogICAgewogICAgICAgIHNldGxvY2FsZShMQ19BTEwsIlJ1cyIpOwogICAgICAgIGludCB0aHJlYWRzID0gdGhyZWFkOjpoYXJkd2FyZV9jb25jdXJyZW5jeSgpOwogICAgICAgIGlmICh0aHJlYWRzIDw9IDEpIHRocmVhZHMgPSAxOwogICAgICAgIGVsc2UgaWYgKHRocmVhZHMgPiA4KSB0aHJlYWRzID0gODsKICAgICAgICBwcmludGYoIlRocmVhZHM6ICVkXG4iLHRocmVhZHMpOwogICAgCiAgICAgICAgY2hhciBidWZbMjA0OF0gPSB7IDAgfTsKCiAgICAgICAgZmdldHMoYnVmLDIwNDgsc3RkaW4pOwogICAKICAgICAgICBjaGFyIHN5bWJvbHNbMTFdID0geyAwIH07CiAgICAgICAgaW50IHN5bW5vID0gMDsKICAgICAgICBmb3IoY29uc3QgY2hhciAqIGMgPSBidWY7ICpjOyArK2MpCiAgICAgICAgewogICAgICAgICAgICBpZiAoc3RyY2hyKCIgMDEyMzQ1Njc4OTAoKSstKi89XjsjJSFcdFxyXG4iLCpjKSkgY29udGludWU7CiAgICAgICAgICAgIGJvb2wgZm91bmQgPSBmYWxzZTsKICAgICAgICAgICAgZm9yKGludCBqID0gMDsgaiA8IHN5bW5vOyArK2opCiAgICAgICAgICAgICAgICBpZiAoc3ltYm9sc1tqXSA9PSAqYykKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBmb3VuZCA9IHRydWU7CiAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgIGlmICghZm91bmQpIHN5bWJvbHNbc3ltbm8rK10gPSAqYzsKICAgICAgICAgICAgaWYgKHN5bW5vID09IDExKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmcHJpbnRmKHN0ZGVyciwiVG9vIG1hbnkgc3ltYm9sc1xuIik7CiAgICAgICAgICAgICAgICByZXR1cm4gMTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIAogICAgICAgIHByaW50ZigiVGhlcmUgYXJlICVkIHN5bWJvbHM6ICVzXG4iLHN5bW5vLHN5bWJvbHMpOwogICAgCiAgICAgICAgaW50IGNvdW50ID0gMTsKICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgc3ltbm87ICsraSkgY291bnQgKj0gKDEwLWkpOwogICAgCiAgICAgICAgaWYgKChjb3VudCA8IDUwMDApIHx8ICh0aHJlYWRzID09IDEpKQogICAgICAgIHsKICAgICAgICAgICAgYWxtZXRpcygwLGNvdW50LGJ1ZixzeW1ib2xzLHN5bW5vKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgaW50IHBhcnQgPSBjb3VudCAvIHRocmVhZHM7CiAgICAgICAgICAgIGFzc2VydCh0aHJlYWRzICogcGFydCA9PSBjb3VudCk7CiAgICAKICAgICAgICAgICAgdmVjdG9yPGZ1dHVyZTx2b2lkPj4gZnVzOwogICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgdGhyZWFkczsgKytpKQogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICBmdXMucHVzaF9iYWNrKGFzeW5jKGFsbWV0aXMsaSpwYXJ0LChpKzEpKnBhcnQsYnVmLHN5bWJvbHMsc3ltbm8pKTsKICAgICAgICAgICAgfQogICAgICAgICAgICBmb3IoYXV0byYgeDogZnVzKSB4LmdldCgpOwogICAgICAgIH0KICAgICAgICBwcmludGYoIlNvbHV0aW9uczogJWRcbiIsdG90YWxfY291bnQpOwogICAgfQogICAgc3RhdGljIGNvbnN0IGludCAgYWxtX2V4Y2FbXSA9ewogICAgICAgIC0xLCAgICAgIDEsCiAgICAgICAgICAgICAgICAgICAgICAgICAwLCAgICAgLTEsCiAgICAgICAgLTIsICAgICAgMCwKICAgIAl9OwogICAgCiAgICAjZGVmaW5lICAgQUxNX05QUk9EICAgICAgICAgICAgICAgMjIKICAgICNkZWZpbmUgICBBTE1fTEFTVCAgICAgICAgICAgICAgIDIyOAogICAgc3RhdGljIGNvbnN0IGludCAgYWxtX2FjdFtdPXsKICAgIAogICAgICAgICA5LCAgICAxMywgICAgIDQsICAgICAyLCAgICAgOSwgICAgMTAsICAgICAxLCAgICAyMCwgICAgIDgsICAgIDEwLAogICAgICAgICA3LCAgICAyMSwgICAgIDgsICAgICAwLCAgICAgNywgICAgMzMsICAgIDE3LCAgICAxNSwgICAgMjAsICAgIDE2LAogICAgICAgIDIwLCAgICAxOSwgICAgMjEsICAgICAwLCAgICAyMSwgICAgMjAsICAgICAwLCAgICAxNywgICAgMTUsICAgIDIxLAogICAgICAgIDE2LCAgICAgMCwgICAgMTksICAgICA1LCAgICAxNywgICAgMTUsICAgIDIwLCAgICAxNiwgICAgIDAsICAgIDE5LAogICAgICAgIDIxLCAgICAgMCwgICAgIDAsICAgICA2LCAgICAgMCwgICAgMTcsICAgIDE0LCAgICAyNiwgICAgIDAsICAgICAwLAogICAgICAgIDE5LCAgICAyMiwgICAgMjMsICAgIDI0LCAgICAyNSwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMjcsICAgIDI4LAogICAgICAgIDI5LCAgICAzMCwgICAgMzEsICAgIDMyLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgMTgsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE4LAogICAgICAgICAwLCAgICAxOCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgIDE4LCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAxOCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLAogICAgICAgICAwLCAgICAgMywgICAgMTEsICAgIDEyLCAgICAgMCwgICAgIDAsICAgIDExLCAgICAxMiB9OwogICAgCiAgICBzdGF0aWMgY29uc3QgaW50ICBhbG1fcGFjdFtdPXsKICAgIAogICAgICAgLTM1LCAtMTAwMCwgLTEwMDAsIC0xMDAwLCAgIC01OCwgLTEwMDAsICAgLTE1LCAgIC0zMSwgICAtMzEsICAgLTMxLAogICAgICAgLTMxLCAtMTAwMCwgLTEwMDAsICAgLTMxLCAgIC0zMSwgICAtMzEsICAgLTMxLCAgIC0zMSwgICAtMzEsICAgLTMxLAogICAgIC0xMDAwLCAtMTAwMCwgICAtMTMsICAgLTEzLCAtMTAwMCwgICAtMjYsIC0xMDAwLCAgICAtOCwgICAgIDMsICAgICAzLAogICAgICAgLTEzLCAgIC0xMywgICAtMTMsIC0xMDAwIH07CiAgICAKICAgIHN0YXRpYyBjb25zdCBpbnQgIGFsbV9wZ29bXT17CiAgICAKICAgICAgICAgMCwgICAgIDYsICAgICAzLCAgICAgMiwgICAgMzMsICAgIDQzIH07CiAgICAKICAgIHN0YXRpYyBjb25zdCBpbnQgIGFsbV9yMVtdPXsKICAgIAogICAgICAgICAwLCAgICAgMSwgICAgIDEsICAgICAyLCAgICAgMiwgICAgIDMsICAgICAzLCAgICAgNCwgICAgIDQsICAgICA1LAogICAgICAgICA1LCAgICAgNSwgICAgIDUsICAgICA1LCAgICAgNSwgICAgIDUsICAgICA1LCAgICAgNSwgICAgIDUsICAgICA1LAogICAgICAgICA1LCAgICAgNSB9OwogICAgCiAgICBzdGF0aWMgY29uc3QgaW50ICBhbG1fcjJbXT17CiAgICAKICAgICAgICAgMCwgICAgIDEsICAgICAxLCAgICAgMSwgICAgIDIsICAgICAzLCAgICAgMSwgICAgIDMsICAgICAxLCAgICAgMywKICAgICAgICAgMywgICAgIDIsICAgICAyLCAgICAgMywgICAgIDMsICAgICAzLCAgICAgMiwgICAgIDIsICAgICAyLCAgICAgMywKICAgICAgICAgMSwgICAgIDEgfTsKICAgIAogICAgc3RhdGljIGNvbnN0IGludCAgYWxtX2Noa1tdPXsKICAgIAogICAgIC0xMDAwLCAgICAtMSwgICAgLTIsICAgMjU2LCAgICAtMywgICAgLTQsICAgIC01LCAgICA0NSwgICAgNDMsICAgIDM1LAogICAgICAgIDQwLCAgIDI1NywgICAyNTgsICAgIDU5LCAgICA2MSwgICAgNDMsICAgIDQ1LCAgICA0MiwgICAgOTQsICAgIDQ3LAogICAgICAgIDMzLCAgICAzNywgICAgLTUsICAgIC01LCAgICAtNSwgICAgLTUsICAgIC00LCAgICAtNSwgICAgLTUsICAgIC01LAogICAgICAgIC01LCAgICAtNSwgICAgLTUsICAgIDQxIH07CiAgICAKICAgIHN0YXRpYyBjb25zdCBpbnQgIGFsbV9kZWZbXT17CiAgICAKICAgICAgICAgMCwgICAgLTIsICAgICAxLCAgICAgMiwgICAgIDMsICAgICA2LCAgICAgOCwgICAgIDAsICAgICAwLCAgICAgMCwKICAgICAgICAgMCwgICAgMjAsICAgIDIxLCAgICAgNCwgICAgIDAsICAgICAwLCAgICAgMCwgICAgIDAsICAgICAwLCAgICAgMCwKICAgICAgICAxNiwgICAgMTcsICAgIDExLCAgICAxMiwgICAgMTgsICAgICAwLCAgICAgNSwgICAgIDcsICAgICA5LCAgICAxMCwKICAgICAgICAxMywgICAgMTQsICAgIDE1LCAgICAxOSB9OwogICAgCiAgICAjZGVmaW5lIFlBQ0NfTUVNX1NUQUNLCiAgICAvLyNkZWZpbmUgIGFsbV9JbnRFcnJvcgogICAgCiAgICAjaWZkZWYgICBhbG1fSW50RXJyb3IKICAgICNkZWZpbmUgIGFsbV9lcnJOb01lbW9yeSAgIC0xCiAgICAjZGVmaW5lICBhbG1fZXJyU3RhY2tPdnIgICAtMgogICAgI2RlZmluZSAgYWxtX2VyclN5bnRheCAgICAgLTMKICAgICNlbHNlCiAgICAjZGVmaW5lICBhbG1fZXJyTm9NZW1vcnkgICAibm90IGVub3VnaCBtZW1vcnkiCiAgICAjZGVmaW5lICBhbG1fZXJyU3RhY2tPdnIgICAiaW50ZXJuYWwgc3RhY2sgb3ZlcmZsb3ciCiAgICAjZGVmaW5lICBhbG1fZXJyU3ludGF4ICAgICAic3ludGF4IGVycm9yIgogICAgI2VuZGlmCiAgICAKICAgICNkZWZpbmUgQUxNX0ZMQUcgICAgKC0xMDAwKQogICAgI2RlZmluZSBBTE1fRVJST1IgICBnb3RvIGFsbV9lcnJsYWIKICAgICNkZWZpbmUgQUxNX0FDQ0VQVCAgcmV0dXJuKDApCiAgICAjZGVmaW5lIEFMTV9BQk9SVCAgIHJldHVybigxKQogICAgCiAgICAjaWYgZGVmaW5lZChZQUNDX01FTV9IRUFQKQogICAgdGVtcGxhdGU8dHlwZW5hbWUgVD4KICAgIGNsYXNzIGFsbV9fbWVtb3J5CiAgICB7CiAgICAgICAgVCAqIHB0cl87CiAgICBwdWJsaWM6CiAgICAgICAgYWxtX19tZW1vcnkodW5zaWduZWQgaW50IHNpemUpCiAgICAgICAgewogICAgICAgICAgICBwdHJfID0gbmV3IFRbc2l6ZV07CiAgICAgICAgfTsKICAgICAgICB+YWxtX19tZW1vcnkoKQogICAgICAgIHsKICAgICAgICAgICAgZGVsZXRlW10gcHRyXzsKICAgICAgICB9OwogICAgICAgIFQqIHB0cigpCiAgICAgICAgewogICAgICAgICAgICByZXR1cm4gcHRyXzsKICAgICAgICB9OwogICAgfTsKICAgICNlbmRpZgogICAgCiAgICBzdGF0aWMgaW50IGFsbV9wYXJzZSggdm9pZCAqIGFsbV9wYXJhbSApCiAgICB7CiAgICAgICAgQUxNX1NUWVBFICAgYWxtX2x2YWwgPSBBTE1fU1RZUEUoKSwgYWxtX3ZhbCA9IEFMTV9TVFlQRSgpOwogICAgICAgIGludCAgICAgIGFsbV9jaGFyICAgID0gLTE7CiAgICAgICAgaW50ICAgICAgYWxtX25lcnJzICAgPSAgMDsKICAgICAgICBpbnQgICAgICBhbG1fZXJyZmxhZyA9ICAwOwogICAgI2lmIGRlZmluZWQoWUFDQ19NRU1fSEVBUCkKICAgICAgICBpbnQgICAgKiBhbG1fczsKICAgICAgICBBTE1fU1RZUEUgKiBhbG1fdjsKICAgICNlbmRpZgogICAgI2lmIGRlZmluZWQoWUFDQ19NRU1fU1RBQ0spCiAgICAgICAgaW50ICAgICAgYWxtX3NbQUxNX01BWERFUFRIKzJdOwogICAgICAgIEFMTV9TVFlQRSAgIGFsbV92W0FMTV9NQVhERVBUSCsyXTsKICAgICNlbmRpZgogICAgICAgIGludCAgICAgIGFsbV9qLCBhbG1fbTsKICAgICAgICBBTE1fU1RZUEUgKiBhbG1fcHZ0OwogICAgICAgIGludCAgICAgIGFsbV9zdGF0ZSwgKmFsbV9wcywgYWxtX247CiAgICAgICAgQUxNX1NUWVBFICogYWxtX3B2OwogICAgICAgIGNvbnN0IGludCAgICAqIGFsbV94aTsKICAgIAogICAgI2lmIGRlZmluZWQoWUFDQ19NRU1fSEVBUCkKICAgICAgICBhbG1fX21lbW9yeTxBTE1fU1RZUEU+IEFMTV9fTSAoQUxNX01BWERFUFRIKzIpOwogICAgICAgIGFsbV9fbWVtb3J5PGludCAgPiAgQUxNX19NMShBTE1fTUFYREVQVEgrMik7CiAgICAKICAgICAgICBhbG1fdiA9IEFMTV9fTS5wdHIoKTsKICAgICAgICBhbG1fcyA9IEFMTV9fTTEucHRyKCk7CiAgICAKICAgICAgICBpZiAoKGFsbV92ID09IE5VTEwpIHx8IChhbG1fcyA9PSBOVUxMKSkKICAgICAgICB7CiAgICAgICAgICAgIGFsbV9lcnJvcihhbG1fZXJyTm9NZW1vcnkpOwogICAgICAgICAgICByZXR1cm4oMSk7CiAgICAgICAgfTsKICAgICNlbmRpZgogICAgCiAgICAgICAgYWxtX3N0YXRlICAgICA9ICAwOwogICAgICAgIGFsbV9jaGFyICAgICAgPSAtMTsKICAgICAgICBhbG1fbmVycnMgICAgID0gIDA7CiAgICAgICAgYWxtX2VycmZsYWcgICA9ICAwOwogICAgICAgIGFsbV9wcyAgICAgICAgPSAmYWxtX3NbLTFdOwogICAgICAgIGFsbV9wdiAgICAgICAgPSAmYWxtX3ZbLTFdOwogICAgCiAgICBhbG1fc3RhY2s6CiAgICAgICAgaWYoICsrYWxtX3BzID4gJmFsbV9zW0FMTV9NQVhERVBUSF0gKQogICAgICAgIHsKICAgICAgICAgICAgYWxtX2Vycm9yKGFsbV9lcnJTdGFja092cik7CiAgICAgICAgICAgIHJldHVybigxKTsKICAgICAgICB9CiAgICAgICAgKmFsbV9wcyA9IGFsbV9zdGF0ZTsKICAgICAgICArK2FsbV9wdjsKICAgICAgICAqYWxtX3B2ID0gYWxtX3ZhbDsKICAgIAogICAgYWxtX25ld3N0YXRlOgogICAgICAgIGFsbV9uID0gYWxtX3BhY3RbYWxtX3N0YXRlXTsKICAgICAgICBpZiggYWxtX24gPD0gQUxNX0ZMQUcgKQogICAgICAgICAgICBnb3RvIGFsbV9kZWZhdWx0OwogICAgICAgIGlmKCBhbG1fY2hhciA8IDAgKQogICAgICAgICAgICBpZiggKGFsbV9jaGFyID0gKGludCAgKWFsbV9sZXgoYWxtX3BhcmFtLCZhbG1fbHZhbCkpIDwgMCApCiAgICAgICAgICAgICAgICBhbG1fY2hhciA9IDA7CiAgICAgICAgaWYoIChhbG1fbiArPSBhbG1fY2hhcikgPCAwIHx8IGFsbV9uID49IEFMTV9MQVNUICkKICAgICAgICAgICAgZ290byBhbG1fZGVmYXVsdDsKICAgICAgICBpZiggYWxtX2Noa1thbG1fbiA9IGFsbV9hY3RbYWxtX25dXSA9PSBhbG1fY2hhciApCiAgICAgICAgewogICAgICAgICAgICBhbG1fY2hhciAgPSAtMTsKICAgICAgICAgICAgYWxtX3ZhbCAgID0gYWxtX2x2YWw7CiAgICAgICAgICAgIGFsbV9zdGF0ZSA9IGFsbV9uOwogICAgICAgICAgICBpZiggYWxtX2VycmZsYWcgPiAwICkKICAgICAgICAgICAgICAgIC0tYWxtX2VycmZsYWc7CiAgICAgICAgICAgIGdvdG8gYWxtX3N0YWNrOwogICAgICAgIH0KICAgIAogICAgYWxtX2RlZmF1bHQ6CiAgICAKICAgICAgICBpZiggKGFsbV9uID0gYWxtX2RlZlthbG1fc3RhdGVdKSA9PSAtMiApCiAgICAgICAgewogICAgICAgICAgICBpZiggYWxtX2NoYXIgPCAwICkKICAgICAgICAgICAgICAgIGlmKCAoYWxtX2NoYXIgPSAoaW50ICApYWxtX2xleChhbG1fcGFyYW0sJmFsbV9sdmFsKSkgPCAwICkKICAgICAgICAgICAgICAgICAgICBhbG1fY2hhciA9IDA7CiAgICAgICAgICAgIGZvcihhbG1feGk9YWxtX2V4Y2E7ICgqYWxtX3hpIT0oLTEpKSB8fCAoYWxtX3hpWzFdIT1hbG1fc3RhdGUpO2FsbV94aSs9MikKICAgICAgICAgICAgICAgIDsKICAgICAgICAgICAgd2hpbGUoICooYWxtX3hpICs9IDIpID49IDAgKQogICAgICAgICAgICAgICAgaWYoICphbG1feGkgPT0gYWxtX2NoYXIgKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICBpZiggKGFsbV9uID0gYWxtX3hpWzFdKSA8IDAgKQogICAgICAgICAgICAgICAgcmV0dXJuKDApOwogICAgICAgIH0KICAgICAgICBpZiggYWxtX24gPT0gMCApCiAgICAgICAgewogICAgICAgICAgICBzd2l0Y2goIGFsbV9lcnJmbGFnICkKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgY2FzZSAwOgogICAgICAgICAgICAgICAgICAgIGFsbV9lcnJvcihhbG1fZXJyU3ludGF4KTsKICAgICAgICAgICAgICAgIGFsbV9lcnJsYWI6CiAgICAgICAgICAgICAgICAgICAgKythbG1fbmVycnM7CiAgICAgICAgICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgICAgICBjYXNlIDI6CiAgICAgICAgICAgICAgICAgICAgYWxtX2VycmZsYWcgPSAzOwogICAgICAgICAgICAgICAgICAgIHdoaWxlICggYWxtX3BzID49IGFsbV9zICkKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIGFsbV9uID0gYWxtX3BhY3RbKmFsbV9wc10gKyBBTE1fRVJSQ09ERTsKICAgICAgICAgICAgICAgICAgICAgICAgaWYoIGFsbV9uID49IDAgJiYgYWxtX24gPCBBTE1fTEFTVCAmJgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWxtX2Noa1thbG1fYWN0W2FsbV9uXV0gPT0gQUxNX0VSUkNPREUgKQogICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBhbG1fc3RhdGUgPSBhbG1fYWN0W2FsbV9uXTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdvdG8gYWxtX3N0YWNrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIGFsbV9uID0gYWxtX3BhY3RbKmFsbV9wc107CiAgICAgICAgICAgICAgICAgICAgICAgIC0tYWxtX3BzOwogICAgICAgICAgICAgICAgICAgICAgICAtLWFsbV9wdjsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBhbG1fYWJvcnQ6CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuKDEpOwogICAgICAgICAgICAgICAgY2FzZSAzOgogICAgICAgICAgICAgICAgICAgIGlmKCBhbG1fY2hhciA9PSAwICkKICAgICAgICAgICAgICAgICAgICAgICAgZ290byBhbG1fYWJvcnQ7CiAgICAgICAgICAgICAgICAgICAgYWxtX2NoYXIgPSAtMTsKICAgICAgICAgICAgICAgICAgICBnb3RvIGFsbV9uZXdzdGF0ZTsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICBhbG1fcHMgLT0gYWxtX3IyW2FsbV9uXTsKICAgICAgICBhbG1fcHZ0ID0gYWxtX3B2OwogICAgICAgIGFsbV9wdiAtPSBhbG1fcjJbYWxtX25dOwogICAgICAgIGFsbV92YWwgPSBhbG1fcHZbMV07CiAgICAgICAgYWxtX20gICA9IGFsbV9uOwogICAgICAgIGFsbV9uICAgPSBhbG1fcjFbYWxtX25dOwogICAgICAgIGFsbV9qICAgPSBhbG1fcGdvW2FsbV9uXSArICphbG1fcHMgKyAxOwogICAgICAgIGlmKCBhbG1faiA+PSBBTE1fTEFTVCB8fCBhbG1fY2hrW2FsbV9zdGF0ZSA9IGFsbV9hY3RbYWxtX2pdXSAhPSAtYWxtX24gKQogICAgICAgICAgICBhbG1fc3RhdGUgPSBhbG1fYWN0W2FsbV9wZ29bYWxtX25dXTsKICAgICAgICBzd2l0Y2goYWxtX20pCiAgICAgICAgewogICAgCiAgICAgICAgICAgICAgICAKICAgIGNhc2UgMTp7CiAgICAgICAgICAgICAgICAgICByZXR1cm4gYWxtX3B2dFstMF0gPyAwIDogLTE7CiAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICBjYXNlIDI6ewogICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgY2FzZSAzOnsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSBhbG1fcHZ0Wy0wXTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgNDp7CiAgICAgICAgICAgICAgICAgICBhbG1fdmFsID0gYWxtX3B2dFstMV07CiAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICBjYXNlIDU6ewogICAgICAgICAgICAgICAgICAgaWYgKGFsbV9wdnRbLTBdID09IDApIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSBhbG1fcHZ0Wy0yXSAmJiBhbG1fcHZ0Wy0wXTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgNjp7CiAgICAgICAgICAgICAgICAgICBpZiAoYWxtX3B2dFstMF0gPT0gMCkgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgYWxtX3ZhbCA9IGFsbV9wdnRbLTBdOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgY2FzZSA3OnsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSAoYWxtX3B2dFstMl0gPT0gYWxtX3B2dFstMF0pID8gMSA6IDA7CiAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICBjYXNlIDg6ewogICAgICAgICAgICAgICAgICAgYWxtX3ZhbCA9IChhbG1fcHZ0Wy0wXSA9PSAwKSA/IDEgOiAwOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgY2FzZSA5OnsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSBhbG1fcHZ0Wy0yXSArIGFsbV9wdnRbLTBdOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgY2FzZSAxMDp7CiAgICAgICAgICAgICAgICAgICBhbG1fdmFsID0gYWxtX3B2dFstMl0gLSBhbG1fcHZ0Wy0wXTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgMTE6ewogICAgICAgICAgICAgICAgICAgYWxtX3ZhbCA9IC1hbG1fcHZ0Wy0wXTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgMTI6ewogICAgICAgICAgICAgICAgICAgYWxtX3ZhbCA9IGFsbV9wdnRbLTBdOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgY2FzZSAxMzp7CiAgICAgICAgICAgICAgICAgICBhbG1fdmFsID0gYWxtX3B2dFstMl0gKiBhbG1fcHZ0Wy0wXTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgMTQ6ewogICAgICAgICAgICAgICAgICAgaWYgKGFsbV9wdnRbLTBdIDwgMCkgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgYWxtX3ZhbCA9IDE7CiAgICAgICAgICAgICAgICAgICBmb3IoaW50IGkgPSAwOyBpIDwgYWxtX3B2dFstMF07ICsraSkgYWxtX3ZhbCAqPSBhbG1fcHZ0Wy0yXTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgMTU6ewogICAgICAgICAgICAgICAgICAgaWYgKGFsbV9wdnRbLTBdID09IDApIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSBhbG1fcHZ0Wy0yXSAvIGFsbV9wdnRbLTBdOwogICAgICAgICAgICAgICAgICAgaWYgKGFsbV92YWwqYWxtX3B2dFstMF0gIT0gYWxtX3B2dFstMl0pIHJldHVybiAtMTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgMTY6ewogICAgICAgICAgICAgICAgICAgaWYgKGFsbV9wdnRbLTFdIDwgMCkgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgaWYgKGFsbV9wdnRbLTFdID49MjApIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSBmYWN0KGFsbV9wdnRbLTFdKTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgMTc6ewogICAgICAgICAgICAgICAgICAgaWYgKGFsbV9wdnRbLTFdIDwgMCkgcmV0dXJuIC0xOwogICAgICAgICAgICAgICAgICAgaWYgKGFsbV9wdnRbLTFdID49MzMpIHJldHVybiAtMTsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSBiaWZhY3QoYWxtX3B2dFstMV0pOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgY2FzZSAxODp7CiAgICAgICAgICAgICAgICAgICBpZiAoYWxtX3B2dFstMV0gPCAwKSByZXR1cm4gLTE7CiAgICAgICAgICAgICAgICAgICBhbG1fdmFsID0gaXNxcnQoYWxtX3B2dFstMF0pOwogICAgICAgICAgICAgICAgICAgaWYgKGFsbV92YWwqYWxtX3ZhbCAhPSBhbG1fcHZ0Wy0wXSkgcmV0dXJuIC0xOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgY2FzZSAxOTp7CiAgICAgICAgICAgICAgICAgICBhbG1fdmFsID0gYWxtX3B2dFstMV07CiAgICAgICAgICAgICAgIH0gYnJlYWs7CiAgICBjYXNlIDIwOnsKICAgICAgICAgICAgICAgICAgIGFsbV92YWwgPSBhbG1fcHZ0Wy0wXTsKICAgICAgICAgICAgICAgfSBicmVhazsKICAgIGNhc2UgMjE6ewogICAgICAgICAgICAgICAgICAgcmV0dXJuIC0xOwogICAgICAgICAgICAgICB9IGJyZWFrOwogICAgCiAgICAgICAgfQogICAgICAgIGdvdG8gYWxtX3N0YWNrOwogICAgfQo=