You are given a set of n points in a 2D plane. No three points are collinear.

A pentagram is a set of 5 points A,B,C,D,E that can be arranged as follows. <image> Note the length of the line segments don't matter, only that those particular intersections exist.

Count the number of ways to choose 5 points from the given set that form a pentagram.

Input

The first line contains an integer n (5 ≤ n ≤ 300) — the number of points.

Each of the next n lines contains two integers x_i, y_i (-10^6 ≤ x_i,y_i ≤ 10^6) — the coordinates of the i-th point. It is guaranteed that no three points are collinear.

Output

Print a single integer, the number of sets of 5 points that form a pentagram.

Examples

Input


5
0 0
0 2
2 0
2 2
1 3


Output


1


Input


5
0 0
4 0
0 4
4 4
2 3


Output


0


Input


10
841746 527518
595261 331297
-946901 129987
670374 -140388
-684770 309555
-302589 415564
-387435 613331
-624940 -95922
945847 -199224
24636 -565799


Output


85

Note

A picture of the first sample: <image> A picture of the second sample: <image> A picture of the third sample: <image>
#include <bits/stdc++.h>
using namespace std;
const int iinf = 1e9 + 10;
const long long inf = 1ll << 60;
const long long mod = 1e9 + 7;
void GG() {
  cout << "0\n";
  exit(0);
}
long long mpow(long long a, long long n, long long mo = mod) {
  long long re = 1;
  while (n > 0) {
    if (n & 1) re = re * a % mo;
    a = a * a % mo;
    n >>= 1;
  }
  return re;
}
long long inv(long long b, long long mo = mod) {
  if (b == 1) return b;
  return (mo - mo / b) * inv(mo % b, mo) % mo;
}
const int maxn = 300 + 3;
long long under[maxn][maxn];
long long X[maxn], Y[maxn];
inline int gt(int i, int j, int k) {
  if (X[i] > X[j]) swap(i, j);
  if (X[k] < X[i] || X[k] > X[j]) {
    return 0;
  }
  if ((Y[j] - Y[i]) * (X[k] - X[i]) + (X[j] - X[i]) * Y[i] >
      Y[k] * (X[j] - X[i])) {
    if (X[k] == X[i] || X[k] == X[j]) return 1;
    return 2;
  } else
    return 0;
}
signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  ;
  long long n;
  cin >> n;
  for (int i = 0; i < n; ++i) cin >> X[i] >> Y[i];
  for (int i = 0; i < n; ++i) {
    for (int j = 0; j < i; ++j) {
      for (int k = 0; k < n; ++k) {
        if (k == i || k == j) continue;
        under[i][j] += gt(i, j, k);
      }
      if (X[i] > X[j]) under[i][j] = -under[i][j];
      under[j][i] = -under[i][j];
    }
  }
  long long five =
      n * (n - 1) * (n - 2) * (n - 3) * (n - 4) / (1 * 2 * 3 * 4 * 5);
  long long four = 0, three = 0;
  for (int i = 0; i < n; ++i)
    for (int j = 0; j < i; ++j)
      for (int k = 0; k < j; ++k) {
        ;
        ;
        long long in = abs(under[i][j] + under[j][k] + under[k][i]);
        ;
        in -= gt(i, j, k) + gt(j, k, i) + gt(k, i, j);
        ;
        assert(in % 2 == 0);
        in /= 2;
        four += in * (long long)(n - 3 - in);
      };
  four /= 2;
  cout << five - four << '\n';
}
