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 Ponto {
  int x;
  int y;
} Ponto;
double ccw(Ponto p1, Ponto p2, Ponto p3) {
  return ((p2.x - p1.x) * (p3.y - p1.y)) - ((p2.y - p1.y) * (p3.x - p1.x));
}
int areaTriangulo(Ponto p1, Ponto p2, Ponto p3) {
  return ((p1.x * p2.y + p1.y * p3.x + p2.x * p3.y) -
          (p2.y * p3.x + p1.x * p3.y + p1.y * p2.x)) /
         2;
}
int menor(Ponto p1, Ponto p2) {
  if (p1.y < p2.y) {
    return 1;
  } else if (p1.y == p2.y && p1.x < p2.x) {
    return 1;
  } else {
    return 0;
  }
}
int main() {
  int qtos;
  vector<Ponto> vetor;
  Ponto menorPonto;
  menorPonto.y = 1010;
  menorPonto.x = 1010;
  scanf("%d", &qtos);
  for (int x = 0; x < qtos; x++) {
    Ponto ponto;
    scanf("%d %d", &ponto.x, &ponto.y);
    vetor.push_back(ponto);
  }
  double maiorArea = -1;
  for (int k = 0; k < qtos; k++) {
    menorPonto = vetor.at(k);
    for (int i = 0; i < qtos; i++) {
      if (i == k) {
        continue;
      }
      Ponto pontoB = vetor.at(i);
      double maiorTrianguloSuperior = -1;
      double maiorTrianguloInferior = -1;
      for (int j = 0; j < qtos; j++) {
        if (i == j || j == k) {
          continue;
        } else {
          Ponto pontoC = vetor.at(j);
          double crossProduct = ccw(menorPonto, pontoB, pontoC);
          if (crossProduct > 0) {
            double triangleArea = crossProduct / 2;
            if (triangleArea > maiorTrianguloSuperior) {
              maiorTrianguloSuperior = triangleArea;
            }
          } else {
            double triangleArea = crossProduct / -2;
            if (triangleArea > maiorTrianguloInferior) {
              maiorTrianguloInferior = triangleArea;
            }
          }
        }
      }
      if (maiorTrianguloSuperior > 0 && maiorTrianguloInferior > 0) {
        double areaTeste = maiorTrianguloSuperior + maiorTrianguloInferior;
        if (areaTeste > maiorArea) {
          maiorArea = areaTeste;
        }
      }
    }
  }
  printf("%lf", maiorArea);
  return 0;
}