/**
* 　　　┏┓　　　┏┓
* 　　┏┛┻━━━┛┻┓
* 　　┃　　　　　　　 ┃
* 　　┃　　　━　　　 ┃
* 　　┃　┳┛　┗┳　┃
* 　　┃　　　　　　　 ┃
* 　　┃　　　┻　　　 ┃
* 　　┃　　　　　　　 ┃
* 　　┗━┓　　　┏━┛Codes are far away from bugs with the animal protecting
* 　　　　┃　　　┃    神兽保佑,代码无bug
* 　　　　┃　　　┃
* 　　　　┃　　　┗━━━┓
* 　　　　┃　　　　　 ┣┓
* 　　　　┃　　　　 ┏┛
* 　　　　┗┓┓┏━┳┓┏┛
* 　　　　　┃┫┫　┃┫┫
* 　　　　　┗┻┛　┗┻┛
**/

#include <bits/stdc++.h>
using namespace std;
const int maxn = 20;
struct Node
{
    int x, y;
    Node(int x=0, int y=0): x(x), y(y) {}
} pt[maxn];

Node vec[maxn*maxn];
int n;
int vis[maxn];
int ins;
int sum;

void dfs(int u)
{
    while(u<n&&vis[u]) u++;
    if(u==n) {
        int thisum=0;
        for(int i=0;i<ins;i++){
            for(int j=i+1;j<ins;j++) {
                if(vec[i].x*vec[j].y==vec[i].y*vec[j].x) {
                    thisum++;
                }
            }
        }
        sum=max(thisum, sum);
        return ;
    }
    vis[u]=1;
    for(int i=0;i<n;i++) {
        if(!vis[i]) {
            vis[i]=1;
            vec[ins++]=Node(pt[i].x-pt[u].x,pt[i].y-pt[u].y);
            dfs(u+1);
            ins--;
            vis[i]=0;
        }
    }
    vis[u]=0;
}

int main()
{
    ///////////freopen("input.txt", "r", stdin);
    while(~scanf("%d", &n)) {
        for(int i=0;i<n;i++) {
            scanf("%d%d", &pt[i].x, &pt[i].y);
        }
        ins=0;
        sum=0;
        memset(vis, 0, sizeof(vis));
        dfs(0);
        cout << sum << endl;
    }
    return 0;
}

