#include <stdio.h>
#include <math.h>
int main ( )
{
int encaixa;
double baseCarta, alturaCarta, baseEnvelope, alturaEnvelope;
double distanciaCarta, distanciaEnvelope;
double raioEnv, centroEnvX, centroEnvY;
double coefAReta, coefBReta, coefCReta, coefBNegReta, coefCNegReta;
double coefARetaE2, centroEnvXArrumado, centroEnvYArrumado, coefBCNegRetaJunto, constanteCircTotal;
double AEquacaoYCirc, BEquacaoYCirc, CEquacaoYCirc, deltaEquacaoY, x1EquacaoY, x2EquacaoY;
double equacaoRetaX1, equacaoRetaX2, distanciaCentroRetaX1, distanciaCentroRetaX2;
scanf ( "%lf %lf %lf %lf" , & alturaCarta
, & baseCarta
, & alturaEnvelope
, & baseEnvelope
) ;
/* Guia das Variáveis e suas representações no Exercício 2978 da URI OJ:
"alturaCarta" representa a Letra A (Coordenada X da Carta) Eixo 0X (abscissa)
"baseCarta" representa a Letra B (Coordenada Y da Carta) Eixo 0Y (ordenada)
"alturaEnvelope" representa a Letra C (Coordenada X do Envelope) Eixo 0X (abscissa)
"baseEnvelope" representa a Letra D (Coordenada Y do Envelope) Eixo 0Y (ordenada)
"distanciaCarta" representa A^2 + B^2 (Carta)
"distanciaEnvelope" representa C^2 + D^2 (Envelope)
*/
encaixa = - 1 ;
if ( alturaCarta > alturaEnvelope)
{
encaixa = 0 ;
}
else if ( ( alturaCarta <= alturaEnvelope) && ( baseCarta <= baseEnvelope) )
{
encaixa = 1 ;
}
else if ( ( alturaCarta <= alturaEnvelope) && ( baseCarta > baseEnvelope) )
{
distanciaCarta
= sqrt ( pow ( alturaCarta
, 2 ) + pow ( baseCarta
, 2 ) ) ; distanciaEnvelope
= sqrt ( pow ( alturaEnvelope
, 2 ) + pow ( baseEnvelope
, 2 ) ) ;
if ( distanciaCarta > distanciaEnvelope)
{
printf ( "DC %lf DE %lf\n \n " , distanciaCarta
, distanciaEnvelope
) ; encaixa = 0 ;
}
else
{
/* passos agora:
usar determinantes com base nos pontos C e D separados onde
C (0;Y) e D (X;0)
equacao reta CD
usar pontos da carta na reta CD e verificar se os pontos A e B
são iguais ou menores a igualdade da reta CD
determinante tem 3 retas
1 - dois numeros e Y --> Y, 1, X1 (subtrai)
2 - dois numeros e X --> X, 1, Y2 (subtrai)
3 - 3 numeros --> 1, X1, Y2 (soma)
*/
// raio
raioEnv = distanciaCarta / 2 ;
// centro X e Y
centroEnvX = alturaEnvelope / 2 ;
centroEnvY = baseEnvelope / 2 ;
printf ( "DC %lf DE %lf\n \n " , distanciaCarta
, distanciaEnvelope
) ;
/*double pontoX, pontoY, teste, teste2, teste3;
pontoX = alturaCarta / 2;
pontoY = baseCarta / 2;
*/
printf ( "XC %lf YC %lf XP %lf YP %lf\n R %lf\n \n " , centroEnvX
, centroEnvY
, pontoX
, pontoY
, raioEnv
) ;
//teste = sqrt(pow((alturaCarta - alturaEnvelope), 2) + pow((baseCarta - baseEnvelope), 2));
//teste = sqrt(pow((baseCarta - baseEnvelope), 2)); // 0Y
//teste2 = sqrt(pow((alturaCarta - alturaEnvelope), 2)); // 0X
//teste3 = sqrt(pow((pontoX - centroEnvX), 2) + pow((pontoY - centroEnvY), 2)); // Meio
//teste = pow((alturaCarta - centroEnvX), 2) + pow((baseCarta - centroEnvY), 2) - pow(raioEnv, 2);
printf ( "DCPBD %lf \n DCPAC %lf \n DCPCPX %lf\n \n \n \n " , teste
, teste2
, teste3
) ;
/*double teste4[3], menor;
int i;
teste4[0] = teste;
teste4[1] = teste2;
teste4[2] = teste3;
menor = teste4[0];
for (i = 1; i < 3; i++)
{
if (teste4[i] < menor)
{
menor = teste4[i];
}
}
printf ("Menor %lf\n\n", menor);
if (teste >= alturaCarta)
{
encaixa = 1;
}
else
{
encaixa = 0;
}
*/
printf ( "C(%g, %g) Raio %g\n \n " , centroEnvX
, centroEnvY
, raioEnv
) ;
// Equação da reta
coefAReta = 1 * baseCarta;
coefBReta = 1 * alturaCarta;
coefCReta = - 1 * baseCarta * alturaCarta;
printf ( "%gX %gY %g\n \n " , coefAReta
, coefBReta
, coefCReta
) ;
// Equação da reta: B e C pro segundo membro deixando X em evidência
coefBNegReta = - 1 * coefBReta;
coefCNegReta = - 1 * coefCReta;
//printf ("X = %gY %g / %g\n\n", coefBNegReta, coefCNegReta, coefAReta);
// Reduções de expressões para Interseção de Reta e Circunferência e elaboração de
// Equação do Segundo Grau de Y
coefARetaE2
= 1 * pow ( coefAReta
, 2 ) ; centroEnvXArrumado = - 1 * 2 * centroEnvX;
centroEnvYArrumado = - 1 * 2 * centroEnvY;
coefBCNegRetaJunto = 1 * 2 * coefBNegReta * coefCNegReta;
constanteCircTotal
= ( pow ( centroEnvX
, 2 ) + pow ( centroEnvY
, 2 ) - pow ( raioEnv
, 2 ) ) ;
// Coeficientes A, B e C da Equação do segundo grau de Y
AEquacaoYCirc
= ( pow ( coefBNegReta
, 2 ) + coefARetaE2
) ; BEquacaoYCirc = ( coefBCNegRetaJunto + ( coefBNegReta * centroEnvXArrumado * coefAReta) + ( centroEnvYArrumado * coefARetaE2) ) ;
CEquacaoYCirc
= ( pow ( coefCNegReta
, 2 ) + ( coefCNegReta
* centroEnvXArrumado
* coefAReta
) + ( constanteCircTotal
* coefARetaE2
) ) ;
//printf ("Equacao Y = %gY^2 %gY %g = 0\n\n", AEquacaoYCirc, BEquacaoYCirc, CEquacaoYCirc);
deltaEquacaoY
= ( ( pow ( BEquacaoYCirc
, 2 ) ) - ( 4 * AEquacaoYCirc
* CEquacaoYCirc
) ) ;
//printf ("Delta %g\n\n", deltaEquacaoY);
if ( deltaEquacaoY < 0 )
{
encaixa = 0 ;
}
else if ( deltaEquacaoY == 0 )
{
// distancia = raio e novo calculo
if ( raioEnv >= alturaCarta)
{
encaixa = 1 ;
}
else
{
encaixa = 0 ;
}
}
else
{
// entao delta > 0; duas raizes
x1EquacaoY
= ( ( - 1 * BEquacaoYCirc
) + sqrt ( deltaEquacaoY
) ) / ( 2 * AEquacaoYCirc
) ; x2EquacaoY
= ( ( - 1 * BEquacaoYCirc
) - sqrt ( deltaEquacaoY
) ) / ( 2 * AEquacaoYCirc
) ;
//printf ("y1 = %g y2 %g\n\n", x1EquacaoY, x2EquacaoY);
equacaoRetaX1 = ( ( ( coefBNegReta * x1EquacaoY) + coefCNegReta) / coefAReta) ;
equacaoRetaX2 = ( ( ( coefBNegReta * x2EquacaoY) + coefCNegReta) / coefAReta) ;
/* if ((x1EquacaoY < 0) && (x2EquacaoY < 0))
{
encaixa = 0;
}
else if (x1EquacaoY < 0)
{
// considerar x2
equacaoRetaX1 = -1;
equacaoRetaX2 = (((coefBNegReta * x2EquacaoY) + coefCNegReta) / coefAReta);
}
else if (x2EquacaoY < 0)
{
// considerar x1
equacaoRetaX1 = (((coefBNegReta * x1EquacaoY) + coefCNegReta) / coefAReta);
equacaoRetaX2 = -1;
}
else
{
// considerar x1 E x2
equacaoRetaX1 = (((coefBNegReta * x1EquacaoY) + coefCNegReta) / coefAReta);
equacaoRetaX2 = (((coefBNegReta * x2EquacaoY) + coefCNegReta) / coefAReta);
}
*/
//printf ("x1 = %g x2 %g\n\n", equacaoRetaX1, equacaoRetaX2);
//printf ("PontoX (%g; %g) / PontoY (%g; %g)\n\n", equacaoRetaX1, x1EquacaoY, equacaoRetaX2, x2EquacaoY);
/* if (equacaoRetaX1 == -1)
{
// a segunda
distanciaCentroRetaX2 = sqrt(pow((equacaoRetaX2 - centroEnvX), 2) + pow((x2EquacaoY - centroEnvY), 2));
distanciaCentroRetaX1 = -1;
}
else if (equacaoRetaX2 == -1)
{
// a primeira
distanciaCentroRetaX1 = sqrt(pow((equacaoRetaX1 - centroEnvX), 2) + pow((x1EquacaoY - centroEnvY), 2));
distanciaCentroRetaX2 = -1;
}
else
{
distanciaCentroRetaX1 = sqrt(pow((equacaoRetaX1 - centroEnvX), 2) + pow((x1EquacaoY - centroEnvY), 2));
distanciaCentroRetaX2 = sqrt(pow((equacaoRetaX2 - centroEnvX), 2) + pow((x2EquacaoY - centroEnvY), 2));
}
*/
distanciaCentroRetaX1
= sqrt ( pow ( ( equacaoRetaX1
- centroEnvX
) , 2 ) + pow ( ( x1EquacaoY
- centroEnvY
) , 2 ) ) ; distanciaCentroRetaX2
= sqrt ( pow ( ( equacaoRetaX2
- centroEnvX
) , 2 ) + pow ( ( x2EquacaoY
- centroEnvY
) , 2 ) ) ;
//printf ("distx1 = %g distx2 %g\n\n", distanciaCentroRetaX1, distanciaCentroRetaX2);
if ( distanciaCentroRetaX1 <= distanciaCentroRetaX2)
{
if ( distanciaCentroRetaX1 >= alturaCarta)
{
encaixa = 1 ;
}
else
{
encaixa = 0 ;
}
}
else
{
if ( distanciaCentroRetaX2 >= alturaCarta)
{
encaixa = 1 ;
}
else
{
encaixa = 0 ;
}
}
/* if (distanciaCentroRetaX1 == -1)
{
// a segunda
if (distanciaCentroRetaX2 >= alturaCarta)
{
encaixa = 1;
}
else
{
encaixa = 0;
}
}
else if (distanciaCentroRetaX2 == -1)
{
// a primeira
if (distanciaCentroRetaX1 >= alturaCarta)
{
encaixa = 1;
}
else
{
encaixa = 0;
}
}
else
{
// ponto mais perto do centro
if (distanciaCentroRetaX1 <= distanciaCentroRetaX2)
{
if (distanciaCentroRetaX1 >= alturaCarta)
{
encaixa = 1;
}
else
{
encaixa = 0;
}
}
else
{
if (distanciaCentroRetaX2 >= alturaCarta)
{
encaixa = 1;
}
else
{
encaixa = 0;
}
}
}
*/
}
}
}
if ( encaixa)
{
}
else
{
}
return 0 ;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxtYXRoLmg+CgppbnQgbWFpbiAoKQp7CglpbnQgZW5jYWl4YTsKCWRvdWJsZSBiYXNlQ2FydGEsIGFsdHVyYUNhcnRhLCBiYXNlRW52ZWxvcGUsIGFsdHVyYUVudmVsb3BlOwoJZG91YmxlIGRpc3RhbmNpYUNhcnRhLCBkaXN0YW5jaWFFbnZlbG9wZTsKCWRvdWJsZSByYWlvRW52LCBjZW50cm9FbnZYLCBjZW50cm9FbnZZOwoJZG91YmxlIGNvZWZBUmV0YSwgY29lZkJSZXRhLCBjb2VmQ1JldGEsIGNvZWZCTmVnUmV0YSwgY29lZkNOZWdSZXRhOwoJZG91YmxlIGNvZWZBUmV0YUUyLCBjZW50cm9FbnZYQXJydW1hZG8sIGNlbnRyb0VudllBcnJ1bWFkbywgY29lZkJDTmVnUmV0YUp1bnRvLCBjb25zdGFudGVDaXJjVG90YWw7Cglkb3VibGUgQUVxdWFjYW9ZQ2lyYywgQkVxdWFjYW9ZQ2lyYywgQ0VxdWFjYW9ZQ2lyYywgZGVsdGFFcXVhY2FvWSwgeDFFcXVhY2FvWSwgeDJFcXVhY2FvWTsKCWRvdWJsZSBlcXVhY2FvUmV0YVgxLCBlcXVhY2FvUmV0YVgyLCBkaXN0YW5jaWFDZW50cm9SZXRhWDEsIGRpc3RhbmNpYUNlbnRyb1JldGFYMjsKCQoJc2NhbmYgKCIlbGYgJWxmICVsZiAlbGYiLCAmYWx0dXJhQ2FydGEsICZiYXNlQ2FydGEsICZhbHR1cmFFbnZlbG9wZSwgJmJhc2VFbnZlbG9wZSk7CgkKCS8qCUd1aWEgZGFzIFZhcmnDoXZlaXMgZSBzdWFzIHJlcHJlc2VudGHDp8O1ZXMgbm8gRXhlcmPDrWNpbyAyOTc4IGRhIFVSSSBPSjoKCQoJCSJhbHR1cmFDYXJ0YSIgcmVwcmVzZW50YSBhIExldHJhIEEgKENvb3JkZW5hZGEgWCBkYSBDYXJ0YSkgRWl4byAwWCAoYWJzY2lzc2EpCgkJImJhc2VDYXJ0YSIgcmVwcmVzZW50YSBhIExldHJhIEIgKENvb3JkZW5hZGEgWSBkYSBDYXJ0YSkgRWl4byAwWSAob3JkZW5hZGEpCgkJImFsdHVyYUVudmVsb3BlIiByZXByZXNlbnRhIGEgTGV0cmEgQyAoQ29vcmRlbmFkYSBYIGRvIEVudmVsb3BlKSBFaXhvIDBYIChhYnNjaXNzYSkKCQkiYmFzZUVudmVsb3BlIiByZXByZXNlbnRhIGEgTGV0cmEgRCAoQ29vcmRlbmFkYSBZIGRvIEVudmVsb3BlKSBFaXhvIDBZIChvcmRlbmFkYSkKCQkKCQkiZGlzdGFuY2lhQ2FydGEiIHJlcHJlc2VudGEgQV4yICsgQl4yIChDYXJ0YSkKCQkiZGlzdGFuY2lhRW52ZWxvcGUiIHJlcHJlc2VudGEgQ14yICsgRF4yIChFbnZlbG9wZSkKCSovCgkKCWVuY2FpeGEgPSAtMTsKCQoJaWYgKGFsdHVyYUNhcnRhID4gYWx0dXJhRW52ZWxvcGUpCgl7CgkJZW5jYWl4YSA9IDA7Cgl9CgllbHNlIGlmICgoYWx0dXJhQ2FydGEgPD0gYWx0dXJhRW52ZWxvcGUpICYmIChiYXNlQ2FydGEgPD0gYmFzZUVudmVsb3BlKSkKCXsKCQllbmNhaXhhID0gMTsKCX0KCWVsc2UgaWYgKChhbHR1cmFDYXJ0YSA8PSBhbHR1cmFFbnZlbG9wZSkgJiYgKGJhc2VDYXJ0YSA+IGJhc2VFbnZlbG9wZSkpCgl7CgkgICAgZGlzdGFuY2lhQ2FydGEgPSBzcXJ0KHBvdyAoYWx0dXJhQ2FydGEsIDIpICsgcG93IChiYXNlQ2FydGEsIDIpKTsKCSAgICBkaXN0YW5jaWFFbnZlbG9wZSA9IHNxcnQocG93IChhbHR1cmFFbnZlbG9wZSwgMikgKyBwb3cgKGJhc2VFbnZlbG9wZSwgMikpOwoJICAgIAoJICAgIGlmIChkaXN0YW5jaWFDYXJ0YSA+IGRpc3RhbmNpYUVudmVsb3BlKQoJICAgIHsKCSAgICAJcHJpbnRmICgiREMgJWxmIERFICVsZlxuXG4iLCBkaXN0YW5jaWFDYXJ0YSwgZGlzdGFuY2lhRW52ZWxvcGUpOwoJICAgIAllbmNhaXhhID0gMDsKCSAgICB9CgkgICAgZWxzZQoJICAgIHsKCSAgICAJCgkgICAgCQoJICAgIAkvKiBwYXNzb3MgYWdvcmE6CgkgICAgCQoJICAgIAkgICB1c2FyIGRldGVybWluYW50ZXMgY29tIGJhc2Ugbm9zIHBvbnRvcyBDIGUgRCBzZXBhcmFkb3Mgb25kZQoJICAgIAkgICBDICgwO1kpIGUgRCAoWDswKQoJICAgIAkgICBlcXVhY2FvIHJldGEgQ0QKCSAgICAJICAgdXNhciBwb250b3MgZGEgY2FydGEgbmEgcmV0YSBDRCBlIHZlcmlmaWNhciBzZSBvcyBwb250b3MgQSBlIEIgCgkgICAgCSAgIHPDo28gaWd1YWlzIG91IG1lbm9yZXMgYSBpZ3VhbGRhZGUgZGEgcmV0YSBDRAoJICAgIAkgICAKCSAgICAJICAgZGV0ZXJtaW5hbnRlIHRlbSAzIHJldGFzCgkgICAgCSAgIAoJICAgIAkgICAxIC0gZG9pcyBudW1lcm9zIGUgWSAtLT4gWSwgMSwgWDEgKHN1YnRyYWkpCgkgICAgCSAgIDIgLSBkb2lzIG51bWVyb3MgZSBYIC0tPiBYLCAxLCBZMiAoc3VidHJhaSkKCSAgICAJICAgMyAtIDMgbnVtZXJvcyAtLT4gMSwgWDEsIFkyIChzb21hKQoJICAgIAkgICAKCSAgICAJKi8KCSAgICAJCgkgICAgCgkgICAgCQoJICAgIAkvLyByYWlvCgkgICAgCQoJICAgIAlyYWlvRW52ID0gZGlzdGFuY2lhQ2FydGEgLyAyOwoJICAgIAkKCSAgICAJLy8gY2VudHJvIFggZSBZCgkgICAgCQoJICAgIAljZW50cm9FbnZYID0gYWx0dXJhRW52ZWxvcGUgLyAyOwoJICAgIAljZW50cm9FbnZZID0gYmFzZUVudmVsb3BlIC8gMjsKCSAgICAJCgkgICAgCXByaW50ZiAoIkRDICVsZiBERSAlbGZcblxuIiwgZGlzdGFuY2lhQ2FydGEsIGRpc3RhbmNpYUVudmVsb3BlKTsKCSAgICAJCgkgICAgCQoJICAgIAkvKmRvdWJsZSBwb250b1gsIHBvbnRvWSwgdGVzdGUsIHRlc3RlMiwgdGVzdGUzOwoJICAgIAkKCSAgICAJcG9udG9YID0gYWx0dXJhQ2FydGEgLyAyOwoJICAgIAlwb250b1kgPSBiYXNlQ2FydGEgLyAyOwoJICAgIAkqLwoJICAgIAkKCSAgICAJcHJpbnRmICgiWEMgJWxmIFlDICVsZiBYUCAlbGYgWVAgJWxmXG5SICVsZlxuXG4iLCBjZW50cm9FbnZYLCBjZW50cm9FbnZZLCBwb250b1gsIHBvbnRvWSwgcmFpb0Vudik7CgkgICAgCQoJICAgIAkKCSAgICAJCgkgICAgCS8vdGVzdGUgPSBzcXJ0KHBvdygoYWx0dXJhQ2FydGEgLSBhbHR1cmFFbnZlbG9wZSksIDIpICsgcG93KChiYXNlQ2FydGEgLSBiYXNlRW52ZWxvcGUpLCAyKSk7CgkgICAgCQoJICAgIAkvL3Rlc3RlID0gc3FydChwb3coKGJhc2VDYXJ0YSAtIGJhc2VFbnZlbG9wZSksIDIpKTsgLy8gMFkKCSAgICAJLy90ZXN0ZTIgPSBzcXJ0KHBvdygoYWx0dXJhQ2FydGEgLSBhbHR1cmFFbnZlbG9wZSksIDIpKTsgLy8gMFgKCSAgICAJLy90ZXN0ZTMgPSBzcXJ0KHBvdygocG9udG9YIC0gY2VudHJvRW52WCksIDIpICsgcG93KChwb250b1kgLSBjZW50cm9FbnZZKSwgMikpOyAvLyBNZWlvCgkgICAgCQoJICAgIAkKCSAgICAJLy90ZXN0ZSA9IHBvdygoYWx0dXJhQ2FydGEgLSBjZW50cm9FbnZYKSwgMikgKyBwb3coKGJhc2VDYXJ0YSAtIGNlbnRyb0VudlkpLCAyKSAtIHBvdyhyYWlvRW52LCAyKTsKCSAgICAJCgkgICAgCQoJICAgIAlwcmludGYgKCJEQ1BCRCAlbGYgXG5EQ1BBQyAlbGYgXG5EQ1BDUFggJWxmXG5cblxuXG4iLCB0ZXN0ZSwgdGVzdGUyLCB0ZXN0ZTMpOwoJICAgIAkKCSAgICAJLypkb3VibGUgdGVzdGU0WzNdLCBtZW5vcjsKCSAgICAJaW50IGk7CgkgICAgCQoJICAgIAl0ZXN0ZTRbMF0gPSB0ZXN0ZTsKCSAgICAJdGVzdGU0WzFdID0gdGVzdGUyOwoJICAgIAl0ZXN0ZTRbMl0gPSB0ZXN0ZTM7CgkgICAgCQoJICAgIAltZW5vciA9IHRlc3RlNFswXTsKCSAgICAJCgkgICAgCWZvciAoaSA9IDE7IGkgPCAzOyBpKyspCgkgICAgCXsKCSAgICAJCWlmICh0ZXN0ZTRbaV0gPCBtZW5vcikKCSAgICAJCXsKCSAgICAJCQltZW5vciA9IHRlc3RlNFtpXTsKCSAgICAJCX0KCSAgICAJfQoJICAgIAkKCSAgICAJcHJpbnRmICgiTWVub3IgJWxmXG5cbiIsIG1lbm9yKTsKCSAgICAJCgkgICAgCQoJICAgIAlpZiAodGVzdGUgPj0gYWx0dXJhQ2FydGEpCgkgICAgCXsKCSAgICAJCWVuY2FpeGEgPSAxOwoJICAgIAl9CgkgICAgCWVsc2UKCSAgICAJewoJICAgIAkJZW5jYWl4YSA9IDA7CgkgICAgCX0KCSAgICAJKi8KCSAgICAJCgkgICAgCXByaW50ZiAoIkMoJWcsICVnKSBSYWlvICVnXG5cbiIsIGNlbnRyb0VudlgsIGNlbnRyb0VudlksIHJhaW9FbnYpOwoJICAgIAkKCSAgICAJLy8gRXF1YcOnw6NvIGRhIHJldGEKCSAgICAJCgkgICAgCWNvZWZBUmV0YSA9IDEgKiBiYXNlQ2FydGE7CgkgICAgCWNvZWZCUmV0YSA9IDEgKiBhbHR1cmFDYXJ0YTsKCSAgICAJY29lZkNSZXRhID0gLTEgKiBiYXNlQ2FydGEgKiBhbHR1cmFDYXJ0YTsKCSAgICAJCgkgICAgCXByaW50ZiAoIiVnWCAlZ1kgJWdcblxuIiwgY29lZkFSZXRhLCBjb2VmQlJldGEsIGNvZWZDUmV0YSk7CgkgICAgCQoJICAgIAkKCSAgICAJLy8gRXF1YcOnw6NvIGRhIHJldGE6IEIgZSBDIHBybyBzZWd1bmRvIG1lbWJybyBkZWl4YW5kbyBYIGVtIGV2aWTDqm5jaWEKCSAgICAJCgkgICAgCWNvZWZCTmVnUmV0YSA9IC0xICogY29lZkJSZXRhOwoJICAgIAljb2VmQ05lZ1JldGEgPSAtMSAqIGNvZWZDUmV0YTsKCSAgICAJCgkgICAgCS8vcHJpbnRmICgiWCA9ICVnWSAlZyAvICVnXG5cbiIsIGNvZWZCTmVnUmV0YSwgY29lZkNOZWdSZXRhLCBjb2VmQVJldGEpOwoJICAgIAkKCSAgICAJLy8gUmVkdcOnw7VlcyBkZSBleHByZXNzw7VlcyBwYXJhIEludGVyc2XDp8OjbyBkZSBSZXRhIGUgQ2lyY3VuZmVyw6puY2lhIGUgZWxhYm9yYcOnw6NvIGRlCgkgICAgCS8vIEVxdWHDp8OjbyBkbyBTZWd1bmRvIEdyYXUgZGUgWQoJICAgIAkKCSAgICAJY29lZkFSZXRhRTIgPSAxICogcG93KGNvZWZBUmV0YSwgMik7CgkgICAgCWNlbnRyb0VudlhBcnJ1bWFkbyA9IC0xICogMiAqIGNlbnRyb0Vudlg7CgkgICAgCWNlbnRyb0VudllBcnJ1bWFkbyA9IC0xICogMiAqIGNlbnRyb0Vudlk7CgkgICAgCWNvZWZCQ05lZ1JldGFKdW50byA9IDEgKiAyICogY29lZkJOZWdSZXRhICogY29lZkNOZWdSZXRhOwoJICAgIAljb25zdGFudGVDaXJjVG90YWwgPSAocG93KGNlbnRyb0VudlgsIDIpICsgcG93KGNlbnRyb0VudlksIDIpIC0gcG93KHJhaW9FbnYsIDIpKTsKCSAgICAJCgkgICAgCS8vIENvZWZpY2llbnRlcyBBLCBCIGUgQyBkYSBFcXVhw6fDo28gZG8gc2VndW5kbyBncmF1IGRlIFkKCSAgICAJCgkgICAgCUFFcXVhY2FvWUNpcmMgPSAocG93KGNvZWZCTmVnUmV0YSwgMikgKyBjb2VmQVJldGFFMik7CgkgICAgCUJFcXVhY2FvWUNpcmMgPSAoY29lZkJDTmVnUmV0YUp1bnRvICsgKGNvZWZCTmVnUmV0YSAqIGNlbnRyb0VudlhBcnJ1bWFkbyAqIGNvZWZBUmV0YSkgKyAoY2VudHJvRW52WUFycnVtYWRvICogY29lZkFSZXRhRTIpKTsKCSAgICAJQ0VxdWFjYW9ZQ2lyYyA9IChwb3coY29lZkNOZWdSZXRhLCAyKSArIChjb2VmQ05lZ1JldGEgKiBjZW50cm9FbnZYQXJydW1hZG8gKiBjb2VmQVJldGEpICsgKGNvbnN0YW50ZUNpcmNUb3RhbCAqIGNvZWZBUmV0YUUyKSk7CgkgICAgCQoJICAgIAkvL3ByaW50ZiAoIkVxdWFjYW8gWSA9ICVnWV4yICVnWSAlZyA9IDBcblxuIiwgQUVxdWFjYW9ZQ2lyYywgQkVxdWFjYW9ZQ2lyYywgQ0VxdWFjYW9ZQ2lyYyk7CgkgICAgCQoJICAgIAlkZWx0YUVxdWFjYW9ZID0gKChwb3coQkVxdWFjYW9ZQ2lyYywgMikpIC0gKDQgKiBBRXF1YWNhb1lDaXJjICogQ0VxdWFjYW9ZQ2lyYykpOwoJICAgIAkKCSAgICAJLy9wcmludGYgKCJEZWx0YSAlZ1xuXG4iLCBkZWx0YUVxdWFjYW9ZKTsKCSAgICAJCgkgICAgCWlmIChkZWx0YUVxdWFjYW9ZIDwgMCkKCSAgICAJewoJICAgIAkJZW5jYWl4YSA9IDA7CgkgICAgCX0KCSAgICAJZWxzZSBpZiAoZGVsdGFFcXVhY2FvWSA9PSAwKQoJICAgIAl7CgkgICAgCQkvLyBkaXN0YW5jaWEgPSByYWlvIGUgbm92byBjYWxjdWxvCgkgICAgCQkKCSAgICAJCWlmIChyYWlvRW52ID49IGFsdHVyYUNhcnRhKQoJICAgIAkJewoJICAgIAkJCWVuY2FpeGEgPSAxOwoJICAgIAkJfQoJICAgIAkJZWxzZQoJICAgIAkJewoJICAgIAkJCWVuY2FpeGEgPSAwOwoJICAgIAkJfQoJICAgIAl9CgkgICAgCWVsc2UKCSAgICAJewoJICAgIAkJLy8gZW50YW8gZGVsdGEgPiAwOyBkdWFzIHJhaXplcwoJICAgIAkJCgkgICAgCQl4MUVxdWFjYW9ZID0gKCgtMSAqIEJFcXVhY2FvWUNpcmMpICsgc3FydChkZWx0YUVxdWFjYW9ZKSkgLyAoMiAqIEFFcXVhY2FvWUNpcmMpOwoJICAgIAkJeDJFcXVhY2FvWSA9ICgoLTEgKiBCRXF1YWNhb1lDaXJjKSAtIHNxcnQoZGVsdGFFcXVhY2FvWSkpIC8gKDIgKiBBRXF1YWNhb1lDaXJjKTsKCSAgICAJCQoJICAgIAkJLy9wcmludGYgKCJ5MSA9ICVnIHkyICVnXG5cbiIsIHgxRXF1YWNhb1ksIHgyRXF1YWNhb1kpOwoJICAgIAkJCgkgICAgCQllcXVhY2FvUmV0YVgxID0gKCgoY29lZkJOZWdSZXRhICogeDFFcXVhY2FvWSkgKyBjb2VmQ05lZ1JldGEpIC8gY29lZkFSZXRhKTsKCSAgICAJCWVxdWFjYW9SZXRhWDIgPSAoKChjb2VmQk5lZ1JldGEgKiB4MkVxdWFjYW9ZKSArIGNvZWZDTmVnUmV0YSkgLyBjb2VmQVJldGEpOwoJICAgIAkJCQoJICAgIAkJLyoJaWYgKCh4MUVxdWFjYW9ZIDwgMCkgJiYgKHgyRXF1YWNhb1kgPCAwKSkKCSAgICAJCQl7CgkgICAgCQkJCWVuY2FpeGEgPSAwOwoJICAgIAkJCX0KCSAgICAJCQllbHNlIGlmICh4MUVxdWFjYW9ZIDwgMCkKCSAgICAJCQl7CgkgICAgCQkJCS8vIGNvbnNpZGVyYXIgeDIKCSAgICAJCQkJCgkgICAgCQkJCWVxdWFjYW9SZXRhWDEgPSAtMTsKCSAgICAJCQkJZXF1YWNhb1JldGFYMiA9ICgoKGNvZWZCTmVnUmV0YSAqIHgyRXF1YWNhb1kpICsgY29lZkNOZWdSZXRhKSAvIGNvZWZBUmV0YSk7CgkgICAgCQkJfQoJICAgIAkJCWVsc2UgaWYgKHgyRXF1YWNhb1kgPCAwKQoJICAgIAkJCXsKCSAgICAJCQkJLy8gY29uc2lkZXJhciB4MQoJICAgIAkJCQkKCSAgICAJCQkJZXF1YWNhb1JldGFYMSA9ICgoKGNvZWZCTmVnUmV0YSAqIHgxRXF1YWNhb1kpICsgY29lZkNOZWdSZXRhKSAvIGNvZWZBUmV0YSk7CgkgICAgCQkJCWVxdWFjYW9SZXRhWDIgPSAtMTsKCSAgICAJCQl9CgkgICAgCQkJZWxzZQoJICAgIAkJCXsKCSAgICAJCQkJLy8gY29uc2lkZXJhciB4MSBFIHgyCgkgICAgCQkJCQoJICAgIAkJCQllcXVhY2FvUmV0YVgxID0gKCgoY29lZkJOZWdSZXRhICogeDFFcXVhY2FvWSkgKyBjb2VmQ05lZ1JldGEpIC8gY29lZkFSZXRhKTsKCSAgICAJCQkJZXF1YWNhb1JldGFYMiA9ICgoKGNvZWZCTmVnUmV0YSAqIHgyRXF1YWNhb1kpICsgY29lZkNOZWdSZXRhKSAvIGNvZWZBUmV0YSk7CgkgICAgCQkJfQoJICAgIAkJKi8KCSAgICAJCQoJICAgIAkJLy9wcmludGYgKCJ4MSA9ICVnIHgyICVnXG5cbiIsIGVxdWFjYW9SZXRhWDEsIGVxdWFjYW9SZXRhWDIpOwoJICAgIAkJCgkgICAgCQkvL3ByaW50ZiAoIlBvbnRvWCAoJWc7ICVnKSAvIFBvbnRvWSAoJWc7ICVnKVxuXG4iLCBlcXVhY2FvUmV0YVgxLCB4MUVxdWFjYW9ZLCBlcXVhY2FvUmV0YVgyLCB4MkVxdWFjYW9ZKTsKCSAgICAJCQoJICAgIAkJCgkgICAgCQkvKglpZiAoZXF1YWNhb1JldGFYMSA9PSAtMSkKCSAgICAJCQl7CgkgICAgCQkJCS8vIGEgc2VndW5kYQoJICAgIAkJCQkKCSAgICAJCQkJZGlzdGFuY2lhQ2VudHJvUmV0YVgyID0gc3FydChwb3coKGVxdWFjYW9SZXRhWDIgLSBjZW50cm9FbnZYKSwgMikgKyBwb3coKHgyRXF1YWNhb1kgLSBjZW50cm9FbnZZKSwgMikpOwoJICAgIAkJCQlkaXN0YW5jaWFDZW50cm9SZXRhWDEgPSAtMTsKCSAgICAJCQl9CgkgICAgCQkJZWxzZSBpZiAoZXF1YWNhb1JldGFYMiA9PSAtMSkKCQkJIAkJewoJCSAgICAJCQkvLyBhIHByaW1laXJhCgkJICAgIAkJCQoJCSAgICAJCQlkaXN0YW5jaWFDZW50cm9SZXRhWDEgPSBzcXJ0KHBvdygoZXF1YWNhb1JldGFYMSAtIGNlbnRyb0VudlgpLCAyKSArIHBvdygoeDFFcXVhY2FvWSAtIGNlbnRyb0VudlkpLCAyKSk7CgkJICAgIAkJCWRpc3RhbmNpYUNlbnRyb1JldGFYMiA9IC0xOwoJICAgIAkJCX0KCSAgICAJCQllbHNlCgkgICAgCQkJewoJICAgIAkJCQlkaXN0YW5jaWFDZW50cm9SZXRhWDEgPSBzcXJ0KHBvdygoZXF1YWNhb1JldGFYMSAtIGNlbnRyb0VudlgpLCAyKSArIHBvdygoeDFFcXVhY2FvWSAtIGNlbnRyb0VudlkpLCAyKSk7CgkgICAgCQkJCWRpc3RhbmNpYUNlbnRyb1JldGFYMiA9IHNxcnQocG93KChlcXVhY2FvUmV0YVgyIC0gY2VudHJvRW52WCksIDIpICsgcG93KCh4MkVxdWFjYW9ZIC0gY2VudHJvRW52WSksIDIpKTsKCSAgICAJCQl9CgkgICAgCQkqLwoJICAgIAkJCgkgICAgCQlkaXN0YW5jaWFDZW50cm9SZXRhWDEgPSBzcXJ0KHBvdygoZXF1YWNhb1JldGFYMSAtIGNlbnRyb0VudlgpLCAyKSArIHBvdygoeDFFcXVhY2FvWSAtIGNlbnRyb0VudlkpLCAyKSk7CgkgICAgCQlkaXN0YW5jaWFDZW50cm9SZXRhWDIgPSBzcXJ0KHBvdygoZXF1YWNhb1JldGFYMiAtIGNlbnRyb0VudlgpLCAyKSArIHBvdygoeDJFcXVhY2FvWSAtIGNlbnRyb0VudlkpLCAyKSk7CgkgICAgCQkKCSAgICAJCS8vcHJpbnRmICgiZGlzdHgxID0gJWcgZGlzdHgyICVnXG5cbiIsIGRpc3RhbmNpYUNlbnRyb1JldGFYMSwgZGlzdGFuY2lhQ2VudHJvUmV0YVgyKTsKCSAgICAJCQoJICAgIAkJaWYgKGRpc3RhbmNpYUNlbnRyb1JldGFYMSA8PSBkaXN0YW5jaWFDZW50cm9SZXRhWDIpCgkgICAgCQl7CgkgICAgCQkJaWYgKGRpc3RhbmNpYUNlbnRyb1JldGFYMSA+PSBhbHR1cmFDYXJ0YSkKCSAgICAJCQl7CgkgICAgCQkJCWVuY2FpeGEgPSAxOwoJICAgIAkJCX0KCSAgICAJCQllbHNlCgkgICAgCQkJewoJICAgIAkJCQllbmNhaXhhID0gMDsKCSAgICAJCQl9CgkgICAgCQl9CgkgICAgCQllbHNlCgkgICAgCQl7CgkgICAgCQkJaWYgKGRpc3RhbmNpYUNlbnRyb1JldGFYMiA+PSBhbHR1cmFDYXJ0YSkKCSAgICAJCQl7CgkgICAgCQkJCWVuY2FpeGEgPSAxOwoJICAgIAkJCX0KCSAgICAJCQllbHNlCgkgICAgCQkJewoJICAgIAkJCQllbmNhaXhhID0gMDsKCSAgICAJCQl9CgkgICAgCQl9CgkgICAgCQkJCQoJICAgIAkJLyoJaWYgKGRpc3RhbmNpYUNlbnRyb1JldGFYMSA9PSAtMSkKCSAgICAJCQl7CgkgICAgCQkJCS8vIGEgc2VndW5kYQoJICAgIAkJCQkKCSAgICAJCQkJaWYgKGRpc3RhbmNpYUNlbnRyb1JldGFYMiA+PSBhbHR1cmFDYXJ0YSkKCSAgICAJCQkJewoJICAgIAkJCQkJZW5jYWl4YSA9IDE7CgkgICAgCQkJCX0KCSAgICAJCQkJZWxzZQoJICAgIAkJCQl7CgkgICAgCQkJCQllbmNhaXhhID0gMDsKCSAgICAJCQkJfQoJICAgIAkJCX0KCSAgICAJCQllbHNlIGlmIChkaXN0YW5jaWFDZW50cm9SZXRhWDIgPT0gLTEpCgkgICAgCQkJewoJICAgIAkJCQkvLyBhIHByaW1laXJhCgkgICAgCQkJCQoJICAgIAkJCQlpZiAoZGlzdGFuY2lhQ2VudHJvUmV0YVgxID49IGFsdHVyYUNhcnRhKQoJICAgIAkJCQl7CgkgICAgCQkJCQllbmNhaXhhID0gMTsKCSAgICAJCQkJfQoJICAgIAkJCQllbHNlCgkgICAgCQkJCXsKCSAgICAJCQkJCWVuY2FpeGEgPSAwOwoJICAgIAkJCQl9CgkgICAgCQkJfQoJICAgIAkJCWVsc2UKCSAgICAJCQl7CgkgICAgCQkJCS8vIHBvbnRvIG1haXMgcGVydG8gZG8gY2VudHJvCgkgICAgCQkJCQoJICAgIAkJCQlpZiAoZGlzdGFuY2lhQ2VudHJvUmV0YVgxIDw9IGRpc3RhbmNpYUNlbnRyb1JldGFYMikKCSAgICAJCQkJewoJICAgIAkJCQkJaWYgKGRpc3RhbmNpYUNlbnRyb1JldGFYMSA+PSBhbHR1cmFDYXJ0YSkKCSAgICAJCQkJCXsKCSAgICAJCQkJCQllbmNhaXhhID0gMTsKCSAgICAJCQkJCX0KCSAgICAJCQkJCWVsc2UKCSAgICAJCQkJCXsKCSAgICAJCQkJCQllbmNhaXhhID0gMDsKCSAgICAJCQkJCX0KCSAgICAJCQkJfQoJICAgIAkJCQllbHNlCgkgICAgCQkJCXsKCSAgICAJCQkJCWlmIChkaXN0YW5jaWFDZW50cm9SZXRhWDIgPj0gYWx0dXJhQ2FydGEpCgkgICAgCQkJCQl7CgkgICAgCQkJCQkJZW5jYWl4YSA9IDE7CgkgICAgCQkJCQl9CgkgICAgCQkJCQllbHNlCgkgICAgCQkJCQl7CgkgICAgCQkJCQkJZW5jYWl4YSA9IDA7CgkgICAgCQkJCQl9CgkgICAgCQkJCX0KCSAgICAJCQl9CgkgICAgCQkqLwoJICAgIAl9CgkgICAgfQoJfQoJCglpZiAoZW5jYWl4YSkKCXsKCQlwcmludGYgKCJ5ZXNcbiIpOwoJfQoJZWxzZQoJewoJCXByaW50ZiAoIm5vXG4iKTsKCX0KCQoJcmV0dXJuIDA7Cn0=