Переработка Сергеем предыдущего решения.