#include <stdio.h>
#include <string.h>
#include <conio.h>
#include <stdlib.h>
#include <windows.h>
struct student
{
char ID[15];
char name[20];
char add[50];
char parname[50];
char semister[10];
long unsigned int phone_no;
};
struct student stu;
///This will set the forground color for printing in a console window.
void SetColor(int ForgC)
{
WORD wColor;
///We will need this handle to get the current background attribute
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
CONSOLE_SCREEN_BUFFER_INFO csbi;
///We use csbi for the wAttributes word.
if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
{
///Mask out all but the background attribute, and add in the forgournd color
wColor = (csbi.wAttributes & 0xF0) + (ForgC & 0x0F);
SetConsoleTextAttribute(hStdOut, wColor);
}
return;
}
void ClearConsoleToColors(int ForgC, int BackC)
{
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);
///Get the handle to the current output buffer...
HANDLE hStdOut = GetStdHandle(STD_OUTPUT_HANDLE);
///This is used to reset the carat/cursor to the top left.
COORD coord = {0, 0};
///A return value... indicating how many chars were written
/// not used but we need to capture this since it will be
/// written anyway (passing NULL causes an access violation).
DWORD count;
///This is a structure containing all of the console info
/// it is used here to find the size of the console.
CONSOLE_SCREEN_BUFFER_INFO csbi;
///Here we will set the current color
SetConsoleTextAttribute(hStdOut, wColor);
if(GetConsoleScreenBufferInfo(hStdOut, &csbi))
{
///This fills the buffer with a given character (in this case 32=space).
FillConsoleOutputCharacter(hStdOut, (TCHAR) 32, csbi.dwSize.X * csbi.dwSize.Y, coord, &count);
FillConsoleOutputAttribute(hStdOut, csbi.wAttributes, csbi.dwSize.X * csbi.dwSize.Y, coord, &count );
///This will set our cursor position for the next print statement.
SetConsoleCursorPosition(hStdOut, coord);
}
return;
}
void SetColorAndBackground(int ForgC, int BackC)
{
WORD wColor = ((BackC & 0x0F) << 4) + (ForgC & 0x0F);;
SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), wColor);
return;
}
COORD coord = {0,0}; ///set the cordinate to 0, 0 (top-left corner of window);
void gotoxy(int x, int y)
{
coord.X = x;
coord.Y = y; /// X and Y coordinates
SetConsoleCursorPosition(GetStdHandle(STD_OUTPUT_HANDLE), coord);
}
void drawRectangle()
{
int i, j;
gotoxy(0,0);
for(i = 1; i < 78; i++)
{
gotoxy(i, 0);
}
gotoxy(78,0);
for(i = 1; i < 25; i++)
{
gotoxy(78, i);
if(i == 6)
{
}
else
{
}
}
gotoxy(78, 25);
for(i = 77; i > 0; i--)
{
gotoxy(i,25);
if(i == 35)
{
}
else
{
}
}
gotoxy(0,25);
for(i = 24; i > 0; i--)
{
gotoxy(0,i);
if(i == 6)
{
}
else
{
}
}
for(i = 1; i < 78; i++)
{
gotoxy(i,6);
if(i == 35)
{
}
else
{
}
}
for(i = 7; i < 25; i++)
{
gotoxy(35,i);
}
}
void clearWindow()
{
int i,j;
for(i = 37; i < 78; i++)
{
for(j = 7; j < 25; j++)
{
gotoxy(i,j);
}
}
return;
}
void window()
{
drawRectangle();
gotoxy(28,2);
SetColor(35);
printf("STUDENT RECORD SYSTEM"); gotoxy(20,3);
printf("ENTER University Of Science & Technology ,Bangladesh"); gotoxy(31,4);
gotoxy(25,24);
SetColor(17);
}
void print_heading(const char st[])
{
SetColorAndBackground(31,28);
gotoxy(45,8);
SetColorAndBackground(17,15);
}
void add_student()
{
clearWindow();
print_heading("Add Record");
int print = 37;
FILE *fp;
fp
= fopen("record.txt","ab+"); SetColor(45);
if(fp == NULL)
{
MessageBox(0,"Error in Opening file\nMake sure your file is not write protected","Warning",0);
}
else
{
gotoxy(print,10);
//here you can confirms the ID
gotoxy(print,12);
gotoxy(print,14);
gotoxy(print,16);
gotoxy(print,18);
gotoxy(print,20);
scanf("%ld",&stu.
phone_no); fwrite(&stu
, sizeof(stu
), 1, fp
); gotoxy(40,22);
printf("The record is sucessfully added"); }
SetColor(28);
return;
}
void search_student()
{
clearWindow();
print_heading("Search Record");
SetColor(45);
char s_id[15];
int isFound = 0;
gotoxy(37,10);
printf("Enter ID to Search: "); FILE *fp;
fp
= fopen("record.txt","rb"); while(fread(&stu
,sizeof(stu
),1,fp
) == 1) {
{
isFound = 1;
break;
}
}
if(isFound == 1)
{
gotoxy(37,12);
printf("The record is Found"); gotoxy(37,14);
gotoxy(37,15);
gotoxy(37,16);
printf("Address: %s",stu.
add); gotoxy(37,17);
printf("Parent's Name: %s",stu.
parname); gotoxy(37,18);
printf("Semister: %s",stu.
semister); gotoxy(37,19);
printf("Phone No: %ld",stu.
phone_no); }
else
{
gotoxy(37,12);
printf("Sory, No record found in the database"); }
SetColor(28);
return;
}
void mod_student()
{
clearWindow();
print_heading("Modify Record");
SetColor(45);
char s_id[15];
int isFound = 0, print = 37;
gotoxy(37,10);
printf("Enter ID to Modify: "); FILE *fp;
fp
= fopen("record.txt","rb+"); while(fread(&stu
, sizeof(stu
),1,fp
) == 1) {
{
gotoxy(print,12);
gotoxy(print,13);
gotoxy(print,14);
gotoxy(print,15);
gotoxy(print,16);
gotoxy(print,17);
scanf("%ld",&stu.
phone_no); fseek(fp
,-sizeof(stu
), SEEK_CUR
); fwrite(&stu
,sizeof(stu
), 1, fp
); isFound = 1;
break;
}
}
if(!isFound)
{
gotoxy(print, 12);
}
SetColor(28);
return;
}
void delete_student()
{
clearWindow();
print_heading("Delete Record");
SetColor(45);
char s_id[15];
int isFound = 0, print = 37;
gotoxy(37,10);
printf("Enter ID to Modify: "); FILE *fp, *temp;
fp
= fopen("record.txt","rb"); temp
= fopen("temp.txt", "wb"); while(fread(&stu
, sizeof(stu
),1,fp
) == 1) {
{
fwrite(&stu
,sizeof(stu
),1,temp
); }
}
rename("temp.txt","record.txt"); gotoxy(37,12);
printf("The record is sucessfully deleted"); SetColor(28);
return;
}
void main_window()
{
int choice;
SetColor(28);
int x = 2;
while(1)
{
gotoxy(x,8);
gotoxy(x,10);
gotoxy(x,12);
printf("3. Modify Student Record"); gotoxy(x,14);
printf("4. Delete Student Record"); gotoxy(x,16);
gotoxy(x,18);
printf("Enter your choice: "); switch(choice)
{
case 1:
add_student();
break;
case 2:
search_student();
break;
case 3:
mod_student();
break;
case 4:
delete_student();
break;
case 5:
break;
default:
break;
}
}
}
int main()
{
ClearConsoleToColors(17,15);
SetConsoleTitle("Student Record sysytem using C programming");
window();
//use_pass_field();
main_window();
return 0;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGNvbmlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHdpbmRvd3MuaD4KCnN0cnVjdCBzdHVkZW50CnsKICAgIGNoYXIgSURbMTVdOwogICAgY2hhciBuYW1lWzIwXTsKICAgIGNoYXIgYWRkWzUwXTsKICAgIGNoYXIgcGFybmFtZVs1MF07CiAgICBjaGFyIHNlbWlzdGVyWzEwXTsKICAgIGxvbmcgdW5zaWduZWQgaW50IHBob25lX25vOwp9OwoKc3RydWN0IHN0dWRlbnQgc3R1OwoKLy8vVGhpcyB3aWxsIHNldCB0aGUgZm9yZ3JvdW5kIGNvbG9yIGZvciBwcmludGluZyBpbiBhIGNvbnNvbGUgd2luZG93Lgp2b2lkIFNldENvbG9yKGludCBGb3JnQykKewogICAgV09SRCB3Q29sb3I7CiAgICAvLy9XZSB3aWxsIG5lZWQgdGhpcyBoYW5kbGUgdG8gZ2V0IHRoZSBjdXJyZW50IGJhY2tncm91bmQgYXR0cmlidXRlCiAgICBIQU5ETEUgaFN0ZE91dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CiAgICBDT05TT0xFX1NDUkVFTl9CVUZGRVJfSU5GTyBjc2JpOwoKICAgIC8vL1dlIHVzZSBjc2JpIGZvciB0aGUgd0F0dHJpYnV0ZXMgd29yZC4KICAgIGlmKEdldENvbnNvbGVTY3JlZW5CdWZmZXJJbmZvKGhTdGRPdXQsICZjc2JpKSkKICAgIHsKICAgICAgICAvLy9NYXNrIG91dCBhbGwgYnV0IHRoZSBiYWNrZ3JvdW5kIGF0dHJpYnV0ZSwgYW5kIGFkZCBpbiB0aGUgZm9yZ291cm5kIGNvbG9yCiAgICAgICAgd0NvbG9yID0gKGNzYmkud0F0dHJpYnV0ZXMgJiAweEYwKSArIChGb3JnQyAmIDB4MEYpOwogICAgICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKGhTdGRPdXQsIHdDb2xvcik7CiAgICB9CiAgICByZXR1cm47Cn0KCnZvaWQgQ2xlYXJDb25zb2xlVG9Db2xvcnMoaW50IEZvcmdDLCBpbnQgQmFja0MpCnsKICAgIFdPUkQgd0NvbG9yID0gKChCYWNrQyAmIDB4MEYpIDw8IDQpICsgKEZvcmdDICYgMHgwRik7CiAgICAvLy9HZXQgdGhlIGhhbmRsZSB0byB0aGUgY3VycmVudCBvdXRwdXQgYnVmZmVyLi4uCiAgICBIQU5ETEUgaFN0ZE91dCA9IEdldFN0ZEhhbmRsZShTVERfT1VUUFVUX0hBTkRMRSk7CiAgICAvLy9UaGlzIGlzIHVzZWQgdG8gcmVzZXQgdGhlIGNhcmF0L2N1cnNvciB0byB0aGUgdG9wIGxlZnQuCiAgICBDT09SRCBjb29yZCA9IHswLCAwfTsKICAgIC8vL0EgcmV0dXJuIHZhbHVlLi4uIGluZGljYXRpbmcgaG93IG1hbnkgY2hhcnMgd2VyZSB3cml0dGVuCiAgICAvLy8gICBub3QgdXNlZCBidXQgd2UgbmVlZCB0byBjYXB0dXJlIHRoaXMgc2luY2UgaXQgd2lsbCBiZQogICAgLy8vICAgd3JpdHRlbiBhbnl3YXkgKHBhc3NpbmcgTlVMTCBjYXVzZXMgYW4gYWNjZXNzIHZpb2xhdGlvbikuCiAgICBEV09SRCBjb3VudDsKICAgIC8vL1RoaXMgaXMgYSBzdHJ1Y3R1cmUgY29udGFpbmluZyBhbGwgb2YgdGhlIGNvbnNvbGUgaW5mbwogICAgLy8vIGl0IGlzIHVzZWQgaGVyZSB0byBmaW5kIHRoZSBzaXplIG9mIHRoZSBjb25zb2xlLgogICAgQ09OU09MRV9TQ1JFRU5fQlVGRkVSX0lORk8gY3NiaTsKICAgIC8vL0hlcmUgd2Ugd2lsbCBzZXQgdGhlIGN1cnJlbnQgY29sb3IKICAgIFNldENvbnNvbGVUZXh0QXR0cmlidXRlKGhTdGRPdXQsIHdDb2xvcik7CiAgICBpZihHZXRDb25zb2xlU2NyZWVuQnVmZmVySW5mbyhoU3RkT3V0LCAmY3NiaSkpCiAgICB7CiAgICAgICAgLy8vVGhpcyBmaWxscyB0aGUgYnVmZmVyIHdpdGggYSBnaXZlbiBjaGFyYWN0ZXIgKGluIHRoaXMgY2FzZSAzMj1zcGFjZSkuCiAgICAgICAgRmlsbENvbnNvbGVPdXRwdXRDaGFyYWN0ZXIoaFN0ZE91dCwgKFRDSEFSKSAzMiwgY3NiaS5kd1NpemUuWCAqIGNzYmkuZHdTaXplLlksIGNvb3JkLCAmY291bnQpOwogICAgICAgIEZpbGxDb25zb2xlT3V0cHV0QXR0cmlidXRlKGhTdGRPdXQsIGNzYmkud0F0dHJpYnV0ZXMsIGNzYmkuZHdTaXplLlggKiBjc2JpLmR3U2l6ZS5ZLCBjb29yZCwgJmNvdW50ICk7CiAgICAgICAgLy8vVGhpcyB3aWxsIHNldCBvdXIgY3Vyc29yIHBvc2l0aW9uIGZvciB0aGUgbmV4dCBwcmludCBzdGF0ZW1lbnQuCiAgICAgICAgU2V0Q29uc29sZUN1cnNvclBvc2l0aW9uKGhTdGRPdXQsIGNvb3JkKTsKICAgIH0KICAgIHJldHVybjsKfQoKdm9pZCBTZXRDb2xvckFuZEJhY2tncm91bmQoaW50IEZvcmdDLCBpbnQgQmFja0MpCnsKICAgIFdPUkQgd0NvbG9yID0gKChCYWNrQyAmIDB4MEYpIDw8IDQpICsgKEZvcmdDICYgMHgwRik7OwogICAgU2V0Q29uc29sZVRleHRBdHRyaWJ1dGUoR2V0U3RkSGFuZGxlKFNURF9PVVRQVVRfSEFORExFKSwgd0NvbG9yKTsKICAgIHJldHVybjsKfQoKQ09PUkQgY29vcmQgPSB7MCwwfTsgLy8vc2V0IHRoZSBjb3JkaW5hdGUgdG8gMCwgMCAodG9wLWxlZnQgY29ybmVyIG9mIHdpbmRvdyk7CnZvaWQgZ290b3h5KGludCB4LCBpbnQgeSkKewogICAgY29vcmQuWCA9IHg7CiAgICBjb29yZC5ZID0geTsgLy8vIFggYW5kIFkgY29vcmRpbmF0ZXMKICAgIFNldENvbnNvbGVDdXJzb3JQb3NpdGlvbihHZXRTdGRIYW5kbGUoU1REX09VVFBVVF9IQU5ETEUpLCBjb29yZCk7Cn0KCnZvaWQgZHJhd1JlY3RhbmdsZSgpCnsKICAgIGludCBpLCBqOwogICAgZ290b3h5KDAsMCk7CiAgICBwcmludGYoIiVjIiwyMDEpOwogICAgZm9yKGkgPSAxOyBpIDwgNzg7IGkrKykKICAgIHsKICAgICAgICBnb3RveHkoaSwgMCk7CiAgICAgICAgcHJpbnRmKCIlYyIsMjA1KTsKICAgIH0KICAgIGdvdG94eSg3OCwwKTsKICAgIHByaW50ZigiJWMiLDE4Nyk7CiAgICBmb3IoaSA9IDE7IGkgPCAyNTsgaSsrKQogICAgewogICAgICAgIGdvdG94eSg3OCwgaSk7CiAgICAgICAgaWYoaSA9PSA2KQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCIlYyIsMTg1KTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCIlYyIsMTg2KTsKICAgICAgICB9CiAgICB9CiAgICBnb3RveHkoNzgsIDI1KTsKICAgIHByaW50ZigiJWMiLDE4OCk7CiAgICBmb3IoaSA9IDc3OyBpID4gMDsgaS0tKQogICAgewogICAgICAgIGdvdG94eShpLDI1KTsKICAgICAgICBpZihpID09IDM1KQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCIlYyIsMjAyKTsKICAgICAgICB9CiAgICAgICAgZWxzZQogICAgICAgIHsKICAgICAgICAgICAgcHJpbnRmKCIlYyIsMjA1KTsKICAgICAgICB9CiAgICB9CiAgICBnb3RveHkoMCwyNSk7CiAgICBwcmludGYoIiVjIiwyMDApOwogICAgZm9yKGkgPSAyNDsgaSA+IDA7IGktLSkKICAgIHsKICAgICAgICBnb3RveHkoMCxpKTsKICAgICAgICBpZihpID09IDYpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVjIiwyMDQpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVjIiwxODYpOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoaSA9IDE7IGkgPCA3ODsgaSsrKQogICAgewogICAgICAgIGdvdG94eShpLDYpOwogICAgICAgIGlmKGkgPT0gMzUpCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVjIiwyMDMpOwogICAgICAgIH0KICAgICAgICBlbHNlCiAgICAgICAgewogICAgICAgICAgICBwcmludGYoIiVjIiwyMDUpOwogICAgICAgIH0KICAgIH0KCiAgICBmb3IoaSA9IDc7IGkgPCAyNTsgaSsrKQogICAgewogICAgICAgIGdvdG94eSgzNSxpKTsKICAgICAgICBwcmludGYoIiVjIiwxODYpOwogICAgfQoKfQoKdm9pZCBjbGVhcldpbmRvdygpCnsKICAgIGludCBpLGo7CiAgICBmb3IoaSA9IDM3OyBpIDwgNzg7IGkrKykKICAgIHsKICAgICAgICBmb3IoaiA9IDc7IGogPCAyNTsgaisrKQogICAgICAgIHsKICAgICAgICAgICAgZ290b3h5KGksaik7CiAgICAgICAgICAgIHByaW50ZigiICIpOwogICAgICAgIH0KICAgIH0KICAgIHJldHVybjsKfQoKdm9pZCB3aW5kb3coKQp7CiAgICBkcmF3UmVjdGFuZ2xlKCk7CiAgICBnb3RveHkoMjgsMik7CiAgICBTZXRDb2xvcigzNSk7CiAgICBwcmludGYoIlNUVURFTlQgUkVDT1JEIFNZU1RFTSIpOwogICAgZ290b3h5KDIwLDMpOwogICAgcHJpbnRmKCJFTlRFUiBVbml2ZXJzaXR5IE9mIFNjaWVuY2UgJiBUZWNobm9sb2d5ICxCYW5nbGFkZXNoIik7CiAgICBnb3RveHkoMzEsNCk7CiAgICBwcmludGYoIkRlcGVydG1lbnQgb2YgQ1NFLiIpOwogICAgZ290b3h5KDI1LDI0KTsKICAgIFNldENvbG9yKDE3KTsKCn0KCgoKdm9pZCBwcmludF9oZWFkaW5nKGNvbnN0IGNoYXIgc3RbXSkKewogICAgU2V0Q29sb3JBbmRCYWNrZ3JvdW5kKDMxLDI4KTsKICAgIGdvdG94eSg0NSw4KTsKICAgIHByaW50ZigiU1JTIDogJXMiLHN0KTsKICAgIFNldENvbG9yQW5kQmFja2dyb3VuZCgxNywxNSk7Cn0KCgoKdm9pZCBhZGRfc3R1ZGVudCgpCnsKICAgIGNsZWFyV2luZG93KCk7CiAgICBwcmludF9oZWFkaW5nKCJBZGQgUmVjb3JkIik7CiAgICBpbnQgcHJpbnQgPSAzNzsKICAgIEZJTEUgKmZwOwogICAgZnAgPSBmb3BlbigicmVjb3JkLnR4dCIsImFiKyIpOwogICAgU2V0Q29sb3IoNDUpOwogICAgaWYoZnAgPT0gTlVMTCkKICAgIHsKICAgICAgICBNZXNzYWdlQm94KDAsIkVycm9yIGluIE9wZW5pbmcgZmlsZVxuTWFrZSBzdXJlIHlvdXIgZmlsZSBpcyBub3Qgd3JpdGUgcHJvdGVjdGVkIiwiV2FybmluZyIsMCk7CgogICAgfQogICAgZWxzZQogICAgewogICAgICAgIGZmbHVzaChzdGRpbik7CiAgICAgICAgZ290b3h5KHByaW50LDEwKTsKICAgICAgICBwcmludGYoIklEOiAiKTsKICAgICAgICBnZXRzKHN0dS5JRCk7CiAgICAgICAgLy9oZXJlIHlvdSBjYW4gY29uZmlybXMgdGhlIElECiAgICAgICAgZ290b3h5KHByaW50LDEyKTsKICAgICAgICBwcmludGYoIk5hbWU6ICIpOwogICAgICAgIGdldHMoc3R1Lm5hbWUpOwogICAgICAgIGdvdG94eShwcmludCwxNCk7CiAgICAgICAgcHJpbnRmKCJBZGRyZXNzOiAiKTsKICAgICAgICBnZXRzKHN0dS5hZGQpOwogICAgICAgIGdvdG94eShwcmludCwxNik7CiAgICAgICAgcHJpbnRmKCJQYXJlbnQncyBuYW1lOiAiKTsKICAgICAgICBnZXRzKHN0dS5wYXJuYW1lKTsKICAgICAgICBnb3RveHkocHJpbnQsMTgpOwogICAgICAgIHByaW50ZigiU2VtaXN0ZXI6ICIpOwogICAgICAgIGdldHMoc3R1LnNlbWlzdGVyKTsKICAgICAgICBnb3RveHkocHJpbnQsMjApOwogICAgICAgIHByaW50ZigiUGhvbmUgTnVtYmVyOiAiKTsKICAgICAgICBzY2FuZigiJWxkIiwmc3R1LnBob25lX25vKTsKICAgICAgICBmd3JpdGUoJnN0dSwgc2l6ZW9mKHN0dSksIDEsIGZwKTsKICAgICAgICBnb3RveHkoNDAsMjIpOwogICAgICAgIHByaW50ZigiVGhlIHJlY29yZCBpcyBzdWNlc3NmdWxseSBhZGRlZCIpOwogICAgfQogICAgU2V0Q29sb3IoMjgpOwogICAgZmNsb3NlKGZwKTsKICAgIHJldHVybjsKfQoKdm9pZCBzZWFyY2hfc3R1ZGVudCgpCnsKICAgIGNsZWFyV2luZG93KCk7CiAgICBwcmludF9oZWFkaW5nKCJTZWFyY2ggUmVjb3JkIik7CiAgICBTZXRDb2xvcig0NSk7CiAgICBjaGFyIHNfaWRbMTVdOwogICAgaW50IGlzRm91bmQgPSAwOwogICAgZ290b3h5KDM3LDEwKTsKICAgIHByaW50ZigiRW50ZXIgSUQgdG8gU2VhcmNoOiAiKTsKICAgIGZmbHVzaChzdGRpbik7CiAgICBnZXRzKHNfaWQpOwogICAgRklMRSAqZnA7CiAgICBmcCA9IGZvcGVuKCJyZWNvcmQudHh0IiwicmIiKTsKICAgIHdoaWxlKGZyZWFkKCZzdHUsc2l6ZW9mKHN0dSksMSxmcCkgPT0gMSkKICAgIHsKICAgICAgICBpZihzdHJjbXAoc19pZCxzdHUuSUQpID09IDApCiAgICAgICAgewogICAgICAgICAgICBpc0ZvdW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgaWYoaXNGb3VuZCA9PSAxKQogICAgewogICAgICAgIGdvdG94eSgzNywxMik7CiAgICAgICAgcHJpbnRmKCJUaGUgcmVjb3JkIGlzIEZvdW5kIik7CiAgICAgICAgZ290b3h5KDM3LDE0KTsKICAgICAgICBwcmludGYoIklEOiAlcyIsc3R1LklEKTsKICAgICAgICBnb3RveHkoMzcsMTUpOwogICAgICAgIHByaW50ZigiTmFtZTogJXMiLHN0dS5uYW1lKTsKICAgICAgICBnb3RveHkoMzcsMTYpOwogICAgICAgIHByaW50ZigiQWRkcmVzczogJXMiLHN0dS5hZGQpOwogICAgICAgIGdvdG94eSgzNywxNyk7CiAgICAgICAgcHJpbnRmKCJQYXJlbnQncyBOYW1lOiAlcyIsc3R1LnBhcm5hbWUpOwogICAgICAgIGdvdG94eSgzNywxOCk7CiAgICAgICAgcHJpbnRmKCJTZW1pc3RlcjogJXMiLHN0dS5zZW1pc3Rlcik7CiAgICAgICAgZ290b3h5KDM3LDE5KTsKICAgICAgICBwcmludGYoIlBob25lIE5vOiAlbGQiLHN0dS5waG9uZV9ubyk7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZ290b3h5KDM3LDEyKTsKICAgICAgICBwcmludGYoIlNvcnksIE5vIHJlY29yZCBmb3VuZCBpbiB0aGUgZGF0YWJhc2UiKTsKICAgIH0KICAgIFNldENvbG9yKDI4KTsKICAgIGZjbG9zZShmcCk7CiAgICByZXR1cm47Cn0KCnZvaWQgbW9kX3N0dWRlbnQoKQp7CiAgICBjbGVhcldpbmRvdygpOwogICAgcHJpbnRfaGVhZGluZygiTW9kaWZ5IFJlY29yZCIpOwogICAgU2V0Q29sb3IoNDUpOwogICAgY2hhciBzX2lkWzE1XTsKICAgIGludCBpc0ZvdW5kID0gMCwgcHJpbnQgPSAzNzsKICAgIGdvdG94eSgzNywxMCk7CiAgICBwcmludGYoIkVudGVyIElEIHRvIE1vZGlmeTogIik7CiAgICBmZmx1c2goc3RkaW4pOwogICAgZ2V0cyhzX2lkKTsKICAgIEZJTEUgKmZwOwogICAgZnAgPSBmb3BlbigicmVjb3JkLnR4dCIsInJiKyIpOwogICAgd2hpbGUoZnJlYWQoJnN0dSwgc2l6ZW9mKHN0dSksMSxmcCkgPT0gMSkKICAgIHsKICAgICAgICBpZihzdHJjbXAoc19pZCwgc3R1LklEKSA9PSAwKQogICAgICAgIHsKICAgICAgICAgICAgZmZsdXNoKHN0ZGluKTsKICAgICAgICAgICAgZ290b3h5KHByaW50LDEyKTsKICAgICAgICAgICAgcHJpbnRmKCJJRDogIik7CiAgICAgICAgICAgIGdldHMoc3R1LklEKTsKICAgICAgICAgICAgZ290b3h5KHByaW50LDEzKTsKICAgICAgICAgICAgcHJpbnRmKCJOYW1lOiAiKTsKICAgICAgICAgICAgZ2V0cyhzdHUubmFtZSk7CiAgICAgICAgICAgIGdvdG94eShwcmludCwxNCk7CiAgICAgICAgICAgIHByaW50ZigiQWRkcmVzczogIik7CiAgICAgICAgICAgIGdldHMoc3R1LmFkZCk7CiAgICAgICAgICAgIGdvdG94eShwcmludCwxNSk7CiAgICAgICAgICAgIHByaW50ZigiUGFyZW50J3MgbmFtZTogIik7CiAgICAgICAgICAgIGdldHMoc3R1LnBhcm5hbWUpOwogICAgICAgICAgICBnb3RveHkocHJpbnQsMTYpOwogICAgICAgICAgICBwcmludGYoIlNlbWlzdGVyICIpOwogICAgICAgICAgICBnZXRzKHN0dS5zZW1pc3Rlcik7CiAgICAgICAgICAgIGdvdG94eShwcmludCwxNyk7CiAgICAgICAgICAgIHByaW50ZigiUGhvbmUgTnVtYmVyOiAiKTsKICAgICAgICAgICAgc2NhbmYoIiVsZCIsJnN0dS5waG9uZV9ubyk7CiAgICAgICAgICAgIGZzZWVrKGZwLC1zaXplb2Yoc3R1KSwgU0VFS19DVVIpOwogICAgICAgICAgICBmd3JpdGUoJnN0dSxzaXplb2Yoc3R1KSwgMSwgZnApOwogICAgICAgICAgICBpc0ZvdW5kID0gMTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgfQogICAgaWYoIWlzRm91bmQpCiAgICB7CiAgICAgICAgZ290b3h5KHByaW50LCAxMik7CiAgICAgICAgcHJpbnRmKCJObyBSZWNvcmQgRm91bmQiKTsKICAgIH0KICAgIGZjbG9zZShmcCk7CiAgICBTZXRDb2xvcigyOCk7CiAgICByZXR1cm47Cn0KCgoKdm9pZCBkZWxldGVfc3R1ZGVudCgpCnsKICAgIGNsZWFyV2luZG93KCk7CiAgICBwcmludF9oZWFkaW5nKCJEZWxldGUgUmVjb3JkIik7CiAgICBTZXRDb2xvcig0NSk7CiAgICBjaGFyIHNfaWRbMTVdOwogICAgaW50IGlzRm91bmQgPSAwLCBwcmludCA9IDM3OwogICAgZ290b3h5KDM3LDEwKTsKICAgIHByaW50ZigiRW50ZXIgSUQgdG8gTW9kaWZ5OiAiKTsKICAgIGZmbHVzaChzdGRpbik7CiAgICBnZXRzKHNfaWQpOwogICAgRklMRSAqZnAsICp0ZW1wOwogICAgZnAgPSBmb3BlbigicmVjb3JkLnR4dCIsInJiIik7CiAgICB0ZW1wID0gZm9wZW4oInRlbXAudHh0IiwgIndiIik7CiAgICB3aGlsZShmcmVhZCgmc3R1LCBzaXplb2Yoc3R1KSwxLGZwKSA9PSAxKQogICAgewogICAgICAgIGlmKHN0cmNtcChzX2lkLCBzdHUuSUQpID09IDApCiAgICAgICAgewogICAgICAgICAgICBmd3JpdGUoJnN0dSxzaXplb2Yoc3R1KSwxLHRlbXApOwogICAgICAgIH0KICAgIH0KICAgIGZjbG9zZShmcCk7CiAgICBmY2xvc2UodGVtcCk7CiAgICByZW1vdmUoInJlY29yZC50eHQiKTsKICAgIHJlbmFtZSgidGVtcC50eHQiLCJyZWNvcmQudHh0Iik7CiAgICBnb3RveHkoMzcsMTIpOwogICAgcHJpbnRmKCJUaGUgcmVjb3JkIGlzIHN1Y2Vzc2Z1bGx5IGRlbGV0ZWQiKTsKICAgIFNldENvbG9yKDI4KTsKICAgIHJldHVybjsKfQoKdm9pZCBtYWluX3dpbmRvdygpCnsKICAgIGludCBjaG9pY2U7CiAgICBTZXRDb2xvcigyOCk7CiAgICBpbnQgeCA9IDI7CiAgICB3aGlsZSgxKQogICAgewogICAgICAgIGdvdG94eSh4LDgpOwogICAgICAgIHByaW50ZigiMS4gQWRkIFN0dWRlbnQiKTsKICAgICAgICBnb3RveHkoeCwxMCk7CiAgICAgICAgcHJpbnRmKCIyLiBTZWFyY2ggU3R1ZGVudCIpOwogICAgICAgIGdvdG94eSh4LDEyKTsKICAgICAgICBwcmludGYoIjMuIE1vZGlmeSBTdHVkZW50IFJlY29yZCIpOwogICAgICAgIGdvdG94eSh4LDE0KTsKICAgICAgICBwcmludGYoIjQuIERlbGV0ZSBTdHVkZW50IFJlY29yZCIpOwogICAgICAgIGdvdG94eSh4LDE2KTsKICAgICAgICBwcmludGYoIjUuIEV4aXQiKTsKICAgICAgICBnb3RveHkoeCwxOCk7CiAgICAgICAgcHJpbnRmKCJFbnRlciB5b3VyIGNob2ljZTogIik7CiAgICAgICAgc2NhbmYoIiVkIiwmY2hvaWNlKTsKICAgICAgICBzd2l0Y2goY2hvaWNlKQogICAgICAgIHsKICAgICAgICBjYXNlIDE6CiAgICAgICAgICAgIGFkZF9zdHVkZW50KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgc2VhcmNoX3N0dWRlbnQoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSAzOgogICAgICAgICAgICBtb2Rfc3R1ZGVudCgpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA0OgogICAgICAgICAgICBkZWxldGVfc3R1ZGVudCgpOwogICAgICAgICAgICBicmVhazsKCiAgICAgICAgY2FzZSA1OgogICAgICAgICAgICBleGl0KDApOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICBicmVhazsKICAgICAgICB9CgogICAgfQoKfQoKaW50IG1haW4oKQp7CiAgICBDbGVhckNvbnNvbGVUb0NvbG9ycygxNywxNSk7CiAgICBTZXRDb25zb2xlVGl0bGUoIlN0dWRlbnQgUmVjb3JkIHN5c3l0ZW0gdXNpbmcgIEMgcHJvZ3JhbW1pbmciKTsKICAgIHdpbmRvdygpOwogICAgLy91c2VfcGFzc19maWVsZCgpOwogICAgbWFpbl93aW5kb3coKTsKICAgIHJldHVybiAwOwp9CgoK