#include<stdio.h>
#include<stdlib.h>
#include<string.h>
//Method Declaration
void enter_name( ) ;
void find_name( ) ;
void find_room( ) ;
void checkout_guest( ) ;
void view_bookings( ) ;
//Instance Field Declaration
FILE * view;
FILE * fp;
FILE * enter;
char admin_entry[ 20 ] = { 'y' } ;
char user_entry[ 20 ] = { 'y' } ;
//structure defined to store name, room, bf and wifi required
struct hotel
{
char name[ 20 ] ;
char room[ 20 ] ;
char Gender[ 20 ] ;
char day[ 20 ] ;
} h;
//main method
int main( ) {
int a,b,c;
//Welcome screen
printf ( "\n \n \t \t *************************************************\n " ) ;
printf ( "\t \t * *\n " ) ;
printf ( "\t \t * ----------------------------- *\n " ) ;
printf ( "\t \t * WELCOME TO HOTEL Mgmt *\n " ) ;
printf ( "\t \t * ----------------------------- *\n " ) ;
printf ( "\t \t * *\n " ) ;
printf ( "\t \t *************************************************\n \n \n " ) ;
printf ( "\n >>>>>>>>>>>>\t For ADMIN access enter --> 1 \t \t \t <<<<<<<<<<<<" ) ;
printf ( "\n >>>>>>>>>>>>\t For USER access enter --> 2 \t \t \t <<<<<<<<<<<<" ) ;
printf ( "\n >> " ) ;
scanf ( "%d" ,& a) ;
switch ( a) {
case 1 : {
char pass[ 10 ] ;
char filepass[ 10 ] ;
int i;
FILE * passw;
passw = fopen ( "pass.txt" ,"r" ) ;
//admins password prompt
printf ( "\n Hello admin!\n Please enter the password to continue --> " ) ;
for ( i= 0 ; i< 6 ; i++ ) {
scanf ( "%s" ,pass) ;
fscanf ( passw,"%s" ,filepass) ;
if ( strcmp ( filepass,pass) == 0 ) {
printf ( "\n \n Access granted!\n " ) ;
fclose ( passw) ;
break ;
}
else {
printf ( "\n Incorrect password, please try again." ) ;
printf ( "\n You have %d trys left " ,5 - i- 1 ) ;
printf ( "\n \n Enter password >> " ) ;
}
if ( i== 4 ) {
fclose ( passw) ;
return 0 ;
}
}
//re-entry if
while ( admin_entry[ 0 ] == 'y' ) {
printf ( "\n >>>>>>>>>>>>\t To VIEW booking requests --> 1 \t \t \t <<<<<<<<<<<<" ) ;
printf ( "\n >>>>>>>>>>>>\t To VIEW booked guests details --> 2 \t \t \t <<<<<<<<<<<<" ) ;
printf ( "\n >>>>>>>>>>>>\t To ENTER new guest --> 3 \t \t \t <<<<<<<<<<<<" ) ;
printf ( "\n >>>>>>>>>>>>\t To FIND room number of existing guest --> 4 \t <<<<<<<<<<<<" ) ;
printf ( "\n >>>>>>>>>>>>\t To FIND guest of occupied room --> 5 \t <<<<<<<<<<<<" ) ;
printf ( "\n >>>>>>>>>>>>\t To CHECKOUT room number of existing guest --> 6 <<<<<<<<<<<<\n " ) ;
printf ( ">> " ) ;
scanf ( "%d" ,& b) ;
switch ( b) {
case 1 : {
view_bookings( ) ;
break ;
}
case 2 : {
FILE * fpi;
fpi = fopen ( "hotelnew.txt" ,"r" ) ;
while ( fscanf ( fpi,"%s %s %s" ,h.name ,h.room ,h.day ) ! = - 1 ) {
fgets ( h.Gender , 255 , ( FILE * ) fpi) ;
printf ( "%s %s %s %s \n " ,h.name ,h.room ,h.day ,h.Gender ) ;
}
break ;
}
case 3 : {
enter_name( ) ;
break ;
}
case 4 : {
find_name( ) ;
break ;
}
case 5 : {
find_room( ) ;
break ;
}
case 6 : {
checkout_guest( ) ;
break ;
}
default : {
printf ( "\n Wrong entry!" ) ;
}
}
//enter again?
printf ( "Would you like to continue? (y/n)\n " ) ;
scanf ( "%s" ,admin_entry) ;
}
if ( strcmp ( admin_entry,"n" ) == 0 ) {
printf ( "Exiting...\n " ) ;
printf ( "\e[1;1H\e[2J" ) ;
printf ( "\n >Exited<\n \n " ) ;
//system("clear");
return 0 ;
}
else {
printf ( "Wrong entry!\n Exiting...\n " ) ;
return 0 ;
}
break ;
}
case 2 : {
while ( user_entry[ 0 ] == 'y' ) {
printf ( "\n Hello user and welcome to Hotel!" ) ;
printf ( "\n >>>>>>>>>>>>\t To view available rooms --> 1 \t \t \t <<<<<<<<<<<<" ) ;
printf ( "\n >>>>>>>>>>>>\t To request booking of room --> 2 \t <<<<<<<<<<<<" ) ;
printf ( "\n >> " ) ;
scanf ( "%d" ,& c) ;
switch ( c) {
case 1 : {
FILE * view;
view = fopen ( "rooms.txt" ,"r" ) ;
printf ( "Available rooms are:\n " ) ;
while ( fscanf ( view,"%s" ,h.room ) ! = - 1 ) {
printf ( "%s \n " ,h.room ) ;
}
fclose ( view) ;
break ;
}
case 2 : {
printf ( "Enter your name: " ) ;
scanf ( "%s" ,h.name ) ;
printf ( "Enter room to book: " ) ;
scanf ( "%s" ,h.room ) ;
printf ( "Enter day (1/5): " ) ;
scanf ( "%s" ,h.day ) ;
printf ( "Enter Gender (Male /Female ): " ) ;
scanf ( "%s" ,h.Gender ) ;
enter = fopen ( "bookings.txt" ,"a" ) ;
fprintf ( enter,"%s %s %s %s" ,h.name ,h.room ,h.day ,h.Gender ) ;
fprintf ( enter,"\n " ) ;
printf ( "Succesfully requested booking\n " ) ;
fclose ( enter) ;
}
}
printf ( "Would you like to continue? (y/n)\n " ) ;
scanf ( "%s" ,user_entry) ;
}
if ( strcmp ( user_entry,"n" ) == 0 ) {
printf ( "Exiting...\n " ) ;
printf ( "\e[1;1H\e[2J" ) ;
printf ( "\n >Exited<\n \n " ) ;
//system("clear");
return 0 ;
}
else {
printf ( "Wrong entry!\n Exiting...\n " ) ;
return 0 ;
}
break ;
}
}
}
//method declare to enter name
void enter_name( ) {
FILE * tmp1;
FILE * tmp2;
printf ( "\n Enter guest name --> " ) ;
scanf ( "%s" ,h.name ) ;
printf ( "\n Enter their room number --> " ) ;
scanf ( "%s" ,h.room ) ;
printf ( "\n Enter wifi plan (1GB/5GB) --> " ) ;
scanf ( "%s" ,h.day ) ;
printf ( "\n Enter if breakfast is included --> " ) ;
scanf ( "%s" ,h.Gender ) ;
//entering guests
fp = fopen ( "hotelnew.txt" ,"a" ) ;
if ( fp == NULL ) {
printf ( "\n File not found" ) ;
exit ( 1 ) ;
}
else {
fprintf ( fp,"%s %s %s %s" ,h.name ,h.room ,h.day ,h.Gender ) ;
printf ( "\n Done\n " ) ;
}
fprintf ( fp,"\n " ) ;
//
char remove_guest[ 20 ] ;
strcpy ( remove_guest,h.name ) ;
char remove_room[ 20 ] ;
strcpy ( remove_room,h.room ) ;
//removing booking
tmp1 = fopen ( "tmp1.txt" ,"a" ) ;
enter = fopen ( "bookings.txt" ,"r" ) ;
while ( fscanf ( enter,"%s %s %s" ,h.name ,h.room ,h.day ) ! = - 1 ) {
fgetc ( enter) ;
fgets ( h.Gender , 20 , ( FILE * ) enter) ;
if ( strcmp ( h.name ,remove_guest) ! = 0 ) {
fprintf ( tmp1,"%s %s %s %s" ,h.name ,h.room ,h.day ,h.Gender ) ;
}
}
fclose ( enter) ;
fclose ( tmp1) ;
remove ( "bookings.txt" ) ;
rename ( "tmp1.txt" ,"bookings.txt" ) ;
fclose ( fp) ;
//removing room
tmp2 = fopen ( "tmp2.txt" ,"a" ) ;
view = fopen ( "rooms.txt" ,"r" ) ;
while ( fscanf ( view,"%s" ,h.room ) ! = - 1 ) {
if ( strcmp ( h.room ,remove_room) ! = 0 ) {
fprintf ( tmp2,"%s" ,h.room ) ;
fprintf ( tmp2,"\n " ) ;
}
}
fclose ( view) ;
fclose ( tmp2) ;
remove ( "rooms.txt" ) ;
rename ( "tmp2.txt" ,"rooms.txt" ) ;
fclose ( fp) ;
}
//method defined to find quest name
void find_name( ) {
char buffer[ 20 ] ;
char entered_name[ 20 ] ;
int guestFound = 0 ;
printf ( "\n Enter guest name to find -->" ) ;
scanf ( "%s" ,entered_name) ;
fp = fopen ( "hotelnew.txt" ,"r" ) ;
while ( fscanf ( fp,"%s %s %s" ,h.name ,h.room ,h.day ) ! = - 1 ) {
fgets ( h.day , 255 , ( FILE * ) fp) ;
if ( strcmp ( h.name ,entered_name) == 0 ) {
guestFound = 1 ;
printf ( "\n Guest found!" ) ;
printf ( "\n Name is %s" ,h.name ) ;
printf ( "\n Room number is %s" ,h.room ) ;
printf ( "\n WiFi plan is %s" ,h.day ) ;
printf ( "\n Breakfast included %s" ,h.Gender ) ;
}
}
if ( guestFound == 0 ) {
printf ( "\n Guest %s not found!\n " , entered_name) ;
}
fclose ( fp) ;
}
//method definition for guest checkout
void checkout_guest( ) {
char buffer2[ 20 ] ;
char checkout_name[ 20 ] ;
char add_room[ 20 ] ;
FILE * tmp;
printf ( "Enter guest too checkout " ) ;
scanf ( "%s" ,checkout_name) ;
fp = fopen ( "hotelnew.txt" ,"r" ) ;
tmp = fopen ( "tmp.txt" ,"w" ) ;
if ( fp == NULL ) {
printf ( "File not found" ) ;
exit ( 1 ) ;
}
else {
while ( fscanf ( fp,"%s %s %s" ,h.name ,h.room ,h.day ) ! = - 1 ) {
fgetc ( fp) ;
fgets ( h.Gender , 20 , ( FILE * ) fp) ;
if ( strcmp ( h.name ,checkout_name) ! = 0 ) {
fprintf ( tmp,"%s %s %s %s" ,h.name ,h.room ,h.day ,h.Gender ) ;
}
else {
strcpy ( add_room,h.room ) ;
}
}
printf ( "Room checked out!" ) ;
}
fclose ( fp) ;
fclose ( tmp) ;
remove ( "hotelnew.txt" ) ;
rename ( "tmp.txt" ,"hotelnew.txt" ) ;
//enter room back into available rooms list
view = fopen ( "rooms.txt" ,"a" ) ;
printf ( " add is %s" ,add_room) ;
fprintf ( view,"%s" ,add_room) ;
fclose ( view) ;
}
//method definition for finding rooms avalaible
void find_room( ) {
char buffer[ 20 ] ;
char entered_room[ 20 ] ;
int roomFound = 0 ;
FILE * fp;
printf ( "\n Enter room number to find -->" ) ;
scanf ( "%s" ,entered_room) ;
fp = fopen ( "hotelnew.txt" ,"r" ) ;
while ( fscanf ( fp,"%s %s %s" ,h.name ,h.room ,h.day ) ! = - 1 ) {
fgets ( h.Gender , 255 , ( FILE * ) fp) ;
if ( strcmp ( h.room ,entered_room) == 0 ) {
roomFound = 1 ;
printf ( "\n Room found!" ) ;
printf ( "\n Name is %s" ,h.name ) ;
printf ( "\n Room number is %s" ,h.room ) ;
printf ( "WiFi plan is %s" ,h.day ) ;
printf ( "\n Breakfast included %s" ,h.Gender ) ;
}
}
if ( roomFound == 0 ) {
printf ( "\n Room %s not found!\n " , entered_room) ;
}
fclose ( fp) ;
}
//method defined to view bookings
void view_bookings( ) {
enter = fopen ( "bookings.txt" ,"r" ) ;
while ( fscanf ( enter,"%s %s %s" ,h.name ,h.room ,h.day ) ! = - 1 ) {
fgets ( h.Gender , 255 , ( FILE * ) enter) ;
printf ( "%s %s %s %s \n " ,h.name ,h.room ,h.day ,h.Gender ) ;
}
}
I2luY2x1ZGU8c3RkaW8uaD4KI2luY2x1ZGU8c3RkbGliLmg+CiNpbmNsdWRlPHN0cmluZy5oPgoKLy9NZXRob2QgRGVjbGFyYXRpb24KCnZvaWQgZW50ZXJfbmFtZSgpOwp2b2lkIGZpbmRfbmFtZSgpOwp2b2lkIGZpbmRfcm9vbSgpOwp2b2lkIGNoZWNrb3V0X2d1ZXN0KCk7CnZvaWQgdmlld19ib29raW5ncygpOwoKLy9JbnN0YW5jZSBGaWVsZCBEZWNsYXJhdGlvbgpGSUxFKiB2aWV3OwpGSUxFICpmcDsKRklMRSogZW50ZXI7CmNoYXIgYWRtaW5fZW50cnlbMjBdID0geyd5J307CmNoYXIgdXNlcl9lbnRyeVsyMF0gPSB7J3knfTsKCi8vc3RydWN0dXJlIGRlZmluZWQgdG8gc3RvcmUgbmFtZSwgcm9vbSwgYmYgYW5kIHdpZmkgcmVxdWlyZWQKc3RydWN0IGhvdGVsCnsKICAgIGNoYXIgbmFtZVsyMF07CiAgICBjaGFyIHJvb21bMjBdOwogICAgY2hhciBHZW5kZXJbMjBdOwogICAgY2hhciBkYXlbMjBdOwoKfWg7CgovL21haW4gbWV0aG9kCmludCBtYWluKCl7IAoKICAgIGludCBhLGIsYzsKCiAgICAgLy9XZWxjb21lIHNjcmVlbgoKIAlwcmludGYoIlxuXG5cdFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuIik7CglwcmludGYoIlx0XHQqICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAqXG4iKTsKCXByaW50ZigiXHRcdCogICAgICAgLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0gICAgICAgICAgICpcbiIpOwoJcHJpbnRmKCJcdFx0KiAgICAgICAgICAgIFdFTENPTUUgVE8gSE9URUwgTWdtdCAgICAgICAgICAgICAgKlxuIik7CglwcmludGYoIlx0XHQqICAgICAgIC0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tICAgICAgICAgICAqXG4iKTsKCXByaW50ZigiXHRcdCogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICpcbiIpOwoJcHJpbnRmKCJcdFx0KioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKioqKlxuXG5cbiIpOwoKICAgIHByaW50ZigiXG4+Pj4+Pj4+Pj4+Pj5cdEZvciBBRE1JTiBhY2Nlc3MgZW50ZXIgLS0+IDEgXHRcdFx0PDw8PDw8PDw8PDw8Iik7CiAgICBwcmludGYoIlxuPj4+Pj4+Pj4+Pj4+XHRGb3IgVVNFUiBhY2Nlc3MgZW50ZXIgLS0+IDIgXHRcdFx0PDw8PDw8PDw8PDw8Iik7CiAgICBwcmludGYoIlxuPj4gIik7CiAgICAgc2NhbmYoIiVkIiwmYSk7CgogICAgICAgIHN3aXRjaChhKXsKICAgICAgICAgICAgY2FzZSAxOnsKICAgICAgICAgICAgICAgIGNoYXIgcGFzc1sxMF07CiAgICAgICAgICAgICAgICBjaGFyIGZpbGVwYXNzWzEwXTsKICAgICAgICAgICAgICAgIGludCBpOwoKICAgICAgICAgICAgICAgIEZJTEUgKnBhc3N3OwogICAgICAgICAgICAgICAgcGFzc3cgPSBmb3BlbigicGFzcy50eHQiLCJyIik7CgogICAgICAgICAgICAgICAgLy9hZG1pbnMgcGFzc3dvcmQgcHJvbXB0CiAgICAgICAgICAgICAgICBwcmludGYoIlxuIEhlbGxvIGFkbWluIVxuIFBsZWFzZSBlbnRlciB0aGUgcGFzc3dvcmQgdG8gY29udGludWUgLS0+ICIpOwoKICAgICAgICAgICAgICAgIGZvcihpPTA7IGk8NjsgaSsrKXsKICAgICAgICAgICAgICAgICAgICBzY2FuZigiJXMiLHBhc3MpOwogICAgICAgICAgICAgICAgICAgIGZzY2FuZihwYXNzdywiJXMiLGZpbGVwYXNzKTsKICAgICAgICAgICAgICAgICAgICBpZiAoc3RyY21wKGZpbGVwYXNzLHBhc3MpID09IDApIHsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcblxuQWNjZXNzIGdyYW50ZWQhXG4iKTsKICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKHBhc3N3KTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5JbmNvcnJlY3QgcGFzc3dvcmQsIHBsZWFzZSB0cnkgYWdhaW4uIik7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5Zb3UgaGF2ZSAlZCB0cnlzIGxlZnQgIiw1LWktMSk7CiAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG5cbkVudGVyIHBhc3N3b3JkID4+ICIpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBpZihpPT00KXsKICAgICAgICAgICAgICAgICAgICAgICAgZmNsb3NlKHBhc3N3KTsKICAgICAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICAgICAgfQoKICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICB9CgogICAgICAgICAgICAgICAgIC8vcmUtZW50cnkgaWYKICAgICAgICAgICAgICAgIHdoaWxlKGFkbWluX2VudHJ5WzBdID09J3knKXsKCiAgICAgICAgICAgICAgICBwcmludGYoIlxuPj4+Pj4+Pj4+Pj4+XHRUbyBWSUVXIGJvb2tpbmcgcmVxdWVzdHMgLS0+IDEgXHRcdFx0PDw8PDw8PDw8PDw8Iik7CiAgICAgICAgICAgICAgICBwcmludGYoIlxuPj4+Pj4+Pj4+Pj4+XHRUbyBWSUVXIGJvb2tlZCBndWVzdHMgZGV0YWlscyAtLT4gMiBcdFx0XHQ8PDw8PDw8PDw8PDwiKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG4+Pj4+Pj4+Pj4+Pj5cdFRvIEVOVEVSIG5ldyBndWVzdCAtLT4gMyBcdFx0XHQ8PDw8PDw8PDw8PDwiKTsKICAgCSAgICAgICAgICAgIHByaW50ZigiXG4+Pj4+Pj4+Pj4+Pj5cdFRvIEZJTkQgcm9vbSBudW1iZXIgb2YgZXhpc3RpbmcgZ3Vlc3QgLS0+IDQgXHQ8PDw8PDw8PDw8PDwiKTsKICAgICAgICAgICAgICAgIHByaW50ZigiXG4+Pj4+Pj4+Pj4+Pj5cdFRvIEZJTkQgZ3Vlc3Qgb2Ygb2NjdXBpZWQgcm9vbSAtLT4gNSBcdDw8PDw8PDw8PDw8PCIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcbj4+Pj4+Pj4+Pj4+Plx0VG8gQ0hFQ0tPVVQgcm9vbSBudW1iZXIgb2YgZXhpc3RpbmcgZ3Vlc3QgLS0+IDYgPDw8PDw8PDw8PDw8XG4iKTsKICAgICAgICAgICAgICAgIHByaW50ZigiPj4gIik7CiAgICAgICAgICAgICAgICBzY2FuZigiJWQiLCZiKTsKCiAgICAgICAgICAgICAgICBzd2l0Y2goYil7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOnsKICAgICAgICAgICAgICAgICAgICAgICAgdmlld19ib29raW5ncygpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOnsKICAgICAgICAgICAgICAgICAgICAgICAgRklMRSogZnBpOwogICAgICAgICAgICAgICAgICAgICAgICBmcGkgPSBmb3BlbigiaG90ZWxuZXcudHh0IiwiciIpOwkKCiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlKGZzY2FuZihmcGksIiVzICVzICVzIixoLm5hbWUsaC5yb29tLGguZGF5KSAhPSAtMSl7CQogICAgICAgICAgICAgICAgICAgICAgICAgIGZnZXRzKGguR2VuZGVyLCAyNTUsIChGSUxFKilmcGkpOwogICAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiJXMgJXMgJXMgJXMgXG4iLGgubmFtZSxoLnJvb20saC5kYXksaC5HZW5kZXIpOwogICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgMzp7CiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyX25hbWUoKTsKICAgICAgICAgICAgICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgIGNhc2UgNDp7CiAgICAgICAgICAgICAgICAgICAgICAgIGZpbmRfbmFtZSgpOwogICAgICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgY2FzZSA1OnsKICAgICAgICAgICAgICAgICAgICAgICAgZmluZF9yb29tKCk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGNhc2UgNjp7CiAgICAgICAgICAgICAgICAgICAgY2hlY2tvdXRfZ3Vlc3QoKTsKICAgICAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgZGVmYXVsdDp7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gV3JvbmcgZW50cnkhIik7CiAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgLy9lbnRlciBhZ2Fpbj8KICAgICAgICAgICAgICAgIHByaW50ZigiV291bGQgeW91IGxpa2UgdG8gY29udGludWU/ICh5L24pXG4iKTsKICAgICAgICAgICAgICAgIHNjYW5mKCIlcyIsYWRtaW5fZW50cnkpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHN0cmNtcChhZG1pbl9lbnRyeSwibiIpID09IDApewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiRXhpdGluZy4uLlxuIik7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcZVsxOzFIXGVbMkoiKTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuID5FeGl0ZWQ8XG5cbiIpOwogICAgICAgICAgICAgICAgICAgIC8vc3lzdGVtKCJjbGVhciIpOwogICAgICAgICAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgZWxzZXsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIldyb25nIGVudHJ5IVxuRXhpdGluZy4uLlxuIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBicmVhazsKICAgICAgICAgICAgfQogICAgICAgICAgICAKICAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgIGNhc2UgMjp7CiAgICAgICAgICAgICAgICB3aGlsZSh1c2VyX2VudHJ5WzBdID09J3knKXsKICAgICAgICAgICAgICAgIHByaW50ZigiXG5IZWxsbyB1c2VyIGFuZCB3ZWxjb21lIHRvIEhvdGVsISIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcbj4+Pj4+Pj4+Pj4+Plx0VG8gdmlldyBhdmFpbGFibGUgcm9vbXMgLS0+IDEgXHRcdFx0PDw8PDw8PDw8PDw8Iik7CiAgIAkgICAgICAgICAgICBwcmludGYoIlxuPj4+Pj4+Pj4+Pj4+XHRUbyByZXF1ZXN0IGJvb2tpbmcgb2Ygcm9vbSAtLT4gMiBcdDw8PDw8PDw8PDw8PCIpOwogICAgICAgICAgICAgICAgcHJpbnRmKCJcbj4+ICIpOwogICAgICAgICAgICAgICAgc2NhbmYoIiVkIiwmYyk7CiAgICAgICAgICAgICAgICBzd2l0Y2goYyl7CiAgICAgICAgICAgICAgICAgICAgY2FzZSAxOnsKICAgICAgICAgICAgICAgICAgICAgICAgRklMRSogdmlldzsKICAgICAgICAgICAgICAgICAgICAgICAgdmlldyA9IGZvcGVuKCJyb29tcy50eHQiLCJyIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiQXZhaWxhYmxlIHJvb21zIGFyZTpcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICB3aGlsZShmc2NhbmYodmlldywiJXMiLGgucm9vbSkgIT0gLTEpewkKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCIlcyBcbiIsaC5yb29tKTsKICAgICAgICAgICAgICAgICAgICAgICAgfQogICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2Uodmlldyk7CiAgICAgICAgICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICAgICAgICAgIH0KCiAgICAgICAgICAgICAgICAgICAgY2FzZSAyOnsKICAgICAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFbnRlciB5b3VyIG5hbWU6ICIpOwogICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJXMiLGgubmFtZSk7CiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiRW50ZXIgcm9vbSB0byBib29rOiAiKTsKICAgICAgICAgICAgICAgICAgICAgICAgc2NhbmYoIiVzIixoLnJvb20pOwogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVudGVyIGRheSAoMS81KTogIik7CiAgICAgICAgICAgICAgICAgICAgICAgIHNjYW5mKCIlcyIsaC5kYXkpOwogICAgICAgICAgICAgICAgICAgICAgICBwcmludGYoIkVudGVyIEdlbmRlciAoTWFsZSAvRmVtYWxlICk6ICIpOwogICAgICAgICAgICAgICAgICAgICAgICBzY2FuZigiJXMiLGguR2VuZGVyKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGVudGVyID0gZm9wZW4oImJvb2tpbmdzLnR4dCIsImEiKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIGZwcmludGYoZW50ZXIsIiVzICVzICVzICVzIixoLm5hbWUsaC5yb29tLGguZGF5LGguR2VuZGVyKTsKICAgICAgICAgICAgICAgICAgICAgICAgZnByaW50ZihlbnRlciwiXG4iKTsKCiAgICAgICAgICAgICAgICAgICAgICAgIHByaW50ZigiU3VjY2VzZnVsbHkgcmVxdWVzdGVkIGJvb2tpbmdcbiIpOwogICAgICAgICAgICAgICAgICAgICAgICBmY2xvc2UoZW50ZXIpOwoKICAgICAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICAgICAgCiAgICAgICAgICAgICAgICBwcmludGYoIldvdWxkIHlvdSBsaWtlIHRvIGNvbnRpbnVlPyAoeS9uKVxuIik7CiAgICAgICAgICAgICAgICBzY2FuZigiJXMiLHVzZXJfZW50cnkpOwoKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGlmKHN0cmNtcCh1c2VyX2VudHJ5LCJuIikgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJFeGl0aW5nLi4uXG4iKTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxlWzE7MUhcZVsySiIpOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gPkV4aXRlZDxcblxuIik7CiAgICAgICAgICAgICAgICAgICAgLy9zeXN0ZW0oImNsZWFyIik7CiAgICAgICAgICAgICAgICAgICAgcmV0dXJuIDA7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgICAgICAgICBlbHNlewogICAgICAgICAgICAgICAgICAgIHByaW50ZigiV3JvbmcgZW50cnkhXG5FeGl0aW5nLi4uXG4iKTsKICAgICAgICAgICAgICAgICAgICByZXR1cm4gMDsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGJyZWFrOwogICAgICAgICAgICB9CiAgICAgICAgfQp9CgovL21ldGhvZCBkZWNsYXJlIHRvIGVudGVyIG5hbWUKdm9pZCBlbnRlcl9uYW1lKCl7IAoKICAgIEZJTEUgKnRtcDE7IAogICAgRklMRSAqdG1wMjsKCiAgICBwcmludGYoIlxuRW50ZXIgZ3Vlc3QgbmFtZSAtLT4gIik7CiAgICBzY2FuZigiJXMiLGgubmFtZSk7CiAgICBwcmludGYoIlxuRW50ZXIgdGhlaXIgcm9vbSBudW1iZXIgLS0+ICIpOwogICAgc2NhbmYoIiVzIixoLnJvb20pOwogICAgcHJpbnRmKCJcbiBFbnRlciB3aWZpIHBsYW4gKDFHQi81R0IpIC0tPiAiKTsKICAgIHNjYW5mKCIlcyIsaC5kYXkpOwogICAgcHJpbnRmKCJcbkVudGVyIGlmIGJyZWFrZmFzdCBpcyBpbmNsdWRlZCAtLT4gIik7CiAgICBzY2FuZigiJXMiLGguR2VuZGVyKTsKICAgIAogICAgLy9lbnRlcmluZyBndWVzdHMKICAgIGZwID0gZm9wZW4oImhvdGVsbmV3LnR4dCIsImEiKTsKCiAgICBpZiggZnAgPT0gTlVMTCl7CiAgICAgICAgcHJpbnRmKCJcbkZpbGUgbm90IGZvdW5kIik7CiAgICAgICAgZXhpdCgxKTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgZnByaW50ZihmcCwiJXMgJXMgJXMgJXMiLGgubmFtZSxoLnJvb20saC5kYXksaC5HZW5kZXIpOwogICAgICAgIHByaW50ZigiXG5Eb25lXG4iKTsKICAgIH0KICAgIGZwcmludGYoZnAsIlxuIik7CgogICAgLy8KICAgIGNoYXIgcmVtb3ZlX2d1ZXN0WzIwXTsKICAgIHN0cmNweShyZW1vdmVfZ3Vlc3QsaC5uYW1lKTsKICAgIGNoYXIgcmVtb3ZlX3Jvb21bMjBdOwogICAgc3RyY3B5KHJlbW92ZV9yb29tLGgucm9vbSk7CgogICAgLy9yZW1vdmluZyBib29raW5nCiAgICB0bXAxID0gZm9wZW4oInRtcDEudHh0IiwiYSIpOwogICAgZW50ZXIgPSBmb3BlbigiYm9va2luZ3MudHh0IiwiciIpOwogCiAgICB3aGlsZShmc2NhbmYoZW50ZXIsIiVzICVzICVzIixoLm5hbWUsaC5yb29tLGguZGF5KSAhPSAtMSl7CiAgICAgICAgICAgIGZnZXRjKGVudGVyKTsJCgkJICAgIGZnZXRzKGguR2VuZGVyLCAyMCwgKEZJTEUqKWVudGVyKTsKCQkJICAgIGlmKHN0cmNtcChoLm5hbWUscmVtb3ZlX2d1ZXN0KSAhPSAwKXsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHRtcDEsIiVzICVzICVzICVzIixoLm5hbWUsaC5yb29tLGguZGF5LGguR2VuZGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICBmY2xvc2UoZW50ZXIpOwogICAgZmNsb3NlKHRtcDEpOwogICAgcmVtb3ZlKCJib29raW5ncy50eHQiKTsKICAgIHJlbmFtZSgidG1wMS50eHQiLCJib29raW5ncy50eHQiKTsKICAgIGZjbG9zZShmcCk7CgogICAgLy9yZW1vdmluZyByb29tCiAgICB0bXAyID0gZm9wZW4oInRtcDIudHh0IiwiYSIpOwogICAgdmlldyA9IGZvcGVuKCJyb29tcy50eHQiLCJyIik7CgogICAgCiAgICB3aGlsZShmc2NhbmYodmlldywiJXMiLGgucm9vbSkgIT0gLTEpewoJCQkgICAgaWYoc3RyY21wKGgucm9vbSxyZW1vdmVfcm9vbSkgIT0gMCl7CiAgICAgICAgICAgICAgICAgICAgZnByaW50Zih0bXAyLCIlcyIsaC5yb29tKTsKICAgICAgICAgICAgICAgICAgICBmcHJpbnRmKHRtcDIsIlxuIik7CiAgICAgICAgICAgICAgICB9CiAgICAgICAgfQogICAgZmNsb3NlKHZpZXcpOwogICAgZmNsb3NlKHRtcDIpOwogICAgcmVtb3ZlKCJyb29tcy50eHQiKTsKICAgIHJlbmFtZSgidG1wMi50eHQiLCJyb29tcy50eHQiKTsKCgogICAgZmNsb3NlKGZwKTsKfQoKLy9tZXRob2QgZGVmaW5lZCB0byBmaW5kIHF1ZXN0IG5hbWUKdm9pZCBmaW5kX25hbWUoKXsKICAgIGNoYXIgYnVmZmVyWzIwXTsKICAgIGNoYXIgZW50ZXJlZF9uYW1lWzIwXTsKICAgIGludCBndWVzdEZvdW5kID0wOwoKICAgIHByaW50ZigiXG5FbnRlciBndWVzdCBuYW1lIHRvIGZpbmQgLS0+Iik7CiAgICBzY2FuZigiJXMiLGVudGVyZWRfbmFtZSk7ICAgCiAgCiAgICBmcCA9IGZvcGVuKCJob3RlbG5ldy50eHQiLCJyIik7CQogICAgd2hpbGUoZnNjYW5mKGZwLCIlcyAlcyAlcyIsaC5uYW1lLGgucm9vbSxoLmRheSkgIT0gLTEpewkKICAgIGZnZXRzKGguZGF5LCAyNTUsIChGSUxFKilmcCk7CiAgICBpZihzdHJjbXAoaC5uYW1lLGVudGVyZWRfbmFtZSkgPT0gMCl7CiAgICAgICAgICAgICAgICAgICAgIGd1ZXN0Rm91bmQgPSAxOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gR3Vlc3QgZm91bmQhIik7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBOYW1lICBpcyAlcyIsaC5uYW1lKTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIFJvb20gbnVtYmVyIGlzICVzIixoLnJvb20pOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gV2lGaSBwbGFuIGlzICVzIixoLmRheSk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJcbiBCcmVha2Zhc3QgaW5jbHVkZWQgJXMiLGguR2VuZGVyKTsKCiAgICAgIH0KICAgfQogICBpZihndWVzdEZvdW5kID09IDApewogICAgICAgICBwcmludGYoIlxuR3Vlc3QgJXMgbm90IGZvdW5kIVxuIiwgZW50ZXJlZF9uYW1lKTsKICAgICAgfQogICBmY2xvc2UoZnApOwp9CgovL21ldGhvZCBkZWZpbml0aW9uIGZvciBndWVzdCBjaGVja291dAp2b2lkIGNoZWNrb3V0X2d1ZXN0KCl7CiAgICBjaGFyIGJ1ZmZlcjJbMjBdOwogICAgY2hhciBjaGVja291dF9uYW1lWzIwXTsKICAgIGNoYXIgYWRkX3Jvb21bMjBdOwoKICAgIEZJTEUgKnRtcDsKCiAgICBwcmludGYoIkVudGVyIGd1ZXN0IHRvbyBjaGVja291dCAiKTsKICAgIHNjYW5mKCIlcyIsY2hlY2tvdXRfbmFtZSk7CgogICAgZnAgPSBmb3BlbigiaG90ZWxuZXcudHh0IiwiciIpOwogICAgdG1wID0gZm9wZW4oInRtcC50eHQiLCJ3Iik7CgogICAgaWYoZnAgPT0gTlVMTCl7CiAgICBwcmludGYoIkZpbGUgbm90IGZvdW5kIik7CiAgICBleGl0KDEpOwogICAgfQoJZWxzZXsKICAgICAgICB3aGlsZShmc2NhbmYoZnAsIiVzICVzICVzIixoLm5hbWUsaC5yb29tLGguZGF5KSAhPSAtMSl7CiAgICAgICAgICAgIGZnZXRjKGZwKTsJCgkJICAgIGZnZXRzKGguR2VuZGVyLCAyMCwgKEZJTEUqKWZwKTsKCQkJICAgIGlmKHN0cmNtcChoLm5hbWUsY2hlY2tvdXRfbmFtZSkgIT0gMCl7CiAgICAgICAgICAgICAgICAgICAgZnByaW50Zih0bXAsIiVzICVzICVzICVzIixoLm5hbWUsaC5yb29tLGguZGF5LGguR2VuZGVyKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgIGVsc2V7CiAgICAgICAgICAgICAgICAgICBzdHJjcHkoYWRkX3Jvb20saC5yb29tKTsKICAgICAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgcHJpbnRmKCJSb29tIGNoZWNrZWQgb3V0ISIpOwogICAgfQoKICAgIGZjbG9zZShmcCk7CiAgICBmY2xvc2UodG1wKTsKICAgIHJlbW92ZSgiaG90ZWxuZXcudHh0Iik7CiAgICByZW5hbWUoInRtcC50eHQiLCJob3RlbG5ldy50eHQiKTsKCiAgICAvL2VudGVyIHJvb20gYmFjayBpbnRvIGF2YWlsYWJsZSByb29tcyBsaXN0CiAgICB2aWV3ID0gZm9wZW4oInJvb21zLnR4dCIsImEiKTsKICAgIHByaW50ZigiIGFkZCBpcyAlcyIsYWRkX3Jvb20pOwogICAgZnByaW50Zih2aWV3LCIlcyIsYWRkX3Jvb20pOwogICAgZmNsb3NlKHZpZXcpOwoKfQoKLy9tZXRob2QgZGVmaW5pdGlvbiBmb3IgZmluZGluZyByb29tcyBhdmFsYWlibGUKdm9pZCBmaW5kX3Jvb20oKXsKICAgIGNoYXIgYnVmZmVyWzIwXTsKICAgIGNoYXIgZW50ZXJlZF9yb29tWzIwXTsKICAgIGludCByb29tRm91bmQgPTA7CiAgICBGSUxFICpmcDsKICAgIHByaW50ZigiXG5FbnRlciByb29tIG51bWJlciB0byBmaW5kIC0tPiIpOwogICAgc2NhbmYoIiVzIixlbnRlcmVkX3Jvb20pOyAgIAogIAogICAgZnAgPSBmb3BlbigiaG90ZWxuZXcudHh0IiwiciIpOwkKICAgIHdoaWxlKGZzY2FuZihmcCwiJXMgJXMgJXMiLGgubmFtZSxoLnJvb20saC5kYXkpICE9IC0xKXsJCiAgICBmZ2V0cyhoLkdlbmRlciwgMjU1LCAoRklMRSopZnApOwogICAgaWYoc3RyY21wKGgucm9vbSxlbnRlcmVkX3Jvb20pID09IDApewogICAgICAgICAgICAgICAgICAgICByb29tRm91bmQgPSAxOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gUm9vbSBmb3VuZCEiKTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIE5hbWUgIGlzICVzIixoLm5hbWUpOwogICAgICAgICAgICAgICAgICAgIHByaW50ZigiXG4gUm9vbSBudW1iZXIgaXMgJXMiLGgucm9vbSk7CiAgICAgICAgICAgICAgICAgICAgcHJpbnRmKCJXaUZpIHBsYW4gaXMgJXMiLGguZGF5KTsKICAgICAgICAgICAgICAgICAgICBwcmludGYoIlxuIEJyZWFrZmFzdCBpbmNsdWRlZCAlcyIsaC5HZW5kZXIpOwogICAgICB9CiAgICB9CiAgICBpZihyb29tRm91bmQgPT0gMCl7CiAgICAgICAgIHByaW50ZigiXG5Sb29tICVzIG5vdCBmb3VuZCFcbiIsIGVudGVyZWRfcm9vbSk7CiAgICAgIH0KICAgZmNsb3NlKGZwKTsKfQoKLy9tZXRob2QgZGVmaW5lZCB0byB2aWV3IGJvb2tpbmdzCnZvaWQgdmlld19ib29raW5ncygpewoKICAgIGVudGVyID0gZm9wZW4oImJvb2tpbmdzLnR4dCIsInIiKTsJCgogICAgd2hpbGUoZnNjYW5mKGVudGVyLCIlcyAlcyAlcyIsaC5uYW1lLGgucm9vbSxoLmRheSkgIT0gLTEpewkKICAgICAgICBmZ2V0cyhoLkdlbmRlciwgMjU1LCAoRklMRSopZW50ZXIpOwogICAgICAgIHByaW50ZigiJXMgJXMgJXMgJXMgXG4iLGgubmFtZSxoLnJvb20saC5kYXksaC5HZW5kZXIpOwogICAgfQp9Cg==