use a smarter diff algorithm