digraph positioner_io {
        layout=dot
        size="8,4"
        margin=0
        ratio=fill
        rankdir=LR
        edge [dir=right]

        /* Programs */
        node [style=filled, shape=box, fillcolor="#9090fa"]
        positioner [label="OwlPS Positioner"]
        client [label="OwlPS Client"]
        udp_http [label="OwlPS UDP-to-HTTP"]
        socket_adapter [label="EvAAL SocketAdapter", fillcolor="#cccccc"]

        node [shape=ellipse, fillcolor="#7ec0ea"]

        /* Inputs */
        "CSV file" -> positioner
        "UDP socket" -> positioner

        /* Outputs */
        positioner -> "Standard output"
        csv_file [label="CSV file"]
        positioner -> csv_file
        udp_socket [label="UDP socket"]
        positioner -> udp_socket
        udp_socket -> client
        udp_socket -> udp_http
        tcp_evaal [label="EvAAL TCP socket"]
        positioner -> tcp_evaal
        tcp_evaal -> socket_adapter
}
