#include<windows.h>
#include<iostream>
#include <conio.h>
#include<string>
#define resizeConsole rc
#define it int
#define fla 200 // toc do ran
#define m 6 // hien thi mau thuc an
#define colorht 10// hien thi mau ten nguoi choi va diem
#define mauran 1// hien thi mau ran
#define maukhung 4 // hien thi mau khung
using namespace std;
/*các hàm lam game có san copy tren mang*/
void resizeConsole(it width, it height)
{
HWND console = GetConsoleWindow();
RECT r;
GetWindowRect(console, &r);
MoveWindow(console, r.left, r.top, width, height, TRUE);
}
void textcolor(it x) // ham mau sac
{
HANDLE mau;
mau = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleTextAttribute(mau, x);
}
void gotoxy(it x, it y) // ham dich chuyen con tro
{
HANDLE hConsoleOutput;
COORD Cursor_an_Pos = { x - 1,y - 1 };
hConsoleOutput = GetStdHandle(STD_OUTPUT_HANDLE);
SetConsoleCursorPosition(hConsoleOutput, Cursor_an_Pos);
}
/* CODE BY : VO VAN NGUYEN */
/* huong doi tuong */
it kt;
it diem = 1;
class khunghinh
{
private:
it map[200][200];
it x, y;
public:
khunghinh()
{
x = 30;
y = 50;
}
void taokhung()
{
it i, j;
for (i = 1; i <= x; i++)
{
for (j = 1; j <= y; j++)
{
if (i == 1 || i == x || j == 1 || j == y)
map[i][j] = 3;
else
map[i][j] = 0;
}
}
}
void hienthikhung()
{
it i, j;
string ht;
gotoxy(60, 10);
textcolor(colorht);
cout << "NGUOI CHOI :";
getline(cin, ht);
gotoxy(60, 11);
cout << "DIEM: ";
gotoxy(68, 11);
cout << diem;
gotoxy(60, 14);
cout << "DIEU KHIEN BANG: CAC PHIM MUI TEN" ;
gotoxy(60, 18);
cout << "**********CODE BY VO VAN NGUYEN**********";
gotoxy(1, 1);
for (j = 1; j <= y; j++)
{
textcolor(maukhung);
cout << "=";
}
cout << endl;
for (i = 2; i < x; i++)
{
for (j = 1; j <= y; j++)
{
if (map[i][j] == 3)
cout << "#";
else
cout << ' ';
}
cout << endl;
}
for (j = 1; j <= y; j++)
cout << "=";
}
void truyen(it x1, it y1, it v)
{
map[x1][y1] = v;
}
it getvt(it x2, it y2)
{
return map[x2][y2];
}
void test()
{
for (it i = 1; i <= x; i++)
{
for (it j = 1; j <= y; j++)
cout << map[i][j];
cout << endl;
}
}
void taothucan()
{
it r;
do
{
it tx = rand() % 28 + 3;
it ty = rand() % 48 + 3;
if (getvt(tx, ty) == 0)
{
truyen(tx, ty, 2);
textcolor(m);
gotoxy(ty, tx);
cout << "$";
kt = 1;
r = 0;
}
else
r = 1;
} while (r == 1);
}
};
class Stack
{
private:
pair<it, it> kk[1500];
int dau;
public:
Stack()
{
dau = 0;
}
void themdau(it x, it y)
{
kk[dau].first = x;
kk[dau].second = y;
dau++;
}
void xoa()
{
for (int i = 0; i < dau; i++)
{
kk[i].first = kk[i + 1].first;
kk[i].second = kk[i + 1].second;
}
dau--;
}
it getxc()
{
return kk[0].first;
}
it getyc()
{
return kk[0].second;
}
};
class conran : public khunghinh
{
private:
it xd;
it yd;
Stack ran;
public:
conran()
{
xd = 15;
yd = 25;
}
void vedot(it x, it y) // ve dôt dau
{
gotoxy(y, x);
textcolor(mauran);
cout << "*";
}
void xoadot(it x, it y) //xóa dot cuoi
{
gotoxy(y, x);
cout << " ";
truyen(x, y, 0);
}
void khoitaoran()
{
conran();
vedot(xd, yd); // dau
ran.themdau(xd, yd);
truyen(xd, yd, 1);
taothucan();
}
int len()
{
Sleep(fla);
if (kt == 0)
taothucan();
xd--;
ran.themdau(xd, yd);
vedot(xd, yd);
if (getvt(xd, yd) == 2)
{
kt = 0;
cout << "\a";
diem++;
textcolor(colorht);
gotoxy(68, 11);
cout << diem;
}
else if (getvt(xd, yd) == 3)
{
gotoxy(15, 25);
textcolor(colorht);
cout << "________________THANKS YOU______________" << endl;
cout << "________________DIEM CUA BAN : " << diem << " __________";
exit(0);
}
else
{
xoadot(ran.getxc(), ran.getyc());
ran.xoa();
}
truyen(xd, yd, 1);
}
int xuong()
{
Sleep(fla);
if (kt == 0)
taothucan();
xd++;
ran.themdau(xd, yd);
vedot(xd, yd);
if (getvt(xd, yd) == 2)
{
kt = 0;
cout << "\a";
diem++;
textcolor(colorht);
gotoxy(68, 11);
cout << diem;
}
else if (getvt(xd, yd) == 3)
{
gotoxy(15, 25);
textcolor(colorht);
cout << "________________THANKS YOU______________" << endl;
cout << "________________DIEM CUA BAN : " << diem << " ___________";
exit(0);
}
else
{
xoadot(ran.getxc(), ran.getyc());
ran.xoa();
}
truyen(xd, yd, 1);
}
int trai()
{
Sleep(fla);
if (kt == 0)
taothucan();
yd--;
ran.themdau(xd, yd);
vedot(xd, yd);
if (getvt(xd, yd) == 2)
{
kt = 0;
cout << "\a";
diem++;
textcolor(colorht);
gotoxy(68, 11);
cout << diem;
}
else if (getvt(xd, yd) == 3)
{
gotoxy(15, 25);
textcolor(colorht);
cout << "________________THANKS YOU______________" << endl;
cout << "__________________DIEM CUA BAN : " << diem << "__________";
exit(0);
}
else
{
xoadot(ran.getxc(), ran.getyc());
ran.xoa();
}
truyen(xd, yd, 1);
}
int phai()
{
Sleep(fla);
if (kt == 0)
taothucan();
yd++;
ran.themdau(xd, yd);
vedot(xd, yd);
if (getvt(xd, yd) == 2)
{
cout << "\a";
kt = 0;
diem++;
textcolor(colorht);
gotoxy(68, 11);
cout << diem;
}
else if (getvt(xd, yd) == 3)
{
gotoxy(15, 25);
textcolor(colorht);
cout << "________________THANKS YOU______________" << endl;
cout << "________________DIEM CUA BAN : " << diem << " ___________";
exit(0);
}
else
{
xoadot(ran.getxc(), ran.getyc());
ran.xoa();
}
truyen(xd, yd, 1);
}
};
int main()
{
rc(800, 600); // chinh console
conran a;
a.taokhung();
a.hienthikhung();
a.khoitaoran();
while (1)
{
if (_kbhit() != 0)
{
it l = _getch();
switch (l)
{
case 72:
while (_kbhit() == 0)
{
a.len();
}
break;
case 80:
while (_kbhit() == 0)
{
a.xuong();
}
break;
case 75:
while (_kbhit() == 0)
{
a.trai();
}
break;
case 77:
while (_kbhit() == 0)
{
a.phai();
}
break;
case 32:
system("cls");
a.test();
break;
}
}
}
}
I2luY2x1ZGU8d2luZG93cy5oPgojaW5jbHVkZTxpb3N0cmVhbT4KI2luY2x1ZGUgPGNvbmlvLmg+IAojaW5jbHVkZTxzdHJpbmc+CiNkZWZpbmUgIHJlc2l6ZUNvbnNvbGUgIHJjCiNkZWZpbmUgaXQgaW50CiNkZWZpbmUgZmxhIDIwMCAgLy8gdG9jIGRvIHJhbiAKI2RlZmluZSBtIDYgLy8gaGllbiB0aGkgbWF1IHRodWMgYW4gIAojZGVmaW5lIGNvbG9yaHQgMTAvLyBoaWVuIHRoaSBtYXUgdGVuIG5ndW9pIGNob2kgdmEgZGllbQojZGVmaW5lIG1hdXJhbiAxLy8gaGllbiB0aGkgbWF1IHJhbgojZGVmaW5lIG1hdWtodW5nIDQgLy8gaGllbiB0aGkgbWF1IGtodW5nCnVzaW5nIG5hbWVzcGFjZSBzdGQ7Ci8qY8OhYyBow6BtIGxhbSBnYW1lIGPDsyBzYW4gY29weSB0cmVuIG1hbmcqLwp2b2lkIHJlc2l6ZUNvbnNvbGUoaXQgd2lkdGgsIGl0IGhlaWdodCkKewoJSFdORCBjb25zb2xlID0gR2V0Q29uc29sZVdpbmRvdygpOwoJUkVDVCByOwoJR2V0V2luZG93UmVjdChjb25zb2xlLCAmcik7CglNb3ZlV2luZG93KGNvbnNvbGUsIHIubGVmdCwgci50b3AsIHdpZHRoLCBoZWlnaHQsIFRSVUUpOwp9CnZvaWQgdGV4dGNvbG9yKGl0IHgpIC8vIGhhbSBtYXUgc2FjCnsKCUhBTkRMRSBtYXU7CgltYXUgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwoJU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUobWF1LCB4KTsKfQp2b2lkIGdvdG94eShpdCB4LCBpdCB5KSAvLyBoYW0gZGljaCBjaHV5ZW4gY29uIHRybwp7CglIQU5ETEUgaENvbnNvbGVPdXRwdXQ7CglDT09SRCBDdXJzb3JfYW5fUG9zID0geyB4IC0gMSx5IC0gMSB9OwoJaENvbnNvbGVPdXRwdXQgPSBHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpOwoJU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhDb25zb2xlT3V0cHV0LCBDdXJzb3JfYW5fUG9zKTsKfQovKiBDT0RFIEJZIDogVk8gVkFOIE5HVVlFTiAqLwoJIC8qIGh1b25nIGRvaSB0dW9uZyAqLwppdCBrdDsKaXQgZGllbSA9IDE7CmNsYXNzIGtodW5naGluaAp7CnByaXZhdGU6CglpdCBtYXBbMjAwXVsyMDBdOwoJaXQgeCwgeTsKcHVibGljOgoJa2h1bmdoaW5oKCkKCXsKCQl4ID0gMzA7CgkJeSA9IDUwOwoJfQoJdm9pZAl0YW9raHVuZygpCgl7CgkJaXQgaSwgajsKCQlmb3IgKGkgPSAxOyBpIDw9IHg7IGkrKykKCQl7CgkJCWZvciAoaiA9IDE7IGogPD0geTsgaisrKQoJCQl7CgkJCQlpZiAoaSA9PSAxIHx8IGkgPT0geCB8fCBqID09IDEgfHwgaiA9PSB5KQoJCQkJCW1hcFtpXVtqXSA9IDM7CgkJCQllbHNlCgkJCQkJbWFwW2ldW2pdID0gMDsKCgkJCX0KCQl9Cgl9Cgl2b2lkCWhpZW50aGlraHVuZygpCgl7CgkJaXQgaSwgajsKCQlzdHJpbmcgaHQ7CgkJZ290b3h5KDYwLCAxMCk7CgkJdGV4dGNvbG9yKGNvbG9yaHQpOwoJCWNvdXQgPDwgIk5HVU9JIENIT0kgOiI7CgkJZ2V0bGluZShjaW4sIGh0KTsKCQlnb3RveHkoNjAsIDExKTsKCQljb3V0IDw8ICJESUVNOiAiOwoJCWdvdG94eSg2OCwgMTEpOwoJCWNvdXQgPDwgZGllbTsKCQlnb3RveHkoNjAsIDE0KTsKCQljb3V0IDw8ICJESUVVIEtISUVOIEJBTkc6IENBQyBQSElNIE1VSSBURU4iIDsKCQlnb3RveHkoNjAsIDE4KTsKCQljb3V0IDw8ICIqKioqKioqKioqQ09ERSBCWSBWTyBWQU4gTkdVWUVOKioqKioqKioqKiI7CgkJZ290b3h5KDEsIDEpOwoJCWZvciAoaiA9IDE7IGogPD0geTsgaisrKQoJCXsKCQkJdGV4dGNvbG9yKG1hdWtodW5nKTsKCQkJY291dCA8PCAiPSI7CgkJfQoJCWNvdXQgPDwgZW5kbDsKCQlmb3IgKGkgPSAyOyBpIDwgeDsgaSsrKQoJCXsKCQkJZm9yIChqID0gMTsgaiA8PSB5OyBqKyspCgkJCXsKCQkJCWlmIChtYXBbaV1bal0gPT0gMykKCQkJCQljb3V0IDw8ICIjIjsKCQkJCWVsc2UKCQkJCQljb3V0IDw8ICcgJzsKCQkJfQoJCQljb3V0IDw8IGVuZGw7CgkJfQoJCWZvciAoaiA9IDE7IGogPD0geTsgaisrKQoJCQljb3V0IDw8ICI9IjsKCX0KCXZvaWQgdHJ1eWVuKGl0IHgxLCBpdCB5MSwgaXQgdikKCXsKCQltYXBbeDFdW3kxXSA9IHY7Cgl9CglpdCBnZXR2dChpdCB4MiwgaXQgeTIpCgl7CgkJcmV0dXJuIG1hcFt4Ml1beTJdOwoJfQoJdm9pZCB0ZXN0KCkKCXsKCQlmb3IgKGl0IGkgPSAxOyBpIDw9IHg7IGkrKykKCQl7CgkJCWZvciAoaXQgaiA9IDE7IGogPD0geTsgaisrKQoJCQkJY291dCA8PCBtYXBbaV1bal07CgkJCWNvdXQgPDwgZW5kbDsKCQl9Cgl9Cgl2b2lkIHRhb3RodWNhbigpCgl7CgkJaXQgcjsKCQlkbwoJCXsKCQkJaXQgdHggPSByYW5kKCkgJSAyOCArIDM7CgkJCWl0IHR5ID0gcmFuZCgpICUgNDggKyAzOwoJCQlpZiAoZ2V0dnQodHgsIHR5KSA9PSAwKQoJCQl7CgkJCQl0cnV5ZW4odHgsIHR5LCAyKTsKCQkJCXRleHRjb2xvcihtKTsKCQkJCWdvdG94eSh0eSwgdHgpOwoJCQkJY291dCA8PCAiJCI7CgkJCQlrdCA9IDE7CgkJCQlyID0gMDsKCQkJfQoJCQllbHNlCgkJCQlyID0gMTsKCQl9IHdoaWxlIChyID09IDEpOwoJfQp9OwpjbGFzcyBTdGFjawp7CnByaXZhdGU6CglwYWlyPGl0LCBpdD4ga2tbMTUwMF07CglpbnQgZGF1OwpwdWJsaWM6CglTdGFjaygpCgl7CgkJZGF1ID0gMDsKCX0KCXZvaWQgdGhlbWRhdShpdCB4LCBpdCB5KQoJewoJCWtrW2RhdV0uZmlyc3QgPSB4OwoJCWtrW2RhdV0uc2Vjb25kID0geTsKCQlkYXUrKzsKCX0KCXZvaWQgeG9hKCkKCXsKCQlmb3IgKGludCBpID0gMDsgaSA8IGRhdTsgaSsrKQoJCXsKCQkJa2tbaV0uZmlyc3QgPSBra1tpICsgMV0uZmlyc3Q7CgkJCWtrW2ldLnNlY29uZCA9IGtrW2kgKyAxXS5zZWNvbmQ7CgkJfQoJCWRhdS0tOwoJfQoKCWl0IGdldHhjKCkKCXsKCQlyZXR1cm4ga2tbMF0uZmlyc3Q7Cgl9CglpdCBnZXR5YygpCgl7CgkJcmV0dXJuIGtrWzBdLnNlY29uZDsKCX0KCn07CmNsYXNzIGNvbnJhbiA6IHB1YmxpYyBraHVuZ2hpbmgKewpwcml2YXRlOgoJaXQgeGQ7CglpdCB5ZDsKCVN0YWNrIHJhbjsKcHVibGljOgoJY29ucmFuKCkKCXsKCQl4ZCA9IDE1OwoJCXlkID0gMjU7Cgl9CgoJdm9pZCB2ZWRvdChpdCB4LCBpdCB5KSAvLyB2ZSBkw7R0IGRhdQoJewoJCWdvdG94eSh5LCB4KTsKCQl0ZXh0Y29sb3IobWF1cmFuKTsKCQljb3V0IDw8ICIqIjsKCgl9Cgl2b2lkIHhvYWRvdChpdCB4LCBpdCB5KSAvL3jDs2EgZG90IGN1b2kKCXsKCQlnb3RveHkoeSwgeCk7CgkJY291dCA8PCAiICI7CgkJdHJ1eWVuKHgsIHksIDApOwoKCX0KCXZvaWQga2hvaXRhb3JhbigpCgl7CgkJY29ucmFuKCk7CgkJdmVkb3QoeGQsIHlkKTsgLy8gZGF1CgkJcmFuLnRoZW1kYXUoeGQsIHlkKTsKCQl0cnV5ZW4oeGQsIHlkLCAxKTsKCgkJdGFvdGh1Y2FuKCk7CgoJfQoJaW50IGxlbigpCgl7CgkJU2xlZXAoZmxhKTsKCQlpZiAoa3QgPT0gMCkKCQkJdGFvdGh1Y2FuKCk7CgkJeGQtLTsKCQlyYW4udGhlbWRhdSh4ZCwgeWQpOwoJCXZlZG90KHhkLCB5ZCk7CgkJaWYgKGdldHZ0KHhkLCB5ZCkgPT0gMikKCQl7CgkJCWt0ID0gMDsKCQkJY291dCA8PCAiXGEiOwoJCQlkaWVtKys7CgkJCXRleHRjb2xvcihjb2xvcmh0KTsKCQkJZ290b3h5KDY4LCAxMSk7CgkJCWNvdXQgPDwgZGllbTsKCQl9CgkJZWxzZSBpZiAoZ2V0dnQoeGQsIHlkKSA9PSAzKQoJCXsKCQkJZ290b3h5KDE1LCAyNSk7CgkJCXRleHRjb2xvcihjb2xvcmh0KTsKCQkJY291dCA8PCAiX19fX19fX19fX19fX19fX1RIQU5LUyBZT1VfX19fX19fX19fX19fXyIgPDwgZW5kbDsKCQkJY291dCA8PCAiX19fX19fX19fX19fX19fX0RJRU0gQ1VBIEJBTiA6ICIgPDwgZGllbSA8PCAiIF9fX19fX19fX18iOwoJCQlleGl0KDApOwoJCX0KCQllbHNlCgkJewoJCQl4b2Fkb3QocmFuLmdldHhjKCksIHJhbi5nZXR5YygpKTsKCQkJcmFuLnhvYSgpOwoJCX0KCQl0cnV5ZW4oeGQsIHlkLCAxKTsKCX0KCWludCB4dW9uZygpCgl7CgkJU2xlZXAoZmxhKTsKCQlpZiAoa3QgPT0gMCkKCQkJdGFvdGh1Y2FuKCk7CgkJeGQrKzsKCQlyYW4udGhlbWRhdSh4ZCwgeWQpOwoJCXZlZG90KHhkLCB5ZCk7CgkJaWYgKGdldHZ0KHhkLCB5ZCkgPT0gMikKCQl7CgoJCQlrdCA9IDA7CgkJCWNvdXQgPDwgIlxhIjsKCQkJZGllbSsrOwoJCQl0ZXh0Y29sb3IoY29sb3JodCk7CgkJCWdvdG94eSg2OCwgMTEpOwoJCQljb3V0IDw8IGRpZW07CgoJCX0KCQllbHNlIGlmIChnZXR2dCh4ZCwgeWQpID09IDMpCgkJewoJCQlnb3RveHkoMTUsIDI1KTsKCQkJdGV4dGNvbG9yKGNvbG9yaHQpOwoJCQljb3V0IDw8ICJfX19fX19fX19fX19fX19fVEhBTktTIFlPVV9fX19fX19fX19fX19fIiA8PCBlbmRsOwoJCQljb3V0IDw8ICJfX19fX19fX19fX19fX19fRElFTSBDVUEgQkFOIDogIiA8PCBkaWVtIDw8ICIgX19fX19fX19fX18iOwoJCQlleGl0KDApOwoJCX0KCQllbHNlCgkJewoJCQl4b2Fkb3QocmFuLmdldHhjKCksIHJhbi5nZXR5YygpKTsKCQkJcmFuLnhvYSgpOwoJCX0KCQl0cnV5ZW4oeGQsIHlkLCAxKTsKCX0KCWludCB0cmFpKCkKCXsKCgkJU2xlZXAoZmxhKTsKCQlpZiAoa3QgPT0gMCkKCQkJdGFvdGh1Y2FuKCk7CgkJeWQtLTsKCQlyYW4udGhlbWRhdSh4ZCwgeWQpOwoJCXZlZG90KHhkLCB5ZCk7CgkJaWYgKGdldHZ0KHhkLCB5ZCkgPT0gMikKCQl7CgoJCQlrdCA9IDA7CgkJCWNvdXQgPDwgIlxhIjsKCQkJZGllbSsrOwoJCQl0ZXh0Y29sb3IoY29sb3JodCk7CgkJCWdvdG94eSg2OCwgMTEpOwoJCQljb3V0IDw8IGRpZW07CgkJfQoJCWVsc2UgaWYgKGdldHZ0KHhkLCB5ZCkgPT0gMykKCQl7CgkJCWdvdG94eSgxNSwgMjUpOwoJCQl0ZXh0Y29sb3IoY29sb3JodCk7CgkJCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19USEFOS1MgWU9VX19fX19fX19fX19fX18iIDw8IGVuZGw7CgkJCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19fX0RJRU0gQ1VBIEJBTiA6ICIgPDwgZGllbSA8PCAiX19fX19fX19fXyI7CgkJCWV4aXQoMCk7CgkJfQoJCWVsc2UKCQl7CgkJCXhvYWRvdChyYW4uZ2V0eGMoKSwgcmFuLmdldHljKCkpOwoJCQlyYW4ueG9hKCk7CgkJfQoJCXRydXllbih4ZCwgeWQsIDEpOwoJfQoJaW50IHBoYWkoKQoJewoJCVNsZWVwKGZsYSk7CgkJaWYgKGt0ID09IDApCgkJCXRhb3RodWNhbigpOwoJCXlkKys7CgkJcmFuLnRoZW1kYXUoeGQsIHlkKTsKCQl2ZWRvdCh4ZCwgeWQpOwoJCWlmIChnZXR2dCh4ZCwgeWQpID09IDIpCgkJewoJCQljb3V0IDw8ICJcYSI7CgkJCWt0ID0gMDsKCQkJZGllbSsrOwoJCQl0ZXh0Y29sb3IoY29sb3JodCk7CgkJCWdvdG94eSg2OCwgMTEpOwoJCQljb3V0IDw8IGRpZW07CgkJfQoJCWVsc2UgaWYgKGdldHZ0KHhkLCB5ZCkgPT0gMykKCQl7CgkJCWdvdG94eSgxNSwgMjUpOwoJCQl0ZXh0Y29sb3IoY29sb3JodCk7CgkJCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19USEFOS1MgWU9VX19fX19fX19fX19fX18iIDw8IGVuZGw7CgkJCWNvdXQgPDwgIl9fX19fX19fX19fX19fX19ESUVNIENVQSBCQU4gOiAiIDw8IGRpZW0gPDwgIiBfX19fX19fX19fXyI7CgkJCWV4aXQoMCk7CgkJfQoJCWVsc2UKCQl7CgkJCXhvYWRvdChyYW4uZ2V0eGMoKSwgcmFuLmdldHljKCkpOwoJCQlyYW4ueG9hKCk7CgkJfQoJCXRydXllbih4ZCwgeWQsIDEpOwoJfQp9OwppbnQgbWFpbigpCnsKCXJjKDgwMCwgNjAwKTsgLy8gY2hpbmggY29uc29sZQoJY29ucmFuIGE7CglhLnRhb2todW5nKCk7CglhLmhpZW50aGlraHVuZygpOwoJYS5raG9pdGFvcmFuKCk7Cgl3aGlsZSAoMSkKCXsKCQlpZiAoX2tiaGl0KCkgIT0gMCkKCQl7CgkJCWl0IGwgPSBfZ2V0Y2goKTsKCQkJc3dpdGNoIChsKQoJCQl7CgkJCWNhc2UgNzI6CgkJCQl3aGlsZSAoX2tiaGl0KCkgPT0gMCkKCQkJCXsKCQkJCQlhLmxlbigpOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgODA6CgkJCQl3aGlsZSAoX2tiaGl0KCkgPT0gMCkKCQkJCXsKCQkJCQlhLnh1b25nKCk7CgkJCQl9CgkJCQlicmVhazsKCQkJY2FzZSA3NToKCQkJCXdoaWxlIChfa2JoaXQoKSA9PSAwKQoJCQkJewoJCQkJCWEudHJhaSgpOwoJCQkJfQoJCQkJYnJlYWs7CgkJCWNhc2UgNzc6CgkJCQl3aGlsZSAoX2tiaGl0KCkgPT0gMCkKCQkJCXsKCQkJCQlhLnBoYWkoKTsKCQkJCX0KCQkJCWJyZWFrOwoJCQljYXNlIDMyOgoJCQkJc3lzdGVtKCJjbHMiKTsKCQkJCWEudGVzdCgpOwoJCQkJYnJlYWs7CgkJCX0KCQl9Cgl9Cn0=