/*
Author: Ishmeet Dosanjh
Date of Created: 1/12/17
Version: 0.1
*/
#pragma comment(linker, "/stack:20000000")
#pragma GCC optimize("Ofast")
#pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx,avx,tune=native")
#define _CRT_SECURE_NO_WARNINGS
#include <climits>
# include <iostream>
# include <cmath>
# include <algorithm>
# include <stdio.h>
# include <cstdint>
# include <cstring>
# include <string>
# include <cstdlib>
# include <vector>
# include <bitset>
# include <map>
# include <queue>
# include <ctime>
# include <stack>
# include <set>
# include <list>
# include <random>
# include <deque>
# include <functional>
# include <iomanip>
# include <sstream>
# include <fstream>
# include <complex>
# include <numeric>
# include <immintrin.h>
# include <cassert>
# include <array>
# include <tuple>
// #include <unordered_set> i ngcc 6.6
using namespace std;
// Let's define unordered map
# ifdef __GNUC__
# if __cplusplus > 199711L
# include <unordered_set>
# include <unordered_map>
# else
# include <tr1/unordered_map>
# include <tr1/unordered_set>
using namespace tr1;
# endif
# else
# include <unordered_map>
# include <unordered_set>
# endif
#define VA_NUM_ARGS(...) VA_NUM_ARGS_IMPL_((0,__VA_ARGS__, 6,5,4,3,2,1))
#define VA_NUM_ARGS_IMPL_(tuple) VA_NUM_ARGS_IMPL tuple
#define VA_NUM_ARGS_IMPL(_0,_1,_2,_3,_4,_5,_6,N,...) N
#define macro_dispatcher(macro, ...) macro_dispatcher_(macro, VA_NUM_ARGS(__VA_ARGS__))
#define macro_dispatcher_(macro, nargs) macro_dispatcher__(macro, nargs)
#define macro_dispatcher__(macro, nargs) macro_dispatcher___(macro, nargs)
#define macro_dispatcher___(macro, nargs) macro ## nargs
#define DBN1(a) cerr<<#a<<"="<<(a)<<"\n"
#define DBN2(a,b) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<"\n"
#define DBN3(a,b,c) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<"\n"
#define DBN4(a,b,c,d) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<"\n"
#define DBN5(a,b,c,d,e) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<", "<<#e<<"="<<(e)<<"\n"
#define DBN6(a,b,c,d,e,f) cerr<<#a<<"="<<(a)<<", "<<#b<<"="<<(b)<<", "<<#c<<"="<<(c)<<", "<<#d<<"="<<(d)<<", "<<#e<<"="<<(e)<<", "<<#f<<"="<<(f)<<"\n"
#define DBN(...) macro_dispatcher(DBN, __VA_ARGS__)(__VA_ARGS__)
#define DA(a,n) cerr<<#a<<"=["; printarray(a,n); cerr<<"]\n"
#define DAR(a,n,s) cerr<<#a<<"["<<s<<"-"<<n-1<<"]=["; printarray(a,n,s); cerr<<"]\n"
#ifdef _MSC_VER
#define PREFETCH(ptr, rw, level) ((void)0)
#else
#define PREFETCH(ptr, rw, level) __builtin_prefetch(ptr, rw, level)
#endif
#ifdef LOCAL
#define CURTIME() cerr << clock() * 1.0 / CLOCKS_PER_SEC << endl
#else
#define CURTIME()
#endif
#define pb push_back
#define mp make_pair
typedef long long ll;
typedef unsigned int uint;
typedef unsigned long long ull;
typedef double d;
typedef float f;
typedef pair< int , int > pii;
typedef pair< long long , long long > pll;
typedef vector< int > vi;
typedef vector< long long > vll;
typedef int itn;
typedef long l;
/***************************************************************/
// TEMPLATE DECLARATIONS
template < class T1, class T2, class T3>
struct triple{ T1 a; T2 b; T3 c; triple( ) : a( T1( ) ) , b( T2( ) ) , c( T3( ) ) { } ; triple( T1 _a, T2 _b, T3 _c) : a( _a) , b( _b) , c( _c) { } } ;
template < class T1, class T2, class T3>
bool operator< ( const triple< T1,T2,T3> & t1,const triple< T1,T2,T3> & t2) { if ( t1.a ! = t2.a ) return t1.a < t2.a ; else if ( t1.b ! = t2.b ) return t1.b < t2.b ; else return t1.c < t2.c ; }
template < class T1, class T2, class T3>
bool operator> ( const triple< T1,T2,T3> & t1,const triple< T1,T2,T3> & t2) { if ( t1.a ! = t2.a ) return t1.a > t2.a ; else if ( t1.b ! = t2.b ) return t1.b > t2.b ; else return t1.c > t2.c ; }
#define tri triple<int,int,int>
#define trll triple<ll,ll,ll>
//for 1 based arrays
#define FI2(n) for(int i=1;i<=(n);++i)
#define FJ2(n) for(int j=1;j<=(n);++j)
#define FK2(n) for(int k=1;k<=(n);++k)
//for 0 based indexed arrays
#define FI(n) for(long i=0;i<(n);i++)
#define FJ(n) for(long long j=0;j<(n);j++)
#define FK(n) for(int k=0;k<(n);++k)
#define FL(n) for(int l=0;l<(n);++l)
#define FQ(n) for(int q=0;q<(n);++q)
#define FOR(i,a,b) for(int i = (a), __e = (int) (b); i < __e; ++i)
#define all(a) std::begin(a), std::end(a)
#define reunique(v) v.resize(std::unique(v.begin(), v.end()) - v.begin())
#define sqr(x) ((x) * (x))
#define sqrt(x) sqrt(1.0 * (x))
#define pow(x, n) pow(1.0 * (x), n)
#define COMPARE(obj) [&](const std::decay_t<decltype(obj)>& a, const std::decay_t<decltype(obj)>& b)
#define COMPARE_BY(obj, field) [&](const std::decay_t<decltype(obj)>& a, const std::decay_t<decltype(obj)>& b) { return a.field < b.field; }
#define checkbit(n, b) (((n) >> (b)) & 1)
#define setbit(n, b) ((n) | (static_cast<std::decay_t<decltype(n)>>(1) << (b)))
#define removebit(n, b) ((n) & ~(static_cast<std::decay_t<decltype(n)>>(1) << (b)))
#define flipbit(n, b) ((n) ^ (static_cast<std::decay_t<decltype(n)>>(1) << (b)))
inline int countBits( uint v) { v= v- ( ( v>> 1 ) & 0x55555555 ) ; v= ( v& 0x33333333 ) + ( ( v>> 2 ) & 0x33333333 ) ; return ( ( v+ ( v>> 4 ) & 0xF0F0F0F ) * 0x1010101 ) >> 24 ; }
inline int countBits( ull v) { uint t= v>> 32 ; uint p= ( v & ( ( 1ULL << 32 ) - 1 ) ) ; return countBits( t) + countBits( p) ; }
inline int countBits( ll v) { return countBits( ( ull) v) ; }
inline int countBits( int v) { return countBits( ( uint) v) ; }
unsigned int reverseBits( uint x) { x = ( ( ( x & 0xaaaaaaaa ) >> 1 ) | ( ( x & 0x55555555 ) << 1 ) ) ; x = ( ( ( x & 0xcccccccc ) >> 2 ) | ( ( x & 0x33333333 ) << 2 ) ) ; x = ( ( ( x & 0xf0f0f0f0 ) >> 4 ) | ( ( x & 0x0f0f0f0f ) << 4 ) ) ; x = ( ( ( x & 0xff00ff00 ) >> 8 ) | ( ( x & 0x00ff00ff ) << 8 ) ) ; return ( ( x >> 16 ) | ( x << 16 ) ) ; }
template < class T> inline int sign( T x) { return x > 0 ? 1 : x < 0 ? - 1 : 0 ; }
inline bool isPowerOfTwo( int x) { return ( x ! = 0 && ( x& ( x - 1 ) ) == 0 ) ; }
constexpr ll power( ll x, int p) { return p == 0 ? 1 : ( x * power( x, p - 1 ) ) ; }
template < class T1, class T2, class T3> T1 inline clamp( T1 x, const T2& a, const T3& b) { if ( x < a) return a; else if ( x > b) return b; else return x; }
unsigned long long rdtsc( ) { unsigned long long ret = 0 ;
#ifdef __clang__
return __builtin_readcyclecounter( ) ;
#endif
#ifndef _MSC_VER
asm volatile ( "rdtsc" : "=A" ( ret) : : ) ;
#endif
return ret; }
// Fast IO ********************************************************************************************************
const int __BS = 4096 ;
static char __bur[ __BS + 16 ] , * __er = __bur + __BS, * __ir = __er;
template < class T = int > T readInt( ) {
auto c = [ & ] ( ) { if ( __ir == __er) std:: fill ( __bur, __bur + __BS, 0 ) , cin .read ( __bur, __BS) , __ir = __bur; } ;
c( ) ; while ( * __ir && ( * __ir < '0' || * __ir > '9' ) && * __ir ! = '-' ) ++ __ir; c( ) ;
bool m = false ; if ( * __ir == '-' ) ++ __ir, c( ) , m = true ;
T r = 0 ; while ( * __ir >= '0' && * __ir <= '9' ) r = r * 10 + * __ir - '0' , ++ __ir, c( ) ;
++ __ir; return m ? - r : r;
}
static char __buw[ __BS + 20 ] , * __iw = __buw, * __ew = __buw + __BS;
template < class T>
void writeInt( T x, char endc = '\n ' ) {
if ( x < 0 ) * __iw++ = '-' , x = - x; if ( x == 0 ) * __iw++ = '0' ;
char * s = __iw;
while ( x) { T t = x / 10 ; char c = x - 10 * t + '0' ; * __iw++ = c; x = t; }
char * f = __iw - 1 ; while ( s < f) swap( * s, * f) , ++ s, -- f;
if ( __iw > __ew) cout .write ( __buw, __iw - __buw) , __iw = __buw;
* __iw++ = endc;
}
template < class T>
void writeStr( const T& str) {
int i = 0 ; while ( str[ i] ) { * __iw++ = str[ i++ ] ; if ( __iw > __ew) cout .write ( __buw, __iw - __buw) , __iw = __buw; }
}
struct __FL__ { ~__FL__( ) { if ( __iw ! = __buw) cout .write ( __buw, __iw - __buw) ; } } ;
static __FL__ __flushVar__;
//STL output *****************************************************************************************************
#define TT1 template<class T>
#define TT1T2 template<class T1, class T2>
#define TT1T2T3 template<class T1, class T2, class T3>
TT1T2 ostream& operator << ( ostream& os, const pair< T1, T2> & p) ;
TT1 ostream& operator << ( ostream& os, const vector< T> & v) ;
TT1T2 ostream& operator << ( ostream& os, const set< T1, T2> & v) ;
TT1T2 ostream& operator << ( ostream& os, const multiset< T1, T2> & v) ;
TT1T2 ostream& operator << ( ostream& os, priority_queue< T1, T2> v) ;
TT1T2T3 ostream& operator << ( ostream& os, const map< T1, T2, T3> & v) ;
TT1T2T3 ostream& operator << ( ostream& os, const multimap< T1, T2, T3> & v) ;
TT1T2T3 ostream& operator << ( ostream& os, const triple< T1, T2, T3> & t) ;
template < class T, size_t N> ostream& operator << ( ostream& os, const array< T, N> & v) ;
TT1T2 ostream& operator << ( ostream& os, const pair< T1, T2> & p) { return os << "(" << p.first << ", " << p.second << ")" ; }
TT1 ostream& operator << ( ostream& os, const vector< T> & v) { bool f= 1 ; os<< "[" ; for ( auto & i : v) { if ( ! f) os << ", " ; os<< i; f= 0 ; } return os << "]" ; }
template < class T, size_t N> ostream& operator << ( ostream& os, const array< T, N> & v) { bool f= 1 ; os<< "[" ; for ( auto & i : v) { if ( ! f) os << ", " ; os<< i; f= 0 ; } return os << "]" ; }
TT1T2 ostream& operator << ( ostream& os, const set< T1, T2> & v) { bool f= 1 ; os<< "[" ; for ( auto & i : v) { if ( ! f) os << ", " ; os<< i; f= 0 ; } return os << "]" ; }
TT1T2 ostream& operator << ( ostream& os, const multiset< T1,T2> & v) { bool f= 1 ; os<< "[" ; for ( auto & i : v) { if ( ! f) os << ", " ; os<< i; f= 0 ; } return os << "]" ; }
TT1T2T3 ostream& operator << ( ostream& os, const map< T1,T2,T3> & v) { bool f = 1 ; os << "[" ; for ( auto & ii : v) { if ( ! f) os << ", " ; os << "(" << ii.first << " -> " << ii.second << ") " ; f = 0 ; } return os << "]" ; }
TT1T2 ostream& operator << ( ostream& os, const multimap< T1, T2> & v) { bool f = 1 ; os << "[" ; for ( auto & ii : v) { if ( ! f) os << ", " ; os << "(" << ii.first << " -> " << ii.second << ") " ; f = 0 ; } return os << "]" ; }
TT1T2 ostream& operator << ( ostream& os, priority_queue< T1, T2> v) { bool f = 1 ; os << "[" ; while ( ! v.empty ( ) ) { auto x = v.top ( ) ; v.pop ( ) ; if ( ! f) os << ", " ; f = 0 ; os << x; } return os << "]" ; }
TT1T2T3 ostream& operator << ( ostream& os, const triple< T1, T2, T3> & t) { return os << "(" << t.a << ", " << t.b << ", " << t.c << ")" ; }
TT1T2 void printarray( const T1& a, T2 sz, T2 beg = 0 ) { for ( T2 i = beg; i< sz; i++ ) cout << a[ i] << " " ; cout << endl; }
//STL input *****************************************************************************************************
TT1T2T3 inline istream& operator >> ( istream& os, triple< T1, T2, T3> & t) ;
TT1T2 inline istream& operator >> ( istream& os, pair< T1, T2> & p) { return os >> p.first >> p.second ; }
TT1 inline istream& operator >> ( istream& os, vector< T> & v) {
if ( v.size ( ) ) for ( T& t : v) os >> t; else {
string s; T obj; while ( s.empty ( ) ) { getline( os, s) ; if ( ! os) return os; }
stringstream ss( s) ; while ( ss >> obj) v.push_back ( obj) ;
}
return os;
}
TT1T2T3 inline istream& operator >> ( istream& os, triple< T1, T2, T3> & t) { return os >> t.a >> t.b >> t.c ; }
//Pair magic *****************************************************************************************************
#define PT1T2 pair<T1, T2>
TT1T2 inline PT1T2 operator+ ( const PT1T2 & p1 , const PT1T2 & p2) { return PT1T2( p1.first + p2.first , p1.second + p2.second ) ; }
TT1T2 inline PT1T2& operator+ = ( PT1T2 & p1 , const PT1T2 & p2) { p1.first + = p2.first , p1.second + = p2.second ; return p1; }
TT1T2 inline PT1T2 operator- ( const PT1T2 & p1 , const PT1T2 & p2) { return PT1T2( p1.first - p2.first , p1.second - p2.second ) ; }
TT1T2 inline PT1T2& operator- = ( PT1T2 & p1 , const PT1T2 & p2) { p1.first - = p2.first , p1.second - = p2.second ; return p1; }
#undef TT1
#undef TT1T2
#undef TT1T2T3
#define FREIN(FILE) freopen(FILE, "rt", stdin)
#define FREOUT(FILE) freopen(FILE, "wt", stdout)
#ifdef LOCAL
#define BEGIN_PROFILE(idx, name) int profileIdx = idx; profileName[profileIdx] = name; totalTime[profileIdx] -= rdtsc() / 1e3;
#define END_PROFILE totalTime[profileIdx] += rdtsc() / 1e3; totalCount[profileIdx]++;
#else
#define BEGIN_PROFILE(idx, name)
#define END_PROFILE
#endif
template < class T> inline void normmod( T & x, T m) { x % = m; if ( x < 0 ) x + = m; }
template < class T1, class T2> inline T2 summodfast( T1 x, T1 y, T2 m) { T2 res = x + y; if ( res >= m) res - = m; return res; }
template < class T1, class T2, class T3> inline void addmodfast( T1 & x, T2 y, T3 m) { x + = y; if ( x >= m) x - = m; }
template < class T1, class T2, class T3> inline void submodfast( T1 & x, T2 y, T3 m) { x - = y; if ( x < 0 ) x + = m; }
#if INTPTR_MAX == INT32_MAX or !defined(__SIZEOF_INT128__)
inline ll mulmod( ll x, ll n, ll m) { ll r = 0 ; normmod( x, m) ; normmod( n, m) ; while ( n) { if ( n & 1 ) r + = x; x + = x; if ( r >= m) r - = m; if ( x >= m) x - = m; n / = 2 ; } return r; }
#else
using int128 = __int128;
inline ll mulmod( ll x, ll n, ll m) { return __int128( x) * n % m; }
#endif
inline ll powmod( ll x, ll n, ll m) { ll r = 1 ; normmod( x, m) ; while ( n) { if ( n & 1 ) r = ( r* x) % m; x = ( x* x) % m; n / = 2 ; } return r; }
inline ll powmulmod( ll x, ll n, ll m) { ll res = 1 ; normmod( x, m) ; while ( n) { if ( n & 1 ) res = mulmod( res, x, m) ; x = mulmod( x, x, m) ; n / = 2 ; } return res; }
template < class T> inline T gcd( T a, T b) { while ( b) { a % = b; T t = a; a = b; b = t; } return a; }
inline ll lcm( ll a, ll b) { return a / gcd( a, b) * b; }
template < class T> inline T gcd( T a, T b, T c) { return gcd( gcd( a, b) , c) ; }
ll gcdex( ll a, ll b, ll& x, ll& y) {
if ( ! a) { x = 0 ; y = 1 ; return b; }
ll y1; ll d = gcdex( b % a, a, y, y1) ; x = y1 - ( b / a) * y;
return d;
}
template < class T> bool isPrime( T x) { if ( x <= 4 || x % 2 == 0 || x % 3 == 0 ) return x == 2 || x == 3 ;
for ( T i = 5 ; i * i <= x; i + = 6 ) if ( x % i == 0 || x % ( i + 2 ) == 0 ) return 0 ; return 1 ; }
bool millerRabin( long long n) {
if ( n <= 1000 ) return isPrime( n) ;
long long s = n - 1 ; int t = 0 ; while ( s % 2 == 0 ) s / = 2 , ++ t;
for ( int a : { 2 , 325 , 9375 , 28178 , 450775 , 9780504 , 1795265022 } ) { if ( ! ( a % = n) ) return true ;
long long f = powmulmod( a, s, n) ; if ( f == 1 || f == n - 1 ) continue ;
for ( int i = 1 ; i < t; ++ i) if ( ( f = mulmod( f, f, n) ) == n - 1 ) goto nextp;
return false ; nextp:;
} return true ;
}
//some modulus and gcd type functions
const int mod = 1e9 + 7 ;
ll powmod( ll a,ll b) { ll res= 1 ; if ( a>= mod) a% = mod; for ( ; b; b>>= 1 ) { if ( b& 1 ) res= res* a; if ( res>= mod) res% = mod; a= a* a; if ( a>= mod) a% = mod; } return res; }
ll gcd( ll a , ll b) { return a== 0 ? b: gcd( b% a,a) ; }
// Useful constants
int some_primes[ 7 ] = { 24443 , 100271 , 1000003 , 1000333 , 5000321 , 98765431 , 1000000123 } ;
#define T9 1000000000
#define T18 1000000000000000000LL
#define INF 1011111111
#define LLINF 1000111000111000111LL
#define EPS (double)1e-10
#define PI 3.14159265358979323846264
#define link asaxlajrewqwe
#define rank wahayawehasdakw
// modulo
#define mod %
#define NUM 1000000007
#define NUM1 1000000009
//scanf type macros
#define s(n) scanf("%d", &n)
#define sl(n) scanf("%ld", &n)
#define sl3(n1,n2,n3) scanf("%lld %lld %lld ", &n1, &n2, &n3)
#define sl4(n1,n2,n3,n4) scanf("%ld %ld %ld %ld", &n1, &n2, &n3, &n4)
#define sll(n) scanf("%I64d", &n)
#define sll2(n) scanf("%lld", &n)
//printf type macros
#define p(n) printf("%d\n", n)
#define pl(n) printf("%ld\n",n)
#define pl3(n1,n2,n3) printf("%lld %lld %lld\n ", n1, n2, n3)
#define pl4(n1,n2,n3,n4) printf("%ld %ld %ld %ld\n ", n1, n2, n3, n4)
#define pll(n) printf("%I64d\n",n)
#define pll2(n) printf("%lld\n",n)
//*************************************************************************************
int32_t solve( ) ;
// C function for extended Euclidean Algorithm
ll gcdExtended( ll a, ll b, ll * x, ll * y) ;
// Function to find modulo inverse of a
ll modInverse( ll a, ll m)
{
ll x, y;
ll g = gcdExtended( a, m, & x, & y) ;
if ( g ! = 1 ) { }
// cout << "Inverse doesn't exist";
else
{
// m is added to handle negative x
ll res = ( x% m + m) % m;
// cout << "Modular multiplicative inverse is " <<
return res;
}
}
// C function for extended Euclidean Algorithm
ll gcdExtended( ll a, ll b, ll * x, ll * y)
{
// Base Case
if ( a == 0 )
{
* x = 0 , * y = 1 ;
return b;
}
ll x1, y1; // To store results of recursive call
ll gcd = gcdExtended( b% a, a, & x1, & y1) ;
// Update x and y using results of recursive
// call
* x = y1 - ( b/ a) * x1;
* y = x1;
return gcd;
}
int32_t main( int argc, char ** argv) {
ios_base:: sync_with_stdio ( 0 ) ; cin .tie ( 0 ) ;
#ifdef LOCAL
FREIN( "input.txt" ) ;
// FREOUT("out.txt");
#endif
return solve( ) ;
}
//red blue ok but i hate palindromes
int32_t solve( ) {
int t; l jspecial,n,j,q,qi,Li,Ri,prevli,prevri,i; //qi is the query iterator here
ll p,x;
s( t) ;
while ( t-- ) {
x= 0 ;
sl( n) ,sll2( p) ,sl( q) ;
ll ppA[ n] ; //prefix product array
ll A[ n] ,prod= 1 ;
FI( n) { sll2( A[ i] ) ; prod= ( prod* A[ i] ) % p,ppA[ i] = prod; }
//for 2 d matrix storing
// for (i = 0; i < n; i++) {
// /* code */
// prod=A[i]%p;
// ppA[i][i]=(prod%p);
// for (j = i+1; j < n; j++) {
// /* code */
// prod=(prod%p*A[j]%p)%p;
// ppA[i][j]=(prod)%p;
// }
// prod=1;
// }
// for (i = 0; i < n; i++) {
// /* code */
for ( j = 0 ; j < n; j++ ) {
/* code */
cout << ppA[ j] << " " ;
}
cout << "\n " ;
// }
l B[ ( ll) floor ( ( double ) q/ ( double ) 64 ) + 2 ] ;
FJ( sizeof ( B) / sizeof ( B[ 0 ] ) ) sl( B[ j] ) ;
// ll sqrtdecompose[(l)ceil(sqrt(n))];
// builddecompostion(A,p,n,sqrtdecompose);
// precomputing(A,n,p);
// l colsize=(l)floor(log(n));
// ll lookup[n][colsize];
//sparse table approach preprocessing O(nlogn) query O(1)
// for (i = 0; i < n; i++) lookup[i][0]=A[i];
// for (j = 1; (1<<j)<= n; j++)//till logn
// /* code */
// for (i = 0; i <= n-(1<<j); i++) {
// /* code */
// //range 2 ki power hai ya nhi it is an part of an query
// lookup[i][j]=((lookup[i][j-1]%p)*((lookup[i+(1<<(j-1))][j-1])%p))%p;
// }
// } //lookup matrix for all possible subarrays of length pow(2,j) for all possible values of j as 0,1,2,3,4,5 up till log(n)
//taran rakha
for ( qi= 0 ; qi< ( q) ; qi++ ) {
if ( qi% 64 == 0 ) //here always first it will executes
{
if ( qi== 0 ) x= 0 ;
Li = ( B[ qi/ 64 ] + x) % n, Ri = ( B[ ( qi/ 64 ) + 1 ] + x) % n;
}
else { Li = ( prevli + x) % n, Ri = ( prevri + x) % n; }
if ( Li> Ri) swap( Li,Ri) ; //O(1) time operation
// x=(lookup[Li][Ri]+1)%p;
//(ans(Li,Ri,A,p,n,sqrtdecompose)
// jspecial=(l)log2(Ri-Li+1);
// if(jspecial%2==0) {x=(lookup[Li][jspecial]+1)%p;}
// else {
// x=(((lookup[Li][jspecial]+lookup[R-(1<<(jspecial))+1][jspecial])/2)+1)%p;
// }
// if(ppA[Li]!=0)
// x=((((ppA[Ri])/ppA[Li-1]))+1)%p;
// std::cout << ppA[Li][Ri-Li] << std::endl;
// <--- @taran check from here --->
x= ( ( ( ppA[ Ri] ) * ( modInverse( ppA[ Li- 1 ] ,p) ) ) % p+ 1 ) % p;
// else
prevli= Li,prevri= Ri;
}
pll2( x% p) ;
}
return 0 ;
}
//sq root decompostion tehcnique used
// #define MAX 1000000
// ll lookup[MAX][MAX];
// void builddecompostion(ll A[],ll p,l n,ll sqrtdecompose[]){
// l blocksize=(l)ceil(sqrt(n));
// l decomposeitera=0;
// ll prod=1;
// for (l i = 0; i < n; i++) {
// /* code */
// prod=((prod*A[i]));
// if(i+1%blocksize==0) {
// sqrtdecompose[decomposeitera++]=prod;
// prod=1;
// }
// }
// }
// ll ans(l Li,l Ri,ll A[],ll p,l n,ll sqrtdecompose[]){
// l blocksize=(l)ceil(sqrt(n));
// // int blockno=Li/blocksize;
// ll prod=1;
// //case 1 starting case handle alsos true when itis not overlapping any block completely
// while(Li%blocksize!=0&&Li<=Ri){
// prod=((prod)*A[Li])%p;//add %p here
// Li++;
// }
// // prod%=p; case 2 for complete overlapping
// while(Li+blocksize<=Ri){
// prod=((prod)*((sqrtdecompose[Li/blocksize])))%p;
// Li+=blocksize;
// }
// // case3 remainig n unoverlapped elements
// while(Li<=Ri) {
// prod=((prod)*(A[Li]))%p;Li++;//add %p here
// }
// return prod;
// }
// 1 approach of the precomputing with theu se of an GLOBAL LOOKUP MATRIX OF SIZE MAX MAX...
// void precomputing(ll A[],l n,ll p){
// l i;
// for (l j= 0; j < (l)log(n); ++j)
// {
// i=0;
// /* code */
// while(i<n)
// {
// /* code */
// if(j==0) lookup[i][j]=i;
// else {
// lookup[i][j]=((lookup[i][j-1]%p)*(lookup[i + (1<<(j-1))][j-1])%p)%p;
// }
// i++;
// }
// }
// }
ICAgIC8qCiAgICBBdXRob3I6IElzaG1lZXQgRG9zYW5qaAogICAgRGF0ZSBvZiBDcmVhdGVkOiAxLzEyLzE3CiAgICBWZXJzaW9uOiAwLjEgCiAgICAqLwogICAgIAogICAgI3ByYWdtYSBjb21tZW50KGxpbmtlciwgIi9zdGFjazoyMDAwMDAwMCIpCiAgICAjcHJhZ21hIEdDQyBvcHRpbWl6ZSgiT2Zhc3QiKQogICAgI3ByYWdtYSBHQ0MgdGFyZ2V0KCJzc2Usc3NlMixzc2UzLHNzc2UzLHNzZTQscG9wY250LGFibSxtbXgsYXZ4LHR1bmU9bmF0aXZlIikKICAgICAKICAgICNkZWZpbmUgX0NSVF9TRUNVUkVfTk9fV0FSTklOR1MKICAgICNpbmNsdWRlICA8Y2xpbWl0cz4KICAgICMgaW5jbHVkZSA8aW9zdHJlYW0+CiAgICAjIGluY2x1ZGUgPGNtYXRoPgogICAgIyBpbmNsdWRlIDxhbGdvcml0aG0+CiAgICAjIGluY2x1ZGUgPHN0ZGlvLmg+CiAgICAjIGluY2x1ZGUgPGNzdGRpbnQ+CiAgICAjIGluY2x1ZGUgPGNzdHJpbmc+CiAgICAjIGluY2x1ZGUgPHN0cmluZz4KICAgICMgaW5jbHVkZSA8Y3N0ZGxpYj4KICAgICMgaW5jbHVkZSA8dmVjdG9yPgogICAgIyBpbmNsdWRlIDxiaXRzZXQ+CiAgICAjIGluY2x1ZGUgPG1hcD4KICAgICMgaW5jbHVkZSA8cXVldWU+CiAgICAjIGluY2x1ZGUgPGN0aW1lPgogICAgIyBpbmNsdWRlIDxzdGFjaz4KICAgICMgaW5jbHVkZSA8c2V0PgogICAgIyBpbmNsdWRlIDxsaXN0PgogICAgIyBpbmNsdWRlIDxyYW5kb20+CiAgICAjIGluY2x1ZGUgPGRlcXVlPgogICAgIyBpbmNsdWRlIDxmdW5jdGlvbmFsPgogICAgIyBpbmNsdWRlIDxpb21hbmlwPgogICAgIyBpbmNsdWRlIDxzc3RyZWFtPgogICAgIyBpbmNsdWRlIDxmc3RyZWFtPgogICAgIyBpbmNsdWRlIDxjb21wbGV4PgogICAgIyBpbmNsdWRlIDxudW1lcmljPgogICAgIyBpbmNsdWRlIDxpbW1pbnRyaW4uaD4KICAgICMgaW5jbHVkZSA8Y2Fzc2VydD4KICAgICMgaW5jbHVkZSA8YXJyYXk+CiAgICAjIGluY2x1ZGUgPHR1cGxlPgogICAgLy8gI2luY2x1ZGUgPHVub3JkZXJlZF9zZXQ+IGkgbmdjYyA2LjYKICAgIHVzaW5nIG5hbWVzcGFjZSBzdGQ7CiAgICAgCiAgICAvLyBMZXQncyBkZWZpbmUgdW5vcmRlcmVkIG1hcAogICAgIyBpZmRlZiBfX0dOVUNfXwogICAgIyBpZiBfX2NwbHVzcGx1cyA+IDE5OTcxMUwKICAgICMgaW5jbHVkZSA8dW5vcmRlcmVkX3NldD4KICAgICMgaW5jbHVkZSA8dW5vcmRlcmVkX21hcD4KICAgICMgZWxzZQogICAgIyBpbmNsdWRlIDx0cjEvdW5vcmRlcmVkX21hcD4KICAgICMgaW5jbHVkZSA8dHIxL3Vub3JkZXJlZF9zZXQ+CiAgICB1c2luZyBuYW1lc3BhY2UgdHIxOwogICAgIyBlbmRpZgogICAgIyBlbHNlCiAgICAjIGluY2x1ZGUgPHVub3JkZXJlZF9tYXA+CiAgICAjIGluY2x1ZGUgPHVub3JkZXJlZF9zZXQ+CiAgICAjIGVuZGlmCiAgICAgCiAgICAjZGVmaW5lIFZBX05VTV9BUkdTKC4uLikgVkFfTlVNX0FSR1NfSU1QTF8oKDAsX19WQV9BUkdTX18sIDYsNSw0LDMsMiwxKSkKICAgICNkZWZpbmUgVkFfTlVNX0FSR1NfSU1QTF8odHVwbGUpIFZBX05VTV9BUkdTX0lNUEwgdHVwbGUKICAgICNkZWZpbmUgVkFfTlVNX0FSR1NfSU1QTChfMCxfMSxfMixfMyxfNCxfNSxfNixOLC4uLikgTgogICAgI2RlZmluZSBtYWNyb19kaXNwYXRjaGVyKG1hY3JvLCAuLi4pIG1hY3JvX2Rpc3BhdGNoZXJfKG1hY3JvLCBWQV9OVU1fQVJHUyhfX1ZBX0FSR1NfXykpCiAgICAjZGVmaW5lIG1hY3JvX2Rpc3BhdGNoZXJfKG1hY3JvLCBuYXJncykgbWFjcm9fZGlzcGF0Y2hlcl9fKG1hY3JvLCBuYXJncykKICAgICNkZWZpbmUgbWFjcm9fZGlzcGF0Y2hlcl9fKG1hY3JvLCBuYXJncykgbWFjcm9fZGlzcGF0Y2hlcl9fXyhtYWNybywgbmFyZ3MpCiAgICAjZGVmaW5lIG1hY3JvX2Rpc3BhdGNoZXJfX18obWFjcm8sIG5hcmdzKSBtYWNybyAjIyBuYXJncwogICAgI2RlZmluZSBEQk4xKGEpICAgICAgICAgICBjZXJyPDwjYTw8Ij0iPDwoYSk8PCJcbiIKICAgICNkZWZpbmUgREJOMihhLGIpICAgICAgICAgY2Vycjw8I2E8PCI9Ijw8KGEpPDwiLCAiPDwjYjw8Ij0iPDwoYik8PCJcbiIKICAgICNkZWZpbmUgREJOMyhhLGIsYykgICAgICAgY2Vycjw8I2E8PCI9Ijw8KGEpPDwiLCAiPDwjYjw8Ij0iPDwoYik8PCIsICI8PCNjPDwiPSI8PChjKTw8IlxuIgogICAgI2RlZmluZSBEQk40KGEsYixjLGQpICAgICBjZXJyPDwjYTw8Ij0iPDwoYSk8PCIsICI8PCNiPDwiPSI8PChiKTw8IiwgIjw8I2M8PCI9Ijw8KGMpPDwiLCAiPDwjZDw8Ij0iPDwoZCk8PCJcbiIKICAgICNkZWZpbmUgREJONShhLGIsYyxkLGUpICAgY2Vycjw8I2E8PCI9Ijw8KGEpPDwiLCAiPDwjYjw8Ij0iPDwoYik8PCIsICI8PCNjPDwiPSI8PChjKTw8IiwgIjw8I2Q8PCI9Ijw8KGQpPDwiLCAiPDwjZTw8Ij0iPDwoZSk8PCJcbiIKICAgICNkZWZpbmUgREJONihhLGIsYyxkLGUsZikgY2Vycjw8I2E8PCI9Ijw8KGEpPDwiLCAiPDwjYjw8Ij0iPDwoYik8PCIsICI8PCNjPDwiPSI8PChjKTw8IiwgIjw8I2Q8PCI9Ijw8KGQpPDwiLCAiPDwjZTw8Ij0iPDwoZSk8PCIsICI8PCNmPDwiPSI8PChmKTw8IlxuIgogICAgI2RlZmluZSBEQk4oLi4uKSBtYWNyb19kaXNwYXRjaGVyKERCTiwgX19WQV9BUkdTX18pKF9fVkFfQVJHU19fKQogICAgI2RlZmluZSBEQShhLG4pIGNlcnI8PCNhPDwiPVsiOyBwcmludGFycmF5KGEsbik7IGNlcnI8PCJdXG4iCiAgICAjZGVmaW5lIERBUihhLG4scykgY2Vycjw8I2E8PCJbIjw8czw8Ii0iPDxuLTE8PCJdPVsiOyBwcmludGFycmF5KGEsbixzKTsgY2Vycjw8Il1cbiIKICAgICAKICAgICNpZmRlZiBfTVNDX1ZFUgogICAgI2RlZmluZSBQUkVGRVRDSChwdHIsIHJ3LCBsZXZlbCkgKCh2b2lkKTApCiAgICAjZWxzZQogICAgI2RlZmluZSBQUkVGRVRDSChwdHIsIHJ3LCBsZXZlbCkgX19idWlsdGluX3ByZWZldGNoKHB0ciwgcncsIGxldmVsKQogICAgI2VuZGlmCiAgICAgCiAgICAjaWZkZWYgTE9DQUwKICAgICNkZWZpbmUgQ1VSVElNRSgpIGNlcnIgPDwgY2xvY2soKSAqIDEuMCAvIENMT0NLU19QRVJfU0VDIDw8IGVuZGwKICAgICNlbHNlCiAgICAjZGVmaW5lIENVUlRJTUUoKQogICAgI2VuZGlmCiAgICAjZGVmaW5lIHBiIHB1c2hfYmFjawogICAgI2RlZmluZSBtcCBtYWtlX3BhaXIKICAgIHR5cGVkZWYgbG9uZyBsb25nIGxsOwogICAgdHlwZWRlZiB1bnNpZ25lZCBpbnQgdWludDsKICAgIHR5cGVkZWYgdW5zaWduZWQgbG9uZyBsb25nIHVsbDsKICAgIHR5cGVkZWYgZG91YmxlIGQ7CiAgICB0eXBlZGVmIGZsb2F0IGY7CiAgICB0eXBlZGVmIHBhaXI8aW50LCBpbnQ+IHBpaTsKICAgIHR5cGVkZWYgcGFpcjxsb25nIGxvbmcsIGxvbmcgbG9uZz4gcGxsOwogICAgdHlwZWRlZiB2ZWN0b3I8aW50PiB2aTsKICAgIHR5cGVkZWYgdmVjdG9yPGxvbmcgbG9uZz4gdmxsOwogICAgdHlwZWRlZiBpbnQgaXRuOwogICAgdHlwZWRlZiBsb25nIGw7CiAgICAvKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqLwogICAgLy8gVEVNUExBVEUgREVDTEFSQVRJT05TIAogICAgdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4KICAgIHN0cnVjdCB0cmlwbGV7IFQxIGE7IFQyIGI7IFQzIGM7IHRyaXBsZSgpIDogYShUMSgpKSwgYihUMigpKSwgYyhUMygpKSB7fTsgdHJpcGxlKFQxIF9hLCBUMiBfYiwgVDMgX2MpIDphKF9hKSwgYihfYiksIGMoX2Mpe30gfTsKICAgIHRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVDM+CiAgICBib29sIG9wZXJhdG9yPChjb25zdCB0cmlwbGU8VDEsVDIsVDM+JnQxLGNvbnN0IHRyaXBsZTxUMSxUMixUMz4mdDIpe2lmKHQxLmEhPXQyLmEpcmV0dXJuIHQxLmE8dDIuYTtlbHNlIGlmKHQxLmIhPXQyLmIpcmV0dXJuIHQxLmI8dDIuYjtlbHNlIHJldHVybiB0MS5jPHQyLmM7fQogICAgdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyLCBjbGFzcyBUMz4KICAgIGJvb2wgb3BlcmF0b3I+KGNvbnN0IHRyaXBsZTxUMSxUMixUMz4mdDEsY29uc3QgdHJpcGxlPFQxLFQyLFQzPiZ0Mil7aWYodDEuYSE9dDIuYSlyZXR1cm4gdDEuYT50Mi5hO2Vsc2UgaWYodDEuYiE9dDIuYilyZXR1cm4gdDEuYj50Mi5iO2Vsc2UgcmV0dXJuIHQxLmM+dDIuYzt9CiAgICAjZGVmaW5lIHRyaSB0cmlwbGU8aW50LGludCxpbnQ+CiAgICAjZGVmaW5lIHRybGwgdHJpcGxlPGxsLGxsLGxsPgogICAgIAogICAgIAogICAgLy9mb3IgMSBiYXNlZCBhcnJheXMgCiAgICAgCiAgICAjZGVmaW5lIEZJMihuKSBmb3IoaW50IGk9MTtpPD0obik7KytpKQogICAgI2RlZmluZSBGSjIobikgZm9yKGludCBqPTE7ajw9KG4pOysraikKICAgICNkZWZpbmUgRksyKG4pIGZvcihpbnQgaz0xO2s8PShuKTsrK2spCiAgICAvL2ZvciAwIGJhc2VkIGluZGV4ZWQgYXJyYXlzIAogICAgI2RlZmluZSBGSShuKSBmb3IobG9uZyBpPTA7aTwobik7aSsrKQogICAgI2RlZmluZSBGSihuKSBmb3IobG9uZyBsb25nIGo9MDtqPChuKTtqKyspCiAgICAjZGVmaW5lIEZLKG4pIGZvcihpbnQgaz0wO2s8KG4pOysraykKICAgICNkZWZpbmUgRkwobikgZm9yKGludCBsPTA7bDwobik7KytsKQogICAgI2RlZmluZSBGUShuKSBmb3IoaW50IHE9MDtxPChuKTsrK3EpCiAgICAjZGVmaW5lIEZPUihpLGEsYikgZm9yKGludCBpID0gKGEpLCBfX2UgPSAoaW50KSAoYik7IGkgPCBfX2U7ICsraSkKICAgICNkZWZpbmUgYWxsKGEpIHN0ZDo6YmVnaW4oYSksIHN0ZDo6ZW5kKGEpCiAgICAjZGVmaW5lIHJldW5pcXVlKHYpIHYucmVzaXplKHN0ZDo6dW5pcXVlKHYuYmVnaW4oKSwgdi5lbmQoKSkgLSB2LmJlZ2luKCkpCiAgICAgCiAgICAjZGVmaW5lIHNxcih4KSAoKHgpICogKHgpKQogICAgI2RlZmluZSBzcXJ0KHgpIHNxcnQoMS4wICogKHgpKQogICAgI2RlZmluZSBwb3coeCwgbikgcG93KDEuMCAqICh4KSwgbikKICAgICAKICAgICNkZWZpbmUgQ09NUEFSRShvYmopIFsmXShjb25zdCBzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUob2JqKT4mIGEsIGNvbnN0IHN0ZDo6ZGVjYXlfdDxkZWNsdHlwZShvYmopPiYgYikKICAgICNkZWZpbmUgQ09NUEFSRV9CWShvYmosIGZpZWxkKSBbJl0oY29uc3Qgc3RkOjpkZWNheV90PGRlY2x0eXBlKG9iaik+JiBhLCBjb25zdCBzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUob2JqKT4mIGIpIHsgcmV0dXJuIGEuZmllbGQgPCBiLmZpZWxkOyB9CiAgICAgCiAgICAjZGVmaW5lIGNoZWNrYml0KG4sIGIpICgoKG4pID4+IChiKSkgJiAxKQogICAgI2RlZmluZSBzZXRiaXQobiwgYikgKChuKSB8IChzdGF0aWNfY2FzdDxzdGQ6OmRlY2F5X3Q8ZGVjbHR5cGUobik+PigxKSA8PCAoYikpKQogICAgI2RlZmluZSByZW1vdmViaXQobiwgYikgKChuKSAmIH4oc3RhdGljX2Nhc3Q8c3RkOjpkZWNheV90PGRlY2x0eXBlKG4pPj4oMSkgPDwgKGIpKSkKICAgICNkZWZpbmUgZmxpcGJpdChuLCBiKSAoKG4pIF4gKHN0YXRpY19jYXN0PHN0ZDo6ZGVjYXlfdDxkZWNsdHlwZShuKT4+KDEpIDw8IChiKSkpCiAgICBpbmxpbmUgaW50IGNvdW50Qml0cyh1aW50IHYpe3Y9di0oKHY+PjEpJjB4NTU1NTU1NTUpO3Y9KHYmMHgzMzMzMzMzMykrKCh2Pj4yKSYweDMzMzMzMzMzKTtyZXR1cm4oKHYrKHY+PjQpJjB4RjBGMEYwRikqMHgxMDEwMTAxKT4+MjQ7fQogICAgaW5saW5lIGludCBjb3VudEJpdHModWxsIHYpe3VpbnQgdD12Pj4zMjt1aW50IHA9KHYgJiAoKDFVTEwgPDwgMzIpIC0gMSkpOyByZXR1cm4gY291bnRCaXRzKHQpICsgY291bnRCaXRzKHApOyB9CiAgICBpbmxpbmUgaW50IGNvdW50Qml0cyhsbCB2KXtyZXR1cm4gY291bnRCaXRzKCh1bGwpdik7IH0KICAgIGlubGluZSBpbnQgY291bnRCaXRzKGludCB2KXtyZXR1cm4gY291bnRCaXRzKCh1aW50KXYpOyB9CiAgICB1bnNpZ25lZCBpbnQgcmV2ZXJzZUJpdHModWludCB4KXsgeCA9ICgoKHggJiAweGFhYWFhYWFhKSA+PiAxKSB8ICgoeCAmIDB4NTU1NTU1NTUpIDw8IDEpKTsgeCA9ICgoKHggJiAweGNjY2NjY2NjKSA+PiAyKSB8ICgoeCAmIDB4MzMzMzMzMzMpIDw8IDIpKTsgeCA9ICgoKHggJiAweGYwZjBmMGYwKSA+PiA0KSB8ICgoeCAmIDB4MGYwZjBmMGYpIDw8IDQpKTsgeCA9ICgoKHggJiAweGZmMDBmZjAwKSA+PiA4KSB8ICgoeCAmIDB4MDBmZjAwZmYpIDw8IDgpKTsgcmV0dXJuKCh4ID4+IDE2KSB8ICh4IDw8IDE2KSk7IH0KICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBpbnQgc2lnbihUIHgpeyByZXR1cm4geCA+IDAgPyAxIDogeCA8IDAgPyAtMSA6IDA7IH0KICAgIGlubGluZSBib29sIGlzUG93ZXJPZlR3byhpbnQgeCl7IHJldHVybiAoeCAhPSAwICYmICh4Jih4IC0gMSkpID09IDApOyB9CiAgICBjb25zdGV4cHIgbGwgcG93ZXIobGwgeCwgaW50IHApIHsgcmV0dXJuIHAgPT0gMCA/IDEgOiAoeCAqIHBvd2VyKHgsIHAgLSAxKSk7IH0KICAgIHRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMiwgY2xhc3MgVDM+IFQxIGlubGluZSBjbGFtcChUMSB4LCBjb25zdCBUMiYgYSwgY29uc3QgVDMmIGIpIHsgaWYgKHggPCBhKSByZXR1cm4gYTsgZWxzZSBpZiAoeCA+IGIpIHJldHVybiBiOyBlbHNlIHJldHVybiB4OyB9CiAgICB1bnNpZ25lZCBsb25nIGxvbmcgcmR0c2MoKSB7IHVuc2lnbmVkIGxvbmcgbG9uZyByZXQgPSAwOwogICAgI2lmZGVmIF9fY2xhbmdfXwogICAgICAgIHJldHVybiBfX2J1aWx0aW5fcmVhZGN5Y2xlY291bnRlcigpOwogICAgI2VuZGlmCiAgICAjaWZuZGVmIF9NU0NfVkVSCiAgICAgICAgYXNtIHZvbGF0aWxlKCJyZHRzYyIgOiAiPUEiIChyZXQpIDogOik7CiAgICAjZW5kaWYKICAgICAgICByZXR1cm4gcmV0OyB9CiAgICAvLyBGYXN0IElPICoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqCiAgICBjb25zdCBpbnQgX19CUyA9IDQwOTY7CiAgICBzdGF0aWMgY2hhciBfX2J1cltfX0JTICsgMTZdLCAqX19lciA9IF9fYnVyICsgX19CUywgKl9faXIgPSBfX2VyOwogICAgdGVtcGxhdGU8Y2xhc3MgVCA9IGludD4gVCByZWFkSW50KCkgewogICAgICAgIGF1dG8gYyA9IFsmXSgpIHsgaWYgKF9faXIgPT0gX19lcikgc3RkOjpmaWxsKF9fYnVyLCBfX2J1ciArIF9fQlMsIDApLCBjaW4ucmVhZChfX2J1ciwgX19CUyksIF9faXIgPSBfX2J1cjsgfTsKICAgICAgICBjKCk7IHdoaWxlICgqX19pciAmJiAoKl9faXIgPCAnMCcgfHwgKl9faXIgPiAnOScpICYmICpfX2lyICE9ICctJykgKytfX2lyOyBjKCk7CiAgICAgICAgYm9vbCBtID0gZmFsc2U7IGlmICgqX19pciA9PSAnLScpICsrX19pciwgYygpLCBtID0gdHJ1ZTsKICAgICAgICBUIHIgPSAwOyB3aGlsZSAoKl9faXIgPj0gJzAnICYmICpfX2lyIDw9ICc5JykgciA9IHIgKiAxMCArICpfX2lyIC0gJzAnLCArK19faXIsIGMoKTsKICAgICAgICArK19faXI7IHJldHVybiBtID8gLXIgOiByOwogICAgfQogICAgc3RhdGljIGNoYXIgX19idXdbX19CUyArIDIwXSwgKl9faXcgPSBfX2J1dywgKl9fZXcgPSBfX2J1dyArIF9fQlM7CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPgogICAgdm9pZCB3cml0ZUludChUIHgsIGNoYXIgZW5kYyA9ICdcbicpIHsKICAgICAgICBpZiAoeCA8IDApICpfX2l3KysgPSAnLScsIHggPSAteDsgaWYgKHggPT0gMCkgKl9faXcrKyA9ICcwJzsKICAgICAgICBjaGFyKiBzID0gX19pdzsKICAgICAgICB3aGlsZSAoeCkgeyBUIHQgPSB4IC8gMTA7IGNoYXIgYyA9IHggLSAxMCAqIHQgKyAnMCc7ICpfX2l3KysgPSBjOyB4ID0gdDsgfQogICAgICAgIGNoYXIqIGYgPSBfX2l3IC0gMTsgd2hpbGUgKHMgPCBmKSBzd2FwKCpzLCAqZiksICsrcywgLS1mOwogICAgICAgIGlmIChfX2l3ID4gX19ldykgY291dC53cml0ZShfX2J1dywgX19pdyAtIF9fYnV3KSwgX19pdyA9IF9fYnV3OwogICAgICAgICpfX2l3KysgPSBlbmRjOwogICAgfQogICAgdGVtcGxhdGU8Y2xhc3MgVD4KICAgIHZvaWQgd3JpdGVTdHIoY29uc3QgVCYgc3RyKSB7CiAgICAgICAgaW50IGkgPSAwOyB3aGlsZSAoc3RyW2ldKSB7ICpfX2l3KysgPSBzdHJbaSsrXTsgaWYgKF9faXcgPiBfX2V3KSBjb3V0LndyaXRlKF9fYnV3LCBfX2l3IC0gX19idXcpLCBfX2l3ID0gX19idXc7IH0KICAgIH0KICAgIHN0cnVjdCBfX0ZMX18geyB+X19GTF9fKCkgeyBpZiAoX19pdyAhPSBfX2J1dykgY291dC53cml0ZShfX2J1dywgX19pdyAtIF9fYnV3KTsgfSB9OwogICAgc3RhdGljIF9fRkxfXyBfX2ZsdXNoVmFyX187CiAgICAgCiAgICAvL1NUTCBvdXRwdXQgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICNkZWZpbmUgVFQxIHRlbXBsYXRlPGNsYXNzIFQ+CiAgICAjZGVmaW5lIFRUMVQyIHRlbXBsYXRlPGNsYXNzIFQxLCBjbGFzcyBUMj4KICAgICNkZWZpbmUgVFQxVDJUMyB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzPgogICAgVFQxVDIgb3N0cmVhbSYgb3BlcmF0b3IgPDwgKG9zdHJlYW0mIG9zLCBjb25zdCBwYWlyPFQxLCBUMj4mIHApOwogICAgVFQxIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3QgdmVjdG9yPFQ+JiB2KTsKICAgIFRUMVQyIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3Qgc2V0PFQxLCBUMj4mdik7CiAgICBUVDFUMiBvc3RyZWFtJiBvcGVyYXRvciA8PCAob3N0cmVhbSYgb3MsIGNvbnN0IG11bHRpc2V0PFQxLCBUMj4mdik7CiAgICBUVDFUMiBvc3RyZWFtJiBvcGVyYXRvciA8PCAob3N0cmVhbSYgb3MsIHByaW9yaXR5X3F1ZXVlPFQxLCBUMj4gdik7CiAgICBUVDFUMlQzIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3QgbWFwPFQxLCBUMiwgVDM+JiB2KTsKICAgIFRUMVQyVDMgb3N0cmVhbSYgb3BlcmF0b3IgPDwgKG9zdHJlYW0mIG9zLCBjb25zdCBtdWx0aW1hcDxUMSwgVDIsIFQzPiYgdik7CiAgICBUVDFUMlQzIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3QgdHJpcGxlPFQxLCBUMiwgVDM+JiB0KTsKICAgIHRlbXBsYXRlPGNsYXNzIFQsIHNpemVfdCBOPiBvc3RyZWFtJiBvcGVyYXRvciA8PCAob3N0cmVhbSYgb3MsIGNvbnN0IGFycmF5PFQsIE4+JiB2KTsKICAgIFRUMVQyIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3QgcGFpcjxUMSwgVDI+JiBwKXsgcmV0dXJuIG9zIDw8IigiPDxwLmZpcnN0PDwiLCAiPDwgcC5zZWNvbmQ8PCIpIjsgfQogICAgVFQxIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3QgdmVjdG9yPFQ+JiB2KXsgICAgICAgYm9vbCBmPTE7b3M8PCJbIjtmb3IoYXV0byYgaSA6IHYpIHsgaWYgKCFmKW9zIDw8ICIsICI7b3M8PGk7Zj0wO31yZXR1cm4gb3MgPDwgIl0iOyB9CiAgICB0ZW1wbGF0ZTxjbGFzcyBULCBzaXplX3QgTj4gb3N0cmVhbSYgb3BlcmF0b3IgPDwgKG9zdHJlYW0mIG9zLCBjb25zdCBhcnJheTxULCBOPiYgdikgeyAgICAgYm9vbCBmPTE7b3M8PCJbIjtmb3IoYXV0byYgaSA6IHYpIHsgaWYgKCFmKW9zIDw8ICIsICI7b3M8PGk7Zj0wO31yZXR1cm4gb3MgPDwgIl0iOyB9CiAgICBUVDFUMiBvc3RyZWFtJiBvcGVyYXRvciA8PCAob3N0cmVhbSYgb3MsIGNvbnN0IHNldDxUMSwgVDI+JnYpeyAgICBib29sIGY9MTtvczw8IlsiO2ZvcihhdXRvJiBpIDogdikgeyBpZiAoIWYpb3MgPDwgIiwgIjtvczw8aTtmPTA7fXJldHVybiBvcyA8PCAiXSI7IH0KICAgIFRUMVQyIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3QgbXVsdGlzZXQ8VDEsVDI+JnYpe2Jvb2wgZj0xO29zPDwiWyI7Zm9yKGF1dG8mIGkgOiB2KSB7IGlmICghZilvcyA8PCAiLCAiO29zPDxpO2Y9MDt9cmV0dXJuIG9zIDw8ICJdIjsgfQogICAgVFQxVDJUMyBvc3RyZWFtJiBvcGVyYXRvciA8PCAob3N0cmVhbSYgb3MsIGNvbnN0IG1hcDxUMSxUMixUMz4mIHYpeyBib29sIGYgPSAxOyBvcyA8PCAiWyI7IGZvciAoYXV0byYgaWkgOiB2KSB7IGlmICghZilvcyA8PCAiLCAiOyBvcyA8PCAiKCIgPDwgaWkuZmlyc3QgPDwgIiAtPiAiIDw8IGlpLnNlY29uZCA8PCAiKSAiOyBmID0gMDsgfXJldHVybiBvcyA8PCAiXSI7IH0KICAgIFRUMVQyIG9zdHJlYW0mIG9wZXJhdG9yIDw8IChvc3RyZWFtJiBvcywgY29uc3QgbXVsdGltYXA8VDEsIFQyPiYgdil7IGJvb2wgZiA9IDE7IG9zIDw8ICJbIjsgZm9yIChhdXRvJiBpaSA6IHYpIHsgaWYgKCFmKW9zIDw8ICIsICI7IG9zIDw8ICIoIiA8PCBpaS5maXJzdCA8PCAiIC0+ICIgPDwgaWkuc2Vjb25kIDw8ICIpICI7IGYgPSAwOyB9cmV0dXJuIG9zIDw8ICJdIjsgfQogICAgVFQxVDIgb3N0cmVhbSYgb3BlcmF0b3IgPDwgKG9zdHJlYW0mIG9zLCBwcmlvcml0eV9xdWV1ZTxUMSwgVDI+IHYpIHsgYm9vbCBmID0gMTsgb3MgPDwgIlsiOyB3aGlsZSAoIXYuZW1wdHkoKSkgeyBhdXRvIHggPSB2LnRvcCgpOyB2LnBvcCgpOyBpZiAoIWYpIG9zIDw8ICIsICI7IGYgPSAwOyBvcyA8PCB4OyB9IHJldHVybiBvcyA8PCAiXSI7IH0KICAgIFRUMVQyVDMgb3N0cmVhbSYgb3BlcmF0b3IgPDwgKG9zdHJlYW0mIG9zLCBjb25zdCB0cmlwbGU8VDEsIFQyLCBUMz4mIHQpeyByZXR1cm4gb3MgPDwgIigiIDw8IHQuYSA8PCAiLCAiIDw8IHQuYiA8PCAiLCAiIDw8IHQuYyA8PCAiKSI7IH0KICAgIFRUMVQyIHZvaWQgcHJpbnRhcnJheShjb25zdCBUMSYgYSwgVDIgc3osIFQyIGJlZyA9IDApeyBmb3IgKFQyIGkgPSBiZWc7IGk8c3o7IGkrKykgY291dCA8PCBhW2ldIDw8ICIgIjsgY291dCA8PCBlbmRsOyB9CiAgICAgCiAgICAvL1NUTCBpbnB1dCAqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgVFQxVDJUMyBpbmxpbmUgaXN0cmVhbSYgb3BlcmF0b3IgPj4gKGlzdHJlYW0mIG9zLCB0cmlwbGU8VDEsIFQyLCBUMz4mIHQpOwogICAgVFQxVDIgaW5saW5lIGlzdHJlYW0mIG9wZXJhdG9yID4+IChpc3RyZWFtJiBvcywgcGFpcjxUMSwgVDI+JiBwKSB7IHJldHVybiBvcyA+PiBwLmZpcnN0ID4+IHAuc2Vjb25kOyB9CiAgICBUVDEgaW5saW5lIGlzdHJlYW0mIG9wZXJhdG9yID4+IChpc3RyZWFtJiBvcywgdmVjdG9yPFQ+JiB2KSB7CiAgICAgICAgaWYgKHYuc2l6ZSgpKSBmb3IgKFQmIHQgOiB2KSBvcyA+PiB0OyBlbHNlIHsKICAgICAgICAgICAgc3RyaW5nIHM7IFQgb2JqOyB3aGlsZSAocy5lbXB0eSgpKSB7Z2V0bGluZShvcywgcyk7IGlmICghb3MpIHJldHVybiBvczt9CiAgICAgICAgICAgIHN0cmluZ3N0cmVhbSBzcyhzKTsgd2hpbGUgKHNzID4+IG9iaikgdi5wdXNoX2JhY2sob2JqKTsKICAgICAgICB9CiAgICAgICAgcmV0dXJuIG9zOwogICAgfQogICAgVFQxVDJUMyBpbmxpbmUgaXN0cmVhbSYgb3BlcmF0b3IgPj4gKGlzdHJlYW0mIG9zLCB0cmlwbGU8VDEsIFQyLCBUMz4mIHQpIHsgcmV0dXJuIG9zID4+IHQuYSA+PiB0LmIgPj4gdC5jOyB9CiAgICAgCiAgICAvL1BhaXIgbWFnaWMgKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioKICAgICNkZWZpbmUgUFQxVDIgcGFpcjxUMSwgVDI+CiAgICBUVDFUMiBpbmxpbmUgUFQxVDIgb3BlcmF0b3IrKGNvbnN0IFBUMVQyICZwMSAsIGNvbnN0IFBUMVQyICZwMikgeyByZXR1cm4gUFQxVDIocDEuZmlyc3QgKyBwMi5maXJzdCwgcDEuc2Vjb25kICsgcDIuc2Vjb25kKTsgfQogICAgVFQxVDIgaW5saW5lIFBUMVQyJiBvcGVyYXRvcis9KFBUMVQyICZwMSAsIGNvbnN0IFBUMVQyICZwMikgeyBwMS5maXJzdCArPSBwMi5maXJzdCwgcDEuc2Vjb25kICs9IHAyLnNlY29uZDsgcmV0dXJuIHAxOyB9CiAgICBUVDFUMiBpbmxpbmUgUFQxVDIgb3BlcmF0b3ItKGNvbnN0IFBUMVQyICZwMSAsIGNvbnN0IFBUMVQyICZwMikgeyByZXR1cm4gUFQxVDIocDEuZmlyc3QgLSBwMi5maXJzdCwgcDEuc2Vjb25kIC0gcDIuc2Vjb25kKTsgfQogICAgVFQxVDIgaW5saW5lIFBUMVQyJiBvcGVyYXRvci09KFBUMVQyICZwMSAsIGNvbnN0IFBUMVQyICZwMikgeyBwMS5maXJzdCAtPSBwMi5maXJzdCwgcDEuc2Vjb25kIC09IHAyLnNlY29uZDsgcmV0dXJuIHAxOyB9CiAgICAgCiAgICAjdW5kZWYgVFQxCiAgICAjdW5kZWYgVFQxVDIKICAgICN1bmRlZiBUVDFUMlQzCiAgICAgCiAgICAjZGVmaW5lIEZSRUlOKEZJTEUpIGZyZW9wZW4oRklMRSwgInJ0Iiwgc3RkaW4pCiAgICAjZGVmaW5lIEZSRU9VVChGSUxFKSBmcmVvcGVuKEZJTEUsICJ3dCIsIHN0ZG91dCkKICAgICNpZmRlZiBMT0NBTAogICAgI2RlZmluZSBCRUdJTl9QUk9GSUxFKGlkeCwgbmFtZSkgaW50IHByb2ZpbGVJZHggPSBpZHg7IHByb2ZpbGVOYW1lW3Byb2ZpbGVJZHhdID0gbmFtZTsgdG90YWxUaW1lW3Byb2ZpbGVJZHhdIC09IHJkdHNjKCkgLyAxZTM7CiAgICAjZGVmaW5lIEVORF9QUk9GSUxFIHRvdGFsVGltZVtwcm9maWxlSWR4XSArPSByZHRzYygpIC8gMWUzOyB0b3RhbENvdW50W3Byb2ZpbGVJZHhdKys7CiAgICAjZWxzZQogICAgI2RlZmluZSBCRUdJTl9QUk9GSUxFKGlkeCwgbmFtZSkKICAgICNkZWZpbmUgRU5EX1BST0ZJTEUKICAgICNlbmRpZgogICAgIAogICAgdGVtcGxhdGU8Y2xhc3MgVD4gaW5saW5lIHZvaWQgbm9ybW1vZChUICZ4LCBUIG0pIHsgeCAlPSBtOyBpZiAoeCA8IDApIHggKz0gbTsgfQogICAgdGVtcGxhdGU8Y2xhc3MgVDEsIGNsYXNzIFQyPiBpbmxpbmUgVDIgc3VtbW9kZmFzdChUMSB4LCBUMSB5LCBUMiBtKSB7IFQyIHJlcyA9IHggKyB5OyBpZiAocmVzID49IG0pIHJlcyAtPSBtOyByZXR1cm4gcmVzOyB9CiAgICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzPiBpbmxpbmUgdm9pZCBhZGRtb2RmYXN0KFQxICZ4LCBUMiB5LCBUMyBtKSB7IHggKz0geTsgaWYgKHggPj0gbSkgeCAtPSBtOyB9CiAgICB0ZW1wbGF0ZTxjbGFzcyBUMSwgY2xhc3MgVDIsIGNsYXNzIFQzPiBpbmxpbmUgdm9pZCBzdWJtb2RmYXN0KFQxICZ4LCBUMiB5LCBUMyBtKSB7IHggLT0geTsgaWYgKHggPCAwKSB4ICs9IG07IH0KICAgICNpZiBJTlRQVFJfTUFYID09IElOVDMyX01BWCBvciAhZGVmaW5lZChfX1NJWkVPRl9JTlQxMjhfXykKICAgIGlubGluZSBsbCBtdWxtb2QobGwgeCwgbGwgbiwgbGwgbSl7IGxsIHIgPSAwOyBub3JtbW9kKHgsIG0pOyBub3JtbW9kKG4sIG0pOyB3aGlsZSAobikgeyBpZiAobiAmIDEpIHIgKz0geDsgeCArPSB4OyBpZiAociA+PSBtKSByIC09IG07IGlmICh4ID49IG0pIHggLT0gbTsgbiAvPSAyOyB9IHJldHVybiByOyB9CiAgICAjZWxzZQogICAgdXNpbmcgaW50MTI4ID0gX19pbnQxMjg7CiAgICBpbmxpbmUgbGwgbXVsbW9kKGxsIHgsIGxsIG4sIGxsIG0peyByZXR1cm4gX19pbnQxMjgoeCkgKiBuICUgbTsgfQogICAgI2VuZGlmCiAgICBpbmxpbmUgbGwgcG93bW9kKGxsIHgsIGxsIG4sIGxsIG0peyBsbCByID0gMTsgbm9ybW1vZCh4LCBtKTsgd2hpbGUgKG4peyBpZiAobiAmIDEpciA9IChyKngpICUgbTsgeCA9ICh4KngpICUgbTsgbiAvPSAyOyB9cmV0dXJuIHI7IH0KICAgIGlubGluZSBsbCBwb3dtdWxtb2QobGwgeCwgbGwgbiwgbGwgbSkgeyBsbCByZXMgPSAxOyBub3JtbW9kKHgsIG0pOyB3aGlsZSAobil7IGlmIChuICYgMSlyZXMgPSBtdWxtb2QocmVzLCB4LCBtKTsgeCA9IG11bG1vZCh4LCB4LCBtKTsgbiAvPSAyOyB9IHJldHVybiByZXM7IH0KICAgIHRlbXBsYXRlPGNsYXNzIFQ+IGlubGluZSBUIGdjZChUIGEsIFQgYikgeyB3aGlsZSAoYikgeyBhICU9IGI7IFQgdCA9IGE7IGEgPSBiOyBiID0gdDsgfSByZXR1cm4gYTsgfQogICAgaW5saW5lIGxsIGxjbShsbCBhLCBsbCBiKXsgcmV0dXJuIGEgLyBnY2QoYSwgYikgKiBiOyB9CiAgICB0ZW1wbGF0ZTxjbGFzcyBUPiBpbmxpbmUgVCBnY2QoVCBhLCBUIGIsIFQgYyl7IHJldHVybiBnY2QoZ2NkKGEsIGIpLCBjKTsgfQogICAgbGwgZ2NkZXgobGwgYSwgbGwgYiwgbGwmIHgsIGxsJiB5KSB7CiAgICAgICAgaWYgKCFhKSB7IHggPSAwOyB5ID0gMTsgcmV0dXJuIGI7IH0KICAgICAgICBsbCB5MTsgbGwgZCA9IGdjZGV4KGIgJSBhLCBhLCB5LCB5MSk7IHggPSB5MSAtIChiIC8gYSkgKiB5OwogICAgICAgIHJldHVybiBkOwogICAgfQogICAgdGVtcGxhdGU8Y2xhc3MgVD4gYm9vbCBpc1ByaW1lKFQgeCkgeyBpZiAoeCA8PSA0IHx8IHggJSAyID09IDAgfHwgeCAlIDMgPT0gMCkgcmV0dXJuIHggPT0gMiB8fCB4ID09IDM7CiAgICAgICAgZm9yIChUIGkgPSA1OyBpICogaSA8PSB4OyBpICs9IDYpIGlmICh4ICUgaSA9PSAwIHx8IHggJSAoaSArIDIpID09IDApIHJldHVybiAwOyByZXR1cm4gMTsgfQogICAgYm9vbCBtaWxsZXJSYWJpbihsb25nIGxvbmcgbikgewogICAgICAgIGlmIChuIDw9IDEwMDApIHJldHVybiBpc1ByaW1lKG4pOwogICAgICAgIGxvbmcgbG9uZyBzID0gbiAtIDE7IGludCB0ID0gMDsgd2hpbGUgKHMgJSAyID09IDApIHMgLz0gMiwgKyt0OwogICAgICAgIGZvciAoaW50IGEgOiB7MiwgMzI1LCA5Mzc1LCAyODE3OCwgNDUwNzc1LCA5NzgwNTA0LCAxNzk1MjY1MDIyfSkgeyBpZiAoIShhICU9IG4pKSByZXR1cm4gdHJ1ZTsKICAgICAgICAgICAgbG9uZyBsb25nIGYgPSBwb3dtdWxtb2QoYSwgcywgbik7IGlmIChmID09IDEgfHwgZiA9PSBuIC0gMSkgY29udGludWU7CiAgICAgICAgICAgIGZvciAoaW50IGkgPSAxOyBpIDwgdDsgKytpKSBpZiAoKGYgPSBtdWxtb2QoZiwgZiwgbikpID09IG4gLSAxKSBnb3RvIG5leHRwOwogICAgICAgICAgICByZXR1cm4gZmFsc2U7IG5leHRwOjsKICAgICAgICB9IHJldHVybiB0cnVlOwogICAgfQogICAgIAogICAgIAogICAgIAogICAgLy9zb21lIG1vZHVsdXMgYW5kIGdjZCB0eXBlIGZ1bmN0aW9ucyAgCiAgICAgCiAgICAgCiAgICBjb25zdCBpbnQgbW9kID0gMWU5ICsgNyA7CiAgICBsbCBwb3dtb2QobGwgYSxsbCBiKSB7bGwgcmVzPTE7aWYoYT49bW9kKWElPW1vZDtmb3IoO2I7Yj4+PTEpe2lmKGImMSlyZXM9cmVzKmE7aWYocmVzPj1tb2QpcmVzJT1tb2Q7YT1hKmE7aWYoYT49bW9kKWElPW1vZDt9cmV0dXJuIHJlczt9CiAgICBsbCBnY2QobGwgYSAsIGxsIGIpe3JldHVybiBhPT0wP2I6Z2NkKGIlYSxhKTt9CiAgICAvLyBVc2VmdWwgY29uc3RhbnRzCiAgICAgCiAgICAgaW50IHNvbWVfcHJpbWVzWzddID0gezI0NDQzLCAxMDAyNzEsIDEwMDAwMDMsIDEwMDAzMzMsIDUwMDAzMjEsIDk4NzY1NDMxLCAxMDAwMDAwMTIzfTsKICAgICAKICAgICAKICAgICAKICAgICAKICAgICNkZWZpbmUgVDkgICAgICAgICAgMTAwMDAwMDAwMAogICAgI2RlZmluZSBUMTggICAgICAgICAxMDAwMDAwMDAwMDAwMDAwMDAwTEwKICAgICNkZWZpbmUgSU5GICAgICAgICAgMTAxMTExMTExMQogICAgI2RlZmluZSBMTElORiAgICAgICAxMDAwMTExMDAwMTExMDAwMTExTEwKICAgICAKICAgICNkZWZpbmUgRVBTICAgICAgICAgKGRvdWJsZSkxZS0xMAogICAgI2RlZmluZSBQSSAgICAgICAgICAzLjE0MTU5MjY1MzU4OTc5MzIzODQ2MjY0CiAgICAjZGVmaW5lIGxpbmsgICAgICAgIGFzYXhsYWpyZXdxd2UKICAgICNkZWZpbmUgcmFuayAgICAgICAgd2FoYXlhd2VoYXNkYWt3CiAgICAvLyBtb2R1bG8KICAgICNkZWZpbmUgbW9kICUKICAgICNkZWZpbmUgTlVNICAxMDAwMDAwMDA3CiAgICAjZGVmaW5lIE5VTTEgMTAwMDAwMDAwOQogICAgLy9zY2FuZiB0eXBlIG1hY3JvcyAKICAgICNkZWZpbmUgcyhuKSBzY2FuZigiJWQiLCAmbikKICAgICNkZWZpbmUgc2wobikgc2NhbmYoIiVsZCIsICZuKQogICAgI2RlZmluZSBzbDMobjEsbjIsbjMpIHNjYW5mKCIlbGxkICVsbGQgJWxsZCAiLCAmbjEsICZuMiwgJm4zKQogICAgI2RlZmluZSBzbDQobjEsbjIsbjMsbjQpIHNjYW5mKCIlbGQgJWxkICVsZCAlbGQiLCAmbjEsICZuMiwgJm4zLCAmbjQpCiAgICAjZGVmaW5lIHNsbChuKSBzY2FuZigiJUk2NGQiLCAmbikKICAgICNkZWZpbmUgc2xsMihuKSBzY2FuZigiJWxsZCIsICZuKQogICAgLy9wcmludGYgdHlwZSBtYWNyb3MgCiAgICAjZGVmaW5lIHAobikgcHJpbnRmKCIlZFxuIiwgbikKICAgICNkZWZpbmUgcGwobikgcHJpbnRmKCIlbGRcbiIsbikKICAgICNkZWZpbmUgcGwzKG4xLG4yLG4zKSBwcmludGYoIiVsbGQgJWxsZCAlbGxkXG4gIiwgbjEsIG4yLCBuMykKICAgICNkZWZpbmUgcGw0KG4xLG4yLG4zLG40KSBwcmludGYoIiVsZCAlbGQgJWxkICVsZFxuICIsIG4xLCBuMiwgbjMsIG40KQogICAgI2RlZmluZSBwbGwobikgcHJpbnRmKCIlSTY0ZFxuIixuKQogICAgI2RlZmluZSBwbGwyKG4pIHByaW50ZigiJWxsZFxuIixuKQogICAgIAogICAgIAogICAgICAgIC8vKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgogICAgaW50MzJfdCBzb2x2ZSgpOwogICAgCi8vIEMgZnVuY3Rpb24gZm9yIGV4dGVuZGVkIEV1Y2xpZGVhbiBBbGdvcml0aG0KbGwgZ2NkRXh0ZW5kZWQobGwgYSwgbGwgYiwgbGwgKngsIGxsICp5KTsKIAovLyBGdW5jdGlvbiB0byBmaW5kIG1vZHVsbyBpbnZlcnNlIG9mIGEKbGwgbW9kSW52ZXJzZShsbCBhLCBsbCBtKQp7CiAgICBsbCB4LCB5OwogICAgbGwgZyA9IGdjZEV4dGVuZGVkKGEsIG0sICZ4LCAmeSk7CiAgICBpZiAoZyAhPSAxKXt9CiAgICAgICAgLy8gY291dCA8PCAiSW52ZXJzZSBkb2Vzbid0IGV4aXN0IjsKICAgIGVsc2UKICAgIHsKICAgICAgICAvLyBtIGlzIGFkZGVkIHRvIGhhbmRsZSBuZWdhdGl2ZSB4CiAgICAgICAgbGwgcmVzID0gKHglbSArIG0pICUgbTsKICAgICAgICAvLyBjb3V0IDw8ICJNb2R1bGFyIG11bHRpcGxpY2F0aXZlIGludmVyc2UgaXMgIiA8PCAKICAgICAgICByZXR1cm4gcmVzOwogICAgfQp9CiAKLy8gQyBmdW5jdGlvbiBmb3IgZXh0ZW5kZWQgRXVjbGlkZWFuIEFsZ29yaXRobQpsbCBnY2RFeHRlbmRlZChsbCBhLCBsbCBiLCBsbCAqeCwgbGwgKnkpCnsKICAgIC8vIEJhc2UgQ2FzZQogICAgaWYgKGEgPT0gMCkKICAgIHsKICAgICAgICAqeCA9IDAsICp5ID0gMTsKICAgICAgICByZXR1cm4gYjsKICAgIH0KIAogICAgbGwgeDEsIHkxOyAvLyBUbyBzdG9yZSByZXN1bHRzIG9mIHJlY3Vyc2l2ZSBjYWxsCiAgICBsbCBnY2QgPSBnY2RFeHRlbmRlZChiJWEsIGEsICZ4MSwgJnkxKTsKIAogICAgLy8gVXBkYXRlIHggYW5kIHkgdXNpbmcgcmVzdWx0cyBvZiByZWN1cnNpdmUKICAgIC8vIGNhbGwKICAgICp4ID0geTEgLSAoYi9hKSAqIHgxOwogICAgKnkgPSB4MTsKIAogICAgcmV0dXJuIGdjZDsKfQogICAgICAgIAogICAgIAogICAgaW50MzJfdCBtYWluKGludCBhcmdjLCBjaGFyKiogYXJndikgewogICAgICAgCiAgICBpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7CiAgICAjaWZkZWYgTE9DQUwKICAgICAgICAgICAgICBGUkVJTigiaW5wdXQudHh0Iik7CiAgICAgICAgICAgICAgLy8gRlJFT1VUKCJvdXQudHh0Iik7ICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAKICAgICNlbmRpZgogICAgICAgIHJldHVybiBzb2x2ZSgpOwogICAgfQogICAgLy9yZWQgYmx1ZSBvayBidXQgaSBoYXRlIHBhbGluZHJvbWVzIAogICAgaW50MzJfdCBzb2x2ZSgpewogICAgICAgIGludCB0O2wganNwZWNpYWwsbixqLHEscWksTGksUmkscHJldmxpLHByZXZyaSxpOy8vcWkgaXMgdGhlIHF1ZXJ5IGl0ZXJhdG9yIGhlcmUgCiAgICAgICAgbGwgcCx4OwogICAgICAgIHModCk7CiAgICAgICAgd2hpbGUodC0tKXsKICAgICAgICAgICAgeD0wOwogICAgICAgICAgICBzbChuKSxzbGwyKHApLHNsKHEpOwogICAgICAgICAgICBsbCBwcEFbbl07ICAgICAgICAvL3ByZWZpeCBwcm9kdWN0IGFycmF5IAogICAgICAgICAgICBsbCBBW25dLHByb2Q9MTsKICAgICAgICAgICAgRkkobikge3NsbDIoQVtpXSk7cHJvZD0ocHJvZCpBW2ldKSVwLHBwQVtpXT1wcm9kO30KICAgICAgICAgICAgCiAgICAgICAgICAgIC8vZm9yIDIgZCBtYXRyaXggc3RvcmluZyAKICAgICAgICAgICAgLy8gZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAvLyAgICAgLyogY29kZSAqLwogICAgICAgICAgICAvLyAgICAgcHJvZD1BW2ldJXA7CiAgICAgICAgICAgIC8vICAgICBwcEFbaV1baV09KHByb2QlcCk7CiAgICAgICAgICAgIC8vIGZvciAoaiA9IGkrMTsgaiA8IG47IGorKykgewogICAgICAgICAgICAvLyAgICAgLyogY29kZSAqLwogICAgICAgICAgICAvLyAgICAgcHJvZD0ocHJvZCVwKkFbal0lcCklcDsKICAgICAgICAgICAgLy8gICAgIHBwQVtpXVtqXT0ocHJvZCklcDsKICAgICAgICAgICAgLy8gfQogICAgICAgICAgICAvLyBwcm9kPTE7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgLy8gZm9yIChpID0gMDsgaSA8IG47IGkrKykgewogICAgICAgICAgICAvLyAgICAgLyogY29kZSAqLwogICAgICAgICAgICAgICAgZm9yIChqID0gMDsgaiA8IG47IGorKykgewogICAgICAgICAgICAgICAgICAgIC8qIGNvZGUgKi8KICAgICAgICAgICAgICAgICAgICBjb3V0PDxwcEFbal08PCIgIjsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNvdXQ8PCJcbiI7CiAgICAgICAgICAgIC8vIH0KICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgbCBCWyhsbClmbG9vcigoZG91YmxlKXEvKGRvdWJsZSk2NCkrMl07CiAgICAgICAgICAgIEZKKHNpemVvZihCKS9zaXplb2YoQlswXSkpIHNsKEJbal0pOwogICAgICAgICAgICAvLyBsbCBzcXJ0ZGVjb21wb3NlWyhsKWNlaWwoc3FydChuKSldOwogICAgICAgICAgICAvLyBidWlsZGRlY29tcG9zdGlvbihBLHAsbixzcXJ0ZGVjb21wb3NlKTsKICAgICAgICAgICAgLy8gcHJlY29tcHV0aW5nKEEsbixwKTsKICAgICAgICAgICAgLy8gbCBjb2xzaXplPShsKWZsb29yKGxvZyhuKSk7CiAgICAgICAgICAgIC8vIGxsIGxvb2t1cFtuXVtjb2xzaXplXTsKICAgICAgICAgICAgLy9zcGFyc2UgdGFibGUgYXBwcm9hY2ggcHJlcHJvY2Vzc2luZyBPKG5sb2duKSBxdWVyeSBPKDEpIAogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIC8vIGZvciAoaSA9IDA7IGkgPCBuOyBpKyspIGxvb2t1cFtpXVswXT1BW2ldOwogICAgICAgICAgICAvLyBmb3IgKGogPSAxOyAoMTw8aik8PSBuOyBqKyspLy90aWxsIGxvZ24gCiAgICAgICAgICAgIC8vICAgICAvKiBjb2RlICovCiAgICAgICAgICAgIC8vICAgICBmb3IgKGkgPSAwOyBpIDw9IG4tKDE8PGopOyBpKyspIHsKICAgICAgICAgICAgLy8gICAgICAgICAvKiBjb2RlICovCiAgICAgICAgICAgIC8vICAgICAgICAgLy9yYW5nZSAyIGtpIHBvd2VyIGhhaSB5YSBuaGkgaXQgaXMgYW4gcGFydCBvZiBhbiBxdWVyeQogICAgICAgICAgICAvLyAgICAgICAgIGxvb2t1cFtpXVtqXT0oKGxvb2t1cFtpXVtqLTFdJXApKigobG9va3VwW2krKDE8PChqLTEpKV1bai0xXSklcCkpJXA7CiAgICAgICAgICAgIC8vICAgICB9CiAgICAgICAgICAgIC8vIH0gLy9sb29rdXAgbWF0cml4IGZvciBhbGwgcG9zc2libGUgc3ViYXJyYXlzIG9mIGxlbmd0aCBwb3coMixqKSBmb3IgYWxsIHBvc3NpYmxlIHZhbHVlcyBvZiBqIGFzIDAsMSwyLDMsNCw1IHVwIHRpbGwgbG9nKG4pCiAgICAgICAgICAgICAgICAKICAgICAgICAgICAgIAogICAgICAgICAgICAvL3RhcmFuIHJha2hhICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIAogICAgICAgICAgICBmb3IocWk9MDtxaTwocSk7cWkrKykgewogICAgICAgICAgICAgIGlmKHFpJTY0PT0wKSAvL2hlcmUgYWx3YXlzIGZpcnN0IGl0IHdpbGwgZXhlY3V0ZXMgCiAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgaWYocWk9PTApIHg9MDsKICAgICAgICAgICAgICAgICBMaSA9IChCW3FpLzY0XSAgKyB4KSVuLCBSaSA9IChCWyhxaS82NCkrMV0gICsgeCklbjsKICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgIGVsc2Uge0xpID0gKHByZXZsaSArIHgpJW4sIFJpID0gKHByZXZyaSArIHgpJW47fQogICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBpZihMaT5SaSkgc3dhcChMaSxSaSk7Ly9PKDEpIHRpbWUgb3BlcmF0aW9uIAogICAgICAgICAgICAgICAgICAgIC8vICAgeD0obG9va3VwW0xpXVtSaV0rMSklcDsKICAgICAgICAgICAgICAgICAgICAgICAvLyhhbnMoTGksUmksQSxwLG4sc3FydGRlY29tcG9zZSkKICAgICAgICAgICAgICAgICAgICAvLyAgICAganNwZWNpYWw9KGwpbG9nMihSaS1MaSsxKTsgICAgICAKICAgICAgICAgICAgICAgICAgICAvLyAgICAgaWYoanNwZWNpYWwlMj09MCkge3g9KGxvb2t1cFtMaV1banNwZWNpYWxdKzEpJXA7fQogICAgICAgICAgICAgICAgICAgIC8vICAgZWxzZSB7CiAgICAgICAgICAgICAgICAgICAgLy8gICAgICAgeD0oKChsb29rdXBbTGldW2pzcGVjaWFsXStsb29rdXBbUi0oMTw8KGpzcGVjaWFsKSkrMV1banNwZWNpYWxdKS8yKSsxKSVwOwogICAgICAgICAgICAgICAgICAgIC8vICAgfQogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgIC8vICAgaWYocHBBW0xpXSE9MCkKICAgICAgICAgICAgICAgICAgICAgICAgLy8geD0oKCgocHBBW1JpXSkvcHBBW0xpLTFdKSkrMSklcDsKICAgICAgICAgICAgICAgICAgICAgICAgLy8gc3RkOjpjb3V0IDw8IHBwQVtMaV1bUmktTGldIDw8IHN0ZDo6ZW5kbDsKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgIC8vIDwtLS0gICAgICAgICAgICAgICAgICAgIEB0YXJhbiBjaGVjayBmcm9tIGhlcmUgLS0tPgogICAgICAgICAgICAgICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICAgICAgICAgIHg9KCgocHBBW1JpXSkqKG1vZEludmVyc2UocHBBW0xpLTFdLHApKSklcCsxKSVwOwogICAgICAgICAgICAgICAgICAgICAgICAvLyAgIGVsc2UgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgICAgICAgICAgICBwcmV2bGk9TGkscHJldnJpPVJpOwogICAgICAgICAgICAgICAgCiAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIAogICAgICAgICAgICAKICAgICAgICAgICAgICAgIAogICAgICAgICAgICAgcGxsMih4JXApOwogICAgICAKICAgICAgICB9CiAgICAgICAgCiAgICAgICAgcmV0dXJuIDA7CiAgICB9IAogICAgCiAgICAKICAgIAogICAgCiAgICAvL3NxIHJvb3QgZGVjb21wb3N0aW9uIHRlaGNuaXF1ZSB1c2VkIAogICAgCiAgICAKICAgIAogICAgLy8gI2RlZmluZSBNQVggMTAwMDAwMCAgCiAgICAvLyBsbCBsb29rdXBbTUFYXVtNQVhdOyAKICAgIC8vIHZvaWQgYnVpbGRkZWNvbXBvc3Rpb24obGwgQVtdLGxsIHAsbCBuLGxsIHNxcnRkZWNvbXBvc2VbXSl7CiAgICAvLyAgICAgbCBibG9ja3NpemU9KGwpY2VpbChzcXJ0KG4pKTsKICAgIC8vICAgICBsIGRlY29tcG9zZWl0ZXJhPTA7CiAgICAvLyAgICAgbGwgcHJvZD0xOwogICAgLy8gICAgIGZvciAobCBpID0gMDsgaSA8IG47IGkrKykgewogICAgLy8gICAgICAgICAgICAgLyogY29kZSAqLwogICAgLy8gICAgICAgICBwcm9kPSgocHJvZCpBW2ldKSk7CiAgICAvLyAgICAgICAgIGlmKGkrMSVibG9ja3NpemU9PTApIHsKICAgIC8vICAgICAgICAgICAgICAgICBzcXJ0ZGVjb21wb3NlW2RlY29tcG9zZWl0ZXJhKytdPXByb2Q7CiAgICAvLyAgICAgICAgICAgICAgICAgcHJvZD0xOwogICAgLy8gICAgICAgICB9CiAgICAgICAgICAgIAogICAgLy8gICAgIH0gICAgCiAgICAvLyB9CiAgICAgICAgCiAgICAgICAgCiAgICAvLyBsbCBhbnMobCBMaSxsIFJpLGxsIEFbXSxsbCBwLGwgbixsbCBzcXJ0ZGVjb21wb3NlW10pewogICAgICAgIAogICAgLy8gICAgIGwgYmxvY2tzaXplPShsKWNlaWwoc3FydChuKSk7CiAgICAvLyAgICAgLy8gaW50IGJsb2Nrbm89TGkvYmxvY2tzaXplOwogICAgLy8gICAgIGxsIHByb2Q9MTsKICAgIC8vICAgICAvL2Nhc2UgMSBzdGFydGluZyBjYXNlIGhhbmRsZSBhbHNvcyB0cnVlIHdoZW4gaXRpcyBub3Qgb3ZlcmxhcHBpbmcgYW55ICBibG9jayAgY29tcGxldGVseSAKICAgIC8vICAgICB3aGlsZShMaSVibG9ja3NpemUhPTAmJkxpPD1SaSl7CiAgICAvLyAgICAgICAgIHByb2Q9KChwcm9kKSpBW0xpXSklcDsvL2FkZCAlcCBoZXJlIAogICAgLy8gICAgICAgICBMaSsrOwogICAgLy8gICAgIH0KICAgIC8vICAgICAvLyBwcm9kJT1wOyBjYXNlIDIgZm9yIGNvbXBsZXRlIG92ZXJsYXBwaW5nIAogICAgLy8gICAgIHdoaWxlKExpK2Jsb2Nrc2l6ZTw9UmkpewogICAgLy8gICAgICAgICBwcm9kPSgocHJvZCkqKChzcXJ0ZGVjb21wb3NlW0xpL2Jsb2Nrc2l6ZV0pKSklcDsKICAgIC8vICAgICAgICAgTGkrPWJsb2Nrc2l6ZTsgCiAgICAvLyAgICAgfSAgICAKICAgIC8vICAgICAvLyBjYXNlMyByZW1haW5pZyBuIHVub3ZlcmxhcHBlZCBlbGVtZW50cyAKICAgIC8vICAgICB3aGlsZShMaTw9UmkpICAgIHsKICAgIC8vICAgICAgICAgcHJvZD0oKHByb2QpKihBW0xpXSkpJXA7TGkrKzsvL2FkZCAlcCBoZXJlIAogICAgLy8gICAgIH0KICAgICAgICAKICAgIC8vICAgICByZXR1cm4gcHJvZDsKICAgICAgICAKICAgIC8vIH0KICAgICAKICAgICAgICAKLy8gMSBhcHByb2FjaCBvZiB0aGUgcHJlY29tcHV0aW5nIHdpdGggdGhldSBzZSBvZiBhbiBHTE9CQUwgTE9PS1VQIE1BVFJJWCBPRiBTSVpFIE1BWCBNQVguLi4gICAgICAgICAgICAKLy8gdm9pZCBwcmVjb21wdXRpbmcobGwgQVtdLGwgbixsbCBwKXsKLy8gICAgIGwgaTsKLy8gICAgIGZvciAobCBqPSAwOyBqIDwgKGwpbG9nKG4pOyArK2opCi8vICAgICB7Ci8vICAgICAgICAgaT0wOwovLyAgICAgICAgIC8qIGNvZGUgKi8KLy8gICAgICAgICB3aGlsZShpPG4pCi8vICAgICAgICAgewovLyAgICAgICAgICAgICAvKiBjb2RlICovCi8vICAgICAgICAgICAgIGlmKGo9PTApIGxvb2t1cFtpXVtqXT1pOwovLyAgICAgICAgICAgICBlbHNlIHsKLy8gICAgICAgICAgICAgICAgIGxvb2t1cFtpXVtqXT0oKGxvb2t1cFtpXVtqLTFdJXApKihsb29rdXBbaSArICgxPDwoai0xKSldW2otMV0pJXApJXA7Ci8vICAgICAgICAgICAgIH0KLy8gICAgICAgICAgICAgaSsrOyAKLy8gICAgICAgICB9Ci8vICAgICB9CgovLyB9ICAgIA==