#include <bits/stdc++.h>
using namespace std;
struct pnt {
  int x, y;
  pnt() {}
  pnt(int _x, int _y) { x = _x, y = _y; }
  void read() { scanf("%d%d", &x, &y); }
  pnt operator-(const pnt &a) const {
    pnt ret(x - a.x, y - a.y);
    return ret;
  }
};
pnt p[8];
bool choose[8];
int cnt = 0;
int dist[8][8];
int dot(pnt a, pnt b) { return a.x * b.x + a.y * b.y; }
int dis(pnt a, pnt b) {
  return (a.x - b.x) * (a.x - b.x) + (a.y - b.y) * (a.y - b.y);
}
struct di {
  int l, i, j;
  bool operator<(const di &a) const { return l < a.l; }
  void print() { printf("%d (%d,%d)\n", l, i, j); }
};
bool check2(vector<int> adj[8]) {
  bool flag = false;
  int cnt = 0;
  for (int i = 0; i < 8; ++i) {
    if (adj[i].size() == 2) {
      if (dot(p[adj[i][0]] - p[i], p[adj[i][1]] - p[i]) == 0) cnt++;
    }
  }
  if (cnt >= 2) flag = true;
  return flag;
}
int check(vector<int> x) {
  di dit[6];
  int pos = 0;
  for (int i = 0; i < 3; ++i) {
    for (int j = i + 1; j < 4; ++j) {
      dit[pos].l = dist[x[i]][x[j]];
      dit[pos].i = x[i];
      dit[pos].j = x[j];
      pos++;
    }
  }
  sort(dit, dit + 6);
  vector<int> adj[8];
  if (dit[0].l == dit[1].l && dit[2].l == dit[3].l && dit[4].l == dit[5].l) {
    for (int i = 0; i < 4; ++i) {
      adj[dit[i].i].push_back(dit[i].j);
      adj[dit[i].j].push_back(dit[i].i);
    }
    if (check2(adj)) {
      if (dit[1].l == dit[2].l)
        return 1;
      else
        return 2;
    }
  }
  return 0;
}
bool flag;
void print(vector<int> &x) {
  for (int i = 0; i < 3; ++i) printf("%d ", x[i] + 1);
  printf("%d\n", x[3] + 1);
}
void work() {
  vector<int> a, b;
  for (int i = 0; i < 8; ++i) {
    if (choose[i])
      a.push_back(i);
    else
      b.push_back(i);
  }
  int ra = check(a), rb = check(b);
  if (ra == 0 || rb == 0) return;
  if (ra == 1 && rb >= 1) {
    flag = true;
  }
  if (ra >= 1 && rb == 1) {
    flag = true;
  }
  if (flag) {
    printf("YES\n");
    if (ra == 1) {
      print(a);
      print(b);
    } else {
      print(b);
      print(a);
    }
  }
}
void dfs(int d, int pre) {
  if (flag) return;
  for (int i = pre + 1; i < 4 + d; ++i) {
    choose[i] = true;
    if (d == 4)
      work();
    else
      dfs(d + 1, i);
    choose[i] = false;
  }
}
int main(int argc, char **argv) {
  flag = false;
  for (int i = 0; i < 8; ++i) p[i].read();
  for (int i = 0; i < 7; ++i) {
    for (int j = i + 1; j < 8; ++j) {
      dist[i][j] = dist[j][i] = dis(p[i], p[j]);
    }
  }
  dfs(1, -1);
  if (!flag) printf("NO\n");
  return 0;
}
