#include <string>
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
//typedef pair<long long,long long> P;
//typedef pair<long long,P> P1;
//typedef pair<P,P> P2;
#define pu push
#define pb push_back
#define mp make_pair
#define eps 1e-7
#define INF 1000000000
#define mod 1000000007
#define fi first
#define se second
#define rep(i,x) for(long long i=0;i<x;i++)
#define repn(i,x) for(long long i=1;i<=x;i++)
#define rrep(i,x) for(long long i=x-1;i>=0;i--)
#define rrepn(i,x) for(long long i=x;i>1;i--)
#define SORT(x) sort(x.begin(),x.end())
#define ERASE(x) x.erase(unique(x.begin(),x.end()),x.end())
#define POSL(x,v) (lower_bound(x.begin(),x.end(),v)-x.begin())
#define POSU(x,v) (upper_bound(x.begin(),x.end(),v)-x.begin())
long long n,h[100005];
ll dp[100005];
#define ALL(v)  (v).begin(),(v).end()
//#define MAX(a,b) if(a>b)
#define MAX(a,b) (((a)>(b))?(a):(b))
#define MIN(a,b) (((a)<(b))?(a):(b))

#define DEBUG
#define pr printf
#define re return
#define CASET int ___T, case_n = 1; scanf("%d ", &___T); while (___T-- > 0)


int GCD(int a, int b) { return b ? GCD(b, a%b) : a; }

stack<long long> sta;   
queue<long long> que;
deque<long long> dque;

set <string> s_set;

int vis[200001];

//最大公約数
int gcd(int x, int y) { return y ? gcd(y, x % y) : x; }
//最小公倍数
int lcm(int x, int y) { return x / gcd(x, y) * y; }
//最大公約数 複数個
int gcd(const vector<int> &v) {
	int ret = v[0];
	for (int i = 1; i < v.size(); i++)
		ret = gcd(ret, v[i]);
	return ret;
}
//最小公倍数 複数個
int lcm(const vector<int> &v) {
	int ret = v[0];
	for (int i = 1; i < v.size(); i++)
		ret = lcm(ret, v[i]);
	return ret;
}

struct Student {
  string name;
  int no, point;
};

// a < b ならtrueを返す
bool comp(const Student& a, const Student& b) {
  if (a.name != b.name)
    return a.name < b.name; // 高い順に並べたいので演算子を逆に
  if (a.point != b.point)
    return a.point > b.point; // 同様に比較演算子を反転
  return a.no < b.no;
}

std::string replaceOtherStr(std::string &replacedStr, std::string from, std::string to) {
    const unsigned int pos = replacedStr.find(from);
    const int len = from.length();
 
    if (pos == std::string::npos || from.empty()) {
        return replacedStr;
    }
 
    return replacedStr.replace(pos, len, to);
}


//	素因数分解
void countPN(int n, std::vector<int> &count)//nを素因数に分解し、countを更新
{
	int m = n;
	for(int i=2 ; i*i<=n ; ++i)
	{
		while(m%i == 0)
		{
			m /= i;
			count[i]++;
		}
		if(m==1) break;
	}
	if(m!=1) count[m]++;

}

