#include <bits/stdc++.h>

#pragma GCC target("avx")
#pragma GCC optimize("O3")
#pragma GCC optimize("unroll-loops")

#define all(obj) obj.begin(), obj.end()
#define rep(i, n) for (ll i = 0, i##_len = (n); i < i##_len; ++i)

using namespace std;

using ll = long long;
using ld = long double;

template <class T>
using vec = vector<T>;
template <class T>
using vec2 = vector<vec<T>>;
template <class T>
using vec3 = vector<vec2<T>>;

constexpr int INF = numeric_limits<int>::max();
constexpr ll INFL = numeric_limits<ll>::max();
constexpr ll MOD = 1000000007; // 10^9+7

/*****/

/* 
    ModInt
*/
template <int mod>
struct ModInt
{
    int val;
    ModInt() : val(0) {}
    ModInt(long long x) : val(x >= 0 ? x % mod : (mod - (-x) % mod) % mod) {}
    int getmod() { return mod; }
    ModInt &operator+=(const ModInt &p)
    {
        if ((val += p.val) >= mod)
        {
            val -= mod;
        }
        return *this;
    }
    ModInt &operator-=(const ModInt &p)
    {
        if ((val += mod - p.val) >= mod)
        {
            val -= mod;
        }
        return *this;
    }
    ModInt &operator*=(const ModInt &p)
    {
        val = (int)(1LL * val * p.val % mod);
        return *this;
    }
    ModInt &operator/=(const ModInt &p)
    {
        *this *= p.inverse();
        return *this;
    }
    ModInt operator-() const { return ModInt(-val); }
    ModInt operator+(const ModInt &p) const { return ModInt(*this) += p; }
    ModInt operator-(const ModInt &p) const { return ModInt(*this) -= p; }
    ModInt operator*(const ModInt &p) const { return ModInt(*this) *= p; }
    ModInt operator/(const ModInt &p) const { return ModInt(*this) /= p; }
    bool operator==(const ModInt &p) const { return val == p.val; }
    bool operator!=(const ModInt &p) const { return val != p.val; }
    ModInt inverse() const
    {
        int a = val, b = mod, u = 1, v = 0, t;
        while (b > 0)
        {
            t = a / b;
            swap(a -= t * b, b);
            swap(u -= t * v, v);
        }
        return ModInt(u);
    }
    ModInt pow(long long n) const
    {
        ModInt ret(1), mul(val);
        while (n > 0)
        {
            if (n & 1)
                ret *= mul;
            mul *= mul;
            n >>= 1;
        }
        return ret;
    }
    friend ostream &operator<<(ostream &os, const ModInt &p) { return os << p.val; }
    friend istream &operator>>(istream &is, ModInt &a)
    {
        long long t;
        is >> t;
        a = ModInt<mod>(t);
        return (is);
    }
    static int get_mod() { return mod; }
};

/* 
    Comb：ModIntで二項係数を計算する構造体
    前処理：O(n)
    二項係数の計算：O(1)
*/
template <class T>
struct Comb
{
    vector<T> fact_, fact_inv_, inv_;
    Comb() {}
    Comb(int SIZE) : fact_(SIZE, 1), fact_inv_(SIZE, 1), inv_(SIZE, 1) { init(SIZE); }
    void init(int SIZE)
    {
        fact_.assign(SIZE, 1), fact_inv_.assign(SIZE, 1), inv_.assign(SIZE, 1);
        int MOD = fact_[0].getmod();
        for (int i = 2; i < SIZE; i++)
        {
            fact_[i] = fact_[i - 1] * i;
            inv_[i] = -inv_[MOD % i] * (MOD / i);
            fact_inv_[i] = fact_inv_[i - 1] * inv_[i];
        }
    }
    T nCk(int n, int k)
    {
        assert(!(n < k));
        assert(!(n < 0 || k < 0));
        return fact_[n] * fact_inv_[k] * fact_inv_[n - k];
    }
    T nHk(int n, int k)
    {
        assert(!(n < 0 || k < 0));
        return nCk(n + k - 1, k);
    }
    T fact(int n)
    {
        assert(!(n < 0));
        return fact_[n];
    }
    T fact_inv(int n)
    {
        assert(!(n < 0));
        return fact_inv_[n];
    }
    T inv(int n)
    {
        assert(!(n < 0));
        return inv_[n];
    }
};

/*****/

using modint = ModInt<MOD>;
Comb<modint> comb(1000000);

int main()
{
    ll N, K;
    cin >> N >> K;

    K = min(K, N - 1);

    modint ret = 0;
    rep(i, K + 1)
    {
        ret += comb.nCk(N, i) * comb.nHk(N - i, i);
    }

    cout << ret << endl;

    return 0;
}


Measured memory_bytes: 14956