rulewright 0.1.2

Executable engineering standards for Rust workspaces
Documentation
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
321
322
323
324
325
326
327
328
329
330
331
332
333
334
335
336
337
338
339
340
341
342
343
344
345
346
347
348
349
350
351
352
353
354
355
356
357
358
359
360
361
362
363
364
365
366
367
368
369
370
371
372
373
374
375
376
377
378
379
380
381
382
383
384
385
386
387
388
389
390
391
392
393
394
395
396
397
398
399
400
401
402
403
404
405
406
407
408
409
410
411
412
413
414
415
416
417
418
419
420
421
422
423
424
425
426
427
428
429
430
431
432
433
434
435
436
437
438
439
440
441
442
443
444
445
446
447
448
449
450
451
452
453
454
455
456
457
458
459
460
use crate::{FileCtx, Violation, violation};

const BIDI_CONTROLS: &[char] = &[
    '\u{200E}', '\u{200F}', '\u{202A}', '\u{202B}', '\u{202C}', '\u{202D}', '\u{202E}', '\u{2066}',
    '\u{2067}', '\u{2068}', '\u{2069}',
];

// Source: https://github.com/hediet/vscode-unicode-data
#[rustfmt::skip]
const CONFUSABLES: &[(char, char)] = &[
    ('\u{00A0}', ' '), ('\u{00B4}', '`'), ('\u{00B8}', ','), ('\u{00D7}', 'x'),
    ('\u{0131}', 'i'), ('\u{017F}', 'f'), ('\u{0184}', 'b'), ('\u{018D}', 'g'),
    ('\u{01A6}', 'R'), ('\u{01A7}', '2'), ('\u{01B7}', '3'), ('\u{01BC}', '5'),
    ('\u{01BD}', 's'), ('\u{01C0}', 'I'), ('\u{01C3}', '!'), ('\u{021C}', '3'),
    ('\u{0222}', '8'), ('\u{0223}', '8'), ('\u{0241}', '?'), ('\u{0251}', 'a'),
    ('\u{0261}', 'g'), ('\u{0263}', 'y'), ('\u{0269}', 'i'), ('\u{026A}', 'i'),
    ('\u{026F}', 'w'), ('\u{028B}', 'u'), ('\u{028F}', 'y'), ('\u{0294}', '?'),
    ('\u{02B9}', '`'), ('\u{02BB}', '`'), ('\u{02BC}', '`'), ('\u{02BD}', '`'),
    ('\u{02BE}', '`'), ('\u{02C2}', '<'), ('\u{02C3}', '>'), ('\u{02C4}', '^'),
    ('\u{02C6}', '^'), ('\u{02C8}', '`'), ('\u{02CA}', '`'), ('\u{02CB}', '`'),
    ('\u{02D0}', ':'), ('\u{02D7}', '-'), ('\u{02DB}', 'i'), ('\u{02DC}', '~'),
    ('\u{02F4}', '`'), ('\u{02F8}', ':'), ('\u{0374}', '`'), ('\u{037A}', 'i'),
    ('\u{037E}', ';'), ('\u{037F}', 'J'), ('\u{0384}', '`'), ('\u{0391}', 'A'),
    ('\u{0392}', 'B'), ('\u{0395}', 'E'), ('\u{0396}', 'Z'), ('\u{0397}', 'H'),
    ('\u{0399}', 'I'), ('\u{039A}', 'K'), ('\u{039C}', 'M'), ('\u{039D}', 'N'),
    ('\u{039F}', 'O'), ('\u{03A1}', 'P'), ('\u{03A4}', 'T'), ('\u{03A5}', 'Y'),
    ('\u{03A7}', 'X'), ('\u{03B1}', 'a'), ('\u{03B3}', 'y'), ('\u{03B9}', 'i'),
    ('\u{03BD}', 'v'), ('\u{03BF}', 'o'), ('\u{03C1}', 'p'), ('\u{03C3}', 'o'),
    ('\u{03C5}', 'u'), ('\u{03D2}', 'Y'), ('\u{03DC}', 'F'), ('\u{03E8}', '2'),
    ('\u{03F1}', 'p'), ('\u{03F2}', 'c'), ('\u{03F3}', 'j'), ('\u{03F9}', 'C'),
    ('\u{03FA}', 'M'), ('\u{0405}', 'S'), ('\u{0406}', 'I'), ('\u{0408}', 'J'),
    ('\u{0410}', 'A'), ('\u{0412}', 'B'), ('\u{0415}', 'E'), ('\u{0417}', '3'),
    ('\u{041A}', 'K'), ('\u{041C}', 'M'), ('\u{041D}', 'H'), ('\u{041E}', 'O'),
    ('\u{0420}', 'P'), ('\u{0421}', 'C'), ('\u{0422}', 'T'), ('\u{0423}', 'Y'),
    ('\u{0425}', 'X'), ('\u{042C}', 'b'), ('\u{0430}', 'a'), ('\u{0431}', '6'),
    ('\u{0433}', 'r'), ('\u{0435}', 'e'), ('\u{043E}', 'o'), ('\u{0440}', 'p'),
    ('\u{0441}', 'c'), ('\u{0443}', 'y'), ('\u{0445}', 'x'), ('\u{0455}', 's'),
    ('\u{0456}', 'i'), ('\u{0458}', 'j'), ('\u{0461}', 'w'), ('\u{0474}', 'V'),
    ('\u{0475}', 'v'), ('\u{04AE}', 'Y'), ('\u{04AF}', 'y'), ('\u{04BB}', 'h'),
    ('\u{04BD}', 'e'), ('\u{04C0}', 'I'), ('\u{04CF}', 'i'), ('\u{04E0}', '3'),
    ('\u{0501}', 'd'), ('\u{050C}', 'G'), ('\u{051B}', 'q'), ('\u{051C}', 'W'),
    ('\u{051D}', 'w'), ('\u{054D}', 'U'), ('\u{054F}', 'S'), ('\u{0555}', 'O'),
    ('\u{055A}', '`'), ('\u{055D}', '`'), ('\u{0561}', 'w'), ('\u{0563}', 'q'),
    ('\u{0566}', 'q'), ('\u{0570}', 'h'), ('\u{0578}', 'n'), ('\u{057C}', 'n'),
    ('\u{057D}', 'u'), ('\u{0581}', 'g'), ('\u{0584}', 'f'), ('\u{0585}', 'o'),
    ('\u{0589}', ':'), ('\u{05C0}', 'l'), ('\u{05C3}', ':'), ('\u{05D5}', 'l'),
    ('\u{05D8}', 'v'), ('\u{05D9}', '`'), ('\u{05DF}', 'l'), ('\u{05E1}', 'o'),
    ('\u{05F3}', '`'), ('\u{060D}', ','), ('\u{0627}', 'l'), ('\u{0647}', 'o'),
    ('\u{0660}', '.'), ('\u{0661}', 'l'), ('\u{0665}', 'o'), ('\u{0667}', 'V'),
    ('\u{066B}', ','), ('\u{066D}', '*'), ('\u{06BE}', 'o'), ('\u{06C1}', 'o'),
    ('\u{06D4}', '-'), ('\u{06D5}', 'o'), ('\u{06F0}', '.'), ('\u{06F1}', 'I'),
    ('\u{06F5}', 'o'), ('\u{06F7}', 'V'), ('\u{0701}', '.'), ('\u{0702}', '.'),
    ('\u{0703}', ':'), ('\u{0704}', ':'), ('\u{07C0}', 'O'), ('\u{07CA}', 'l'),
    ('\u{07F4}', '`'), ('\u{07F5}', '`'), ('\u{07FA}', '_'), ('\u{0903}', ':'),
    ('\u{0966}', 'o'), ('\u{097D}', '?'), ('\u{09E6}', 'O'), ('\u{09EA}', '8'),
    ('\u{09ED}', '9'), ('\u{0A66}', 'o'), ('\u{0A67}', '9'), ('\u{0A6A}', '8'),
    ('\u{0A83}', ':'), ('\u{0AE6}', 'o'), ('\u{0B03}', '8'), ('\u{0B20}', 'O'),
    ('\u{0B66}', 'O'), ('\u{0B68}', '9'), ('\u{0BE6}', 'o'), ('\u{0C02}', 'o'),
    ('\u{0C66}', 'o'), ('\u{0C82}', 'o'), ('\u{0CE6}', 'o'), ('\u{0D02}', 'o'),
    ('\u{0D20}', 'o'), ('\u{0D66}', 'o'), ('\u{0D6D}', '9'), ('\u{0D82}', 'o'),
    ('\u{0E50}', 'o'), ('\u{0ED0}', 'o'), ('\u{101D}', 'o'), ('\u{1040}', 'o'),
    ('\u{10E7}', 'y'), ('\u{10FF}', 'o'), ('\u{1200}', 'U'), ('\u{12D0}', 'O'),
    ('\u{13A0}', 'D'), ('\u{13A1}', 'R'), ('\u{13A2}', 'T'), ('\u{13A5}', 'i'),
    ('\u{13A9}', 'Y'), ('\u{13AA}', 'A'), ('\u{13AB}', 'J'), ('\u{13AC}', 'E'),
    ('\u{13AE}', '?'), ('\u{13B3}', 'W'), ('\u{13B7}', 'M'), ('\u{13BB}', 'H'),
    ('\u{13BD}', 'Y'), ('\u{13C0}', 'G'), ('\u{13C2}', 'h'), ('\u{13C3}', 'Z'),
    ('\u{13CE}', '4'), ('\u{13CF}', 'b'), ('\u{13D2}', 'R'), ('\u{13D4}', 'W'),
    ('\u{13D5}', 'S'), ('\u{13D9}', 'V'), ('\u{13DA}', 'S'), ('\u{13DE}', 'L'),
    ('\u{13DF}', 'C'), ('\u{13E2}', 'P'), ('\u{13E6}', 'K'), ('\u{13E7}', 'd'),
    ('\u{13EE}', '6'), ('\u{13F3}', 'G'), ('\u{13F4}', 'B'), ('\u{1400}', '='),
    ('\u{142F}', 'V'), ('\u{1433}', '>'), ('\u{1438}', '<'), ('\u{144A}', '`'),
    ('\u{144C}', 'U'), ('\u{146D}', 'P'), ('\u{146F}', 'd'), ('\u{1472}', 'b'),
    ('\u{148D}', 'J'), ('\u{14AA}', 'L'), ('\u{14BF}', '2'), ('\u{1541}', 'x'),
    ('\u{157C}', 'H'), ('\u{157D}', 'x'), ('\u{1587}', 'R'), ('\u{15AF}', 'b'),
    ('\u{15B4}', 'F'), ('\u{15C5}', 'A'), ('\u{15DE}', 'D'), ('\u{15EA}', 'D'),
    ('\u{15F0}', 'M'), ('\u{15F7}', 'B'), ('\u{166D}', 'X'), ('\u{166E}', 'x'),
    ('\u{1680}', ' '), ('\u{16B2}', '<'), ('\u{16B7}', 'X'), ('\u{16C1}', 'I'),
    ('\u{16CC}', '`'), ('\u{16D5}', 'K'), ('\u{16D6}', 'M'), ('\u{16EC}', ':'),
    ('\u{16ED}', '+'), ('\u{1735}', '/'), ('\u{1803}', ':'), ('\u{1809}', ':'),
    ('\u{1D04}', 'c'), ('\u{1D0F}', 'o'), ('\u{1D11}', 'o'), ('\u{1D1C}', 'u'),
    ('\u{1D20}', 'v'), ('\u{1D21}', 'w'), ('\u{1D22}', 'z'), ('\u{1D26}', 'r'),
    ('\u{1D83}', 'g'), ('\u{1D8C}', 'y'), ('\u{1E9D}', 'f'), ('\u{1EFF}', 'y'),
    ('\u{1FBD}', '`'), ('\u{1FBE}', 'i'), ('\u{1FBF}', '`'), ('\u{1FC0}', '~'),
    ('\u{1FEF}', '`'), ('\u{1FFD}', '`'), ('\u{1FFE}', '`'), ('\u{2000}', ' '),
    ('\u{2001}', ' '), ('\u{2002}', ' '), ('\u{2003}', ' '), ('\u{2004}', ' '),
    ('\u{2005}', ' '), ('\u{2006}', ' '), ('\u{2007}', ' '), ('\u{2008}', ' '),
    ('\u{2009}', ' '), ('\u{200A}', ' '), ('\u{2010}', '-'), ('\u{2011}', '-'),
    ('\u{2012}', '-'), ('\u{2013}', '-'), ('\u{2018}', '`'), ('\u{2019}', '`'),
    ('\u{201A}', ','), ('\u{201B}', '`'), ('\u{2024}', '.'), ('\u{2028}', ' '),
    ('\u{2029}', ' '), ('\u{202F}', ' '), ('\u{2032}', '`'), ('\u{2035}', '`'),
    ('\u{2039}', '<'), ('\u{203A}', '>'), ('\u{2041}', '/'), ('\u{2043}', '-'),
    ('\u{2044}', '/'), ('\u{204E}', '*'), ('\u{2053}', '~'), ('\u{205A}', ':'),
    ('\u{205F}', ' '), ('\u{2102}', 'C'), ('\u{210A}', 'g'), ('\u{210B}', 'H'),
    ('\u{210C}', 'H'), ('\u{210D}', 'H'), ('\u{210E}', 'h'), ('\u{2110}', 'I'),
    ('\u{2111}', 'I'), ('\u{2112}', 'L'), ('\u{2113}', 'l'), ('\u{2115}', 'N'),
    ('\u{2119}', 'P'), ('\u{211A}', 'Q'), ('\u{211B}', 'R'), ('\u{211C}', 'R'),
    ('\u{211D}', 'R'), ('\u{2124}', 'Z'), ('\u{2128}', 'Z'), ('\u{212A}', 'K'),
    ('\u{212C}', 'B'), ('\u{212D}', 'C'), ('\u{212E}', 'e'), ('\u{212F}', 'e'),
    ('\u{2130}', 'E'), ('\u{2131}', 'F'), ('\u{2133}', 'M'), ('\u{2134}', 'o'),
    ('\u{2139}', 'i'), ('\u{213D}', 'y'), ('\u{2145}', 'D'), ('\u{2146}', 'd'),
    ('\u{2147}', 'e'), ('\u{2148}', 'i'), ('\u{2149}', 'j'), ('\u{2160}', 'I'),
    ('\u{2164}', 'V'), ('\u{2169}', 'X'), ('\u{216C}', 'L'), ('\u{216D}', 'C'),
    ('\u{216E}', 'D'), ('\u{216F}', 'M'), ('\u{2170}', 'i'), ('\u{2174}', 'v'),
    ('\u{2179}', 'x'), ('\u{217C}', 'I'), ('\u{217D}', 'c'), ('\u{217E}', 'd'),
    ('\u{2212}', '-'), ('\u{2215}', '/'), ('\u{2216}', '\\'), ('\u{2217}', '*'),
    ('\u{2223}', 'I'), ('\u{2228}', 'v'), ('\u{222A}', 'U'), ('\u{2236}', ':'),
    ('\u{223C}', '~'), ('\u{22A4}', 'T'), ('\u{22C1}', 'v'), ('\u{22C3}', 'U'),
    ('\u{22FF}', 'E'), ('\u{2373}', 'i'), ('\u{2374}', 'p'), ('\u{237A}', 'a'),
    ('\u{23FD}', 'I'), ('\u{2571}', '/'), ('\u{2573}', 'X'), ('\u{2768}', '('),
    ('\u{2769}', ')'), ('\u{276E}', '<'), ('\u{276F}', '>'), ('\u{2772}', '('),
    ('\u{2773}', ')'), ('\u{2774}', '{'), ('\u{2775}', '}'), ('\u{2795}', '+'),
    ('\u{2796}', '-'), ('\u{27CB}', '/'), ('\u{27CD}', '\\'), ('\u{27D9}', 'T'),
    ('\u{292B}', 'x'), ('\u{292C}', 'x'), ('\u{29F5}', '\\'), ('\u{29F8}', '/'),
    ('\u{29F9}', '\\'), ('\u{2A2F}', 'x'), ('\u{2C85}', 'r'), ('\u{2C8E}', 'H'),
    ('\u{2C92}', 'I'), ('\u{2C94}', 'K'), ('\u{2C98}', 'M'), ('\u{2C9A}', 'N'),
    ('\u{2C9E}', 'O'), ('\u{2C9F}', 'o'), ('\u{2CA2}', 'P'), ('\u{2CA3}', 'p'),
    ('\u{2CA4}', 'C'), ('\u{2CA5}', 'c'), ('\u{2CA6}', 'T'), ('\u{2CA8}', 'Y'),
    ('\u{2CAC}', 'X'), ('\u{2CBA}', '-'), ('\u{2CC6}', '/'), ('\u{2CCA}', '9'),
    ('\u{2CCC}', '3'), ('\u{2CD0}', 'L'), ('\u{2CD2}', '6'), ('\u{2D38}', 'V'),
    ('\u{2D39}', 'E'), ('\u{2D4F}', 'I'), ('\u{2D51}', '!'), ('\u{2D54}', 'O'),
    ('\u{2D55}', 'Q'), ('\u{2D5D}', 'X'), ('\u{2E40}', '='), ('\u{2F02}', '\\'),
    ('\u{2F03}', '/'), ('\u{3007}', 'O'), ('\u{3014}', '('), ('\u{3015}', ')'),
    ('\u{3033}', '/'), ('\u{30A0}', '='), ('\u{30CE}', '/'), ('\u{31D3}', '/'),
    ('\u{31D4}', '\\'), ('\u{4E36}', '\\'), ('\u{4E3F}', '/'), ('\u{A4D0}', 'B'),
    ('\u{A4D1}', 'P'), ('\u{A4D2}', 'd'), ('\u{A4D3}', 'D'), ('\u{A4D4}', 'T'),
    ('\u{A4D6}', 'G'), ('\u{A4D7}', 'K'), ('\u{A4D9}', 'J'), ('\u{A4DA}', 'C'),
    ('\u{A4DC}', 'Z'), ('\u{A4DD}', 'F'), ('\u{A4DF}', 'M'), ('\u{A4E0}', 'N'),
    ('\u{A4E1}', 'L'), ('\u{A4E2}', 'S'), ('\u{A4E3}', 'R'), ('\u{A4E6}', 'V'),
    ('\u{A4E7}', 'H'), ('\u{A4EA}', 'W'), ('\u{A4EB}', 'X'), ('\u{A4EC}', 'Y'),
    ('\u{A4EE}', 'A'), ('\u{A4F0}', 'E'), ('\u{A4F2}', 'I'), ('\u{A4F3}', 'O'),
    ('\u{A4F4}', 'U'), ('\u{A4F8}', '.'), ('\u{A4F9}', ','), ('\u{A4FD}', ':'),
    ('\u{A4FF}', '='), ('\u{A60E}', '.'), ('\u{A644}', '2'), ('\u{A647}', 'i'),
    ('\u{A6DF}', 'V'), ('\u{A6EB}', '?'), ('\u{A6EF}', '2'), ('\u{A731}', 's'),
    ('\u{A75A}', '2'), ('\u{A76A}', '3'), ('\u{A76E}', '9'), ('\u{A778}', '&'),
    ('\u{A789}', ':'), ('\u{A78C}', '`'), ('\u{A798}', 'F'), ('\u{A799}', 'f'),
    ('\u{A79F}', 'u'), ('\u{A7AB}', '3'), ('\u{A7B2}', 'J'), ('\u{A7B3}', 'X'),
    ('\u{A7B4}', 'B'), ('\u{AB32}', 'e'), ('\u{AB35}', 'f'), ('\u{AB3D}', 'o'),
    ('\u{AB47}', 'r'), ('\u{AB48}', 'r'), ('\u{AB4E}', 'u'), ('\u{AB52}', 'u'),
    ('\u{AB5A}', 'y'), ('\u{AB75}', 'i'), ('\u{AB81}', 'r'), ('\u{AB83}', 'w'),
    ('\u{AB93}', 'z'), ('\u{ABA9}', 'v'), ('\u{ABAA}', 's'), ('\u{ABAF}', 'c'),
    ('\u{FBA6}', 'o'), ('\u{FBA7}', 'o'), ('\u{FBA8}', 'o'), ('\u{FBA9}', 'o'),
    ('\u{FBAA}', 'o'), ('\u{FBAB}', 'o'), ('\u{FBAC}', 'o'), ('\u{FBAD}', 'o'),
    ('\u{FD3E}', '('), ('\u{FD3F}', ')'), ('\u{FE30}', ':'), ('\u{FE4D}', '_'),
    ('\u{FE4E}', '_'), ('\u{FE4F}', '_'), ('\u{FE58}', '-'), ('\u{FE68}', '\\'),
    ('\u{FE8D}', 'l'), ('\u{FE8E}', 'l'), ('\u{FEE9}', 'o'), ('\u{FEEA}', 'o'),
    ('\u{FEEB}', 'o'), ('\u{FEEC}', 'o'), ('\u{FF01}', '!'), ('\u{FF02}', '"'),
    ('\u{FF03}', '#'), ('\u{FF04}', '$'), ('\u{FF05}', '%'), ('\u{FF06}', '&'),
    ('\u{FF07}', '`'), ('\u{FF08}', '('), ('\u{FF09}', ')'), ('\u{FF0A}', '*'),
    ('\u{FF0B}', '+'), ('\u{FF0C}', ','), ('\u{FF0D}', '-'), ('\u{FF0E}', '.'),
    ('\u{FF0F}', '/'), ('\u{FF10}', '0'), ('\u{FF11}', '1'), ('\u{FF12}', '2'),
    ('\u{FF13}', '3'), ('\u{FF14}', '4'), ('\u{FF15}', '5'), ('\u{FF16}', '6'),
    ('\u{FF17}', '7'), ('\u{FF18}', '8'), ('\u{FF19}', '9'), ('\u{FF1A}', ':'),
    ('\u{FF1B}', ';'), ('\u{FF1C}', '<'), ('\u{FF1D}', '='), ('\u{FF1E}', '>'),
    ('\u{FF1F}', '?'), ('\u{FF20}', '@'), ('\u{FF21}', 'A'), ('\u{FF22}', 'B'),
    ('\u{FF23}', 'C'), ('\u{FF24}', 'D'), ('\u{FF25}', 'E'), ('\u{FF26}', 'F'),
    ('\u{FF27}', 'G'), ('\u{FF28}', 'H'), ('\u{FF29}', 'I'), ('\u{FF2A}', 'J'),
    ('\u{FF2B}', 'K'), ('\u{FF2C}', 'L'), ('\u{FF2D}', 'M'), ('\u{FF2E}', 'N'),
    ('\u{FF2F}', 'O'), ('\u{FF30}', 'P'), ('\u{FF31}', 'Q'), ('\u{FF32}', 'R'),
    ('\u{FF33}', 'S'), ('\u{FF34}', 'T'), ('\u{FF35}', 'U'), ('\u{FF36}', 'V'),
    ('\u{FF37}', 'W'), ('\u{FF38}', 'X'), ('\u{FF39}', 'Y'), ('\u{FF3A}', 'Z'),
    ('\u{FF3B}', '['), ('\u{FF3C}', '\\'), ('\u{FF3D}', ']'), ('\u{FF3E}', '^'),
    ('\u{FF3F}', '_'), ('\u{FF40}', '`'), ('\u{FF41}', 'a'), ('\u{FF42}', 'b'),
    ('\u{FF43}', 'c'), ('\u{FF44}', 'd'), ('\u{FF45}', 'e'), ('\u{FF46}', 'f'),
    ('\u{FF47}', 'g'), ('\u{FF48}', 'h'), ('\u{FF49}', 'i'), ('\u{FF4A}', 'j'),
    ('\u{FF4B}', 'k'), ('\u{FF4C}', 'l'), ('\u{FF4D}', 'm'), ('\u{FF4E}', 'n'),
    ('\u{FF4F}', 'o'), ('\u{FF50}', 'p'), ('\u{FF51}', 'q'), ('\u{FF52}', 'r'),
    ('\u{FF53}', 's'), ('\u{FF54}', 't'), ('\u{FF55}', 'u'), ('\u{FF56}', 'v'),
    ('\u{FF57}', 'w'), ('\u{FF58}', 'x'), ('\u{FF59}', 'y'), ('\u{FF5A}', 'z'),
    ('\u{FF5B}', '{'), ('\u{FF5C}', '|'), ('\u{FF5D}', '}'), ('\u{FF5E}', '~'),
    ('\u{FFE8}', 'I'), ('\u{10282}', 'B'), ('\u{10286}', 'E'), ('\u{10287}', 'F'),
    ('\u{1028A}', '|'), ('\u{10290}', 'X'), ('\u{10292}', 'O'), ('\u{10295}', 'P'),
    ('\u{10296}', 'S'), ('\u{10297}', 'T'), ('\u{1029B}', '+'), ('\u{102A0}', 'A'),
    ('\u{102A1}', 'B'), ('\u{102A2}', 'C'), ('\u{102A5}', 'F'), ('\u{102AB}', 'O'),
    ('\u{102B0}', 'M'), ('\u{102B1}', 'T'), ('\u{102B2}', 'Y'), ('\u{102B4}', 'X'),
    ('\u{102CF}', 'H'), ('\u{102F5}', 'Z'), ('\u{10301}', 'B'), ('\u{10302}', 'C'),
    ('\u{10309}', '|'), ('\u{10311}', 'M'), ('\u{10315}', 'T'), ('\u{10317}', 'X'),
    ('\u{1031A}', '8'), ('\u{1031F}', '*'), ('\u{10320}', 'l'), ('\u{10322}', 'X'),
    ('\u{10404}', 'O'), ('\u{10415}', 'C'), ('\u{1041B}', 'L'), ('\u{10420}', 'S'),
    ('\u{1042C}', 'o'), ('\u{1043D}', 'c'), ('\u{10448}', 's'), ('\u{104B4}', 'R'),
    ('\u{104C2}', 'O'), ('\u{104CE}', 'U'), ('\u{104D2}', '7'), ('\u{104EA}', 'o'),
    ('\u{104F6}', 'u'), ('\u{10513}', 'N'), ('\u{10516}', 'O'), ('\u{10518}', 'K'),
    ('\u{1051C}', 'C'), ('\u{1051D}', 'V'), ('\u{10525}', 'F'), ('\u{10526}', 'L'),
    ('\u{10527}', 'X'), ('\u{10A50}', '.'), ('\u{114D0}', 'O'), ('\u{11706}', 'v'),
    ('\u{1170A}', 'w'), ('\u{1170E}', 'w'), ('\u{1170F}', 'w'), ('\u{118A0}', 'V'),
    ('\u{118A2}', 'F'), ('\u{118A3}', 'L'), ('\u{118A4}', 'Y'), ('\u{118A6}', 'E'),
    ('\u{118A9}', 'Z'), ('\u{118AC}', '9'), ('\u{118AE}', 'E'), ('\u{118AF}', '4'),
    ('\u{118B2}', 'L'), ('\u{118B5}', 'O'), ('\u{118B8}', 'U'), ('\u{118BB}', '5'),
    ('\u{118BC}', 'T'), ('\u{118C0}', 'v'), ('\u{118C1}', 's'), ('\u{118C2}', 'F'),
    ('\u{118C3}', 'i'), ('\u{118C4}', 'z'), ('\u{118C6}', '7'), ('\u{118C8}', 'o'),
    ('\u{118CA}', '3'), ('\u{118CC}', '9'), ('\u{118D5}', '6'), ('\u{118D6}', '9'),
    ('\u{118D7}', 'o'), ('\u{118D8}', 'u'), ('\u{118DC}', 'y'), ('\u{118E0}', 'O'),
    ('\u{118E5}', 'Z'), ('\u{118E6}', 'W'), ('\u{118E9}', 'C'), ('\u{118EC}', 'X'),
    ('\u{118EF}', 'W'), ('\u{118F2}', 'C'), ('\u{16F08}', 'V'), ('\u{16F0A}', 'T'),
    ('\u{16F16}', 'L'), ('\u{16F28}', 'I'), ('\u{16F35}', 'R'), ('\u{16F3A}', 'S'),
    ('\u{16F3B}', '3'), ('\u{16F3F}', '>'), ('\u{16F40}', 'A'), ('\u{16F42}', 'U'),
    ('\u{16F43}', 'Y'), ('\u{16F51}', '`'), ('\u{16F52}', '`'), ('\u{1D114}', '{'),
    ('\u{1D16D}', '.'), ('\u{1D206}', '3'), ('\u{1D20D}', 'V'), ('\u{1D20F}', '\\'),
    ('\u{1D212}', '7'), ('\u{1D213}', 'F'), ('\u{1D216}', 'R'), ('\u{1D22A}', 'L'),
    ('\u{1D236}', '<'), ('\u{1D237}', '>'), ('\u{1D23A}', '/'), ('\u{1D23B}', '\\'),
    ('\u{1D400}', 'A'), ('\u{1D401}', 'B'), ('\u{1D402}', 'C'), ('\u{1D403}', 'D'),
    ('\u{1D404}', 'E'), ('\u{1D405}', 'F'), ('\u{1D406}', 'G'), ('\u{1D407}', 'H'),
    ('\u{1D408}', 'I'), ('\u{1D409}', 'J'), ('\u{1D40A}', 'K'), ('\u{1D40B}', 'L'),
    ('\u{1D40C}', 'M'), ('\u{1D40D}', 'N'), ('\u{1D40E}', 'O'), ('\u{1D40F}', 'P'),
    ('\u{1D410}', 'Q'), ('\u{1D411}', 'R'), ('\u{1D412}', 'S'), ('\u{1D413}', 'T'),
    ('\u{1D414}', 'U'), ('\u{1D415}', 'V'), ('\u{1D416}', 'W'), ('\u{1D417}', 'X'),
    ('\u{1D418}', 'Y'), ('\u{1D419}', 'Z'), ('\u{1D41A}', 'a'), ('\u{1D41B}', 'b'),
    ('\u{1D41C}', 'c'), ('\u{1D41D}', 'd'), ('\u{1D41E}', 'e'), ('\u{1D41F}', 'f'),
    ('\u{1D420}', 'g'), ('\u{1D421}', 'h'), ('\u{1D422}', 'i'), ('\u{1D423}', 'j'),
    ('\u{1D424}', 'k'), ('\u{1D425}', 'l'), ('\u{1D427}', 'n'), ('\u{1D428}', 'o'),
    ('\u{1D429}', 'p'), ('\u{1D42A}', 'q'), ('\u{1D42B}', 'r'), ('\u{1D42C}', 's'),
    ('\u{1D42D}', 't'), ('\u{1D42E}', 'u'), ('\u{1D42F}', 'v'), ('\u{1D430}', 'w'),
    ('\u{1D431}', 'x'), ('\u{1D432}', 'y'), ('\u{1D433}', 'z'), ('\u{1D434}', 'A'),
    ('\u{1D435}', 'B'), ('\u{1D436}', 'C'), ('\u{1D437}', 'D'), ('\u{1D438}', 'E'),
    ('\u{1D439}', 'F'), ('\u{1D43A}', 'G'), ('\u{1D43B}', 'H'), ('\u{1D43C}', 'I'),
    ('\u{1D43D}', 'J'), ('\u{1D43E}', 'K'), ('\u{1D43F}', 'L'), ('\u{1D440}', 'M'),
    ('\u{1D441}', 'N'), ('\u{1D442}', 'O'), ('\u{1D443}', 'P'), ('\u{1D444}', 'Q'),
    ('\u{1D445}', 'R'), ('\u{1D446}', 'S'), ('\u{1D447}', 'T'), ('\u{1D448}', 'U'),
    ('\u{1D449}', 'V'), ('\u{1D44A}', 'W'), ('\u{1D44B}', 'X'), ('\u{1D44C}', 'Y'),
    ('\u{1D44D}', 'Z'), ('\u{1D44E}', 'a'), ('\u{1D44F}', 'b'), ('\u{1D450}', 'c'),
    ('\u{1D451}', 'd'), ('\u{1D452}', 'e'), ('\u{1D453}', 'f'), ('\u{1D454}', 'g'),
    ('\u{1D456}', 'i'), ('\u{1D457}', 'j'), ('\u{1D458}', 'k'), ('\u{1D459}', 'l'),
    ('\u{1D45B}', 'n'), ('\u{1D45C}', 'o'), ('\u{1D45D}', 'p'), ('\u{1D45E}', 'q'),
    ('\u{1D45F}', 'r'), ('\u{1D460}', 's'), ('\u{1D461}', 't'), ('\u{1D462}', 'u'),
    ('\u{1D463}', 'v'), ('\u{1D464}', 'w'), ('\u{1D465}', 'x'), ('\u{1D466}', 'y'),
    ('\u{1D467}', 'z'), ('\u{1D468}', 'A'), ('\u{1D469}', 'B'), ('\u{1D46A}', 'C'),
    ('\u{1D46B}', 'D'), ('\u{1D46C}', 'E'), ('\u{1D46D}', 'F'), ('\u{1D46E}', 'G'),
    ('\u{1D46F}', 'H'), ('\u{1D470}', 'I'), ('\u{1D471}', 'J'), ('\u{1D472}', 'K'),
    ('\u{1D473}', 'L'), ('\u{1D474}', 'M'), ('\u{1D475}', 'N'), ('\u{1D476}', 'O'),
    ('\u{1D477}', 'P'), ('\u{1D478}', 'Q'), ('\u{1D479}', 'R'), ('\u{1D47A}', 'S'),
    ('\u{1D47B}', 'T'), ('\u{1D47C}', 'U'), ('\u{1D47D}', 'V'), ('\u{1D47E}', 'W'),
    ('\u{1D47F}', 'X'), ('\u{1D480}', 'Y'), ('\u{1D481}', 'Z'), ('\u{1D482}', 'a'),
    ('\u{1D483}', 'b'), ('\u{1D484}', 'c'), ('\u{1D485}', 'd'), ('\u{1D486}', 'e'),
    ('\u{1D487}', 'f'), ('\u{1D488}', 'g'), ('\u{1D489}', 'h'), ('\u{1D48A}', 'i'),
    ('\u{1D48B}', 'j'), ('\u{1D48C}', 'k'), ('\u{1D48D}', 'l'), ('\u{1D48F}', 'n'),
    ('\u{1D490}', 'o'), ('\u{1D491}', 'p'), ('\u{1D492}', 'q'), ('\u{1D493}', 'r'),
    ('\u{1D494}', 's'), ('\u{1D495}', 't'), ('\u{1D496}', 'u'), ('\u{1D497}', 'v'),
    ('\u{1D498}', 'w'), ('\u{1D499}', 'x'), ('\u{1D49A}', 'y'), ('\u{1D49B}', 'z'),
    ('\u{1D49C}', 'A'), ('\u{1D49E}', 'C'), ('\u{1D49F}', 'D'), ('\u{1D4A2}', 'G'),
    ('\u{1D4A5}', 'J'), ('\u{1D4A6}', 'K'), ('\u{1D4A9}', 'N'), ('\u{1D4AA}', 'O'),
    ('\u{1D4AB}', 'P'), ('\u{1D4AC}', 'Q'), ('\u{1D4AE}', 'S'), ('\u{1D4AF}', 'T'),
    ('\u{1D4B0}', 'U'), ('\u{1D4B1}', 'V'), ('\u{1D4B2}', 'W'), ('\u{1D4B3}', 'X'),
    ('\u{1D4B4}', 'Y'), ('\u{1D4B5}', 'Z'), ('\u{1D4B6}', 'a'), ('\u{1D4B7}', 'b'),
    ('\u{1D4B8}', 'c'), ('\u{1D4B9}', 'd'), ('\u{1D4BB}', 'f'), ('\u{1D4BD}', 'h'),
    ('\u{1D4BE}', 'i'), ('\u{1D4BF}', 'j'), ('\u{1D4C0}', 'k'), ('\u{1D4C1}', 'l'),
    ('\u{1D4C3}', 'n'), ('\u{1D4C5}', 'p'), ('\u{1D4C6}', 'q'), ('\u{1D4C7}', 'r'),
    ('\u{1D4C8}', 's'), ('\u{1D4C9}', 't'), ('\u{1D4CA}', 'u'), ('\u{1D4CB}', 'v'),
    ('\u{1D4CC}', 'w'), ('\u{1D4CD}', 'x'), ('\u{1D4CE}', 'y'), ('\u{1D4CF}', 'z'),
    ('\u{1D4D0}', 'A'), ('\u{1D4D1}', 'B'), ('\u{1D4D2}', 'C'), ('\u{1D4D3}', 'D'),
    ('\u{1D4D4}', 'E'), ('\u{1D4D5}', 'F'), ('\u{1D4D6}', 'G'), ('\u{1D4D7}', 'H'),
    ('\u{1D4D8}', 'I'), ('\u{1D4D9}', 'J'), ('\u{1D4DA}', 'K'), ('\u{1D4DB}', 'L'),
    ('\u{1D4DC}', 'M'), ('\u{1D4DD}', 'N'), ('\u{1D4DE}', 'O'), ('\u{1D4DF}', 'P'),
    ('\u{1D4E0}', 'Q'), ('\u{1D4E1}', 'R'), ('\u{1D4E2}', 'S'), ('\u{1D4E3}', 'T'),
    ('\u{1D4E4}', 'U'), ('\u{1D4E5}', 'V'), ('\u{1D4E6}', 'W'), ('\u{1D4E7}', 'X'),
    ('\u{1D4E8}', 'Y'), ('\u{1D4E9}', 'Z'), ('\u{1D4EA}', 'a'), ('\u{1D4EB}', 'b'),
    ('\u{1D4EC}', 'c'), ('\u{1D4ED}', 'd'), ('\u{1D4EE}', 'e'), ('\u{1D4EF}', 'f'),
    ('\u{1D4F0}', 'g'), ('\u{1D4F1}', 'h'), ('\u{1D4F2}', 'i'), ('\u{1D4F3}', 'j'),
    ('\u{1D4F4}', 'k'), ('\u{1D4F5}', 'l'), ('\u{1D4F7}', 'n'), ('\u{1D4F8}', 'o'),
    ('\u{1D4F9}', 'p'), ('\u{1D4FA}', 'q'), ('\u{1D4FB}', 'r'), ('\u{1D4FC}', 's'),
    ('\u{1D4FD}', 't'), ('\u{1D4FE}', 'u'), ('\u{1D4FF}', 'v'), ('\u{1D500}', 'w'),
    ('\u{1D501}', 'x'), ('\u{1D502}', 'y'), ('\u{1D503}', 'z'), ('\u{1D504}', 'A'),
    ('\u{1D505}', 'B'), ('\u{1D507}', 'D'), ('\u{1D508}', 'E'), ('\u{1D509}', 'F'),
    ('\u{1D50A}', 'G'), ('\u{1D50D}', 'J'), ('\u{1D50E}', 'K'), ('\u{1D50F}', 'L'),
    ('\u{1D510}', 'M'), ('\u{1D511}', 'N'), ('\u{1D512}', 'O'), ('\u{1D513}', 'P'),
    ('\u{1D514}', 'Q'), ('\u{1D516}', 'S'), ('\u{1D517}', 'T'), ('\u{1D518}', 'U'),
    ('\u{1D519}', 'V'), ('\u{1D51A}', 'W'), ('\u{1D51B}', 'X'), ('\u{1D51C}', 'Y'),
    ('\u{1D51E}', 'a'), ('\u{1D51F}', 'b'), ('\u{1D520}', 'c'), ('\u{1D521}', 'd'),
    ('\u{1D522}', 'e'), ('\u{1D523}', 'f'), ('\u{1D524}', 'g'), ('\u{1D525}', 'h'),
    ('\u{1D526}', 'i'), ('\u{1D527}', 'j'), ('\u{1D528}', 'k'), ('\u{1D529}', 'I'),
    ('\u{1D52B}', 'n'), ('\u{1D52C}', 'o'), ('\u{1D52D}', 'p'), ('\u{1D52E}', 'q'),
    ('\u{1D52F}', 'r'), ('\u{1D530}', 's'), ('\u{1D531}', 't'), ('\u{1D532}', 'u'),
    ('\u{1D533}', 'v'), ('\u{1D534}', 'w'), ('\u{1D535}', 'x'), ('\u{1D536}', 'y'),
    ('\u{1D537}', 'z'), ('\u{1D538}', 'A'), ('\u{1D539}', 'B'), ('\u{1D53B}', 'D'),
    ('\u{1D53C}', 'E'), ('\u{1D53D}', 'F'), ('\u{1D53E}', 'G'), ('\u{1D540}', 'I'),
    ('\u{1D541}', 'J'), ('\u{1D542}', 'K'), ('\u{1D543}', 'L'), ('\u{1D544}', 'M'),
    ('\u{1D546}', 'O'), ('\u{1D54A}', 'S'), ('\u{1D54B}', 'T'), ('\u{1D54C}', 'U'),
    ('\u{1D54D}', 'V'), ('\u{1D54E}', 'W'), ('\u{1D54F}', 'X'), ('\u{1D550}', 'Y'),
    ('\u{1D552}', 'a'), ('\u{1D553}', 'b'), ('\u{1D554}', 'c'), ('\u{1D555}', 'd'),
    ('\u{1D556}', 'e'), ('\u{1D557}', 'f'), ('\u{1D558}', 'g'), ('\u{1D559}', 'h'),
    ('\u{1D55A}', 'i'), ('\u{1D55B}', 'j'), ('\u{1D55C}', 'k'), ('\u{1D55D}', 'I'),
    ('\u{1D55F}', 'n'), ('\u{1D560}', 'o'), ('\u{1D561}', 'p'), ('\u{1D562}', 'q'),
    ('\u{1D563}', 'r'), ('\u{1D564}', 's'), ('\u{1D565}', 't'), ('\u{1D566}', 'u'),
    ('\u{1D567}', 'v'), ('\u{1D568}', 'w'), ('\u{1D569}', 'x'), ('\u{1D56A}', 'y'),
    ('\u{1D56B}', 'z'), ('\u{1D56C}', 'A'), ('\u{1D56D}', 'B'), ('\u{1D56E}', 'C'),
    ('\u{1D56F}', 'D'), ('\u{1D570}', 'E'), ('\u{1D571}', 'F'), ('\u{1D572}', 'G'),
    ('\u{1D573}', 'H'), ('\u{1D574}', 'I'), ('\u{1D575}', 'J'), ('\u{1D576}', 'K'),
    ('\u{1D577}', 'L'), ('\u{1D578}', 'M'), ('\u{1D579}', 'N'), ('\u{1D57A}', 'O'),
    ('\u{1D57B}', 'P'), ('\u{1D57C}', 'Q'), ('\u{1D57D}', 'R'), ('\u{1D57E}', 'S'),
    ('\u{1D57F}', 'T'), ('\u{1D580}', 'U'), ('\u{1D581}', 'V'), ('\u{1D582}', 'W'),
    ('\u{1D583}', 'X'), ('\u{1D584}', 'Y'), ('\u{1D585}', 'Z'), ('\u{1D586}', 'a'),
    ('\u{1D587}', 'b'), ('\u{1D588}', 'c'), ('\u{1D589}', 'd'), ('\u{1D58A}', 'e'),
    ('\u{1D58B}', 'f'), ('\u{1D58C}', 'g'), ('\u{1D58D}', 'h'), ('\u{1D58E}', 'i'),
    ('\u{1D58F}', 'j'), ('\u{1D590}', 'k'), ('\u{1D591}', 'I'), ('\u{1D593}', 'n'),
    ('\u{1D594}', 'o'), ('\u{1D595}', 'p'), ('\u{1D596}', 'q'), ('\u{1D597}', 'r'),
    ('\u{1D598}', 's'), ('\u{1D599}', 't'), ('\u{1D59A}', 'u'), ('\u{1D59B}', 'v'),
    ('\u{1D59C}', 'w'), ('\u{1D59D}', 'x'), ('\u{1D59E}', 'y'), ('\u{1D59F}', 'z'),
    ('\u{1D5A0}', 'A'), ('\u{1D5A1}', 'B'), ('\u{1D5A2}', 'C'), ('\u{1D5A3}', 'D'),
    ('\u{1D5A4}', 'E'), ('\u{1D5A5}', 'F'), ('\u{1D5A6}', 'G'), ('\u{1D5A7}', 'H'),
    ('\u{1D5A8}', 'I'), ('\u{1D5A9}', 'J'), ('\u{1D5AA}', 'K'), ('\u{1D5AB}', 'L'),
    ('\u{1D5AC}', 'M'), ('\u{1D5AD}', 'N'), ('\u{1D5AE}', 'O'), ('\u{1D5AF}', 'P'),
    ('\u{1D5B0}', 'Q'), ('\u{1D5B1}', 'R'), ('\u{1D5B2}', 'S'), ('\u{1D5B3}', 'T'),
    ('\u{1D5B4}', 'U'), ('\u{1D5B5}', 'V'), ('\u{1D5B6}', 'W'), ('\u{1D5B7}', 'X'),
    ('\u{1D5B8}', 'Y'), ('\u{1D5B9}', 'Z'), ('\u{1D5BA}', 'a'), ('\u{1D5BB}', 'b'),
    ('\u{1D5BC}', 'c'), ('\u{1D5BD}', 'd'), ('\u{1D5BE}', 'e'), ('\u{1D5BF}', 'f'),
    ('\u{1D5C0}', 'g'), ('\u{1D5C1}', 'h'), ('\u{1D5C2}', 'i'), ('\u{1D5C3}', 'j'),
    ('\u{1D5C4}', 'k'), ('\u{1D5C5}', 'I'), ('\u{1D5C7}', 'n'), ('\u{1D5C8}', 'o'),
    ('\u{1D5C9}', 'p'), ('\u{1D5CA}', 'q'), ('\u{1D5CB}', 'r'), ('\u{1D5CC}', 's'),
    ('\u{1D5CD}', 't'), ('\u{1D5CE}', 'u'), ('\u{1D5CF}', 'v'), ('\u{1D5D0}', 'w'),
    ('\u{1D5D1}', 'x'), ('\u{1D5D2}', 'y'), ('\u{1D5D3}', 'z'), ('\u{1D5D4}', 'A'),
    ('\u{1D5D5}', 'B'), ('\u{1D5D6}', 'C'), ('\u{1D5D7}', 'D'), ('\u{1D5D8}', 'E'),
    ('\u{1D5D9}', 'F'), ('\u{1D5DA}', 'G'), ('\u{1D5DB}', 'H'), ('\u{1D5DC}', 'I'),
    ('\u{1D5DD}', 'J'), ('\u{1D5DE}', 'K'), ('\u{1D5DF}', 'L'), ('\u{1D5E0}', 'M'),
    ('\u{1D5E1}', 'N'), ('\u{1D5E2}', 'O'), ('\u{1D5E3}', 'P'), ('\u{1D5E4}', 'Q'),
    ('\u{1D5E5}', 'R'), ('\u{1D5E6}', 'S'), ('\u{1D5E7}', 'T'), ('\u{1D5E8}', 'U'),
    ('\u{1D5E9}', 'V'), ('\u{1D5EA}', 'W'), ('\u{1D5EB}', 'X'), ('\u{1D5EC}', 'Y'),
    ('\u{1D5ED}', 'Z'), ('\u{1D5EE}', 'a'), ('\u{1D5EF}', 'b'), ('\u{1D5F0}', 'c'),
    ('\u{1D5F1}', 'd'), ('\u{1D5F2}', 'e'), ('\u{1D5F3}', 'f'), ('\u{1D5F4}', 'g'),
    ('\u{1D5F5}', 'h'), ('\u{1D5F6}', 'i'), ('\u{1D5F7}', 'j'), ('\u{1D5F8}', 'k'),
    ('\u{1D5F9}', 'I'), ('\u{1D5FB}', 'n'), ('\u{1D5FC}', 'o'), ('\u{1D5FD}', 'p'),
    ('\u{1D5FE}', 'q'), ('\u{1D5FF}', 'r'), ('\u{1D600}', 's'), ('\u{1D601}', 't'),
    ('\u{1D602}', 'u'), ('\u{1D603}', 'v'), ('\u{1D604}', 'w'), ('\u{1D605}', 'x'),
    ('\u{1D606}', 'y'), ('\u{1D607}', 'z'), ('\u{1D608}', 'A'), ('\u{1D609}', 'B'),
    ('\u{1D60A}', 'C'), ('\u{1D60B}', 'D'), ('\u{1D60C}', 'E'), ('\u{1D60D}', 'F'),
    ('\u{1D60E}', 'G'), ('\u{1D60F}', 'H'), ('\u{1D610}', 'I'), ('\u{1D611}', 'J'),
    ('\u{1D612}', 'K'), ('\u{1D613}', 'L'), ('\u{1D614}', 'M'), ('\u{1D615}', 'N'),
    ('\u{1D616}', 'O'), ('\u{1D617}', 'P'), ('\u{1D618}', 'Q'), ('\u{1D619}', 'R'),
    ('\u{1D61A}', 'S'), ('\u{1D61B}', 'T'), ('\u{1D61C}', 'U'), ('\u{1D61D}', 'V'),
    ('\u{1D61E}', 'W'), ('\u{1D61F}', 'X'), ('\u{1D620}', 'Y'), ('\u{1D621}', 'Z'),
    ('\u{1D622}', 'a'), ('\u{1D623}', 'b'), ('\u{1D624}', 'c'), ('\u{1D625}', 'd'),
    ('\u{1D626}', 'e'), ('\u{1D627}', 'f'), ('\u{1D628}', 'g'), ('\u{1D629}', 'h'),
    ('\u{1D62A}', 'i'), ('\u{1D62B}', 'j'), ('\u{1D62C}', 'k'), ('\u{1D62D}', 'I'),
    ('\u{1D62F}', 'n'), ('\u{1D630}', 'o'), ('\u{1D631}', 'p'), ('\u{1D632}', 'q'),
    ('\u{1D633}', 'r'), ('\u{1D634}', 's'), ('\u{1D635}', 't'), ('\u{1D636}', 'u'),
    ('\u{1D637}', 'v'), ('\u{1D638}', 'w'), ('\u{1D639}', 'x'), ('\u{1D63A}', 'y'),
    ('\u{1D63B}', 'z'), ('\u{1D63C}', 'A'), ('\u{1D63D}', 'B'), ('\u{1D63E}', 'C'),
    ('\u{1D63F}', 'D'), ('\u{1D640}', 'E'), ('\u{1D641}', 'F'), ('\u{1D642}', 'G'),
    ('\u{1D643}', 'H'), ('\u{1D644}', 'I'), ('\u{1D645}', 'J'), ('\u{1D646}', 'K'),
    ('\u{1D647}', 'L'), ('\u{1D648}', 'M'), ('\u{1D649}', 'N'), ('\u{1D64A}', 'O'),
    ('\u{1D64B}', 'P'), ('\u{1D64C}', 'Q'), ('\u{1D64D}', 'R'), ('\u{1D64E}', 'S'),
    ('\u{1D64F}', 'T'), ('\u{1D650}', 'U'), ('\u{1D651}', 'V'), ('\u{1D652}', 'W'),
    ('\u{1D653}', 'X'), ('\u{1D654}', 'Y'), ('\u{1D655}', 'Z'), ('\u{1D656}', 'a'),
    ('\u{1D657}', 'b'), ('\u{1D658}', 'c'), ('\u{1D659}', 'd'), ('\u{1D65A}', 'e'),
    ('\u{1D65B}', 'f'), ('\u{1D65C}', 'g'), ('\u{1D65D}', 'h'), ('\u{1D65E}', 'i'),
    ('\u{1D65F}', 'j'), ('\u{1D660}', 'k'), ('\u{1D661}', 'I'), ('\u{1D663}', 'n'),
    ('\u{1D664}', 'o'), ('\u{1D665}', 'p'), ('\u{1D666}', 'q'), ('\u{1D667}', 'r'),
    ('\u{1D668}', 's'), ('\u{1D669}', 't'), ('\u{1D66A}', 'u'), ('\u{1D66B}', 'v'),
    ('\u{1D66C}', 'w'), ('\u{1D66D}', 'x'), ('\u{1D66E}', 'y'), ('\u{1D66F}', 'z'),
    ('\u{1D670}', 'A'), ('\u{1D671}', 'B'), ('\u{1D672}', 'C'), ('\u{1D673}', 'D'),
    ('\u{1D674}', 'E'), ('\u{1D675}', 'F'), ('\u{1D676}', 'G'), ('\u{1D677}', 'H'),
    ('\u{1D678}', 'I'), ('\u{1D679}', 'J'), ('\u{1D67A}', 'K'), ('\u{1D67B}', 'L'),
    ('\u{1D67C}', 'M'), ('\u{1D67D}', 'N'), ('\u{1D67E}', 'O'), ('\u{1D67F}', 'P'),
    ('\u{1D680}', 'Q'), ('\u{1D681}', 'R'), ('\u{1D682}', 'S'), ('\u{1D683}', 'T'),
    ('\u{1D684}', 'U'), ('\u{1D685}', 'V'), ('\u{1D686}', 'W'), ('\u{1D687}', 'X'),
    ('\u{1D688}', 'Y'), ('\u{1D689}', 'Z'), ('\u{1D68A}', 'a'), ('\u{1D68B}', 'b'),
    ('\u{1D68C}', 'c'), ('\u{1D68D}', 'd'), ('\u{1D68E}', 'e'), ('\u{1D68F}', 'f'),
    ('\u{1D690}', 'g'), ('\u{1D691}', 'h'), ('\u{1D692}', 'i'), ('\u{1D693}', 'j'),
    ('\u{1D694}', 'k'), ('\u{1D695}', 'I'), ('\u{1D697}', 'n'), ('\u{1D698}', 'o'),
    ('\u{1D699}', 'p'), ('\u{1D69A}', 'q'), ('\u{1D69B}', 'r'), ('\u{1D69C}', 's'),
    ('\u{1D69D}', 't'), ('\u{1D69E}', 'u'), ('\u{1D69F}', 'v'), ('\u{1D6A0}', 'w'),
    ('\u{1D6A1}', 'x'), ('\u{1D6A2}', 'y'), ('\u{1D6A3}', 'z'), ('\u{1D6A4}', 'i'),
    ('\u{1D6A8}', 'A'), ('\u{1D6A9}', 'B'), ('\u{1D6AC}', 'E'), ('\u{1D6AD}', 'Z'),
    ('\u{1D6AE}', 'H'), ('\u{1D6B0}', 'I'), ('\u{1D6B1}', 'K'), ('\u{1D6B3}', 'M'),
    ('\u{1D6B4}', 'N'), ('\u{1D6B6}', 'O'), ('\u{1D6B8}', 'P'), ('\u{1D6BB}', 'T'),
    ('\u{1D6BC}', 'Y'), ('\u{1D6BE}', 'X'), ('\u{1D6C2}', 'a'), ('\u{1D6C4}', 'y'),
    ('\u{1D6CA}', 'i'), ('\u{1D6CE}', 'v'), ('\u{1D6D0}', 'o'), ('\u{1D6D2}', 'p'),
    ('\u{1D6D4}', 'o'), ('\u{1D6D6}', 'u'), ('\u{1D6E0}', 'p'), ('\u{1D6E2}', 'A'),
    ('\u{1D6E3}', 'B'), ('\u{1D6E6}', 'E'), ('\u{1D6E7}', 'Z'), ('\u{1D6E8}', 'H'),
    ('\u{1D6EA}', 'I'), ('\u{1D6EB}', 'K'), ('\u{1D6ED}', 'M'), ('\u{1D6EE}', 'N'),
    ('\u{1D6F0}', 'O'), ('\u{1D6F2}', 'P'), ('\u{1D6F5}', 'T'), ('\u{1D6F6}', 'Y'),
    ('\u{1D6F8}', 'X'), ('\u{1D6FC}', 'a'), ('\u{1D6FE}', 'y'), ('\u{1D704}', 'i'),
    ('\u{1D708}', 'v'), ('\u{1D70A}', 'o'), ('\u{1D70C}', 'p'), ('\u{1D70E}', 'o'),
    ('\u{1D710}', 'u'), ('\u{1D71A}', 'p'), ('\u{1D71C}', 'A'), ('\u{1D71D}', 'B'),
    ('\u{1D720}', 'E'), ('\u{1D721}', 'Z'), ('\u{1D722}', 'H'), ('\u{1D724}', 'I'),
    ('\u{1D725}', 'K'), ('\u{1D727}', 'M'), ('\u{1D728}', 'N'), ('\u{1D72A}', 'O'),
    ('\u{1D72C}', 'P'), ('\u{1D72F}', 'T'), ('\u{1D730}', 'Y'), ('\u{1D732}', 'X'),
    ('\u{1D736}', 'a'), ('\u{1D738}', 'y'), ('\u{1D73E}', 'i'), ('\u{1D742}', 'v'),
    ('\u{1D744}', 'o'), ('\u{1D746}', 'p'), ('\u{1D748}', 'o'), ('\u{1D74A}', 'u'),
    ('\u{1D754}', 'p'), ('\u{1D756}', 'A'), ('\u{1D757}', 'B'), ('\u{1D75A}', 'E'),
    ('\u{1D75B}', 'Z'), ('\u{1D75C}', 'H'), ('\u{1D75E}', 'I'), ('\u{1D75F}', 'K'),
    ('\u{1D761}', 'M'), ('\u{1D762}', 'N'), ('\u{1D764}', 'O'), ('\u{1D766}', 'P'),
    ('\u{1D769}', 'T'), ('\u{1D76A}', 'Y'), ('\u{1D76C}', 'X'), ('\u{1D770}', 'a'),
    ('\u{1D772}', 'y'), ('\u{1D778}', 'i'), ('\u{1D77C}', 'v'), ('\u{1D77E}', 'o'),
    ('\u{1D780}', 'p'), ('\u{1D782}', 'o'), ('\u{1D784}', 'u'), ('\u{1D78E}', 'p'),
    ('\u{1D790}', 'A'), ('\u{1D791}', 'B'), ('\u{1D794}', 'E'), ('\u{1D795}', 'Z'),
    ('\u{1D796}', 'H'), ('\u{1D798}', 'I'), ('\u{1D799}', 'K'), ('\u{1D79B}', 'M'),
    ('\u{1D79C}', 'N'), ('\u{1D79E}', 'O'), ('\u{1D7A0}', 'P'), ('\u{1D7A3}', 'T'),
    ('\u{1D7A4}', 'Y'), ('\u{1D7A6}', 'X'), ('\u{1D7AA}', 'a'), ('\u{1D7AC}', 'y'),
    ('\u{1D7B2}', 'i'), ('\u{1D7B6}', 'v'), ('\u{1D7B8}', 'o'), ('\u{1D7BA}', 'p'),
    ('\u{1D7BC}', 'o'), ('\u{1D7BE}', 'u'), ('\u{1D7C8}', 'p'), ('\u{1D7CA}', 'F'),
    ('\u{1D7CE}', 'O'), ('\u{1D7CF}', 'I'), ('\u{1D7D0}', '2'), ('\u{1D7D1}', '3'),
    ('\u{1D7D2}', '4'), ('\u{1D7D3}', '5'), ('\u{1D7D4}', '6'), ('\u{1D7D5}', '7'),
    ('\u{1D7D6}', '8'), ('\u{1D7D7}', '9'), ('\u{1D7D8}', 'O'), ('\u{1D7D9}', 'I'),
    ('\u{1D7DA}', '2'), ('\u{1D7DB}', '3'), ('\u{1D7DC}', '4'), ('\u{1D7DD}', '5'),
    ('\u{1D7DE}', '6'), ('\u{1D7DF}', '7'), ('\u{1D7E0}', '8'), ('\u{1D7E1}', '9'),
    ('\u{1D7E2}', 'O'), ('\u{1D7E3}', 'I'), ('\u{1D7E4}', '2'), ('\u{1D7E5}', '3'),
    ('\u{1D7E6}', '4'), ('\u{1D7E7}', '5'), ('\u{1D7E8}', '6'), ('\u{1D7E9}', '7'),
    ('\u{1D7EA}', '8'), ('\u{1D7EB}', '9'), ('\u{1D7EC}', 'O'), ('\u{1D7ED}', 'I'),
    ('\u{1D7EE}', '2'), ('\u{1D7EF}', '3'), ('\u{1D7F0}', '4'), ('\u{1D7F1}', '5'),
    ('\u{1D7F2}', '6'), ('\u{1D7F3}', '7'), ('\u{1D7F4}', '8'), ('\u{1D7F5}', '9'),
    ('\u{1D7F6}', 'O'), ('\u{1D7F7}', 'I'), ('\u{1D7F8}', '2'), ('\u{1D7F9}', '3'),
    ('\u{1D7FA}', '4'), ('\u{1D7FB}', '5'), ('\u{1D7FC}', '6'), ('\u{1D7FD}', '7'),
    ('\u{1D7FE}', '8'), ('\u{1D7FF}', '9'), ('\u{1E8C7}', 'l'), ('\u{1E8CB}', '8'),
    ('\u{1EE00}', 'l'), ('\u{1EE24}', 'o'), ('\u{1EE64}', 'o'), ('\u{1EE80}', 'l'),
    ('\u{1EE84}', 'o'), ('\u{1F74C}', 'C'), ('\u{1F768}', 'T'), ('\u{1FBF0}', 'O'),
    ('\u{1FBF1}', 'I'), ('\u{1FBF2}', '2'), ('\u{1FBF3}', '3'), ('\u{1FBF4}', '4'),
    ('\u{1FBF5}', '5'), ('\u{1FBF6}', '6'), ('\u{1FBF7}', '7'), ('\u{1FBF8}', '8'),
    ('\u{1FBF9}', '9'),
];