int main(){
	
	long long A,B,C,D,E,F,G,H,I,J,L,N,M,K,O,P,Q,R,S,T,U,V,W,X,Y,Z;
	long long sum,sum1,sum2,sum3,sum4;
	sum=sum1=sum2=sum3=sum4=0;
	long long flg,flg1,flg2,flg3,cnt,cnt1,cnt2,cnt3,cnt4;
	flg=flg1=flg2=flg3=cnt=cnt1=cnt2=cnt3=cnt4=0;
	long long max;
	long long max1;
	max=max1=0;
	long long min;
	long long min1;
	min=min1=INF;
	long long wk,wk1,wk2,wk3,wk4;
	wk=wk1=wk2=wk3=wk4=0;
    bool f;
	ll ans=0;
	
	
	//**************************こどふぉ用(#575 Div.3 B) ******************************************
	/*
	cin >> T;
	while(T--){
		cin >> N >> K;
		v.clear();
		for(int i=1;i<=N;i++){
			cin >> a[i];
			if(a[i]%2==1) v.pb(i);
		}
		if(v.size()<K || v.size()-(K-1)%2==0) cout << "NO\n";
		else{
			cout << "YES\n";
			for(int i=0;i<K-1;i++){
				cout << v[i] << " ";
			}
			cout << N << "\n";
		}
	}
	*/
	
	//**************************ここからスタート******************************************
	//std::cin >> N;
	//std::cin >> N >> M;
	//std::cin >> N >> M >> K;
	//std::cin >> N >> K;
	std::cin >> A >> B;
	//std::cin >> A >> B >> C;
    
	std::vector<long long> v(3);
	//std::vector<long long> w(N);
	//std::vector<long long> x(N);
	//std::vector<int> v(100, 0);
	//int a[26]={0};
	
	
	//vec.push_back(i);
	//accumulate(vec.begin(), vec.end(), 0)
    //v.resize
    
	// 配列入力1
	
	v[0]=A+B;
	v[1]=A-B;
	v[2]=A*B;
	
	
	//std::sort(v.begin(),v.end());//昇順ソート
	std::sort(v.begin(),v.end(),std::greater<long long>());//降順ソート
	
	//通常
	/*
	for(long long i=0; i<N; i++){
		
		
		
	}
	*/
	
	if(1){
    	printf("%lld",v[0]);
    	//printf("%lld",N);
    	//puts("Yes");
    	//printf("%d",st.size());
    	//文字列の出力
    	//std::cout << s << std::endl;
    	//printf("%.12f\n",ret);
    	//cout << sum << endl;
	}
	else{
		//puts("No");
	}
	return 0;
	

	//文字列入力
	/*
	string s,t;
	std::cin >> s;
	//sort(s.begin(), s.end());
	for(long long i=0; i<s.length(); i++){
		
		//wk=(s[i+2]-'0')+10*(s[i+1]-'0')+100*(s[i]-'0');
		if(s[i]!='1'){
		}	
	}
	*/
	
	
	//●●●	文字列の置換
	/*
	string s,t;
	std::cin >> s;
    
	while(t!=s){
		t=s;
		replaceOtherStr(s, "a", "b");
	}
	*/
	
	//●●●	現れない文字の一番最初の文字	(ABC071 B Not Found)
	/*
	string s;
	cin>>s;
	int a[26]={0};
	for(int i=0;i<s.length();i++){
		a[s[i]-'a']=1;
	}
	for(int i=0;i<26;i++){
		if(!a[i]){
			printf("%c",'a'+i);
			return 0;
		}
	}
	*/
	
	//●●●	to_string	(ABC136  B Uneven Numbers偶数桁の数字は除去)
	/*
	string s;
	cin >> N;
	repn(i,N){
		s=to_string(i);
		if(s.size()%2==1){
			cnt++;
		}
	}
	*/
	//●●●	別解 stringlenを使用する場合
  	/*
	char s[10];
	repn(i,N){
		sprintf(s,"%lld",i);
		if(strlen(s)%2==1)ans++;
	}
	pr("%lld\n",ans);
	re 0;
	*/

	
	//●●●	複数の文字列に含む文字を辞書順に出力	(ABC058  C 怪文書 )
	
	/*
	int d[26];
	rep(i,26)d[i]=10000000;
	CASET{								//	これを使用時は cin >> N不要
		string s;
		int a[26]={};
		cin>>s;
		rep(i,s.length())a[s[i]-'a']++;
		rep(i,26)d[i]=MIN(d[i],a[i]);
	}
	rep(i,26){
		rep(j,d[i])putchar('a'+i);
	}
	return 0;
	*/
	
	//●●●	複数の文字列に含む文字	その２	(こどふぉ Educational Div2 A)
	/*
	string s,t;
	std::vector<long long> v(N);
	for(long long i=0; i<N; i++){
		
		std::cin >> s;
		std::cin >> t;
 
		for(long long i=t.length()-1; i>0; i--){
			if(t[i]!='1'){
				cnt1++;
			}
			else{
				break;
			}
		}
 
		for(long long i=s.length()-1; i>0; i--){
			if(s[i]!='1'){
				cnt++;
			}
			else{
				if(cnt>=cnt1){
					break;
				}
				else{
					cnt++;
				}
			}
		}
		
		v[i]=cnt-cnt1;
		cnt=0;
		cnt1=0;
	}
	
	for(long long i=0; i<N; i++){
		printf("%lld\n",v[i]);
	}
	return 0;	
	*/
	
	//●●●	文字列を何個含むか
	/*
	string s;
	cin >> s;
	
	for (int i = 0; i < s.size(); i++) {
    	if (i + 4 <= s.size() && s.substr(i, 4) == "TEST"){
			cnt1++;
		}
	}
	*/
	
	//●●●  ペア関連
	/*
	vector<pair<long long, long long> > p(M);
	for(long long i=0; i<M; i++){
		long long a, b;
		cin >> a >> b;
		p[i] = make_pair(a, b);
	}
    
	sort(p.begin(), p.end());
	sort(p.begin(), p.end(),greater<pair<long long,long long> >());
	
	//●●●	通常（ペア用）
	
	for(long long i=0; i<N; i++){
		p[0].fi=0;
		p[0].se=0;
	}
	*/	

	//●●●  set関連  (ABC 73 C set典型)
	/*
	std::set<long long> st;
	for(long long i=0; i<N; i++){
		std::cin >> v[i];
		if(st.find(v[i])==st.end()){
			st.insert(v[i]);
		}
		else{
			st.erase(v[i]);
		}
	}
	*/
	//●●● set 文字列関連
	/*
	string s;
	for(long long i=0; i<S.size(); i++) {
    	s.insert(S[i]);
  	}
  	cnt=(int)s.find('a');
  	*/	
  	
  	
	//●●● set && pair  (ABC68 C Cat Snuke and a Voyage 2つの定期便で到着できるか)  	
	/*
	set<pair<int, int> > s;
	for (int i = 0; i < M; i++) {
		cin >> a >> b;
		s.insert(make_pair(a, b));
	}
	bool ret = false;
	for (int i = 2; i <= N - 1; i++) {
		if (s.count(make_pair(1, i)) && s.count(make_pair(i, N))) {
			ret = true;
		}
	}
	*/
	
	//●●●	map 関連 (ABC82 Good Sequence 配列の要素と要素の数が等しい)
	/*
	map<long long,long long> nums;
	// 配列入力1
	for(long long i=1; i<=N; i++){
		std::cin >> wk;
		nums[wk]++;
	}
	for (map<long long, long long>::iterator it = nums.begin(); it != nums.end(); ++it) {
		if(it->second!=0){
			if(it->second>=it->first){
				sum+=it->second - it->first;
			}
			else{
				sum+=it->second;
			}
		}
	}
	*/
	
	//●●●	map 文字列関連 (ABC110 C String Transformation 文字を交換して同じ文字にできるか)
	/*
	bool ok = true;
	map<char,char> ma, ima;
	for (int i = 0; i < S.size(); ++i) {
		char s = S[i], t = T[i];
		if (ma.count(s)) if (ma[s] != t) ok = false;
		if (ima.count(t)) if (ima[t] != s) ok = false;
		ma[s] = t; ima[t] = s;
	}	
	*/
	
	//●●●	スタック・ポップ関連
	/*
	for(long long i=0; i<N; i++){
		std::cin >> wk;
		sta.push(wk);
		que.push(wk);	
	}
	for(long long i=0; i<N; i++){
		printf("%lld ",sta.top() );
		printf("%lld ",que.front() );
		sta.pop();
		que.pop();
	}
	*/
	
	//●●●	デキュー関連 (ABC66 C pushpush)
	/*
	f=0;
	for(int i=1;i<=N;i++){
		std::cin >> wk;
		if(!f)dque.push_back(wk);
		else dque.push_front(wk);
		f^=1;
	}
	if(N&1)while(!dque.empty())printf("%d ",dque.back()),dque.pop_back();
	else while(!dque.empty())printf("%d ",dque.front()),dque.pop_front();
	puts("");
	return 0;
	*/
	
	//●●●	dp関連	(ABC129 C Typical Stairs)
	/*
	dp[0]=1;
	long long j;
	j=1;
    for(long long i=1; i<=N; i++){
		if(i==v[j]){
			dp[i]=0;
			j++;
		}
		else{
			dp[i]=(dp[i-1]+dp[i-2])%mod;
		}
	}
	printf("%lld",dp[N]);
	return 0;
	*/
	
	//●●●	modの使い方(ABC 050 C Lining Up 左右の人数が既知)
	//(ans *= 2) %= mod;
	
	//●●●	最小公倍数関連	(ABC70 C Multiple Clocks)
	/*
	std::vector<int> v(N);
	rep(i, N) {
		cin >> v[i];
	}	
	cout << lcm(v) << endl;
	return 0;
	*/
	
	//●●●	最大公約数関連	(ABC70 C Multiple Clocks)
	/*
	std::vector<int> v(N);
	rep(i, N) {
		cin >> v[i];
	}	
	cout << gcd(v) << endl;
	return 0;
	*/
	
	//●●● 素因数分解関連	(ABC 063 C Factors of Factorial)
	std::vector<int> count(1024);
	for(auto &x : count) x = 0;
	for(int n=2; n<=N; n++) countPN(n, count);

	ans = 1;
	for(int n=2; n<=N; n++)
	{
		if(count[n] != 0)
		{
			ans *= count[n]+1;
			ans %= mod;
		}
	}
	std::cout << ans << std::endl;
	return 0;
	
	//●●●	lowerbound , upper bound	(ABC77 C Snuke Festival)
	/*
	vector<int> a, b, c;
	sort(a.begin(), a.end());
	sort(b.begin(), b.end());
	sort(c.begin(), c.end());
	for (int i: b) {
		int x = lower_bound(a.begin(), a.end(), i) - a.begin();
		int y = upper_bound(c.begin(), c.end(), i) - c.begin();
		y = c.size() - y;
		ans += ll(x) * y;
	}
	*/
		
	//●●●	3つのソート関連	（ABC128 B Guidebook）
	
	/*
	vector<Student> vec(n+1);
	for (long long i = 1; i <= n; i++){
		vec[i].no= i;
		cin >> vec[i].name >> vec[i].point;
	}
	sort(vec.begin(), vec.end(), comp);

	for (int i = 1; i < vec.size(); i++) {
		printf("%d\n",vec[i].no);
	}
	*/
	
	//●●●	pow, sqrt,整数判定関連
	/*
	wk+=pow(v[j][i]-v[m][i],2);	//	wkはdouble
	wk=sqrt(wk);				//	wkはdouble
	if(ceil(wk) == floor(wk)){	//	整数判定
	}
	*/

	//●●●	どこまでか分からないけど調べたい (ABC072 C Together +1or0or-1である要素の数を最大化する)
	/*
	int n, a, c[100009];
	for (int i = 0; i < n; i++) cin >> a, c[a]++;
	int ret = 0;
	for (int i = 0; i <= 100000; i++) ret = MAX(ret, c[i] + c[i + 1] + c[i + 2]);
	cout << ret << endl;
	return 0;
	*/
	
	//●●●	ある要素から前後の何個かを全探索（こどふぉ(#576 Div.2 B))
	/*
	for(int i=0; i<n; ++i){
		bool flg = true;
		for(int j=i-x; j<i; ++j) if(j>0 && a[j] < a[i]) flg = false;
		for(int j=i+1; j<=i+y; ++j) if(j<n && a[j] < a[i]) flg = false;
 
		if(flg){
			cout << i+1 << endl;
			return 0;
		}
	}	
	*/
	
	//●●●	各桁の取り出し 関連
	/*	
	a[0] = (value % 10); 
	value /= 10;// 1桁目を取り出す
	a[1] = (value % 10); 
	value /= 10;// 2桁目を取り出す
	a[2] = (value % 10); 
	value /= 10;// 3桁目を取り出す
	a[3] = (value % 10); 
	value /= 10;// 4桁目を取り出す
	wk1=a[0]+10*a[1];
	wk2=a[2]+10*a[3];
	*/
	
	//	追加予定（累積和、確率）
	
	if(1){
    	//printf("%lld",N);
    	//printf("%lld",N);
    	//puts("Yes");
    	//printf("%d",st.size());
    	//文字列の出力
    	//std::cout << s << std::endl;
    	//printf("%.12f\n",ret);
    	//cout << sum << endl;
	}
	else{
		//puts("No");
	}
	return 0;
}


Measured memory_bytes: 256