#include <bits/stdc++.h>
using namespace std;
void init() {
  ios_base::sync_with_stdio(false);
  cin.tie(NULL);
}
class Edge {
 public:
  pair<int, int> start;
  pair<int, int> end;
  long long len;
  int dy;
  int dx;
  pair<double, double> mp;
  Edge(pair<int, int> start, pair<int, int> end) {
    this->start = start;
    this->end = end;
    this->dx = start.first - end.first;
    this->dy = start.second - end.second;
    this->len = ((long long)(this->dx)) * (this->dx) +
                ((long long)(this->dy)) * (this->dy);
    this->mp.first = start.first - ((double)dx) / 2;
    this->mp.second = start.second - ((double)dy) / 2;
  }
  bool sqdiag(Edge& e) {
    return this->mp == e.mp && this->len == e.len &&
           ((this->dy == 0 && e.dx == 0) || (this->dx == 0 && e.dy == 0) ||
            (((double)this->dy * e.dy) / ((double)this->dx * e.dx) == -1));
  }
  bool rectdiag(Edge& e) { return this->mp == e.mp && this->len == e.len; }
};
void solve() {
  vector<pair<int, int> > pts;
  for (auto i = (0); i < (8); ++i) {
    int x, y;
    cin >> x >> y;
    pts.push_back({x, y});
  }
  vector<Edge> edges;
  for (auto i = (0); i < (8); ++i) {
    for (auto j = (i + 1); j < (8); ++j) {
      edges.push_back(Edge(pts[i], pts[j]));
    }
  }
  for (auto i = (0); i < (28); ++i) {
    for (auto j = (i + 1); j < (28); ++j) {
      if (edges[i].sqdiag(edges[j])) {
        vector<pair<int, int> > rectpts;
        vector<pair<int, int> > sqpts;
        for (pair<int, int> pt : pts) {
          if (pt == edges[i].start || pt == edges[i].end ||
              pt == edges[j].start || pt == edges[j].end) {
            sqpts.push_back(pt);
          } else {
            rectpts.push_back(pt);
          }
        }
        vector<Edge> otherpt_edges;
        vector<int> indexes;
        for (auto k = (0); k < (4); ++k) {
          for (auto l = (k + 1); l < (4); ++l) {
            otherpt_edges.push_back(Edge(rectpts[k], rectpts[l]));
          }
        }
        for (auto k = (0); k < (6); ++k) {
          for (auto l = (k + 1); l < (6); ++l) {
            if (otherpt_edges[k].rectdiag(otherpt_edges[l])) {
              cout << "YES" << endl;
              for (pair<int, int> sqpt : sqpts) {
                cout << find(pts.begin(), pts.end(), sqpt) - pts.begin() + 1
                     << " ";
              }
              cout << endl;
              for (pair<int, int> rectpt : rectpts) {
                cout << find(pts.begin(), pts.end(), rectpt) - pts.begin() + 1
                     << " ";
              }
              return;
            }
          }
        }
      }
    }
  }
  cout << "NO" << endl;
}
int main() {
  init();
  int t = 1;
  while (t-- > 0) {
    solve();
  }
  return 0;
}
