#include<bits/stdc++.h>
using namespace std;
using LL = long long;
LL transform(string input) {
LL mask = 0;
for(int i = 0; i < input.size(); i++) {
if(input[i] >= 'a' && input[i] <= 'z') {
mask += 1LL<<(input[i]-'a');
} else if(input[i] >= 'A' && input[i] <= 'Z') {
mask += 1LL<<(input[i]-'A'+27);
} else if(input[i] >= '0' && input[i] <= '9') {
mask += 1LL<<(input[i]-'0'+54);
}
}
return mask;
}
const int N = 1e5 + 10, LOG_MASK = 64;
LL basis[LOG_MASK];
LL size = 0;
void insert_vector(LL mask) {
for(int i = 0; i < LOG_MASK; i++) {
if ((mask & i << i)) continue;
if(!basis[i]) {
basis[i] = mask;
size++;
return;
}
mask ^= basis[i];
}
}
int main() {
int T;cin>>T;
while(T--) {
size = 0;
memset(basis, 0, sizeof basis);
int N; cin>>N;
while(N--) {
string input;
cin>>input;
cout<<input<<" : ";
LL masked_input = transform(input);
cout<<masked_input<<endl;
insert_vector(masked_input);
}
cout<<size<<endl;
}
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKdXNpbmcgTEwgPSBsb25nIGxvbmc7CgpMTCB0cmFuc2Zvcm0oc3RyaW5nIGlucHV0KSB7CiAgICBMTCBtYXNrID0gMDsKICAgIGZvcihpbnQgaSA9IDA7IGkgPCBpbnB1dC5zaXplKCk7IGkrKykgewogICAgICAgIGlmKGlucHV0W2ldID49ICdhJyAmJiBpbnB1dFtpXSA8PSAneicpIHsKICAgICAgICAgICAgbWFzayArPSAxTEw8PChpbnB1dFtpXS0nYScpOwogICAgICAgIH0gZWxzZSBpZihpbnB1dFtpXSA+PSAnQScgJiYgaW5wdXRbaV0gPD0gJ1onKSB7CiAgICAgICAgICAgIG1hc2sgKz0gMUxMPDwoaW5wdXRbaV0tJ0EnKzI3KTsKICAgICAgICB9IGVsc2UgaWYoaW5wdXRbaV0gPj0gJzAnICYmIGlucHV0W2ldIDw9ICc5JykgewogICAgICAgICAgICBtYXNrICs9IDFMTDw8KGlucHV0W2ldLScwJys1NCk7CiAgICAgICAgfQogICAgfQogICAgcmV0dXJuIG1hc2s7Cn0KCmNvbnN0IGludCBOID0gMWU1ICsgMTAsIExPR19NQVNLID0gNjQ7CkxMIGJhc2lzW0xPR19NQVNLXTsKTEwgc2l6ZSA9IDA7Cgp2b2lkIGluc2VydF92ZWN0b3IoTEwgbWFzaykgewogICAgZm9yKGludCBpID0gMDsgaSA8IExPR19NQVNLOyBpKyspIHsKICAgICAgICBpZiAoKG1hc2sgJiBpIDw8IGkpKSBjb250aW51ZTsKCiAgICAgICAgaWYoIWJhc2lzW2ldKSB7CiAgICAgICAgICAgIGJhc2lzW2ldID0gbWFzazsKICAgICAgICAgICAgc2l6ZSsrOwogICAgICAgICAgICByZXR1cm47CiAgICAgICAgfQoKICAgICAgICBtYXNrIF49IGJhc2lzW2ldOwogICAgfQp9CgppbnQgbWFpbigpIHsKICAgIGludCBUO2Npbj4+VDsKICAgIHdoaWxlKFQtLSkgewogICAgICAgIHNpemUgPSAwOwogICAgICAgIG1lbXNldChiYXNpcywgMCwgc2l6ZW9mIGJhc2lzKTsKICAgICAgICBpbnQgTjsgY2luPj5OOwogICAgICAgIHdoaWxlKE4tLSkgewogICAgICAgICAgICBzdHJpbmcgaW5wdXQ7CiAgICAgICAgICAgIGNpbj4+aW5wdXQ7CiAgICAgICAgICAgIGNvdXQ8PGlucHV0PDwiIDogIjsKICAgICAgICAgICAgTEwgbWFza2VkX2lucHV0ID0gdHJhbnNmb3JtKGlucHV0KTsKICAgICAgICAgICAgY291dDw8bWFza2VkX2lucHV0PDxlbmRsOwogICAgICAgICAgICBpbnNlcnRfdmVjdG9yKG1hc2tlZF9pbnB1dCk7CiAgICAgICAgfQogICAgICAgIGNvdXQ8PHNpemU8PGVuZGw7CiAgICB9Cn0=