You are given two integers n and m. Calculate the number of pairs of arrays (a, b) such that:

  * the length of both arrays is equal to m; 
  * each element of each array is an integer between 1 and n (inclusive); 
  * a_i ≤ b_i for any index i from 1 to m; 
  * array a is sorted in non-descending order; 
  * array b is sorted in non-ascending order. 



As the result can be very large, you should print it modulo 10^9+7.

Input

The only line contains two integers n and m (1 ≤ n ≤ 1000, 1 ≤ m ≤ 10).

Output

Print one integer – the number of arrays a and b satisfying the conditions described above modulo 10^9+7.

Examples

Input


2 2


Output


5


Input


10 1


Output


55


Input


723 9


Output


157557417

Note

In the first test there are 5 suitable arrays: 

  * a = [1, 1], b = [2, 2]; 
  * a = [1, 2], b = [2, 2]; 
  * a = [2, 2], b = [2, 2]; 
  * a = [1, 1], b = [2, 1]; 
  * a = [1, 1], b = [1, 1]. 
#include <bits/stdc++.h>
using namespace std;
const long long llINF = 1e18, llMOD = 1e9 + 7;
const int INF = 2e9, MOD = 1e9 + 7, P = 179, N = 1e6 + 1, K = 23000, L = 18;
const long double EPS = 1e-6, ldINF = 1e18, PI = acos(-1);
template <typename T>
inline void sort_uniq(vector<T>& v) {
  sort(v.begin(), v.end());
  v.resize(unique(v.begin(), v.end()) - v.begin());
}
template <typename T>
inline int sign(T a) {
  if (a > 0) return 1;
  if (a == 0) return 0;
  return -1;
}
template <typename T, typename P>
bool eq(T a, P b) {
  return abs(a - b) <= EPS;
}
const char sep[] = " ";
template <typename T, typename P>
istream& operator>>(istream& in, pair<T, P>& p) {
  in >> p.first >> p.second;
  return in;
}
template <typename T>
void in_seg(istream& in, T* dst_begin, T* dst_end) {
  while (dst_begin != dst_end) {
    in >> (*dst_begin);
    ++dst_begin;
  }
}
template <typename T>
istream& operator>>(istream& in, vector<T>& v) {
  for (T& i : v) in >> i;
  return in;
}
template <typename T, typename P>
ostream& operator<<(ostream& out, pair<T, P> const& p) {
  out << p.first << ' ' << p.second;
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, vector<T> const& v) {
  for (T const& i : v) out << i << sep;
  if (!v.empty()) out << '\n';
  return out;
}
template <typename T>
ostream& operator<<(ostream& out, vector<vector<T>> const& v) {
  for (vector<T> const& i : v) out << i;
  return out;
}
void set_precision(ostream& out, int val) {
  out.setf(out.fixed, out.floatfield);
  out.precision(val);
}
int sum(int a, int b) {
  a += b;
  if (a >= MOD) a -= MOD;
  return a;
}
int mul(long long a, long long b) {
  a *= b;
  if (a >= MOD) a %= MOD;
  return a;
}
int main() {
  int n, m;
  cin >> n >> m;
  vector<vector<int>> dp_a(2, vector<int>(n + 1)), dp_b(2, vector<int>(n + 1));
  for (int i = 1; i <= n; i++) dp_a[0][i] = dp_b[0][i] = 1;
  for (int len = 1; len < m; len++) {
    for (int i = 1; i <= n; i++) {
      dp_a[1][i] = dp_a[0][i];
      if (i > 1) dp_a[1][i] = sum(dp_a[1][i], dp_a[1][i - 1]);
    }
    for (int i = n; i >= 1; i--) {
      dp_b[1][i] = dp_b[0][i];
      if (i < n) dp_b[1][i] = sum(dp_b[1][i], dp_b[1][i + 1]);
    }
    dp_a[1].swap(dp_a[0]);
    dp_b[1].swap(dp_b[0]);
    for (int i = 1; i <= n; i++) dp_a[1][i] = dp_b[1][i] = 0;
  }
  int ans = 0;
  for (int i = 1; i <= n; i++)
    for (int j = i; j <= n; j++) ans = sum(ans, mul(dp_a[0][i], dp_b[0][j]));
  cout << ans << '\n';
}
