/*
* cd.cpp
*
* Created on: 2012-6-25
* Author: mac
*/
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <iostream>
#include <climits>
#include <numeric>
#include <string>
#include <cassert>
#define foreach(e,x) for(__typeof(x.begin()) e=x.begin();e!=x.end();++e)
#define REP(i,n) for(int i=0;i<n;++i)
using namespace std;
//2,3,...,A
struct Card {
int p, r;
Card() {
}
Card(int p, int r) {
this->p = p;
this->r = r;
}
bool operator<(const Card&o) const {
return p != o.p ? p < o.p : r < o.r;
}
int id() {
return (p - 2) * 4 + r;
}
void read() {
cin >> p >> r;
if (p == 1)
p = 14;
r = 4 - r;
}
};
void show(int who) {
for (int i = 0; i < 5; ++i) {
cout << who % 52 << " ";
who /= 52;
}
cout << endl;
}
struct Hand {
int type, dot, col, who;
Hand() {
}
Hand(int type, int dot, int col, int who) {
this->type = type;
this->dot = dot;
this->col = col;
this->who = who;
}
bool operator<(const Hand&o) const {
if (type != o.type)
return type > o.type;
if (dot != o.dot)
return dot < o.dot;
if (col != o.col)
return col < o.col;
return false;
}
};
Card cards[5];
bool isStright(int&dot, int&col) {
bool ok = true;
for (int i = 1; i < 5; ++i) {
if (cards[i].p != cards[0].p + i)
ok = false;
}
if (ok) {
dot = cards[0].p, col = 0;
for (int i = 5 - 1; i >= 0; --i) {
col = col * 4 + cards[i].r;
}
return true;
}
//check A2345
if (cards[4].p == 14) {
ok = true;
for (int i = 0; i < 4; ++i) {
if (cards[i].p != i + 2)
ok = false;
}
if (ok) { //good! A2345
dot = 1, col = 0;
for (int i = 4 - 1; i >= 0; --i) {
col = col * 4 + cards[i].r;
}
col = col * 4 + cards[4].r;
return true;
}
}
return false;
}
bool isFlush() {
for (int i = 1; i < 5; ++i) {
if (cards[i].r != cards[0].r)
return false;
}
return true;
}
string makeIt(int&dot, int&col) {
pair<int, Card> ps[5];
string cnt = "";
for (int i = 0, j; i < 5; i = j) {
for (j = i; j < 5 && cards[j].p == cards[i].p; ++j)
;
cnt += char('0' + j - i);
for (int k = i; k < j; ++k) {
ps[k] = make_pair(j - i, cards[k]);
}
}
sort(ps, ps + 5);
dot = col = 0;
for (int i = 5 - 1; i >= 0; --i) {
dot = dot * 13 + ps[i].second.p - 2;
col = col * 4 + ps[i].second.r;
}
sort(cnt.rbegin(), cnt.rend());
return cnt;
}
void makeItSorted(int&dot, int&col) {
dot = 0, col = 0;
for (int i = 5 - 1; i >= 0; --i) {
dot = dot * 13 + cards[i].p - 2;
col = col * 4 + cards[i].r;
}
}
Hand process() {
sort(cards, cards + 5);
int dot, col, who = 0;
for (int i = 0; i < 5; ++i) {
who = who * 52 + cards[i].id();
}
bool isS = isStright(dot, col);
bool isF = isFlush();
int type;
int dotG, colG;
string cnt = makeIt(dotG, colG);
if (isS && isF) {
type = 1;
return Hand(type, dot, col, who);
}
if (cnt == "41") {
type = 2;
return Hand(type, dotG, colG, who);
}
if (cnt == "32") {
type = 3;
return Hand(type, dotG, colG, who);
}
int dotS, colS;
makeItSorted(dotS, colS);
if (isF) {
type = 4;
return Hand(type, dotS, colS, who);
}
if (isS) {
type = 5;
return Hand(type, dot, col, who);
}
if (cnt == "311") {
type = 6;
return Hand(type, dotG, colG, who);
}
if (cnt == "221") {
type = 7;
return Hand(type, dotG, colG, who);
}
if (cnt == "2111") {
type = 8;
return Hand(type, dotG, colG, who);
}
type = 9;
return Hand(type, dotS, colS, who);
}
typedef long long int64;
bool myCard[52] = { }, youCard[52] = { };
int n;
void readCardSet(int n, bool cardSet[]) {
Card c;
for (int i = 0; i < n; ++i) {
c.read();
cardSet[c.id()] = true;
}
}
Card allCard[52];
Card cur[5];
const int MAX_HANDS = 3000000 + 10;
Hand hands[MAX_HANDS];
int nHands = 0;
bool check(int who, bool cardSet[], int n) {
int cnt = 0;
for (int i = 0; i < 5; ++i) {
int x = who % 52;
who /= 52;
if (cardSet[x])
++cnt;
}
return cnt == n;
}
void dfs(int u, int who, int cnt) { //search all cardSet combination
if (u == 52) {
if (cnt == 5 && (check(who, myCard, n) || check(who, youCard, n - 1))) {
memcpy(cards, cur, sizeof cur);
hands[nHands++] = process();
}
return;
}
dfs(u + 1, who, cnt);
if (cnt < 5) {
cur[cnt] = allCard[u];
dfs(u + 1, who * 52 + u, cnt + 1);
}
}
bool check(const Hand&h, bool cardSet[], int n) {
return check(h.who, cardSet, n);
}
typedef long long int64;
int64 comb(int n, int m) {
int64 ret = 1;
for (int i = 0; i < m; ++i) {
ret *= n - i;
ret /= i + 1;
}
return ret;
}
int id[5];
int64 A, B;
int dp[6][60]; //rem,max
void prepare() {
memset(dp, 0, sizeof dp);
fill(dp[0], dp[0] + 60, 1);
for (int rem = 1; rem <= 5; ++rem) {
for (int mx = 1; mx <= 52; ++mx) {
dp[rem][mx] += dp[rem][mx - 1] + dp[rem - 1][mx - 1];
}
}
}
int curv[5];
int mp[4000000];
int eval(int v[], int n) {
int code = 0;
for (int i = 0; i < n; ++i) {
code += dp[i][52];
}
for (int i = 0; i < n; ++i)
code += dp[n - i][v[i]];
return code;
}
void dfs1(int u, int cnt) {
if (u == 5) {
int cd = eval(curv, cnt);
A += (cnt % 2 == 0 ? 1 : -1) * mp[cd];
return;
}
dfs1(u + 1, cnt);
curv[cnt] = id[u];
dfs1(u + 1, cnt + 1);
}
void dfs2(int u, int cnt) {
if (u == 5) {
int cd = eval(curv, cnt);
mp[cd]++;
return;
}
dfs2(u + 1, cnt);
curv[cnt] = id[u];
dfs2(u + 1, cnt + 1);
}
int main() {
cin >> n;
readCardSet(n, myCard);
readCardSet(n - 1, youCard);
for (int i = 2; i <= 14; ++i) {
for (int j = 0; j < 4; ++j) {
Card c(i, j);
allCard[c.id()] = c;
}
}
dfs(0, 0, 0);
sort(hands, hands + nHands);
int rem = 52 - n - (n - 1);
A = 0, B = 1;
B *= comb(rem, 5 - n);
rem -= 5 - n;
B *= comb(rem, 5 - (n - 1));
prepare();
for (int i = 0; i < nHands; ++i) {
Hand&h = hands[i];
if (check(h, myCard, n)) {
int who = h.who;
for (int j = 0; j < 5; ++j) {
id[j] = who % 52;
who /= 52;
}
sort(id, id + 5);
reverse(id, id + 5);
dfs1(0, 0);
}
if (check(h, youCard, n - 1)) {
int who = h.who;
for (int j = 0; j < 5; ++j) {
id[j] = who % 52;
who /= 52;
}
sort(id, id + 5);
reverse(id, id + 5);
dfs2(0, 0);
}
}
int64 G = __gcd(A, B);
A /= G, B /= G;
cout << A << "/" << B << endl;
return 0;
}
LyoKICogY2QuY3BwCiAqCiAqICBDcmVhdGVkIG9uOiAyMDEyLTYtMjUKICogICAgICBBdXRob3I6IG1hYwogKi8KI2luY2x1ZGUgPGNzdGRpbz4KI2luY2x1ZGUgPGNzdHJpbmc+CiNpbmNsdWRlIDxhbGdvcml0aG0+CiNpbmNsdWRlIDxpb3N0cmVhbT4KI2luY2x1ZGUgPGNsaW1pdHM+CiNpbmNsdWRlIDxudW1lcmljPgojaW5jbHVkZSA8c3RyaW5nPgojaW5jbHVkZSA8Y2Fzc2VydD4KI2RlZmluZSBmb3JlYWNoKGUseCkgZm9yKF9fdHlwZW9mKHguYmVnaW4oKSkgZT14LmJlZ2luKCk7ZSE9eC5lbmQoKTsrK2UpCiNkZWZpbmUgUkVQKGksbikgZm9yKGludCBpPTA7aTxuOysraSkKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCi8vMiwzLC4uLixBCgpzdHJ1Y3QgQ2FyZCB7CglpbnQgcCwgcjsKCUNhcmQoKSB7Cgl9CglDYXJkKGludCBwLCBpbnQgcikgewoJCXRoaXMtPnAgPSBwOwoJCXRoaXMtPnIgPSByOwoJfQoJYm9vbCBvcGVyYXRvcjwoY29uc3QgQ2FyZCZvKSBjb25zdCB7CgkJcmV0dXJuIHAgIT0gby5wID8gcCA8IG8ucCA6IHIgPCBvLnI7Cgl9CgoJaW50IGlkKCkgewoJCXJldHVybiAocCAtIDIpICogNCArIHI7Cgl9CgoJdm9pZCByZWFkKCkgewoJCWNpbiA+PiBwID4+IHI7CgkJaWYgKHAgPT0gMSkKCQkJcCA9IDE0OwoJCXIgPSA0IC0gcjsKCX0KfTsKCnZvaWQgc2hvdyhpbnQgd2hvKSB7Cglmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewoJCWNvdXQgPDwgd2hvICUgNTIgPDwgIiAiOwoJCXdobyAvPSA1MjsKCX0KCWNvdXQgPDwgZW5kbDsKfQoKc3RydWN0IEhhbmQgewoJaW50IHR5cGUsIGRvdCwgY29sLCB3aG87CglIYW5kKCkgewoJfQoJSGFuZChpbnQgdHlwZSwgaW50IGRvdCwgaW50IGNvbCwgaW50IHdobykgewoJCXRoaXMtPnR5cGUgPSB0eXBlOwoJCXRoaXMtPmRvdCA9IGRvdDsKCQl0aGlzLT5jb2wgPSBjb2w7CgkJdGhpcy0+d2hvID0gd2hvOwoJfQoKCWJvb2wgb3BlcmF0b3I8KGNvbnN0IEhhbmQmbykgY29uc3QgewoJCWlmICh0eXBlICE9IG8udHlwZSkKCQkJcmV0dXJuIHR5cGUgPiBvLnR5cGU7CgkJaWYgKGRvdCAhPSBvLmRvdCkKCQkJcmV0dXJuIGRvdCA8IG8uZG90OwoJCWlmIChjb2wgIT0gby5jb2wpCgkJCXJldHVybiBjb2wgPCBvLmNvbDsKCQlyZXR1cm4gZmFsc2U7Cgl9Cn07CgpDYXJkIGNhcmRzWzVdOwoKYm9vbCBpc1N0cmlnaHQoaW50JmRvdCwgaW50JmNvbCkgewoJYm9vbCBvayA9IHRydWU7Cglmb3IgKGludCBpID0gMTsgaSA8IDU7ICsraSkgewoJCWlmIChjYXJkc1tpXS5wICE9IGNhcmRzWzBdLnAgKyBpKQoJCQlvayA9IGZhbHNlOwoJfQoJaWYgKG9rKSB7CgkJZG90ID0gY2FyZHNbMF0ucCwgY29sID0gMDsKCQlmb3IgKGludCBpID0gNSAtIDE7IGkgPj0gMDsgLS1pKSB7CgkJCWNvbCA9IGNvbCAqIDQgKyBjYXJkc1tpXS5yOwoJCX0KCQlyZXR1cm4gdHJ1ZTsKCX0KCgkvL2NoZWNrIEEyMzQ1CglpZiAoY2FyZHNbNF0ucCA9PSAxNCkgewoJCW9rID0gdHJ1ZTsKCQlmb3IgKGludCBpID0gMDsgaSA8IDQ7ICsraSkgewoJCQlpZiAoY2FyZHNbaV0ucCAhPSBpICsgMikKCQkJCW9rID0gZmFsc2U7CgkJfQoJCWlmIChvaykgeyAvL2dvb2QhIEEyMzQ1CgkJCWRvdCA9IDEsIGNvbCA9IDA7CgkJCWZvciAoaW50IGkgPSA0IC0gMTsgaSA+PSAwOyAtLWkpIHsKCQkJCWNvbCA9IGNvbCAqIDQgKyBjYXJkc1tpXS5yOwoJCQl9CgkJCWNvbCA9IGNvbCAqIDQgKyBjYXJkc1s0XS5yOwoJCQlyZXR1cm4gdHJ1ZTsKCQl9Cgl9CgoJcmV0dXJuIGZhbHNlOwp9Cgpib29sIGlzRmx1c2goKSB7Cglmb3IgKGludCBpID0gMTsgaSA8IDU7ICsraSkgewoJCWlmIChjYXJkc1tpXS5yICE9IGNhcmRzWzBdLnIpCgkJCXJldHVybiBmYWxzZTsKCX0KCXJldHVybiB0cnVlOwp9CgpzdHJpbmcgbWFrZUl0KGludCZkb3QsIGludCZjb2wpIHsKCXBhaXI8aW50LCBDYXJkPiBwc1s1XTsKCXN0cmluZyBjbnQgPSAiIjsKCWZvciAoaW50IGkgPSAwLCBqOyBpIDwgNTsgaSA9IGopIHsKCQlmb3IgKGogPSBpOyBqIDwgNSAmJiBjYXJkc1tqXS5wID09IGNhcmRzW2ldLnA7ICsraikKCQkJOwoJCWNudCArPSBjaGFyKCcwJyArIGogLSBpKTsKCQlmb3IgKGludCBrID0gaTsgayA8IGo7ICsraykgewoJCQlwc1trXSA9IG1ha2VfcGFpcihqIC0gaSwgY2FyZHNba10pOwoJCX0KCX0KCXNvcnQocHMsIHBzICsgNSk7CgoJZG90ID0gY29sID0gMDsKCglmb3IgKGludCBpID0gNSAtIDE7IGkgPj0gMDsgLS1pKSB7CgkJZG90ID0gZG90ICogMTMgKyBwc1tpXS5zZWNvbmQucCAtIDI7CgkJY29sID0gY29sICogNCArIHBzW2ldLnNlY29uZC5yOwoJfQoKCXNvcnQoY250LnJiZWdpbigpLCBjbnQucmVuZCgpKTsKCXJldHVybiBjbnQ7Cn0KCnZvaWQgbWFrZUl0U29ydGVkKGludCZkb3QsIGludCZjb2wpIHsKCWRvdCA9IDAsIGNvbCA9IDA7Cglmb3IgKGludCBpID0gNSAtIDE7IGkgPj0gMDsgLS1pKSB7CgkJZG90ID0gZG90ICogMTMgKyBjYXJkc1tpXS5wIC0gMjsKCQljb2wgPSBjb2wgKiA0ICsgY2FyZHNbaV0ucjsKCX0KfQoKSGFuZCBwcm9jZXNzKCkgewoJc29ydChjYXJkcywgY2FyZHMgKyA1KTsKCWludCBkb3QsIGNvbCwgd2hvID0gMDsKCglmb3IgKGludCBpID0gMDsgaSA8IDU7ICsraSkgewoJCXdobyA9IHdobyAqIDUyICsgY2FyZHNbaV0uaWQoKTsKCX0KCglib29sIGlzUyA9IGlzU3RyaWdodChkb3QsIGNvbCk7Cglib29sIGlzRiA9IGlzRmx1c2goKTsKCWludCB0eXBlOwoKCWludCBkb3RHLCBjb2xHOwoJc3RyaW5nIGNudCA9IG1ha2VJdChkb3RHLCBjb2xHKTsKCglpZiAoaXNTICYmIGlzRikgewoJCXR5cGUgPSAxOwoJCXJldHVybiBIYW5kKHR5cGUsIGRvdCwgY29sLCB3aG8pOwoJfQoKCWlmIChjbnQgPT0gIjQxIikgewoJCXR5cGUgPSAyOwoJCXJldHVybiBIYW5kKHR5cGUsIGRvdEcsIGNvbEcsIHdobyk7Cgl9CgoJaWYgKGNudCA9PSAiMzIiKSB7CgkJdHlwZSA9IDM7CgkJcmV0dXJuIEhhbmQodHlwZSwgZG90RywgY29sRywgd2hvKTsKCX0KCglpbnQgZG90UywgY29sUzsKCW1ha2VJdFNvcnRlZChkb3RTLCBjb2xTKTsKCglpZiAoaXNGKSB7CgkJdHlwZSA9IDQ7CgkJcmV0dXJuIEhhbmQodHlwZSwgZG90UywgY29sUywgd2hvKTsKCX0KCglpZiAoaXNTKSB7CgkJdHlwZSA9IDU7CgkJcmV0dXJuIEhhbmQodHlwZSwgZG90LCBjb2wsIHdobyk7Cgl9CgoJaWYgKGNudCA9PSAiMzExIikgewoJCXR5cGUgPSA2OwoJCXJldHVybiBIYW5kKHR5cGUsIGRvdEcsIGNvbEcsIHdobyk7Cgl9CgoJaWYgKGNudCA9PSAiMjIxIikgewoJCXR5cGUgPSA3OwoJCXJldHVybiBIYW5kKHR5cGUsIGRvdEcsIGNvbEcsIHdobyk7Cgl9CgoJaWYgKGNudCA9PSAiMjExMSIpIHsKCQl0eXBlID0gODsKCQlyZXR1cm4gSGFuZCh0eXBlLCBkb3RHLCBjb2xHLCB3aG8pOwoJfQoKCXR5cGUgPSA5OwoJcmV0dXJuIEhhbmQodHlwZSwgZG90UywgY29sUywgd2hvKTsKfQoKdHlwZWRlZiBsb25nIGxvbmcgaW50NjQ7Cgpib29sIG15Q2FyZFs1Ml0gPSB7IH0sIHlvdUNhcmRbNTJdID0geyB9OwppbnQgbjsKCnZvaWQgcmVhZENhcmRTZXQoaW50IG4sIGJvb2wgY2FyZFNldFtdKSB7CglDYXJkIGM7Cglmb3IgKGludCBpID0gMDsgaSA8IG47ICsraSkgewoJCWMucmVhZCgpOwoJCWNhcmRTZXRbYy5pZCgpXSA9IHRydWU7Cgl9Cn0KCkNhcmQgYWxsQ2FyZFs1Ml07CgpDYXJkIGN1cls1XTsKCmNvbnN0IGludCBNQVhfSEFORFMgPSAzMDAwMDAwICsgMTA7CgpIYW5kIGhhbmRzW01BWF9IQU5EU107CmludCBuSGFuZHMgPSAwOwoKYm9vbCBjaGVjayhpbnQgd2hvLCBib29sIGNhcmRTZXRbXSwgaW50IG4pIHsKCWludCBjbnQgPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCA1OyArK2kpIHsKCQlpbnQgeCA9IHdobyAlIDUyOwoJCXdobyAvPSA1MjsKCQlpZiAoY2FyZFNldFt4XSkKCQkJKytjbnQ7Cgl9CglyZXR1cm4gY250ID09IG47Cn0KCnZvaWQgZGZzKGludCB1LCBpbnQgd2hvLCBpbnQgY250KSB7IC8vc2VhcmNoIGFsbCBjYXJkU2V0IGNvbWJpbmF0aW9uCglpZiAodSA9PSA1MikgewoJCWlmIChjbnQgPT0gNSAmJiAoY2hlY2sod2hvLCBteUNhcmQsIG4pIHx8IGNoZWNrKHdobywgeW91Q2FyZCwgbiAtIDEpKSkgewoJCQltZW1jcHkoY2FyZHMsIGN1ciwgc2l6ZW9mIGN1cik7CgkJCWhhbmRzW25IYW5kcysrXSA9IHByb2Nlc3MoKTsKCQl9CgkJcmV0dXJuOwoJfQoJZGZzKHUgKyAxLCB3aG8sIGNudCk7CglpZiAoY250IDwgNSkgewoJCWN1cltjbnRdID0gYWxsQ2FyZFt1XTsKCQlkZnModSArIDEsIHdobyAqIDUyICsgdSwgY250ICsgMSk7Cgl9Cn0KCmJvb2wgY2hlY2soY29uc3QgSGFuZCZoLCBib29sIGNhcmRTZXRbXSwgaW50IG4pIHsKCXJldHVybiBjaGVjayhoLndobywgY2FyZFNldCwgbik7Cn0KCnR5cGVkZWYgbG9uZyBsb25nIGludDY0OwoKaW50NjQgY29tYihpbnQgbiwgaW50IG0pIHsKCWludDY0IHJldCA9IDE7Cglmb3IgKGludCBpID0gMDsgaSA8IG07ICsraSkgewoJCXJldCAqPSBuIC0gaTsKCQlyZXQgLz0gaSArIDE7Cgl9CglyZXR1cm4gcmV0Owp9CgppbnQgaWRbNV07CgppbnQ2NCBBLCBCOwoKaW50IGRwWzZdWzYwXTsgLy9yZW0sbWF4Cgp2b2lkIHByZXBhcmUoKSB7CgltZW1zZXQoZHAsIDAsIHNpemVvZiBkcCk7CglmaWxsKGRwWzBdLCBkcFswXSArIDYwLCAxKTsKCWZvciAoaW50IHJlbSA9IDE7IHJlbSA8PSA1OyArK3JlbSkgewoJCWZvciAoaW50IG14ID0gMTsgbXggPD0gNTI7ICsrbXgpIHsKCQkJZHBbcmVtXVtteF0gKz0gZHBbcmVtXVtteCAtIDFdICsgZHBbcmVtIC0gMV1bbXggLSAxXTsKCQl9Cgl9Cn0KCmludCBjdXJ2WzVdOwppbnQgbXBbNDAwMDAwMF07CgppbnQgZXZhbChpbnQgdltdLCBpbnQgbikgewoJaW50IGNvZGUgPSAwOwoJZm9yIChpbnQgaSA9IDA7IGkgPCBuOyArK2kpIHsKCQljb2RlICs9IGRwW2ldWzUyXTsKCX0KCWZvciAoaW50IGkgPSAwOyBpIDwgbjsgKytpKQoJCWNvZGUgKz0gZHBbbiAtIGldW3ZbaV1dOwoJcmV0dXJuIGNvZGU7Cn0KCnZvaWQgZGZzMShpbnQgdSwgaW50IGNudCkgewoJaWYgKHUgPT0gNSkgewoJCWludCBjZCA9IGV2YWwoY3VydiwgY250KTsKCQlBICs9IChjbnQgJSAyID09IDAgPyAxIDogLTEpICogbXBbY2RdOwoJCXJldHVybjsKCX0KCWRmczEodSArIDEsIGNudCk7CgljdXJ2W2NudF0gPSBpZFt1XTsKCWRmczEodSArIDEsIGNudCArIDEpOwp9Cgp2b2lkIGRmczIoaW50IHUsIGludCBjbnQpIHsKCWlmICh1ID09IDUpIHsKCQlpbnQgY2QgPSBldmFsKGN1cnYsIGNudCk7CgkJbXBbY2RdKys7CgkJcmV0dXJuOwoJfQoJZGZzMih1ICsgMSwgY250KTsKCWN1cnZbY250XSA9IGlkW3VdOwoJZGZzMih1ICsgMSwgY250ICsgMSk7Cn0KCmludCBtYWluKCkgewoJY2luID4+IG47CglyZWFkQ2FyZFNldChuLCBteUNhcmQpOwoJcmVhZENhcmRTZXQobiAtIDEsIHlvdUNhcmQpOwoKCWZvciAoaW50IGkgPSAyOyBpIDw9IDE0OyArK2kpIHsKCQlmb3IgKGludCBqID0gMDsgaiA8IDQ7ICsraikgewoJCQlDYXJkIGMoaSwgaik7CgkJCWFsbENhcmRbYy5pZCgpXSA9IGM7CgkJfQoJfQoKCWRmcygwLCAwLCAwKTsKCglzb3J0KGhhbmRzLCBoYW5kcyArIG5IYW5kcyk7CgoJaW50IHJlbSA9IDUyIC0gbiAtIChuIC0gMSk7CglBID0gMCwgQiA9IDE7CglCICo9IGNvbWIocmVtLCA1IC0gbik7CglyZW0gLT0gNSAtIG47CglCICo9IGNvbWIocmVtLCA1IC0gKG4gLSAxKSk7CgoJcHJlcGFyZSgpOwoKCWZvciAoaW50IGkgPSAwOyBpIDwgbkhhbmRzOyArK2kpIHsKCQlIYW5kJmggPSBoYW5kc1tpXTsKCQlpZiAoY2hlY2soaCwgbXlDYXJkLCBuKSkgewoJCQlpbnQgd2hvID0gaC53aG87CgkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CgkJCQlpZFtqXSA9IHdobyAlIDUyOwoJCQkJd2hvIC89IDUyOwoJCQl9CgoJCQlzb3J0KGlkLCBpZCArIDUpOwoJCQlyZXZlcnNlKGlkLCBpZCArIDUpOwoJCQlkZnMxKDAsIDApOwoJCX0KCgkJaWYgKGNoZWNrKGgsIHlvdUNhcmQsIG4gLSAxKSkgewoJCQlpbnQgd2hvID0gaC53aG87CgkJCWZvciAoaW50IGogPSAwOyBqIDwgNTsgKytqKSB7CgkJCQlpZFtqXSA9IHdobyAlIDUyOwoJCQkJd2hvIC89IDUyOwoJCQl9CgkJCXNvcnQoaWQsIGlkICsgNSk7CgkJCXJldmVyc2UoaWQsIGlkICsgNSk7CgkJCWRmczIoMCwgMCk7CgkJfQoJfQoKCWludDY0IEcgPSBfX2djZChBLCBCKTsKCUEgLz0gRywgQiAvPSBHOwoJY291dCA8PCBBIDw8ICIvIiA8PCBCIDw8IGVuZGw7CgoJcmV0dXJuIDA7Cn0K