diff --git a/qrcode.zig b/qrcode.zig index a261fe970c2dff9d27e3e635930678ae7c5bbdb0..82dbaebfa7c857ef94d8b73c29c27b383ed64c1c 100644 --- a/qrcode.zig +++ b/qrcode.zig @@ -534,6 +534,36 @@ fn BitGrid(comptime size: usize) type { } return content.toOwnedSlice(); } + + pub fn asBrailleString(grid: *const @This(), allocator: std.mem.Allocator) ![]u8 { + const B = packed struct(u8) { @"0": bool, @"1": bool, @"2": bool, @"3": bool, @"4": bool, @"5": bool, @"6": bool, @"7": bool }; + var content: std.ArrayList(u8) = .init(allocator); + errdefer content.deinit(); + for (0..grid.size / 4 + 1) |y| { + for (0..grid.size / 2 + 1) |x| { + var b: B = std.mem.zeroes(B); + inline for (0..2) |x2| { + inline for (0..4) |y2| blk: { + const real_x = x * 2 + x2; + const real_y = y * 4 + y2; + if (real_x >= grid.size) break :blk; + if (real_y >= grid.size) break :blk; + const is_set = grid.isSet(real_x, real_y); + if (!is_set) break :blk; + @field(b, "01263457"[x2 * 4 + y2 ..][0..1]) = true; + } + } + var cp: u21 = 0x2800; + cp += @as(u8, @bitCast(b)); + var buf: [3]u8 = undefined; + _ = std.unicode.utf8Encode(cp, &buf) catch unreachable; + try content.appendSlice(&buf); + } + if (builtin.is_test) try content.appendSlice("|"); + try content.appendSlice("\n"); + } + return content.toOwnedSlice(); + } }; } diff --git a/test.zig b/test.zig index eb124ef4ad91cb90996e29421188bde60e00b92f..6b6a03e28becef96585cab4b01bb98c963dcff20 100644 --- a/test.zig +++ b/test.zig @@ -4,7 +4,6 @@ const expect = @import("expect").expect; test { const grid = qrcode.encode(.latin1, .L, 1, "Ver1"); - _ = &grid; const allocator = std.testing.allocator; const blocks = try grid.asBlockString2(allocator); defer allocator.free(blocks); @@ -22,10 +21,20 @@ test { \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀| \\ ); + const braille = try grid.asBrailleString(allocator); + defer allocator.free(braille); + try expect(braille).toEqualString( + \\⡏⣭⡍⡇⢻⢽⡃⡏⣭⡍⡇| + \\⠧⠭⠥⠇⣇⣆⠅⠧⠭⠥⠇| + \\⠉⠷⡊⠥⢝⠉⡉⠍⣑⠌⡇| + \\⡭⠭⠥⡍⣲⣲⢴⣳⠤⠐⠅| + \\⡇⠿⠇⡇⣌⠋⡉⠍⡁⠤⠅| + \\⠉⠉⠉⠁⠁⠁⠀⠁⠈⠁⠁| + \\ + ); } test { const grid = qrcode.encode(.latin1, .L, 2, "Version 2"); - _ = &grid; const allocator = std.testing.allocator; const blocks = try grid.asBlockString2(allocator); defer allocator.free(blocks); @@ -45,10 +54,21 @@ test { \\▀▀▀▀▀▀▀ ▀ ▀▀ ▀ ▀▀▀▀▀▀| \\ ); + const braille = try grid.asBrailleString(allocator); + defer allocator.free(braille); + try expect(braille).toEqualString( + \\⡏⣭⡍⡇⣂⡃⡽⣻⠂⡏⣭⡍⡇| + \\⠧⠭⠥⠇⢞⣔⠆⡌⡅⠧⠭⠥⠇| + \\⡿⣉⣅⢭⡏⠎⣲⢶⠭⠊⠼⢼⡄| + \\⡗⢰⡼⠍⡹⢥⠅⡙⣊⡎⠑⠭⠅| + \\⡥⠥⠥⡍⠞⠎⣲⢦⡏⠍⡟⢻⡇| + \\⡇⠿⠇⡇⡏⣥⠅⣩⢩⠏⡋⠇⡆| + \\⠉⠉⠉⠁⠁⠉⠀⠀⠁⠈⠉⠉⠁| + \\ + ); } test { const grid = qrcode.encode(.latin1, .L, 3, "Version 3 QR Code"); - _ = &grid; const allocator = std.testing.allocator; const blocks = try grid.asBlockString2(allocator); defer allocator.free(blocks); @@ -70,10 +90,22 @@ test { \\▀▀▀▀▀▀▀ ▀▀▀▀ ▀▀▀▀ ▀ ▀ ▀ ▀ | \\ ); + const braille = try grid.asBrailleString(allocator); + defer allocator.free(braille); + try expect(braille).toEqualString( + \\⡏⣭⡍⡇⣧⡐⡞⠗⢡⢯⡆⡏⣭⡍⡇| + \\⠧⠭⠥⠇⠞⣇⢅⢄⡞⠜⠅⠧⠭⠥⠇| + \\⡭⣴⠭⠕⣤⠅⡙⡂⢦⣺⣡⣮⢾⢟⠇| + \\⢐⡙⡄⠍⢰⣮⢮⢭⡑⠕⠮⢜⢻⠐⡆| + \\⠒⠜⣷⢍⠵⠇⡙⡂⢦⣺⡉⢺⢫⢌⠆| + \\⡭⠭⠤⡍⡳⣬⢮⢭⡑⠕⡏⠍⡏⠜⡄| + \\⡇⠿⠇⡇⣑⡁⡙⡂⢦⡪⡻⡩⡙⢲⡄| + \\⠉⠉⠉⠁⠉⠉⠈⠉⠁⠁⠁⠀⠁⠈⠀| + \\ + ); } test { const grid = qrcode.encode(.latin1, .L, 4, "Version 4 QR Code, up to 50 char"); - _ = &grid; const allocator = std.testing.allocator; const blocks = try grid.asBlockString2(allocator); defer allocator.free(blocks); @@ -97,10 +129,23 @@ test { \\▀▀▀▀▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀▀▀| \\ ); + const braille = try grid.asBrailleString(allocator); + defer allocator.free(braille); + try expect(braille).toEqualString( + \\⡏⣭⡍⡇⢔⠡⣐⠡⣐⠡⡐⣝⡅⡏⣭⡍⡇| + \\⠧⠭⠥⠇⡌⢖⠏⢖⠏⢖⢇⣝⡇⠧⠭⠥⠇| + \\⡭⡗⣭⠭⣕⡴⣗⡴⣗⡴⣏⢄⢼⠧⡰⠷⡆| + \\⠲⣞⠖⢍⡗⣟⠠⢛⠠⢛⢘⡄⡹⢧⠠⢢⡇| + \\⠧⠝⣐⠕⣮⠷⣗⡴⣗⡴⣿⢎⣷⢃⢅⠢⠇| + \\⢔⠑⠾⠅⠥⣛⠠⢛⠠⢛⠠⢁⢖⢗⢐⢼⡇| + \\⡥⠤⠭⡍⡷⠶⣗⡴⣗⡴⣗⣴⡏⠍⣏⢬⠅| + \\⡇⠿⠇⡇⡝⣙⠠⢛⠠⢛⠠⠓⡭⠩⠕⢔⠇| + \\⠉⠉⠉⠁⠉⠀⠁⠀⠁⠀⠁⠈⠉⠁⠉⠉⠁| + \\ + ); } test { const grid = qrcode.encode(.latin1, .M, 10, "VERSION 10 QR CODE, UP TO 174 CHAR AT H LEVEL, WITH 57X57 MODULES AND PLENTY OF ERROR CORRECTION TO GO AROUND. NOTE THAT THERE ARE ADDITIONAL TRACKING BOXES"); - _ = &grid; const allocator = std.testing.allocator; const blocks = try grid.asBlockString2(allocator); defer allocator.free(blocks); @@ -136,6 +181,26 @@ test { \\▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ | \\ ); + const braille = try grid.asBrailleString(allocator); + defer allocator.free(braille); + try expect(braille).toEqualString( + \\⡏⣭⡍⡇⣫⠎⢲⠲⡄⣳⡟⡣⡩⠒⠿⠍⢃⢐⡩⠛⠗⣻⢛⢽⠀⡏⣭⡍⡇| + \\⠧⠭⠥⠇⣔⡝⣞⡎⠆⠗⣄⢆⠆⡏⠍⡟⣍⣞⣏⠍⠄⠔⡕⢎⠄⠧⠭⠥⠇| + \\⠥⣹⢜⠝⡰⡕⡒⣩⡉⣽⢀⡱⢢⢝⣙⠣⠃⣒⠜⡜⡓⠢⠻⡕⣒⠵⣨⢪⡅| + \\⠫⣅⡏⢥⣤⠘⢩⠕⣪⣏⢸⣀⢿⣜⠄⡩⠪⢀⣙⣳⡼⡩⡪⡠⠉⡂⢖⡝⠂| + \\⣝⠵⠵⢥⣫⠻⠭⡑⢙⢖⠔⢧⢴⡉⡥⡬⣡⣶⡂⣀⢖⢥⢿⣋⣍⡩⢪⠼⠄| + \\⠾⢪⡗⠕⡙⢶⠖⡩⣿⠭⡾⡰⢖⠰⡱⣁⢄⡀⠤⠄⣱⢺⣌⠨⠓⠍⣻⠶⠅| + \\⡍⢶⡼⠽⡼⣠⢮⡶⣽⢡⢺⡌⡵⡧⠤⣍⢵⠌⣙⠒⠊⣠⢘⢇⡿⠦⣧⡡⡀| + \\⡏⡊⢧⠥⣏⢆⡞⡭⢧⡌⠫⢋⣅⡧⢥⠇⠉⢢⢬⣹⠚⡅⢡⢖⡧⣥⡯⢠⡁| + \\⡚⢛⡺⠥⠢⠯⠳⢎⢰⢪⢩⠍⢒⠑⣌⢺⠼⡍⠕⠼⢱⣩⢸⠥⣠⠤⡑⢒⠀| + \\⡢⡩⢊⠅⢰⡝⠺⠜⣊⠒⢑⢅⠧⡘⡲⡈⡾⡜⢫⣿⢌⢈⡊⡑⠋⢕⢀⢶⠂| + \\⢅⣗⢑⢕⢦⠙⣙⡍⠪⠽⠶⠷⠴⡈⢢⢳⡙⢫⠄⡊⠕⣔⡵⠋⠮⣢⡻⠴⡁| + \\⣕⣖⡻⢵⢸⣂⢂⣮⠾⢊⣠⣛⠊⠨⣱⢚⢜⢨⢊⠈⡫⢗⠼⡑⠼⠍⡽⠸⡄| + \\⡤⠤⠤⡅⣦⢣⣧⣡⣞⢻⡰⡇⡡⡏⠍⡏⠝⢟⣩⣇⠌⡉⠽⠄⡏⠍⣧⡎⠃| + \\⡇⠿⠇⡇⠮⠬⣹⠓⠹⡅⣓⡚⣚⣩⠩⠽⡉⢟⠄⡘⠤⢌⡙⠻⢽⣽⠃⠜⡀| + \\⠉⠉⠉⠁⠁⠈⠀⠀⠈⠈⠁⠉⠈⠀⠈⠀⠀⠉⠈⠈⠁⠀⠀⠁⠁⠀⠁⠀⠀| + \\ + ); } test { const grid = qrcode.encode( @@ -149,7 +214,6 @@ test { \\Although initially used for tracking parts in vehicle manufacturing, QR codes now are used in a much broader context, including both commercial tracking applications and convenience-oriented applications aimed at mobile phone users (termed mobile tagging). QR codes may be used to display text to the user, to add a vCard contact to the user's device, to open a Uniform Resource Identifier (URI), or to compose an e-mail or text message. Users can generate and print their own QR codes for others to scan and use by visiting one of several paid and free QR code generating sites or apps. , ); - _ = &grid; const allocator = std.testing.allocator; const blocks = try grid.asBlockString2(allocator); defer allocator.free(blocks); @@ -215,6 +279,41 @@ test { \\▀▀▀▀▀▀▀ ▀ ▀▀▀ ▀▀ ▀ ▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀▀▀ ▀▀▀ ▀▀ ▀▀ ▀▀ ▀▀ ▀▀▀ ▀▀ ▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ | \\ ); + const braille = try grid.asBrailleString(allocator); + defer allocator.free(braille); + try expect(braille).toEqualString( + \\⡏⣭⡍⡇⡒⣻⣓⢨⡎⠊⢌⡖⢘⡵⠛⣣⣃⣀⠵⢜⠺⡣⢪⠄⡌⡥⠛⣻⣪⣽⡔⡔⣺⠃⣂⡼⡟⢼⣀⢫⠪⢤⡝⡕⢳⡪⠫⠬⣕⣜⢂⣂⡺⠥⠆⡏⣭⡍⡇| + \\⠧⠭⠥⠇⠞⣞⢟⡄⠝⣆⢍⡄⠜⣔⠄⡏⠍⣟⡝⡝⠞⢞⠎⣜⡝⡝⠖⠟⡏⠍⡗⡜⠞⠎⢏⣔⣝⡔⠇⠇⢟⡏⠍⣗⢞⢏⢏⣄⡅⡅⢖⢟⢝⡗⠄⠧⠭⠥⠇| + \\⡫⢛⠣⢭⢅⢖⣥⡗⠾⠻⡷⡁⡪⡨⢯⢙⢏⣁⣣⠨⠯⢅⠄⣓⡂⣪⠯⢟⣭⣹⡿⡐⠌⠔⢌⣢⡲⣢⠬⢄⢾⢛⡩⣩⢤⠟⢦⣋⡛⣠⠷⢟⢔⡹⢉⢈⠺⣮⡂| + \\⠢⢣⣌⠥⣨⢊⢎⡵⡾⡒⢲⢚⡻⡸⢬⡁⢼⡊⡡⡐⢴⣇⢬⣛⡣⡀⠄⢥⢑⣀⣳⣠⠤⢏⢜⡚⡫⡨⠗⢍⠵⣊⡃⡢⠟⢏⠜⣘⡣⡒⠍⢆⢼⣹⢁⠉⣳⡨⠃| + \\⣒⢸⣐⠕⢽⢩⢻⠩⡒⣤⢨⠔⣣⡰⠥⢙⢜⡈⡪⡨⠔⢕⢌⡂⡋⡰⠤⠷⡝⣂⡳⣠⢧⢆⢌⣊⣡⡈⠼⢄⢴⠊⡱⡑⠥⢧⠝⡘⡺⡳⢴⢞⢔⣁⢗⠏⠚⣶⠀| + \\⢘⠏⡃⢵⣷⢕⣝⠨⢬⣙⣓⣖⡿⡙⢄⣝⢇⣋⡪⡈⢤⡏⠄⣘⣻⡀⢷⡟⠙⡘⡲⡡⠤⢏⢄⣱⡊⡹⠼⢯⢡⢘⣳⡰⢦⠽⢗⣠⣺⡫⠼⢧⢴⡹⢏⠝⣣⡪⠂| + \\⢄⢛⠁⠕⢒⠛⠇⢼⣔⢳⠒⠽⡮⡰⠜⡕⢬⣢⡫⡨⢧⠟⢍⣁⡢⡢⠤⠝⢝⣠⡫⡳⢶⢭⢜⣚⡳⡺⠨⢧⢔⣖⡃⡚⢄⢎⢬⣚⡻⡻⢴⢝⢔⡚⢃⢙⢢⡦⠀| + \\⡮⣩⡴⠽⣗⣕⡾⡭⠔⢩⡬⡝⠾⣹⠬⡽⠤⣜⡻⡀⠏⢾⢴⣙⡩⡨⠬⠟⡼⠶⣦⡨⠼⢥⢄⣀⡣⣸⠼⢌⠄⡾⠴⡤⠄⢥⢜⡘⡠⡹⠴⢽⢜⣰⡵⠭⣆⣆⠂| + \\⣂⢔⠧⠥⣿⠫⣻⡅⣾⠮⣨⢵⢸⡳⢅⠧⡥⠇⡓⡒⠴⢷⢈⡨⡫⣠⢼⢅⠧⠥⢧⡸⠴⠟⠜⣀⡓⡈⢭⢭⠦⠧⢥⠷⠵⢟⢦⡃⡫⡠⠮⠔⠄⡸⡧⠥⢇⣎⡂| + \\⢁⣼⠋⢕⠗⡢⠠⠟⢰⢉⢅⢫⠷⡊⢄⠍⡸⢩⡲⣪⢼⢄⢔⣋⣣⡘⠦⢷⡾⠓⠵⡢⢥⣇⢞⣚⣠⠸⠸⢄⠵⡖⢧⠝⠌⣤⢎⣒⡣⡸⠬⢖⠞⡺⠦⠪⢯⡤⡂| + \\⡁⡥⣻⢭⠒⡯⡍⡱⠙⢏⢭⡍⠨⠿⢄⠿⡺⢉⡙⡒⠧⢵⢟⡒⡉⡠⠻⢇⡯⢷⠯⡫⠤⢏⢎⣂⡻⡨⠥⢟⠧⣢⢅⠣⠼⢯⢴⣱⡣⡪⠤⣵⠾⡪⢪⣦⢔⡺⠂| + \\⣂⡱⠊⠅⠔⣏⠓⣛⠈⣻⢵⢛⡖⡹⢔⠏⡢⢷⡔⣸⠴⢦⢘⣐⣑⡹⢼⢧⠸⠽⠿⡣⠥⢏⠍⢰⡣⠻⠼⢎⠮⡌⢷⠻⠼⢄⠌⣠⣻⣰⢤⢯⢰⡲⢚⠎⢔⣢⠂| + \\⢘⡰⠓⢵⢻⢌⡓⡻⢰⣶⢩⡄⡯⡰⢍⣙⡪⢅⡫⣨⠼⢧⢤⣐⡣⣈⠌⢗⡋⢽⢿⡸⢤⢍⢎⡂⡫⣠⠧⢗⠼⡧⢃⠱⢶⢝⢇⡐⣸⡋⠦⣏⢴⡪⠊⠢⠤⣮⠂| + \\⣌⢹⣌⢵⢂⢛⠩⢲⠏⣆⢪⣂⢶⣨⢔⠋⡸⠑⣰⡩⠿⢮⢔⣈⣻⡻⠤⢕⡙⠭⢳⡹⠬⢿⠇⣛⡋⡐⠥⢏⠼⠼⢧⠹⠵⢝⢧⣛⡢⡸⠤⢵⠘⠠⡪⢢⢔⡨⡃| + \\⠭⢚⡏⠍⣏⡮⣖⢥⠯⢇⠬⠇⠢⣱⠵⡏⠍⣗⡠⡲⢾⠄⢤⣂⣣⡠⢼⠷⡏⠍⣯⡛⠠⣏⢀⣛⣳⣰⠜⢏⢽⡏⠍⡧⠤⢏⢞⣐⡈⡁⠶⢥⠎⡀⡏⠍⣏⣦⡂| + \\⣂⠬⠫⢝⣵⡣⢌⣘⣇⡨⠹⣑⡱⡚⢕⡛⣹⣫⡠⡙⠅⢽⠟⡘⡲⡺⢽⢥⣛⠻⡗⡺⠴⢦⢏⡑⣻⡐⠥⠇⢬⢍⠻⡧⢥⢷⠄⣰⣳⡠⠤⢏⠝⡘⣿⠝⣩⣂⡂| + \\⢺⢎⡖⢵⡕⠝⠓⣓⣦⢼⢹⠈⡩⣠⠔⣓⢙⣲⡳⡙⠥⢇⢌⣛⡣⡰⠾⠭⣺⢒⡎⡫⠌⢇⢄⣻⡳⣢⠯⢔⠯⠵⢎⠺⢼⢄⢕⣰⣫⡈⠣⠏⠎⡐⣆⡴⣈⡶⠆| + \\⢸⠗⣆⠥⡉⡨⢞⡲⢶⢰⢌⣶⠰⡰⠵⣧⣵⠊⡙⡰⠾⢏⢞⣊⡪⡲⠅⢭⡢⢦⠲⡨⠧⢎⠅⣘⡣⣠⢴⠇⢥⠔⡚⢪⠕⠦⢦⣘⡫⣸⠏⢇⠝⢀⠺⡅⣰⣎⡂| + \\⢮⢻⢶⠽⠴⡱⣰⢿⠟⡅⠫⠏⡵⣱⠵⣗⡕⣖⡸⡠⠧⢗⢗⣙⣰⡨⢿⠇⠲⣢⡶⡚⠌⠗⢌⡐⡺⣫⢾⢬⠆⣐⡮⡦⢜⠇⢜⣐⡉⣲⠍⢟⢅⡐⢖⠤⣬⣂⠂| + \\⠯⣹⡞⢅⣟⢪⢬⠴⠭⣬⡴⡝⣳⡀⠴⡳⢅⣶⡈⡰⢥⢧⠞⣘⡙⡸⠜⠬⡚⠲⢾⡐⠞⢟⢴⡑⣳⡨⠬⢏⢅⠔⡦⠲⢥⢟⢔⣨⡚⡸⠽⢤⢔⣐⡒⡔⣨⡮⡂| + \\⣃⡼⡭⠥⡤⠈⠍⠭⠑⢻⣛⡌⣺⡰⠾⡾⠤⣮⡢⡀⠾⠍⢖⣃⡺⡠⠦⠅⡦⠦⡮⡐⠴⢖⢔⣐⣣⣠⠧⢭⢕⡽⠮⣶⠮⢜⢇⣙⡳⣹⠴⢅⢸⡒⡾⠴⣶⡶⡂| + \\⡒⠍⡧⠥⠇⡆⢬⣿⣗⠦⢁⣞⡻⣻⠔⠧⠥⣟⡳⡻⠥⢟⠄⣘⡣⡪⠴⠮⢧⢥⣿⡸⢰⣟⢵⡛⡩⡘⠭⢟⢼⠧⣥⡯⠤⣔⢜⣱⡨⡻⢶⢇⢭⣊⠧⣥⢟⣮⠃| + \\⢅⣬⣒⠕⢁⠘⣻⢢⠝⣅⡵⣣⣒⢨⠍⢣⡺⣝⡓⣱⠵⠎⢆⡓⡉⣫⠍⠏⠣⠭⡍⡘⢴⢆⢌⣡⣪⣻⢤⢅⢤⣥⣅⣤⢮⠄⢜⡀⡳⡡⠗⢆⢥⣰⠴⣺⢵⣈⠂| + \\⢟⡡⡷⠕⢦⡦⡘⠈⡌⡇⡑⢔⠤⡨⠼⠂⡪⡝⣣⠀⠭⠌⠞⣲⣗⡙⠮⠯⢣⠴⠭⣸⠔⢇⢼⡒⡱⡨⠼⢏⢔⡥⡄⡵⢾⢝⢜⣒⣣⣱⠵⢽⢚⣰⣥⡈⢹⡮⠂| + \\⠺⢸⡂⠭⠟⡶⣩⠬⡋⢹⠒⢖⡘⡸⠌⢲⡢⢕⡠⡩⠷⢞⢞⣀⡳⣸⠤⠏⠠⠤⡵⣲⠕⢖⢤⣐⣻⡘⠕⢏⢴⢤⠽⠔⠽⢏⢵⣸⡃⣲⠶⢥⢜⣠⠷⣉⢍⡮⠂| + \\⡬⢀⣊⠕⢩⡅⣈⢁⡯⠀⡲⣖⡓⡁⠏⣿⡫⢌⡩⡠⢴⠇⢝⡙⡣⡊⢿⢬⣥⢤⠬⣸⠝⢇⢄⣠⡡⡀⢼⢄⢄⢍⢼⠴⠽⢗⠟⣘⡰⣰⢶⠆⠄⢠⠪⡨⣭⡢⠂| + \\⠇⡖⢯⢭⡟⣒⠫⣝⠘⡐⡡⡁⡚⡘⠘⡪⠣⢍⣽⡀⠥⢕⢜⣐⣫⡠⠧⠍⣧⠴⡵⣪⠤⠄⠒⣫⡢⡂⠤⠟⢴⢣⡕⡄⠭⢶⢌⣺⣠⡠⠔⢤⢼⣂⡿⡣⢑⡦⠂| + \\⡬⠥⠤⡅⢾⡬⢷⢒⡁⡧⡾⣊⡹⡳⢜⡏⠍⣧⡻⡋⠤⠗⢔⣀⡻⡻⠔⠕⡏⠍⡧⡈⠯⠔⢗⣑⣣⡡⢴⢇⢅⡏⠍⣯⢼⢯⢌⣢⡣⡪⢼⢌⠎⣂⡏⠍⡗⣶⠂| + \\⡇⠿⠇⡇⣧⠄⡎⠊⠵⡕⡪⢸⡠⡙⠵⢯⢍⣑⡸⡳⠴⢝⢌⣑⡻⡩⠽⢇⠍⣙⡡⡸⠌⢶⠖⣓⣻⡰⠶⢿⠜⣋⡻⡑⠵⠍⢤⣃⡻⣸⢸⢷⢛⣊⠽⢙⣣⡆⠁| + \\⠉⠉⠉⠁⠁⠉⠁⠉⠈⠀⠁⠁⠈⠁⠈⠉⠈⠀⠁⠈⠉⠈⠉⠈⠁⠉⠀⠉⠈⠁⠉⠁⠉⠈⠉⠀⠉⠉⠁⠉⠈⠀⠉⠈⠀⠁⠈⠀⠁⠉⠉⠈⠈⠀⠁⠁⠈⠈⠀| + \\ + ); } test { const grid = qrcode.encode( @@ -228,7 +327,6 @@ test { \\Although initially used for tracking parts in vehicle manufacturing, QR codes now are used in a much broader context, including both commercial tracking applications and convenience-oriented applications aimed at mobile phone users (termed mobile tagging). QR codes may be used to display text to the user, to add a vCard contact to the user's device, to open a Uniform Resource Identifier (URI), or to compose an e-mail or text message. Users can generate and print their own QR codes for others to scan and use by visiting one of several paid and free QR code generating sites or apps. , ); - _ = &grid; const allocator = std.testing.allocator; const blocks = try grid.asBlockString2(allocator); defer allocator.free(blocks); @@ -324,4 +422,54 @@ test { \\▀▀▀▀▀▀▀ ▀▀▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀▀▀▀▀▀▀▀ ▀ ▀ ▀ ▀▀ ▀ ▀▀ ▀ ▀ ▀▀▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀ ▀ ▀▀▀▀ ▀▀▀ ▀▀ ▀ ▀▀ ▀▀▀ ▀ ▀ ▀| \\ ); + const braille = try grid.asBrailleString(allocator); + defer allocator.free(braille); + try expect(braille).toEqualString( + \\⡏⣭⡍⡇⣧⡪⠭⡐⠧⢇⢀⠂⡃⡟⠾⠡⣜⣨⠲⢌⣴⣹⢊⣋⠻⡱⢉⠴⢃⣌⠴⠳⣴⣿⡱⢏⡆⢎⢏⢋⠓⢄⡿⣉⡬⠪⢈⡦⢖⠲⢏⢙⠷⣌⠃⣹⡘⢿⡑⣱⢉⣍⣛⠋⢋⣴⣃⣵⡼⡔⡫⡦⠿⡓⣍⢌⣅⠕⢊⢋⣄⡃⠆⢇⡂⡏⣭⡍⡇| + \\⠧⠭⠥⠇⢆⢏⢄⡖⢅⣝⢟⣕⣄⠝⡏⠍⡇⠄⡏⢗⠎⡌⢖⣔⡝⠕⢕⠗⡏⠍⣗⢗⣜⡟⢕⡏⡎⣗⡌⠏⢇⠝⡏⠍⡗⣗⠏⣞⣏⣗⣇⠕⡕⠌⢗⡅⡏⠍⣇⡍⡌⡍⠏⢔⡌⡄⡟⠏⢗⡕⡏⠍⣇⢔⡍⡌⡍⡆⠎⠏⡜⠄⠎⠆⡆⠧⠭⠥⠇| + \\⢍⣖⡫⢅⢦⠪⣛⡀⣫⣅⠥⠠⠻⡺⡻⣏⠵⣶⢁⡽⡵⣽⠹⢊⡾⢚⡿⣍⢛⠹⣍⢋⣜⣃⣋⡳⡐⡩⠴⢳⢿⢄⢋⢍⢱⢈⢛⢘⡍⢈⣻⠧⣱⡷⠫⠆⢿⣩⢝⣌⠳⣖⡝⡱⠳⣴⢚⢍⣌⡞⢏⣭⣋⢚⣅⠳⣆⣑⠰⠳⡬⠾⠱⠲⡰⠺⡼⡽⡇| + \\⢟⢏⡣⢅⢧⠂⢐⡋⢯⣍⠕⡧⠵⣃⡥⡓⠪⠃⢞⠷⡴⡽⢁⣌⡶⠋⢇⢋⠫⡵⣍⢋⣄⡪⢈⡳⡸⣓⡷⢳⠏⠴⡽⠸⡍⣋⠻⢀⣳⣋⡻⠶⡋⠴⠋⢎⢏⡓⢍⡶⡵⡦⡝⢉⡵⣔⠾⠱⢊⣆⢌⣄⣫⢤⠾⡵⡆⡇⢁⡵⡌⠈⠰⠲⣰⡳⡴⡵⡆| + \\⢟⣣⡣⢅⢧⢂⣺⢩⣩⣭⠲⠠⠵⡳⡙⡖⣢⣈⢘⠶⡴⣭⠩⣌⡶⢃⠾⣍⢓⠰⣍⢋⡌⣒⣋⣳⢤⡫⠴⢋⢄⢍⢻⢂⠰⢈⠳⢇⡋⢈⣻⠆⣷⡷⠫⠫⢏⠁⢯⣊⠳⣶⣥⠱⠳⣔⣒⢍⣌⣆⢏⡜⣣⠌⣇⠳⡾⡍⡸⠳⡔⠲⣇⡴⡈⠰⡴⡵⡆| + \\⢟⢉⡣⠭⣢⢚⠤⢯⣩⣍⣸⠠⠵⡛⡝⡆⢙⢒⣒⠶⡴⡭⠳⣍⡶⠣⡦⢋⠫⡵⡵⢬⣀⡫⢈⣣⢾⣒⡷⢫⠆⡴⣅⠺⣥⢏⠳⢟⡵⢋⣋⠃⡋⠴⢛⣮⢟⡉⢧⡶⡵⣞⣽⢉⡵⡄⢮⣍⣌⣖⢏⣌⣍⣄⡿⡵⡆⡹⢂⡵⣄⢀⠺⠲⣰⡳⣄⠳⡆| + \\⢟⣒⡣⢵⣢⢲⢐⢨⣩⡕⡘⡥⠵⣫⡛⣶⠜⢋⢐⠲⡴⡽⠩⣉⡶⠣⠶⢈⢳⡴⣍⢣⣙⣓⡳⡼⢼⡪⠴⢃⢧⢎⢛⢂⢰⢏⠳⢟⡏⣎⣋⢓⠷⡷⢋⣀⢸⡳⠫⣊⠳⡖⢹⣉⡵⣼⠒⢉⣌⣦⢎⣼⣍⣅⢀⠳⣆⣅⡿⠣⣖⠺⣇⡴⡈⠰⡼⡵⡆| + \\⢟⠫⡏⠍⣧⢺⢎⢭⣩⡭⣿⡦⠵⡃⡏⠍⡇⣑⣒⠳⡴⣥⠑⣍⡶⢓⡷⠺⡏⠍⡷⠬⣨⡨⢈⡣⠖⡲⢏⢄⠄⢬⡏⠍⣷⢏⠳⢿⢗⢏⣋⠋⢳⣰⣋⣘⡏⠍⣯⣎⢓⠲⡁⢉⡵⡔⠒⣉⣌⡾⡏⠍⣏⡽⡍⢷⢈⡼⢂⣅⡷⣄⠺⠒⡏⠍⣇⠳⡆| + \\⢟⠎⢫⢝⡥⣲⣹⣬⣩⡍⡘⡠⠵⣓⠟⡹⠇⣈⢘⠲⡴⡵⢹⣋⡶⠻⡤⠚⡹⣉⣏⠣⣉⠴⠳⡤⠻⡲⠷⢛⢇⢬⢟⠹⢗⣏⠳⠏⢄⡏⢋⢳⠔⠘⣍⣠⣏⠋⠫⢎⠫⣷⣭⢉⣕⠠⣲⢍⣌⡎⠽⡍⢏⣅⠐⢺⣈⣄⡟⢇⡶⡽⣇⣴⣋⢋⡽⣵⡀| + \\⢟⢙⣐⢭⣠⠂⡺⣮⣉⢥⣓⠡⠵⣳⡛⡠⡆⣐⣒⠶⡴⡽⡇⣉⡶⢃⢰⠚⡡⣉⡶⠬⣊⠴⢋⣣⠔⠰⢏⢬⠅⢤⢶⡵⠷⣏⡳⢷⠃⢟⢌⠋⠻⢘⣋⡐⢉⢳⢜⢎⢓⢢⣙⢉⡭⣵⢶⢉⡬⠂⠰⡴⢎⡽⡵⠺⢉⡼⢊⢊⡶⣅⠚⣲⠳⢌⣄⠻⠁| + \\⢟⡤⡀⢍⡰⡉⣢⣨⣙⡨⠿⠤⠕⣯⡝⣐⡁⣘⢬⠲⡴⣅⠢⣉⡶⠻⡅⠘⡙⢈⡶⡛⣉⠴⠳⡬⢎⠳⠷⢣⠟⢧⠖⡱⢿⠗⡳⠏⢌⡯⢌⢳⢼⣹⣉⣠⣎⠋⢛⢊⠫⡗⡭⢍⣕⢰⣚⢉⣔⣏⠵⡤⣎⣅⠰⠴⣈⣄⣷⢊⡶⣍⠳⣵⣿⣉⡬⠳⠁| + \\⢔⢾⣐⢅⢡⢢⢳⢬⣉⢥⡬⠣⣝⡶⡙⡰⠂⣘⢤⠲⣄⠻⡧⣍⠰⢃⢠⠸⡳⣉⡎⡑⣉⠴⢛⠟⢊⠳⢏⢄⢏⣣⠾⡵⢗⢶⡳⢷⠛⢯⢌⠋⠳⠸⣋⡐⢉⢳⢌⢉⢓⠲⡭⢉⡭⡅⣶⢉⡬⠊⠵⣔⢊⡽⣝⢴⢈⣌⣶⠰⡶⣍⢳⣳⠼⣱⡭⢻⡁| + \\⢗⡣⡀⠕⡵⡹⢏⢩⣛⡨⠏⡉⠆⣮⡝⡘⠄⣘⢜⠢⠾⣅⠚⡜⣁⡽⡕⠶⡽⠈⣠⡰⣋⠴⢓⠾⢏⠳⢗⣙⢍⣣⢶⠱⠗⠗⣳⡏⠔⢇⢌⠳⢴⣙⣋⣠⢎⠋⢋⢉⠋⢗⡱⢋⣕⢈⠣⣍⣔⣷⣉⡻⣎⡵⡴⢼⢈⣌⣾⠀⠶⣍⠣⡵⡗⣓⠵⠼⡁| + \\⢔⣂⣐⢝⣣⢢⠓⣙⢍⢥⡜⢮⣜⡶⣙⠲⠂⣘⢄⣌⣇⠻⡯⣯⡸⢃⠠⠦⣶⣉⡨⡁⣈⠴⢃⡦⢏⠳⢿⡳⢉⣣⢆⠱⠟⠯⡋⠴⢋⢯⠌⡳⢼⢩⣋⣠⢎⠳⢌⢉⢳⠱⠲⢋⣭⡵⡵⡶⡩⠒⠶⣌⢋⡵⡄⠶⢉⣌⡾⢄⡶⣍⠛⣱⣡⣀⠵⠺⡁| + \\⢗⣗⡏⠍⣷⡽⠟⣡⣟⡨⢇⣊⡃⣾⡏⠍⡇⣘⢌⣍⡾⣅⢂⡝⢀⣍⠡⠚⡏⠍⡿⡱⣈⠴⢻⠧⣋⠳⠇⣒⣋⣳⡏⠍⣯⠗⣳⡷⢋⠿⢴⠰⠼⢀⡋⠠⡏⠍⣏⢉⠣⣍⡴⠫⠲⣎⠳⡖⢕⣟⡏⠍⡿⠳⣴⢲⢉⣌⣾⠈⡶⣍⢣⡗⡏⠍⡧⠒⡀| + \\⢔⣂⠭⢭⣉⣧⠛⣁⠏⣥⣔⡙⣚⡦⠍⡛⡥⣜⢌⣝⣆⢋⢋⡜⠹⢋⠱⣄⢋⢿⠝⣚⣏⠴⠃⢔⢈⢳⣳⡩⢈⡳⠻⢋⡻⡦⡋⠴⠃⢾⠎⡳⢼⣩⣳⣃⡽⢋⣍⢱⠒⠱⠲⠃⠺⡶⡵⣶⠅⣵⠽⢋⣇⡵⡄⠢⠹⢊⣾⢘⡶⣍⠣⣥⣋⢋⢷⠪⠃| + \\⠳⣗⡾⠭⢈⠼⠟⡩⠔⡶⢖⣉⣦⢶⡒⢉⢡⢙⢌⣭⠞⢉⢋⡌⢁⣍⠱⣍⠂⠼⠷⡨⢌⠴⢓⠬⣋⠫⣙⣐⣋⣃⠱⢋⡳⣰⣳⡷⠋⢮⢴⠰⠔⣩⡉⢈⡴⢋⣍⠙⠒⣉⡴⢛⣪⣎⠳⡆⡍⡉⢃⡼⠺⠳⡜⢴⢁⣌⡮⠔⣄⢋⠫⣵⣫⠌⠇⢺⠁| + \\⢠⣂⢮⠽⢜⠝⡜⣹⢕⠰⢖⣱⡻⢒⡅⡛⡭⣜⢌⣥⢆⢎⢋⣄⢸⢉⠱⣅⣖⠥⠯⣒⣏⢔⢗⢕⢈⢳⣐⡩⢈⣓⠱⢋⠳⡠⣍⡴⠳⠫⠌⡳⠴⢐⣳⣋⡴⢋⣍⠡⢲⠱⠲⢋⢚⠲⡵⡞⣍⣵⠼⢂⣇⡵⡴⠴⠸⢊⣮⠴⡼⣍⠫⣽⣷⠀⠇⠜⠁| + \\⠾⣗⢻⠍⠋⡟⡜⡱⠛⠴⢖⣙⡪⢑⡕⠹⣥⢉⣎⡭⡗⢊⢋⡜⣑⢊⠱⣝⣊⠌⢽⠫⠴⢃⢞⠭⣋⢻⡈⣐⣋⡣⡱⢋⠴⣸⣛⡰⠳⠫⢶⠰⠴⠟⠍⢈⣔⣏⣍⠱⡲⢉⡴⠣⢛⡶⡵⡆⠥⣉⠳⡼⠺⠳⣄⠺⣇⣌⣖⢂⢀⢻⡩⣟⡭⠆⠖⠨⠄| + \\⢖⡪⠢⠅⠸⠙⡜⡹⡩⡱⢖⣩⠤⢒⡅⡻⡬⣬⢈⣍⡶⢊⢋⡄⡉⢌⠱⡍⠲⡬⠿⣓⣏⠜⢇⢔⠰⠄⡀⣉⣈⡣⠱⠻⠴⡰⡛⡰⠳⢫⡾⠷⠴⢷⠳⢋⡬⢊⡭⣅⠖⢉⡴⢻⢊⡲⡵⣖⣁⢉⢳⣇⣷⠷⣌⢃⠺⠚⢀⡼⡽⡽⡫⣼⢟⠊⡇⠰⡇| + \\⠱⡪⠻⠍⢂⡜⡜⣑⢡⡰⢖⡱⡦⣗⡕⡽⣤⠉⣉⡕⡦⢊⢋⡬⢸⢏⠱⡍⠶⡼⠴⠬⠴⢋⢇⢌⢋⠻⣐⣊⡰⡜⠱⢛⠴⣠⢳⡰⠳⠋⡣⡷⡴⠏⠌⢏⣔⣏⣕⠰⢂⢉⣔⡿⠆⡶⡵⣎⡭⣉⠣⣍⣮⢄⣎⠻⡷⣔⢈⣅⢀⢻⣉⡍⢬⠂⡇⢂⠂| + \\⣥⡪⡏⠍⣷⡝⡼⣡⣇⠰⢖⡹⠫⣑⡏⠍⣯⡀⣏⣕⡶⢎⢋⣌⡯⢊⠱⡍⡏⠍⡷⠴⢏⢔⠶⣌⠳⢴⣨⣋⣈⡫⡏⠍⡷⡈⠓⢰⡳⢳⣼⡖⡳⢷⢋⢯⡏⠍⡯⣵⠒⢉⡬⠊⡊⡶⣕⢚⢝⡽⡏⠍⣟⢂⣎⢃⠲⣅⢉⡽⣭⠻⢉⣄⡏⠍⣇⠺⡇| + \\⡀⡪⠙⠭⠥⡙⣴⢮⠴⡳⠖⠕⢡⠨⠍⣟⡵⠺⣈⡽⣴⢈⢋⡼⠺⢈⠱⡅⢏⣭⡷⠴⠷⢋⠷⣌⢋⠫⡂⣋⡰⣄⢏⢻⠵⣰⠤⢍⡳⠋⣳⡗⡳⠏⢌⣮⣻⠹⣗⠐⡶⣍⣔⡯⡞⠲⡭⡇⣭⠙⡉⡿⣩⢖⣎⠻⡧⣝⣉⣅⠐⢤⢈⡤⢏⠙⣉⢃⠂| + \\⡲⡪⡦⠽⢉⡜⡴⣰⢑⡱⢆⢯⢼⡧⠭⢘⣌⠕⠺⢃⠀⢎⢋⣄⣯⠘⠷⡝⣊⣜⡵⠴⢇⣃⠷⣌⠳⢼⣋⢌⣈⣋⣈⠓⠱⡈⢓⡉⡵⢳⡤⡷⡳⢷⠋⠶⠌⡳⡮⡥⣖⢉⡬⠊⢺⡶⣕⠚⡝⠙⣡⡶⣈⠀⢎⢃⠢⣝⢈⣍⠉⢾⣉⣼⡰⡍⣈⠻⡇| + \\⢟⡪⢫⠭⢥⠛⣴⠆⢉⣒⡟⠔⢱⠦⢝⢟⡬⢏⢁⡽⡥⠪⡹⠺⠪⢞⡵⡥⢍⣴⠷⠴⠗⡊⠷⣌⢣⡳⣊⢌⡰⣬⢊⢣⣱⢰⢼⢩⡳⠋⣻⡦⡳⢏⠌⢿⣳⢰⢐⢐⣊⢋⣔⡗⣚⠲⡭⣏⡤⡙⡩⡲⡈⠢⣎⢋⢳⣄⢉⣍⠉⢞⣈⡤⠷⣞⣌⢃⠂| + \\⣁⡪⡆⠽⡥⠥⠳⣰⠙⡲⣇⢯⢜⠄⠛⢛⣴⢥⠺⢃⠠⢻⣁⣄⣯⠂⣆⠛⣊⡌⠴⠴⠟⣨⠵⣌⠳⡋⣍⢌⡐⢌⠲⢼⡍⡋⢻⠘⣵⡳⣼⠿⡳⢏⢤⠶⢒⢳⢁⢸⢎⢋⣬⣊⣍⠱⣕⠲⠪⠙⡉⡶⣨⢈⣎⢋⢓⣍⣉⣍⠱⢺⢉⣼⡰⡮⢌⢋⠃| + \\⠲⡪⣜⠽⡤⢟⣳⠆⠁⠭⡘⠔⢡⢕⠠⢚⣤⢨⢅⡽⣍⠚⡹⠺⢒⠂⠿⡥⢍⣴⠳⠴⢟⣊⠴⣌⠋⡣⢌⢌⡀⣌⢉⠳⢵⠰⢴⣘⡏⠰⣴⠷⣳⣏⠔⢿⣓⠯⢉⣎⢋⢋⡤⡱⢋⢑⠊⢋⡴⠛⣉⠲⣈⠌⣎⢋⠓⣝⣈⣍⠡⢖⢉⣤⡱⣖⣏⢋⠃| + \\⣽⠈⣻⠽⡤⢗⡑⢰⠁⠧⢁⢯⢌⡀⡴⠝⢬⡣⡹⢃⢈⢻⢁⡴⢋⣄⣆⠛⣊⡌⠴⠴⢯⡰⠲⣌⢻⣓⣏⢌⠄⠬⡵⢜⡍⡳⠴⢹⣱⡳⣜⢆⡏⢌⢔⠶⢲⢯⠉⡶⣍⢳⣥⣉⣍⠡⡂⠱⠲⠻⢫⡶⣠⠢⠾⣍⠣⡥⢉⣍⠱⠚⢉⣤⡱⡮⢌⢋⠃| + \\⣥⡠⡏⠍⡧⠏⢠⡂⠁⠏⠛⢰⢑⡒⡏⠍⡇⣾⡳⢋⢉⠛⠸⠲⢋⡝⡿⣵⡏⠍⡷⠴⠟⣐⡳⣌⠻⡪⢌⢜⠗⠥⡏⠍⣷⠰⢴⡙⡋⠰⡼⠗⣳⣏⢜⠇⡏⠍⡇⣎⢋⢻⢭⠱⢋⠙⢢⢉⡴⠃⡏⠍⣷⢎⢇⢋⠃⡩⡹⢋⠉⠎⢉⡤⡏⠍⣏⢋⠃| + \\⣥⣚⠯⢝⡥⠷⢵⡆⡂⠟⡘⣳⢑⣪⣭⡿⣳⡨⢆⣍⢉⠳⡑⡲⢋⡝⣆⠳⡿⣍⠳⠴⢟⡫⠰⡌⠏⣑⣏⢴⢍⠧⡻⠋⢏⠳⢌⣼⣱⡳⡼⡷⡋⢌⠤⢗⢽⣹⠏⡲⣍⠃⢙⢋⣍⢱⢞⠵⠲⢓⣟⣉⢍⠄⠾⣍⢛⡋⣀⣍⢱⢊⠻⢂⢋⡉⣋⢋⠃| + \\⣥⡼⠩⢝⡤⢧⠏⡀⡂⠏⠟⣶⢑⡪⢀⠥⠯⠘⡽⢋⢉⠛⡐⡵⢋⣅⣎⠳⡶⡴⣍⠓⣟⣒⡳⡬⠕⡫⢌⢄⠗⣔⢀⣝⢷⡷⢌⣼⣉⠰⡴⡠⣳⣏⠌⢯⢌⣃⢌⢊⢋⢳⡭⡱⢋⠱⡮⡵⠲⢋⠺⢈⡼⢢⢆⢋⠃⣇⡿⢋⢁⠸⣇⣌⢋⣰⡼⣍⠃| + \\⣥⣫⠩⢝⡤⠗⠮⡃⡂⢯⢙⣲⢑⣂⡀⠋⠄⡪⢆⣍⢉⢣⠐⡵⢋⡍⠆⠲⣖⢈⠳⠬⣨⡨⢈⡓⠷⣓⣏⢔⢆⠬⣫⢍⠰⡷⢌⣼⡡⠷⡴⡘⠋⣌⠴⢻⢀⣉⠭⠶⣍⢓⣩⠱⢋⢁⢆⠵⠲⠫⡺⢑⡳⠻⡽⣍⠻⠻⢂⣝⠧⢂⠺⢊⢋⣈⣃⢋⠃| + \\⣥⢹⠩⢝⡤⠷⣙⡃⡂⢷⢱⣲⢑⡚⡩⣈⢻⠙⡽⢋⢉⠻⢁⡱⢋⣕⡆⠲⡮⣍⢋⠣⡀⢓⡳⣼⢿⣋⡴⠓⠞⢔⢨⠺⡽⠷⢌⡌⢩⡷⡴⣰⢬⣈⡴⠋⣄⣓⠮⡶⡭⡟⣍⠱⢋⠱⢂⠵⠲⢋⠶⠗⡳⢃⠀⠻⠱⢂⡿⢣⣆⠺⣇⣌⢋⣈⡻⣍⠃| + \\⣥⡆⠩⢝⣤⠋⠌⡁⡂⢗⠑⢵⢑⡢⢸⣿⢼⠩⢆⣍⢉⠓⡠⡵⢋⣅⠨⠶⣖⢈⠳⠼⡳⢋⣈⣳⠡⣋⣌⢜⢎⠬⣓⢂⠸⠷⢌⣴⢋⣶⠴⡈⢳⣹⡱⠻⣔⣚⠧⠶⣕⠂⢁⠱⠫⡥⢲⡵⠲⢋⡶⢯⡷⠻⡵⠴⠱⠺⢒⢛⣏⢃⠺⢊⠋⢈⣃⢻⡁| + \\⣥⠿⠩⠝⡄⡉⠳⠁⡢⢻⢴⣳⢑⣢⣵⡥⣻⠙⡍⢋⢉⢃⠓⡴⢋⡽⡥⠲⡮⣍⢋⠳⡰⢋⡰⡔⠴⢌⡴⢃⢄⠶⡘⠾⡭⠷⣌⡌⢤⢎⠲⣰⠜⣸⡱⢳⣔⣙⢭⠶⡭⣟⡌⠱⢓⢰⠂⠱⢒⡧⡲⢏⡱⢃⠘⠺⠱⢂⣯⠗⣎⠻⣷⣊⢳⣋⡻⡭⡁| + \\⣥⡮⡏⠍⣧⢚⣩⠁⣢⣆⡕⣲⠑⣪⡏⠍⣿⢉⣎⢏⢉⠻⡇⡱⢋⣅⠈⠂⡏⠍⡇⡻⡰⢋⣈⡋⠷⢌⣌⢜⢧⠖⡏⠍⣟⢯⣉⣴⠃⢇⠲⡈⢣⢩⡳⠻⡏⠍⡯⡶⣕⠚⢙⠱⠫⡵⢂⠵⠪⠪⡏⠍⡷⠻⡍⢾⠱⠺⢚⠦⢎⠳⣖⣕⡏⠍⡷⢗⡀| + \\⠒⡃⢿⠝⡇⡑⣓⠂⡲⢹⠱⢖⣪⢶⣍⣟⢻⢉⣿⣉⠹⣅⠂⡕⣉⡽⡥⢢⠏⠽⠻⡣⡰⢋⡈⠗⠳⢌⡴⢋⠷⡄⣹⠩⢵⠆⣋⡌⠌⠇⠴⣰⢴⡨⡳⢻⢟⠫⠳⡴⡭⣷⣅⡵⢓⠰⠒⡱⢒⣟⢋⣛⠳⢃⠠⠺⠱⠲⢻⠂⣎⠳⡦⡕⠹⠽⠣⢾⠁| + \\⣷⡓⢿⠵⢣⢲⣲⠃⢡⣆⣝⡝⠜⡃⣇⣮⢼⢉⣇⢌⣇⠻⡯⡈⡸⢃⠐⢮⢶⠷⠳⣻⡰⢋⣘⢧⠷⢌⣴⣈⠷⡌⣱⣕⣷⠯⡋⢴⢋⣿⠴⣈⠛⣨⡳⠣⡠⠒⠵⡴⣕⢲⣍⡶⠫⡵⣕⠱⠪⢚⣊⣳⠳⢋⠁⠨⠲⠲⢣⠞⣎⠳⡆⡱⣋⠳⠒⠮⠁| + \\⠒⡺⢿⠵⠄⡑⣳⠳⠳⢹⠉⠀⢮⠦⢅⣆⢹⢉⡏⠏⡾⣅⠒⡥⢁⡽⣕⢨⣞⡰⠫⡂⡱⢋⣨⠝⠷⢌⣄⣃⡳⡌⡱⢉⣼⠶⣷⣏⢄⣇⢲⢈⠻⠀⡳⢻⠿⣵⠴⡴⣅⣉⣌⡶⠳⣌⢋⠛⣕⣟⣋⡛⡶⢋⠹⠨⠱⠲⢛⠊⣎⠳⡎⡵⡳⠴⠒⢴⠁| + \\⣷⠺⠌⢍⡇⣶⣢⢢⢧⣆⣍⢀⠙⡳⣄⣶⢾⢉⣇⠆⢇⠻⡿⠃⠸⠳⡴⠖⢴⡰⢣⡫⡱⢋⣘⢍⠲⢌⣬⡫⠰⡌⡱⣍⣴⣟⡏⢌⢔⠎⠊⣋⠻⢸⣳⡣⡰⡍⠳⡴⡵⠱⢊⡎⢒⡶⣍⠓⢭⠚⢎⣛⢂⣍⠡⠺⠱⠲⠃⠔⣏⠳⡮⡥⣋⠳⠊⢮⠃| + \\⠒⡺⠍⠭⡖⠕⣣⠂⡑⢹⢁⠣⢨⠦⢅⡮⢬⢉⡿⣞⡿⡵⡶⢚⢀⡵⣄⠲⢦⡱⠻⡫⠵⢋⣐⠮⡳⠌⣀⣓⡳⡌⣱⣉⣜⢇⢱⣏⠄⢯⢴⢈⢓⡑⡋⠸⡱⣵⠴⡤⢚⣉⣌⡞⠦⢎⢋⠳⣝⠙⣊⡓⡾⢋⢁⢠⢁⡴⢫⢤⢎⠳⡦⡔⡭⡱⠢⢚⠁| + \\⠷⢞⠨⢍⠃⣲⣢⢺⠰⣛⣄⢃⣝⡳⣄⡖⣧⣋⣟⡗⠆⠳⡶⢂⠹⠳⣌⠓⡾⡰⠃⣑⡷⢋⡈⢕⠰⠄⡘⡩⠰⡌⡡⢉⣌⠓⡍⢌⢤⣗⠌⣋⠫⣙⣵⡻⡱⡍⠳⡔⣲⠱⢊⡞⢎⡶⣍⢓⣩⠥⢍⡳⣆⣍⠑⢸⠹⠲⢛⢒⡼⡵⡦⡥⠨⡡⠉⠿⡀| + \\⡬⠬⠬⡅⣳⡜⢡⠊⣰⣟⣄⢣⣐⢶⡏⠍⣯⢈⡷⠉⡯⠲⡶⠂⣑⠳⣌⢃⡏⠍⡷⡪⠴⢫⢌⠯⡳⠤⣘⣐⡳⡬⡏⠍⣏⠓⡳⣏⢌⣀⢲⢈⢫⣨⡉⢘⡏⠍⡷⡴⠺⣍⣌⣆⣎⣎⢋⠻⣭⠉⡏⠍⡿⢋⢙⢞⢀⡴⠛⢆⢀⠳⡖⡵⡏⠍⡇⢨⠁| + \\⡇⠿⠇⡇⣁⡞⢡⢪⣱⢚⣄⠋⣑⢆⠯⡙⣥⣫⠙⣆⣶⠲⡶⢊⣪⠰⣌⢣⢝⠭⠧⣓⣏⢤⢜⢔⠰⢬⣉⡫⠰⣌⡝⠿⣍⢣⣳⣈⢌⣨⢌⢋⢋⣼⢱⡳⢋⣏⡵⣴⢢⠱⢊⡆⢻⣊⢋⠓⢱⠹⣏⡍⣁⣍⠱⣄⠻⠲⢋⠾⡽⣥⠘⣅⢙⢋⠇⠚⠂| + \\⠉⠉⠉⠁⠉⠉⠁⠈⠁⠈⠀⠉⠀⠀⠀⠈⠉⠀⠁⠁⠁⠀⠀⠀⠈⠀⠈⠁⠁⠉⠈⠉⠀⠁⠈⠉⠉⠉⠁⠁⠁⠀⠁⠀⠈⠁⠁⠉⠈⠈⠀⠈⠉⠈⠈⠀⠈⠀⠁⠈⠀⠁⠈⠈⠈⠈⠉⠁⠉⠁⠈⠈⠈⠉⠁⠉⠁⠀⠉⠀⠀⠁⠉⠈⠉⠈⠈⠀⠁| + \\ + ); }