#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define MAX 160100
int height[MAX], excess[MAX];
int s, t, N;
class Edge{
public:
int from, to, cap, flow, res_flow, index;
Edge(int from, int to, int cap, int flow, int res_flow, int index):
from(from),to(to),cap(cap),flow(flow),res_flow(res_flow),index(index){
}
};
vector<vector<Edge> > G;
void addEdge(int from, int to, int cap){
Edge ed(from, to, cap, 0, cap, G[to].size());
Edge ed_rev(to, from, 0, 0, 0, G[from].size());
G[from].pb(ed);
G[to].pb(ed_rev);
}
void initializePreflow(){
memset(height, 0, sizeof(height));
height[s] = N;
memset(excess, 0, sizeof(excess));
int v;
for(int i=0; i<G[s].size(); i++){
v = G[s][i].to;
G[s][i].flow = G[s][i].cap;
G[v][G[s][i].index].flow = -G[s][i].cap;
excess[v] = G[s][i].cap;
excess[s] -= G[s][i].cap;
G[s][i].res_flow = G[s][i].cap - G[s][i].flow;
G[v][G[s][i].index].res_flow = G[v][G[s][i].index].cap - G[v][G[s][i].index].flow;
}
}
void push(int u, int i){
int amt = min(excess[u], G[u][i].res_flow);
G[u][i].flow = G[u][i].flow + amt;
int v = G[u][i].to;
G[v][G[u][i].index].flow = -G[u][i].flow;
excess[u] = excess[u]-amt;
excess[v] = excess[v]+amt;
G[u][i].res_flow = G[u][i].cap - G[u][i].flow;
G[v][G[u][i].index].res_flow = G[v][G[u][i].index].cap - G[v][G[u][i].index].flow;
}
void displayG(){
for(int i=0;i<N;i++){
cout << i << ": ";
for(int j=0;j<G[i].size();j++){
cout << "-> (" << G[i][j].to << "," << G[i][j].cap << ") ";
}
cout << endl;
}
}
int maxFlow(int s, int t){
initializePreflow();
queue<int> q;
int active[N];
memset(active,0,sizeof(active));
for(int i=0;i<G[s].size();i++){
if(G[s][i].to != t){
q.push(G[s][i].to);
active[G[s][i].to] = 1;
}
}
int u,minimum;
while(q.size()!=0){
u = q.front();
//cout << "processing: " << u << "...\n";
minimum = -1;
for(int i=0; i<G[u].size() && excess[u]>0; i++){
int v = G[u][i].to;
if(G[u][i].res_flow>0){
if(height[u]>height[v]){
push(u,i);
if(!active[v] && v!=s && v!=t){
active[v] = 1;
q.push(v);
}
} else if(minimum==-1){
minimum = height[v];
} else{
minimum = min(minimum, height[v]);
}
}
}
if(excess[u]!=0)
height[u] = 1+minimum;
else{
active[u] = 0;
q.pop();
}
}
return excess[t];
/*
int tot_flow = 0;
for(int i=0; i<G[s].size();i++){
tot_flow += G[s][i].flow;
}
return tot_flow;
*/
}
vector<int> vA, primes;
vector<int> middle;
map<int,int> gL, gR;
const int limit = 31650; //sqrt(10^9)
const int max_factor = 10;
const int inf = 1000000000;
bool is_prime[limit+1];
int gcd(int a, int b){
if(b==0)
return a;
return gcd(b,a%b);
}
vector<int> factorize(int x){
vector<int> ret;
for(int i=0; i<primes.size() && primes[i]*primes[i]<=x; i++){
int d = primes[i];
if(x%d==0){
ret.pb(d);
middle.pb(d);
while(x%d==0){
x /= d;
}
}
}
if(x>1){
ret.pb(x);
middle.pb(x);
}
return ret;
}
void fillPrimes(){
memset(is_prime, true, sizeof(is_prime));
for(int i=2;i<=limit;i++){
if(is_prime[i]){
primes.pb(i);
for(int j=i*i; j<=limit;j+=i){
is_prime[j] = false;
}
}
}
}
int main(){
fillPrimes();
int tcs;
cin >> tcs;
while(tcs--){
int n;
cin >> n;
gL.clear(); gR.clear();
vA.clear();
int x;
for(int i = 0; i < n; i++){
cin >> x;
vA.push_back(x);
}
int g;
for(int j = 0; j < n; j++){
cin >> x;
for(int i = 0; i < n; i++){
if(vA[i] < x){ // Left
g = gcd(vA[i],x);
if(g > 1){
if(!gL.count(g)){
gL[g] = 0;
}
gL[g]++;
}
}
else if(vA[i] > x){ // Right
g = gcd(vA[i],x);
if(g > 1){
if(!gR.count(g)){
gR[g] = 0;
}
gR[g]++;
}
}
}
}
map<int,int>::const_iterator it, it2;
int id, id2;
vector<vector<int> > left_factors, right_factors;
middle.clear();
for(it = gL.begin(), id = 1; it != gL.end(); ++it, id++){
//addEdge(source, id, it->second);
left_factors.pb(factorize(it->first)); //this also adds them to middle
}
for(it = gR.begin(), id = gL.size()+1;it != gR.end(); it++, id++){
//addEdge(id, target, it->second);
right_factors.pb(factorize(it->first)); //this also adds them to middle
}
sort(middle.begin(), middle.end()); // sorts the middle nodes
middle.erase( unique(middle.begin(), middle.end()), middle.end() ); // removes duplicates and erases the space
G.clear();
N = gL.size()+middle.size()+gR.size()+2;
G.resize(N);
int source = 0, target = N-1;
s = source;
t = target;
int sz,k, ind;
for(it = gL.begin(), id = 1, ind = 0; it != gL.end(); ++it, id++, ind++){
addEdge(source, id, it->second);
sz = left_factors[ind].size();
for(int j=0;j<sz;j++){
k = lower_bound(middle.begin(),middle.end(),it->first)-middle.begin();
addEdge(id,gL.size()+k+1,inf);
}
}
for(it = gR.begin(), id = gL.size()+middle.size()+1, ind = 0;it != gR.end(); it++, id++, ind++){
addEdge(id, target, it->second);
sz = right_factors[ind].size();
for(int j=0;j<sz;j++){
k = lower_bound(middle.begin(),middle.end(),it->first)-middle.begin();
addEdge(gL.size()+k+1, id, inf);
}
}
//displayG();
cout << maxFlow(source, target) << endl;
}
return 0;
}
/*
N = 7;
s = 0;
t = 6;
G.resize(N);
addEdge(0,1,6);
addEdge(0,3,8);
addEdge(1,3,1);
addEdge(1,2,6);
addEdge(3,4,3);
addEdge(4,1,6);
addEdge(4,5,6);
addEdge(2,4,2);
addEdge(2,5,2);
addEdge(2,6,3);
addEdge(5,6,6);
//displayG();
N = 7;
s = 0;
t = 6;
G.resize(7);
addEdge(0,1,3);
addEdge(1,3,3);
addEdge(3,6,3);
addEdge(0,2,1);
addEdge(4,6,1);
addEdge(5,6,1);
cout << maxFlow(s,t) << endl;
*/
I2luY2x1ZGUgPGJpdHMvc3RkYysrLmg+CnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIHBiIHB1c2hfYmFjawojZGVmaW5lIE1BWCAxNjAxMDAKCmludCBoZWlnaHRbTUFYXSwgZXhjZXNzW01BWF07CmludCBzLCB0LCBOOwoKY2xhc3MgRWRnZXsKcHVibGljOgoJaW50IGZyb20sIHRvLCBjYXAsIGZsb3csIHJlc19mbG93LCBpbmRleDsKCglFZGdlKGludCBmcm9tLCBpbnQgdG8sIGludCBjYXAsIGludCBmbG93LCBpbnQgcmVzX2Zsb3csIGludCBpbmRleCk6CgkJZnJvbShmcm9tKSx0byh0byksY2FwKGNhcCksZmxvdyhmbG93KSxyZXNfZmxvdyhyZXNfZmxvdyksaW5kZXgoaW5kZXgpewoJfQp9OwoKdmVjdG9yPHZlY3RvcjxFZGdlPiA+IEc7Cgp2b2lkIGFkZEVkZ2UoaW50IGZyb20sIGludCB0bywgaW50IGNhcCl7CglFZGdlIGVkKGZyb20sIHRvLCBjYXAsIDAsIGNhcCwgR1t0b10uc2l6ZSgpKTsKCUVkZ2UgZWRfcmV2KHRvLCBmcm9tLCAwLCAwLCAwLCBHW2Zyb21dLnNpemUoKSk7CglHW2Zyb21dLnBiKGVkKTsKCUdbdG9dLnBiKGVkX3Jldik7Cn0KCnZvaWQgaW5pdGlhbGl6ZVByZWZsb3coKXsKCW1lbXNldChoZWlnaHQsIDAsIHNpemVvZihoZWlnaHQpKTsKCWhlaWdodFtzXSA9IE47CgltZW1zZXQoZXhjZXNzLCAwLCBzaXplb2YoZXhjZXNzKSk7CglpbnQgdjsKCWZvcihpbnQgaT0wOyBpPEdbc10uc2l6ZSgpOyBpKyspewoJCXYgPSBHW3NdW2ldLnRvOwoJCUdbc11baV0uZmxvdyA9IEdbc11baV0uY2FwOwoJCUdbdl1bR1tzXVtpXS5pbmRleF0uZmxvdyA9IC1HW3NdW2ldLmNhcDsKCgkJZXhjZXNzW3ZdID0gR1tzXVtpXS5jYXA7CgkJZXhjZXNzW3NdIC09IEdbc11baV0uY2FwOwoKCQlHW3NdW2ldLnJlc19mbG93ID0gR1tzXVtpXS5jYXAgLSBHW3NdW2ldLmZsb3c7CgkJR1t2XVtHW3NdW2ldLmluZGV4XS5yZXNfZmxvdyA9IEdbdl1bR1tzXVtpXS5pbmRleF0uY2FwIC0gR1t2XVtHW3NdW2ldLmluZGV4XS5mbG93OwoJfQp9Cgp2b2lkIHB1c2goaW50IHUsIGludCBpKXsKCWludCBhbXQgPSBtaW4oZXhjZXNzW3VdLCBHW3VdW2ldLnJlc19mbG93KTsKCUdbdV1baV0uZmxvdyA9IEdbdV1baV0uZmxvdyArIGFtdDsKCWludCB2ID0gR1t1XVtpXS50bzsKCUdbdl1bR1t1XVtpXS5pbmRleF0uZmxvdyA9IC1HW3VdW2ldLmZsb3c7CglleGNlc3NbdV0gPSBleGNlc3NbdV0tYW10OwoJZXhjZXNzW3ZdID0gZXhjZXNzW3ZdK2FtdDsKCUdbdV1baV0ucmVzX2Zsb3cgPSBHW3VdW2ldLmNhcCAtIEdbdV1baV0uZmxvdzsKCUdbdl1bR1t1XVtpXS5pbmRleF0ucmVzX2Zsb3cgPSBHW3ZdW0dbdV1baV0uaW5kZXhdLmNhcCAtIEdbdl1bR1t1XVtpXS5pbmRleF0uZmxvdzsKfQoKdm9pZCBkaXNwbGF5RygpewoJZm9yKGludCBpPTA7aTxOO2krKyl7CgkJY291dCA8PCBpIDw8ICI6ICI7CgkJZm9yKGludCBqPTA7ajxHW2ldLnNpemUoKTtqKyspewoJCQljb3V0IDw8ICItPiAoIiA8PCBHW2ldW2pdLnRvIDw8ICIsIiA8PCBHW2ldW2pdLmNhcCA8PCAiKSAiOwoJCX0KCQljb3V0IDw8IGVuZGw7Cgl9Cn0KCmludCBtYXhGbG93KGludCBzLCBpbnQgdCl7Cglpbml0aWFsaXplUHJlZmxvdygpOwoJcXVldWU8aW50PiBxOwoJaW50IGFjdGl2ZVtOXTsKCW1lbXNldChhY3RpdmUsMCxzaXplb2YoYWN0aXZlKSk7Cglmb3IoaW50IGk9MDtpPEdbc10uc2l6ZSgpO2krKyl7CgkJaWYoR1tzXVtpXS50byAhPSB0KXsKCQkJcS5wdXNoKEdbc11baV0udG8pOwoJCQlhY3RpdmVbR1tzXVtpXS50b10gPSAxOwoJCX0KCX0KCWludCB1LG1pbmltdW07Cgl3aGlsZShxLnNpemUoKSE9MCl7CgkJdSA9IHEuZnJvbnQoKTsKCQkvL2NvdXQgPDwgInByb2Nlc3Npbmc6ICIgPDwgdSA8PCAiLi4uXG4iOwoJCW1pbmltdW0gPSAtMTsKCQlmb3IoaW50IGk9MDsgaTxHW3VdLnNpemUoKSAmJiBleGNlc3NbdV0+MDsgaSsrKXsKCQkJaW50IHYgPSBHW3VdW2ldLnRvOwoJCQlpZihHW3VdW2ldLnJlc19mbG93PjApewoJCQkJaWYoaGVpZ2h0W3VdPmhlaWdodFt2XSl7CgkJCQkJcHVzaCh1LGkpOwoJCQkJCWlmKCFhY3RpdmVbdl0gJiYgdiE9cyAmJiB2IT10KXsKCQkJCQkJYWN0aXZlW3ZdID0gMTsKCQkJCQkJcS5wdXNoKHYpOwoJCQkJCX0KCQkJCX0gZWxzZSBpZihtaW5pbXVtPT0tMSl7CgkJCQkJbWluaW11bSA9IGhlaWdodFt2XTsKCQkJCX0gZWxzZXsKCQkJCQltaW5pbXVtID0gbWluKG1pbmltdW0sIGhlaWdodFt2XSk7CgkJCQl9CgkJCX0KCQl9CgkJaWYoZXhjZXNzW3VdIT0wKQoJCQloZWlnaHRbdV0gPSAxK21pbmltdW07CgkJZWxzZXsKCQkJYWN0aXZlW3VdID0gMDsKCQkJcS5wb3AoKTsKCQl9Cgl9CglyZXR1cm4gZXhjZXNzW3RdOwoJLyoKCWludCB0b3RfZmxvdyA9IDA7Cglmb3IoaW50IGk9MDsgaTxHW3NdLnNpemUoKTtpKyspewoJCXRvdF9mbG93ICs9IEdbc11baV0uZmxvdzsKCX0KCXJldHVybiB0b3RfZmxvdzsKCSovCn0KCnZlY3RvcjxpbnQ+IHZBLCBwcmltZXM7CnZlY3RvcjxpbnQ+IG1pZGRsZTsKbWFwPGludCxpbnQ+IGdMLCBnUjsKCmNvbnN0IGludCBsaW1pdCA9IDMxNjUwOyAvL3NxcnQoMTBeOSkKY29uc3QgaW50IG1heF9mYWN0b3IgPSAxMDsKY29uc3QgaW50IGluZiA9IDEwMDAwMDAwMDA7CmJvb2wgaXNfcHJpbWVbbGltaXQrMV07CgoKaW50IGdjZChpbnQgYSwgaW50IGIpewoJaWYoYj09MCkKCQlyZXR1cm4gYTsKCXJldHVybiBnY2QoYixhJWIpOwp9Cgp2ZWN0b3I8aW50PiBmYWN0b3JpemUoaW50IHgpewoJdmVjdG9yPGludD4gcmV0OwoJZm9yKGludCBpPTA7IGk8cHJpbWVzLnNpemUoKSAmJiBwcmltZXNbaV0qcHJpbWVzW2ldPD14OyBpKyspewoJCWludCBkID0gcHJpbWVzW2ldOwoJCWlmKHglZD09MCl7CgkJCXJldC5wYihkKTsKCQkJbWlkZGxlLnBiKGQpOwoJCQl3aGlsZSh4JWQ9PTApewoJCQkJeCAvPSBkOwoJCQl9CgkJfQoJfQoJaWYoeD4xKXsKCQlyZXQucGIoeCk7CgkJbWlkZGxlLnBiKHgpOwoJfQoJcmV0dXJuIHJldDsKfQoKdm9pZCBmaWxsUHJpbWVzKCl7CgltZW1zZXQoaXNfcHJpbWUsIHRydWUsIHNpemVvZihpc19wcmltZSkpOwoJZm9yKGludCBpPTI7aTw9bGltaXQ7aSsrKXsKCQlpZihpc19wcmltZVtpXSl7CgkJCXByaW1lcy5wYihpKTsKCQkJZm9yKGludCBqPWkqaTsgajw9bGltaXQ7ais9aSl7CgkJCQlpc19wcmltZVtqXSA9IGZhbHNlOwoJCQl9CgkJfQoJfQp9CgppbnQgbWFpbigpewoKCWZpbGxQcmltZXMoKTsKCWludCB0Y3M7CgljaW4gPj4gdGNzOwoJd2hpbGUodGNzLS0pewoJCWludCBuOwoJCWNpbiA+PiBuOwogICAgCQogICAgCWdMLmNsZWFyKCk7IGdSLmNsZWFyKCk7CiAgICAJdkEuY2xlYXIoKTsKICAgIAkKICAgIAlpbnQgeDsKICAgIAlmb3IoaW50IGkgPSAwOyBpIDwgbjsgaSsrKXsKICAgICAgCQljaW4gPj4geDsKICAgICAgCQl2QS5wdXNoX2JhY2soeCk7CiAgICAJfQoKICAgIAlpbnQgZzsKICAgIAlmb3IoaW50IGogPSAwOyBqIDwgbjsgaisrKXsKICAgIAkJY2luID4+IHg7CiAgICAJCWZvcihpbnQgaSA9IDA7IGkgPCBuOyBpKyspewogICAgCQkJaWYodkFbaV0gPCB4KXsgLy8gTGVmdAogICAgICAgICAgCQkJZyA9IGdjZCh2QVtpXSx4KTsKICAgICAgICAgIAkJCWlmKGcgPiAxKXsKICAgICAgICAgICAgCQkJaWYoIWdMLmNvdW50KGcpKXsKICAgICAgICAgICAgICAJCQkJZ0xbZ10gPSAwOwogICAgICAgICAgICAJCQl9CiAgICAgICAgICAgIAkJCWdMW2ddKys7CiAgICAgICAgICAJCQl9CiAgICAgICAgCQl9CiAgICAgICAgCQllbHNlIGlmKHZBW2ldID4geCl7IC8vIFJpZ2h0CiAgICAgICAgICAJCQlnID0gZ2NkKHZBW2ldLHgpOwogICAgICAgICAgCQkJaWYoZyA+IDEpewogICAgICAgICAgICAJCQlpZighZ1IuY291bnQoZykpewogICAgICAgICAgICAgIAkJCQlnUltnXSA9IDA7CiAgICAgICAgICAgIAkJCX0KICAgICAgICAgICAgCQkJZ1JbZ10rKzsKICAgICAgICAgIAkJCX0KICAgICAgICAJCX0KICAgICAgCQl9CiAgICAJfQoKICAgIAltYXA8aW50LGludD46OmNvbnN0X2l0ZXJhdG9yIGl0LCBpdDI7CiAgICAJaW50IGlkLCBpZDI7CgogICAgCXZlY3Rvcjx2ZWN0b3I8aW50PiA+IGxlZnRfZmFjdG9ycywgcmlnaHRfZmFjdG9yczsKICAgIAltaWRkbGUuY2xlYXIoKTsKCiAgICAJZm9yKGl0ID0gZ0wuYmVnaW4oKSwgaWQgPSAxOyBpdCAhPSBnTC5lbmQoKTsgKytpdCwgaWQrKyl7CiAgICAgIAkJLy9hZGRFZGdlKHNvdXJjZSwgaWQsIGl0LT5zZWNvbmQpOwogICAgICAJCWxlZnRfZmFjdG9ycy5wYihmYWN0b3JpemUoaXQtPmZpcnN0KSk7IC8vdGhpcyBhbHNvIGFkZHMgdGhlbSB0byBtaWRkbGUKCiAgICAJfQogICAgCWZvcihpdCA9IGdSLmJlZ2luKCksIGlkID0gZ0wuc2l6ZSgpKzE7aXQgIT0gZ1IuZW5kKCk7IGl0KyssIGlkKyspewogICAgICAJCS8vYWRkRWRnZShpZCwgdGFyZ2V0LCBpdC0+c2Vjb25kKTsKICAgICAgCQlyaWdodF9mYWN0b3JzLnBiKGZhY3Rvcml6ZShpdC0+Zmlyc3QpKTsgLy90aGlzIGFsc28gYWRkcyB0aGVtIHRvIG1pZGRsZQogICAgCX0KICAgIAogICAgCXNvcnQobWlkZGxlLmJlZ2luKCksIG1pZGRsZS5lbmQoKSk7IC8vIHNvcnRzIHRoZSBtaWRkbGUgbm9kZXMKICAgIAltaWRkbGUuZXJhc2UoIHVuaXF1ZShtaWRkbGUuYmVnaW4oKSwgbWlkZGxlLmVuZCgpKSwgbWlkZGxlLmVuZCgpICk7IC8vIHJlbW92ZXMgZHVwbGljYXRlcyBhbmQgZXJhc2VzIHRoZSBzcGFjZQoKICAgIAlHLmNsZWFyKCk7CiAgICAJTiA9IGdMLnNpemUoKSttaWRkbGUuc2l6ZSgpK2dSLnNpemUoKSsyOwogICAgCUcucmVzaXplKE4pOwoJaW50IHNvdXJjZSA9IDAsIHRhcmdldCA9IE4tMTsKCXMgPSBzb3VyY2U7Cgl0ID0gdGFyZ2V0OwkKCWludCBzeixrLCBpbmQ7CiAgICAJZm9yKGl0ID0gZ0wuYmVnaW4oKSwgaWQgPSAxLCBpbmQgPSAwOyBpdCAhPSBnTC5lbmQoKTsgKytpdCwgaWQrKywgaW5kKyspewogICAgICAJCWFkZEVkZ2Uoc291cmNlLCBpZCwgaXQtPnNlY29uZCk7CiAgICAgIAkJc3ogPSBsZWZ0X2ZhY3RvcnNbaW5kXS5zaXplKCk7CiAgICAgIAkJZm9yKGludCBqPTA7ajxzejtqKyspewogICAgICAJCQlrID0gbG93ZXJfYm91bmQobWlkZGxlLmJlZ2luKCksbWlkZGxlLmVuZCgpLGl0LT5maXJzdCktbWlkZGxlLmJlZ2luKCk7CiAgICAgIAkJCWFkZEVkZ2UoaWQsZ0wuc2l6ZSgpK2srMSxpbmYpOwogICAgICAJCX0KICAgIAl9CiAgICAJCiAgICAJZm9yKGl0ID0gZ1IuYmVnaW4oKSwgaWQgPSBnTC5zaXplKCkrbWlkZGxlLnNpemUoKSsxLCBpbmQgPSAwO2l0ICE9IGdSLmVuZCgpOyBpdCsrLCBpZCsrLCBpbmQrKyl7CiAgICAgIAkJYWRkRWRnZShpZCwgdGFyZ2V0LCBpdC0+c2Vjb25kKTsKICAgICAgCQlzeiA9IHJpZ2h0X2ZhY3RvcnNbaW5kXS5zaXplKCk7CiAgICAgIAkJZm9yKGludCBqPTA7ajxzejtqKyspewogICAgICAJCQlrID0gbG93ZXJfYm91bmQobWlkZGxlLmJlZ2luKCksbWlkZGxlLmVuZCgpLGl0LT5maXJzdCktbWlkZGxlLmJlZ2luKCk7CiAgICAgIAkJCWFkZEVkZ2UoZ0wuc2l6ZSgpK2srMSwgaWQsIGluZik7CiAgICAgIAkJfQogICAgCX0KICAgIAkKCiAgICAJLy9kaXNwbGF5RygpOwoKICAgIAljb3V0IDw8IG1heEZsb3coc291cmNlLCB0YXJnZXQpIDw8IGVuZGw7Cgl9CglyZXR1cm4gMDsKfQoKLyoJCglOID0gNzsKCXMgPSAwOwoJdCA9IDY7CglHLnJlc2l6ZShOKTsKCWFkZEVkZ2UoMCwxLDYpOwoJYWRkRWRnZSgwLDMsOCk7CglhZGRFZGdlKDEsMywxKTsKCWFkZEVkZ2UoMSwyLDYpOwoJYWRkRWRnZSgzLDQsMyk7CglhZGRFZGdlKDQsMSw2KTsKCWFkZEVkZ2UoNCw1LDYpOwoJYWRkRWRnZSgyLDQsMik7CglhZGRFZGdlKDIsNSwyKTsKCWFkZEVkZ2UoMiw2LDMpOwoJYWRkRWRnZSg1LDYsNik7CgoJLy9kaXNwbGF5RygpOwoKCU4gPSA3OwoJcyA9IDA7Cgl0ID0gNjsKCUcucmVzaXplKDcpOwoJYWRkRWRnZSgwLDEsMyk7CglhZGRFZGdlKDEsMywzKTsKCWFkZEVkZ2UoMyw2LDMpOwoJYWRkRWRnZSgwLDIsMSk7CglhZGRFZGdlKDQsNiwxKTsKCWFkZEVkZ2UoNSw2LDEpOwoJY291dCA8PCBtYXhGbG93KHMsdCkgPDwgZW5kbDsKKi8=