state transitions cluster__p p cluster__p_listening listening cluster__p_polling polling cluster__p_main main cluster__p_main_connected connected cluster__p_main_connected_joined joined cluster__p_main_reconnecting reconnecting enter /input_command() cluster__p_main_disconnected disconnected enter /input_command() __initial __initial->_p _p_listening_initial _p_listening_l l _p_listening_initial->_p_listening_l _p_listening_l->_p_listening_l receive_message(msg:str)/add_message(msg,"remote_message")    _p_polling_initial initial _p_polling_initial->_p_polling_initial _p_polling_polling polling _p_polling_initial->_p_polling_polling connected    _p_polling_expecting_answer expecting_answer _p_polling_expecting_answer->_p_polling_initial after(2 s)^do_disconnect /print("polling timeout... disconnect")    _p_polling_expecting_answer->_p_polling_polling alive    _p_polling_polling->_p_polling_expecting_answer after(1 s)^network.poll    _p_main_initial _p_main_initial->_p_main_disconnected _p_main_connected->_p_main_reconnecting do_disconnect/add_message("disconnected","info")    _p_main_connected_initial _p_main_connected_connected connected _p_main_connected_initial->_p_main_connected_connected _p_main_connected_joining joining enter ^network.join _p_main_connected_joined_H H _p_main_connected_joining->_p_main_connected_joined_H joined/add_message("joined room " + int_to_str(room_number),"info")    _p_main_connected_getting_roomnumber getting_roomnumber _p_main_connected_getting_roomnumber->_p_main_connected_joining input(char:str) [is_enter(char)]/room_number = stoi(get_buffer())⁏ clear_input()⁏ input_command()⁏    _p_main_connected_getting_roomnumber->_p_main_connected_getting_roomnumber input(char:str) [is_backspace(char)]/remove_last_in_buffer()    _p_main_connected_getting_roomnumber->_p_main_connected_getting_roomnumber input(char:str) [is_numerical(char)]/append_to_buffer(char)    _p_main_connected_getting_roomnumber->_p_main_connected_getting_roomnumber input(char:str) [not is_numerical(char)]/add_message("only numerical input allowed!","warning")    _p_main_connected_connected->_p_main_connected_getting_roomnumber input(char:str) [char == "j"]/input_join()    _p_main_connected_leaving leaving _p_main_connected_leaving->_p_main_connected_connected left/add_message("left room","info")    _p_main_connected_joined_initial initial _p_main_connected_joined_initial->_p_main_connected_leaving input(char:str) [char == "l"]^network.leave /input_command()    _p_main_connected_joined_initial->_p_main_connected_joined_initial _p_main_connected_joined_entering_message entering_message enter /input_msg() _p_main_connected_joined_initial->_p_main_connected_joined_entering_message input(char:str) [char == "m"]    _p_main_connected_joined_entering_message->_p_main_connected_joined_initial input(char:str) [is_enter(char)]^network.send_message /add_message(get_buffer(),"local_message")⁏ clear_input()⁏ input_command()⁏    _p_main_connected_joined_entering_message->_p_main_connected_joined_entering_message input(char:str) [is_backspace(char)]/remove_last_in_buffer()    _p_main_connected_joined_entering_message->_p_main_connected_joined_entering_message input(char:str)/append_to_buffer(char)    _p_main_reconnecting_initial initial _p_main_reconnecting_initial->_p_main_reconnecting_initial _p_main_reconnecting_trying_connect trying_connect _p_main_reconnecting_initial->_p_main_reconnecting_trying_connect after(100 ms)/add_message("trying to connect to server " + get_server(curr_server),"info") ^network.connect    _p_main_reconnecting_trying_connect->_p_main_connected_joining connected/add_message("connected to server" + get_server(curr_server),"info")    _p_main_reconnecting_trying_connect->_p_main_reconnecting_initial after(5 s)/add_message("unable to connect to server " + get_server(curr_server),"info")    _p_main_disconnected_initial initial _p_main_disconnected_initial->_p_main_disconnected_initial _p_main_disconnected_trying_connect trying_connect _p_main_disconnected_initial->_p_main_disconnected_trying_connect after(100 ms)/add_message("trying to connect to server " + get_server(curr_server),"info") ^network.connect    _p_main_disconnected_trying_connect->_p_main_connected connected/add_message("connected to server " + get_server(curr_server),"info")    _p_main_disconnected_trying_connect->_p_main_disconnected_initial after(5 s)/add_message("unable to connect to server " + get_server(curr_server),"info")⁏ curr_server = (curr_server + 1) % get_nr_of_servers()⁏