1. BCrypt是什么?为什么我们需要它?
第一次听说BCrypt这个词时,我正面临一个令人头疼的问题——用户数据库被拖库了。那是我刚入行不久,还在用MD5存储密码,天真地以为加个盐就万事大吉。直到安全团队发来的那份渗透测试报告摆在面前,我才真正意识到密码存储的重要性。
BCrypt是一种专门为密码存储设计的哈希算法,由Niels Provos和David Mazières在1999年设计。与MD5、SHA-1这些通用哈希算法不同,BCrypt从设计之初就考虑到了密码存储的特殊需求。它有三个关键特性:
- 内置盐值(salt)机制,自动处理盐的生成和存储
- 可配置的计算成本(work factor),可以随着硬件性能提升而增加计算复杂度
- 基于Blowfish加密算法的修改版本,专门优化了密码哈希场景
为什么这些特性如此重要?让我们看一个真实案例。2012年LinkedIn被黑,650万用户密码泄露。这些密码都是用SHA-1存储的,黑客在几天内就破解了90%以上的密码。如果当时使用BCrypt,破解成本会呈指数级上升。
重要提示:永远不要用通用哈希函数(如MD5、SHA系列)存储密码,它们设计初衷是快速计算,而这恰恰是密码存储的大忌。
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. BCrypt的工作原理深度解析
2.1 算法结构拆解
BCrypt的算法结构可以用这个公式表示:
code复制哈希值 = BCrypt(密码, 盐, 成本因子)
一个典型的BCrypt哈希值长这样:
code复制$2a$10$N9qo8uLOickgx2ZMRZoMy.MS/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S/.S
