digraph { start [label="Wormhole Code\nMachine" style="dotted"] {rank=same; start S0} start -> S0 [style="invis"] S0 [label="S0:\nunknown\ndisconnected"] S0 -> P0_got_code [label="set_code"] P0_got_code [shape="box" label="B.got_code"] P0_got_code -> S4 S4 [label="S4: known" color="green"] S0 -> P0_list_nameplates [label="input_code"] S2 [label="S2: typing\nnameplate"] S2 -> P2_completion [label=""] P2_completion [shape="box" label="do completion"] P2_completion -> P0_list_nameplates P0_list_nameplates [shape="box" label="NL.refresh_nameplates"] P0_list_nameplates -> S2 S2 -> P2_got_nameplates [label="got_nameplates"] P2_got_nameplates [shape="box" label="stash nameplates\nfor completion"] P2_got_nameplates -> S2 S2 -> P2_finish [label="" color="orange" fontcolor="orange"] P2_finish [shape="box" label="lookup wordlist\nfor completion"] P2_finish -> S3 S3 [label="S3: typing\ncode"] S3 -> P3_completion [label=""] P3_completion [shape="box" label="do completion"] P3_completion -> S3 S3 -> P0_got_code [label="" color="orange" fontcolor="orange"] S0 -> S1A [label="allocate_code"] S1A [label="S1A:\nconnecting"] S1A -> P1_allocate [label="connected"] P1_allocate [shape="box" label="RC.tx_allocate"] P1_allocate -> S1B S1B [label="S1B:\nallocating"] S1B -> P1_generate [label="rx_allocated"] S1B -> S1A [label="lost"] P1_generate [shape="box" label="generate\nrandom code"] P1_generate -> P0_got_code }