#include <bits/stdc++.h>
using namespace std;
template <typename T, typename U>
inline void smin(T &a, U b) {
  if (a > b) a = b;
}
template <typename T, typename U>
inline void smax(T &a, U b) {
  if (a < b) a = b;
}
int can(int n, int st1, int st2, int st) {
  for (int i = 0; i < n; i++) {
    if ((((st1) >> (i)) & 1) && (((st2) >> (i)) & 1) && (((st) >> (i)) & 1) &&
        (((st) >> (i + 1)) & 1))
      return 0;
  }
  return 1;
}
long long tp[1 << 7][1 << 7];
void multi(int a[1 << 7][1 << 7], int b[1 << 7][1 << 7], int c[1 << 7][1 << 7],
           int MM) {
  for (int i = 0; i < MM; i++)
    for (int j = 0; j < MM; j++) {
      for (int k = tp[i][j] = 0; k < MM; k++) {
        tp[i][j] += (long long)a[i][k] * b[k][j] % 1000000007;
      }
    }
  for (int i = 0; i < MM; i++)
    for (int j = 0; j < MM; j++) c[i][j] = tp[i][j] % 1000000007;
}
int ok;
int ans[1 << 7][1 << 7], mat[8][1 << 7][1 << 7];
void power(int a[1 << 7][1 << 7], int n, int MM) {
  if (n == 0) {
    for (int i = 0; i < MM; i++)
      for (int j = 0; j < MM; j++) a[i][j] = i == j;
    return;
  }
  if (n == 1) {
    for (int i = 0; i < MM; i++)
      for (int j = 0; j < MM; j++) a[i][j] = mat[ok][i][j];
    return;
  }
  int b[1 << 7][1 << 7];
  power(b, n / 2, MM);
  multi(b, b, a, MM);
  if (n & 1) multi(a, mat[ok], a, MM);
}
int tmp[1 << 7][1 << 7], tmp1[1 << 7][1 << 7];
int main() {
  for (int i = 1; i < 8; i++) {
    for (int j = 0; j < 1 << i; j++) {
      for (int k = 0; k < 1 << i; k++) {
        for (int ii = 0; ii < 1 << i; ii++) {
          if (~ii & 1) continue;
          mat[i][j][k] += can(i, j, k, ii + (1 << i));
        }
      }
    }
    for (int j = 1 << i; j < 1 << 7; j++) mat[i][j][j] = 1;
  }
  int w[8];
  for (int i = 0; i < 7; i++) scanf("%d", w + i);
  int pre = 0, t = 8;
  for (int i = 0; i < 1 << 7; i++)
    for (int j = 0; j < 1 << 7; j++) ans[i][j] = i == j;
  for (int i = 0; i < 7; i++)
    if (w[i]) {
      ok = i + 1;
      power(tmp, w[i] - 1, (1 << i + 1));
      memcpy(tmp1, mat[i + 1], sizeof(mat[i + 1]));
      if (pre)
        for (int j = 0; j < 1 << 7; j++)
          for (int k = 0; k < 1 << 7; k++) {
            int mm = (1 << i + 1) - (1 << pre);
            if ((j & mm) != mm) tmp1[j][k] = 0;
          }
      for (int j = 0; j < 1 << 7; j++)
        for (int k = 0; k < 1 << 7; k++) {
          int mm = (1 << i + 1) - (1 << pre);
          if ((k & mm) == mm) ans[j][k] = ans[j][k - mm];
        }
      for (int j = 0; j < 1 << 7; j++)
        for (int k = 0; k < 1 << 7; k++) {
          int mm = (1 << i + 1) - (1 << pre);
          if ((k & mm) != mm) ans[j][k] = 0;
        }
      multi(tmp1, tmp, tmp1, 1 << i + 1);
      multi(ans, tmp1, ans, 1 << i + 1);
      pre = i + 1;
    }
  cout << ans[0][(1 << pre) - 1] << endl;
  return 0;
}
