#!/usr/bin/env python3

import sys
from math import atan2, fsum
from collections import namedtuple as T, defaultdict as D

Point = T("p", "x y")


def shoelace(poly):
    N = len(poly)
    fw = sum(poly[i - 1].x * poly[i].y for i in range(len(poly)))
    poly = list(reversed(poly))
    bw = sum(poly[i - 1].x * poly[i].y for i in range(len(poly)))
    return abs(fw - bw) / 2.0


def sort_ccw(p, points):
    return sorted(points, key=lambda point: atan2(point.y - p.y, point.x - p.x))


def find_face(neighbors, u, v):
    face = []
    current = v
    previous = u

    face.append(previous)
    while True:
        face.append(current)
        current_neighbors = neighbors[current]
        index = current_neighbors.index(previous)
        next_index = (index + 1) % len(current_neighbors)
        next_vertex = current_neighbors[next_index]
        if next_vertex == u:
            break
        previous, current = current, next_vertex

    face.append(u)
    return face


def main():
    n = int(input())
    N = D(list)
    for l in range(n):
        x1, y1, x2, y2 = map(float, input().split())
        p1, p2 = Point(x1, y1), Point(x2, y2)
        N[p1].append(p2)
        N[p2].append(p1)

    for p in N:
        N[p] = sort_ccw(p, N[p])

    seen = set()

    areas = []
    for p in N:
        for q in N[p]:
            edge = p, q
            if (p, q) in seen:
                continue
            seen.add((p, q))
            face = find_face(N, p, q)
            areas.append(shoelace(face) ** 2)
            for i in range(len(face) - 1):
                seen.add((face[i], face[i + 1 % len(face)]))
    return fsum(areas)


area = main()
print(area)
