#include <bits/stdc++.h>
using namespace std;
const double PI = acos(-1.0);
struct point {
  double x, y;
  point() { x = y = 0.0; }
  point(double _x, double _y) : x(_x), y(_y) {}
  bool operator<(point other) const {
    if (fabs(y - other.y) > 1e-9) return y < other.y;
    return x < other.x;
  }
  bool operator==(point other) const {
    return (fabs(x - other.x) < 1e-9 && (fabs(y - other.y) < 1e-9));
  }
  point operator-(point other) const {
    point aux(x - other.x, y - other.y);
    return aux;
  }
  point operator+(point other) const {
    point aux(x + other.x, y + other.y);
    return aux;
  }
  point operator*(double other) const {
    point aux(x * other, y * other);
    return aux;
  }
  double ang() {
    double a = atan2(y, x);
    if (a < 0) a += 2.0 * PI;
    return a;
  }
};
double dist(point& p1, point& p2) {
  return sqrt((p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y));
}
double dist_sq(point p1, point p2) {
  return (p1.x - p2.x) * (p1.x - p2.x) + (p1.y - p2.y) * (p1.y - p2.y);
}
struct vec {
  double x, y;
  vec(double _x, double _y) : x(_x), y(_y) {}
};
vec toVec(point a, point b) { return vec(b.x - a.x, b.y - a.y); }
long long cross(vec a, vec b) { return a.x * b.y - a.y * b.x; }
bool ccw(point p, point q, point r) {
  return cross(toVec(p, q), toVec(p, r)) > -1e-9;
}
double dot(vec a, vec b) { return (a.x * b.x + a.y * b.y); }
double norm_sq(vec v) { return v.x * v.x + v.y * v.y; }
bool collinear(point p, point q, point r) {
  return fabs(cross(toVec(p, q), toVec(p, r))) < 1e-9;
}
double anglet(point a, point o, point b) {
  vec oa = toVec(o, a), ob = toVec(o, b);
  double ang = acos(dot(oa, ob) / sqrt(norm_sq(oa) * norm_sq(ob)));
  if (ang != 0 && !collinear(a, o, b) && ccw(a, o, b)) ang = 2 * PI - ang;
  return ang;
}
double angle(point a, point o, point b) {
  vec oa = toVec(o, a), ob = toVec(o, b);
  return acos(dot(oa, ob) / sqrt(norm_sq(oa) * norm_sq(ob)));
}
vec scale(vec v, double s) { return vec(v.x * s, v.y * s); }
point translate(point p, vec v) { return point(p.x + v.x, p.y + v.y); }
double distToLine(point p, point a, point b, point& c) {
  vec ap = toVec(a, p), ab = toVec(a, b);
  double u = dot(ap, ab) / norm_sq(ab);
  c = translate(a, scale(ab, u));
  return dist(p, c);
}
vector<point> Q, ord;
bool cmp(pair<long long, long long>& a, pair<long long, long long>& b) {
  vec A = toVec(Q[a.first], Q[a.second]);
  vec B = toVec(Q[b.first], Q[b.second]);
  if (fabs(cross(A, B)) < 1e-9) return 0;
  return cross(A, B) >= 0;
}
int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  long long n;
  cin >> n;
  double x, y;
  vector<long long> in(n, 0);
  for (int i = 0; i < n; i++) {
    cin >> x >> y;
    point p(x, y);
    Q.push_back(p);
  }
  sort(Q.begin(), Q.end());
  for (int i = 0; i < n; i++) {
    in[i] = i;
    ord.push_back(Q[i]);
  }
  vector<pair<long long, long long> > rec;
  for (int i = 0; i < n; i++)
    for (int j = i + 1; j < n; j++) {
      rec.push_back({i, j});
    }
  sort(rec.begin(), rec.end(), cmp);
  long long ans = 0;
  for (int i = 0; i < rec.size(); i++) {
    double angg, a, b;
    point aux;
    a = rec[i].first;
    b = rec[i].second;
    ans += (in[a] - 1) * in[a] / 2 * (n - in[b] - 2) * (n - in[b] - 1) / 2;
    swap(ord[in[a]], ord[in[b]]);
    swap(in[a], in[b]);
  }
  cout << ans << "\n";
}
