Problem

There is a grid of $ R \ times C $ squares with $ (0, 0) $ in the upper left and $ (R-1, C-1) $ in the lower right. When you are in a square ($ e $, $ f $), from there $ (e + 1, f) $, $ (e-1, f) $, $ (e, f + 1) $, $ (e) , f-1) $, $ (e, 0) $, $ (e, C-1) $, $ (0, f) $, $ (R-1, f) $ can be moved at a cost of $ 1 $ .. However, you cannot go out of the grid. When moving from the mass $ (a_i, a_j) $ to $ (b_i, b_j) $, calculate the cost of the shortest path and the remainder of the total number of shortest path combinations divided by $ 10 ^ 9 + 7 $.

However, the combination of routes shall be distinguished by the method of movement. For example, if your current location is $ (100, 1) $, you can go to $ (100, 0) $ with the above $ (e, f-1) $ or $ (e, 0) $ to get to $ (100, 0) $ at the shortest cost. You can do it, so count it as $ 2 $.

Constraints

The input satisfies the following conditions.

* $ 1 \ le R, C \ le 500 $
* $ 0 \ le a_i, b_i \ le R --1 $
* $ 0 \ le a_j, b_j \ le C --1 $
* All inputs given are integers.

Input

The input is given in the following format.


$ R $ $ C $ $ a_i $ $ a_j $ $ b_i $ $ b_j $


Output

When moving from the mass $ (a_i, a_j) $ to $ (b_i, b_j) $, the cost of the shortest path and the remainder of the total number of combinations of the shortest paths divided by $ 10 ^ 9 + 7 $ are separated by $ 1 $. Print on a line.

Examples

Input

2 2 0 0 1 1


Output

2 8


Input

1 1 0 0 0 0


Output

0 1


Input

1 10 0 0 0 9


Output

1 1


Input

5 5 0 0 4 4


Output

2 2


Input

421 435 196 169 388 9


Output

43 917334776
#include <iostream>
#include <iomanip>
#include <cstdio>
#include <string>
#include <cstring>
#include <deque>
#include <list>
#include <queue>
#include <stack>
#include <vector>
#include <utility>
#include <algorithm>
#include <map>
#include <set>
#include <complex>
#include <cmath>
#include <limits>
#include <cfloat>
#include <climits>
#include <ctime>
#include <cassert>
#include <numeric>
#include <fstream>
#include <functional>
using namespace std;
  
#define rep(i,a,n) for(int (i)=(a); (i)<(n); (i)++)
#define repq(i,a,n) for(int (i)=(a); (i)<=(n); (i)++)
#define repr(i,a,n) for(int (i)=(a); (i)>=(n); (i)--)
#define debug(...) fprintf(stderr, __VA_ARGS__)
#define int long long int
  
template<typename T> void chmax(T &a, T b) {a = max(a, b);}
template<typename T> void chmin(T &a, T b) {a = min(a, b);}
template<typename T> void chadd(T &a, T b) {a = a + b;}
  
typedef pair<int, int> pii;
typedef long long ll;
  
int dx[] = {0, 0, 1, -1};
int dy[] = {1, -1, 0, 0};
const ll INF = 1001001001001001LL;
const ll MOD = 1000000007LL;
 
pair<int, int> dp[510][510];
const pair<int, int> INFII(INF, -1);
  
void update(pair<int, int> &A, pair<int, int> B) {
    B.first = B.first + 1;
    if(A.first > B.first) A = B;
    else if(A.first == B.first) {
        (A.second += B.second) %= MOD;
    }
}
 
struct Elem {
    int x, y, ans, cnt;
};
 
signed main() {
    int R, C, sx, sy, tx, ty; cin >> R >> C >> sx >> sy >> tx >> ty;
    fill(dp[0], dp[R], INFII);
    dp[sx][sy] = make_pair(0, 1);
 
    queue<Elem> que;
    que.push(Elem{sx, sy, 0, 1});
 
    const int ex[] = {-1, 0, -1, R-1};
    const int ey[] = {0, -1, C-1, -1};
    for(int step=0; step<R+C; step++) {
        set< pair<int, int> > checked;
        while(que.size()) {
            Elem cur = que.front(); que.pop();
            // 隣接
            for(int k=0; k<4; k++) {
                int nx = cur.x + dx[k], ny = cur.y + dy[k];
                if(nx < 0 || ny < 0 || nx >= R || ny >= C) continue;
                if(dp[nx][ny].first < dp[cur.x][cur.y].first + 1) continue;
                update(dp[nx][ny], dp[cur.x][cur.y]);
                checked.insert(make_pair(nx, ny));
            }
 
            // テレポート
            for(int k=0; k<4; k++) {
                int nx = (ex[k] < 0 ? cur.x : ex[k]);
                int ny = (ey[k] < 0 ? cur.y : ey[k]);
                if(dp[nx][ny].first < dp[cur.x][cur.y].first + 1) continue;
                update(dp[nx][ny], dp[cur.x][cur.y]);
                checked.insert(make_pair(nx, ny));
            }
        }
         
        for(auto x : checked) {
            int nx, ny; tie(nx, ny) = x;
            int vl, vr; tie(vl, vr) = dp[nx][ny];
            que.push(Elem{nx, ny, vl, vr});
        }
    }
 
    int ans1, ans2;
    tie(ans1, ans2) = dp[tx][ty];
    printf("%lld %lld\n", ans1, ans2);
    return 0;
}
