/*
テ」ツ?ィテ」ツつ甘」ツ?づ」ツ?暗」ツ?堙ァツキツ堙・ツ按?」ツつ「テ」ツδャテ」ツδウテ」ツつクテ」ツδ。テ」ツδウテ」ツδ暗」ツつ?」ツつ?

テ・ツ青?」ツδ偲」ツδシテ」ツδ嘉」ツつ津ゥツ??ァツ閉ェテ」ツ?ォティツヲツ凝」ツ?ヲティツ。ツ古」ツ?湘」ツ??
テ」ツδ偲」ツδシテ」ツδ悦テ」ツつ津ィツヲツ凝」ツつ凝」ツ?ィテ」ツ?凖」ツつ凝」ツ??

xテ」ツ?ィテゥツ?」テァツオツ静」ツ?ェテ」ツδ偲」ツδシテ」ツδ嘉」ツつ津・ツ?ィテ」ツ?ヲテ・ツ渉姪」ツつ甘・ツ?コテ」ツ?凖」ツ??
1テ」ツ?、テ」ツ?ョテゥツ?」テァツオツ静」ツつオテ」ツδ姪」ツつーテ」ツδゥテ」ツδ陛」ツ?古・ツ?コテヲツ敖・テ、ツクツ甘」ツ?古」ツつ凝」ツ??
テ」ツ?禿」ツ?ョテゥツ?」テァツオツ静」ツつオテ」ツδ姪」ツつーテ」ツδゥテ」ツδ陛」ツ?ォテ」ツ?、テ」ツ??」ツ?ヲテ」ツ??~9テ」ツ?ョテ」ツ?ゥテ」ツつ古」ツ?ォテ・ツスツ禿」ツ?ヲテ」ツ?ッテ」ツ?セテ」ツつ凝」ツ?凝」ツδ?」ツつァテ」ツδε」ツつッテ」ツ??
テ」ツ?禿」ツ?ョテ」ツつオテ」ツδ姪」ツつーテ」ツδゥテ」ツδ陛」ツ?ォテ・ツ青ォテ」ツ?セテ」ツつ古」ツつ凝」ツδ偲」ツδシテ」ツδ嘉」ツ?ッテ」ツ??、ツサツ・テゥツ卍催ヲツ篠「テァツエツ「テ・ツッツセティツアツ。テ」ツ?ィテ」ツ?療」ツ?ェテ」ツ??」ツつづ」ツ?ョテ」ツ?ィテ」ツ?凖」ツつ?テ」ツδ偲」ツδシテ」ツδ悦テ」ツ?ィテ」ツ?療」ツ?ヲテヲツ個?・ツョツ堙」ツ?療」ツ?ェテ」ツ??」ツ?禿」ツ?ィテ」ツ?ォテ」ツ?凖」ツつ?テ」ツ??

テゥツ?」テァツオツ静」ツつーテ」ツδゥテ」ツδ陛」ツ??~9テ」ツ?ョテ」ツ?ゥテ」ツつ古」ツ?ォテ・ツアツ榲」ツ?療」ツ?ヲテ」ツ??」ツつ凝」ツ?凝」ツ?ョテ・ツ按、テ・ツョツ堙」ツ??

テ・ツ青?」ツつーテ」ツδゥテ」ツδ陛」ツ?ョテ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ーテ」ツつ津ィツ?ε」ツ?暗」ツつ凝」ツ??
テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ー2 : 1
テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ー4 : 0, 7
テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ー5 : 4, 9
テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ー6 : 2, 3, 5, 6, 8

テ・ツ按、テ・ツョツ堙」ツ?ョテ」ツ?療」ツつ?」ツ?凖」ツ?敕」ツ??」ツ?ェテヲツ鳴ケテ」ツ?凝」ツつ嘉ゥツ??ァツ閉ェテ」ツ?ォテ」ツδ?」ツつァテ」ツδε」ツつッテ」ツ?療」ツ?ヲテ」ツ??」ツ?湘」ツ??
テ」ツδサ1 : テ」ツつーテ」ツδゥテ」ツδ陛」ツ?ョテ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ーテ」ツ??テ」ツ?ァテ」ツ?づ」ツつ凝」ツ??
テ」ツδサ0 : テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ーテ」ツ??テ」ツ?ァテ」ツ?づ」ツつ甘」ツ??ゥツ鳴嘉ィツキツッテ」ツ?古」ツ?づ」ツつ凝」ツ??
テ」ツδサ7 : テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ーテ」ツ??テ」ツ?ァテ」ツ?づ」ツつ?0テ」ツつ津・ツ?暗」ツ?ォテ」ツδ?」ツつァテ」ツδε」ツつッテ」ツ?療」ツ?ヲテ」ツ??」ツつ凝」ツ?淌」ツつ?」ツ??ヲツ敖。テ、ツサツカテ」ツ?ィテ」ツ?療」ツ?ヲテ」ツ?ッテ」ツ?禿」ツつ古」ツ??」ツ?妥」ツ?ァテ・ツ債?・ツ按?
テ」ツδサ9 : テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ーテ」ツ??テ」ツ?ァテ」ツ?づ」ツつ甘」ツ??ゥツ鳴嘉ィツキツッテ」ツ?古」ツ?づ」ツつ凝」ツ??
テ」ツδサ4 : テ」ツδ偲」ツδシテ」ツδ嘉ヲツ閉ーテ」ツ??テ」ツ?ァテ」ツ?づ」ツつ凝」ツ??
テ」ツδサ8 : テ」ツ?ゥテ」ツ?ョテ」ツδ偲」ツδシテ」ツδ嘉」ツつづゥツ鳴嘉ィツキツッテ」ツ?ョテ、ツクツ?ゥツδィテ」ツ??
テ」ツδサ6 : テゥツ鳴嘉ィツキツッテ」ツ??テ」ツ?、テ・ツュツ佚・ツ慊ィテ」ツ?凖」ツつ凝」ツ??
テ」ツδサ3 : テヲツャツ。テヲツ閉ーテ」ツ??テ」ツ?ョテ」ツδ偲」ツδシテ」ツδ嘉」ツ??テ」ツ?、テ・ツュツ佚・ツ慊ィテ」ツ?凖」ツつ凝」ツ??
テ」ツδサ2 : テヲツャツ。テヲツ閉ーテ」ツ??テ」ツ?ョテ」ツδ偲」ツδシテ」ツδ嘉」ツつ津・ツ青ォテ」ツつ?ァツキツ堙・ツ按?」ツつ津・ツ渉姪」ツつ甘・ツ?コテ」ツ??テ」ツ?禿」ツつ古」ツ?ッ2テ」ツつ津・ツスツ「テヲツ按静」ツ?凖」ツつ凝ァツキツ堙・ツ按?」ツ?ョテヲツ慊?」ツつづ、ツクツ甘ゥツδィテ」ツ?ョテァツキツ堙・ツ按?テ」ツ?づ」ツ?禿」ツ?ョテァツキツ堙・ツ按?」ツ?ョテ・ツ渉ウテ、ツクツ凝」ツ?凝」ツつ嘉ヲツャツ。テ」ツ?ョテァツキツ堙・ツ按?」ツ?古・ツ?コテ」ツ?ヲテ」ツ??」ツつ凝」ツ?ェテ」ツつ?テ」ツ?づ・ツキツヲテ、ツクツ凝」ツ?凝」ツつ嘉・ツ?コテ」ツ?ヲテ」ツ??」ツつ凝」ツ?ェテ」ツつ?テ」ツ??
テ」ツδサ5 : テ、ツクツ甘ィツィツ佚、ツサツ・テ・ツ、ツ姪」ツ??
*/
#include <iostream>
#include <vector>
#include <algorithm>
#include <complex>
#include <cstdio>
#include <cmath>
#include <cstring>
using namespace std;

