#include<bits/stdc++.h>
  #define ll long long 
  #define hell 1000000007 
  #define F first
  #define re 15000000
  #define S second
  #define pb push_back
  #define all(a)  (a).begin(),(a).end()
  #define rep(i,a,b) for(ll int i = a;i<b;i++)
  #define pi 3.1415926536
  #define Mod 998244353
  //char a[2000][2000];
  using namespace std;
  int sum (ll a)
  {
      int sum =0;
      while(a>0)
      {
          sum = sum + (a%10);
          a=a/10;
      }
      return sum;
  }
  int count_digit(ll n)
  {
     int  count =0;
      while(n>0)
      {
          n = n/10;
          count++;
          //count++;
      }
      return count;
  }
  int binarySearch(int x,int y ,ll z ,ll v[])
  {
      int low = x;
      int high = y;
      int mid = x+(y-x)/2;
      while(low<=high)
      {
          if(v[mid]==z)
              return mid;
          if(v[mid]<z)
              return binarySearch(mid+1,high,z,v);
          if(v[mid]>z)
              return binarySearch(low,mid-1,z,v);
      }
      return -1;
  }
  ll modularExponentiation(ll x,ll n,ll M)
  {
      if(n==0)
          return 1;
      else if(n%2 == 0)        //n is even
          return modularExponentiation((x*x)%M,n/2,M);
      else                             //n is odd
          return (x*modularExponentiation((x*x)%M,(n-1)/2,M))%M;
 
  } 
  ll binaryExponentiation(ll x,ll n)
  {
      if(n==0)
          return 1;
      else if(n%2 == 0)        //n is even
          return binaryExponentiation(x*x,n/2);
      else                             //n is odd
          return x*binaryExponentiation(x*x,(n-1)/2);
  }
 
 
 
 
  set<ll> s;
  //vector<ll> v;
  void genrate(ll n,int len,int max)
  {
      if(len>max)
          return ;
      s.insert(n);
      genrate(n*10+1,len+1,max);
      genrate(n*10+0,len+1,max);
  }
  bool visited[200005];
  vector<ll> v[200005];
  bool recur[200005];
  int c = 0;
  void dfs(int x ,int parent)
  {
     visited[x] = 1;
     if(v[x].size() != 2)
      c = -1;
     for(int i = 0;i<v[x].size();i++){
      if(v[x][i] == parent)
        continue;
      if(visited[v[x][i]] && v[x].size() == 2 && c ==  0)
          c = 1;
      else if(!visited[v[x][i]]){
       dfs(v[x][i],x);
     }
     //return false;
      }
  }
  //memset(level,0,sizeof(level));    
  /*void topological_sort(int x)
  {
      visited[x] = 1;
    //  sort(all(v[x]));
      for(int i =0;i<v[x].size();i++)
      {
          if(visited[v[x][i]]!=1){
              //level[v[x][i]] = level[x]+1;
              topological_sort(v[x][i]);
          }
      }
      ans.pb(x);
  }*/
  //char a2001][2001];
  ///**************** Cycle using DSU *********************///
 
  int findPivot(ll a[],int low,int high)
  {
      int mid = (low+high)/2;
      if(high < low)
        return -1;
       if(low == high)
        return low;
      if(a[mid] >= a[mid+1] && mid < high)
        return mid;
       if(a[mid-1] >=a[mid] && mid > low)
        return mid-1;
       if(a[mid] >= a[low])
           return findPivot(a,mid+1,high);
       if(a[mid] <= a[low])
        return findPivot(a,low,mid-1);
  }
  int check(pair<int,pair<int,int> > p,ll a[],int n){
    int res = 0;
    ll b[n+1];
    b[0] = 0;
    for(int i = 1;i<=n;i++)
      b[i] = a[i];
 
    if(p.F != 0){
      b[1] = b[1] + p.F;
      res++;
    }
    if(p.S.F!=0){
      b[2] = b[2] + p.S.F;
      res++;
    }
    if(p.S.S!=0){
      b[3] = b[3] + p.S.S;
      res++;
    }
    ll d = b[2]-b[1];
    for(int i = 4;i<=n;i++){
      if(b[i]-b[i-1] == d)
        continue;
      else{
        if(b[i]+1-b[i-1] == d){
          b[i] = b[i]+1;
          res++;
        }
        else if(b[i]-1 -b[i-1] == d)
        {
          b[i] = b[i]-1;
          res++;
        }
        else
          return -1;
      }
    }
    return res;
  }
  int main()
  {   
      ios_base::sync_with_stdio(false);
      cin.tie(0);
      cout.tie(0);            
      //std::setprecision(20);    
      int tests=1;
        //freopen("input.txt", "r", stdin);
       //cin>>tests;
     while(tests--) 
      { 
          string s;
          cin>>s;
          int n = s.size();
          ll dp[s.size()+1][13];
          for(int i = 0;i<=s.size();i++)
          {
            for(int j = 0;j<13;j++)
              dp[i][j] = 0;
          }
          dp[0][0] = 1;
          for(int i = 1;i<=s.size();i++){
            if(s[i-1] == '?'){
              for(int k = 0;k<10;k++){
                for(int j = 0;j<13;j++){
                int rem = 10*j+(k);
              //  cout<<rem<<" ";
                rem = rem%13;
              // cout<<rem<<" ";
                dp[i][rem] = dp[i][rem] + dp[i-1][j];
                dp[i][rem] = dp[i][rem]%hell;
               }
              }
            }
            else{
              for(int j = 0;j<13;j++){
                int rem = 10*j+(s[i-1]-'0');
                rem = rem%13;
                dp[i][rem] = dp[i][rem] + dp[i-1][j];
                dp[i][rem] = dp[i][rem]%hell;
              }
            }
          }
          cout<<dp[n][5]%hell;
      }   
}

Measured memory_bytes: 15312