modified by chenxinke