#include <bits/stdc++.h>
using namespace std;
const unsigned long long MOD = 1e9 + 7;
struct matr {
  unsigned long long mat[128][128];
  matr() { memset(mat, 0, sizeof mat); }
  void I() {
    for (int i = 0; i < 128; i++) {
      mat[i][i] = 1;
    }
  }
  matr operator*(matr &a) const {
    matr nw;
    for (int i = 0; i < 128; i++) {
      for (int j = 0; j < 128; j++) {
        unsigned long long tmp = 0;
        for (int k = 0; k < 128; k++) {
          tmp += mat[i][k] * a.mat[k][j];
          if ((k & 7) == 0) tmp %= MOD;
        }
        nw.mat[i][j] = tmp % MOD;
      }
    }
    return nw;
  }
};
int w[10];
matr nxt;
matr quickpow(int times) {
  matr tmp;
  tmp.I();
  while (times) {
    if (times & 1) tmp = tmp * nxt;
    nxt = nxt * nxt;
    times >>= 1;
  }
  return tmp;
}
int cou[1 << 8][1 << 8];
int main() {
  for (int i = 0; i < 7; i++) cin >> w[i];
  matr dp;
  dp.mat[0][1] = 1;
  for (int i = 0; i < (1 << 8); i++) {
    for (int j = 0; j < (1 << 8); j++) {
      bool flag = 1;
      for (int k = 0; k < 8; k++) {
        if ((i & j & (1 << k)) && (j & (1 << (k + 1)))) {
          flag = 0;
          break;
        }
      }
      cou[i][j] = flag;
    }
  }
  for (int i = 0; i < 7; i++) {
    nxt = matr();
    for (int j1 = 0; j1 < (1 << (i + 1)); j1++) {
      for (int j2 = 0; j2 < (1 << (i + 1)); j2++) {
        for (int j3 = 0; j3 < (1 << i); j3++) {
          int nj3 = (j3 << 1) | (1 << (i + 1)) | 1;
          nxt.mat[j1][j2] += cou[j1 & j2][nj3];
        }
      }
    }
    matr ndp;
    for (int j = 0; j < (1 << (i)); j++) {
      ndp.mat[0][j | (1 << (i))] = dp.mat[0][j];
    }
    if (i) dp = ndp;
    matr tmp = quickpow(w[i]);
    dp = dp * tmp;
  }
  cout << dp.mat[0][(1 << 7) - 1];
}
