/***************************************************************
* Author : Nguyen Trong Van Viet *
* Age : 17 *
* School : 12T2 Le Khiet High School for the Gifted *
* Hometown : Quang Ngai , Viet Nam . *
* Khanh An is my lover :) the more I code , the nearer I am *
****************************************************************/
#define TASK "text"
#define INPUT TASK".INP"
#define OUTPUT TASK".OUT"
bool mtt = 0 ;
int test = 1 ;
#include<bits/stdc++.h>
using namespace std;
#define ll long long
#define db double
#define ve vector
#define vi vector<int>
#define vll vector<ll>
#define str string
#define pb push_back
#define pk pop_back
#define el '\n'
#define pii pair<int,int>
#define pll pair<ll,ll>
#define mp make_pair
#define fi first
#define se second
#define uni(a) sort(all(a)),a.resize(unique(all(a))-a.begin())
#define FOR(i,a,b) for(int i=(int)(a);i<=(int)(b);i++)
#define FORD(i,a,b) for(int i=(int)(a);i>=(int)(b);i--)
#define FORN(i,a,b) for(int i=(int)(a);i<(int)(b);i++)
#define all(a) a.begin(),a.end()
#define btpc __builtin_popcountll
#define LB lower_bound
#define UB upper_bound
#define tct template<class T>
#define BIT(msk,i) (msk>>(i)&1)
ll lg(ll a){return __lg(a);}
ll sq(ll a){return a*a;}
ll gcd(ll a,ll b){return __gcd(a,b);}
ll lcm(ll a,ll b){return a/gcd(a,b)*b;}
ll rd(ll l , ll r ){return l+1LL*rand()*rand()*rand()%(r-l+1);}
#define prt(a,n) FOR(i,1,n)cout<<a[i]<<" ";cout<<el;
#define prv(a) for(auto v:a)cout<<v<<" "; cout<<el;
tct bool mini(T& a,T b){return (a>b)?a=b,1:0;}
tct bool maxi(T& a,T b){return (a<b)?a=b,1:0;}
int xx[] = {0,0,-1,0,1};
int yy[] = {0,-1,0,1,0};
const db PI = acos(-1) , EPS = 1e-9;
const ll inf = 1e18 , cs = 331 , sm = 1e9+7;
const int N = 2e5+5 , oo = 2e9 , LO = 17 , CH = 26 ;
const ll mod = (119 << 23) + 1, root = 62; // = 998244353
// For p < 2^30 there is also e.g. 5 << 25, 7 << 26, 479 << 21
// and 483 << 21 (same root). The last two are > 10^9.
ll pw(ll a,ll b)
{
ll res = 1 ;
while(b)
{
if(b&1)res = res*a%mod ;
a = a*a%mod ;
b>>=1 ;
}
return res ;
}
void ntt(vll &a)
{
int n = a.size(), L = 31 - __builtin_clz(n);
static vll rt(2, 1);
for (static int k = 2, s = 2; k < n; k *= 2, s++) {
rt.resize(n);
ll z[] = {1, pw(root, mod >> s)};
FORN(i,k,2*k) rt[i] = rt[i / 2] * z[i & 1] % mod;
}
vi rev(n);
FORN(i,0,n) rev[i] = (rev[i / 2] | (i & 1) << L) / 2;
FORN(i,0,n) if (i < rev[i]) swap(a[i], a[rev[i]]);
for (int k = 1; k < n; k *= 2)
for (int i = 0; i < n; i += 2 * k) FORN(j,0,k) {
ll z = rt[j + k] * a[i + j + k] % mod, &ai = a[i + j];
a[i + j + k] = ai - z + (z > ai ? mod : 0);
ai += (ai + z >= mod ? z - mod : z);
}
}
vll conv(vll a, vll b) {
if (a.empty() || b.empty()) return {};
int s = (int)a.size() + (int)b.size() - 1, B = 32 - __builtin_clz(s),
n = 1 << B;
int inv = pw(n, mod - 2);
vll L(a), R(b), out(n);
L.resize(n), R.resize(n);
ntt(L), ntt(R);
FORN(i,0,n)
out[-i & (n - 1)] = (ll)L[i] * R[i] % mod * inv % mod;
ntt(out);
return {out.begin(), out.begin() + s};
}
struct poly
{
vll coef;
poly(){}
poly(vll a) : coef(a){}
friend poly operator*(poly a,poly b){return conv(a.coef,b.coef);}
friend poly operator+(int a , poly b )
{
b.coef[0] = (a+b.coef[0])%mod ;
return b ;
}
friend poly operator-(int a , poly b )
{
for(auto &x:b.coef)x=(mod-x)%mod ;
return a+b ;
}
friend poly operator+(poly a,poly b)
{
a.coef.resize(max(a.coef.size(),b.coef.size())) ;
FORN(i,0,b.coef.size())a.coef[i] = (a.coef[i]+b.coef[i])%mod ;
return a ;
}
friend poly operator-(poly a,poly b)
{
for(auto &x : b.coef)x = (mod-x)%mod ;
return a+b ;
}
void mod_xk(int k)
{
coef.resize(min(k,(int)coef.size())) ;
}
poly mod_xk_here(int k)
{
poly r = *this ;
r.mod_xk(k) ;
return r ;
}
int deg()
{
return coef.size()-1 ;
}
poly inv()
{
assert(coef[0]!=0) ;
poly r({pw(coef[0],mod-2)}) ;
for(int d=2;d<=deg()*2;d*=2)
{
poly f = poly({coef.begin(),coef.begin()+min((int)coef.size(),d)}) ;
poly g = r*f ;
g.mod_xk(d) ;
poly h = r*(2-g) ;
h.mod_xk(d) ;
r.coef.resize(d) ;
for(int i=0;i<d;i++)r.coef[i] = h.coef[i] ;
}
r.coef.resize(deg()+1) ;
return r ;
}
poly deri()
{
vll r ;
for(int i=1;i<=deg();i++)r.pb(coef[i]*i%mod) ;
return poly(r) ;
}
poly inte()
{
vll r = {0} ;
for(int i=0;i<=deg();i++)r.pb(coef[i]*pw(i+1,mod-2)%mod) ;
return poly(r) ;
}
// ln(A(x))' = A'(x)/A(x)
poly ln(int k = -1 )
{
assert(coef[0]==1) ;
if(k==-1)
{
k = deg()+1 ;
}
return (deri()*inv()).mod_xk_here(k).inte().mod_xk_here(k) ;
}
poly exp()
{
assert(coef[0]==0) ;
poly Q({1}) ;
for(int d=2;d<=deg()*2;d*=2)
{
poly P = poly({coef.begin(),coef.begin()+min((int)coef.size(),d)}) ;
poly q = Q*(1+P-Q.ln()) ;
q.mod_xk(d) ;
Q.coef.resize(d) ;
for(int i=0;i<d;i++)Q.coef[i] = q.coef[i] ;
}
Q.coef.resize(deg()+1) ;
return Q ;
}
};
int n ;
void doc()
{
cin>> n ;
vll a(n) ;
for(int i=0;i<n;i++)cin>>a[i] ;
poly b = poly(a) ;
prv(b.exp().coef) ;
}
namespace sub1
{
void xuly()
{
}
}
/* DON'T BELIEVE LOVE WILL INSPIRE YOU -> TRAIN HARDER -> YOU WILL GET THE LOVE YOU WANT !!*/
signed main()
{
ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);srand(time(0));
if(fopen(INPUT,"r"))
{
freopen(INPUT ,"r",stdin);
freopen(OUTPUT,"w",stdout);
}
if(mtt)cin>>test;
FOR(i,1,test)
{
doc() ;
sub1::xuly() ;
}
}
LyoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKgoqICAgICAgICAgICAgIEF1dGhvciA6IE5ndXllbiBUcm9uZyBWYW4gVmlldCAgICAgICAgICAgICAgICAgICAqCiogICAgICAgICAgICAgICAgICAgICAgICBBZ2UgOiAxNyAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICoKKiAgICAgIFNjaG9vbCA6IDEyVDIgTGUgS2hpZXQgSGlnaCBTY2hvb2wgZm9yIHRoZSBHaWZ0ZWQgICAgICAgKgoqICAgICAgICAgICAgSG9tZXRvd24gOiAgUXVhbmcgTmdhaSAsIFZpZXQgTmFtIC4gICAgICAgICAgICAgICAqCiogS2hhbmggQW4gaXMgbXkgbG92ZXIgOikgdGhlIG1vcmUgSSBjb2RlICAsIHRoZSBuZWFyZXIgSSBhbSAgICoKKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKi8KI2RlZmluZSBUQVNLICJ0ZXh0IgojZGVmaW5lIElOUFVUIFRBU0siLklOUCIgCiNkZWZpbmUgT1VUUFVUIFRBU0siLk9VVCIKCmJvb2wgbXR0ID0gMCA7CmludCB0ZXN0ID0gMSA7ICAKCiNpbmNsdWRlPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7IAoKI2RlZmluZSAgICAgICAgICAgICBsbCAgbG9uZyBsb25nIAojZGVmaW5lICAgICAgICAgICAgIGRiICBkb3VibGUgCiNkZWZpbmUgICAgICAgICAgICAgdmUgIHZlY3RvciAKI2RlZmluZSAgICAgICAgICAgICB2aSAgdmVjdG9yPGludD4KI2RlZmluZSAgICAgICAgICAgIHZsbCAgdmVjdG9yPGxsPgojZGVmaW5lICAgICAgICAgICAgc3RyICBzdHJpbmcKI2RlZmluZSAgICAgICAgICAgICBwYiAgcHVzaF9iYWNrCiNkZWZpbmUgICAgICAgICAgICAgcGsgIHBvcF9iYWNrCiNkZWZpbmUgICAgICAgICAgICAgZWwgICdcbicKI2RlZmluZSAgICAgICAgICAgIHBpaSAgcGFpcjxpbnQsaW50PgojZGVmaW5lICAgICAgICAgICAgcGxsICBwYWlyPGxsLGxsPgojZGVmaW5lICAgICAgICAgICAgIG1wICBtYWtlX3BhaXIgCiNkZWZpbmUgICAgICAgICAgICAgZmkgIGZpcnN0IAojZGVmaW5lICAgICAgICAgICAgIHNlICBzZWNvbmQKI2RlZmluZSAgICAgICAgIHVuaShhKSAgc29ydChhbGwoYSkpLGEucmVzaXplKHVuaXF1ZShhbGwoYSkpLWEuYmVnaW4oKSkgCiNkZWZpbmUgICAgIEZPUihpLGEsYikgIGZvcihpbnQgaT0oaW50KShhKTtpPD0oaW50KShiKTtpKyspCiNkZWZpbmUgICAgRk9SRChpLGEsYikgIGZvcihpbnQgaT0oaW50KShhKTtpPj0oaW50KShiKTtpLS0pCiNkZWZpbmUgICAgRk9STihpLGEsYikgIGZvcihpbnQgaT0oaW50KShhKTtpPChpbnQpKGIpO2krKykKI2RlZmluZSAgICAgICAgIGFsbChhKSAgYS5iZWdpbigpLGEuZW5kKCkgIAojZGVmaW5lICAgICAgICAgICBidHBjICBfX2J1aWx0aW5fcG9wY291bnRsbAojZGVmaW5lICAgICAgICAgICAgIExCICBsb3dlcl9ib3VuZAojZGVmaW5lICAgICAgICAgICAgIFVCICB1cHBlcl9ib3VuZCAKI2RlZmluZSAgICAgICAgICAgIHRjdCAgdGVtcGxhdGU8Y2xhc3MgVD4KI2RlZmluZSAgICAgQklUKG1zayxpKSAgKG1zaz4+KGkpJjEpCgpsbCBsZyhsbCBhKXtyZXR1cm4gX19sZyhhKTt9CmxsIHNxKGxsIGEpe3JldHVybiBhKmE7fSAgCmxsIGdjZChsbCBhLGxsIGIpe3JldHVybiBfX2djZChhLGIpO30gCmxsIGxjbShsbCBhLGxsIGIpe3JldHVybiBhL2djZChhLGIpKmI7fQpsbCByZChsbCBsICwgbGwgciApe3JldHVybiBsKzFMTCpyYW5kKCkqcmFuZCgpKnJhbmQoKSUoci1sKzEpO30KCiNkZWZpbmUgcHJ0KGEsbikgRk9SKGksMSxuKWNvdXQ8PGFbaV08PCIgIjtjb3V0PDxlbDsKI2RlZmluZSBwcnYoYSkgZm9yKGF1dG8gdjphKWNvdXQ8PHY8PCIgIjsgY291dDw8ZWw7IAoKdGN0IGJvb2wgbWluaShUJiBhLFQgYil7cmV0dXJuIChhPmIpP2E9YiwxOjA7fQp0Y3QgYm9vbCBtYXhpKFQmIGEsVCBiKXtyZXR1cm4gKGE8Yik/YT1iLDE6MDt9CgppbnQgeHhbXSA9IHswLDAsLTEsMCwxfTsgCmludCB5eVtdID0gezAsLTEsMCwxLDB9OwoKY29uc3QgZGIgUEkgPSBhY29zKC0xKSAsIEVQUyA9IDFlLTk7CmNvbnN0IGxsIGluZiA9IDFlMTggLCBjcyA9IDMzMSAsIHNtID0gMWU5Kzc7IApjb25zdCBpbnQgTiA9IDJlNSs1ICwgb28gPSAyZTkgLCBMTyA9IDE3ICwgQ0ggPSAyNiA7IAoKY29uc3QgbGwgbW9kID0gKDExOSA8PCAyMykgKyAxLCByb290ID0gNjI7IC8vID0gOTk4MjQ0MzUzCi8vIEZvciBwIDwgMl4zMCB0aGVyZSBpcyBhbHNvIGUuZy4gNSA8PCAyNSwgNyA8PCAyNiwgNDc5IDw8IDIxCi8vIGFuZCA0ODMgPDwgMjEgKHNhbWUgcm9vdCkuIFRoZSBsYXN0IHR3byBhcmUgPiAxMF45LgpsbCBwdyhsbCBhLGxsIGIpCnsKCWxsIHJlcyA9IDEgOyAKCXdoaWxlKGIpCgl7CgkJaWYoYiYxKXJlcyA9IHJlcyphJW1vZCA7IAoJCWEgPSBhKmElbW9kIDsgCgkJYj4+PTEgOyAKCX0KCXJldHVybiByZXMgOyAKfQp2b2lkIG50dCh2bGwgJmEpIAp7CglpbnQgbiA9IGEuc2l6ZSgpLCBMID0gMzEgLSBfX2J1aWx0aW5fY2x6KG4pOwoJc3RhdGljIHZsbCBydCgyLCAxKTsKCWZvciAoc3RhdGljIGludCBrID0gMiwgcyA9IDI7IGsgPCBuOyBrICo9IDIsIHMrKykgewoJCXJ0LnJlc2l6ZShuKTsKCQlsbCB6W10gPSB7MSwgcHcocm9vdCwgbW9kID4+IHMpfTsKCQlGT1JOKGksaywyKmspIHJ0W2ldID0gcnRbaSAvIDJdICogeltpICYgMV0gJSBtb2Q7Cgl9Cgl2aSByZXYobik7CglGT1JOKGksMCxuKSByZXZbaV0gPSAocmV2W2kgLyAyXSB8IChpICYgMSkgPDwgTCkgLyAyOwoJRk9STihpLDAsbikgaWYgKGkgPCByZXZbaV0pIHN3YXAoYVtpXSwgYVtyZXZbaV1dKTsKCWZvciAoaW50IGsgPSAxOyBrIDwgbjsgayAqPSAyKQoJCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSArPSAyICogaykgRk9STihqLDAsaykgewoJCQlsbCB6ID0gcnRbaiArIGtdICogYVtpICsgaiArIGtdICUgbW9kLCAmYWkgPSBhW2kgKyBqXTsKCQkJYVtpICsgaiArIGtdID0gYWkgLSB6ICsgKHogPiBhaSA/IG1vZCA6IDApOwoJCQlhaSArPSAoYWkgKyB6ID49IG1vZCA/IHogLSBtb2QgOiB6KTsKCQl9Cn0KdmxsIGNvbnYodmxsIGEsIHZsbCBiKSB7CglpZiAoYS5lbXB0eSgpIHx8IGIuZW1wdHkoKSkgcmV0dXJuIHt9OwoJaW50IHMgPSAoaW50KWEuc2l6ZSgpICsgKGludCliLnNpemUoKSAtIDEsIEIgPSAzMiAtIF9fYnVpbHRpbl9jbHoocyksCgkJbiA9IDEgPDwgQjsKCWludCBpbnYgPSBwdyhuLCBtb2QgLSAyKTsKCXZsbCBMKGEpLCBSKGIpLCBvdXQobik7CglMLnJlc2l6ZShuKSwgUi5yZXNpemUobik7CgludHQoTCksIG50dChSKTsKCUZPUk4oaSwwLG4pCgkJb3V0Wy1pICYgKG4gLSAxKV0gPSAobGwpTFtpXSAqIFJbaV0gJSBtb2QgKiBpbnYgJSBtb2Q7CgludHQob3V0KTsKCXJldHVybiB7b3V0LmJlZ2luKCksIG91dC5iZWdpbigpICsgc307Cn0Kc3RydWN0IHBvbHkKewoJdmxsIGNvZWY7IAoJcG9seSgpe30gCglwb2x5KHZsbCBhKSA6IGNvZWYoYSl7fSAgCglmcmllbmQgcG9seSBvcGVyYXRvcioocG9seSBhLHBvbHkgYil7cmV0dXJuIGNvbnYoYS5jb2VmLGIuY29lZik7fQoJZnJpZW5kIHBvbHkgb3BlcmF0b3IrKGludCBhICwgcG9seSBiICkKCXsKCQliLmNvZWZbMF0gPSAoYStiLmNvZWZbMF0pJW1vZCA7CgkJcmV0dXJuIGIgOwoJfQoJZnJpZW5kIHBvbHkgb3BlcmF0b3ItKGludCBhICwgcG9seSBiICkKCXsKCQlmb3IoYXV0byAmeDpiLmNvZWYpeD0obW9kLXgpJW1vZCA7IAoJCXJldHVybiBhK2IgOyAKCX0KCWZyaWVuZCBwb2x5IG9wZXJhdG9yKyhwb2x5IGEscG9seSBiKQoJewoJCWEuY29lZi5yZXNpemUobWF4KGEuY29lZi5zaXplKCksYi5jb2VmLnNpemUoKSkpIDsgCgkJRk9STihpLDAsYi5jb2VmLnNpemUoKSlhLmNvZWZbaV0gPSAoYS5jb2VmW2ldK2IuY29lZltpXSklbW9kIDsgCgkJcmV0dXJuIGEgOyAKCX0KCWZyaWVuZCBwb2x5IG9wZXJhdG9yLShwb2x5IGEscG9seSBiKQoJewoJCWZvcihhdXRvICZ4IDogYi5jb2VmKXggPSAobW9kLXgpJW1vZCA7CgkJcmV0dXJuIGErYiA7IAoJfQoJdm9pZCBtb2RfeGsoaW50IGspCgl7CgkJY29lZi5yZXNpemUobWluKGssKGludCljb2VmLnNpemUoKSkpIDsgCgl9Cglwb2x5IG1vZF94a19oZXJlKGludCBrKQoJewoJCXBvbHkgciA9ICp0aGlzIDsgCgkJci5tb2RfeGsoaykgOyAKCQlyZXR1cm4gciA7IAoJfQoJaW50IGRlZygpCgl7CgkJcmV0dXJuIGNvZWYuc2l6ZSgpLTEgOyAKCX0KCXBvbHkgaW52KCkKCXsJCgkJYXNzZXJ0KGNvZWZbMF0hPTApIDsKCQlwb2x5IHIoe3B3KGNvZWZbMF0sbW9kLTIpfSkgOyAKCQlmb3IoaW50IGQ9MjtkPD1kZWcoKSoyO2QqPTIpCgkJewoJCQlwb2x5IGYgPSBwb2x5KHtjb2VmLmJlZ2luKCksY29lZi5iZWdpbigpK21pbigoaW50KWNvZWYuc2l6ZSgpLGQpfSkgOyAKCQkJcG9seSBnID0gcipmIDsgCgkJCWcubW9kX3hrKGQpIDsgCgkJCXBvbHkgaCA9IHIqKDItZykgOyAKCQkJaC5tb2RfeGsoZCkgOyAKCQkJci5jb2VmLnJlc2l6ZShkKSA7IAoJCQlmb3IoaW50IGk9MDtpPGQ7aSsrKXIuY29lZltpXSA9IGguY29lZltpXSA7IAoJCX0KCQlyLmNvZWYucmVzaXplKGRlZygpKzEpIDsgCgkJcmV0dXJuIHIgOyAKCX0KCXBvbHkgZGVyaSgpCgl7CgkJdmxsIHIgOyAKCQlmb3IoaW50IGk9MTtpPD1kZWcoKTtpKyspci5wYihjb2VmW2ldKmklbW9kKSA7IAoJCXJldHVybiBwb2x5KHIpIDsKCX0KCXBvbHkgaW50ZSgpCgl7CgkJdmxsIHIgPSB7MH0gOyAKCQlmb3IoaW50IGk9MDtpPD1kZWcoKTtpKyspci5wYihjb2VmW2ldKnB3KGkrMSxtb2QtMiklbW9kKSA7IAoJCXJldHVybiBwb2x5KHIpIDsgCgl9CgkvLyBsbihBKHgpKScgPSBBJyh4KS9BKHgpIAoJcG9seSBsbihpbnQgayA9IC0xICkKCXsgICAKCQlhc3NlcnQoY29lZlswXT09MSkgOyAKCQlpZihrPT0tMSkKCQl7CgkJCWsgPSBkZWcoKSsxIDsgCgkJfQoJCXJldHVybiAoZGVyaSgpKmludigpKS5tb2RfeGtfaGVyZShrKS5pbnRlKCkubW9kX3hrX2hlcmUoaykgOyAKCX0KCXBvbHkgZXhwKCkKCXsKCQlhc3NlcnQoY29lZlswXT09MCkgOyAgIAoJCXBvbHkgUSh7MX0pIDsKCQlmb3IoaW50IGQ9MjtkPD1kZWcoKSoyO2QqPTIpCgkJewoJCQlwb2x5IFAgPSBwb2x5KHtjb2VmLmJlZ2luKCksY29lZi5iZWdpbigpK21pbigoaW50KWNvZWYuc2l6ZSgpLGQpfSkgOyAKCQkJcG9seSBxID0gUSooMStQLVEubG4oKSkgOyAKCQkJcS5tb2RfeGsoZCkgOyAKCQkJUS5jb2VmLnJlc2l6ZShkKSA7IAoJCQlmb3IoaW50IGk9MDtpPGQ7aSsrKVEuY29lZltpXSA9IHEuY29lZltpXSA7IAoJCX0JIAoJCVEuY29lZi5yZXNpemUoZGVnKCkrMSkgOwoJCXJldHVybiBRIDsKCX0KfTsKCmludCBuIDsgCnZvaWQgZG9jKCkKewoJY2luPj4gbiAgOwoJdmxsIGEobikgOyAKCWZvcihpbnQgaT0wO2k8bjtpKyspY2luPj5hW2ldICA7IAoJcG9seSBiID0gcG9seShhKSA7CglwcnYoYi5leHAoKS5jb2VmKSA7ICAKCn0KbmFtZXNwYWNlIHN1YjEKewoJdm9pZCB4dWx5KCkKCXsJCgoJfQkJCn0KCi8qICBET04nVCBCRUxJRVZFIExPVkUgV0lMTCBJTlNQSVJFIFlPVSAtPiAgVFJBSU4gSEFSREVSIC0+ICBZT1UgV0lMTCBHRVQgVEhFIExPVkUgWU9VIFdBTlQgISEqLwoKc2lnbmVkIG1haW4oKQp7Cglpb3NfYmFzZTo6c3luY193aXRoX3N0ZGlvKDApO2Npbi50aWUoMCk7Y291dC50aWUoMCk7c3JhbmQodGltZSgwKSk7IAoJaWYoZm9wZW4oSU5QVVQsInIiKSkKCXsKCQlmcmVvcGVuKElOUFVUICwiciIsc3RkaW4pOwoJCWZyZW9wZW4oT1VUUFVULCJ3IixzdGRvdXQpOwoJfQoJaWYobXR0KWNpbj4+dGVzdDsKCglGT1IoaSwxLHRlc3QpCgl7CgkJZG9jKCkgOyAKCQlzdWIxOjp4dWx5KCkgOyAKCX0KfQ==