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

#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))

typedef long long LL;

#define MOD 1000000007

int main(){
  string a,b,c;
  LL dp[50][10][10][10][2];
  LL total[2];
  while(1){
    cin >> a;
    if(a=="0") return 0;
    cin >> b >> c;
    if(a.length()==1){
      for(int i=0;i<a.length();i++){
        for(int j=0;j<10;j++){
          for(int k=0;k<10;k++){
            for(int l=0;l<10;l++){
              dp[i][j][k][l][0]=dp[i][j][k][l][1]=0;
            }
          }
        }
      }
      for(int i=1;i<10;i++){
        for(int j=1;j<10;j++){
          for(int k=1;k<10;k++){
            if((a[a.length()-1]=='?'||a[a.length()-1]=='0'+i)
              &&(b[a.length()-1]=='?'||b[a.length()-1]=='0'+j)
              &&(c[a.length()-1]=='?'||c[a.length()-1]=='0'+k)){
                if((i+j)%10==k){
                  dp[a.length()-1][i][j][k][(i+j)/10]=1;
                }
            }
          }
        }
      }
      total[0]=total[1]=0;
      for(int j=0;j<10;j++){
        for(int k=0;k<10;k++){
          for(int l=0;l<10;l++){
            total[0]=(total[0]+dp[a.length()-1][j][k][l][0])%MOD;
            total[1]=(total[1]+dp[a.length()-1][j][k][l][1])%MOD;
          }
        }
      }
      cout << total[0] << endl;
      continue;
    }
    for(int i=0;i<a.length();i++){
      for(int j=0;j<10;j++){
        for(int k=0;k<10;k++){
          for(int l=0;l<10;l++){
            dp[i][j][k][l][0]=dp[i][j][k][l][1]=0;
          }
        }
      }
    }
    for(int i=0;i<10;i++){
      for(int j=0;j<10;j++){
        for(int k=0;k<10;k++){
          if((a[a.length()-1]=='?'||a[a.length()-1]=='0'+i)
            &&(b[a.length()-1]=='?'||b[a.length()-1]=='0'+j)
            &&(c[a.length()-1]=='?'||c[a.length()-1]=='0'+k)){
              if((i+j)%10==k){
                dp[a.length()-1][i][j][k][(i+j)/10]=1;
              }
          }
        }
      }
    }
    total[0]=total[1]=0;
    for(int j=0;j<10;j++){
      for(int k=0;k<10;k++){
        for(int l=0;l<10;l++){
          total[0]=(total[0]+dp[a.length()-1][j][k][l][0])%MOD;
          total[1]=(total[1]+dp[a.length()-1][j][k][l][1])%MOD;
        }
      }
    }
    for(int i=a.length()-2;i>0;i--){
      for(int j=0;j<10;j++){
        for(int k=0;k<10;k++){
          for(int l=0;l<10;l++){
            if((a[i]=='?'||a[i]=='0'+j)
              &&(b[i]=='?'||b[i]=='0'+k)
              &&(c[i]=='?'||c[i]=='0'+l)
            ){
              for(int m=0;m<2;m++){
                if((j+k+m)%10==l){
                  dp[i][j][k][l][(j+k+m)/10]=total[m];
                  //printf("(%d %d %d %d %d) %d\n",i,j,k,l,m,dp[i][j][k][l][(j+k+m)/10]);
                }
              }
            }
          }
        }
      }
      total[0]=total[1]=0;
      for(int j=0;j<10;j++){
        for(int k=0;k<10;k++){
          for(int l=0;l<10;l++){
            total[0]=(total[0]+dp[i][j][k][l][0])%MOD;
            total[1]=(total[1]+dp[i][j][k][l][1])%MOD;
          }
        }
      }
    }
    for(int j=1;j<10;j++){
      for(int k=1;k<10;k++){
        for(int l=1;l<10;l++){
          if((a[0]=='?'||a[0]=='0'+j)
            &&(b[0]=='?'||b[0]=='0'+k)
            &&(c[0]=='?'||c[0]=='0'+l)
          ){
            for(int m=0;m<2;m++){
              if((j+k+m)%10==l){
                dp[0][j][k][l][(j+k+m)/10]=total[m];
              }
            }
          }
        }
      }
    }
    total[0]=0;
    for(int j=1;j<10;j++){
      for(int k=1;k<10;k++){
        for(int l=1;l<10;l++){
          total[0]=(total[0]+dp[0][j][k][l][0])%MOD;
        }
      }
    }
    cout << total[0] << endl;
  }
  return 0;
}



Measured memory_bytes: 3912