#include <bits/stdc++.h>
using namespace std;
namespace orz {
const int N = 22;
const long long MOD = 1000000007;
long long sum = 0, color[N], inv[N];
int cnt[(1 << N) + 1];
inline long long read() {
  long long a = 1, b = 0;
  char t;
  do {
    t = getchar();
    if (t == '-') a = -1;
  } while (t > '9' || t < '0');
  do {
    b = b * 10 - '0' + t;
    t = getchar();
  } while (t >= '0' && t <= '9');
  return a * b;
}
inline long long pow(long long x, long long y) {
  long long ans = 1;
  while (y) {
    if (y & 1) ans = (ans * x) % MOD;
    x = x * x % MOD;
    y >>= 1;
  }
  return ans % MOD;
}
inline long long C(long long n, long long m) {
  if (n < m) return 0;
  long long res = 1;
  for (long long i = n; i > n - m; --i) res = res * i % MOD;
  return res * inv[m] % MOD;
}
long long lucas(long long n, long long m) {
  if (!m) return 1;
  return C(n % MOD, m % MOD) * lucas(n / MOD, m / MOD) % MOD;
}
inline long long CNT(int n, long long s) {
  int m = 1 << n;
  long long t = 0, ans = 0;
  for (int i = 1; i < m; ++i) cnt[i] = cnt[i >> 1] + (i & 1);
  ans = (lucas(s + n - 1, n - 1));
  for (int i = 1; i < m; ++i) {
    t = 0;
    for (int j = 1; j <= n; ++j)
      if ((i >> (j - 1)) & 1) t += color[j];
    t += cnt[i];
    if (t > s) continue;
    switch (cnt[i] & 1) {
      case 1:
        ans = (ans - lucas(s - t + n - 1, n - 1)) % MOD;
        break;
      case 0:
        ans = (ans + lucas(s - t + n - 1, n - 1)) % MOD;
        break;
    }
  }
  return (ans + MOD) % MOD;
}
int QAQ() {
  int n = read();
  long long s = read(), res = 1;
  for (int i = 1; i <= n; ++i) res = res * i % MOD, inv[i] = pow(res, MOD - 2);
  for (int i = 1; i <= n; ++i) color[i] = read();
  cout << CNT(n, s);
  return false;
}
}  // namespace orz
int main() { return orz::QAQ(); }
