#include <bits/stdc++.h>
using namespace std;
void fre() {
  freopen("c://test//input.in", "r", stdin);
  freopen("c://test//output.out", "w", stdout);
}
template <class T1, class T2>
inline void gmax(T1 &a, T2 b) {
  if (b > a) a = b;
}
template <class T1, class T2>
inline void gmin(T1 &a, T2 b) {
  if (b < a) a = b;
}
const int N = 0, M = 0, Z = 1e9 + 7, ms63 = 0x3f3f3f3f;
int n;
long long m;
long long a[20];
long long mul(long long x, int p) {
  long long y = 1;
  while (p) {
    if (p & 1) y = y * x % Z;
    x = x * x % Z;
    p >>= 1;
  }
  return y;
}
long long C(long long n, long long m) {
  long long top = 1;
  for (long long i = n; i > n - m; --i) top = top * (i % Z) % Z;
  long long bot = 1;
  for (long long i = 1; i <= m; ++i) bot = bot * i % Z;
  return top * mul(bot, Z - 2) % Z;
}
long long lucas(long long n, long long m) {
  if (n < m) return 0;
  if (n < Z && m < Z)
    return C(n, m);
  else
    return lucas(n / Z, m / Z) * lucas(n % Z, m % Z) % Z;
}
void add(long long &x, long long y) { x = (x + y + Z) % Z; }
int main() {
  while (~scanf("%d%lld", &n, &m)) {
    for (int i = 0; i < n; ++i) scanf("%lld", &a[i]);
    int top = 1 << n;
    long long ans = 0;
    for (int i = 0; i < top; ++i) {
      long long sum = m;
      int sig = 1;
      for (int j = 0; j < n; ++j)
        if (i & 1 << j) {
          sum -= a[j] + 1;
          sig = -sig;
        }
      if (sum < 0) continue;
      add(ans, sig * C(sum + n - 1, n - 1));
    }
    printf("%lld\n", ans);
  }
  return 0;
}
