#include <bits/stdc++.h>
using namespace std;
const int s = 7, maxn = 150, mod = 1e9 + 7;
int w[s], ans = 0;
int mat[maxn], trans[s][maxn][maxn];
inline int getbit(int x, int k) { return (x >> k) & 1; }
bool judg(int l, int x, int y, int k) {
  int i;
  k <<= 1, k |= 1, k |= 1 << l;
  for (i = 0; i < l; i++)
    if (getbit(x, i) && getbit(y, i) && getbit(k, i) && getbit(k, i + 1))
      return 0;
  return 1;
}
void get_trans(int x) {
  int i, j, k, st = 1 << (x + 1);
  for (i = 0; i < st; i++)
    for (j = 0; j < st; j++)
      for (k = 0; k < (st >> 1); k++) trans[x][i][j] += judg(x + 1, i, j, k);
}
void Mul(int *ma1, int *ma2, int *ret, int a, int b, int c) {
  int i, j, k, ret0[maxn][maxn] = {0};
  for (i = 0; i < a; i++)
    for (j = 0; j < c; j++)
      for (k = 0; k < b; k++)
        ret0[i][j] =
            (ret0[i][j] + 1LL * ma1[i * maxn + k] * ma2[k * maxn + j]) % mod;
  for (i = 0; i < a; i++)
    for (j = 0; j < c; j++) ret[i * maxn + j] = ret0[i][j];
}
void Pow(int *ma, int k, int a) {
  int i, j, ret0[maxn][maxn] = {0};
  for (i = 0; i < a; i++) ret0[i][i] = 1;
  for (; k; k >>= 1, Mul(ma, ma, ma, a, a, a))
    if (k & 1) Mul((int *)ret0, ma, (int *)ret0, a, a, a);
  for (i = 0; i < a; i++)
    for (j = 0; j < a; j++) ma[i * maxn + j] = ret0[i][j];
}
int main() {
  int i, j, st;
  for (i = 0; i < s; i++) get_trans(i);
  mat[0] = 1;
  for (i = 0, st = 1; i < s; i++) {
    for (j = 0; j < st; j++) mat[j + st] = mat[j], mat[j] = 0;
    st <<= 1;
    scanf("%d", &w[i]);
    Pow((int *)trans[i], w[i], st);
    Mul(mat, (int *)trans[i], mat, 1, st, st);
  }
  ans = mat[st - 1];
  printf("%d\n", ans);
  return 0;
}
