@iwashi のコメントを反映した。ファイルを3つに分割した。