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;
const int MAX = 1005, INF = 1e9;
int n, m, k, t;
struct point {
  int x, y;
  int id;
  point(int x_ = 0, int y_ = 0) {
    x = x_, y = y_;
    id = 0;
  }
  point operator-(const point &p) const { return point(x - p.x, y - p.y); }
  bool operator!=(const point &p) const { return x != p.x || y != p.y; }
  bool operator<(const point &p) const {
    if (x != p.x) return x < p.x;
    if (y != p.y) return y < p.y;
    return id < p.id;
  }
} p0, a[MAX], p[MAX], s[MAX], tmp[MAX], r[MAX];
int cross(point a, point b) { return a.x * b.y - a.y * b.x; }
int norm(point a) { return a.x * a.x + a.y * a.y; }
bool cmp(point a, point b) {
  int c = cross(a - p0, b - p0);
  if (c > 0LL) return 1;
  if (c < 0LL) return 0;
  return norm(a - p0) > norm(b - p0);
}
void clean() {
  for (int i = 1; i <= n; i++) a[i] = p[i] = 0;
  for (int i = 1; i <= k; i++) s[i] = 0;
}
void preProcess() {
  p0 = point(INF, INF);
  for (int i = 1; i <= n; i++) {
    int x = a[i].x, y = a[i].y;
    if (y < p0.y)
      p0 = a[i];
    else if (y == p0.y && x < p0.x)
      p0.x = x, p0.id = a[i].id;
  }
  m = 0;
  for (int i = 1, f = 0; i <= n; i++) {
    if (f == 0 && a[i].x == p0.x && a[i].y == p0.y) {
      f = 1;
      continue;
    }
    p[++m] = a[i];
  }
  sort(p + 1, p + m + 1, cmp);
}
void convexHull() {
  int h = 2;
  while (h <= m && cross(p[h] - p0, p[h - 1] - p0) == 0) h++;
  k = 0;
  s[++k] = p0;
  s[++k] = p[1];
  if (h <= m) {
    s[++k] = p[h];
    for (int i = h + 1; i <= m; i++) {
      while (k > 1 && cross(s[k] - s[k - 1], p[i] - s[k - 1]) <= 0) k--;
      s[++k] = p[i];
    }
    while (k > 1 && cross(s[k] - s[k - 1], p0 - s[k - 1]) <= 0) k--;
  }
}
int calc(point a, point b) {
  int s1 = 0, s2 = 0;
  for (int i = 0; i < k; i++) {
    int c = cross(r[i] - a, b - a);
    if (c > 0) s1 = max(s1, c);
    if (c < 0) s2 = max(s2, -c);
  }
  if (s1 > 0 && s2 > 0) return s1 + s2;
  return 0;
}
int main() {
  int l;
  scanf("%d", &l);
  for (int i = 1; i <= l; i++) {
    scanf("%d%d", &tmp[i].x, &tmp[i].y);
    tmp[i].id = i;
  }
  sort(tmp + 1, tmp + l + 1);
  n = 0;
  a[++n] = tmp[1];
  for (int i = 2; i <= l; i++)
    if (tmp[i] != tmp[i - 1]) a[++n] = tmp[i];
  preProcess();
  convexHull();
  for (int i = 0; i < k; i++) r[i] = s[i + 1];
  int sol = 0;
  if (k < 4) {
    for (int i = 1; i <= k; i++)
      for (int j = 1; j <= n; j++) sol = max(sol, calc(s[i], a[j]));
  } else {
    int i = 0, j = 1;
    while (i < k) {
      int d = calc(r[i], r[j]);
      int ot = calc(r[i], r[(j + 1) % k]);
      sol = max(sol, d);
      if (ot < d)
        i++;
      else
        j = (j + 1) % k;
    }
  }
  double ans = sol / 2.0;
  printf("%.10lf\n", ans);
  return 0;
}