// #define dak
#ifndef dak
#include "message.h"
#endif
#include <bits/stdc++.h>
using namespace std;
#ifdef dak
void send_packet(vector<bool> s)
{
}
#endif
vector<int> base={62298, 250, 41290, 16080, 50994, 38814, 47014, 54414, 46863, 5320, 59968, 44884, 42722, 14433, 36992};
void send_message(vector<bool> M, vector<bool> C)
{
vector<bool> ve;
for(int i = 0; i < base.size(); i++)
{
ve.clear();
int bit=0;
for(int j = 0; j < 31; j++)
{
if(C[j]==0)
{
ve.emplace_back((base[i]>>bit&1));
bit++;
}
else ve.emplace_back(0);
}
send_packet(ve);
}
int len=M.size();
int bit=0;
ve.clear();
for(int i = 0; i < 31; i++)
{
if(C[i]==0) ve.emplace_back((len>>bit&1)), bit++;
else ve.emplace_back(0);
}
send_packet(ve);
int sus=len/16*16;
if(len%16!=0) sus+=16;
while(M.size()<sus) M.emplace_back(0);
int p=0;
for(int i = 0; i < sus; i+=16)
{
ve.clear();
for(int j = 0; j < 31; j++)
{
if(C[j]==0) ve.emplace_back(M[p++]);
else ve.emplace_back(0);
}
send_packet(ve);
}
}
vector<bool> receive_message(vector<vector<bool>> R)
{
int poi=base.size();
vector<bool> C(31, true);
vector<bool> res={};
vector<vector<int>> can(31, vector<int>{});
vector<int> rem={};
int cur=0;
for(int i = 0; i < 31; i++)
{
if(cur==16) break;
bool ok=1;
for(int k = 0; k < base.size(); k++)
{
if(R[k][i]!=(base[k]>>cur&1))
{
ok=0;
break;
}
}
if(ok) rem.emplace_back(i), cur++;
}
for(int x:rem) C[x]=0;
int len=0, bit=0;
for(int i = 0; i < 31; i++)
{
if(C[i]==0)
{
len+=(1<<bit)*R[poi][i];
bit++;
}
}
poi++;
for(int i = poi; i < R.size(); i++)
{
for(int j = 0; j < 31; j++)
{
if(C[j]==0) res.emplace_back(R[i][j]);
}
}
while(res.size()>len) res.pop_back();
return res;
}