#include <bits/stdc++.h>
using namespace std;
const int SN = 130;
const long long MOD = 1e9 + 7;
struct mat {
  int a[SN][SN], n, m;
  void init(int n, int m) {
    this->n = n, this->m = m;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= m; j++) a[i][j] = 0;
  }
  void init_e(int n) {
    this->n = this->m = n;
    for (int i = 1; i <= n; i++)
      for (int j = 1; j <= n; j++) a[i][j] = i == j;
  }
};
mat operator*(const mat& a, const mat& b) {
  mat ret;
  ret.init(a.n, b.m);
  for (int i = 1; i <= ret.n; i++) {
    for (int j = 1; j <= ret.m; j++) {
      long long tmp = 0;
      for (int k = 1; k <= a.m; k++) {
        tmp += 1ll * a.a[i][k] * b.a[k][j];
        tmp %= MOD;
      }
      ret.a[i][j] = tmp;
    }
  }
  return ret;
}
mat power(const mat& d, int k) {
  mat ret;
  ret.init_e(d.n);
  for (int i = 20; i >= 0; i--) {
    ret = ret * ret;
    if (k & (1 << i)) ret = ret * d;
  }
  return ret;
}
int WEI[10];
long long g[1 << 8];
int cal_ways(int s0, int s1, int i) {
  int cnt = 0;
  for (int s = 0; s < (1 << (i - 1)); s++) {
    int ts = (s << 1) | 1 | (1 << i);
    bool ok = true;
    for (int k = 0; k < i; k++) {
      if ((s0 & (1 << k)) && (s1 & (1 << k)) && (ts & (1 << k)) &&
          (ts & (1 << (k + 1)))) {
        ok = false;
        break;
      }
    }
    cnt += ok;
  }
  return cnt;
}
int main() {
  for (int i = 1; i <= 7; i++) scanf("%d", &WEI[i]);
  g[0] = 1;
  for (int i = 1; i <= 7; i++) {
    static mat U, F, A;
    U.init(1 << i, 1 << i), F.init(1 << i, 1);
    for (int s = 0; s < (1 << (i - 1)); s++) {
      int ts = s | (1 << (i - 1));
      F.a[ts + 1][1] = g[s];
    }
    for (int s0 = 0; s0 < (1 << i); s0++) {
      for (int s1 = 0; s1 < (1 << i); s1++) {
        int ways = cal_ways(s0, s1, i);
        U.a[s1 + 1][s0 + 1] = ways;
      }
    }
    A = power(U, WEI[i]) * F;
    for (int s = 0; s < (1 << i); s++) {
      g[s] = A.a[s + 1][1];
    }
  }
  int ans = g[(1 << 7) - 1];
  printf("%d\n", ans);
  return 0;
}
