#include <algorithm>
#include <iostream>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <string>
#include <vector>
#include <cmath>
#define eps 1.0e-8
#define sgn(f) ((f)<(-eps)?-1:((f)>eps))
using namespace std;
//const long double eps=1.0e-9;
const double pi=acos(-1.0);
/*int sgn(long double x)
{
    if(fabs(x)<eps) return 0;
    else return x<0?-1:1;
}*/
struct point
{
    long double x,y;
    point(long double  _x=0,long double  _y=0):x(_x),y(_y){};
    point operator + (point a) {return point(x+a.x, y+a.y);}
    point operator - (point a) {return point(x-a.x, y-a.y);}
    point operator * (long double  p) {return point(x*p, y*p);}
    point operator / (long double  p) {return point(x/p, y/p);}
    bool operator == (point a) {return sgn(x-a.x)==0&&sgn(y-a.y)==0;}
    bool operator < (const point a) const {return (sgn(x-a.x)<0) || ((sgn(x-a.x)==0)&&(sgn(y-a.y)<0));}
};
typedef point Vector;
long double  dmult(Vector a,Vector b) {return a.x*b.x+a.y*b.y;}
long double  xmult(Vector a,Vector b) {return a.x*b.y-a.y*b.x;}
long double xmult(point a,point b,point o) {return (a.x-o.x)*(b.y-o.y)-(a.y-o.y)*(b.x-o.x);}
long double dis(Vector a) {return sqrt(a.x*a.x+a.y*a.y);}
long double dis(point a,point b) {return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));}
long double angle(Vector v) {return atan2(v.y,v.x);}
long double RelativeAngle(Vector v,Vector u)
{
    long double c=dmult(v,u)/dis(v)/dis(u);
    if(c>1) c=1;
    else if(c<-1) c=-1;
	long double angle=acos(c);
	if(xmult(v,u)<0) angle=2*pi-angle;
	return angle;
}
bool check(point sa,point sb,point ta,point tb)
{
    if(sgn(xmult(sa,sb,ta))*sgn(xmult(sa,sb,tb))!=-1) return false;
    if(sgn(xmult(ta,tb,sa))*sgn(xmult(ta,tb,sb))!=-1) return false;
    return true;
}
bool isonsegment(point a,point b,point c)
{
    if(sgn(xmult(a,b,c))) return false;
    if(sgn(c.x-min(a.x,b.x))<0||sgn(c.x-max(a.x,b.x))>0) return false;
    if(sgn(c.y-min(a.y,b.y))<0||sgn(c.y-max(a.y,b.y))>0) return false;
    return true;
}
int GetLineIntersection(point p,Vector v,point q,Vector w,point &ans)
{
    if(sgn(xmult(v,w))==0)
    {
        if(sgn(xmult(p-q,w))==0) return 2;
        else return 0;
    }
    else ans=p+v*xmult(w,p-q)/xmult(v,w);
    return 1;
}
point tp[6666];
vector<vector<pair<int,int> > >G;
vector<bool>vis;
int sz=0;
void FindBorder(int n,point *p,vector<point>&ans)
{
    int N=0;
    tp[N++]=p[n-1];
    for(int i=0;i<n-1;++i)
	{
	    tp[N++]=p[i];
		point a1=p[i],a2=p[i+1];
		for(int j=i+1;j<n-1;++j)
		{
		    point b1=p[j],b2=p[j+1];
			if(check(a1,a2,b1,b2))
			{
			    GetLineIntersection(a1,a2-a1,b1,b2-b1,tp[N]);
			    N++;
			}
		}
	}
	sort(tp,tp+N);
	N=unique(tp,tp+N)-tp;
	G.resize(N);
	for(int i=0;i<n-1;++i)
	{
	    point a1=p[i],a2=p[i+1];
		vector< pair<long double,int> >tmp;
		for(int j=0;j<N;++j) if(isonsegment(a1,a2,tp[j])) tmp.push_back(make_pair(dis(tp[j]-a1),j));
		sort(tmp.begin(),tmp.end());
		for(int j=0;j<tmp.size()-1;++j)
		{
			G[tmp[j].second].push_back(make_pair(tmp[j+1].second,0));
			G[tmp[j+1].second].push_back(make_pair(tmp[j].second,0));
		}
	}
	for(int i=0;i<N;++i)
	{
	    sort(G[i].begin(),G[i].end());
	    G[i].erase(unique(G[i].begin(),G[i].end()),G[i].end());
	    for(int j=0;j<G[i].size();++j) G[i][j].second=sz++;
	}
	vis.resize(sz,0);
	int from=0,to=G[0][0].first;
	for(int i=1;i<G[0].size();++i)
	{
		int v=G[0][i].first;
		if(angle(tp[v]-tp[0])<angle(tp[to]-tp[0])) to=v;
	}
	long double area=0;
	do
	{
		int nto=from,idx=0,fromidx=0;
		long double angle=1e9;
		for(int i=0;i<G[to].size();++i)
		{
			int v=G[to][i].first;
			if(v==from)
			{
				fromidx=G[to][i].second;
				continue;
			}
			if(vis[G[to][i].second]) continue;
			long double nangle=RelativeAngle(tp[from]-tp[to],tp[v]-tp[to]);
			if(nangle<angle)
			{
				nto=v;
				angle=nangle;
				idx=G[to][i].second;
			}
		}
		if(nto==from) idx=fromidx;
		if(vis[idx]) while(1);
		vis[idx]=true;
		area+=xmult(tp[from],tp[to])/2;
		from=to;
		to=nto;
	}while(from);
	printf("%.10f\n",(double)area);
}
int main ()
{
    //freopen("in.txt","r",stdin);
    int n;
    scanf("%d",&n);
    point s[105];
    for(int i=0;i<n;++i)
    {
        double x,y;
        scanf("%lf%lf",&x,&y);
        s[i].x=x;
        s[i].y=y;
    }
    vector<point>q;
    q.clear();
    FindBorder(n,s,q);
    return 0;
}

Measured memory_bytes: 1684