pub(crate) fn ambiguous_unicode_violations(ctx: &FileCtx<'_>) -> Vec<Violation> {
    let mut out = Vec::new();

    for (i, line) in ctx.lines.iter().enumerate() {
        if line.is_ascii() {
            continue;
        }

        for ch in line.chars() {
            if ch.is_ascii() {
                continue;
            }

            if let Ok(idx) = CONFUSABLES.binary_search_by_key(&ch, |&(c, _)| c) {
                let Some((_, looks_like)) = CONFUSABLES.get(idx) else {
                    continue;
                };

                out.push(violation(
                    ctx.rel,
                    i + 1,
                    format!(
                        "ambiguous Unicode character U+{:04X} (confusable with {looks_like:?})",
                        ch as u32
                    ),
                ));
                break;
            }
        }
    }

    out
}

pub(crate) fn bidirectional_unicode_violations(ctx: &FileCtx<'_>) -> Vec<Violation> {
    ctx.lines
        .iter()
        .enumerate()
        .filter_map(|(index, line)| {
            let control = line.chars().find(|ch| BIDI_CONTROLS.contains(ch))?;

            Some(violation(
                ctx.rel,
                index + 1,
                format!(
                    "bidirectional Unicode control character U+{:04X} (trojan-source risk)",
                    control as u32
                ),
            ))
        })
        .collect()
}