#include <bits/stdc++.h>
using namespace std;
const int N = 10;
const double eps = 1e-6;
int vis[N], s1[N], s2[N];
struct node {
  double x;
  double y;
  int pos;
} a[N];
map<double, int> Vis;
inline int read() {
  int x = 0, f = 1;
  char ch = getchar();
  while (ch > '9' || ch < '0') {
    if (ch == '-') f = -1;
    ch = getchar();
  }
  while (ch >= '0' && ch <= '9') {
    x *= 10;
    x += (ch - '0');
    ch = getchar();
  }
  return x * f;
}
inline void write(int x) {
  if (x < 0) putchar('-'), x = -x;
  if (x > 9) write(x / 10);
  putchar(x % 10 + '0');
}
inline bool cmp1(node X, node Y) {
  if (X.x == Y.x) return X.y < Y.y;
  return X.x < Y.x;
}
inline double Dis(double x, double y, double u, double v) {
  return (x - u) * (x - u) + (y - v) * (y - v);
}
inline bool Judge() {
  int m1 = 0, m2 = 0;
  for (register int(i) = (1); (i) <= (8); ++(i)) {
    if (vis[i])
      s1[++m1] = i;
    else
      s2[++m2] = i;
  }
  double X = 0, Y = 0, d1, d2, d3, d4;
  for (register int(i) = (1); (i) <= (4); ++(i))
    X += a[s1[i]].x, Y += a[s1[i]].y;
  X /= 4;
  Y /= 4;
  d1 = Dis(a[s1[1]].x, a[s1[1]].y, X, Y);
  d2 = Dis(a[s1[2]].x, a[s1[2]].y, X, Y);
  d3 = Dis(a[s1[3]].x, a[s1[3]].y, X, Y);
  d4 = Dis(a[s1[4]].x, a[s1[4]].y, X, Y);
  if (fabs(d1 - d2) > eps) return false;
  if (fabs(d1 - d3) > eps) return false;
  if (fabs(d1 - d4) > eps) return false;
  X = 0;
  Y = 0;
  for (register int(i) = (1); (i) <= (4); ++(i))
    X += a[s2[i]].x, Y += a[s2[i]].y;
  X /= 4;
  Y /= 4;
  d1 = Dis(a[s2[1]].x, a[s2[1]].y, X, Y);
  d2 = Dis(a[s2[2]].x, a[s2[2]].y, X, Y);
  d3 = Dis(a[s2[3]].x, a[s2[3]].y, X, Y);
  d4 = Dis(a[s2[4]].x, a[s2[4]].y, X, Y);
  if (fabs(d1 - d2) > eps) return false;
  if (fabs(d1 - d3) > eps) return false;
  if (fabs(d1 - d4) > eps) return false;
  d1 = Dis(a[s1[1]].x, a[s1[1]].y, a[s1[2]].x, a[s1[2]].y);
  d2 = Dis(a[s1[1]].x, a[s1[1]].y, a[s1[3]].x, a[s1[3]].y);
  d3 = Dis(a[s1[4]].x, a[s1[4]].y, a[s1[2]].x, a[s1[2]].y);
  d4 = Dis(a[s1[4]].x, a[s1[4]].y, a[s1[3]].x, a[s1[3]].y);
  if (fabs(d1 - d2) > eps) return false;
  if (fabs(d1 - d3) > eps) return false;
  if (fabs(d1 - d4) > eps) return false;
  return true;
}
void dfs(int x, int s) {
  if (x > 8) {
    if (s) return;
    if (Judge()) {
      puts("YES");
      for (register int(i) = (1); (i) <= (8); ++(i))
        if (vis[i]) {
          write(a[i].pos);
          putchar(' ');
        }
      puts("");
      for (register int(i) = (1); (i) <= (8); ++(i))
        if (!vis[i]) {
          write(a[i].pos);
          putchar(' ');
        }
      puts("");
      exit(0);
    }
    return;
  }
  if (s) {
    vis[x] = 1;
    dfs(x + 1, s - 1);
    vis[x] = 0;
  }
  dfs(x + 1, s);
}
signed main() {
  for (register int(i) = (1); (i) <= (8); ++(i)) {
    scanf("%lf%lf", &a[i].x, &a[i].y);
    a[i].pos = i;
  }
  sort(a + 1, a + 9, cmp1);
  dfs(1, 4);
  puts("NO");
  return 0;
}
