// Slower C++ solution:
#include <iostream>

#include <stdio.h>

#include <vector>

#include <cmath>

#include <algorithm>

#include <string>

#include <queue>

#include <stack>

#include <functional>

#include <list>

#include <utility>

#include <map>

#include <vector>

using namespace std;



typedef long long ll;

#define rep(i,n) for(int i=0;i<n;i++)

#define rep1(i,x) for(int i=1;i<=x;i++)

#define rrep(i,x) for(int i=x-1;i>=0;i--)

#define rrep1(i,x) for(int i=x;i>0;i--)

#define sor(v) sort(v.begin(),v.end())

#define rev(s) reverse(s.begin(),s.end())

#define lb(vec,a) lower_bound(vec.begin(),vec.end(),a)

#define ub(vec,a) upper_bound(vec.begin(),vec.end(),a)

#define mp1(a,b,c) P1(a,P(b,c))

#define get_arsize(a) (sizeof(a)/sizeof(a[0]))

const ll mod = 1000000007;

const double eps = 1e-10;

const int MAX = 200000;



int main() {

  // three patterns

  char c;

  // 今回見ていたあまりが*10されて、次の1桁目がくっついて、13で割ったあまりの場合の数になる。

  // "非決定性有限オートマトンの場合は、ノードの長さだけの配列を用意しておいて、各配列の要素がそのターンにその配列を踏む場合の数"

  // 2次元配列が使える(高々数MB)

  int dp[100013][13] = {};

  // 読み取り0文字目のとき、0とみなす。

  // 13で割ったあまりが0となる場合の数が1で、他は0。

  dp[0][0] = 1;

  int i = 0;

  while (true) {

    c = cin.get();

    if (c == '\n') {

      cout << dp[i][5] << endl;

      return 0;

    }

    if (c =='?') { // 現在のkの状態、0~12が考えられる状態から、j(0〜9)が入ってきたときの遷移をする。

      for (int j = 0; j < 10; j++) {

        for (int k = 0; k < 13; k++) {

          dp[i + 1][(k * 10 + j) % 13] += dp[i][k];

          dp[i + 1][(k * 10 + j) % 13] %= mod;

        }

      }

    } else { // 現在のkの状態、0~12が考えられる状態から、numが入ってきたときの遷移をする。

      int num = c - '0';

      for (int k = 0; k < 13; k++) {

        dp[i + 1][(k * 10 + num) % 13] += dp[i][k];

        dp[i + 1][(k * 10 + num) % 13] %= mod;

      }

    }

    i++;

  }

  return 0;

}

// Faster C++ solution for the same problem (measured speedup: 6.392843839965025x):
#include <iostream>

#include <stdio.h>

#include <vector>

#include <cmath>

#include <algorithm>

#include <string>

#include <queue>

#include <stack>

#include <functional>

#include <list>

#include <utility>

#include <map>

#include <vector>

using namespace std;



typedef long long ll;

#define rep(i,n) for(int i=0;i<n;i++)

#define rep1(i,x) for(int i=1;i<=x;i++)

#define rrep(i,x) for(int i=x-1;i>=0;i--)

#define rrep1(i,x) for(int i=x;i>0;i--)

#define sor(v) sort(v.begin(),v.end())

#define rev(s) reverse(s.begin(),s.end())

#define lb(vec,a) lower_bound(vec.begin(),vec.end(),a)

#define ub(vec,a) upper_bound(vec.begin(),vec.end(),a)

#define mp1(a,b,c) P1(a,P(b,c))

#define get_arsize(a) (sizeof(a)/sizeof(a[0]))

const ll mod = 1000000007;

const double eps = 1e-10;

const int MAX = 200000;



int main() {

  // three patterns

  char c;

  // 今回見ていたあまりが*10されて、次の1桁目がくっついて、13で割ったあまりの場合の数になる。

  // "非決定性有限オートマトンの場合は、ノードの長さだけの配列を用意しておいて、各配列の要素がそのターンにその配列を踏む場合の数"

  // 2次元配列が使える(高々数MB)

  int dp[13] = {};

  int tmp[13] = {};

  // 読み取り0文字目のとき、0とみなす。

  // 13で割ったあまりが0となる場合の数が1で、他は0。

  dp[0] = 1;

  int i = 0;

  while (true) {

    c = cin.get();

    if (c == '\n') {

      cout << dp[5] << endl;

      return 0;

    }

    rep(k,13) {

      tmp[k] = dp[k];

      dp[k] = 0;

    }

    if (c =='?') { // 現在のkの状態、0~12が考えられる状態から、j(0〜9)が入ってきたときの遷移をする。

      rep(k,13) {

        rep(j,10) {

          dp[(k * 10 + j) % 13] += tmp[k];

          dp[(k * 10 + j) % 13] %= mod;

        }

      }

    } else { // 現在のkの状態、0~12が考えられる状態から、numが入ってきたときの遷移をする。

      int num = c - '0';

      rep(k,13) {

        dp[(k * 10 + num) % 13] += tmp[k];

        dp[(k * 10 + num) % 13] %= mod;

      }

    }

    i++;

  }

  return 0;

}