#include <iostream>
#include <vector>
#include <algorithm>
using namespace std;
struct polygon
{
int poly_no;
vector<int> x;
vector<int> y;
double area;
};
bool compareArea(polygon p1, polygon p2) //true is p1<p2
{
if(p1.area <= p2.area) return true;
return false;
}
int counter[100010];
int main()
{
ios_base::sync_with_stdio(false);
int t, nopols, nopts;
cin>>t;
while(t--)
{
cin>>nopols;
polygon poly[nopols];
for(int i=0;i<nopols; i++)
{
poly[i].poly_no = i;
cin>>nopts;
poly[i].x.clear();
poly[i].y.clear();
int tx, ty;
for(int j=0; j<nopts; j++)
{
cin>>tx>>ty;
poly[i].x.push_back(tx);
poly[i].y.push_back(ty);
}
double temparea=0;
int k = nopts-1;
for(int j=0; j<nopts; j++)
{
temparea += (poly[i].x[k] + poly[i].x[j])*(poly[i].y[j] - poly[i].y[k]);
k=j;
}
poly[i].area = temparea/2.0;
if(poly[i].area<0) poly[i].area = -poly[i].area;
//cout<<poly[i].area<<" ";
}
sort(poly, poly+nopols, compareArea);
for(int i=0; i<nopols; i++) counter[poly[i].poly_no]=i;
for(int i=0; i<nopols; i++){ cout<<counter[i]<<" ";counter[i]=0;}
cout<<"\n";
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKc3RydWN0IHBvbHlnb24KewoJaW50IHBvbHlfbm87Cgl2ZWN0b3I8aW50PiB4OwoJdmVjdG9yPGludD4geTsKCWRvdWJsZSBhcmVhOwp9OwoKYm9vbCBjb21wYXJlQXJlYShwb2x5Z29uIHAxLCBwb2x5Z29uIHAyKSAvL3RydWUgaXMgcDE8cDIKewoJaWYocDEuYXJlYSA8PSBwMi5hcmVhKSByZXR1cm4gdHJ1ZTsKCXJldHVybiBmYWxzZTsKfQoKaW50IGNvdW50ZXJbMTAwMDEwXTsKCmludCBtYWluKCkgCnsKCWlvc19iYXNlOjpzeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJaW50IHQsIG5vcG9scywgbm9wdHM7CgljaW4+PnQ7Cgl3aGlsZSh0LS0pCgl7CgkJY2luPj5ub3BvbHM7CgkJcG9seWdvbiBwb2x5W25vcG9sc107CgkJZm9yKGludCBpPTA7aTxub3BvbHM7IGkrKykKCQl7CgkJCXBvbHlbaV0ucG9seV9ubyA9IGk7CgkJCWNpbj4+bm9wdHM7CgkJCXBvbHlbaV0ueC5jbGVhcigpOwoJCQlwb2x5W2ldLnkuY2xlYXIoKTsKCQkJaW50IHR4LCB0eTsKCQkJZm9yKGludCBqPTA7IGo8bm9wdHM7IGorKykKCQkJewoJCQkJY2luPj50eD4+dHk7CgkJCQlwb2x5W2ldLngucHVzaF9iYWNrKHR4KTsKCQkJCXBvbHlbaV0ueS5wdXNoX2JhY2sodHkpOwoJCQl9CgkJCWRvdWJsZSB0ZW1wYXJlYT0wOwoJCQlpbnQgayA9IG5vcHRzLTE7CgkJCWZvcihpbnQgaj0wOyBqPG5vcHRzOyBqKyspCgkJCXsKCQkJCXRlbXBhcmVhICs9IChwb2x5W2ldLnhba10gKyBwb2x5W2ldLnhbal0pKihwb2x5W2ldLnlbal0gLSBwb2x5W2ldLnlba10pOwoJCQkJaz1qOwoJCQl9CgkJCXBvbHlbaV0uYXJlYSA9IHRlbXBhcmVhLzIuMDsKCQkJaWYocG9seVtpXS5hcmVhPDApIHBvbHlbaV0uYXJlYSA9IC1wb2x5W2ldLmFyZWE7CgkJCS8vY291dDw8cG9seVtpXS5hcmVhPDwiICI7CgkJfQoJCQoJCXNvcnQocG9seSwgcG9seStub3BvbHMsIGNvbXBhcmVBcmVhKTsKCQkKCQlmb3IoaW50IGk9MDsgaTxub3BvbHM7IGkrKykgY291bnRlcltwb2x5W2ldLnBvbHlfbm9dPWk7CgkJZm9yKGludCBpPTA7ICBpPG5vcG9sczsgaSsrKXsgIGNvdXQ8PGNvdW50ZXJbaV08PCIgIjtjb3VudGVyW2ldPTA7fQoJCWNvdXQ8PCJcbiI7CgkJCgl9CglyZXR1cm4gMDsKfQ==