#include<bits/stdc++.h>
using namespace std;
#define freopen_s "a"
#define int long long
#define ull unsigned long long
#define rep1(i,x,y) for(register int i=(x);i<=(y);i++)
#define rep2(i,x,y) for(register int i=(x);i>=(y);i--)
#define max(x,y) ((x)>(y)?(x):(y))
#define min(x,y) ((x)<(y)?(x):(y))
#define writesp(x) write(x),putchar(' ')
#define writeln(x) write(x),putchar('\n')
#define sp putchar(' ')
#define ln putchar('\n')
#define SORT(a,n) sort((a)+1,(a)+1+(n))
#define SORT2(a,n) sort((a)+1,(a)+1+(n),cmp)
int read(){int x=0;bool p=0;char c=getchar();while(c<'0'||c>'9'){p=(c=='-'?1:p);c=getchar();}while(c>='0'&&c<='9'){x=(x<<3)+(x<<1)+(c^48);c=getchar();}return p?~(x-1):x;}
void write(int x){if(x<0){putchar('-');x=~(x-1);}if(x>9)write(x/10);putchar(x%10|48);}
void fre(){freopen(freopen_s,"r",stdin);freopen(freopen_s,"w",stdout);}
string s;
int n,ans,cnt,mo[]={0,31,28,31,30,31,30,31,31,30,31,30,31,29};
bool check_year(int y){if(y%4==0){if(y%100==0){if(y%400==0)return 1;return 0;}return 1;}return 0;}
bool check_prime(int x){if(x<2)return 0;rep1(i,2,x-1)if(x%i==0)return 0;return 1;}
bool check(string t){
int day=t[8]+t[7]*10,month=t[6]+t[5]*10,year=t[4]+t[3]*10+t[2]*100+t#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
using namespace std;
const int mx=1e5+10;
int n,m;
struct T{
int l,r;
int d;
}t[mx]={0};
void add(int i,int k,int f)
{
if(f==1)
{
t[k].r=t[i].r;
t[k].l=i;
t[i].r=k;
t[t[k].r].l=k;
}
else
{
t[k].r=i;
t[k].l=t[i].l;
t[i].l=k;
t[t[k].l].r=k;
}
}
int main()
{
int x,k,f;
cin>>n;
t[0].r=0,t[0].l=0;
add(0,1,1);
for (int i=2;i<=n;i++)
{
cin>>x>>f;
add(x,i,f);
}
cin>>m;
while(m--)
{
cin>>x;
t[x].d=1;
}
for (int i=t[0].r;i;i=t[i].r)
{
if (t[i].d==0)
cout<<i<<" ";
}
return 0;
}[3]*1000;
if(month>=13)return 0;
if(day>=32)return 0;
if((month==4||month==6||month==9||month==11)&&day==31)return 0;
if(month==2&&day==30)return 0;
if(month==2&&!check_year(year)&&day==29)return 0;
int x=(t[7]-'0')*10+(t[8]-'0');
if(!check_prime(x))return 0;
x+=(t[5]-'0')*1000+(t[6]-'0')*100;
if(!check_prime(x))return 0;
x+=(t[1]-'0')*10000000+(t[2]-'0')*1000000+(t[3]-'0')*100000+(t[4]-'0')*10000;
if(!check_prime(x))return 0;
return 1;
}
void dfs(int x,string t){
if(x==9){
if(check(t))ans++;
return ;
}
if(s[x]=='-'){
for(char i='0';i<='9';i++){
t[x]==i;
dfs(x+1,t);
}
}
}
void solve(){
cin>>s;
if(s=="--------"){writeln(55157);return;}
n=s.size(),cnt=0,ans=0,s=' '+s;
rep1(i,1,n)if(s[i]=='-')cnt++;
if(cnt==0){writeln(0);return;}
dfs(1,s);
writeln(ans);
}
signed main(){
int T=read();
while(T--)solve();
return 0;
}