Window btoa() 方法详解:从基础到实战应用
在前端开发的世界里,数据的编码与解码是绕不开的一环。尤其是在处理网络请求、身份验证或安全传输时,我们常常需要将原始数据转换成一种“安全”的字符串格式。这时候,Window btoa() 方法就成为了开发者手中的利器。
它是一个内置在浏览器环境中的全局方法,属于 Window 对象的一部分,能够将二进制数据(以字符串形式表示)编码为 Base64 格式。虽然名字听起来有点“高冷”,但其实它的原理并不复杂。今天我们就来深入拆解这个方法,带你从零开始掌握它。
什么是 Base64 编码?为什么需要它?
在计算机中,所有的数据最终都以二进制形式存在。但有些场景下,我们不能直接传输原始二进制数据,比如在 HTTP 请求头中传递用户凭证、嵌入图片作为 CSS 背景、或者在 JSON 中携带敏感信息时。
这时候,Base64 就登场了。它是一种编码方式,可以把任意字节序列转换成由 64 个可打印字符组成的字符串(A–Z、a–z、0–9、+、/),最后用 = 做填充。
你可以把 Base64 想象成一种“翻译官”——它把原本看不懂的“机器语言”翻译成所有人都能识别的“人类语言”,方便在网络上传输。
而 Window btoa() 方法,正是这个翻译过程的执行者。
Window btoa() 方法的基本语法与使用
const encoded = window.btoa("Hello, World!");
console.log(encoded); // 输出: SGVsbG8sIFdvcmxkIQ==
上面这段代码展示了 btoa() 最基本的用法:传入一个字符串,返回其 Base64 编码结果。
语法说明
window.btoa(data)
- data:必须是字符串类型,且每个字符的 Unicode 编码值不能超过 255(即单字节字符)
- 返回值:Base64 编码后的字符串
- 错误情况:如果输入包含超出 0–255 范围的字符(如 emoji、多字节 UTF-8 字符),会抛出
InvalidCharacterError错误
注意事项
btoa()只接受字符串输入,不能直接处理对象或数组- 它不支持 UTF-8 中的多字节字符(如中文、表情符号),如果传入这些字符,会导致编码失败
- 编码后的内容虽然可读性差,但适合用于 URL、HTTP 头、JSON 字段等场景
实际应用场景一:用户认证中的 Basic Auth
在 Web 开发中,Basic Authentication 是一种常见的认证方式。服务器要求客户端在请求头中附带用户名和密码,格式为 用户名:密码,并用 Base64 编码。
例如,我们有用户名 admin 和密码 123456,就可以这样构造认证头:
const username = "admin";
const password = "123456";
// 使用 Window btoa() 方法编码
const credentials = window.btoa(`${username}:${password}`);
console.log(credentials); // 输出: YWRtaW46MTIzNDU2
然后在发送请求时,设置请求头:
fetch("https://api.example.com/protected", {
method: "GET",
headers: {
"Authorization": `Basic ${credentials}`
}
})
.then(response => response.json())
.then(data => console.log(data))
.catch(err => console.error("请求失败:", err));
✅ 这里的
Basic是固定前缀,后面跟的是 Base64 编码的用户名:密码组合。
⚠️ 注意:Base64 不是加密!它只是编码。所以不要用它来保护敏感信息,除非配合 HTTPS 使用。
实际应用场景二:将文件内容转为 Base64 字符串
有时我们需要把图片、音频等文件嵌入 HTML 或 CSS 中,而 Window btoa() 正好可以配合 FileReader 使用,实现这种“内联化”。
比如我们想把一张 PNG 图片转为 Base64 字符串,以便在网页中直接显示:
// 假设有一个 <input type="file" id="imageInput" /> 元素
const fileInput = document.getElementById("imageInput");
fileInput.addEventListener("change", function (event) {
const file = event.target.files[0];
if (!file) return;
const reader = new FileReader();
// 读取文件为 ArrayBuffer
reader.readAsArrayBuffer(file);
reader.onload = function () {
// 将 ArrayBuffer 转为 Base64 字符串
const arrayBuffer = reader.result;
const uint8Array = new Uint8Array(arrayBuffer);
const base64String = window.btoa(String.fromCharCode(...uint8Array));
// 输出结果
console.log("Base64 编码后的图片数据:", base64String);
// 可以用作 img 的 src
const imgElement = document.getElementById("preview");
imgElement.src = `data:image/png;base64,${base64String}`;
};
reader.onerror = function () {
console.error("文件读取失败");
};
});
关键点解析
FileReader.readAsArrayBuffer()读取文件为二进制数据Uint8Array是一种视图,用于操作原始字节流String.fromCharCode(...uint8Array)将字节数组转换为字符串(每个字节对应一个字符)- 最后调用
window.btoa()完成编码
这种技术广泛应用于前端预览、动态生成图标、或打包静态资源。
实际应用场景三:生成唯一标识符(Token)
虽然 btoa() 不是生成 Token 的标准方式,但我们可以利用它来创建“临时、随机”的唯一字符串,用于会话管理或临时链接生成。
// 生成一个随机的 16 字节数组
function generateRandomBytes(length = 16) {
const array = new Uint8Array(length);
crypto.getRandomValues(array);
return array;
}
// 将随机字节数组编码为 Base64
function generateToken() {
const bytes = generateRandomBytes();
return window.btoa(String.fromCharCode(...bytes));
}
// 使用示例
const token = generateToken();
console.log("生成的 Token:", token); // 例如: aXVpY3RzQ3JlZGVudGlhbA==
🔐 这种方式生成的 Token 具有较高的随机性和不可预测性,适合用于一次性链接、验证码、临时会话等场景。
常见问题与注意事项
| 问题 | 原因 | 解决方案 |
|---|---|---|
InvalidCharacterError 错误 |
输入字符串包含非单字节字符(如中文、emoji) | 使用 TextEncoder 先编码为 UTF-8 字节数组 |
| 编码结果长度太长 | Base64 编码会使数据膨胀约 33% | 仅用于小数据,大文件建议分块处理或使用其他方案 |
| 不能解码回原始数据? | btoa() 是单向编码,需配合 atob() 使用 |
使用 window.atob() 可逆解码 |
如何正确处理中文字符?
由于 btoa() 会将中文字符视为多个字节,直接传入会导致错误。正确的做法是使用 TextEncoder 将字符串编码为 UTF-8 字节:
const text = "你好,世界!";
// 使用 TextEncoder 将字符串转为 UTF-8 字节数组
const encoder = new TextEncoder();
const bytes = encoder.encode(text);
// 转为 Base64
const base64 = window.btoa(String.fromCharCode(...bytes));
console.log("编码结果:", base64); // 输出: 5L2g5aW95L2g5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5LqG5LqG5LiW5LqG5LqG6K+H5