#define EPS (1e-8)

typedef complex<double> P;

namespace std {
  bool operator < (const P& a, const P& b) {
    return real(a) != real(b) ? real(a) < real(b) : imag(a) < imag(b);
  }
}

struct L : public vector<P>{
  L(const P &a, const P &b){
    push_back(a);
    push_back(b);
  }
};

vector< vector<int> > graph;
vector<P> ps;

double cross(const P& a, const P& b){
  return imag(conj(a) * b);
}

double dot(const P& a, const P& b){
  return real(conj(a) * b);
}

int ccw(P a, P b, P c) {
  b -= a; c -= a;
  if (cross(b, c) > 0)   return +1;       // counter clockwise
  if (cross(b, c) < 0)   return -1;       // clockwise
  if (dot(b, c) < 0)     return +2;       // c--a--b on line
  if (norm(b) < norm(c)) return -2;       // a--b--c on line
  return 0;
}

bool intersectSS(const L &s, const L &t){
  return
    ccw(s[0], s[1], t[0]) * ccw(s[0], s[1], t[1]) <= 0 &&
    ccw(t[0], t[1], s[0]) * ccw(t[0], t[1], s[1]) <= 0;
}

bool intersectSP(const L &s, const P &p) {
  return abs(s[0] - p) + abs(s[1] - p) - abs(s[1] - s[0]) < EPS;
}

