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;
struct point {
  long long x;
  long long y;
} a[333], tu[333];
long long m;
long long cj(point a, point b, point p) {
  long long x1 = a.x - p.x, x2 = b.x - p.x;
  long long y1 = a.y - p.y, y2 = b.y - p.y;
  return x1 * y2 - x2 * y1;
}
long long area(long long a, long long b) {
  long long i = a;
  long long ans1 = 0.0, ans2 = 0.0;
  while (1) {
    i = ((i + 1) % m);
    if (i == b) break;
    ans1 = max(ans1, abs(cj(tu[a], tu[b], tu[i])));
  }
  i = b;
  while (1) {
    i = ((i + 1) % m);
    if (i == a) break;
    ans2 = max(ans2, abs(cj(tu[a], tu[b], tu[i])));
  }
  return (ans1 + ans2);
}
bool cmp(point a, point b) {
  if (a.x != b.x) return a.x < b.x;
  return a.y < b.y;
}
int main() {
  long long n, i, j;
  scanf("%I64d", &n);
  for (i = 0; i < n; i++) {
    scanf("%I64d %I64d", &a[i].x, &a[i].y);
  }
  sort(a, a + n, cmp);
  m = 0;
  for (i = 0; i < n; i++) {
    while (m > 1 && cj(tu[m - 1], a[i], tu[m - 2]) <= 0) m--;
    memcpy(&tu[m], &a[i], sizeof(a[i]));
    m++;
  }
  long long k = m;
  for (i = n - 2; i >= 0; i--) {
    while (m > k && cj(tu[m - 1], a[i], tu[m - 2]) <= 0) m--;
    memcpy(&tu[m], &a[i], sizeof(a[i]));
    m++;
  }
  m--;
  long long maxd = 0.0;
  if (m >= 4) {
    for (i = 0, j = 1; i < m; i++) {
      while (cj(tu[((i + 1) % m)], tu[j], tu[i]) -
                 cj(tu[((i + 1) % m)], tu[((j + 1) % m)], tu[i]) <
             0)
        j = ((j + 1) % m);
      long long d = area(i, j);
      maxd = max(maxd, d);
      d = area(((i + 1) % m), ((j + 1) % m));
      maxd = max(maxd, d);
    }
    printf("%.10lf\n", maxd / 2.0);
  } else {
    long long mind = 999999999;
    for (i = 0; i < n; i++) {
      long long dd;
      dd = abs(cj(tu[0], tu[1], a[i]));
      if (dd > 0) mind = min(mind, dd);
      dd = abs(cj(tu[0], tu[2], a[i]));
      if (dd > 0) mind = min(mind, dd);
      dd = abs(cj(tu[1], tu[2], a[i]));
      if (dd > 0) mind = min(mind, dd);
    }
    if (mind == 999999999) mind = 0;
    printf("%.10lf\n", (abs(cj(tu[0], tu[1], tu[2])) - mind) / 2.0);
  }
  return 0;
}