#include <stdlib.h>
#include <stdio.h>
#include <string.h>
typedef struct no{
int pontuacao, id;
struct no *dir, *esq, *pai;
}No;
No *cria_no(int nova_pontuacao, int ID){
No
*novo
= malloc(sizeof(No
)); novo->pontuacao = nova_pontuacao;
novo->dir = novo->esq = NULL;
novo->id = ID;
novo->pai = NULL;
return novo;
}
No *insere_no(No *raiz, int nova_pontuacao, int ID){
No *pai_aux = NULL;
No *aux = NULL;
No *nova = cria_no(nova_pontuacao, ID);
if (raiz == NULL)
raiz = nova;
else
{
aux = raiz;
while (aux != NULL)
{
pai_aux = aux;
if (nova_pontuacao < aux->pontuacao)
aux = aux->esq;
else
aux = aux->dir;
}
nova->pai = pai_aux;
if (nova_pontuacao < pai_aux->pontuacao)
pai_aux->esq = nova;
else
pai_aux->dir = nova;
}
return raiz;
}
void em_ordem(No *raiz)
{
if (raiz != NULL)
{
em_ordem(raiz->esq);
printf("%d ", raiz
->pontuacao
); em_ordem(raiz->dir);
}
}
void pre_ordem(No *raiz)
{
if (raiz != NULL)
{
printf("%d ", raiz
->pontuacao
); pre_ordem(raiz->esq);
pre_ordem(raiz->dir);
}
}
No* sucessor(No *no_remover)
{
// por sucessor
No *suc = no_remover->dir;
while (suc->esq != NULL)
{
suc = suc->esq;
}
return suc;
}
No* antecessor(No *no_remover)
{
// por sucessor
No *ant = no_remover->esq;
while (ant->dir != NULL)
{
ant = ant->dir;
}
return ant;
}
No *remove_noavl(No *raiz, int chave)
{
No *no_remover = raiz;
No *pai_no_remover = NULL;
No *copia = NULL;
while (no_remover != NULL && no_remover->pontuacao != chave)
{
if (no_remover->pontuacao < chave)
no_remover = no_remover->dir;
else
no_remover = no_remover->esq;
}
while (no_remover != NULL) // encontrou o valor a ser removido
{
if (no_remover->esq == NULL && no_remover->dir == NULL)//eh folha
{
if (raiz == no_remover)
{
no_remover = raiz = NULL;
}
else
{
if (no_remover->pai->esq != NULL && no_remover->pai->esq->pontuacao == chave)
no_remover->pai->esq = NULL;
else
no_remover->pai->dir = NULL;
no_remover = NULL;
}
}
else // tem um filho ou dois filhos
{
if (no_remover->dir != NULL)
copia = sucessor(no_remover);
else
copia = antecessor(no_remover);
//substitui o valor da ser removido pelo valor
//do sucessor ou do antecessor
no_remover->pontuacao = copia->pontuacao;
no_remover->id = copia->id;
//muda o no a ser removido para o sucessor ou antecessor
no_remover = copia;
chave = copia->pontuacao;
}
}
return raiz;
}
No* registrar(No *raiz){
int pontuacao;
int id;
return insere_no(raiz, pontuacao, id);
}
int verifica_existencia(No*raiz, int id, int *pontuacao_velha, int*flag){
if(raiz != NULL && (*flag) != 1){
verifica_existencia(raiz->dir, id, pontuacao_velha, flag);
if(raiz->id == id){
(*flag) = 1;
(*pontuacao_velha) = raiz->pontuacao;
}
verifica_existencia(raiz->esq, id, pontuacao_velha, flag);
}
}
No* UPDATE(No *raiz){
int pontuacao_nova, pontuacao_velha, id, flag = 0;
scanf("%d", &pontuacao_nova
);
if(raiz != NULL){
verifica_existencia(raiz, id, &pontuacao_velha, &flag);
if(flag == 1){
raiz = remove_noavl(raiz, pontuacao_velha);
raiz = insere_no(raiz, pontuacao_nova, id);
}
}
return raiz;
}
int ID_MAX(No *raiz){
No* aux = raiz;
while(aux->esq != NULL)
aux = aux->esq;
return aux->id;
}
void posicao_calc(No *raiz, int id, int *CAT, int *flag){
if(raiz != NULL && (*flag) != 1){
posicao_calc(raiz->dir, id, CAT, flag);
if(raiz->id == id){
(*flag) = 1;
(*CAT)++;
}
else if((*flag) != 1){
(*CAT)++;
}
posicao_calc(raiz->esq, id, CAT, flag);
}
}
void posicao(No *raiz){
int id = 0;
if(raiz != NULL){
int rez_01, rez_02, aux_id, pos;
rez_01 = rez_02 = aux_id = pos = 0;
aux_id = ID_MAX(raiz);
posicao_calc(raiz, id, &rez_01, &pos);
pos = 0;
posicao_calc(raiz, aux_id, &rez_02, &pos);
if(rez_01>rez_02)
else
}
}
void top(No *raiz){
if(raiz != NULL){
No* aux = raiz;
while(aux->dir != NULL)
aux = aux->dir;
}
else{
}
}
void BOTTOM(No *raiz){
if(raiz != NULL){
No* aux = raiz;
while(aux->esq != NULL)
aux = aux->esq;
}
else{
}
}
void RANGE_CALC(No *raiz, int pont_min, int pont_max){
if(raiz != NULL){
RANGE_CALC(raiz->dir, pont_min, pont_max);
if(pont_min <= raiz->pontuacao && raiz->pontuacao <= pont_max){
}
RANGE_CALC(raiz->esq, pont_min, pont_max);
}
}
void RANGE(No *raiz){
int min;
int max;
min = max = 0;
scanf("%d %d", &min
, &max
); if(raiz != NULL){
RANGE_CALC(raiz, min, max);
}
else
}
void COUNT_ABOVE(No *raiz, int ac, int* cont_0x){
if (raiz != NULL)
{
COUNT_ABOVE(raiz->dir, ac, cont_0x);
if(raiz->pontuacao > ac)
(*cont_0x)++;
COUNT_ABOVE(raiz->esq, ac, cont_0x);
}
}
void COUNT_BELOW(No *raiz, int ac, int* cont_0x){
if (raiz != NULL)
{
COUNT_BELOW(raiz->dir, ac, cont_0x);
if(raiz->pontuacao < ac)
(*cont_0x)++;
COUNT_BELOW(raiz->esq, ac, cont_0x);
}
}
int main(){
No *ABB = NULL;
int n, cont = 0;
int ac = 0;
int cont_02 = 0;
char rep[20];
while(cont < n){
if(strcmp(rep
, "REGISTER") == 0) ABB = registrar(ABB);
else if(strcmp(rep
, "UPDATE") == 0) ABB = UPDATE(ABB);
else if(strcmp(rep
, "POSITION") == 0) posicao(ABB);
else if(strcmp(rep
, "RANGE") == 0) RANGE(ABB);
else if(strcmp(rep
, "TOP") == 0) top(ABB);
else if(strcmp(rep
, "BOTTOM") == 0) BOTTOM(ABB);
else if(strcmp(rep
, "COUNT_ABOVE") == 0){ ac = cont_02 = 0;
COUNT_ABOVE(ABB, ac, &cont_02);
}
else if(strcmp(rep
, "COUNT_BELOW") == 0){ ac = cont_02 = 0;
COUNT_BELOW(ABB, ac, &cont_02);
}
cont++;
}
return 0;}
I2luY2x1ZGUgPHN0ZGxpYi5oPgojaW5jbHVkZSA8c3RkaW8uaD4KI2luY2x1ZGUgPHN0cmluZy5oPgoKdHlwZWRlZiBzdHJ1Y3Qgbm97CiAgICBpbnQgcG9udHVhY2FvLCBpZDsKICAgIHN0cnVjdCBubyAqZGlyLCAqZXNxLCAqcGFpOwp9Tm87CgpObyAqY3JpYV9ubyhpbnQgbm92YV9wb250dWFjYW8sIGludCBJRCl7CiAgICBObyAqbm92byA9IG1hbGxvYyhzaXplb2YoTm8pKTsKICAgIG5vdm8tPnBvbnR1YWNhbyA9IG5vdmFfcG9udHVhY2FvOwogICAgbm92by0+ZGlyID0gbm92by0+ZXNxID0gTlVMTDsKICAgIG5vdm8tPmlkID0gSUQ7CiAgICBub3ZvLT5wYWkgPSBOVUxMOwogICAgcmV0dXJuIG5vdm87Cn0KCk5vICppbnNlcmVfbm8oTm8gKnJhaXosIGludCBub3ZhX3BvbnR1YWNhbywgaW50IElEKXsKICAgIE5vICpwYWlfYXV4ID0gTlVMTDsKICAgIE5vICphdXggPSBOVUxMOwogICAgTm8gKm5vdmEgPSBjcmlhX25vKG5vdmFfcG9udHVhY2FvLCBJRCk7CiAgICBpZiAocmFpeiA9PSBOVUxMKQogICAgICAgIHJhaXogPSBub3ZhOwogICAgZWxzZQogICAgewogICAgICAgIGF1eCA9IHJhaXo7CiAgICAgICAgd2hpbGUgKGF1eCAhPSBOVUxMKQogICAgICAgIHsKICAgICAgICAgICAgcGFpX2F1eCA9IGF1eDsKICAgICAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvIDwgYXV4LT5wb250dWFjYW8pCiAgICAgICAgICAgICAgICBhdXggPSBhdXgtPmVzcTsKICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgYXV4ID0gYXV4LT5kaXI7CiAgICAgICAgfQogICAgICAgIG5vdmEtPnBhaSA9IHBhaV9hdXg7CiAgICAgICAgaWYgKG5vdmFfcG9udHVhY2FvIDwgcGFpX2F1eC0+cG9udHVhY2FvKQogICAgICAgICAgICBwYWlfYXV4LT5lc3EgPSBub3ZhOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcGFpX2F1eC0+ZGlyID0gbm92YTsKICAgIH0KICAgIHJldHVybiByYWl6Owp9Cgp2b2lkIGVtX29yZGVtKE5vICpyYWl6KQp7CiAgICBpZiAocmFpeiAhPSBOVUxMKQogICAgewogICAgICAgIGVtX29yZGVtKHJhaXotPmVzcSk7CiAgICAgICAgcHJpbnRmKCIlZCAiLCByYWl6LT5wb250dWFjYW8pOwogICAgICAgIGVtX29yZGVtKHJhaXotPmRpcik7CiAgICB9Cn0KCnZvaWQgcHJlX29yZGVtKE5vICpyYWl6KQp7CiAgICBpZiAocmFpeiAhPSBOVUxMKQogICAgewogICAgICAgIHByaW50ZigiJWQgIiwgcmFpei0+cG9udHVhY2FvKTsKICAgICAgICBwcmVfb3JkZW0ocmFpei0+ZXNxKTsKICAgICAgICBwcmVfb3JkZW0ocmFpei0+ZGlyKTsKICAgIH0KfQoKTm8qIHN1Y2Vzc29yKE5vICpub19yZW1vdmVyKQp7CgogICAgLy8gcG9yIHN1Y2Vzc29yCiAgICBObyAqc3VjID0gbm9fcmVtb3Zlci0+ZGlyOwoKICAgIHdoaWxlIChzdWMtPmVzcSAhPSBOVUxMKQogICAgewogICAgICAgIHN1YyA9IHN1Yy0+ZXNxOwogICAgfQoKICAgIHJldHVybiBzdWM7Cn0KCk5vKiBhbnRlY2Vzc29yKE5vICpub19yZW1vdmVyKQp7CgogICAgLy8gcG9yIHN1Y2Vzc29yCiAgICBObyAqYW50ID0gbm9fcmVtb3Zlci0+ZXNxOwoKICAgIHdoaWxlIChhbnQtPmRpciAhPSBOVUxMKQogICAgewogICAgICAgIGFudCA9IGFudC0+ZGlyOwogICAgfQoKICAgIHJldHVybiBhbnQ7Cn0KCk5vICpyZW1vdmVfbm9hdmwoTm8gKnJhaXosIGludCBjaGF2ZSkKewoKICAgIE5vICpub19yZW1vdmVyID0gcmFpejsKICAgIE5vICpwYWlfbm9fcmVtb3ZlciA9IE5VTEw7CiAgICBObyAqY29waWEgPSBOVUxMOwoKICAgIHdoaWxlIChub19yZW1vdmVyICE9IE5VTEwgJiYgbm9fcmVtb3Zlci0+cG9udHVhY2FvICE9IGNoYXZlKQogICAgewogICAgICAgIGlmIChub19yZW1vdmVyLT5wb250dWFjYW8gPCBjaGF2ZSkKICAgICAgICAgICAgbm9fcmVtb3ZlciA9IG5vX3JlbW92ZXItPmRpcjsKICAgICAgICBlbHNlCiAgICAgICAgICAgIG5vX3JlbW92ZXIgPSBub19yZW1vdmVyLT5lc3E7CiAgICB9CgogICAgd2hpbGUgKG5vX3JlbW92ZXIgIT0gTlVMTCkgLy8gZW5jb250cm91IG8gdmFsb3IgYSBzZXIgcmVtb3ZpZG8KICAgIHsKICAgICAgICBpZiAobm9fcmVtb3Zlci0+ZXNxID09IE5VTEwgJiYgbm9fcmVtb3Zlci0+ZGlyID09IE5VTEwpLy9laCBmb2xoYQogICAgICAgIHsKICAgICAgICAgICAgaWYgKHJhaXogPT0gbm9fcmVtb3ZlcikKICAgICAgICAgICAgewogICAgICAgICAgICAgICAgZnJlZShyYWl6KTsKICAgICAgICAgICAgICAgIG5vX3JlbW92ZXIgPSByYWl6ID0gTlVMTDsKICAgICAgICAgICAgfQogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGlmIChub19yZW1vdmVyLT5wYWktPmVzcSAhPSBOVUxMICYmIG5vX3JlbW92ZXItPnBhaS0+ZXNxLT5wb250dWFjYW8gPT0gY2hhdmUpCiAgICAgICAgICAgICAgICAgICAgbm9fcmVtb3Zlci0+cGFpLT5lc3EgPSBOVUxMOwogICAgICAgICAgICAgICAgZWxzZQogICAgICAgICAgICAgICAgICAgIG5vX3JlbW92ZXItPnBhaS0+ZGlyID0gTlVMTDsKCiAgICAgICAgICAgICAgICBmcmVlKG5vX3JlbW92ZXIpOwogICAgICAgICAgICAgICAgbm9fcmVtb3ZlciA9IE5VTEw7CiAgICAgICAgICAgIH0KICAgICAgICB9CiAgICAgICAgZWxzZSAvLyB0ZW0gdW0gZmlsaG8gb3UgZG9pcyBmaWxob3MKICAgICAgICB7CgogICAgICAgICAgICBpZiAobm9fcmVtb3Zlci0+ZGlyICE9IE5VTEwpCiAgICAgICAgICAgICAgICBjb3BpYSA9IHN1Y2Vzc29yKG5vX3JlbW92ZXIpOwogICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICBjb3BpYSA9IGFudGVjZXNzb3Iobm9fcmVtb3Zlcik7CgogICAgICAgICAgICAgICAgLy9zdWJzdGl0dWkgbyB2YWxvciBkYSBzZXIgcmVtb3ZpZG8gcGVsbyB2YWxvcgogICAgICAgICAgICAgICAgLy9kbyBzdWNlc3NvciBvdSBkbyBhbnRlY2Vzc29yCiAgICAgICAgICAgIG5vX3JlbW92ZXItPnBvbnR1YWNhbyA9IGNvcGlhLT5wb250dWFjYW87CiAgICAgICAgICAgIG5vX3JlbW92ZXItPmlkID0gY29waWEtPmlkOwogICAgICAgICAgICAvL211ZGEgbyBubyBhIHNlciByZW1vdmlkbyBwYXJhIG8gc3VjZXNzb3Igb3UgYW50ZWNlc3NvcgogICAgICAgICAgICBub19yZW1vdmVyID0gY29waWE7CiAgICAgICAgICAgIGNoYXZlID0gY29waWEtPnBvbnR1YWNhbzsKICAgICAgICB9CiAgICAgICAgCiAgICB9CiAgICByZXR1cm4gcmFpejsKfQoKTm8qIHJlZ2lzdHJhcihObyAqcmFpeil7CiAgICBpbnQgcG9udHVhY2FvOwogICAgaW50IGlkOwogICAgc2NhbmYoIiVkIiwgJmlkKTsKICAgIHNjYW5mKCIlZCIsICZwb250dWFjYW8pOwogICAgcmV0dXJuIGluc2VyZV9ubyhyYWl6LCBwb250dWFjYW8sIGlkKTsKfQoKaW50IHZlcmlmaWNhX2V4aXN0ZW5jaWEoTm8qcmFpeiwgaW50IGlkLCBpbnQgKnBvbnR1YWNhb192ZWxoYSwgaW50KmZsYWcpewogICAgaWYocmFpeiAhPSBOVUxMICYmICgqZmxhZykgIT0gMSl7CiAgICAgICAgdmVyaWZpY2FfZXhpc3RlbmNpYShyYWl6LT5kaXIsIGlkLCBwb250dWFjYW9fdmVsaGEsIGZsYWcpOwogICAgICAgIGlmKHJhaXotPmlkID09IGlkKXsKICAgICAgICAgICAgKCpmbGFnKSA9IDE7CiAgICAgICAgICAgICgqcG9udHVhY2FvX3ZlbGhhKSA9IHJhaXotPnBvbnR1YWNhbzsKICAgICAgICB9CiAgICAgICAgdmVyaWZpY2FfZXhpc3RlbmNpYShyYWl6LT5lc3EsIGlkLCBwb250dWFjYW9fdmVsaGEsIGZsYWcpOwogICAgfQp9CgpObyogVVBEQVRFKE5vICpyYWl6KXsKICAgIGludCBwb250dWFjYW9fbm92YSwgcG9udHVhY2FvX3ZlbGhhLCBpZCwgZmxhZyA9IDA7CgogICAgc2NhbmYoIiVkIiwgJmlkKTsKICAgIHNjYW5mKCIlZCIsICZwb250dWFjYW9fbm92YSk7CiAgICAKICAgIGlmKHJhaXogIT0gTlVMTCl7CiAgICAgICAgdmVyaWZpY2FfZXhpc3RlbmNpYShyYWl6LCBpZCwgJnBvbnR1YWNhb192ZWxoYSwgJmZsYWcpOwoKICAgICAgICBpZihmbGFnID09IDEpewogICAgICAgICAgICByYWl6ID0gcmVtb3ZlX25vYXZsKHJhaXosIHBvbnR1YWNhb192ZWxoYSk7CiAgICAgICAgICAgIHJhaXogPSBpbnNlcmVfbm8ocmFpeiwgcG9udHVhY2FvX25vdmEsIGlkKTsKICAgICAgICB9CiAgICB9CiAgICByZXR1cm4gcmFpejsKfQoKaW50IElEX01BWChObyAqcmFpeil7CiAgICBObyogYXV4ID0gcmFpejsKICAgIHdoaWxlKGF1eC0+ZXNxICE9IE5VTEwpCiAgICAgICAgYXV4ID0gYXV4LT5lc3E7CiAgICByZXR1cm4gYXV4LT5pZDsKfQoKdm9pZCBwb3NpY2FvX2NhbGMoTm8gKnJhaXosIGludCBpZCwgaW50ICpDQVQsIGludCAqZmxhZyl7CiAgICBpZihyYWl6ICE9IE5VTEwgJiYgKCpmbGFnKSAhPSAxKXsKICAgICAgICBwb3NpY2FvX2NhbGMocmFpei0+ZGlyLCBpZCwgQ0FULCBmbGFnKTsKICAgICAgICBpZihyYWl6LT5pZCA9PSBpZCl7CiAgICAgICAgICAgICgqZmxhZykgPSAxOwogICAgICAgICAgICAoKkNBVCkrKzsKICAgICAgICB9CiAgICAgICAgZWxzZSBpZigoKmZsYWcpICE9IDEpewogICAgICAgICAgICAoKkNBVCkrKzsKICAgICAgICB9CiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXotPmVzcSwgaWQsIENBVCwgZmxhZyk7CiAgICB9Cn0KCnZvaWQgcG9zaWNhbyhObyAqcmFpeil7CiAgICBpbnQgaWQgPSAwOwogICAgc2NhbmYoIiVkIiwgJmlkKTsKICAgIAogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBpbnQgcmV6XzAxLCByZXpfMDIsIGF1eF9pZCwgcG9zOwogICAgICAgIHJlel8wMSA9IHJlel8wMiA9IGF1eF9pZCA9IHBvcyA9IDA7CgogICAgICAgIGF1eF9pZCA9IElEX01BWChyYWl6KTsKCiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXosIGlkLCAmcmV6XzAxLCAmcG9zKTsKCiAgICAgICAgcG9zID0gMDsKCiAgICAgICAgcG9zaWNhb19jYWxjKHJhaXosIGF1eF9pZCwgJnJlel8wMiwgJnBvcyk7CgogICAgICAgIGlmKHJlel8wMT5yZXpfMDIpCiAgICAgICAgICAgIHByaW50ZigiRU1QVFlcbiIpOwogICAgICAgIGVsc2UKICAgICAgICAgICAgcHJpbnRmKCIlZFxuIiwgcmV6XzAxKTsKICAgIH0KICAgIAp9Cgp2b2lkIHRvcChObyAqcmFpeil7CiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIE5vKiBhdXggPSByYWl6OwogICAgICAgIHdoaWxlKGF1eC0+ZGlyICE9IE5VTEwpCiAgICAgICAgICAgIGF1eCA9IGF1eC0+ZGlyOwogICAgICAgIHByaW50ZigiJWRcbiIsIGF1eC0+aWQpOwogICAgfQogICAgZWxzZXsKICAgICAgICBwcmludGYoIkVNUFRZXG4iKTsKICAgIH0KfQoKdm9pZCBCT1RUT00oTm8gKnJhaXopewogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBObyogYXV4ID0gcmFpejsKICAgICAgICB3aGlsZShhdXgtPmVzcSAhPSBOVUxMKQogICAgICAgICAgICBhdXggPSBhdXgtPmVzcTsKICAgICAgICBwcmludGYoIiVkXG4iLCBhdXgtPmlkKTsKICAgIH0KICAgIGVsc2V7CiAgICAgICAgcHJpbnRmKCJFTVBUWVxuIik7CiAgICB9CiAgICAKfQoKdm9pZCBSQU5HRV9DQUxDKE5vICpyYWl6LCBpbnQgcG9udF9taW4sIGludCBwb250X21heCl7CiAgICBpZihyYWl6ICE9IE5VTEwpewogICAgICAgIFJBTkdFX0NBTEMocmFpei0+ZGlyLCBwb250X21pbiwgcG9udF9tYXgpOwogICAgICAgIGlmKHBvbnRfbWluIDw9IHJhaXotPnBvbnR1YWNhbyAmJiByYWl6LT5wb250dWFjYW8gPD0gcG9udF9tYXgpewogICAgICAgICAgICBwcmludGYoIiVkICIsIHJhaXotPmlkKTsKICAgICAgICB9CiAgICAgICAgUkFOR0VfQ0FMQyhyYWl6LT5lc3EsIHBvbnRfbWluLCBwb250X21heCk7CiAgICB9Cn0KCnZvaWQgUkFOR0UoTm8gKnJhaXopewogICAgaW50IG1pbjsKICAgIGludCBtYXg7CiAgICBtaW4gPSBtYXggPSAwOwoKICAgIHNjYW5mKCIlZCAlZCIsICZtaW4sICZtYXgpOwogICAgaWYocmFpeiAhPSBOVUxMKXsKICAgICAgICBSQU5HRV9DQUxDKHJhaXosIG1pbiwgbWF4KTsKICAgICAgICBwcmludGYoIlxuIik7CiAgICB9CiAgICBlbHNlCiAgICAgICAgcHJpbnRmKCJFTVBUWVxuIik7Cn0KCnZvaWQgQ09VTlRfQUJPVkUoTm8gKnJhaXosIGludCBhYywgaW50KiBjb250XzB4KXsKICAgIGlmIChyYWl6ICE9IE5VTEwpCiAgICB7CiAgICAgICAgQ09VTlRfQUJPVkUocmFpei0+ZGlyLCBhYywgY29udF8weCk7CiAgICAgICAgaWYocmFpei0+cG9udHVhY2FvID4gYWMpCiAgICAgICAgICAgICgqY29udF8weCkrKzsKICAgICAgICBDT1VOVF9BQk9WRShyYWl6LT5lc3EsIGFjLCBjb250XzB4KTsKICAgIH0KfQoKdm9pZCBDT1VOVF9CRUxPVyhObyAqcmFpeiwgaW50IGFjLCBpbnQqIGNvbnRfMHgpewogICAgaWYgKHJhaXogIT0gTlVMTCkKICAgIHsKICAgICAgICBDT1VOVF9CRUxPVyhyYWl6LT5kaXIsIGFjLCBjb250XzB4KTsKICAgICAgICBpZihyYWl6LT5wb250dWFjYW8gPCBhYykKICAgICAgICAgICAgKCpjb250XzB4KSsrOwogICAgICAgIENPVU5UX0JFTE9XKHJhaXotPmVzcSwgYWMsIGNvbnRfMHgpOwogICAgfQp9CgppbnQgbWFpbigpewoKTm8gKkFCQiA9IE5VTEw7CmludCBuLCBjb250ID0gMDsKaW50IGFjID0gMDsKaW50IGNvbnRfMDIgPSAwOwpjaGFyIHJlcFsyMF07CgpzY2FuZigiJWQiLCAmbik7Cgp3aGlsZShjb250IDwgbil7CiAgICBzdHJjcHkocmVwLCIgIik7CiAgICBmZmx1c2goc3RkaW4pOwogICAgc2NhbmYoIiVzIiwgJnJlcCk7CgogICAgaWYoc3RyY21wKHJlcCwgIlJFR0lTVEVSIikgPT0gMCkKICAgICAgICBBQkIgPSByZWdpc3RyYXIoQUJCKTsgCiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJVUERBVEUiKSA9PSAwKQogICAgICAgIEFCQiA9IFVQREFURShBQkIpOyAgICAKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlBPU0lUSU9OIikgPT0gMCkKICAgICAgICBwb3NpY2FvKEFCQik7CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJSQU5HRSIpID09IDApCiAgICAgICAgUkFOR0UoQUJCKTsKICAgIGVsc2UgaWYoc3RyY21wKHJlcCwgIlRPUCIpID09IDApCiAgICAgICAgdG9wKEFCQik7CiAgICBlbHNlIGlmKHN0cmNtcChyZXAsICJCT1RUT00iKSA9PSAwKQogICAgICAgIEJPVFRPTShBQkIpOwogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiQ09VTlRfQUJPVkUiKSA9PSAwKXsKICAgICAgICBhYyA9IGNvbnRfMDIgPSAwOwogICAgICAgIHNjYW5mKCIlZCIsICZhYyk7CiAgICAgICAgQ09VTlRfQUJPVkUoQUJCLCBhYywgJmNvbnRfMDIpOwogICAgICAgIHByaW50ZigiJWRcbiIsIGNvbnRfMDIpOwogICAgfQogICAgZWxzZSBpZihzdHJjbXAocmVwLCAiQ09VTlRfQkVMT1ciKSA9PSAwKXsKICAgICAgICBhYyA9IGNvbnRfMDIgPSAwOwogICAgICAgIHNjYW5mKCIlZCIsICZhYyk7CiAgICAgICAgQ09VTlRfQkVMT1coQUJCLCBhYywgJmNvbnRfMDIpOwogICAgICAgIHByaW50ZigiJWRcbiIsIGNvbnRfMDIpOwogICAgfQogICAgY29udCsrOwp9CgpyZXR1cm4gMDt9