#include <bits/stdc++.h>
using namespace std;
struct point {
  double x, y;
} p[10], tp[10];
double dist(point a, point b) {
  return sqrt((a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y));
}
double dianmulti(point a, point b, point c) {
  double x1 = b.x - a.x;
  double y1 = b.y - a.y;
  double x2 = c.x - b.x;
  double y2 = c.y - b.y;
  return x1 * x2 + y1 * y2;
}
int main() {
  int i, j, k, l, ind, q, v, ed, mid, snum[10], ans;
  bool hash[10];
  double maxs, a[5];
  while (~scanf("%lf%lf", &p[0].x, &p[0].y)) {
    for (i = 1; i < 8; i++) scanf("%lf%lf", &p[i].x, &p[i].y);
    memset(hash, false, sizeof(hash));
    for (i = 0; i < 8; i++) {
      for (j = i + 1; j < 8; j++) {
        for (k = j + 1; k < 8; k++) {
          for (l = k + 1; l < 8; l++) {
            ind = ans = 0;
            tp[ind++] = p[i];
            tp[ind++] = p[j];
            tp[ind++] = p[k];
            tp[ind++] = p[l];
            snum[ans++] = i + 1;
            snum[ans++] = j + 1;
            snum[ans++] = k + 1;
            snum[ans++] = l + 1;
            maxs = 0;
            for (q = 1; q < ind; q++) {
              double dis = dist(tp[0], tp[q]);
              if (dis > maxs) maxs = dis, v = q;
            }
            ed = 0;
            for (q = 1; q < ind; q++) {
              if (q != v) {
                a[ed++] = dist(tp[0], tp[q]);
                a[ed++] = dist(tp[v], tp[q]);
              }
            }
            if (fabs(a[0] - a[1]) < 1e-8 && fabs(a[0] - a[2]) < 1e-8 &&
                fabs(a[0] - a[3]) < 1e-8) {
              for (q = 1; q < ind; q++) {
                if (q != v) {
                  mid = q;
                  break;
                }
              }
              if (fabs(dianmulti(tp[0], tp[mid], tp[v])) < 1e-8) {
                ind = 0;
                for (q = 0; q < 8; q++) {
                  if (q != i && q != j && q != k && q != l) tp[ind++] = p[q];
                }
                maxs = 0;
                for (q = 1; q < ind; q++) {
                  double dis = dist(tp[0], tp[q]);
                  if (dis > maxs) maxs = dis, v = q;
                }
                ed = 0;
                for (q = 1; q < ind; q++) {
                  if (q != v) {
                    a[ed++] = dist(tp[0], tp[q]);
                    a[ed++] = dist(tp[v], tp[q]);
                  }
                }
                sort(a, a + ed);
                if (fabs(a[0] - a[1]) < 1e-8 && fabs(a[2] - a[3]) < 1e-8) {
                  for (q = 1; q < ind; q++) {
                    if (q != v) {
                      mid = q;
                      break;
                    }
                  }
                  if (fabs(dianmulti(tp[0], tp[mid], tp[v])) < 1e-8) goto end;
                }
              }
            }
          }
        }
      }
    }
    puts("NO");
    continue;
  end:;
    puts("YES");
    for (i = 0; i < ans - 1; i++) printf("%d ", snum[i]), hash[snum[i]] = true;
    printf("%d\n", snum[i]), hash[snum[i]] = true;
    ans = 0;
    for (i = 1; i <= 8; i++) {
      if (!hash[i]) snum[ans++] = i;
    }
    for (i = 0; i < ans - 1; i++) printf("%d ", snum[i]);
    printf("%d\n", snum[i]);
  }
  return 0;
}
