#include <iostream>
#include <vector>
#include <algorithm>
#include <cstring>
#include <cstdlib>
#include <string>
#include <set>

using namespace std;

int a[10];
string vs[10];
bool selected[10];
set<int> res;

void comb(int num){
  if(num==5){
    // ツづつソツづァツづーツ湘」ツづ可つキツづゥツつゥ
    for(int s = 0; s < (1<<5); s++){
      int mask=0;
      for(int i = 0; i < 5; i++){
	if((s>>i)&1){
	  for(int j = 0; j < 5; j++){
	    if(vs[a[i]][j]=='1')
	      mask|=(1<<(j*5+i));
	  }
	}
	else{
	  // ツ逆ツ古シツつォ
	  for(int j = 0; j < 5; j++){
	    if(vs[a[i]][4-j]=='1')
	      mask|=(1<<(j*5+i));
	  }
	}
      }
      vector<int> left;
      for(int i = 0; i < 10; i++){
	if(!selected[i])
	  left.push_back(i);
      }
      bool no[10];
      memset(no,0,sizeof(no));
      bool bad=false;
      // ツづ個つアツづィツづ個要ツ素ツづーツマツッツチツつキツづゥツ渉氾板づ可置ツつ「ツづつ「ツつュ
      for(int i = 0; i < 5; i++){
	bool ok=false;
	for(int j = 0; j < left.size(); j++){
	  if(no[j])continue;
	  bool isMatch=true;
	  // matchツつキツづゥツつゥツ陳イツづ猟づゥ
	  // ツ債カツつゥツづァ
	  for(int k = 0; k < 5; k++){
	    if(!((vs[left[j]][k]-'0')^((mask>>(i*5+k))&1))){
	      // no
	      isMatch=false;
	      break;
	    }
	  }
	  if(!isMatch){
	    isMatch=true;
	    for(int k = 0; k < 5; k++){
	      if(!((vs[left[j]][4-k]-'0')^((mask>>(i*5+k))&1))){
		// no
		isMatch=false;
		break;
	      }
	    }
	    if(isMatch){
	      no[j]=true;
	      ok=true;
	      break;
	    }
	  }
	  else{
	    no[j]=true;
	    ok=true;
	    break;
	  }
	}
	// ツづ敖づつつゥツづァツづ按つ「
	if(!ok){
	  bad=true;
	  break;
	}
      }
      if(!bad){
	res.insert(mask);
      }
    }
  }
  else{
    for(int i = 0; i < 10; i++){
      if(selected[i])continue;
      a[num]=i;
      selected[i]=true;
      comb(num+1);
      selected[i]=false;
    }
  }
}

int main(){

  memset(selected,0,sizeof(selected));
  while(cin>>vs[0]&&vs[0]!="END"){
    for(int i = 1; i < 10; i++)
      cin>>vs[i];
    comb(0);
    cout<<res.size()/8<<endl;
    res.clear();
  }
  
  
  return 0;
}