#include<stdio.h>
#include<stdlib.h>
#include<conio.h>
#include<string.h>
void addrecord();
void viewrecord();
void deleterecord();
struct record
{
char time[6];
char name[30];
char place[25];
char note[1000];
} ;
int main()
{
int ch;
printf("\n\n\t\t\t***********************************\n");
printf("\t\t\t\tWELCOME TO DIGITAL DIARY\n");
printf("\t\t\t***********************************");
system("color 3F");
while(1)
{
printf("\n\nMAIN MENU:");
printf("\n\n\tADD RECORD\t[1]");
printf("\n\tVIEW RECORD\t[2]");
printf("\n\tDELETE RECORD\t[3]");
printf("\n\tEXIT\t\t[4]");
printf("\n\n\tENTER YOUR CHOICE:");
scanf("%d",&ch);
switch(ch)
{
case 1:
addrecord();
break;
case 2:
viewrecord();
break;
case 3:
deleterecord();
case 4:
printf("\n\n\t\tTHANK YOU. SEE YOU SOON");
getch();
exit(0);
default:
printf("\nYOU ENTERED WRONG CHOICE..");
printf("\nPRESS ANY KEY TO TRY AGAIN");
getch();
break;
}
system("cls");
}
return 0;
}
void addrecord( )
{
system("cls");
FILE *fp ;
char another = 'Y' ,time[10];
struct record e ;
char filename[15];
int choice;
printf("\n\n\t\t***************************\n");
printf("\t\t* WELCOME TO THE ADD MENU *");
printf("\n\t\t***************************\n\n");
printf("\n\n\tENTER DATE OF YOUR RECORD:[yyyy-mm-dd]:");
fflush(stdin);
gets(filename);
fp = fopen (filename, "a+" ) ;
if ( fp == NULL )
{
fp=fopen(filename,"w+");
if(fp==NULL)
{
printf("\nSYSTEM ERROR...");
printf("\nPRESS ANY KEY TO EXIT");
getch();
return ;
}
}
while ( another == 'Y'|| another=='y' )
{
choice=0;
fflush(stdin);
printf ( "\n\tENTER TIME:[hh:mm]:");
scanf("%s",time);
rewind(fp);
while(fread(&e,sizeof(e),1,fp)==1)
{
if(strcmp(e.time,time)==0)
{
printf("\n\tTHE RECORD ALREADY EXISTS.\n");
choice=1;
}
}
if(choice==0)
{
strcpy(e.time,time);
printf("\tENTER NAME:");
fflush(stdin);
gets(e.name);
fflush(stdin);
printf("\tENTER PLACE:");
gets(e.place);
fflush(stdin);
printf("\tNOTE:");
gets(e.note);
fwrite ( &e, sizeof ( e ), 1, fp ) ;
printf("\nYOUR RECORD IS ADDED...\n");
}
printf ( "\n\tADD ANOTHER RECORD...(Y/N) " ) ;
fflush ( stdin ) ;
another = getchar( ) ;
}
fclose ( fp ) ;
printf("\n\n\tPRESS ANY KEY TO EXIT...");
getch();
}
void viewrecord( )
{
FILE *fpte ;
system("cls");
struct record customer ;
char time[6],choice,filename[14];
int ch;
printf("\n\n\t\t*******************************\n");
printf("\t\t* HERE IS THE VIEWING MENU *");
printf("\n\t\t*******************************\n\n");
do
{
printf("\n\tENTER THE DATE OF RECORD TO BE VIEWED:[yyyy-mm-dd]:");
fflush(stdin);
gets(filename);
fpte = fopen ( filename, "r" ) ;
if ( fpte == NULL )
{
puts ( "\n\t\tTHE RECORD DOES NOT EXIST...\n" ) ;
printf("\t\tPRESS ANY KEY TO EXIT...");
getch();
return ;
}
system("cls");
printf("\n\tHOW WOULD YOU LIKE TO VIEW:\n");
printf("\n\t1.WHOLE RECORD OF THE DAY.");
printf("\n\t2.RECORD OF FIX TIME.\n\n");
printf("\n\t\tENTER YOUR CHOICE:");
scanf("%d",&ch);
switch(ch)
{
case 1:
printf("\nTHE WHOLE RECORD FOR %s IS:",filename);
while ( fread ( &customer, sizeof ( customer ), 1, fpte ) == 1 )
{
printf("\n");
printf("\nTIME: %s",customer.time);
printf("\nNAME: %s",customer.name);
printf("\nPLACE: %s",customer.place);
printf("\nNOTE: %s",customer.note);
printf("\n");
}
break;
case 2:
fflush(stdin);
printf("\nENTER TIME:[hh:mm]:");
gets(time);
while ( fread ( &customer, sizeof ( customer ), 1, fpte ) == 1 )
{
if(strcmp(customer.time,time)==0)
{
printf("\nYOUR RECORD IS:");
printf("\nTIME: %s",customer.time);
printf("\nNAME: %s",customer.name);
printf("\nPLACE: %s",customer.place);
printf("\nNOTE: %s",customer.note);
}
}
break;
default: printf("\nYOU TYPED SOMETHING ELSE...\n");
break;
}
printf("\n\nWOULD YOU LIKE TO CONTINUE VIEWING...(Y/N):");
fflush(stdin);
scanf("%c",&choice);
}while(choice=='Y'||choice=='y');
fclose ( fpte ) ;
return ;
}
void deleterecord( )
{
system("cls");
FILE *fp,*fptr ;
struct record file ;
char filename[15],another = 'Y' ,time[10];;
int choice,check;
printf("\n\n\t\t*************************\n");
printf("\t\t* WELCOME TO DELETE MENU*");
printf("\n\t\t*************************\n\n");
while ( another == 'Y' )
{
printf("\n\n\tHOW WOULD YOU LIKE TO DELETE:\n\n");
printf("\n\n\t#DELETE WHOLE RECORD\t\t\t[1]");
printf("\n\t#DELETE A PARTICULAR RECORD BY TIME\t[2]\n\n");
do
{
printf("\n\t\tENTER YOUR CHOICE:");
scanf("%d",&choice);
switch(choice)
{
case 1:
printf("\n\tENTER THE DATE OF RECORD TO BE DELETED:[yyyy-mm-dd]:");
fflush(stdin);
gets(filename);
fp = fopen (filename, "w" ) ;
if ( fp == NULL )
{
printf("\nTHE FILE DOES NOT EXISTS");
printf("\nPRESS ANY KEY TO GO BACK.");
getch();
return ;
}
fclose(fp);
remove(filename);
printf("\nDELETED SUCCESFULLY...");
break;
case 2:
printf("\n\tENTER THE DATE OF RECORD:[yyyy-mm-dd]:");
fflush(stdin);
gets(filename);
fp = fopen (filename, "r" ) ;
if ( fp == NULL )
{
printf("\nTHE FILE DOES NOT EXISTS");
printf("\nPRESS ANY KEY TO GO BACK.");
getch();
return ;
}
fptr=fopen("temp","w");
if(fptr==NULL)
{
printf("\nSYSTEM ERROR");
printf("\nPRESS ANY KEY TO GO BACK");
getch();
return ;
}
printf("\n\tENTER THE TIME OF RECORD TO BE DELETED:[hh:mm]:");
fflush(stdin);
gets(time);
while(fread(&file,sizeof(file),1,fp)==1)
{
if(strcmp(file.time,time)!=0)
fwrite(&file,sizeof(file),1,fptr);
}
fclose(fp);
fclose(fptr);
remove(filename);
rename("temp",filename);
printf("\nDELETED SUCCESFULLY...");
break;
default:
printf("\n\tYOU ENTERED WRONG CHOICE");
break;
}
}while(choice<1||choice>2);
printf("\n\tDO YOU LIKE TO DELETE ANOTHER RECORD.(Y/N):");
fflush(stdin);
scanf("%c",&another);
}
printf("\n\n\tPRESS ANY KEY TO EXIT...");
getch();
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPGNvbmlvLmg+CiNpbmNsdWRlPHN0cmluZy5oPgoKCnZvaWQgYWRkcmVjb3JkKCk7CnZvaWQgdmlld3JlY29yZCgpOwp2b2lkIGRlbGV0ZXJlY29yZCgpOwpzdHJ1Y3QgcmVjb3JkCnsKCiAgICBjaGFyIHRpbWVbNl07CiAgICBjaGFyIG5hbWVbMzBdOwogICAgY2hhciBwbGFjZVsyNV07CiAgICBjaGFyIG5vdGVbMTAwMF07Cgp9IDsKCgppbnQgbWFpbigpCgp7CgogICAgaW50IGNoOwogICAgcHJpbnRmKCJcblxuXHRcdFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwogICAgcHJpbnRmKCJcdFx0XHRcdFdFTENPTUUgVE8gRElHSVRBTCBESUFSWVxuIik7CiAgICBwcmludGYoIlx0XHRcdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqIik7CiAgICBzeXN0ZW0oImNvbG9yIDNGIik7CiAgIHdoaWxlKDEpCgoKICAgICAgICB7CgogICAgICAgICAgICAgICAgcHJpbnRmKCJcblxuTUFJTiBNRU5VOiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcblxuXHRBREQgUkVDT1JEXHRbMV0iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFZJRVcgUkVDT1JEXHRbMl0iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdERFTEVURSBSRUNPUkRcdFszXSIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0RVhJVFx0XHRbNF0iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cblx0RU5URVIgWU9VUiBDSE9JQ0U6Iik7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZjaCk7CgogICAgICAgICAgICBzd2l0Y2goY2gpCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgY2FzZSAxOgogICAgICAgICAgICAgICAgICAgICAgICAgICAgYWRkcmVjb3JkKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgdmlld3JlY29yZCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBjYXNlIDM6CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBkZWxldGVyZWNvcmQoKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgNDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cblx0XHRUSEFOSyBZT1UuIFNFRSBZT1UgU09PTiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0Y2goKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIGV4aXQoMCk7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5ZT1UgRU5URVJFRCBXUk9ORyBDSE9JQ0UuLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblBSRVNTIEFOWSBLRVkgVE8gVFJZIEFHQUlOIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CgogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIHN5c3RlbSgiY2xzIik7CiAgICAgICAgfQogICAgICAgICAgICByZXR1cm4gMDsKfQp2b2lkIGFkZHJlY29yZCggKQoKewogICAgICAgICAgICAgICAgc3lzdGVtKCJjbHMiKTsKICAgICAgICAgICAgICAgIEZJTEUgKmZwIDsKICAgICAgICAgICAgICAgIGNoYXIgYW5vdGhlciA9ICdZJyAsdGltZVsxMF07CiAgICAgICAgICAgICAgICBzdHJ1Y3QgcmVjb3JkIGUgOwogICAgICAgICAgICAgICAgY2hhciBmaWxlbmFtZVsxNV07CiAgICAgICAgICAgICAgICBpbnQgY2hvaWNlOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcblxuXHRcdCoqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CiAgICAgICAgICAgICAgICBwcmludGYoIlx0XHQqIFdFTENPTUUgVE8gVEhFIEFERCBNRU5VICoiKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcblxuXHRFTlRFUiBEQVRFIE9GIFlPVVIgUkVDT1JEOlt5eXl5LW1tLWRkXToiKTsKICAgICAgICAgICAgICAgIGZmbHVzaChzdGRpbik7CiAgICAgICAgICAgICAgICBnZXRzKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgIGZwID0gZm9wZW4gKGZpbGVuYW1lLCAiYSsiICkgOwogICAgICAgICAgICAgICAgaWYgKCBmcCA9PSBOVUxMICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGZwPWZvcGVuKGZpbGVuYW1lLCJ3KyIpOwogICAgICAgICAgICAgICAgaWYoZnA9PU5VTEwpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblNZU1RFTSBFUlJPUi4uLiIpOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5QUkVTUyBBTlkgS0VZIFRPIEVYSVQiKTsKICAgICAgICAgICAgICAgICAgICBnZXRjaCgpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB3aGlsZSAoIGFub3RoZXIgPT0gJ1knfHwgYW5vdGhlcj09J3knICkKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjaG9pY2U9MDsKICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkaW4pOwogICAgICAgICAgICAgICAgcHJpbnRmICggIlxuXHRFTlRFUiBUSU1FOltoaDptbV06Iik7CiAgICAgICAgICAgICAgICBzY2FuZigiJXMiLHRpbWUpOwogICAgICAgICAgICAgIHJld2luZChmcCk7CiAgICAgICAgICAgICAgICB3aGlsZShmcmVhZCgmZSxzaXplb2YoZSksMSxmcCk9PTEpCiAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgaWYoc3RyY21wKGUudGltZSx0aW1lKT09MCkKCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRUSEUgUkVDT1JEIEFMUkVBRFkgRVhJU1RTLlxuIik7CiAgICAgICAgICAgICAgICAgICAgICAgIGNob2ljZT0xOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihjaG9pY2U9PTApCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICBzdHJjcHkoZS50aW1lLHRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0RU5URVIgTkFNRToiKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGluKTsKICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cyhlLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICBmZmx1c2goc3RkaW4pOwogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0RU5URVIgUExBQ0U6Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGdldHMoZS5wbGFjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXHROT1RFOiIpOwogICAgICAgICAgICAgICAgICAgICAgICBnZXRzKGUubm90ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIGZ3cml0ZSAoICZlLCBzaXplb2YgKCBlICksIDEsIGZwICkgOwogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuWU9VUiBSRUNPUkQgSVMgQURERUQuLi5cbiIpOwoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZiAoICJcblx0QUREIEFOT1RIRVIgUkVDT1JELi4uKFkvTikgIiApIDsKICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoICggc3RkaW4gKSA7CiAgICAgICAgICAgICAgICAgICAgICAgIGFub3RoZXIgPSBnZXRjaGFyKCApIDsKICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICBmY2xvc2UgKCBmcCApIDsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cblx0UFJFU1MgQU5ZIEtFWSBUTyBFWElULi4uIik7CiAgICAgICAgICAgICAgICBnZXRjaCgpOwoKICAgIH0KCnZvaWQgdmlld3JlY29yZCggKQp7CiAgICAgICAgRklMRSAqZnB0ZSA7CiAgICAgICAgc3lzdGVtKCJjbHMiKTsKICAgICAgICBzdHJ1Y3QgcmVjb3JkIGN1c3RvbWVyIDsKICAgICAgICBjaGFyIHRpbWVbNl0sY2hvaWNlLGZpbGVuYW1lWzE0XTsKICAgICAgICBpbnQgY2g7CiAgICAgICAgcHJpbnRmKCJcblxuXHRcdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcbiIpOwogICAgICAgIHByaW50ZigiXHRcdCogSEVSRSBJUyBUSEUgVklFV0lORyBNRU5VICoiKTsKICAgICAgICBwcmludGYoIlxuXHRcdCoqKioqKioqKioqKioqKioqKioqKioqKioqKioqKipcblxuIik7CgoKICAgICAgICBkbwogICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0RU5URVIgVEhFIERBVEUgT0YgUkVDT1JEIFRPIEJFIFZJRVdFRDpbeXl5eS1tbS1kZF06Iik7CiAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGluKTsKICAgICAgICAgICAgICAgICAgICBnZXRzKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICBmcHRlID0gZm9wZW4gKCBmaWxlbmFtZSwgInIiICkgOwogICAgICAgICAgICAgICAgICAgIGlmICggZnB0ZSA9PSBOVUxMICkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHB1dHMgKCAiXG5cdFx0VEhFIFJFQ09SRCBET0VTIE5PVCBFWElTVC4uLlxuIiApIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0XHRQUkVTUyBBTlkgS0VZIFRPIEVYSVQuLi4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHN5c3RlbSgiY2xzIik7CiAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRIT1cgV09VTEQgWU9VIExJS0UgVE8gVklFVzpcbiIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0MS5XSE9MRSBSRUNPUkQgT0YgVEhFIERBWS4iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdDIuUkVDT1JEIE9GIEZJWCBUSU1FLlxuXG4iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFx0RU5URVIgWU9VUiBDSE9JQ0U6Iik7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZjaCk7CiAgICAgICAgICAgICAgICBzd2l0Y2goY2gpCiAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5USEUgV0hPTEUgUkVDT1JEIEZPUiAlcyBJUzoiLGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlICggZnJlYWQgKCAmY3VzdG9tZXIsIHNpemVvZiAoIGN1c3RvbWVyICksIDEsIGZwdGUgKSA9PSAxICkKICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5USU1FOiAlcyIsY3VzdG9tZXIudGltZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuTkFNRTogJXMiLGN1c3RvbWVyLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblBMQUNFOiAlcyIsY3VzdG9tZXIucGxhY2UpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbk5PVEU6ICVzIixjdXN0b21lci5ub3RlKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5FTlRFUiBUSU1FOltoaDptbV06Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRzKHRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgd2hpbGUgKCBmcmVhZCAoICZjdXN0b21lciwgc2l6ZW9mICggY3VzdG9tZXIgKSwgMSwgZnB0ZSApID09IDEgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cmNtcChjdXN0b21lci50aW1lLHRpbWUpPT0wKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbllPVVIgUkVDT1JEIElTOiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuVElNRTogJXMiLGN1c3RvbWVyLnRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuTkFNRTogJXMiLGN1c3RvbWVyLm5hbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuUExBQ0U6ICVzIixjdXN0b21lci5wbGFjZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5OT1RFOiAlcyIsY3VzdG9tZXIubm90ZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIGRlZmF1bHQ6IHByaW50ZigiXG5ZT1UgVFlQRUQgU09NRVRISU5HIEVMU0UuLi5cbiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgcHJpbnRmKCJcblxuV09VTEQgWU9VIExJS0UgVE8gQ09OVElOVUUgVklFV0lORy4uLihZL04pOiIpOwogICAgICAgICAgICAgICBmZmx1c2goc3RkaW4pOwogICAgICAgICAgICBzY2FuZigiJWMiLCZjaG9pY2UpOwogICAgICAgIH13aGlsZShjaG9pY2U9PSdZJ3x8Y2hvaWNlPT0neScpOwogICAgICAgICAgICBmY2xvc2UgKCBmcHRlICkgOwogICAgICAgICAgICByZXR1cm4gOwoKfQogICB2b2lkIGRlbGV0ZXJlY29yZCggKQoKICAgIHsKCiAgICAgICAgICAgICAgICAgICAgc3lzdGVtKCJjbHMiKTsKICAgICAgICAgICAgICAgICAgICBGSUxFICpmcCwqZnB0ciA7CiAgICAgICAgICAgICAgICAgICAgc3RydWN0IHJlY29yZCBmaWxlIDsKICAgICAgICAgICAgICAgICAgICBjaGFyIGZpbGVuYW1lWzE1XSxhbm90aGVyID0gJ1knICx0aW1lWzEwXTs7CgogICAgICAgICAgICAgICAgICAgIGludCBjaG9pY2UsY2hlY2s7CgogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cblx0XHQqKioqKioqKioqKioqKioqKioqKioqKioqXG4iKTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlx0XHQqIFdFTENPTUUgVE8gREVMRVRFIE1FTlUqIik7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblx0XHQqKioqKioqKioqKioqKioqKioqKioqKioqXG5cbiIpOwoKICAgICAgICAgICAgICAgICAgICB3aGlsZSAoIGFub3RoZXIgPT0gJ1knICkKCiAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXG5cdEhPVyBXT1VMRCBZT1UgTElLRSBUTyBERUxFVEU6XG5cbiIpOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cblx0I0RFTEVURSBXSE9MRSBSRUNPUkRcdFx0XHRbMV0iKTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHQjREVMRVRFIEEgUEFSVElDVUxBUiBSRUNPUkQgQlkgVElNRVx0WzJdXG5cbiIpOwogICAgICAgICAgICAgICAgICAgIGRvCgogICAgICAgICAgICAgICAgICAgIHsKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRcdEVOVEVSIFlPVVIgQ0hPSUNFOiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmY2hvaWNlKTsKICAgICAgICAgICAgICAgICAgICAgICAgc3dpdGNoKGNob2ljZSkKCiAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMToKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRFTlRFUiBUSEUgREFURSBPRiBSRUNPUkQgVE8gQkUgREVMRVRFRDpbeXl5eS1tbS1kZF06Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRzKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcCA9IGZvcGVuIChmaWxlbmFtZSwgInciICkgOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmICggZnAgPT0gTlVMTCApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgewoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblRIRSBGSUxFIERPRVMgTk9UIEVYSVNUUyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuUFJFU1MgQU5ZIEtFWSBUTyBHTyBCQUNLLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOwoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZjbG9zZShmcCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuREVMRVRFRCBTVUNDRVNGVUxMWS4uLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGNhc2UgMjoKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRFTlRFUiBUSEUgREFURSBPRiBSRUNPUkQ6W3l5eXktbW0tZGRdOiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRpbik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZ2V0cyhmaWxlbmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZnAgPSBmb3BlbiAoZmlsZW5hbWUsICJyIiApIDsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBpZiAoIGZwID09IE5VTEwgKQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblRIRSBGSUxFIERPRVMgTk9UIEVYSVNUUyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuUFJFU1MgQU5ZIEtFWSBUTyBHTyBCQUNLLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRjaCgpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZXR1cm4gOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmcHRyPWZvcGVuKCJ0ZW1wIiwidyIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKGZwdHI9PU5VTEwpCgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblNZU1RFTSBFUlJPUiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuUFJFU1MgQU5ZIEtFWSBUTyBHTyBCQUNLIik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGdldGNoKCk7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHJldHVybiA7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdEVOVEVSIFRIRSBUSU1FIE9GIFJFQ09SRCBUTyBCRSBERUxFVEVEOltoaDptbV06Iik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmZsdXNoKHN0ZGluKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBnZXRzKHRpbWUpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGZyZWFkKCZmaWxlLHNpemVvZihmaWxlKSwxLGZwKT09MSkKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGlmKHN0cmNtcChmaWxlLnRpbWUsdGltZSkhPTApCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGZ3cml0ZSgmZmlsZSxzaXplb2YoZmlsZSksMSxmcHRyKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKGZwKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZnB0cik7CiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgcmVtb3ZlKGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICByZW5hbWUoInRlbXAiLGZpbGVuYW1lKTsKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuREVMRVRFRCBTVUNDRVNGVUxMWS4uLiIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICBkZWZhdWx0OgogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cdFlPVSBFTlRFUkVEIFdST05HIENIT0lDRSIpOwogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgfXdoaWxlKGNob2ljZTwxfHxjaG9pY2U+Mik7CgogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXHRETyBZT1UgTElLRSBUTyBERUxFVEUgQU5PVEhFUiBSRUNPUkQuKFkvTik6Iik7CiAgICAgICAgICAgICAgICAgICAgICAgIGZmbHVzaChzdGRpbik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlYyIsJmFub3RoZXIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuXG5cdFBSRVNTIEFOWSBLRVkgVE8gRVhJVC4uLiIpOwoKICAgICAgICAgICAgICAgICAgICBnZXRjaCgpOwoKICAgIH0K