#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <stdbool.h>
#define INITIAL_SIZE 10
#define EMPTY -1
struct Stack
{
int * arr;
int currSize;
int top;
} ;
typedef struct Stack Stack;
/* Global char arrays for opening and closing brackets */
char openBrackets[ ] = { '(' , '{' , '[' , '\0 ' } ;
char closeBrackets[ ] = { ')' , '}' , ']' , '\0 ' } ;
Stack* StackCreate( ) {
Stack
* stack
= malloc ( sizeof ( Stack
) ) ; if ( stack == NULL)
{
return NULL;
}
stack
-> arr
= malloc ( INITIAL_SIZE
* sizeof ( int ) ) ; if ( stack-> arr == NULL)
{
return NULL;
}
stack-> currSize = INITIAL_SIZE;
stack-> top = EMPTY;
return stack;
}
void Push( Stack* _stack, int _item) {
if ( _stack == NULL)
{
return ;
}
if ( _stack-> top == ( _stack-> currSize - 1 ) )
{
// printf("Stack is full with %d items.\nTrying to reallocating stack to size: %d\n", _stack->currSize, 2*_stack->currSize);
int * temp
= ( int * ) realloc ( _stack
-> arr
, 2 * ( _stack
-> currSize
) * sizeof ( int ) ) ; if ( temp == NULL)
{
printf ( "Reallocating failed!\n " ) ; return ;
}
_stack-> arr = temp;
_stack-> currSize = 2 * ( _stack-> currSize) ;
// printf("Stack reallocation succeeded.\nCurrent stack size: %d\n", _stack->currSize);
}
_stack-> top++;
_stack-> arr[ _stack-> top] = _item;
}
void Pop( Stack* _stack) {
if ( _stack == NULL)
{
return ;
}
if ( _stack-> top == EMPTY)
{
printf ( "Pop::Stack is empty\n " ) ; return ;
}
_stack-> top--;
}
int Top( Stack* _stack) {
if ( _stack == NULL)
{
return EMPTY;
}
if ( _stack-> top == EMPTY)
{
printf ( "Top::Stack is empty\n " ) ; return EMPTY;
}
// printf("Top::Stack top: %c\n", _stack->arr[_stack->top]);
return _stack-> arr[ _stack-> top] ;
}
void PrintStack( Stack* _stack) {
printf ( "PrintStack\n ***********\n " ) ; int i;
if ( _stack == NULL) {
return ;
}
printf ( "Current stack size: %d, Current top index: %d\n " , _stack
-> currSize
, _stack
-> top
) ; if ( _stack-> top == EMPTY) {
printf ( "PrintStack::Stack is empty\n " ) ; return ;
}
printf ( "Stack content:\n --------------\n " ) ; for ( i = 0 ; i <= _stack-> top; i++ ) {
printf ( "%c " , _stack
-> arr
[ i
] ) ; }
}
bool isOpenBracket( int _item) {
int i = 0 ;
// printf("isOpenBracket:: _item: %c\n", _item);
while ( openBrackets[ i] != '\0 ' ) {
if ( openBrackets[ i] == _item) {
return true ;
}
i++;
}
return false ;
}
bool isCloseBracket( int _item, int * _openBracket) {
int i = 0 ;
while ( closeBrackets[ i] != '\0 ' )
{
if ( closeBrackets[ i] == _item)
{
* _openBracket = openBrackets[ i] ;
return true ;
}
i++;
}
return false ;
}
bool BalancedBrackets( char * _string) {
int i, _topBracket, _openBracket;
Stack* stack = StackCreate( ) ;
for ( i = 0 ; _string[ i] != '\0 ' ; i++ ) {
if ( isOpenBracket( _string[ i] ) ) {
Push( stack, _string[ i] ) ;
}
if ( isCloseBracket( _string[ i] , & _openBracket) ) {
_topBracket = Top( stack) ;
// printf("BalancedBrackets:: _openBracket: %c\n", _openBracket);
if ( _topBracket == EMPTY) {
return false ;
}
if ( _topBracket != _openBracket) {
return false ;
}
Pop( stack) ;
}
}
if ( stack-> top != EMPTY)
{
return false ;
}
return true ;
}
void TestBalancedBrackets( ) {
char str1[ ] = "if(a+{2*max(A[],5)}>7)" ; //PASS
char str2[ ] = "if(a+{2*max(A[],5)}>7)(" ; //FAIL
char str3[ ] = "}if(a+{2*max(A[],5)}>7)" ; //FAIL
char str4[ ] = "if(a+{2*max)(A[],5)}>7)" ; //FAIL
char str5[ ] = "if(a+{2*max(A[],5)}>7){([])}" ; //PASS
char str6[ ] = "if(a+{2*max})(A[],5)}>7)" ; //FAIL
char str7[ ] = "(({[{[[]]}]}))" ; //PASS
char str8[ ] = "(({[{[[]}]}]}))" ; //FAIL
char str9[ ] = "}(({[{[[]]}]}))" ; //FAIL
char str10[ ] = "(({[{[[]]}]})){[]}" ; //PASS
char str11[ ] = "(({[{[[]]}]})))" ; //FAIL
char str12[ ] = "((({[{[[]]}]}))" ; //FAIL
char str13[ ] = "%5****435,.<>)()" ; //FAIL
if ( BalancedBrackets( str1) == true )
{
printf ( "Test string1: %s has balanced brackets ---> PASS\n " , str1
) ; }
else
{
printf ( "Test string1: %s ---> FAILED\n " , str1
) ; }
if ( BalancedBrackets( str2) == false )
{
printf ( "Test string2: %s does NOT have balanced brackets ---> PASS\n " , str2
) ; }
else
{
printf ( "Test string2: %s ---> FAILED\n " , str2
) ; }
if ( BalancedBrackets( str3) == false )
{
printf ( "Test string3: %s does NOT have balanced brackets ---> PASS\n " , str3
) ; }
else
{
printf ( "Test string3: %s ---> FAILED\n " , str3
) ; }
if ( BalancedBrackets( str4) == false )
{
printf ( "Test string4: %s does NOT have balanced brackets ---> PASS\n " , str4
) ; }
else
{
printf ( "Test string4: %s ---> FAILED\n " , str4
) ; }
if ( BalancedBrackets( str5) == true )
{
printf ( "Test string5: %s has balanced brackets ---> PASS\n " , str5
) ; }
else
{
printf ( "Test string5: %s ---> FAILED\n " , str5
) ; }
if ( BalancedBrackets( str6) == false )
{
printf ( "Test string6: %s does NOT have balanced brackets ---> PASS\n " , str6
) ; }
else
{
printf ( "Test string6: %s ---> FAILED\n " , str6
) ; }
if ( BalancedBrackets( str7) == true )
{
printf ( "Test string7: %s has balanced brackets ---> PASS\n " , str7
) ; }
else
{
printf ( "Test string7: %s ---> FAILED\n " , str7
) ; }
if ( BalancedBrackets( str8) == false )
{
printf ( "Test string8: %s does NOT have balanced brackets ---> PASS\n " , str8
) ; }
else
{
printf ( "Test string8: %s ---> FAILED\n " , str8
) ; }
if ( BalancedBrackets( str9) == false )
{
printf ( "Test string9: %s does NOT have balanced brackets ---> PASS\n " , str9
) ; }
else
{
printf ( "Test string9: %s ---> FAILED\n " , str9
) ; }
if ( BalancedBrackets( str10) == true )
{
printf ( "Test string10: %s has balanced brackets ---> PASS\n " , str10
) ; }
else
{
printf ( "Test string10: %s ---> FAILED\n " , str10
) ; }
if ( BalancedBrackets( str11) == false )
{
printf ( "Test string11: %s does NOT have balanced brackets ---> PASS\n " , str11
) ; }
else
{
printf ( "Test string11: %s ---> FAILED\n " , str11
) ; }
if ( BalancedBrackets( str12) == false )
{
printf ( "Test string12: %s does NOT have balanced brackets ---> PASS\n " , str12
) ; }
else
{
printf ( "Test string12: %s ---> FAILED\n " , str12
) ; }
if ( BalancedBrackets( str13) == false )
{
printf ( "Test string13: %s does NOT have balanced brackets ---> PASS\n " , str13
) ; }
else
{
printf ( "Test string13: %s ---> FAILED\n " , str13
) ; }
}
int main( )
{
TestBalancedBrackets( ) ;
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdGRsaWIuaD4KI2luY2x1ZGUgPHN0cmluZy5oPgojaW5jbHVkZSA8c3RkYm9vbC5oPgoKI2RlZmluZSBJTklUSUFMX1NJWkUgMTAKI2RlZmluZSBFTVBUWSAtMQoKc3RydWN0IFN0YWNrCnsKCWludCogYXJyOwoJaW50IGN1cnJTaXplOwoJaW50IHRvcDsKfTsKCnR5cGVkZWYgc3RydWN0IFN0YWNrIFN0YWNrOwoKLyogR2xvYmFsIGNoYXIgYXJyYXlzIGZvciBvcGVuaW5nIGFuZCBjbG9zaW5nIGJyYWNrZXRzICovCmNoYXIgb3BlbkJyYWNrZXRzW10gPSB7JygnLCd7JywnWycsJ1wwJ307CmNoYXIgY2xvc2VCcmFja2V0c1tdID0geycpJywnfScsJ10nLCdcMCd9OwoKClN0YWNrKiBTdGFja0NyZWF0ZSgpewoJU3RhY2sqIHN0YWNrID0gbWFsbG9jKHNpemVvZihTdGFjaykpOwoJaWYoc3RhY2sgPT0gTlVMTCkKCXsKCQlyZXR1cm4gTlVMTDsKCX0KCXN0YWNrLT5hcnIgPSBtYWxsb2MoSU5JVElBTF9TSVpFICogc2l6ZW9mKGludCkpOwoJaWYoc3RhY2stPmFyciA9PSBOVUxMKQoJewoJCWZyZWUoc3RhY2spOwoJCXJldHVybiBOVUxMOwoJfQoJc3RhY2stPmN1cnJTaXplID0gSU5JVElBTF9TSVpFOwoJc3RhY2stPnRvcCA9IEVNUFRZOwoJCglyZXR1cm4gc3RhY2s7Cn0KCnZvaWQgUHVzaChTdGFjayogX3N0YWNrLCBpbnQgX2l0ZW0pewoJaWYoX3N0YWNrID09IE5VTEwpCgl7CgkJcmV0dXJuOwoJfQoJaWYoX3N0YWNrLT50b3AgPT0gKF9zdGFjay0+Y3VyclNpemUgLSAxKSkKCXsKCQkvLyBwcmludGYoIlN0YWNrIGlzIGZ1bGwgd2l0aCAlZCBpdGVtcy5cblRyeWluZyB0byByZWFsbG9jYXRpbmcgc3RhY2sgdG8gc2l6ZTogJWRcbiIsIF9zdGFjay0+Y3VyclNpemUsIDIqX3N0YWNrLT5jdXJyU2l6ZSk7CgkJaW50KiB0ZW1wID0gKGludCopcmVhbGxvYyhfc3RhY2stPmFyciwgMiAqIChfc3RhY2stPmN1cnJTaXplKSAqIHNpemVvZihpbnQpKTsKCQlpZih0ZW1wID09IE5VTEwpCgkJewoJCQlwcmludGYoIlJlYWxsb2NhdGluZyBmYWlsZWQhXG4iKTsKCQkJcmV0dXJuOwoJCX0KCQlfc3RhY2stPmFyciA9IHRlbXA7CgkJX3N0YWNrLT5jdXJyU2l6ZSA9IDIgKiAoX3N0YWNrLT5jdXJyU2l6ZSk7CgkJLy8gcHJpbnRmKCJTdGFjayByZWFsbG9jYXRpb24gc3VjY2VlZGVkLlxuQ3VycmVudCBzdGFjayBzaXplOiAlZFxuIiwgX3N0YWNrLT5jdXJyU2l6ZSk7Cgl9CgkKCV9zdGFjay0+dG9wKys7Cglfc3RhY2stPmFycltfc3RhY2stPnRvcF0gPSBfaXRlbTsKfQoKdm9pZCBQb3AoU3RhY2sqIF9zdGFjayl7CglpZihfc3RhY2sgPT0gTlVMTCkKCXsKCQlyZXR1cm47Cgl9CglpZihfc3RhY2stPnRvcCA9PSBFTVBUWSkKCXsKCQlwcmludGYoIlBvcDo6U3RhY2sgaXMgZW1wdHlcbiIpOwoJCXJldHVybjsKCX0KCQoJX3N0YWNrLT50b3AtLTsKfQoKaW50IFRvcChTdGFjayogX3N0YWNrKXsKCWlmKF9zdGFjayA9PSBOVUxMKQoJewoJCXJldHVybiBFTVBUWTsKCX0KCWlmKF9zdGFjay0+dG9wID09IEVNUFRZKQoJewoJCXByaW50ZigiVG9wOjpTdGFjayBpcyBlbXB0eVxuIik7CgkJcmV0dXJuIEVNUFRZOwoJfQoJLy8gcHJpbnRmKCJUb3A6OlN0YWNrIHRvcDogJWNcbiIsIF9zdGFjay0+YXJyW19zdGFjay0+dG9wXSk7CglyZXR1cm4gX3N0YWNrLT5hcnJbX3N0YWNrLT50b3BdOwp9Cgp2b2lkIFByaW50U3RhY2soU3RhY2sqIF9zdGFjayl7CglwcmludGYoIlByaW50U3RhY2tcbioqKioqKioqKioqXG4iKTsKCWludCBpOwoJaWYoX3N0YWNrID09IE5VTEwpIHsKCQlyZXR1cm47Cgl9CglwcmludGYoIkN1cnJlbnQgc3RhY2sgc2l6ZTogJWQsIEN1cnJlbnQgdG9wIGluZGV4OiAlZFxuIiwgX3N0YWNrLT5jdXJyU2l6ZSxfc3RhY2stPnRvcCk7CglpZihfc3RhY2stPnRvcCA9PSBFTVBUWSkgewoJCXByaW50ZigiUHJpbnRTdGFjazo6U3RhY2sgaXMgZW1wdHlcbiIpOwoJCXJldHVybjsKCX0KCXByaW50ZigiU3RhY2sgY29udGVudDpcbi0tLS0tLS0tLS0tLS0tXG4iKTsKCWZvcihpID0gMDsgaSA8PSBfc3RhY2stPnRvcDsgaSsrKSB7CgkJcHJpbnRmKCIlYyAiLCBfc3RhY2stPmFycltpXSk7Cgl9CglwcmludGYoIlxuIik7Cn0KCmJvb2wgaXNPcGVuQnJhY2tldChpbnQgX2l0ZW0pIHsKCWludCBpID0gMDsKCS8vIHByaW50ZigiaXNPcGVuQnJhY2tldDo6IF9pdGVtOiAlY1xuIiwgX2l0ZW0pOwoJd2hpbGUob3BlbkJyYWNrZXRzW2ldICE9ICdcMCcpIHsKCQlpZihvcGVuQnJhY2tldHNbaV0gPT0gX2l0ZW0pIHsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWkrKzsKCX0KCQoJcmV0dXJuIGZhbHNlOwp9Cgpib29sIGlzQ2xvc2VCcmFja2V0KGludCBfaXRlbSwgaW50ICpfb3BlbkJyYWNrZXQpIHsKCWludCBpID0gMDsKCXdoaWxlKGNsb3NlQnJhY2tldHNbaV0gIT0gJ1wwJykKCXsKCQlpZihjbG9zZUJyYWNrZXRzW2ldID09IF9pdGVtKQoJCXsKCQkJKl9vcGVuQnJhY2tldCA9IG9wZW5CcmFja2V0c1tpXTsKCQkJcmV0dXJuIHRydWU7CgkJfQoJCWkrKzsKCX0KCQoJcmV0dXJuIGZhbHNlOwp9CgoKYm9vbCBCYWxhbmNlZEJyYWNrZXRzKGNoYXIqIF9zdHJpbmcpewoJaW50IGksIF90b3BCcmFja2V0LCBfb3BlbkJyYWNrZXQ7CglTdGFjayogc3RhY2sgPSBTdGFja0NyZWF0ZSgpOwoJCglmb3IoaSA9IDA7IF9zdHJpbmdbaV0gIT0gJ1wwJzsgaSsrKSB7CgkJaWYoaXNPcGVuQnJhY2tldChfc3RyaW5nW2ldKSkgewoJCQlQdXNoKHN0YWNrLCBfc3RyaW5nW2ldKTsKCQl9CgkJaWYoaXNDbG9zZUJyYWNrZXQoX3N0cmluZ1tpXSwgJl9vcGVuQnJhY2tldCkpIHsKCQkJX3RvcEJyYWNrZXQgPSBUb3Aoc3RhY2spOwoJCQkvLyBwcmludGYoIkJhbGFuY2VkQnJhY2tldHM6OiBfb3BlbkJyYWNrZXQ6ICVjXG4iLCBfb3BlbkJyYWNrZXQpOwoJCQlpZihfdG9wQnJhY2tldCA9PSBFTVBUWSkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCWlmKF90b3BCcmFja2V0ICE9IF9vcGVuQnJhY2tldCkgewoJCQkJcmV0dXJuIGZhbHNlOwoJCQl9CgkJCVBvcChzdGFjayk7CQkJCgkJfQoJfQoKCWlmKHN0YWNrLT50b3AgIT0gRU1QVFkpCgl7CgkJcmV0dXJuIGZhbHNlOwoJfQoJCglyZXR1cm4gdHJ1ZTsKfQoKdm9pZCBUZXN0QmFsYW5jZWRCcmFja2V0cygpewoJY2hhciBzdHIxW10gPSAiaWYoYSt7MiptYXgoQVtdLDUpfT43KSI7CQkJCS8vUEFTUwoJY2hhciBzdHIyW10gPSAiaWYoYSt7MiptYXgoQVtdLDUpfT43KSgiOwkJCS8vRkFJTAoJY2hhciBzdHIzW10gPSAifWlmKGErezIqbWF4KEFbXSw1KX0+NykiOwkJCS8vRkFJTAoJY2hhciBzdHI0W10gPSAiaWYoYSt7MiptYXgpKEFbXSw1KX0+NykiOwkJCS8vRkFJTAoJY2hhciBzdHI1W10gPSAiaWYoYSt7MiptYXgoQVtdLDUpfT43KXsoW10pfSI7CQkvL1BBU1MKCWNoYXIgc3RyNltdID0gImlmKGErezIqbWF4fSkoQVtdLDUpfT43KSI7CQkJLy9GQUlMCgljaGFyIHN0cjdbXSA9ICIoKHtbe1tbXV19XX0pKSI7CQkJCQkJLy9QQVNTCgljaGFyIHN0cjhbXSA9ICIoKHtbe1tbXX1dfV19KSkiOwkJCQkJLy9GQUlMCgljaGFyIHN0cjlbXSA9ICJ9KCh7W3tbW11dfV19KSkiOwkJCQkJLy9GQUlMCgljaGFyIHN0cjEwW10gPSAiKCh7W3tbW11dfV19KSl7W119IjsJCQkJLy9QQVNTCgljaGFyIHN0cjExW10gPSAiKCh7W3tbW11dfV19KSkpIjsJCQkJCS8vRkFJTAoJY2hhciBzdHIxMltdID0gIigoKHtbe1tbXV19XX0pKSI7CQkJCQkvL0ZBSUwKCWNoYXIgc3RyMTNbXSA9ICIlNSoqKio0MzUsLjw+KSgpIjsJCQkJCS8vRkFJTAoJCglpZihCYWxhbmNlZEJyYWNrZXRzKHN0cjEpID09IHRydWUpCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzE6ICVzIGhhcyBiYWxhbmNlZCBicmFja2V0cyAtLS0+IFBBU1NcbiIsIHN0cjEpOwoJfQoJZWxzZQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmcxOiAlcyAtLS0+IEZBSUxFRFxuIiwgc3RyMSk7Cgl9CglpZihCYWxhbmNlZEJyYWNrZXRzKHN0cjIpID09IGZhbHNlKQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmcyOiAlcyBkb2VzIE5PVCBoYXZlIGJhbGFuY2VkIGJyYWNrZXRzIC0tLT4gUEFTU1xuIiwgc3RyMik7Cgl9CgllbHNlCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzI6ICVzIC0tLT4gRkFJTEVEXG4iLCBzdHIyKTsKCX0KCWlmKEJhbGFuY2VkQnJhY2tldHMoc3RyMykgPT0gZmFsc2UpCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzM6ICVzIGRvZXMgTk9UIGhhdmUgYmFsYW5jZWQgYnJhY2tldHMgLS0tPiBQQVNTXG4iLCBzdHIzKTsKCX0KCWVsc2UKCXsKCQlwcmludGYoIlRlc3Qgc3RyaW5nMzogJXMgLS0tPiBGQUlMRURcbiIsIHN0cjMpOwoJfQoJaWYoQmFsYW5jZWRCcmFja2V0cyhzdHI0KSA9PSBmYWxzZSkKCXsKCQlwcmludGYoIlRlc3Qgc3RyaW5nNDogJXMgZG9lcyBOT1QgaGF2ZSBiYWxhbmNlZCBicmFja2V0cyAtLS0+IFBBU1NcbiIsIHN0cjQpOwoJfQoJZWxzZQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmc0OiAlcyAtLS0+IEZBSUxFRFxuIiwgc3RyNCk7Cgl9CglpZihCYWxhbmNlZEJyYWNrZXRzKHN0cjUpID09IHRydWUpCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzU6ICVzIGhhcyBiYWxhbmNlZCBicmFja2V0cyAtLS0+IFBBU1NcbiIsIHN0cjUpOwoJfQoJZWxzZQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmc1OiAlcyAtLS0+IEZBSUxFRFxuIiwgc3RyNSk7Cgl9CglpZihCYWxhbmNlZEJyYWNrZXRzKHN0cjYpID09IGZhbHNlKQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmc2OiAlcyBkb2VzIE5PVCBoYXZlIGJhbGFuY2VkIGJyYWNrZXRzIC0tLT4gUEFTU1xuIiwgc3RyNik7Cgl9CgllbHNlCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzY6ICVzIC0tLT4gRkFJTEVEXG4iLCBzdHI2KTsKCX0KCWlmKEJhbGFuY2VkQnJhY2tldHMoc3RyNykgPT0gdHJ1ZSkKCXsKCQlwcmludGYoIlRlc3Qgc3RyaW5nNzogJXMgaGFzIGJhbGFuY2VkIGJyYWNrZXRzIC0tLT4gUEFTU1xuIiwgc3RyNyk7Cgl9CgllbHNlCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzc6ICVzIC0tLT4gRkFJTEVEXG4iLCBzdHI3KTsKCX0KCWlmKEJhbGFuY2VkQnJhY2tldHMoc3RyOCkgPT0gZmFsc2UpCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzg6ICVzIGRvZXMgTk9UIGhhdmUgYmFsYW5jZWQgYnJhY2tldHMgLS0tPiBQQVNTXG4iLCBzdHI4KTsKCX0KCWVsc2UKCXsKCQlwcmludGYoIlRlc3Qgc3RyaW5nODogJXMgLS0tPiBGQUlMRURcbiIsIHN0cjgpOwoJfQoJaWYoQmFsYW5jZWRCcmFja2V0cyhzdHI5KSA9PSBmYWxzZSkKCXsKCQlwcmludGYoIlRlc3Qgc3RyaW5nOTogJXMgZG9lcyBOT1QgaGF2ZSBiYWxhbmNlZCBicmFja2V0cyAtLS0+IFBBU1NcbiIsIHN0cjkpOwoJfQoJZWxzZQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmc5OiAlcyAtLS0+IEZBSUxFRFxuIiwgc3RyOSk7Cgl9CglpZihCYWxhbmNlZEJyYWNrZXRzKHN0cjEwKSA9PSB0cnVlKQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmcxMDogJXMgaGFzIGJhbGFuY2VkIGJyYWNrZXRzIC0tLT4gUEFTU1xuIiwgc3RyMTApOwoJfQoJZWxzZQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmcxMDogJXMgLS0tPiBGQUlMRURcbiIsIHN0cjEwKTsKCX0KCWlmKEJhbGFuY2VkQnJhY2tldHMoc3RyMTEpID09IGZhbHNlKQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmcxMTogJXMgZG9lcyBOT1QgaGF2ZSBiYWxhbmNlZCBicmFja2V0cyAtLS0+IFBBU1NcbiIsIHN0cjExKTsKCX0KCWVsc2UKCXsKCQlwcmludGYoIlRlc3Qgc3RyaW5nMTE6ICVzIC0tLT4gRkFJTEVEXG4iLCBzdHIxMSk7Cgl9CglpZihCYWxhbmNlZEJyYWNrZXRzKHN0cjEyKSA9PSBmYWxzZSkKCXsKCQlwcmludGYoIlRlc3Qgc3RyaW5nMTI6ICVzIGRvZXMgTk9UIGhhdmUgYmFsYW5jZWQgYnJhY2tldHMgLS0tPiBQQVNTXG4iLCBzdHIxMik7Cgl9CgllbHNlCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzEyOiAlcyAtLS0+IEZBSUxFRFxuIiwgc3RyMTIpOwoJfQoJaWYoQmFsYW5jZWRCcmFja2V0cyhzdHIxMykgPT0gZmFsc2UpCgl7CgkJcHJpbnRmKCJUZXN0IHN0cmluZzEzOiAlcyBkb2VzIE5PVCBoYXZlIGJhbGFuY2VkIGJyYWNrZXRzIC0tLT4gUEFTU1xuIiwgc3RyMTMpOwoJfQoJZWxzZQoJewoJCXByaW50ZigiVGVzdCBzdHJpbmcxMzogJXMgLS0tPiBGQUlMRURcbiIsIHN0cjEzKTsKCX0KfQoKaW50IG1haW4oKQp7CglUZXN0QmFsYW5jZWRCcmFja2V0cygpOwoJCglyZXR1cm4gMDsKfQ==