#include<bits/stdc++.h>
using namespace std;

/*
string cocoon[10];
char area[5][5];
int ans;

bool check(bool used[]){
	bool flag = false;



	return flag;
}

void dfs(bool used[], depth){
	if (depth == 5){

	}


	return;
}


int main(){
	while (cin >> cocoon[0] && cocoon[0][0] != 'E'){
		for (int i = 1; i < 10; i++){
			cin >> cocoon[i];
		}

		ans = 0;
		bool used[10] = { false };

		cout << ans / 8 << endl;
	}
	return 0;


}

*/

int cocoon[10][5];
int area[5][5];
vector<int> bita, bitb;
int ans;

bool used[10];

void check(int depth){
	int ret = 0;

	if (depth == 10){
		ans++;
		return;
	}
	else if (depth >= 5){
		for (int i = 0; i < 5; i++){
			int num = bitb[i];
			if (used[num]) continue;
			used[num] = true;
			bool flag1 = true, flag2 = true;

			for (int j = 0; j < 5; j++){
				if (area[j][depth - 5] == cocoon[num][j]) flag1 = false;
				if (area[j][depth - 5] == cocoon[num][4 - j]) flag2 = false;
			}

			if (flag1 || flag2) check(depth + 1);
			
			used[num] = false;
		}
	}
	else{
		for (int i = 0; i < 5; i++){
			int num = bita[i];
			if (used[num]) continue;
			used[num] = true;

			for (int j = 0; j < 5; j++){
				area[depth][j] = cocoon[num][j];
			}
			check(depth + 1);

			if (cocoon[num][0] == cocoon[num][4] && cocoon[num][1] == cocoon[num][3]){
				used[num] = false;
				continue;
			}

			for (int j = 0; j < 5; j++){
				area[depth][j] = cocoon[num][4 - j];
			}
			check(depth + 1);

			used[num] = false;
		}
	}

	return;
}


int main(void){

	char in[50];

	while (cin >> in){
		if (in[0] == 'E') break;

		for (int j = 0; j < 5; j++){
			cocoon[0][j] = in[j] - '0';
		}

		for (int i = 1; i <= 9; i++){
			cin >> in;
			for (int j = 0; j < 5; j++){
				cocoon[i][j] = in[j] - '0';
			}
		}
		
		ans = 0;

		for (int i = 0; i < 512; i++){
			
			bita.clear();
			bitb.clear();
			int num = i;
			for (int j = 0; j <= 9; j++){
				if (num % 2 != 0) bita.push_back(j);
				else bitb.push_back(j);

				num = num / 2;
			}

			if (bita.size() != 5) continue;

			check(0);

		}

		cout << ans / 4 << endl;

	}

	return 0;
}



/*

void check(vector<int> a, vector<int> b){

	if (!a.empty()){
		int count = a.size();
		for (int i = 0; i < count; i++){
			vector<int> aa(a);
			int num = a[i];
			aa.erase(aa.begin() + i);
			for (int j = 0; j < 5; j++){
				area[5 - count][j] = cocoon[num][j];
			}
			check(aa, b);
			for (int j = 0; j < 5; j++){
				area[5 - count][j] = cocoon[num][4 - j];
			}
			check(aa, b);
		}
	}
	else if (!b.empty()){
		int count = b.size();
		for (int i = 0; i < count; i++){
			vector<int> bb(b);
			int num = b[i];
			bool flag1 = true, flag2 = true;
			for (int j = 0; j < 5; j++){
				if (area[j][5 - count] == cocoon[num][j]) flag1 = false;
				if (area[j][5 - count] == cocoon[num][4 - j]) flag2 = false;
			}

			bb.erase(bb.begin() + i);

			if (flag1) check(a, bb);
			if (flag2) check(a, bb);
		}
	}
	else{
		ans++;
		return;
	}


	return;
}


int main(void){

	char in[50];
	char end[] = "END";

	while (cin >> in){
		if (in[0] == 'E') break;

		for (int j = 0; j < 5; j++){
			cocoon[0][j] = in[j] - '0';
		}

		for (int i = 1; i <= 9; i++){
			cin >> in;
			for (int j = 0; j < 5; j++){
				cocoon[i][j] = in[j] - '0';
			}
		}

		ans = 0;

		for (int i = 0; i < 512; i++){
			vector<int> bita, bitb;
			int bits = 0;
			int num = i;
			for (int j = 0; j <= 9; j++){
				if (num % 2 != 0) bita.push_back(j);
				else bitb.push_back(j);

				num = num / 2;
			}

			if (bita.size() != 5) continue;

			check(bita, bitb);

		}

		cout << ans / 32 << endl;

	}

	return 0;
}
*/

Measured memory_bytes: 1196