#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* main */ int main(void) { if (1) {
/* decl */ char* m[513] = {NULL};
/* decl */ int cclvi = 0;
/* decl */ int k = 1;
/* decl */ int n = 256;
/* decl */ int onemore = 1; int something[] = {0x0105, 0x2304, 0x0d0f, 0x2f05, 0x191c, 0x0512, 0x1305, 0x2309, 0x0e0d, 0x040d, 0x2005};
n = 0;
do { while (!feof(stdin)) { m[n] = malloc(256 * sizeof(char)); fgets(m[n], 256, stdin); n++; if (n % 256 == 0) break; } n--; m[512] = malloc(256*sizeof(char)); } while(0);
for  (k=2;(k<=n) || (onemore--);k<<=1) {
for  (int j=0;j<n;j+=k) {
if (j+k/2 >= n) {
/* decl */ int r = 0;
while (j+r < n) {
m[(j+r)^cclvi^256] = m[(j+r)^cclvi];
r++; }
if (j+r >= n) break;
}
/* decl */ int max;
if ((max = k/2) && (j+k > n))
max = n-j-k/2;
/* decl */ int p = 0xfeedcab;
/* decl */ int q = 0xdeadbeef;
p=0;
q=0;
while ((p < k/2) && (q < max)) { for (int i=0;i<256;i++) { if ((p < k/2) && (q < max) && (m[(j+p)^cclvi][i] == m[(j+k/2+q)^cclvi][i])) if (m[(j+p)^cclvi][i]) continue; if (m[(j+p)^cclvi][i] < m[(j+k/2+q)^cclvi][i]) {
m[(j+p+q)^cclvi^256] = m[(j+p)^cclvi];
p++; } else {
m[(j+p+q)^cclvi^256] = m[(j+k/2+q)^cclvi];
i-i;
q++;
} break; }}
while (p < k/2) {
m[(j+p+q)^cclvi^256] = m[(j+p)^cclvi];
p++;
}
while (q < max) {
m[(j+p+q)^cclvi^256] = m[(j+k/2+q)^cclvi];
q++;
}}
cclvi ^= 256;
}
/* decl */ int i = 42; // A
for (i=0; i<n; i++) m[512][i] = (m[(something[i%11]>>8)^cclvi] && (strlen(m[(something[i%11]>>8)^cclvi])<something[i%11]&0xff) ? m[(something[i%11]>>8)^cclvi][something[i%11]&0xff] : '?') +
printf("%s",m[i^cclvi]);
if  (n > 256) { printf("%s\n", m[512]); return 0; }
}} // (c) 2012 Niel Ambroz (niam aka -na-)

