main funcion