#include <stdio.h>
#include <malloc.h>
struct node{
int val;
struct node * next;
struct node * prev;
} ;
void insertend( ) ;
void insertbef( ) ;
void insertaft( ) ;
void insertfir( ) ;
void delend( ) ;
void delbef( ) ;
void delaft( ) ;
void delfir( ) ;
void display( ) ;
typedef struct node snode;
snode * newnode,* back,* ptr,* temp;
snode * first= NULL,* last= NULL;
int main( void ) {
int ch;
char ans = 'Y' ;
while ( ans == 'Y' || ans == 'y' )
{
printf ( "\n ---------------------------------\n " ) ; printf ( "\n Operations on singly linked list\n " ) ; printf ( "\n ---------------------------------\n " ) ; printf ( "\n 1.Insert node at first" ) ; printf ( "\n 2.Insert node at last" ) ; printf ( "\n 3.Insert node before element" ) ; printf ( "\n 4.Insert node after element" ) ; printf ( "\n 5.Delete Node at first" ) ; printf ( "\n 6.Delete Node at last" ) ; printf ( "\n 7.Delete Node before any Position" ) ; printf ( "\n 8.Delete Node after any Position" ) ; printf ( "\n 9.Display List from Beginning to end" ) ; printf ( "\n ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~\n " ) ; printf ( "\n Enter your choice" ) ;
switch ( ch)
{
case 1 :
printf ( "\n ...Inserting node at first...\n " ) ; insertfir( ) ;
break ;
case 2 :
printf ( "\n ...Inserting node at last...\n " ) ; insertend( ) ;
break ;
case 3 :
printf ( "\n ...Inserting node before any position...\n " ) ; insertbef( ) ;
break ;
case 4 :
printf ( "\n ...Inserting node after any position...\n " ) ; insertaft( ) ;
break ;
case 5 :
printf ( "\n ...Deleting Node from first Position...\n " ) ; delfir( ) ;
break ;
case 6 :
printf ( "\n ...Deleting Node from last Position...\n " ) ; delend( ) ;
break ;
case 7 :
printf ( "\n ...Deleting Node before any Position...\n " ) ; delbef( ) ;
break ;
case 8 :
printf ( "\n ...Deleting Node after any Position...\n " ) ; delaft( ) ;
break ;
case 9 :
printf ( "\n ...Displaying List From Beginning to End...\n " ) ; display( ) ;
break ;
case 10 :
return 0 ;
break ;
default :
printf ( "\n ...Invalid Choice...\n " ) ; break ;
}
printf ( "\n YOU WANT TO CONTINUE (Y/N)" ) ; }
return 0 ;
}
snode * create_node( int value)
{
newnode
= ( snode
* ) malloc ( sizeof ( snode
) ) ; if ( newnode== NULL)
{
printf ( "\n Memory is not allocated" ) ; return 0 ;
}
else
{
newnode-> val= value;
newnode-> next= NULL;
newnode-> prev= NULL;
return newnode;
}
}
void insertfir( )
{
int value;
printf ( "\n Enter the element you want to enter at first" ) ; newnode= create_node( value) ;
if ( first== last && last== NULL ) {
first= newnode;
last= newnode;
first-> next= last;
first-> prev= last;
last-> next= first;
last-> prev= first;
}
else
{
newnode-> next= first;
newnode-> prev= last;
first-> prev= newnode;
first= newnode;
last-> next= first;
}
}
void insertend( )
{
int value;
printf ( "\n Enter the element you want to enter at End" ) ; newnode= create_node( value) ;
if ( first== last && last== NULL ) {
first= newnode;
last= newnode;
first-> next= last;
first-> prev= last;
last-> next= first;
last-> prev= first;
}
else
{
last-> next= newnode;
newnode-> prev= last;
last= newnode;
last-> next= first;
first-> prev= last;
}
}
void insertbef( )
{
int value, pos;
printf ( "\n Enter the element you want to enter" ) ; printf ( "\n Enter the element before which you want to enter" ) ; newnode= create_node( value) ;
int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
if ( first-> val== pos)
{
newnode-> next= first;
newnode-> prev= last;
first-> prev= newnode;
first= newnode;
last-> next= first;
}
else
{
ptr= first;
while ( ptr-> next-> val!= pos)
{
ptr= ptr-> next;
}
newnode-> next= ptr-> next;
newnode-> prev= ptr;
ptr-> next-> prev= newnode;
ptr-> next= newnode;
}
}
void insertaft( )
{
int value, pos;
printf ( "\n Enter the element you want to enter" ) ; printf ( "\n Enter the element after which you want to enter" ) ; newnode= create_node( value) ;
int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
ptr= first;
while ( ptr-> val!= pos)
{
ptr= ptr-> next;
}
if ( ptr== last)
{
newnode-> next= ptr-> next;
ptr-> next= newnode;
newnode-> prev= ptr;
last= newnode;
first-> prev= last;
}
else
{
newnode-> next= ptr-> next;
ptr-> next= newnode;
newnode-> prev= ptr;
}
}
void display( )
{
if ( first == NULL)
{
printf ( ":No nodes in the list to display\n " ) ; }
else
{
for ( ptr = first; ptr-> next != first; ptr = ptr-> next)
{
}
}
}
void delend( )
{
if ( first== last)
{
if ( last== NULL)
{
printf ( "There is no element" ) ; }
else
{
first= last= NULL;
first-> next= last;
first-> prev= last;
last-> next= first;
last-> prev= first;
}
}
else
{
ptr= first;
while ( ptr-> next!= last)
{
ptr= ptr-> next;
}
ptr-> next= first;
last= ptr;
first-> prev= last;
}
}
void delfir( )
{
if ( first== last)
{
if ( first== NULL)
{
printf ( "There is no element" ) ; }
else
{
first= last= NULL;
first-> next= last;
first-> prev= last;
last-> next= first;
last-> prev= first;
}
}
else
{
last-> next= first-> next;
first= first-> next;
first-> prev= last;
}
}
void delbef( )
{
int pos;
printf ( "\n Enter the element before which you want to delete" ) ; int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
if ( first-> val== pos)
{
printf ( "There is no element present before first " ) ; return ;
}
else if ( first-> next-> val== pos && first-> next== last)
{
first= first-> next;
last-> next= first;
first-> next= first;
first-> prev= last;
last-> prev= first;
}
else
{
ptr= first;
while ( ptr-> next-> val!= pos)
{
back= ptr;
ptr= ptr-> next;
}
back-> next= ptr-> next;
ptr-> next-> prev= back;
}
}
void delaft( )
{
int pos;
printf ( "\n Enter the element before which you want to delete" ) ; int a= 0 ;
ptr= first;
while ( ptr!= NULL)
{
if ( ptr-> val== pos)
{
a= 1 ;
break ;
}
ptr= ptr-> next;
}
if ( a== 0 )
{
return ;
}
ptr= first;
while ( ptr-> val!= pos)
{
ptr= ptr-> next;
}
if ( ptr-> next== first)
{
printf ( "There is no element behind last" ) ; return ;
}
else
{
if ( ptr-> next== last)
{
ptr-> next= first;
last= ptr;
first-> prev= last;
}
else
{
ptr-> next= ptr-> next-> next;
ptr-> next-> prev= ptr;
}
}
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYWxsb2MuaD4KCnN0cnVjdCBub2RlewoJaW50IHZhbDsKCXN0cnVjdCBub2RlICpuZXh0OwoJc3RydWN0IG5vZGUgKnByZXY7Cn07Cgp2b2lkIGluc2VydGVuZCgpOwp2b2lkIGluc2VydGJlZigpOwp2b2lkIGluc2VydGFmdCgpOwp2b2lkIGluc2VydGZpcigpOwp2b2lkIGRlbGVuZCgpOwp2b2lkIGRlbGJlZigpOwp2b2lkIGRlbGFmdCgpOwp2b2lkIGRlbGZpcigpOwp2b2lkIGRpc3BsYXkoKTsKdHlwZWRlZiAgc3RydWN0IG5vZGUgc25vZGU7CnNub2RlICpuZXdub2RlLCpiYWNrLCpwdHIsKnRlbXA7CnNub2RlICpmaXJzdD1OVUxMLCpsYXN0PU5VTEw7CgoKaW50IG1haW4odm9pZCkgewoJaW50IGNoOwogICAgY2hhciBhbnMgPSAnWSc7CiAKICAgIHdoaWxlIChhbnMgPT0gJ1knfHxhbnMgPT0gJ3knKQogICAgewogICAgICAgIHByaW50ZigiXG4tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS1cbiIpOwogICAgICAgIHByaW50ZigiXG5PcGVyYXRpb25zIG9uIHNpbmdseSBsaW5rZWQgbGlzdFxuIik7CiAgICAgICAgcHJpbnRmKCJcbi0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLS0tLVxuIik7CiAgICAgICAgcHJpbnRmKCJcbjEuSW5zZXJ0IG5vZGUgYXQgZmlyc3QiKTsKICAgICAgICBwcmludGYoIlxuMi5JbnNlcnQgbm9kZSBhdCBsYXN0Iik7CiAgICAgICAgcHJpbnRmKCJcbjMuSW5zZXJ0IG5vZGUgYmVmb3JlIGVsZW1lbnQiKTsKICAgICAgICBwcmludGYoIlxuNC5JbnNlcnQgbm9kZSBhZnRlciBlbGVtZW50Iik7CiAgICAgICAgcHJpbnRmKCJcbjUuRGVsZXRlIE5vZGUgYXQgZmlyc3QiKTsKICAgICAgICBwcmludGYoIlxuNi5EZWxldGUgTm9kZSBhdCBsYXN0Iik7CiAgICAgICAgcHJpbnRmKCJcbjcuRGVsZXRlIE5vZGUgYmVmb3JlIGFueSBQb3NpdGlvbiIpOwogICAgICAgIHByaW50ZigiXG44LkRlbGV0ZSBOb2RlIGFmdGVyIGFueSBQb3NpdGlvbiIpOwogICAgICAgIHByaW50ZigiXG45LkRpc3BsYXkgTGlzdCBmcm9tIEJlZ2lubmluZyB0byBlbmQiKTsKICAgICAgICBwcmludGYoIlxuMTAuRXhpdFxuIik7CiAgICAgICAgcHJpbnRmKCJcbn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+fn5+XG4iKTsKICAgICAgICBwcmludGYoIlxuRW50ZXIgeW91ciBjaG9pY2UiKTsKICAgICAgICBzY2FuZigiJWQiLCAmY2gpOwogCiAgICAgICAgc3dpdGNoIChjaCkKICAgICAgICB7CiAgICAgICAgY2FzZSAxOiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkluc2VydGluZyBub2RlIGF0IGZpcnN0Li4uXG4iKTsKICAgICAgICAgICAgaW5zZXJ0ZmlyKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMjogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5JbnNlcnRpbmcgbm9kZSBhdCBsYXN0Li4uXG4iKTsKICAgICAgICAgICAgaW5zZXJ0ZW5kKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMzogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5JbnNlcnRpbmcgbm9kZSBiZWZvcmUgYW55IHBvc2l0aW9uLi4uXG4iKTsKICAgICAgICAgICAgaW5zZXJ0YmVmKCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgNDogCiAgICAgICAgICAgIHByaW50ZigiXG4uLi5JbnNlcnRpbmcgbm9kZSBhZnRlciBhbnkgcG9zaXRpb24uLi5cbiIpOwogICAgICAgICAgICBpbnNlcnRhZnQoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA1OiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkRlbGV0aW5nIE5vZGUgZnJvbSBmaXJzdCBQb3NpdGlvbi4uLlxuIik7CiAgICAgICAgICAgIGRlbGZpcigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDY6IAogICAgICAgICAgICBwcmludGYoIlxuLi4uRGVsZXRpbmcgTm9kZSBmcm9tIGxhc3QgUG9zaXRpb24uLi5cbiIpOwogICAgICAgICAgICBkZWxlbmQoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA3OiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkRlbGV0aW5nIE5vZGUgYmVmb3JlIGFueSBQb3NpdGlvbi4uLlxuIik7CiAgICAgICAgICAgIGRlbGJlZigpOwogICAgICAgICAgICBicmVhazsKICAgICAgICBjYXNlIDg6IAogICAgICAgICAgICBwcmludGYoIlxuLi4uRGVsZXRpbmcgTm9kZSBhZnRlciBhbnkgUG9zaXRpb24uLi5cbiIpOwogICAgICAgICAgICBkZWxhZnQoKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgY2FzZSA5OiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkRpc3BsYXlpbmcgTGlzdCBGcm9tIEJlZ2lubmluZyB0byBFbmQuLi5cbiIpOwogICAgICAgICAgICBkaXNwbGF5KCk7CiAgICAgICAgICAgIGJyZWFrOwogICAgICAgIGNhc2UgMTA6IAogICAgICAgICAgICBwcmludGYoIlxuLi4uRXhpdGluZy4uLlxuIik7CiAgICAgICAgICAgIHJldHVybiAwOwogICAgICAgICAgICBicmVhazsKICAgICAgICBkZWZhdWx0OiAKICAgICAgICAgICAgcHJpbnRmKCJcbi4uLkludmFsaWQgQ2hvaWNlLi4uXG4iKTsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG5ZT1UgV0FOVCBUTyBDT05USU5VRSAoWS9OKSIpOwogICAgICAgIHNjYW5mKCIgJWMiLCAmYW5zKTsKICAgIH0KICAgIHJldHVybiAwOwp9Cgpzbm9kZSAqY3JlYXRlX25vZGUoaW50IHZhbHVlKQp7CgluZXdub2RlPShzbm9kZSopbWFsbG9jKHNpemVvZihzbm9kZSkpOwoJaWYgKG5ld25vZGU9PU5VTEwpCgl7CgkJcHJpbnRmKCJcbk1lbW9yeSBpcyBub3QgYWxsb2NhdGVkIik7CgkJcmV0dXJuIDA7Cgl9CgoJZWxzZQoJewoJCW5ld25vZGUtPnZhbD12YWx1ZTsKCQluZXdub2RlLT5uZXh0PU5VTEw7CgkJbmV3bm9kZS0+cHJldj1OVUxMOwoJCXJldHVybiBuZXdub2RlOwoJfQp9Cgp2b2lkIGluc2VydGZpcigpCnsKCWludCB2YWx1ZTsKCXByaW50ZigiXG5FbnRlciB0aGUgZWxlbWVudCB5b3Ugd2FudCB0byBlbnRlciBhdCBmaXJzdCIpOwoJc2NhbmYoIiVkIiwmdmFsdWUpOwoJbmV3bm9kZT1jcmVhdGVfbm9kZSh2YWx1ZSk7CglpZihmaXJzdD09bGFzdCAmJiBsYXN0PT1OVUxMICl7CgkJZmlyc3Q9bmV3bm9kZTsKCQlsYXN0PW5ld25vZGU7CgkJZmlyc3QtPm5leHQ9bGFzdDsKCQlmaXJzdC0+cHJldj1sYXN0OwoJCWxhc3QtPm5leHQ9Zmlyc3Q7CgkJbGFzdC0+cHJldj1maXJzdDsKCX0KCWVsc2UKCXsKCQluZXdub2RlLT5uZXh0PWZpcnN0OwoJCW5ld25vZGUtPnByZXY9bGFzdDsKCQlmaXJzdC0+cHJldj1uZXdub2RlOwoJCWZpcnN0PW5ld25vZGU7CgkJbGFzdC0+bmV4dD1maXJzdDsKCQkKCX0KCQp9Cgp2b2lkICBpbnNlcnRlbmQoKQp7CglpbnQgdmFsdWU7CglwcmludGYoIlxuRW50ZXIgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gZW50ZXIgYXQgRW5kIik7CglzY2FuZigiJWQiLCZ2YWx1ZSk7CgluZXdub2RlPWNyZWF0ZV9ub2RlKHZhbHVlKTsKCWlmKGZpcnN0PT1sYXN0ICYmIGxhc3Q9PU5VTEwgKXsKCQlmaXJzdD1uZXdub2RlOwoJCWxhc3Q9bmV3bm9kZTsKCQlmaXJzdC0+bmV4dD1sYXN0OwoJCWZpcnN0LT5wcmV2PWxhc3Q7CgkJbGFzdC0+bmV4dD1maXJzdDsKCQlsYXN0LT5wcmV2PWZpcnN0OwoJfQoJZWxzZQoJewoJCWxhc3QtPm5leHQ9bmV3bm9kZTsKCQluZXdub2RlLT5wcmV2PWxhc3Q7CgkJbGFzdD1uZXdub2RlOwoJCWxhc3QtPm5leHQ9Zmlyc3Q7CgkJZmlyc3QtPnByZXY9bGFzdDsKCX0KCQp9Cgp2b2lkICBpbnNlcnRiZWYoKQp7CgkKCWludCB2YWx1ZSxwb3M7CglwcmludGYoIlxuRW50ZXIgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gZW50ZXIiKTsKCXNjYW5mKCIlZCIsJnZhbHVlKTsKCXByaW50ZigiXG5FbnRlciB0aGUgZWxlbWVudCBiZWZvcmUgd2hpY2ggeW91IHdhbnQgdG8gZW50ZXIiKTsKCXNjYW5mKCIlZCIsJnBvcyk7CgluZXdub2RlPWNyZWF0ZV9ub2RlKHZhbHVlKTsKCWludCBhPTA7CglwdHI9Zmlyc3Q7Cgl3aGlsZShwdHIhPU5VTEwpCgl7CgkJaWYgKHB0ci0+dmFsPT1wb3MpCgkJewoJCQlhPTE7CgkJCWJyZWFrOwoJCX0KCQlwdHI9cHRyLT5uZXh0OwoJfQoJaWYoYT09MCkKCXsKCQlwcmludGYoIkVsZW1lbnQgbm90IGZvdW5kIik7CgkJcmV0dXJuOwoJfQoJaWYoZmlyc3QtPnZhbD09cG9zKQoJewoJCW5ld25vZGUtPm5leHQ9Zmlyc3Q7CgkJbmV3bm9kZS0+cHJldj1sYXN0OwoJCWZpcnN0LT5wcmV2PW5ld25vZGU7CgkJZmlyc3Q9bmV3bm9kZTsKCQlsYXN0LT5uZXh0PWZpcnN0OwoJfQoJZWxzZQoJewoJCXB0cj1maXJzdDsKCQl3aGlsZShwdHItPm5leHQtPnZhbCE9cG9zKQoJCXsKCQkJcHRyPXB0ci0+bmV4dDsKCQl9CgkJbmV3bm9kZS0+bmV4dD1wdHItPm5leHQ7CgkJbmV3bm9kZS0+cHJldj1wdHI7CgkJcHRyLT5uZXh0LT5wcmV2PW5ld25vZGU7CgkJcHRyLT5uZXh0PW5ld25vZGU7Cgl9Cn0Kdm9pZCBpbnNlcnRhZnQoKQp7CgkKCWludCB2YWx1ZSxwb3M7CglwcmludGYoIlxuRW50ZXIgdGhlIGVsZW1lbnQgeW91IHdhbnQgdG8gZW50ZXIiKTsKCXNjYW5mKCIlZCIsJnZhbHVlKTsKCXByaW50ZigiXG5FbnRlciB0aGUgZWxlbWVudCBhZnRlciB3aGljaCB5b3Ugd2FudCB0byBlbnRlciIpOwoJc2NhbmYoIiVkIiwmcG9zKTsKCW5ld25vZGU9Y3JlYXRlX25vZGUodmFsdWUpOwoJaW50IGE9MDsKCXB0cj1maXJzdDsKCXdoaWxlKHB0ciE9TlVMTCkKCXsKCQlpZiAocHRyLT52YWw9PXBvcykKCQl7CgkJCWE9MTsKCQkJYnJlYWs7CgkJfQoJCXB0cj1wdHItPm5leHQ7Cgl9CglpZihhPT0wKQoJewoJCXByaW50ZigiRWxlbWVudCBub3QgZm91bmQiKTsKCQlyZXR1cm47Cgl9CglwdHI9Zmlyc3Q7Cgl3aGlsZShwdHItPnZhbCE9cG9zKQoJewoJCXB0cj1wdHItPm5leHQ7Cgl9CglpZihwdHI9PWxhc3QpCgl7CgkJbmV3bm9kZS0+bmV4dD1wdHItPm5leHQ7CgkJcHRyLT5uZXh0PW5ld25vZGU7CgkJbmV3bm9kZS0+cHJldj1wdHI7CgkJbGFzdD1uZXdub2RlOwoJCWZpcnN0LT5wcmV2PWxhc3Q7Cgl9CgllbHNlCgl7CgkJbmV3bm9kZS0+bmV4dD1wdHItPm5leHQ7CgkJcHRyLT5uZXh0PW5ld25vZGU7CgkJbmV3bm9kZS0+cHJldj1wdHI7Cgl9Cn0Kdm9pZCBkaXNwbGF5KCkKewogICAgaWYgKGZpcnN0ID09IE5VTEwpCiAgICB7CiAgICAgICAgcHJpbnRmKCI6Tm8gbm9kZXMgaW4gdGhlIGxpc3QgdG8gZGlzcGxheVxuIik7CiAgICB9CiAgICBlbHNlCiAgICB7CiAgICAgICAgZm9yIChwdHIgPSBmaXJzdDtwdHItPm5leHQgIT0gZmlyc3Q7cHRyID0gcHRyLT5uZXh0KQogICAgICAgIHsgICAgCiAgICAgICAgICAgIHByaW50ZigiJWRcdCIsIHB0ci0+dmFsKTsKICAgICAgICB9CiAgICAgICAgcHJpbnRmKCIlZFx0IiwgcHRyLT52YWwpOwogICAgfQp9Cgp2b2lkIGRlbGVuZCgpCnsKCWlmKGZpcnN0PT1sYXN0KQoJewoJCWlmKGxhc3Q9PU5VTEwpCgkJewoJCQlwcmludGYoIlRoZXJlIGlzIG5vIGVsZW1lbnQiKTsKCQl9CgkJZWxzZQoJCXsKCQkJZmlyc3Q9bGFzdD1OVUxMOwoJCQlmaXJzdC0+bmV4dD1sYXN0OwoJCQlmaXJzdC0+cHJldj1sYXN0OwoJCQlsYXN0LT5uZXh0PWZpcnN0OwoJCQlsYXN0LT5wcmV2PWZpcnN0OwoJCX0KCX0KCWVsc2UKCXsKCQlwdHI9Zmlyc3Q7CgkJd2hpbGUocHRyLT5uZXh0IT1sYXN0KQoJCXsKCQkJcHRyPXB0ci0+bmV4dDsKCQl9CgkJcHRyLT5uZXh0PWZpcnN0OwoJCWxhc3Q9cHRyOwoJCWZpcnN0LT5wcmV2PWxhc3Q7Cgl9Cn0Kdm9pZCBkZWxmaXIoKQp7CglpZihmaXJzdD09bGFzdCkKCXsKCQlpZihmaXJzdD09TlVMTCkKCQl7CgkJCXByaW50ZigiVGhlcmUgaXMgbm8gZWxlbWVudCIpOwoJCX0KCQllbHNlCgkJewoJCQlmaXJzdD1sYXN0PU5VTEw7CgkJCWZpcnN0LT5uZXh0PWxhc3Q7CgkJCWZpcnN0LT5wcmV2PWxhc3Q7CgkJCWxhc3QtPm5leHQ9Zmlyc3Q7CgkJCWxhc3QtPnByZXY9Zmlyc3Q7CgoJCX0KCX0KCWVsc2UKCXsKCQlsYXN0LT5uZXh0PWZpcnN0LT5uZXh0OwoJCWZpcnN0PWZpcnN0LT5uZXh0OwoJCWZpcnN0LT5wcmV2PWxhc3Q7Cgl9Cn0Kdm9pZCBkZWxiZWYoKQp7CglpbnQgcG9zOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBlbGVtZW50IGJlZm9yZSB3aGljaCB5b3Ugd2FudCB0byBkZWxldGUiKTsKCXNjYW5mKCIlZCIsJnBvcyk7CglpbnQgYT0wOwoJcHRyPWZpcnN0OwoJd2hpbGUocHRyIT1OVUxMKQoJewoJCWlmIChwdHItPnZhbD09cG9zKQoJCXsKCQkJYT0xOwoJCQlicmVhazsKCQl9CgkJcHRyPXB0ci0+bmV4dDsKCX0KCWlmKGE9PTApCgl7CgkJcHJpbnRmKCJFbGVtZW50IG5vdCBmb3VuZCIpOwoJCXJldHVybjsKCX0KCWlmKGZpcnN0LT52YWw9PXBvcykKCXsKCQlwcmludGYoIlRoZXJlIGlzIG5vIGVsZW1lbnQgcHJlc2VudCBiZWZvcmUgZmlyc3QgIik7CgkJcmV0dXJuOwoJfQoJZWxzZSBpZihmaXJzdC0+bmV4dC0+dmFsPT1wb3MgJiYgIGZpcnN0LT5uZXh0PT1sYXN0KQoJewoJCWZpcnN0PWZpcnN0LT5uZXh0OwoJCWxhc3QtPm5leHQ9Zmlyc3Q7CgkJZmlyc3QtPm5leHQ9Zmlyc3Q7CgkJZmlyc3QtPnByZXY9bGFzdDsKCQlsYXN0LT5wcmV2PWZpcnN0OwoJfQoJCgllbHNlCgl7CgkJcHRyPWZpcnN0OwoJCXdoaWxlKHB0ci0+bmV4dC0+dmFsIT1wb3MpCgkJewoJCQliYWNrPXB0cjsKCQkJcHRyPXB0ci0+bmV4dDsKCQl9CgkJYmFjay0+bmV4dD1wdHItPm5leHQ7CgoJCXB0ci0+bmV4dC0+cHJldj1iYWNrOwoJfQoJCn0Kdm9pZCBkZWxhZnQoKQp7CglpbnQgcG9zOwoJcHJpbnRmKCJcbkVudGVyIHRoZSBlbGVtZW50IGJlZm9yZSB3aGljaCB5b3Ugd2FudCB0byBkZWxldGUiKTsKCXNjYW5mKCIlZCIsJnBvcyk7CglpbnQgYT0wOwoJcHRyPWZpcnN0OwoJd2hpbGUocHRyIT1OVUxMKQoJewoJCWlmIChwdHItPnZhbD09cG9zKQoJCXsKCQkJYT0xOwoJCQlicmVhazsKCQl9CgkJcHRyPXB0ci0+bmV4dDsKCX0KCWlmKGE9PTApCgl7CgkJcHJpbnRmKCJFbGVtZW50IG5vdCBmb3VuZCIpOwoJCXJldHVybjsKCX0KCXB0cj1maXJzdDsKCXdoaWxlKHB0ci0+dmFsIT1wb3MpCgl7CgkJcHRyPXB0ci0+bmV4dDsKCX0KCWlmKHB0ci0+bmV4dD09Zmlyc3QpCgl7CgkJcHJpbnRmKCJUaGVyZSBpcyBubyBlbGVtZW50IGJlaGluZCBsYXN0Iik7CgkJcmV0dXJuOwoJfQoJZWxzZQoJewoJCWlmKHB0ci0+bmV4dD09bGFzdCkKCQl7CgkJCXB0ci0+bmV4dD1maXJzdDsKCQkJbGFzdD1wdHI7CgkJCWZpcnN0LT5wcmV2PWxhc3Q7CgkJfQoJCWVsc2UKCQl7CgkJCXB0ci0+bmV4dD1wdHItPm5leHQtPm5leHQ7CgkJCXB0ci0+bmV4dC0+cHJldj1wdHI7CgkJfQoJfQp9Cgo=