// {{{ #include #include #include #include #include #include #include #include #include #include #define SIZE(x) ((int) (x).size()) #define REP(i, n) for (int i = 0; i < (int) (n); ++i) #define FOR(i, a, b) for (int i = (int) (a); i <= (int) (b); ++i) #define FORD(i, a, b) for (int i = (int) (a); i >= (int) (b); --i) #define FORE(i, c) for (__typeof((c).begin()) i = (c).begin(); i != (c).end(); ++i) #define DEBUG(x) { cerr << #x << ": " << (x) << endl; } using namespace std; typedef long long LL; // }}} #define MAXN 2007 #define SQR(x) ((x) * (x)) int A[3][MAXN][MAXN]; int D[MAXN][MAXN]; int horizontal(int x, int n, int m) { int res = 1; REP(i, n) REP(j, m) { if (i == 0 || j == 0) { D[i][j] = 1; continue; } D[i][j] = 1 + min(D[i - 1][j - 1], min(D[i - 1][j], D[i][j - 1])); if (D[i][j] < 4) { bool ok = true; FOR(ii, i - D[i][j] + 1, i) FOR(jj, j - D[i][j] + 2, j) if (A[x][ii][jj] != A[x][ii][jj - 1]) ok = false; int d = A[x][i][j] - A[x][i - 1][j]; FOR(ii, i - D[i][j] + 2, i) if (A[x][ii][j] - A[x][ii - 1][j] != d) ok = false; if (!ok) D[i][j] = 1; } else { if (A[x][i][j] != A[x][i][j - 1]) D[i][j] = 1; } res = max(res, D[i][j]); } return SQR(res); } int diagonal(int x, int n, int m) { int res = 1; REP(i, n) REP(j, m) { if (i == 0 || j == 0) { D[i][j] = 1; continue; } D[i][j] = 1 + min(D[i - 1][j - 1], min(D[i - 1][j], D[i][j - 1])); if (D[i][j] < 3) { if (D[i][j] == 2) { if (A[x][i][j] != A[x][i - 1][j - 1] || A[x][i - 1][j] + A[x][i][j - 1] != 2 * A[x][i][j]) D[i][j] = 1; } } else { if (A[x][i][j] != A[x][i - 1][j - 1]) D[i][j] = 1; } res = max(res, D[i][j]); } return SQR(res); } int main() { int n, m; while (scanf("%d%d", &n, &m), n) { REP(i, n) REP(j, m) { scanf("%d", &A[0][i][j]); A[1][j][i] = A[0][i][j]; A[2][i][m - j - 1] = A[0][i][j]; } printf("%d\n", max(max(horizontal(0, n, m), horizontal(1, m, n)), max(diagonal(0, n, m), diagonal(2, n, m)))); } }