#include <stdio.h>
#include <string.h>
#include <ctype.h>
#include <assert.h>
int conta(char c, char *s){
int num_vezes=0;
while(*s!='\0'){
if(*s== '\t'){
num_vezes++;
}
s++;
}
return num_vezes;
}
int ordenar(int vetorDeNumeros[], int tamanhoVetor){
int i;
int j;
int temp;
for(i=0;i<tamanhoVetor;i++){
for(j=0;j<tamanhoVetor;j++){
if(vetorDeNumeros[i] < vetorDeNumeros[j]){
temp = vetorDeNumeros[i];
vetorDeNumeros[i] = vetorDeNumeros[j];
vetorDeNumeros[j] = temp;
}
}
}
return vetorDeNumeros[0];
}
void clean(char * s){
int i=0;
while(s[i]!='\0'){
if(s[i]=='\n'){
s[i]='\0';
}
i++;
}
}
void RemoveSpaces(char* source)
{
char* i = source;
char* j = source;
while(*j != 0)
{
*i = *j++;
if(*i != ' ')
i++;
}
*i = 0;
}
void cleanequal(char * s){
int i=0;
while(s[i]!='\0'){
if(s[i]== '='){
s[i]=' ';
}
i++;
}
}
void append(char* s, char c)
{
s[len] = c;
s[len+1] = '\0';
}
char* expand_cell_references(const char* f, const char* const l, char* o); /*the magic engine*/
const char* get_cell_value(const char* coordinate_b, const char* coordinate_e);
//localiza pelo numero maximo de coisas que ele vai ler
static char matris[30][26][302] = {{{0}}};
int main() {
//int tamanho = 0;
char vetor[302];
int m;
int k=0;
int colunas = 0;
int vetorDeNumeros[30] = {0};
//inicia-se o loop
while(1) {
if(
!fgets(vetor
, 302, stdin
) //Recebe os dados || strcmp(vetor
, "\n") == 0) //Verifica se tem a quebra de linha {
break;
}
//Aqui eu insiro na funcao o vetor
char *s = vetor;
//Recebo a quantia de \t
m = conta('\t', s);
//Passo pra posicao do vetor, o numero de colunas
vetorDeNumeros[k] = m+1;
//Recebo o resultado do bubble sort
colunas = ordenar(vetorDeNumeros, k+1);
//faz a colocacao de cada elemento dentro de cada celula, tentei por funcao mas nao deu muito certo
char *ponteiro;
int j=0;
while(j<colunas) {
ponteiro
= strtok(vetor
, "\t"); while(ponteiro != NULL) {
strcpy(matris
[k
][j
], ponteiro
); ponteiro
= strtok(NULL
, "\t"); //REMOVE OS \N DESNECESSARIOS
clean(matris[k][j]);
//REMOVE OS IGUAIS
cleanequal((matris[k][j]));
//REMOVE OS ESPAÇOS GERADOS PELOS ESPAÇOS
RemoveSpaces(matris[k][j]);
j++;
}
}
//Quantia de linhas que foram
k++;
}
//int L = 0, linha=0;
//char col;
int i, c;
for(i = 0; i < k; i++) {
for(c = 0; c < colunas; c++) {
//printf("linha: %d coluna: %c >> |%s|", i, c, matris[i][c]);
//int line;
//int offset = 0, readCharCount;
//char op;
//char troca[301];
//char buffer[32];
char value[1024] = {0};
char out[1024] = {0};
strncpy(value
, matris
[i
][c
], sizeof(value
));
int iterations_left = 10;
while(iterations_left--)
{
expand_cell_references
(value
, value
+strlen(value
), out
);
#ifdef DEBUG
printf("[i,c]=[%d,%d]\titerations_left: %d\tcell: '%s'\tformula: '%s'\texpansion: '%s'\n", i, c, iterations_left, matris[i][c], value, out);
#endif
break; // stop when no more expansions occur
strncpy(value
, out
, sizeof(value
)); }
// printf("%s\t", matris[i][c]);
}
}
/*
printf("%d lin, %d col\n\n", k, colunas);
int w,z;
for(w=0;w<k;w++){
for(z=0;z<colunas;z++){
printf("%s\t", matris[w][z]);
}
printf("\n");
}
*/
//system("pause");
return 0;
}
const char* get_cell_value(const char* coordinate_b, const char* coordinate_e)
{
#ifdef DEBUG
static const size_t maxrows = (sizeof(matris)/sizeof(*matris));
static const size_t maxcols = (sizeof(matris[0])/sizeof(*matris[0]));
#endif
size_t col = 0, row = 0;
const char* it;
for (it=coordinate_b; it != coordinate_e; ++it)
{
if (*it >= 'A' && *it <= 'Z')
col = 26*col + (*it - 'A');
if (*it >= '0' && *it <= '9')
row = 10*row + (*it - '0'); /* or use atoi and friends */
}
row--; /* 1-based row nums in Excel */
#ifdef DEBUG
assert(col
>=0 && col
< maxcols
); assert(row
>=0 && row
< maxrows
); #endif
return matris[row][col]; /* 1-based indexes in Excel */
}
char* expand_cell_references(const char* f, const char* const l, char* o)
{
enum parser_state {
other,
in_coord_col,
in_coord_row
} state = other;
/*temporary storage for coordinates being parsed:*/
char accum[16] = {0};
char* accit = accum;
while (f!=l)
{
switch(state) /*dummy, the transitions flow in fallthrough order for now*/
{
case other:
*(accit = accum) = 0; /*reset the accumulator*/
while (f!=l && !(*f>='A' && *f<='Z'))
*o++ = *f++;
/*fallthrough*/
case in_coord_col:
while (f!=l && *f>='A' && *f<='Z')
*accit++ = *f++;
/*fallthrough*/
case in_coord_row:
{
const char* expanded = accum;
if (f!=l && *f>='0' && *f<='9')
{
while (f!=l && *f>='0' && *f<='9')
*accit++ = *f++;
expanded = get_cell_value(accum, accit);
}
else
{
*accit = 0;
}
while (*expanded)
*o++ = *expanded++;
continue; /*state = other;*/
}
}
}
*o = '\0';
return o;
}
I2luY2x1ZGUgPHN0ZGlvLmg+CiNpbmNsdWRlIDxzdHJpbmcuaD4KI2luY2x1ZGUgPGN0eXBlLmg+CiNpbmNsdWRlIDxhc3NlcnQuaD4KIAppbnQgY29udGEoY2hhciBjLCBjaGFyICpzKXsKICAgIGludCBudW1fdmV6ZXM9MDsKICAgIHdoaWxlKCpzIT0nXDAnKXsKICAgICAgICBpZigqcz09ICdcdCcpewogICAgICAgICAgICBudW1fdmV6ZXMrKzsKICAgICAgICB9CiAgICAgICAgcysrOwogICAgfQogICAgcmV0dXJuIG51bV92ZXplczsKfQogCmludCBvcmRlbmFyKGludCB2ZXRvckRlTnVtZXJvc1tdLCBpbnQgdGFtYW5ob1ZldG9yKXsKICAgIGludCBpOwogICAgaW50IGo7CiAgICBpbnQgdGVtcDsKICAgIGZvcihpPTA7aTx0YW1hbmhvVmV0b3I7aSsrKXsKICAgICAgICBmb3Ioaj0wO2o8dGFtYW5ob1ZldG9yO2orKyl7CiAgICAgICAgICAgIGlmKHZldG9yRGVOdW1lcm9zW2ldIDwgdmV0b3JEZU51bWVyb3Nbal0pewogICAgICAgICAgICAgICAgdGVtcCA9IHZldG9yRGVOdW1lcm9zW2ldOwogICAgICAgICAgICAgICAgdmV0b3JEZU51bWVyb3NbaV0gPSB2ZXRvckRlTnVtZXJvc1tqXTsKICAgICAgICAgICAgICAgIHZldG9yRGVOdW1lcm9zW2pdID0gdGVtcDsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KIAogICAgcmV0dXJuIHZldG9yRGVOdW1lcm9zWzBdOwp9CiAKdm9pZCBjbGVhbihjaGFyICogcyl7CiAgICAgaW50IGk9MDsKICAgICB3aGlsZShzW2ldIT0nXDAnKXsKICAgICAgICAgIGlmKHNbaV09PSdcbicpewogICAgICAgICAgICAgc1tpXT0nXDAnOwogICAgICAgICAgfQogICAgICAgICAgaSsrOwogICAgIH0KfQogCnZvaWQgUmVtb3ZlU3BhY2VzKGNoYXIqIHNvdXJjZSkKewogIGNoYXIqIGkgPSBzb3VyY2U7CiAgY2hhciogaiA9IHNvdXJjZTsKICB3aGlsZSgqaiAhPSAwKQogIHsKICAgICppID0gKmorKzsKICAgIGlmKCppICE9ICcgJykKICAgICAgaSsrOwogIH0KICAqaSA9IDA7Cn0KIAp2b2lkIGNsZWFuZXF1YWwoY2hhciAqIHMpewogICAgIGludCBpPTA7CiAgICAgd2hpbGUoc1tpXSE9J1wwJyl7CiAgICAgICAgICBpZihzW2ldPT0gJz0nKXsKICAgICAgICAgICAgIHNbaV09JyAnOwogICAgICAgICAgfQogICAgICAgICAgaSsrOwogICAgIH0KfQogCnZvaWQgYXBwZW5kKGNoYXIqIHMsIGNoYXIgYykKewogICAgICAgIGludCBsZW4gPSBzdHJsZW4ocyk7CiAgICAgICAgc1tsZW5dID0gYzsKICAgICAgICBzW2xlbisxXSA9ICdcMCc7Cn0KIApjaGFyKiBleHBhbmRfY2VsbF9yZWZlcmVuY2VzKGNvbnN0IGNoYXIqIGYsIGNvbnN0IGNoYXIqIGNvbnN0IGwsIGNoYXIqIG8pOyAvKnRoZSBtYWdpYyBlbmdpbmUqLwpjb25zdCBjaGFyKiBnZXRfY2VsbF92YWx1ZShjb25zdCBjaGFyKiBjb29yZGluYXRlX2IsIGNvbnN0IGNoYXIqIGNvb3JkaW5hdGVfZSk7CiAKLy9sb2NhbGl6YSBwZWxvIG51bWVybyBtYXhpbW8gZGUgY29pc2FzIHF1ZSBlbGUgdmFpIGxlcgpzdGF0aWMgY2hhciBtYXRyaXNbMzBdWzI2XVszMDJdID0ge3t7MH19fTsKIAppbnQgbWFpbigpIHsKICAgIC8vaW50IHRhbWFuaG8gPSAwOwogICAgY2hhciB2ZXRvclszMDJdOwogICAgaW50IG07CiAgICBpbnQgaz0wOwogICAgaW50IGNvbHVuYXMgPSAwOwogICAgaW50IHZldG9yRGVOdW1lcm9zWzMwXSA9IHswfTsKICAgIC8vaW5pY2lhLXNlIG8gbG9vcAogICAgd2hpbGUoMSkgewogICAgICAgIGlmKAogICAgICAgICAgICAgICAgIWZnZXRzKHZldG9yLCAzMDIsIHN0ZGluKSAvL1JlY2ViZSBvcyBkYWRvcwogICAgICAgICAgICAgICAgfHwgc3RyY21wKHZldG9yLCAiXG4iKSA9PSAwKSAvL1ZlcmlmaWNhIHNlIHRlbSBhIHF1ZWJyYSBkZSBsaW5oYQogICAgICAgIHsKICAgICAgICAgICAgYnJlYWs7CiAgICAgICAgfQogICAgICAgIC8vQXF1aSBldSBpbnNpcm8gbmEgZnVuY2FvIG8gdmV0b3IKICAgICAgICBjaGFyICpzID0gdmV0b3I7CiAgICAgICAgLy9SZWNlYm8gYSBxdWFudGlhIGRlIFx0CiAgICAgICAgbSA9IGNvbnRhKCdcdCcsIHMpOwogICAgICAgIC8vUGFzc28gcHJhIHBvc2ljYW8gZG8gdmV0b3IsIG8gbnVtZXJvIGRlIGNvbHVuYXMKICAgICAgICB2ZXRvckRlTnVtZXJvc1trXSA9IG0rMTsKICAgICAgICAvL1JlY2VibyBvIHJlc3VsdGFkbyBkbyBidWJibGUgc29ydAogICAgICAgIGNvbHVuYXMgPSBvcmRlbmFyKHZldG9yRGVOdW1lcm9zLCBrKzEpOwogICAgICAgIC8vZmF6IGEgY29sb2NhY2FvIGRlIGNhZGEgZWxlbWVudG8gZGVudHJvIGRlIGNhZGEgY2VsdWxhLCB0ZW50ZWkgcG9yIGZ1bmNhbyBtYXMgbmFvIGRldSBtdWl0byBjZXJ0bwogICAgICAgIGNoYXIgKnBvbnRlaXJvOwogICAgICAgIGludCBqPTA7CiAgICAgICAgd2hpbGUoajxjb2x1bmFzKSB7CiAgICAgICAgICAgIHBvbnRlaXJvID0gc3RydG9rKHZldG9yLCAiXHQiKTsKICAgICAgICAgICAgd2hpbGUocG9udGVpcm8gIT0gTlVMTCkgewogICAgICAgICAgICAgICAgc3RyY3B5KG1hdHJpc1trXVtqXSwgcG9udGVpcm8pOwogICAgICAgICAgICAgICAgcG9udGVpcm8gPSBzdHJ0b2soTlVMTCwgIlx0Iik7CiAgICAgICAgICAgICAgICAvL1JFTU9WRSBPUyBcTiBERVNORUNFU1NBUklPUwogICAgICAgICAgICAgICAgY2xlYW4obWF0cmlzW2tdW2pdKTsKICAgICAgICAgICAgICAgIC8vUkVNT1ZFIE9TIElHVUFJUwogICAgICAgICAgICAgICAgY2xlYW5lcXVhbCgobWF0cmlzW2tdW2pdKSk7CiAgICAgICAgICAgICAgICAvL1JFTU9WRSBPUyBFU1BBw4dPUyBHRVJBRE9TIFBFTE9TIEVTUEHDh09TCiAgICAgICAgICAgICAgICBSZW1vdmVTcGFjZXMobWF0cmlzW2tdW2pdKTsKICAgICAgICAgICAgICAgIGorKzsKICAgICAgICAgICAgfQogICAgICAgIH0KICAgICAgICAvL1F1YW50aWEgZGUgbGluaGFzIHF1ZSBmb3JhbQogICAgICAgIGsrKzsKICAgIH0KICAgIC8vaW50IEwgPSAwLCBsaW5oYT0wOwogICAgLy9jaGFyIGNvbDsKICAgIGludCBpLCBjOwogICAgZm9yKGkgPSAwOyBpIDwgazsgaSsrKSB7CiAgICAgICAgZm9yKGMgPSAwOyBjIDwgY29sdW5hczsgYysrKSB7CiAgICAgICAgICAgIC8vcHJpbnRmKCJsaW5oYTogJWQgY29sdW5hOiAlYyA+PiB8JXN8IiwgaSwgYywgbWF0cmlzW2ldW2NdKTsKICAgICAgICAgICAgLy9pbnQgbGluZTsKICAgICAgICAgICAgLy9pbnQgb2Zmc2V0ID0gMCwgcmVhZENoYXJDb3VudDsKICAgICAgICAgICAgLy9jaGFyIG9wOwogICAgICAgICAgICAvL2NoYXIgdHJvY2FbMzAxXTsKICAgICAgICAgICAgLy9jaGFyIGJ1ZmZlclszMl07CiAgICAgICAgICAgIGNoYXIgdmFsdWVbMTAyNF0gPSB7MH07CiAgICAgICAgICAgIGNoYXIgb3V0WzEwMjRdID0gezB9OwoKICAgICAgICAgICAgc3RybmNweSh2YWx1ZSwgbWF0cmlzW2ldW2NdLCBzaXplb2YodmFsdWUpKTsKCiAgICAgICAgICAgIGludCBpdGVyYXRpb25zX2xlZnQgPSAxMDsKICAgICAgICAgICAgd2hpbGUoaXRlcmF0aW9uc19sZWZ0LS0pCiAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgIGV4cGFuZF9jZWxsX3JlZmVyZW5jZXModmFsdWUsIHZhbHVlK3N0cmxlbih2YWx1ZSksIG91dCk7CgojaWZkZWYgREVCVUcKICAgICAgICAgICAgICAgIHByaW50ZigiW2ksY109WyVkLCVkXVx0aXRlcmF0aW9uc19sZWZ0OiAlZFx0Y2VsbDogJyVzJ1x0Zm9ybXVsYTogJyVzJ1x0ZXhwYW5zaW9uOiAnJXMnXG4iLAogICAgICAgICAgICAgICAgICAgICAgICBpLCBjLCBpdGVyYXRpb25zX2xlZnQsIG1hdHJpc1tpXVtjXSwgdmFsdWUsIG91dCk7CiNlbmRpZgoKICAgICAgICAgICAgICAgIGlmICghc3RyY21wKHZhbHVlLCBvdXQpKQogICAgICAgICAgICAgICAgICAgIGJyZWFrOyAvLyBzdG9wIHdoZW4gbm8gbW9yZSBleHBhbnNpb25zIG9jY3VyCgogICAgICAgICAgICAgICAgc3RybmNweSh2YWx1ZSwgb3V0LCBzaXplb2YodmFsdWUpKTsKICAgICAgICAgICAgfQoKICAgICAgICAgICAgcHJpbnRmKCIlc1x0Iiwgb3V0KTsgICAgCiAgICAgICAgICAgIC8vIHByaW50ZigiJXNcdCIsIG1hdHJpc1tpXVtjXSk7CiAgICAgICAgfQogICAgICAgIHByaW50ZigiXG4iKTsKICAgIH0KICAgIC8qCiAgICAgICAgcHJpbnRmKCIlZCBsaW4sICVkIGNvbFxuXG4iLCBrLCBjb2x1bmFzKTsKICAgICAgICBpbnQgdyx6OwogICAgICAgIGZvcih3PTA7dzxrO3crKyl7CiAgICAgICAgICAgIGZvcih6PTA7ejxjb2x1bmFzO3orKyl7CiAgICAgICAgICAgICAgICBwcmludGYoIiVzXHQiLCBtYXRyaXNbd11bel0pOwogCiAgICAgICAgICAgIH0KICAgICAgICAgICAgcHJpbnRmKCJcbiIpOwogICAgICAgIH0KICAgICovCiAgICBwcmludGYoIlxuIik7Ci8vc3lzdGVtKCJwYXVzZSIpOwogICAgcmV0dXJuIDA7Cn0KIApjb25zdCBjaGFyKiBnZXRfY2VsbF92YWx1ZShjb25zdCBjaGFyKiBjb29yZGluYXRlX2IsIGNvbnN0IGNoYXIqIGNvb3JkaW5hdGVfZSkKewojaWZkZWYgREVCVUcKICAgIHN0YXRpYyBjb25zdCBzaXplX3QgbWF4cm93cyA9IChzaXplb2YobWF0cmlzKS9zaXplb2YoKm1hdHJpcykpOwogICAgc3RhdGljIGNvbnN0IHNpemVfdCBtYXhjb2xzID0gKHNpemVvZihtYXRyaXNbMF0pL3NpemVvZigqbWF0cmlzWzBdKSk7CiNlbmRpZgogICAgc2l6ZV90IGNvbCA9IDAsIHJvdyA9IDA7CiAgICBjb25zdCBjaGFyKiBpdDsKICAgIGZvciAoaXQ9Y29vcmRpbmF0ZV9iOyBpdCAhPSBjb29yZGluYXRlX2U7ICsraXQpCiAgICB7CiAgICAgICAgaWYgKCppdCA+PSAnQScgJiYgKml0IDw9ICdaJykKICAgICAgICAgICAgY29sID0gMjYqY29sICsgKCppdCAtICdBJyk7CiAgICAgICAgaWYgKCppdCA+PSAnMCcgJiYgKml0IDw9ICc5JykKICAgICAgICAgICAgcm93ID0gMTAqcm93ICsgKCppdCAtICcwJyk7IC8qIG9yIHVzZSBhdG9pIGFuZCBmcmllbmRzICovCiAgICB9CiAgICByb3ctLTsgLyogMS1iYXNlZCByb3cgbnVtcyBpbiBFeGNlbCAqLwogCiNpZmRlZiBERUJVRwogICAgYXNzZXJ0KGNvbD49MCAmJiBjb2wgPCBtYXhjb2xzKTsKICAgIGFzc2VydChyb3c+PTAgJiYgcm93IDwgbWF4cm93cyk7CiNlbmRpZgogCiAgICByZXR1cm4gbWF0cmlzW3Jvd11bY29sXTsgLyogMS1iYXNlZCBpbmRleGVzIGluIEV4Y2VsICovCn0KIApjaGFyKiBleHBhbmRfY2VsbF9yZWZlcmVuY2VzKGNvbnN0IGNoYXIqIGYsIGNvbnN0IGNoYXIqIGNvbnN0IGwsIGNoYXIqIG8pCnsKICAgIGVudW0gcGFyc2VyX3N0YXRlIHsKICAgICAgICBvdGhlciwKICAgICAgICBpbl9jb29yZF9jb2wsCiAgICAgICAgaW5fY29vcmRfcm93CiAgICB9IHN0YXRlID0gb3RoZXI7CiAKICAgIC8qdGVtcG9yYXJ5IHN0b3JhZ2UgZm9yIGNvb3JkaW5hdGVzIGJlaW5nIHBhcnNlZDoqLwogICAgY2hhciBhY2N1bVsxNl0gPSB7MH07CiAgICBjaGFyKiBhY2NpdCA9IGFjY3VtOwogICAgd2hpbGUgKGYhPWwpCiAgICB7CiAgICAgICAgc3dpdGNoKHN0YXRlKSAvKmR1bW15LCB0aGUgdHJhbnNpdGlvbnMgZmxvdyBpbiBmYWxsdGhyb3VnaCBvcmRlciBmb3Igbm93Ki8KICAgICAgICB7CiAgICAgICAgICAgIGNhc2Ugb3RoZXI6CiAgICAgICAgICAgICAgICAqKGFjY2l0ID0gYWNjdW0pID0gMDsgLypyZXNldCB0aGUgYWNjdW11bGF0b3IqLwogICAgICAgICAgICAgICAgd2hpbGUgKGYhPWwgJiYgISgqZj49J0EnICYmICpmPD0nWicpKQogICAgICAgICAgICAgICAgICAgICpvKysgPSAqZisrOwogICAgICAgICAgICAgICAgLypmYWxsdGhyb3VnaCovCiAgICAgICAgICAgIGNhc2UgaW5fY29vcmRfY29sOgogICAgICAgICAgICAgICAgd2hpbGUgKGYhPWwgJiYgKmY+PSdBJyAmJiAqZjw9J1onKQogICAgICAgICAgICAgICAgICAgICphY2NpdCsrID0gKmYrKzsKICAgICAgICAgICAgICAgIC8qZmFsbHRocm91Z2gqLwogICAgICAgICAgICBjYXNlIGluX2Nvb3JkX3JvdzoKICAgICAgICAgICAgICAgIHsKICAgICAgICAgICAgICAgICAgICBjb25zdCBjaGFyKiBleHBhbmRlZCA9IGFjY3VtOwogICAgICAgICAgICAgICAgICAgIGlmIChmIT1sICYmICpmPj0nMCcgJiYgKmY8PSc5JykKICAgICAgICAgICAgICAgICAgICB7CiAgICAgICAgICAgICAgICAgICAgICAgIHdoaWxlIChmIT1sICYmICpmPj0nMCcgJiYgKmY8PSc5JykKICAgICAgICAgICAgICAgICAgICAgICAgICAgICphY2NpdCsrID0gKmYrKzsKICAgICAgICAgICAgICAgICAgICAgICAgZXhwYW5kZWQgPSBnZXRfY2VsbF92YWx1ZShhY2N1bSwgYWNjaXQpOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICBlbHNlCiAgICAgICAgICAgICAgICAgICAgewogICAgICAgICAgICAgICAgICAgICAgICAqYWNjaXQgPSAwOwogICAgICAgICAgICAgICAgICAgIH0KICAgICAgICAgICAgICAgICAgICB3aGlsZSAoKmV4cGFuZGVkKQogICAgICAgICAgICAgICAgICAgICAgICAqbysrID0gKmV4cGFuZGVkKys7CiAgICAgICAgICAgICAgICAgICAgY29udGludWU7IC8qc3RhdGUgPSBvdGhlcjsqLwogICAgICAgICAgICAgICAgfQogICAgICAgIH0KICAgIH0KICAgICpvID0gJ1wwJzsKICAgIHJldHVybiBvOwp9Cg==