P crosspoint(const L &l, const L &m){
  double A = cross(l[1] - l[0], m[1] - m[0]);
  double B = cross(l[1] - l[0], l[1] - m[0]);
  return m[0] + B / A * (m[1] - m[0]);
}

vector< vector< int > > segArr(const vector<L> &ss) {
  ps.clear();
  for (int i = 0; i < ss.size(); ++i) {
    ps.push_back( ss[i][0] );
    ps.push_back( ss[i][1] );
    for (int j = i + 1; j < ss.size(); j++)
      if (intersectSS(ss[i], ss[j]))
        ps.push_back( crosspoint(ss[i], ss[j]) );
  }
  sort(ps.begin(),ps.end());

  for(int i = 0; i < ps.size() - 1; i++){
    if(abs(ps[i+1] - ps[i]) < EPS){
      ps.erase(ps.begin() + i);
      i--;
    }
  } 

  vector< vector<int> > g(ps.size());
  for (int i = 0; i < ss.size(); ++i) {
    vector< pair<double, int> > list;
    for (int j = 0; j < ps.size(); ++j)
      if (intersectSP(ss[i], ps[j]))
        list.push_back(make_pair(norm(ss[i][0]-ps[j]), j));
    sort(list.begin(), list.end());
    for (int j = 0; j+1 < list.size(); ++j) {
      int a = list[j].second, b = list[j+1].second;
      bool f = true;
      for(int i = 0; i < g[a].size(); i++){
        if(g[a][i] == b){
          f = false;
          break;
        }
      }
      if(f){
        g[a].push_back(b);
        g[b].push_back(a);
      }
    }
  }
  return g;
}

int n;
bool checked[100002];
bool used[100002];

void getGroup(int start, vector<int> &group){
  group.push_back(start);
  used[start] = true;

  for(int i = 0; i < graph[start].size(); i++){
    int next = graph[start][i];
    if(used[next]) continue;
    getGroup(next, group);
  }
}

int dfs(int id, int pre, int start){
  used[id] = true;
  for(int i = 0; i < graph[id].size(); i++){
    int next = graph[id][i];
    if(next != pre && next == start) return 1;
    if(used[next]) continue;
    if(dfs(next, id, start)) return 1;
  }
  return 0;
}

int getCycle(const vector<int> &group){
  int res = 0;
  for(int i = 0; i < group.size(); i++){
    memset(used, 0, sizeof(used));
    res += dfs(group[i], -1, group[i]);
  }
  return res;
}

int deg1(const vector<int> &group){
  int res = 0;
  for(int i = 0; i < group.size(); i++){
    if(graph[group[i]].size() == 1){
      res++;
    }
  }
  return res;
}

bool check2(const vector<int> &group){
  int id = -1;
  for(int i = 0; i < group.size(); i++){
    if(graph[group[i]].size() == 1){
      id = group[i];
      break;
    }
  }

  int id2 = graph[id][0];
  int id3 = (graph[id2][0] == id ? graph[id2][1] : graph[id2][0]);

  P a = ps[id];
  P b = ps[id2];
  P c = ps[id3];

  return ccw(a, b, c) < 0;
}

int main(){
  while(1){
    int N;
    cin >> N;
    if(N == 0) break;

    vector<L> segs;

    for(int i = 0; i < N; i++){
      P a, b;
      cin >> a.real() >> a.imag();
      cin >> b.real() >> b.imag();
      segs.push_back(L(a, b));
    }

    graph = segArr(segs);
    n = graph.size();
    memset(checked, 0, sizeof(checked));

    int ans[10];
    memset(ans, 0, sizeof(ans));

    for(int i = 0; i < n; i++){
      if(checked[i]) continue;

      vector<int> group;
      memset(used, 0, sizeof(used));
      getGroup(i, group);

      if(group.size() == 2){
        ans[1]++;
      }
      else if(group.size() == 4){
        if(getCycle(group)) ans[0]++;
        else                ans[7]++;
      }
      else if(group.size() == 5){
        if(getCycle(group)) ans[9]++;
        else                ans[4]++;
      }
      else{
        int cycle = getCycle(group);

        if(cycle == 6) ans[8]++;
        else if(cycle) ans[6]++;
        else{
          if(deg1(group) == 3)   ans[3]++;
          else if(check2(group)) ans[2]++;
          else                   ans[5]++;
        }
      }

      for(int j = 0; j < group.size(); j++){
        checked[group[j]] = true;
      }
    }

    for(int i = 0; i < 10; i++){
      if(i != 0) cout << " ";
      cout << ans[i];
    }
    cout << endl;
  }
}

Measured memory_bytes: 1744