Problem: Iahub has drawn a set of n points in the cartesian plane which he calls "special points". A quadrilateral is a simple polygon without self-intersections with four sides (also called edges) and four vertices (also called corners). Please note that a quadrilateral doesn't have to be convex. A special quadrilateral is one which has all four vertices in the set of special points. Given the set of special points, please calculate the maximal area of a special quadrilateral. 

Input

The first line contains integer n (4 ≤ n ≤ 300). Each of the next n lines contains two integers: xi, yi ( - 1000 ≤ xi, yi ≤ 1000) — the cartesian coordinates of ith special point. It is guaranteed that no three points are on the same line. It is guaranteed that no two points coincide. 

Output

Output a single real number — the maximal area of a special quadrilateral. The answer will be considered correct if its absolute or relative error does't exceed 10 - 9.

Examples

Input

5
0 0
0 4
4 0
4 4
2 3


Output

16.000000

Note

In the test example we can choose first 4 points to be the vertices of the quadrilateral. They form a square by side 4, so the area is 4·4 = 16.

Solution (in CPP):

Solution:
#include <bits/stdc++.h>
using namespace std;
typedef struct Point {
  long long x, y;
  Point() {}
  Point(long long x, long long y) : x(x), y(y) {}
  void read() { scanf("%I64d%I64d\n", &x, &y); }
  void out() { printf("%I64d %I64d\n", x, y); }
  Point operator-(Point b) { return Point(x - b.x, y - b.y); }
  bool operator==(const Point& b) const { return x == b.x && y == b.y; }
  bool operator!=(const Point& b) const { return !(*this == b); }
};
bool cmp(const Point& a, const Point& b) {
  return a.y < b.y || (a.y == b.y && a.x < b.x);
}
long long Cross(Point A, Point B) { return A.x * B.y - A.y * B.x; }
int ConvexHull(Point* data, int n, Point* ch) {
  sort(data, data + n, cmp);
  int m = 0;
  for (int i = 0; i < n; i++) {
    while (m > 1 && Cross(data[i] - ch[m - 2], ch[m - 1] - ch[m - 2]) >= 0) m--;
    ch[m++] = data[i];
  }
  int k = m;
  for (int i = n - 2; i >= 0; i--) {
    while (m > k && Cross(data[i] - ch[m - 2], ch[m - 1] - ch[m - 2]) >= 0) m--;
    ch[m++] = data[i];
  }
  if (n >= 2) m--;
  return m;
}
long long ans = 0;
void getArea(Point a, Point b, Point c, Point d) {
  long long t;
  t = Cross(b - a, c - a) + Cross(c - a, d - a);
  ans = max(ans, t);
}
const int maxn = 10100;
Point data[maxn], ch[maxn];
int n, m;
void solve() {
  if (m == 3) {
    for (int i = 0; i < n; i++)
      if (data[i] != ch[0] && data[i] != ch[1] && data[i] != ch[2]) {
        getArea(ch[0], ch[1], ch[2], data[i]);
        getArea(ch[0], ch[1], data[i], ch[2]);
        getArea(ch[0], data[i], ch[1], ch[2]);
        getArea(data[i], ch[0], ch[1], ch[2]);
      }
  } else {
    for (int i = 0; i < m; i++)
      for (int j = i + 1; j < m; j++)
        for (int k = j + 1; k < m; k++)
          for (int q = k + 1; q < m; q++) getArea(ch[i], ch[j], ch[k], ch[q]);
  }
  printf("%.6lf\n", ans / 2.0);
}
int main() {
  scanf("%d", &n);
  for (int i = 0; i < n; i++) data[i].read();
  m = ConvexHull(data, n, ch);
  solve();
  return 0;
}