#include <bits/stdc++.h>
using namespace std;
inline long long in() {
  int32_t x;
  scanf("%d", &x);
  return x;
}
inline long long lin() {
  long long x;
  scanf("%lld", &x);
  return x;
}
const long long maxn = 2e5 + 10;
const long long mod = 1e9 + 7;
const long long infll = 1e18 + 10;
const long long inf = 1e9;
const long long SQ = 317 + 10;
struct matrix {
  long long a[130][130];
  long long N;
  matrix(long long v = 0, long long n = 0) {
    N = n;
    for (long long i = 0; i < n; i++)
      for (long long j = 0; j < n; j++) a[i][j] = i == j ? v : 0;
  }
  inline long long *operator[](const long long &x) { return a[x]; }
};
inline matrix operator*(matrix &a, matrix &b) {
  matrix ret(0, a.N);
  ret.N = a.N;
  for (long long i = 0; i < a.N; i++)
    for (long long k = 0; k < a.N; k++)
      for (long long j = 0; j < a.N; j++)
        (ret[i][j] += a[i][k] * b[k][j]) %= mod;
  return ret;
}
inline matrix operator^(matrix &a, long long tm) {
  matrix ret(1, a.N);
  ret.N = a.N;
  while (tm) {
    if (tm % 2) ret = ret * a;
    a = a * a;
    tm /= 2;
  }
  return ret;
}
long long ans[256], a[10], tmpAns[256];
int32_t main() {
  ans[1] = 1;
  for (long long i = 1; i <= 7; i++) {
    a[i] = in();
    matrix BLOCK(0, (1 << i));
    for (long long Right = 0; Right < (1 << i); Right++)
      for (long long Left = 0; Left < (1 << i); Left++) {
        for (long long Middle = 0; Middle < (1 << (i - 1)); Middle++) {
          bool ok = true;
          long long realMiddle = (((1 << (i - 1)) | Middle) << 1) | 1;
          for (long long j = 0; j < i && ok; j++) {
            if ((Left >> j & 1) && (Right >> j & 1) && (realMiddle >> j & 1) &&
                (realMiddle >> (j + 1) & 1))
              ok = false;
          }
          if (ok) BLOCK[Left][Right]++;
        }
      }
    BLOCK = BLOCK ^ a[i];
    for (long long j = 0; j < (1 << i); j++) tmpAns[j] = 0;
    for (long long j = 0; j < (1 << i); j++)
      for (long long k = 0; k < (1 << i); k++)
        tmpAns[j] = (tmpAns[j] + 1LL * ans[k] * BLOCK[k][j]) % mod;
    for (long long j = 0; j < (1 << i); j++) ans[j] = 0;
    for (long long j = 0; j < (1 << i); j++) ans[j | (1 << i)] = tmpAns[j];
  }
  cout << ans[(1 << 8) - 1] << "\n";
}
