#include <bits/stdc++.h>
using namespace std;
const int dx[] = {0, 1, 0, -1, 1, -1, -1, 1};
const int dy[] = {-1, 0, 1, 0, 1, 1, -1, -1};
const int INF = 1 << 30;
const double EPS = 1e-15;
struct Point {
  double x, y;
  Point() {}
  Point(double _x, double _y) {
    x = _x;
    y = _y;
  }
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  Point operator*(double k) { return Point(k * x, k * y); }
  Point operator*(Point p) {
    return Point(p.x * x - p.y * y, p.x * y + p.y * x);
  }
  Point operator/(double k) { return Point(x / k, y / k); }
  Point operator=(Point p) {
    x = p.x;
    y = p.y;
    return *this;
  }
  bool operator<(const Point &p) const { return x != p.x ? x < p.x : y < p.y; }
};
double dot(Point p, Point q) { return p.x * q.x + p.y * q.y; }
double cross(Point p, Point q) { return p.x * q.y - q.x * p.y; }
double norm(Point p) { return p.x * p.x + p.y * p.y; }
double pabs(Point p) { return sqrt(norm(p)); }
Point UnitVector(Point a) { return a / pabs(a); }
struct Line : vector<Point> {
  Line() {}
  Line(Point p, Point q) {
    push_back(p);
    push_back(q);
  }
};
struct Circle {
  Point p;
  double r;
  Circle() {}
  Circle(Point _p, double _r) {
    p = _p;
    r = _r;
  }
};
int ccw(Point a, Point b, Point c) {
  b = b - a;
  c = c - a;
  if (cross(b, c) > 0) return +1;
  if (cross(b, c) < 0) return -1;
  if (dot(b, c) < 0) return +2;
  if (pabs(b) < pabs(c)) return -2;
  return 0;
}
bool intersectSS(Line l, Line m) {
  return (ccw(l[0], l[1], m[0]) * ccw(l[0], l[1], m[1]) < EPS) &&
         (ccw(m[0], m[1], l[0]) * ccw(m[0], m[1], l[1]) < EPS);
}
bool intersectSP(Line l, Point p) { return !ccw(l[0], l[1], p); }
bool intersectLL(Line l, Line m) {
  return fabs(cross(l[1] - l[0], m[1] - m[0])) > EPS ||
         fabs(cross(l[1] - l[0], m[0] - l[0])) < EPS;
}
int intercectCC(Circle a, Circle b, Point *p, Point *q) {
  double dist = pabs(a.p - b.p);
  if (dist < fabs(a.r - b.r) || dist > a.r + b.r) {
    *p = Point(1e15, 1e15);
    *q = Point(1e15, 1e15);
    return 0;
  } else if (fabs(dist - a.r - b.r) < EPS) {
    Point way;
    way = b.p - a.p;
    *p = a.p + UnitVector(way) * a.r;
    *q = *p;
    return 1;
  } else {
    if (a.r < b.r) {
      swap(a.r, b.r);
      swap(a.p, b.p);
    }
    double s = (a.r + b.r + dist) / 2.0;
    double area = sqrt(s * (s - a.r) * (s - b.r) * (s - dist));
    double h = 2.0 * area / dist;
    Point v = b.p - a.p;
    v = UnitVector(v);
    Point m = a.p + (v * sqrt(a.r * a.r - h * h));
    Point n = v * Point(0.0, 1.0);
    *p = m + (n * h);
    *q = m - (n * h);
    return 2;
  }
}
double TriangleArea(Point a, Point b, Point c) {
  b = b - a;
  c = c - a;
  return cross(b, c) * 0.5;
}
double VertexArea(vector<Point> v) {
  double subArea = 0.0;
  for (int i = (0); i < (v.size() - 1); i++) {
    subArea += TriangleArea(v[0], v[i], v[i + 1]);
  }
  return subArea;
}
Point crosspoint(Line l, Line m) {
  if (intersectSS(l, m) == false) return Point(INF, INF);
  return m[0] + (m[1] - m[0]) * cross(l[1] - l[0], l[1] - m[0]) /
                    cross(l[1] - l[0], m[1] - m[0]);
}
vector<Point> ConvexHull(vector<Point> v) {
  int n = v.size();
  int k = 0;
  sort(v.begin(), v.end());
  vector<Point> e(2 * n);
  for (int i = 0; i < n; e[k++] = v[i++])
    while (k >= 2 && ccw(e[k - 2], e[k - 1], v[i]) <= 0) k--;
  for (int i = n - 2, t = k + 1; i >= 0; e[k++] = v[i--])
    while (k >= t && ccw(e[k - 2], e[k - 1], v[i]) <= 0) k--;
  e.resize(k - 1);
  return e;
}
int main() {
  int N;
  while (scanf("%d", &N), N) {
    Circle C[328];
    vector<Point> points;
    for (int i = (0); i < (N); i++) {
      double x, y;
      scanf("%lf %lf", &x, &y);
      C[i] = Circle(Point(x, y), 1.);
    }
    int len = 0;
    for (int i = (0); i < (N); i++) {
      for (int j = (i + 1); j < (N); j++) {
        Point p, q;
        int tmp = 0;
        tmp = intercectCC(C[i], C[j], &p, &q);
        if (tmp > 0) {
          points.push_back(p);
          points.push_back(q);
        }
      }
    }
    int ans = 1;
    for (int i = (0); i < (points.size()); i++) {
      Point tar = points[i];
      int cnt = 0;
      for (int j = (0); j < (N); j++) {
        Point base = C[j].p;
        if (pabs(base - tar) - 1. < EPS) {
          cnt++;
        }
      }
      ans = max(ans, cnt);
    }
    printf("%d\n", ans);
  }
  return 0;
}
