You are given n points on a plane. All the points are distinct and no three of them lie on the same line. Find the number of parallelograms with the vertices at the given points.

Input

The first line of the input contains integer n (1 ≤ n ≤ 2000) — the number of points.

Each of the next n lines contains two integers (xi, yi) (0 ≤ xi, yi ≤ 109) — the coordinates of the i-th point.

Output

Print the only integer c — the number of parallelograms with the vertices at the given points.

Example

Input

4
0 1
1 0
1 1
2 0


Output

1
#include <bits/stdc++.h>
using namespace std;
template <typename T>
T gcd(T first, T second) {
  while (second > 0) {
    first %= second;
    swap(first, second);
  }
  return first;
}
template <class T>
T lcm(T a, T b) {
  return a / gcd(a, b) * b;
}
template <class _T>
inline _T sqr(const _T &first) {
  return first * first;
}
template <class _T>
inline string tostr(const _T &a) {
  ostringstream os("");
  os << a;
  return os.str();
}
const long double PI = 3.1415926535897932384626433832795L;
template <typename T>
inline void input(T &a) {
  static int ed;
  a = 0;
  while (!isdigit(ed = getchar()) && ed != '-') {
  }
  char neg = 0;
  if (ed == '-') {
    neg = 1;
    ed = getchar();
  }
  while (isdigit(ed)) {
    a = 10 * a + ed - '0';
    ed = getchar();
  }
  if (neg) a = -a;
}
template <typename T = int>
inline T nxt() {
  T res;
  input(res);
  return res;
}
void myassert(bool v) { assert(v); }
mt19937 generator;
bool check(int v) {
  if (v < 2) return false;
  for (int i = 2; i * i <= v; ++i) {
    if (v % i == 0) {
      return false;
    }
  }
  return true;
}
long long pw(long long a, long long n, long long m) {
  long long res = 1;
  while (n) {
    if (n & 1ll) {
      res = res * a % m;
    }
    a = a * a % m;
    n >>= 1;
  }
  return res;
}
long long inv(long long a, long long p) {
  long long res = 1;
  while (a > 1) {
    res = res * (p - p / a) % p;
    a = p % a;
  }
  return res;
}
long long mod = 1000000007;
long long solve(int m, const string &s) {
  long long dp[s.length() + 1];
  int last[m];
  memset((last), 0, sizeof(last));
  dp[0] = 1;
  for (int i = 1; i <= s.length(); i++) {
    dp[i] = (dp[i - 1] * 2);
    if (last[s[i - 1] - 'a'] != 0)
      dp[i] = (dp[i] - dp[last[s[i - 1] - 'a'] - 1]);
    last[s[i - 1] - 'a'] = i;
  }
  return dp[s.length()];
}
long long res = 0;
void rec(int pos, int n, int m, const string &s) {
  if (pos == n) {
    res += solve(m, s);
    return;
  }
  for (int i = 0; i < m; ++i) {
    rec(pos + 1, n, m, s + (char)(i + 'a'));
  }
}
void solve(int test) {
  int n = nxt();
  long long first[n], second[n];
  for (int i = 0; i < n; ++i) {
    first[i] = nxt();
    second[i] = nxt();
  }
  cerr << "OK\n";
  vector<long long> p;
  p.reserve(n * (n - 1) / 2);
  long long M = 2000000001;
  for (int i = 0; i < n; ++i) {
    for (int j = i + 1; j < n; ++j) {
      long long sx = first[i] + first[j];
      long long sy = second[i] + second[j];
      p.push_back(sx * M + sy);
    }
  }
  sort((p).begin(), (p).end());
  long long ans = 0;
  for (int i = 0; i < p.size(); ++i) {
    int j = i;
    while (j < p.size() && p[i] == p[j]) {
      ++j;
    }
    ans += (j - i) * (j - i - 1);
    i = j - 1;
  }
  ans /= 2;
  cout << ans << "\n";
}
int main(int argc, char **argv) {
  int t = 1;
  int c = 0;
  while (t--) {
    solve(++c);
  }
  return 0;
}
