#include<bits/stdc++.h>
#define INF 1000010000
#define nl '\n'
#define pb push_back
#define ppb pop_back
#define mp make_pair
#define fi first
#define se second
#define pii pair<int,int>
#define pdd pair<double,double>
#define all(c) (c).begin(), (c).end()
#define SORT(c) sort(all(c))
#define sz(c) (c).size()
#define rep(i,n) for( int i = 0; i < n; ++i )
#define repi(i,n) for( int i = 1 ; i <= n; ++i )
#define repn(i,n) for( int i = n - 1 ; i >= 0 ; --i )
#define repf(j,i,n) for( int j = i ; j < n ; ++j )
#define die(s) {std::cout << s << nl;}
#define dier(s) {std::cout << s; return 0;}
#define vi vector<int>
typedef long long ll;
#define MOD 1000000007
using namespace std;
ll solve1(int n , int m){
int p = 0;
ll ans = 1;
if(m > n)return 0;
int l = n + m;
rep(i , l){
if(p == 0 && n > 0){
ans = (ans * n) % MOD;
p ^= 1;
--n;
}else if(p == 1 && m > 0){
ans = (ans * m) % MOD;
p ^= 1;
--m;
}else{
return 0;
}
}
return ans;
}
int main() {
ios_base::sync_with_stdio(false);
cin.tie(NULL);
cout.precision(0);
int n , m;
cin >> n >> m;
ll ans = 0;
ans += solve1(n , m) % MOD;
ans += solve1(m , n) % MOD;
ans %= MOD;
while(ans < 0)ans += MOD;
cout << ans;
return 0;
}
I2luY2x1ZGU8Yml0cy9zdGRjKysuaD4KCiNkZWZpbmUgSU5GIDEwMDAwMTAwMDAKI2RlZmluZSBubCAnXG4nCiNkZWZpbmUgcGIgcHVzaF9iYWNrCiNkZWZpbmUgcHBiIHBvcF9iYWNrCiNkZWZpbmUgbXAgbWFrZV9wYWlyCiNkZWZpbmUgZmkgZmlyc3QKI2RlZmluZSBzZSBzZWNvbmQKI2RlZmluZSBwaWkgcGFpcjxpbnQsaW50PgojZGVmaW5lIHBkZCBwYWlyPGRvdWJsZSxkb3VibGU+CiNkZWZpbmUgYWxsKGMpIChjKS5iZWdpbigpLCAoYykuZW5kKCkKI2RlZmluZSBTT1JUKGMpIHNvcnQoYWxsKGMpKQojZGVmaW5lIHN6KGMpIChjKS5zaXplKCkKI2RlZmluZSByZXAoaSxuKSBmb3IoIGludCBpID0gMDsgaSA8IG47ICsraSApCiNkZWZpbmUgcmVwaShpLG4pIGZvciggaW50IGkgPSAxIDsgaSA8PSBuOyArK2kgKQojZGVmaW5lIHJlcG4oaSxuKSBmb3IoIGludCBpID0gbiAtIDEgOyBpID49IDAgOyAtLWkgKQojZGVmaW5lIHJlcGYoaixpLG4pIGZvciggaW50IGogPSBpIDsgaiA8IG4gOyArK2ogKQojZGVmaW5lIGRpZShzKSB7c3RkOjpjb3V0IDw8IHMgPDwgbmw7fQojZGVmaW5lIGRpZXIocykge3N0ZDo6Y291dCA8PCBzOyByZXR1cm4gMDt9CiNkZWZpbmUgdmkgdmVjdG9yPGludD4KdHlwZWRlZiBsb25nIGxvbmcgbGw7CiNkZWZpbmUgTU9EIDEwMDAwMDAwMDcKdXNpbmcgbmFtZXNwYWNlIHN0ZDsKCgpsbCBzb2x2ZTEoaW50IG4gLCBpbnQgbSl7CglpbnQgcCA9IDA7CglsbCBhbnMgPSAxOwoJaWYobSA+IG4pcmV0dXJuIDA7CglpbnQgbCA9IG4gKyBtOwoJcmVwKGkgLCBsKXsKCQlpZihwID09IDAgJiYgbiA+IDApewoJCQlhbnMgPSAoYW5zICogbikgJSBNT0Q7CgkJCXAgXj0gMTsKCQkJLS1uOwoJCX1lbHNlIGlmKHAgPT0gMSAmJiBtID4gMCl7CgkJCWFucyA9IChhbnMgKiBtKSAlIE1PRDsKCQkJcCBePSAxOwoJCQktLW07CgkJfWVsc2V7CgkJCXJldHVybiAwOwoJCX0KCX0KCXJldHVybiBhbnM7Cn0KCmludCBtYWluKCkgewoJaW9zX2Jhc2U6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CgljaW4udGllKE5VTEwpOwoJY291dC5wcmVjaXNpb24oMCk7IAoKCWludCBuICwgbTsKCWNpbiA+PiBuID4+IG07CgkKCWxsIGFucyA9IDA7CgkKCWFucyArPSBzb2x2ZTEobiAsIG0pICUgTU9EOwoJYW5zICs9IHNvbHZlMShtICwgbikgJSBNT0Q7CglhbnMgJT0gTU9EOwoJd2hpbGUoYW5zIDwgMClhbnMgKz0gTU9EOwoJY291dCA8PCBhbnM7CgkKCQoJCgoJcmV0dXJuIDA7Cn0=