#include <bits/stdc++.h>
using namespace std;

#define ios ios_base::sync_with_stdio(false); cin.tie(0); cout.tie(0);
#define ll long long
#define inf INT_MAX
#define llinf LLONG_MAX
#define mt make_tuple
#define mp make_pair
#define parll pair<ll,ll>
#define parii pair<int,int>
#define nzd __gcd
#define nzs(e1,e2) (e1/nzd(e1,e2))*e2
#define min3(brp1,brp2,brp3) min(brp1,min(brp2,brp3))
#define min4(brp1,brp2,brp3,brp4) min(brp1,min3(brp2,brp3,brp4))
#define max3(brp1,brp2,brp3) max(brp1,max(brp2,brp3))
#define max4(brp1,brp2,brp3,brp4) max(brp1,max3(brp2,brp3,brp4))
#define all(V) V.begin(),V.end()
#define l_b(BRL,brl) lower_bound( BRL.begin(), BRL.end(), brl )-BRL.begin()-1 /// !za one based! vraca mani iako brl postoji, vraca 0 kada ne postoji manji
#define u_b(BRU,bru) upper_bound( BRU.begin(), BRU.end(), bru )-BRU.begin() /// !za one based! vraca veci iako bru postoji, vraca n+1 kada ne postoji veci
#define mod 1000000007
#define mxn 1502
#define mx 225002

struct tacka
{
    ll x;
    ll y;
};

struct prava
{
    ll val; /// apsolutna vrednost razlike ne nulte koordinate
    ll t1; /// index tacke 1
    ll t2; /// index tacke 2
    parll koef; /// koeficijent
};

ll q,k,n,rez=0;
vector <tacka> T(mxn);
vector <prava> P;
//vector < vector<parll> > K(2);
vector <ll> C;

bool sortiraj( prava a, prava b )
{
    if ( a.koef.first == b.koef.first )
    {
        return (a.koef.second>b.koef.second);
    }
    return (a.koef.first<b.koef.first);
}

parll IzracunajKoeficijent( tacka a, tacka b )
{
    ll rx = a.x-b.x;
    ll ry = a.y-b.y;
    ll nzdr = nzd(rx,ry);
    rx /= nzdr;
    ry /= nzdr;

    if ( ry < 0 )
    {
        rx = -rx;
        ry = -ry;
    }

    return {rx,ry};
}

void PrebrojPrave()
{
    map <ll,ll> M;
    for ( ll i = 0; i < C.size(); i++ )
    {
        M[C[i]]++;
    }

    //auto it = M.begin();
    vector <parll> V;
    copy( all(M), back_inserter(V) );
    for ( auto x : V )
    {
        rez += x.second*M[2*x.first];
    }
//    for ( parll x : M )
//    {
//        rez += x.second*M[2*x.first];
//    }
//    for ( ll i = 0; i < C.size(); i++ )
//    {
//        l = min( (ll)(lower_bound(C.begin()+i+1,C.end(),C[i].first/2)-C.begin()), 0ll );
//        u = max( (ll)(upper_bound(C.begin()+i+1,C.end(),C[i].first/2)-C.begin()), n-1 );
//        if ( C[l+1].first == C[i].first*2 )
//        {
//            rez += u-l+1;
//        }
//    }
}

void PrikaziPrave()
{
    for ( prava p : P )
    {
        cout << p.koef.first << "/" << p.koef.second << ", vel: " << p.val << "\n";
    }
}

int main()
{
    ios;

    cin >> n;
    for ( ll i = 1; i <= n; i++ )
    {
        cin >> T[i].x >> T[i].y;
    }

    prava p;
    for ( ll i = 1; i < n; i++ )
    {
        for ( ll j = i+1; j <= n; j++ )
        {
            p.val = (T[i].y==T[j].y)?abs(T[i].x-T[j].x):abs(T[i].y-T[j].y);
            p.koef = IzracunajKoeficijent(T[i],T[j]);
            p.t1 = i; p.t2 = j;
            P.push_back(p);
        }
    }
    sort( all(P), sortiraj );

    //PrikaziPrave();

    parll k;
    for ( ll i = 0; i < P.size(); i++ )
    {
        C.push_back(P[i].val);
        if ( i == P.size()-1 || P[i].koef != P[i+1].koef )
        {
            PrebrojPrave();
            C.clear();
        }
    }
    cout << rez;

    return 0;
}