@ccheever/exact-ibex-runtime 0.1.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (161) hide show
  1. package/package.json +63 -0
  2. package/src/abort/AbortController.ts +23 -0
  3. package/src/abort/AbortSignal.ts +152 -0
  4. package/src/abort/index.ts +2 -0
  5. package/src/accessibility.ts +12 -0
  6. package/src/arraybuffer-detach.ts +109 -0
  7. package/src/base64/base64.ts +168 -0
  8. package/src/base64/index.ts +1 -0
  9. package/src/blob/Blob.ts +259 -0
  10. package/src/blob/File.ts +59 -0
  11. package/src/blob/FormData.ts +323 -0
  12. package/src/blob/index.ts +3 -0
  13. package/src/bootstrap.ts +1946 -0
  14. package/src/broadcast/BroadcastChannel.ts +280 -0
  15. package/src/broadcast/index.ts +5 -0
  16. package/src/cache/Cache.ts +349 -0
  17. package/src/cache/CacheStorage.ts +89 -0
  18. package/src/cache/index.ts +27 -0
  19. package/src/camera/index.ts +6202 -0
  20. package/src/camera/processor.worker.ts +194 -0
  21. package/src/camera/scene.ts +195 -0
  22. package/src/clipboard/Clipboard.ts +129 -0
  23. package/src/clipboard/ClipboardItem.ts +97 -0
  24. package/src/clipboard/index.ts +6 -0
  25. package/src/clone/index.ts +1 -0
  26. package/src/clone/structuredClone.ts +389 -0
  27. package/src/clone/transferableSymbols.ts +2 -0
  28. package/src/compression/CompressionStream.ts +146 -0
  29. package/src/compression/DecompressionStream.ts +342 -0
  30. package/src/compression/index.ts +4 -0
  31. package/src/console/Console.ts +341 -0
  32. package/src/console/index.ts +2 -0
  33. package/src/core/accessibility-state.ts +263 -0
  34. package/src/core/accessibility.ts +184 -0
  35. package/src/core/agent-state.ts +37 -0
  36. package/src/core/diagnostics-logs.ts +144 -0
  37. package/src/core/host-call-bridge.ts +16 -0
  38. package/src/core/i18n-helpers.ts +189 -0
  39. package/src/core/locale-state.ts +253 -0
  40. package/src/core/locale.ts +95 -0
  41. package/src/crypto/Crypto.ts +2743 -0
  42. package/src/crypto/index.ts +1 -0
  43. package/src/diagnostics/logs.ts +7 -0
  44. package/src/encoding/TextDecoder.ts +1181 -0
  45. package/src/encoding/TextDecoderStream.ts +58 -0
  46. package/src/encoding/TextEncoder.ts +180 -0
  47. package/src/encoding/TextEncoderStream.ts +39 -0
  48. package/src/encoding/index.ts +8 -0
  49. package/src/events/CloseEvent.ts +91 -0
  50. package/src/events/DOMException.ts +409 -0
  51. package/src/events/ErrorEvent.ts +39 -0
  52. package/src/events/Event.ts +151 -0
  53. package/src/events/EventTarget.ts +280 -0
  54. package/src/events/FocusEvent.ts +27 -0
  55. package/src/events/KeyboardEvent.ts +46 -0
  56. package/src/events/MessageEvent.ts +61 -0
  57. package/src/events/ProgressEvent.ts +33 -0
  58. package/src/events/PromiseRejectionEvent.ts +31 -0
  59. package/src/events/index.ts +52 -0
  60. package/src/eventsource/EventSource.ts +371 -0
  61. package/src/eventsource/index.ts +2 -0
  62. package/src/fetch/Headers.ts +642 -0
  63. package/src/fetch/Request.ts +760 -0
  64. package/src/fetch/Response.ts +543 -0
  65. package/src/fetch/body.ts +1256 -0
  66. package/src/fetch/cookie-jar.ts +566 -0
  67. package/src/fetch/demo.ts +207 -0
  68. package/src/fetch/errors.ts +101 -0
  69. package/src/fetch/fetch.ts +2610 -0
  70. package/src/fetch/index.ts +101 -0
  71. package/src/fetch/native-bridge.ts +65 -0
  72. package/src/fetch/types.ts +258 -0
  73. package/src/filereader/FileReader.ts +236 -0
  74. package/src/filereader/index.ts +1 -0
  75. package/src/fs/Dirent.ts +39 -0
  76. package/src/fs/ExactFile.ts +450 -0
  77. package/src/fs/Stats.ts +80 -0
  78. package/src/fs/index.ts +944 -0
  79. package/src/fs/promises.ts +386 -0
  80. package/src/fs/shared.ts +328 -0
  81. package/src/http-server/index.js +697 -0
  82. package/src/http-server/index.ts +27 -0
  83. package/src/identity.generated.ts +14 -0
  84. package/src/index.ts +283 -0
  85. package/src/indexeddb/IDBCursor.ts +188 -0
  86. package/src/indexeddb/IDBDatabase.ts +343 -0
  87. package/src/indexeddb/IDBFactory.ts +269 -0
  88. package/src/indexeddb/IDBIndex.ts +194 -0
  89. package/src/indexeddb/IDBKeyRange.ts +109 -0
  90. package/src/indexeddb/IDBObjectStore.ts +468 -0
  91. package/src/indexeddb/IDBRequest.ts +163 -0
  92. package/src/indexeddb/IDBTransaction.ts +207 -0
  93. package/src/indexeddb/index.ts +34 -0
  94. package/src/indexeddb/utils.ts +52 -0
  95. package/src/inspect/index.ts +1 -0
  96. package/src/inspect/inspect.ts +465 -0
  97. package/src/internal/detect.ts +104 -0
  98. package/src/locale.ts +10 -0
  99. package/src/location/index.ts +1059 -0
  100. package/src/locks/LockManager.ts +460 -0
  101. package/src/locks/index.ts +12 -0
  102. package/src/media/VideoFrame.ts +58 -0
  103. package/src/messaging/MessageChannel.ts +31 -0
  104. package/src/messaging/MessagePort.ts +180 -0
  105. package/src/messaging/index.ts +2 -0
  106. package/src/messaging.ts +247 -0
  107. package/src/native/NativeModules.ts +354 -0
  108. package/src/native/index.ts +1 -0
  109. package/src/navigator/Navigator.ts +351 -0
  110. package/src/navigator/index.ts +1 -0
  111. package/src/node/Buffer.ts +1786 -0
  112. package/src/node/index.ts +4 -0
  113. package/src/node/path.ts +495 -0
  114. package/src/node/process.ts +2528 -0
  115. package/src/performance/Performance.ts +532 -0
  116. package/src/performance/index.ts +21 -0
  117. package/src/polyfills/array.ts +236 -0
  118. package/src/polyfills/arraybuffer.ts +172 -0
  119. package/src/polyfills/groupby.ts +85 -0
  120. package/src/polyfills/index.ts +85 -0
  121. package/src/polyfills/intl.ts +1956 -0
  122. package/src/polyfills/iterator.ts +479 -0
  123. package/src/polyfills/promise.ts +37 -0
  124. package/src/polyfills/set.ts +245 -0
  125. package/src/polyfills/string.ts +85 -0
  126. package/src/polyfills/typedarray.ts +110 -0
  127. package/src/promise-rejection-tracking.ts +464 -0
  128. package/src/react-native/index.ts +388 -0
  129. package/src/runtime-entry.ts +55 -0
  130. package/src/scheduling/AnimationFrame.ts +105 -0
  131. package/src/scheduling/IdleCallback.ts +167 -0
  132. package/src/scheduling/index.ts +13 -0
  133. package/src/security/Capabilities.ts +1146 -0
  134. package/src/security/Permissions.ts +392 -0
  135. package/src/security/capability-bits.generated.ts +63 -0
  136. package/src/security/index.ts +16 -0
  137. package/src/sqlite/Database.ts +456 -0
  138. package/src/sqlite/Statement.ts +206 -0
  139. package/src/sqlite/constants.ts +79 -0
  140. package/src/sqlite/errors.ts +25 -0
  141. package/src/sqlite/index.ts +34 -0
  142. package/src/sqlite/module.js +438 -0
  143. package/src/storage/Storage.ts +291 -0
  144. package/src/storage/StorageManager.ts +91 -0
  145. package/src/storage/index.ts +3 -0
  146. package/src/stream-compat.ts +47 -0
  147. package/src/streams/ReadableStream.ts +4131 -0
  148. package/src/streams/TransformStream.ts +375 -0
  149. package/src/streams/WritableStream.ts +866 -0
  150. package/src/streams/index.ts +41 -0
  151. package/src/timers/Timers.ts +296 -0
  152. package/src/timers/index.ts +11 -0
  153. package/src/url/URL.ts +656 -0
  154. package/src/url/URLPattern.ts +850 -0
  155. package/src/url/URLSearchParams.ts +244 -0
  156. package/src/url/index.ts +9 -0
  157. package/src/websocket/WebSocket.ts +770 -0
  158. package/src/websocket/WebSocketError.ts +52 -0
  159. package/src/websocket/WebSocketStream.ts +628 -0
  160. package/src/websocket/index.ts +7 -0
  161. package/src/window/index.ts +872 -0
@@ -0,0 +1,1181 @@
1
+ // @ts-nocheck
2
+ /**
3
+ * TextDecoder - Web Standard TextDecoder Implementation
4
+ *
5
+ * @see https://encoding.spec.whatwg.org/#textdecoder
6
+ *
7
+ * Supported encodings: All WHATWG single-byte encodings, UTF-8, UTF-16LE/BE,
8
+ * replacement, x-user-defined.
9
+ */
10
+
11
+ import { isDetachedArrayBuffer } from '../clone/structuredClone';
12
+ import { getNativeModule } from '../native/NativeModules';
13
+
14
+ const NativeTextDecoderImpl: (new (
15
+ label?: string,
16
+ options?: TextDecoderOptions
17
+ ) => { decode(input?: BufferSource, options?: TextDecodeOptions): string }) | null =
18
+ typeof globalThis.TextDecoder === "function" ? (globalThis.TextDecoder as any) : null;
19
+
20
+ export interface TextDecoderOptions {
21
+ fatal?: boolean;
22
+ ignoreBOM?: boolean;
23
+ }
24
+
25
+ export interface TextDecodeOptions {
26
+ stream?: boolean;
27
+ }
28
+
29
+ function createEncodingError(message: string): TypeError & { code: string } {
30
+ const error = new TypeError(message) as TypeError & { code: string };
31
+ error.code = "ERR_ENCODING_INVALID_ENCODED_DATA";
32
+ return error;
33
+ }
34
+
35
+ function isValidUTF8Continuation(
36
+ startByte: number,
37
+ continuationByte: number,
38
+ position: number
39
+ ): boolean {
40
+ if ((continuationByte & 0xc0) !== 0x80) {
41
+ return false;
42
+ }
43
+
44
+ if (position !== 1) {
45
+ return true;
46
+ }
47
+
48
+ if ((startByte & 0xf0) === 0xe0) {
49
+ if (startByte === 0xe0 && continuationByte < 0xa0) {
50
+ return false;
51
+ }
52
+ if (startByte === 0xed && continuationByte > 0x9f) {
53
+ return false;
54
+ }
55
+ }
56
+
57
+ if ((startByte & 0xf8) === 0xf0) {
58
+ if (startByte === 0xf0 && continuationByte < 0x90) {
59
+ return false;
60
+ }
61
+ if (startByte === 0xf4 && continuationByte > 0x8f) {
62
+ return false;
63
+ }
64
+ }
65
+
66
+ return true;
67
+ }
68
+
69
+ // ─── WHATWG Encoding label normalization ──────────────────────────────────
70
+ // From https://encoding.spec.whatwg.org/#names-and-labels
71
+ const encodingLabels: Record<string, string> = {
72
+ // UTF-8
73
+ "unicode-1-1-utf-8": "utf-8",
74
+ "unicode11utf8": "utf-8",
75
+ "unicode20utf8": "utf-8",
76
+ "utf-8": "utf-8",
77
+ "utf8": "utf-8",
78
+ "x-unicode20utf8": "utf-8",
79
+
80
+ // IBM866
81
+ "866": "ibm866",
82
+ "cp866": "ibm866",
83
+ "csibm866": "ibm866",
84
+ "ibm866": "ibm866",
85
+
86
+ // ISO-8859-2
87
+ "csisolatin2": "iso-8859-2",
88
+ "iso-8859-2": "iso-8859-2",
89
+ "iso-ir-101": "iso-8859-2",
90
+ "iso8859-2": "iso-8859-2",
91
+ "iso88592": "iso-8859-2",
92
+ "iso_8859-2": "iso-8859-2",
93
+ "iso_8859-2:1987": "iso-8859-2",
94
+ "l2": "iso-8859-2",
95
+ "latin2": "iso-8859-2",
96
+
97
+ // ISO-8859-3
98
+ "csisolatin3": "iso-8859-3",
99
+ "iso-8859-3": "iso-8859-3",
100
+ "iso-ir-109": "iso-8859-3",
101
+ "iso8859-3": "iso-8859-3",
102
+ "iso88593": "iso-8859-3",
103
+ "iso_8859-3": "iso-8859-3",
104
+ "iso_8859-3:1988": "iso-8859-3",
105
+ "l3": "iso-8859-3",
106
+ "latin3": "iso-8859-3",
107
+
108
+ // ISO-8859-4
109
+ "csisolatin4": "iso-8859-4",
110
+ "iso-8859-4": "iso-8859-4",
111
+ "iso-ir-110": "iso-8859-4",
112
+ "iso8859-4": "iso-8859-4",
113
+ "iso88594": "iso-8859-4",
114
+ "iso_8859-4": "iso-8859-4",
115
+ "iso_8859-4:1988": "iso-8859-4",
116
+ "l4": "iso-8859-4",
117
+ "latin4": "iso-8859-4",
118
+
119
+ // ISO-8859-5
120
+ "csisolatincyrillic": "iso-8859-5",
121
+ "cyrillic": "iso-8859-5",
122
+ "iso-8859-5": "iso-8859-5",
123
+ "iso-ir-144": "iso-8859-5",
124
+ "iso8859-5": "iso-8859-5",
125
+ "iso88595": "iso-8859-5",
126
+ "iso_8859-5": "iso-8859-5",
127
+ "iso_8859-5:1988": "iso-8859-5",
128
+
129
+ // ISO-8859-6
130
+ "arabic": "iso-8859-6",
131
+ "asmo-708": "iso-8859-6",
132
+ "csiso88596e": "iso-8859-6",
133
+ "csiso88596i": "iso-8859-6",
134
+ "csisolatinarabic": "iso-8859-6",
135
+ "ecma-114": "iso-8859-6",
136
+ "iso-8859-6": "iso-8859-6",
137
+ "iso-8859-6-e": "iso-8859-6",
138
+ "iso-8859-6-i": "iso-8859-6",
139
+ "iso-ir-127": "iso-8859-6",
140
+ "iso8859-6": "iso-8859-6",
141
+ "iso88596": "iso-8859-6",
142
+ "iso_8859-6": "iso-8859-6",
143
+ "iso_8859-6:1987": "iso-8859-6",
144
+
145
+ // ISO-8859-7
146
+ "csisolatingreek": "iso-8859-7",
147
+ "ecma-118": "iso-8859-7",
148
+ "elot_928": "iso-8859-7",
149
+ "greek": "iso-8859-7",
150
+ "greek8": "iso-8859-7",
151
+ "iso-8859-7": "iso-8859-7",
152
+ "iso-ir-126": "iso-8859-7",
153
+ "iso8859-7": "iso-8859-7",
154
+ "iso88597": "iso-8859-7",
155
+ "iso_8859-7": "iso-8859-7",
156
+ "iso_8859-7:1987": "iso-8859-7",
157
+ "sun_eu_greek": "iso-8859-7",
158
+
159
+ // ISO-8859-8
160
+ "csiso88598e": "iso-8859-8",
161
+ "csisolatinhebrew": "iso-8859-8",
162
+ "hebrew": "iso-8859-8",
163
+ "iso-8859-8": "iso-8859-8",
164
+ "iso-8859-8-e": "iso-8859-8",
165
+ "iso-ir-138": "iso-8859-8",
166
+ "iso8859-8": "iso-8859-8",
167
+ "iso88598": "iso-8859-8",
168
+ "iso_8859-8": "iso-8859-8",
169
+ "iso_8859-8:1988": "iso-8859-8",
170
+ "visual": "iso-8859-8",
171
+
172
+ // ISO-8859-8-I
173
+ "csiso88598i": "iso-8859-8-i",
174
+ "iso-8859-8-i": "iso-8859-8-i",
175
+ "logical": "iso-8859-8-i",
176
+
177
+ // ISO-8859-10
178
+ "csisolatin6": "iso-8859-10",
179
+ "iso-8859-10": "iso-8859-10",
180
+ "iso-ir-157": "iso-8859-10",
181
+ "iso8859-10": "iso-8859-10",
182
+ "iso885910": "iso-8859-10",
183
+ "l6": "iso-8859-10",
184
+ "latin6": "iso-8859-10",
185
+
186
+ // ISO-8859-13
187
+ "iso-8859-13": "iso-8859-13",
188
+ "iso8859-13": "iso-8859-13",
189
+ "iso885913": "iso-8859-13",
190
+
191
+ // ISO-8859-14
192
+ "iso-8859-14": "iso-8859-14",
193
+ "iso8859-14": "iso-8859-14",
194
+ "iso885914": "iso-8859-14",
195
+
196
+ // ISO-8859-15
197
+ "csisolatin9": "iso-8859-15",
198
+ "iso-8859-15": "iso-8859-15",
199
+ "iso8859-15": "iso-8859-15",
200
+ "iso885915": "iso-8859-15",
201
+ "iso_8859-15": "iso-8859-15",
202
+ "l9": "iso-8859-15",
203
+
204
+ // ISO-8859-16
205
+ "iso-8859-16": "iso-8859-16",
206
+
207
+ // KOI8-R
208
+ "cskoi8r": "koi8-r",
209
+ "koi": "koi8-r",
210
+ "koi8": "koi8-r",
211
+ "koi8-r": "koi8-r",
212
+ "koi8_r": "koi8-r",
213
+
214
+ // KOI8-U
215
+ "koi8-ru": "koi8-u",
216
+ "koi8-u": "koi8-u",
217
+
218
+ // macintosh
219
+ "csmacintosh": "macintosh",
220
+ "mac": "macintosh",
221
+ "macintosh": "macintosh",
222
+ "x-mac-roman": "macintosh",
223
+
224
+ // windows-874
225
+ "dos-874": "windows-874",
226
+ "iso-8859-11": "windows-874",
227
+ "iso8859-11": "windows-874",
228
+ "iso885911": "windows-874",
229
+ "tis-620": "windows-874",
230
+ "windows-874": "windows-874",
231
+
232
+ // windows-1250
233
+ "cp1250": "windows-1250",
234
+ "windows-1250": "windows-1250",
235
+ "x-cp1250": "windows-1250",
236
+
237
+ // windows-1251
238
+ "cp1251": "windows-1251",
239
+ "windows-1251": "windows-1251",
240
+ "x-cp1251": "windows-1251",
241
+
242
+ // windows-1252
243
+ "ansi_x3.4-1968": "windows-1252",
244
+ "ascii": "windows-1252",
245
+ "cp1252": "windows-1252",
246
+ "cp819": "windows-1252",
247
+ "csisolatin1": "windows-1252",
248
+ "ibm819": "windows-1252",
249
+ "iso-8859-1": "windows-1252",
250
+ "iso-ir-100": "windows-1252",
251
+ "iso8859-1": "windows-1252",
252
+ "iso88591": "windows-1252",
253
+ "iso_8859-1": "windows-1252",
254
+ "iso_8859-1:1987": "windows-1252",
255
+ "l1": "windows-1252",
256
+ "latin1": "windows-1252",
257
+ "us-ascii": "windows-1252",
258
+ "windows-1252": "windows-1252",
259
+ "x-cp1252": "windows-1252",
260
+
261
+ // windows-1253
262
+ "cp1253": "windows-1253",
263
+ "windows-1253": "windows-1253",
264
+ "x-cp1253": "windows-1253",
265
+
266
+ // windows-1254
267
+ "cp1254": "windows-1254",
268
+ "csisolatin5": "windows-1254",
269
+ "iso-8859-9": "windows-1254",
270
+ "iso-ir-148": "windows-1254",
271
+ "iso8859-9": "windows-1254",
272
+ "iso88599": "windows-1254",
273
+ "iso_8859-9": "windows-1254",
274
+ "iso_8859-9:1989": "windows-1254",
275
+ "l5": "windows-1254",
276
+ "latin5": "windows-1254",
277
+ "windows-1254": "windows-1254",
278
+ "x-cp1254": "windows-1254",
279
+
280
+ // windows-1255
281
+ "cp1255": "windows-1255",
282
+ "windows-1255": "windows-1255",
283
+ "x-cp1255": "windows-1255",
284
+
285
+ // windows-1256
286
+ "cp1256": "windows-1256",
287
+ "windows-1256": "windows-1256",
288
+ "x-cp1256": "windows-1256",
289
+
290
+ // windows-1257
291
+ "cp1257": "windows-1257",
292
+ "windows-1257": "windows-1257",
293
+ "x-cp1257": "windows-1257",
294
+
295
+ // windows-1258
296
+ "cp1258": "windows-1258",
297
+ "windows-1258": "windows-1258",
298
+ "x-cp1258": "windows-1258",
299
+
300
+ // x-mac-cyrillic
301
+ "x-mac-cyrillic": "x-mac-cyrillic",
302
+ "x-mac-ukrainian": "x-mac-cyrillic",
303
+
304
+ // Legacy multi-byte Chinese (simplified)
305
+ "chinese": "gbk",
306
+ "csgb2312": "gbk",
307
+ "csiso58gb231280": "gbk",
308
+ "gb2312": "gbk",
309
+ "gb_2312": "gbk",
310
+ "gb_2312-80": "gbk",
311
+ "gbk": "gbk",
312
+ "iso-ir-58": "gbk",
313
+ "x-gbk": "gbk",
314
+ "gb18030": "gb18030",
315
+
316
+ // Legacy multi-byte Chinese (traditional)
317
+ "big5": "big5",
318
+ "big5-hkscs": "big5",
319
+ "cn-big5": "big5",
320
+ "csbig5": "big5",
321
+ "x-x-big5": "big5",
322
+
323
+ // Legacy multi-byte Japanese
324
+ "cseucpkdfmtjapanese": "euc-jp",
325
+ "euc-jp": "euc-jp",
326
+ "x-euc-jp": "euc-jp",
327
+ "csiso2022jp": "iso-2022-jp",
328
+ "iso-2022-jp": "iso-2022-jp",
329
+ "csshiftjis": "shift_jis",
330
+ "ms932": "shift_jis",
331
+ "ms_kanji": "shift_jis",
332
+ "shift-jis": "shift_jis",
333
+ "shift_jis": "shift_jis",
334
+ "sjis": "shift_jis",
335
+ "windows-31j": "shift_jis",
336
+ "x-sjis": "shift_jis",
337
+
338
+ // Legacy multi-byte Korean
339
+ "cseuckr": "euc-kr",
340
+ "csksc56011987": "euc-kr",
341
+ "euc-kr": "euc-kr",
342
+ "iso-ir-149": "euc-kr",
343
+ "korean": "euc-kr",
344
+ "ks_c_5601-1987": "euc-kr",
345
+ "ks_c_5601-1989": "euc-kr",
346
+ "ksc5601": "euc-kr",
347
+ "ksc_5601": "euc-kr",
348
+ "windows-949": "euc-kr",
349
+
350
+ // Legacy miscellaneous
351
+ "csiso2022kr": "replacement",
352
+ "hz-gb-2312": "replacement",
353
+ "iso-2022-cn": "replacement",
354
+ "iso-2022-cn-ext": "replacement",
355
+ "iso-2022-kr": "replacement",
356
+ "replacement": "replacement",
357
+
358
+ "unicodefffe": "utf-16be",
359
+ "utf-16be": "utf-16be",
360
+
361
+ "csunicode": "utf-16le",
362
+ "iso-10646-ucs-2": "utf-16le",
363
+ "ucs-2": "utf-16le",
364
+ "unicode": "utf-16le",
365
+ "unicodefeff": "utf-16le",
366
+ "utf-16": "utf-16le",
367
+ "utf-16le": "utf-16le",
368
+
369
+ "x-user-defined": "x-user-defined",
370
+ };
371
+
372
+ // ─── Single-byte encoding tables ──────────────────────────────────────────
373
+ // Each table maps bytes 0x80-0xFF to Unicode code points.
374
+ // Bytes 0x00-0x7F always map to the same code point.
375
+ // A null entry means the byte is unmapped and should produce U+FFFD (or throw in fatal mode).
376
+
377
+ // Windows-1252 (0x80-0x9F range; 0xA0-0xFF = Latin-1 identity)
378
+ const WINDOWS_1252: (number | null)[] = [
379
+ 0x20AC,null,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,0x02C6,0x2030,0x0160,0x2039,0x0152,null,0x017D,null,
380
+ null,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,0x02DC,0x2122,0x0161,0x203A,0x0153,null,0x017E,0x0178,
381
+ ];
382
+
383
+ // IBM866 (DOS Cyrillic)
384
+ const IBM866: number[] = [
385
+ 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
386
+ 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
387
+ 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
388
+ 0x2591,0x2592,0x2593,0x2502,0x2524,0x2561,0x2562,0x2556,0x2555,0x2563,0x2551,0x2557,0x255D,0x255C,0x255B,0x2510,
389
+ 0x2514,0x2534,0x252C,0x251C,0x2500,0x253C,0x255E,0x255F,0x255A,0x2554,0x2569,0x2566,0x2560,0x2550,0x256C,0x2567,
390
+ 0x2568,0x2564,0x2565,0x2559,0x2558,0x2552,0x2553,0x256B,0x256A,0x2518,0x250C,0x2588,0x2584,0x258C,0x2590,0x2580,
391
+ 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F,
392
+ 0x0401,0x0451,0x0404,0x0454,0x0407,0x0457,0x040E,0x045E,0x00B0,0x2219,0x00B7,0x221A,0x2116,0x00A4,0x25A0,0x00A0,
393
+ ];
394
+
395
+ // ISO-8859-2
396
+ const ISO_8859_2: number[] = [
397
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
398
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
399
+ 0x00A0,0x0104,0x02D8,0x0141,0x00A4,0x013D,0x015A,0x00A7,0x00A8,0x0160,0x015E,0x0164,0x0179,0x00AD,0x017D,0x017B,
400
+ 0x00B0,0x0105,0x02DB,0x0142,0x00B4,0x013E,0x015B,0x02C7,0x00B8,0x0161,0x015F,0x0165,0x017A,0x02DD,0x017E,0x017C,
401
+ 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
402
+ 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
403
+ 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
404
+ 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9,
405
+ ];
406
+
407
+ // ISO-8859-3
408
+ const ISO_8859_3: (number | null)[] = [
409
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
410
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
411
+ 0x00A0,0x0126,0x02D8,0x00A3,0x00A4,null,0x0124,0x00A7,0x00A8,0x0130,0x015E,0x011E,0x0134,0x00AD,null,0x017B,
412
+ 0x00B0,0x0127,0x00B2,0x00B3,0x00B4,0x00B5,0x0125,0x00B7,0x00B8,0x0131,0x015F,0x011F,0x0135,0x00BD,null,0x017C,
413
+ 0x00C0,0x00C1,0x00C2,null,0x00C4,0x010A,0x0108,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
414
+ null,0x00D1,0x00D2,0x00D3,0x00D4,0x0120,0x00D6,0x00D7,0x011C,0x00D9,0x00DA,0x00DB,0x00DC,0x016C,0x015C,0x00DF,
415
+ 0x00E0,0x00E1,0x00E2,null,0x00E4,0x010B,0x0109,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
416
+ null,0x00F1,0x00F2,0x00F3,0x00F4,0x0121,0x00F6,0x00F7,0x011D,0x00F9,0x00FA,0x00FB,0x00FC,0x016D,0x015D,0x02D9,
417
+ ];
418
+
419
+ // ISO-8859-4
420
+ const ISO_8859_4: number[] = [
421
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
422
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
423
+ 0x00A0,0x0104,0x0138,0x0156,0x00A4,0x0128,0x013B,0x00A7,0x00A8,0x0160,0x0112,0x0122,0x0166,0x00AD,0x017D,0x00AF,
424
+ 0x00B0,0x0105,0x02DB,0x0157,0x00B4,0x0129,0x013C,0x02C7,0x00B8,0x0161,0x0113,0x0123,0x0167,0x014A,0x017E,0x014B,
425
+ 0x0100,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x012E,0x010C,0x00C9,0x0118,0x00CB,0x0116,0x00CD,0x00CE,0x012A,
426
+ 0x0110,0x0145,0x014C,0x0136,0x00D4,0x00D5,0x00D6,0x00D7,0x00D8,0x0172,0x00DA,0x00DB,0x00DC,0x0168,0x016A,0x00DF,
427
+ 0x0101,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x012F,0x010D,0x00E9,0x0119,0x00EB,0x0117,0x00ED,0x00EE,0x012B,
428
+ 0x0111,0x0146,0x014D,0x0137,0x00F4,0x00F5,0x00F6,0x00F7,0x00F8,0x0173,0x00FA,0x00FB,0x00FC,0x0169,0x016B,0x02D9,
429
+ ];
430
+
431
+ // ISO-8859-5
432
+ const ISO_8859_5: number[] = [
433
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
434
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
435
+ 0x00A0,0x0401,0x0402,0x0403,0x0404,0x0405,0x0406,0x0407,0x0408,0x0409,0x040A,0x040B,0x040C,0x00AD,0x040E,0x040F,
436
+ 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
437
+ 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
438
+ 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
439
+ 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F,
440
+ 0x2116,0x0451,0x0452,0x0453,0x0454,0x0455,0x0456,0x0457,0x0458,0x0459,0x045A,0x045B,0x045C,0x00A7,0x045E,0x045F,
441
+ ];
442
+
443
+ // ISO-8859-6
444
+ const ISO_8859_6: (number | null)[] = [
445
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
446
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
447
+ 0x00A0,null,null,null,0x00A4,null,null,null,null,null,null,null,0x060C,0x00AD,null,null,
448
+ null,null,null,null,null,null,null,null,null,null,null,0x061B,null,null,null,0x061F,
449
+ null,0x0621,0x0622,0x0623,0x0624,0x0625,0x0626,0x0627,0x0628,0x0629,0x062A,0x062B,0x062C,0x062D,0x062E,0x062F,
450
+ 0x0630,0x0631,0x0632,0x0633,0x0634,0x0635,0x0636,0x0637,0x0638,0x0639,0x063A,null,null,null,null,null,
451
+ 0x0640,0x0641,0x0642,0x0643,0x0644,0x0645,0x0646,0x0647,0x0648,0x0649,0x064A,0x064B,0x064C,0x064D,0x064E,0x064F,
452
+ 0x0650,0x0651,0x0652,null,null,null,null,null,null,null,null,null,null,null,null,null,
453
+ ];
454
+
455
+ // ISO-8859-7
456
+ const ISO_8859_7: (number | null)[] = [
457
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
458
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
459
+ 0x00A0,0x2018,0x2019,0x00A3,0x20AC,0x20AF,0x00A6,0x00A7,0x00A8,0x00A9,0x037A,0x00AB,0x00AC,0x00AD,null,0x2015,
460
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x0384,0x0385,0x0386,0x00B7,0x0388,0x0389,0x038A,0x00BB,0x038C,0x00BD,0x038E,0x038F,
461
+ 0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,
462
+ 0x03A0,0x03A1,null,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9,0x03AA,0x03AB,0x03AC,0x03AD,0x03AE,0x03AF,
463
+ 0x03B0,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,
464
+ 0x03C0,0x03C1,0x03C2,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x03CA,0x03CB,0x03CC,0x03CD,0x03CE,null,
465
+ ];
466
+
467
+ // ISO-8859-8
468
+ const ISO_8859_8: (number | null)[] = [
469
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
470
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
471
+ 0x00A0,null,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x00D7,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
472
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8,0x00B9,0x00F7,0x00BB,0x00BC,0x00BD,0x00BE,null,
473
+ null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
474
+ null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,null,
475
+ 0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7,0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF,
476
+ 0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7,0x05E8,0x05E9,0x05EA,null,null,0x200E,0x200F,null,
477
+ ];
478
+
479
+ // ISO-8859-10
480
+ const ISO_8859_10: number[] = [
481
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
482
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
483
+ 0x00A0,0x0104,0x0112,0x0122,0x012A,0x0128,0x0136,0x00A7,0x013B,0x0110,0x0160,0x0166,0x017D,0x00AD,0x016A,0x014A,
484
+ 0x00B0,0x0105,0x0113,0x0123,0x012B,0x0129,0x0137,0x00B7,0x013C,0x0111,0x0161,0x0167,0x017E,0x2015,0x016B,0x014B,
485
+ 0x0100,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x012E,0x010C,0x00C9,0x0118,0x00CB,0x0116,0x00CD,0x00CE,0x00CF,
486
+ 0x00D0,0x0145,0x014C,0x00D3,0x00D4,0x00D5,0x00D6,0x0168,0x00D8,0x0172,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,
487
+ 0x0101,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x012F,0x010D,0x00E9,0x0119,0x00EB,0x0117,0x00ED,0x00EE,0x00EF,
488
+ 0x00F0,0x0146,0x014D,0x00F3,0x00F4,0x00F5,0x00F6,0x0169,0x00F8,0x0173,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x0138,
489
+ ];
490
+
491
+ // ISO-8859-13
492
+ const ISO_8859_13: number[] = [
493
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
494
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
495
+ 0x00A0,0x201D,0x00A2,0x00A3,0x00A4,0x201E,0x00A6,0x00A7,0x00D8,0x00A9,0x0156,0x00AB,0x00AC,0x00AD,0x00AE,0x00C6,
496
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x201C,0x00B5,0x00B6,0x00B7,0x00F8,0x00B9,0x0157,0x00BB,0x00BC,0x00BD,0x00BE,0x00E6,
497
+ 0x0104,0x012E,0x0100,0x0106,0x00C4,0x00C5,0x0118,0x0112,0x010C,0x00C9,0x0179,0x0116,0x0122,0x0136,0x012A,0x013B,
498
+ 0x0160,0x0143,0x0145,0x00D3,0x014C,0x00D5,0x00D6,0x00D7,0x0172,0x0141,0x015A,0x016A,0x00DC,0x017B,0x017D,0x00DF,
499
+ 0x0105,0x012F,0x0101,0x0107,0x00E4,0x00E5,0x0119,0x0113,0x010D,0x00E9,0x017A,0x0117,0x0123,0x0137,0x012B,0x013C,
500
+ 0x0161,0x0144,0x0146,0x00F3,0x014D,0x00F5,0x00F6,0x00F7,0x0173,0x0142,0x015B,0x016B,0x00FC,0x017C,0x017E,0x2019,
501
+ ];
502
+
503
+ // ISO-8859-14
504
+ const ISO_8859_14: number[] = [
505
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
506
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
507
+ 0x00A0,0x1E02,0x1E03,0x00A3,0x010A,0x010B,0x1E0A,0x00A7,0x1E80,0x00A9,0x1E82,0x1E0B,0x1EF2,0x00AD,0x00AE,0x0178,
508
+ 0x1E1E,0x1E1F,0x0120,0x0121,0x1E40,0x1E41,0x00B6,0x1E56,0x1E81,0x1E57,0x1E83,0x1E60,0x1EF3,0x1E84,0x1E85,0x1E61,
509
+ 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
510
+ 0x0174,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x1E6A,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x0176,0x00DF,
511
+ 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
512
+ 0x0175,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x1E6B,0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x0177,0x00FF,
513
+ ];
514
+
515
+ // ISO-8859-15
516
+ const ISO_8859_15: number[] = [
517
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
518
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
519
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x20AC,0x00A5,0x0160,0x00A7,0x0161,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
520
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x017D,0x00B5,0x00B6,0x00B7,0x017E,0x00B9,0x00BA,0x00BB,0x0152,0x0153,0x0178,0x00BF,
521
+ 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
522
+ 0x00D0,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x00DD,0x00DE,0x00DF,
523
+ 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
524
+ 0x00F0,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x00FD,0x00FE,0x00FF,
525
+ ];
526
+
527
+ // ISO-8859-16
528
+ const ISO_8859_16: number[] = [
529
+ 0x0080,0x0081,0x0082,0x0083,0x0084,0x0085,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
530
+ 0x0090,0x0091,0x0092,0x0093,0x0094,0x0095,0x0096,0x0097,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
531
+ 0x00A0,0x0104,0x0105,0x0141,0x20AC,0x201E,0x0160,0x00A7,0x0161,0x00A9,0x0218,0x00AB,0x0179,0x00AD,0x017A,0x017B,
532
+ 0x00B0,0x00B1,0x010C,0x0142,0x017D,0x201D,0x00B6,0x00B7,0x017E,0x010D,0x0219,0x00BB,0x0152,0x0153,0x0178,0x017C,
533
+ 0x00C0,0x00C1,0x00C2,0x0102,0x00C4,0x0106,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
534
+ 0x0110,0x0143,0x00D2,0x00D3,0x00D4,0x0150,0x00D6,0x015A,0x0170,0x00D9,0x00DA,0x00DB,0x00DC,0x0118,0x021A,0x00DF,
535
+ 0x00E0,0x00E1,0x00E2,0x0103,0x00E4,0x0107,0x00E6,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
536
+ 0x0111,0x0144,0x00F2,0x00F3,0x00F4,0x0151,0x00F6,0x015B,0x0171,0x00F9,0x00FA,0x00FB,0x00FC,0x0119,0x021B,0x00FF,
537
+ ];
538
+
539
+ // KOI8-R
540
+ const KOI8_R: number[] = [
541
+ 0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524,0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590,
542
+ 0x2591,0x2592,0x2593,0x2320,0x25A0,0x2219,0x221A,0x2248,0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7,
543
+ 0x2550,0x2551,0x2552,0x0451,0x2553,0x2554,0x2555,0x2556,0x2557,0x2558,0x2559,0x255A,0x255B,0x255C,0x255D,0x255E,
544
+ 0x255F,0x2560,0x2561,0x0401,0x2562,0x2563,0x2564,0x2565,0x2566,0x2567,0x2568,0x2569,0x256A,0x256B,0x256C,0x00A9,
545
+ 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433,0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,
546
+ 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432,0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A,
547
+ 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413,0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,
548
+ 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412,0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A,
549
+ ];
550
+
551
+ // KOI8-U
552
+ const KOI8_U: number[] = [
553
+ 0x2500,0x2502,0x250C,0x2510,0x2514,0x2518,0x251C,0x2524,0x252C,0x2534,0x253C,0x2580,0x2584,0x2588,0x258C,0x2590,
554
+ 0x2591,0x2592,0x2593,0x2320,0x25A0,0x2219,0x221A,0x2248,0x2264,0x2265,0x00A0,0x2321,0x00B0,0x00B2,0x00B7,0x00F7,
555
+ 0x2550,0x2551,0x2552,0x0451,0x0454,0x2554,0x0456,0x0457,0x2557,0x2558,0x2559,0x255A,0x255B,0x0491,0x255D,0x255E,
556
+ 0x255F,0x2560,0x2561,0x0401,0x0404,0x2563,0x0406,0x0407,0x2566,0x2567,0x2568,0x2569,0x256A,0x0490,0x256C,0x00A9,
557
+ 0x044E,0x0430,0x0431,0x0446,0x0434,0x0435,0x0444,0x0433,0x0445,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,
558
+ 0x043F,0x044F,0x0440,0x0441,0x0442,0x0443,0x0436,0x0432,0x044C,0x044B,0x0437,0x0448,0x044D,0x0449,0x0447,0x044A,
559
+ 0x042E,0x0410,0x0411,0x0426,0x0414,0x0415,0x0424,0x0413,0x0425,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,
560
+ 0x041F,0x042F,0x0420,0x0421,0x0422,0x0423,0x0416,0x0412,0x042C,0x042B,0x0417,0x0428,0x042D,0x0429,0x0427,0x042A,
561
+ ];
562
+
563
+ // macintosh (Mac OS Roman)
564
+ const MACINTOSH: number[] = [
565
+ 0x00C4,0x00C5,0x00C7,0x00C9,0x00D1,0x00D6,0x00DC,0x00E1,0x00E0,0x00E2,0x00E4,0x00E3,0x00E5,0x00E7,0x00E9,0x00E8,
566
+ 0x00EA,0x00EB,0x00ED,0x00EC,0x00EE,0x00EF,0x00F1,0x00F3,0x00F2,0x00F4,0x00F6,0x00F5,0x00FA,0x00F9,0x00FB,0x00FC,
567
+ 0x2020,0x00B0,0x00A2,0x00A3,0x00A7,0x2022,0x00B6,0x00DF,0x00AE,0x00A9,0x2122,0x00B4,0x00A8,0x2260,0x00C6,0x00D8,
568
+ 0x221E,0x00B1,0x2264,0x2265,0x00A5,0x00B5,0x2202,0x2211,0x220F,0x03C0,0x222B,0x00AA,0x00BA,0x2126,0x00E6,0x00F8,
569
+ 0x00BF,0x00A1,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,0x00BB,0x2026,0x00A0,0x00C0,0x00C3,0x00D5,0x0152,0x0153,
570
+ 0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x25CA,0x00FF,0x0178,0x2044,0x20AC,0x2039,0x203A,0xFB01,0xFB02,
571
+ 0x2021,0x00B7,0x201A,0x201E,0x2030,0x00C2,0x00CA,0x00C1,0x00CB,0x00C8,0x00CD,0x00CE,0x00CF,0x00CC,0x00D3,0x00D4,
572
+ 0xF8FF,0x00D2,0x00DA,0x00DB,0x00D9,0x0131,0x02C6,0x02DC,0x00AF,0x02D8,0x02D9,0x02DA,0x00B8,0x02DD,0x02DB,0x02C7,
573
+ ];
574
+
575
+ // windows-874
576
+ const WINDOWS_874: (number | null)[] = [
577
+ 0x20AC,0x0081,0x0082,0x0083,0x0084,0x2026,0x0086,0x0087,0x0088,0x0089,0x008A,0x008B,0x008C,0x008D,0x008E,0x008F,
578
+ 0x0090,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,0x0098,0x0099,0x009A,0x009B,0x009C,0x009D,0x009E,0x009F,
579
+ 0x00A0,0x0E01,0x0E02,0x0E03,0x0E04,0x0E05,0x0E06,0x0E07,0x0E08,0x0E09,0x0E0A,0x0E0B,0x0E0C,0x0E0D,0x0E0E,0x0E0F,
580
+ 0x0E10,0x0E11,0x0E12,0x0E13,0x0E14,0x0E15,0x0E16,0x0E17,0x0E18,0x0E19,0x0E1A,0x0E1B,0x0E1C,0x0E1D,0x0E1E,0x0E1F,
581
+ 0x0E20,0x0E21,0x0E22,0x0E23,0x0E24,0x0E25,0x0E26,0x0E27,0x0E28,0x0E29,0x0E2A,0x0E2B,0x0E2C,0x0E2D,0x0E2E,0x0E2F,
582
+ 0x0E30,0x0E31,0x0E32,0x0E33,0x0E34,0x0E35,0x0E36,0x0E37,0x0E38,0x0E39,0x0E3A,null,null,null,null,0x0E3F,
583
+ 0x0E40,0x0E41,0x0E42,0x0E43,0x0E44,0x0E45,0x0E46,0x0E47,0x0E48,0x0E49,0x0E4A,0x0E4B,0x0E4C,0x0E4D,0x0E4E,0x0E4F,
584
+ 0x0E50,0x0E51,0x0E52,0x0E53,0x0E54,0x0E55,0x0E56,0x0E57,0x0E58,0x0E59,0x0E5A,0x0E5B,null,null,null,null,
585
+ ];
586
+
587
+ // windows-1250
588
+ const WINDOWS_1250: (number | null)[] = [
589
+ 0x20AC,null,0x201A,null,0x201E,0x2026,0x2020,0x2021,null,0x2030,0x0160,0x2039,0x015A,0x0164,0x017D,0x0179,
590
+ null,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,null,0x2122,0x0161,0x203A,0x015B,0x0165,0x017E,0x017A,
591
+ 0x00A0,0x02C7,0x02D8,0x0141,0x00A4,0x0104,0x00A6,0x00A7,0x00A8,0x00A9,0x015E,0x00AB,0x00AC,0x00AD,0x00AE,0x017B,
592
+ 0x00B0,0x00B1,0x02DB,0x0142,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8,0x0105,0x015F,0x00BB,0x013D,0x02DD,0x013E,0x017C,
593
+ 0x0154,0x00C1,0x00C2,0x0102,0x00C4,0x0139,0x0106,0x00C7,0x010C,0x00C9,0x0118,0x00CB,0x011A,0x00CD,0x00CE,0x010E,
594
+ 0x0110,0x0143,0x0147,0x00D3,0x00D4,0x0150,0x00D6,0x00D7,0x0158,0x016E,0x00DA,0x0170,0x00DC,0x00DD,0x0162,0x00DF,
595
+ 0x0155,0x00E1,0x00E2,0x0103,0x00E4,0x013A,0x0107,0x00E7,0x010D,0x00E9,0x0119,0x00EB,0x011B,0x00ED,0x00EE,0x010F,
596
+ 0x0111,0x0144,0x0148,0x00F3,0x00F4,0x0151,0x00F6,0x00F7,0x0159,0x016F,0x00FA,0x0171,0x00FC,0x00FD,0x0163,0x02D9,
597
+ ];
598
+
599
+ // windows-1251
600
+ const WINDOWS_1251: number[] = [
601
+ 0x0402,0x0403,0x201A,0x0453,0x201E,0x2026,0x2020,0x2021,0x20AC,0x2030,0x0409,0x2039,0x040A,0x040C,0x040B,0x040F,
602
+ 0x0452,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,null as any,0x2122,0x0459,0x203A,0x045A,0x045C,0x045B,0x045F,
603
+ 0x00A0,0x040E,0x045E,0x0408,0x00A4,0x0490,0x00A6,0x00A7,0x0401,0x00A9,0x0404,0x00AB,0x00AC,0x00AD,0x00AE,0x0407,
604
+ 0x00B0,0x00B1,0x0406,0x0456,0x0491,0x00B5,0x00B6,0x00B7,0x0451,0x2116,0x0454,0x00BB,0x0458,0x0405,0x0455,0x0457,
605
+ 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
606
+ 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
607
+ 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
608
+ 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x044F,
609
+ ];
610
+
611
+ // windows-1253
612
+ const WINDOWS_1253: (number | null)[] = [
613
+ 0x20AC,null,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,null,0x2030,null,0x2039,null,null,null,null,
614
+ null,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,null,0x2122,null,0x203A,null,null,null,null,
615
+ 0x00A0,0x0385,0x0386,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,null,0x00AB,0x00AC,0x00AD,0x00AE,0x2015,
616
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x0384,0x00B5,0x00B6,0x00B7,0x0388,0x0389,0x038A,0x00BB,0x038C,0x00BD,0x038E,0x038F,
617
+ 0x0390,0x0391,0x0392,0x0393,0x0394,0x0395,0x0396,0x0397,0x0398,0x0399,0x039A,0x039B,0x039C,0x039D,0x039E,0x039F,
618
+ 0x03A0,0x03A1,null,0x03A3,0x03A4,0x03A5,0x03A6,0x03A7,0x03A8,0x03A9,0x03AA,0x03AB,0x03AC,0x03AD,0x03AE,0x03AF,
619
+ 0x03B0,0x03B1,0x03B2,0x03B3,0x03B4,0x03B5,0x03B6,0x03B7,0x03B8,0x03B9,0x03BA,0x03BB,0x03BC,0x03BD,0x03BE,0x03BF,
620
+ 0x03C0,0x03C1,0x03C2,0x03C3,0x03C4,0x03C5,0x03C6,0x03C7,0x03C8,0x03C9,0x03CA,0x03CB,0x03CC,0x03CD,0x03CE,null,
621
+ ];
622
+
623
+ // windows-1254
624
+ const WINDOWS_1254: (number | null)[] = [
625
+ 0x20AC,null,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,0x02C6,0x2030,0x0160,0x2039,0x0152,null,null,null,
626
+ null,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,0x02DC,0x2122,0x0161,0x203A,0x0153,null,null,0x0178,
627
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
628
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
629
+ 0x00C0,0x00C1,0x00C2,0x00C3,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x00CC,0x00CD,0x00CE,0x00CF,
630
+ 0x011E,0x00D1,0x00D2,0x00D3,0x00D4,0x00D5,0x00D6,0x00D7,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x0130,0x015E,0x00DF,
631
+ 0x00E0,0x00E1,0x00E2,0x00E3,0x00E4,0x00E5,0x00E6,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x00EC,0x00ED,0x00EE,0x00EF,
632
+ 0x011F,0x00F1,0x00F2,0x00F3,0x00F4,0x00F5,0x00F6,0x00F7,0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x0131,0x015F,0x00FF,
633
+ ];
634
+
635
+ // windows-1255
636
+ const WINDOWS_1255: (number | null)[] = [
637
+ 0x20AC,null,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,0x02C6,0x2030,null,0x2039,null,null,null,null,
638
+ null,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,0x02DC,0x2122,null,0x203A,null,null,null,null,
639
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x20AA,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x00D7,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
640
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8,0x00B9,0x00F7,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
641
+ 0x05B0,0x05B1,0x05B2,0x05B3,0x05B4,0x05B5,0x05B6,0x05B7,0x05B8,0x05B9,0x05BA,0x05BB,0x05BC,0x05BD,0x05BE,0x05BF,
642
+ 0x05C0,0x05C1,0x05C2,0x05C3,0x05F0,0x05F1,0x05F2,0x05F3,0x05F4,null,null,null,null,null,null,null,
643
+ 0x05D0,0x05D1,0x05D2,0x05D3,0x05D4,0x05D5,0x05D6,0x05D7,0x05D8,0x05D9,0x05DA,0x05DB,0x05DC,0x05DD,0x05DE,0x05DF,
644
+ 0x05E0,0x05E1,0x05E2,0x05E3,0x05E4,0x05E5,0x05E6,0x05E7,0x05E8,0x05E9,0x05EA,null,null,0x200E,0x200F,null,
645
+ ];
646
+
647
+ // windows-1256
648
+ const WINDOWS_1256: number[] = [
649
+ 0x20AC,0x067E,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,0x02C6,0x2030,0x0679,0x2039,0x0152,0x0686,0x0698,0x0688,
650
+ 0x06AF,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,0x06A9,0x2122,0x0691,0x203A,0x0153,0x200C,0x200D,0x06BA,
651
+ 0x00A0,0x060C,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x06BE,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
652
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8,0x00B9,0x061B,0x00BB,0x00BC,0x00BD,0x00BE,0x061F,
653
+ 0x06C1,0x0621,0x0622,0x0623,0x0624,0x0625,0x0626,0x0627,0x0628,0x0629,0x062A,0x062B,0x062C,0x062D,0x062E,0x062F,
654
+ 0x0630,0x0631,0x0632,0x0633,0x0634,0x0635,0x0636,0x00D7,0x0637,0x0638,0x0639,0x063A,0x0640,0x0641,0x0642,0x0643,
655
+ 0x00E0,0x0644,0x00E2,0x0645,0x0646,0x0647,0x0648,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x0649,0x064A,0x00EE,0x00EF,
656
+ 0x064B,0x064C,0x064D,0x064E,0x00F4,0x064F,0x0650,0x00F7,0x0651,0x00F9,0x0652,0x00FB,0x00FC,0x200E,0x200F,0x06D2,
657
+ ];
658
+
659
+ // windows-1257
660
+ const WINDOWS_1257: (number | null)[] = [
661
+ 0x20AC,null,0x201A,null,0x201E,0x2026,0x2020,0x2021,null,0x2030,null,0x2039,null,0x00A8,0x02C7,0x00B8,
662
+ null,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,null,0x2122,null,0x203A,null,0x00AF,0x02DB,null,
663
+ 0x00A0,null,0x00A2,0x00A3,0x00A4,null,0x00A6,0x00A7,0x00D8,0x00A9,0x0156,0x00AB,0x00AC,0x00AD,0x00AE,0x00C6,
664
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00F8,0x00B9,0x0157,0x00BB,0x00BC,0x00BD,0x00BE,0x00E6,
665
+ 0x0104,0x012E,0x0100,0x0106,0x00C4,0x00C5,0x0118,0x0112,0x010C,0x00C9,0x0179,0x0116,0x0122,0x0136,0x012A,0x013B,
666
+ 0x0160,0x0143,0x0145,0x00D3,0x014C,0x00D5,0x00D6,0x00D7,0x0172,0x0141,0x015A,0x016A,0x00DC,0x017B,0x017D,0x00DF,
667
+ 0x0105,0x012F,0x0101,0x0107,0x00E4,0x00E5,0x0119,0x0113,0x010D,0x00E9,0x017A,0x0117,0x0123,0x0137,0x012B,0x013C,
668
+ 0x0161,0x0144,0x0146,0x00F3,0x014D,0x00F5,0x00F6,0x00F7,0x0173,0x0142,0x015B,0x016B,0x00FC,0x017C,0x017E,0x02D9,
669
+ ];
670
+
671
+ // windows-1258
672
+ const WINDOWS_1258: (number | null)[] = [
673
+ 0x20AC,null,0x201A,0x0192,0x201E,0x2026,0x2020,0x2021,0x02C6,0x2030,null,0x2039,0x0152,null,null,null,
674
+ null,0x2018,0x2019,0x201C,0x201D,0x2022,0x2013,0x2014,0x02DC,0x2122,null,0x203A,0x0153,null,null,0x0178,
675
+ 0x00A0,0x00A1,0x00A2,0x00A3,0x00A4,0x00A5,0x00A6,0x00A7,0x00A8,0x00A9,0x00AA,0x00AB,0x00AC,0x00AD,0x00AE,0x00AF,
676
+ 0x00B0,0x00B1,0x00B2,0x00B3,0x00B4,0x00B5,0x00B6,0x00B7,0x00B8,0x00B9,0x00BA,0x00BB,0x00BC,0x00BD,0x00BE,0x00BF,
677
+ 0x00C0,0x00C1,0x00C2,0x0102,0x00C4,0x00C5,0x00C6,0x00C7,0x00C8,0x00C9,0x00CA,0x00CB,0x0300,0x00CD,0x00CE,0x00CF,
678
+ 0x0110,0x00D1,0x0309,0x00D3,0x00D4,0x01A0,0x00D6,0x00D7,0x00D8,0x00D9,0x00DA,0x00DB,0x00DC,0x01AF,0x0303,0x00DF,
679
+ 0x00E0,0x00E1,0x00E2,0x0103,0x00E4,0x00E5,0x00E6,0x00E7,0x00E8,0x00E9,0x00EA,0x00EB,0x0301,0x00ED,0x00EE,0x00EF,
680
+ 0x0111,0x00F1,0x0323,0x00F3,0x00F4,0x01A1,0x00F6,0x00F7,0x00F8,0x00F9,0x00FA,0x00FB,0x00FC,0x01B0,0x20AB,0x00FF,
681
+ ];
682
+
683
+ // x-mac-cyrillic
684
+ const X_MAC_CYRILLIC: number[] = [
685
+ 0x0410,0x0411,0x0412,0x0413,0x0414,0x0415,0x0416,0x0417,0x0418,0x0419,0x041A,0x041B,0x041C,0x041D,0x041E,0x041F,
686
+ 0x0420,0x0421,0x0422,0x0423,0x0424,0x0425,0x0426,0x0427,0x0428,0x0429,0x042A,0x042B,0x042C,0x042D,0x042E,0x042F,
687
+ 0x2020,0x00B0,0x0490,0x00A3,0x00A7,0x2022,0x00B6,0x0406,0x00AE,0x00A9,0x2122,0x0402,0x0452,0x2260,0x0403,0x0453,
688
+ 0x221E,0x00B1,0x2264,0x2265,0x0456,0x00B5,0x0491,0x0408,0x0404,0x0454,0x0407,0x0457,0x0409,0x0459,0x040A,0x045A,
689
+ 0x0458,0x0405,0x00AC,0x221A,0x0192,0x2248,0x2206,0x00AB,0x00BB,0x2026,0x00A0,0x040B,0x045B,0x040C,0x045C,0x0455,
690
+ 0x2013,0x2014,0x201C,0x201D,0x2018,0x2019,0x00F7,0x201E,0x040E,0x045E,0x040F,0x045F,0x2116,0x0401,0x0451,0x044F,
691
+ 0x0430,0x0431,0x0432,0x0433,0x0434,0x0435,0x0436,0x0437,0x0438,0x0439,0x043A,0x043B,0x043C,0x043D,0x043E,0x043F,
692
+ 0x0440,0x0441,0x0442,0x0443,0x0444,0x0445,0x0446,0x0447,0x0448,0x0449,0x044A,0x044B,0x044C,0x044D,0x044E,0x20AC,
693
+ ];
694
+
695
+ // Map encoding names to their tables
696
+ const SINGLE_BYTE_TABLES: Record<string, (number | null)[]> = {
697
+ "ibm866": IBM866,
698
+ "iso-8859-2": ISO_8859_2,
699
+ "iso-8859-3": ISO_8859_3,
700
+ "iso-8859-4": ISO_8859_4,
701
+ "iso-8859-5": ISO_8859_5,
702
+ "iso-8859-6": ISO_8859_6,
703
+ "iso-8859-7": ISO_8859_7,
704
+ "iso-8859-8": ISO_8859_8,
705
+ "iso-8859-8-i": ISO_8859_8, // Same table as ISO-8859-8
706
+ "iso-8859-10": ISO_8859_10,
707
+ "iso-8859-13": ISO_8859_13,
708
+ "iso-8859-14": ISO_8859_14,
709
+ "iso-8859-15": ISO_8859_15,
710
+ "iso-8859-16": ISO_8859_16,
711
+ "koi8-r": KOI8_R,
712
+ "koi8-u": KOI8_U,
713
+ "macintosh": MACINTOSH,
714
+ "windows-874": WINDOWS_874,
715
+ "windows-1250": WINDOWS_1250,
716
+ "windows-1251": WINDOWS_1251,
717
+ "windows-1253": WINDOWS_1253,
718
+ "windows-1254": WINDOWS_1254,
719
+ "windows-1255": WINDOWS_1255,
720
+ "windows-1256": WINDOWS_1256,
721
+ "windows-1257": WINDOWS_1257,
722
+ "windows-1258": WINDOWS_1258,
723
+ "x-mac-cyrillic": X_MAC_CYRILLIC,
724
+ };
725
+
726
+ export class TextDecoder {
727
+ readonly encoding: string;
728
+ readonly fatal: boolean;
729
+ readonly ignoreBOM: boolean;
730
+
731
+ // State for streaming decode
732
+ private _pendingBytes: number[] = [];
733
+ private _bomSeen: boolean = false;
734
+
735
+ constructor(label?: string, options?: TextDecoderOptions) {
736
+ // WHATWG spec: strip ASCII whitespace (tab, LF, FF, CR, space) from both ends
737
+ let rawLabel = label ?? "utf-8";
738
+ if (typeof rawLabel !== "string") {
739
+ rawLabel = String(rawLabel);
740
+ }
741
+ // Strip leading/trailing ASCII whitespace: \t \n \f \r \x20
742
+ let start = 0;
743
+ let end = rawLabel.length;
744
+ while (start < end) {
745
+ const code = rawLabel.charCodeAt(start);
746
+ if (code === 0x09 || code === 0x0A || code === 0x0C || code === 0x0D || code === 0x20) {
747
+ start++;
748
+ } else {
749
+ break;
750
+ }
751
+ }
752
+ while (end > start) {
753
+ const code = rawLabel.charCodeAt(end - 1);
754
+ if (code === 0x09 || code === 0x0A || code === 0x0C || code === 0x0D || code === 0x20) {
755
+ end--;
756
+ } else {
757
+ break;
758
+ }
759
+ }
760
+ const normalizedLabel = rawLabel.slice(start, end).toLowerCase();
761
+ const encoding = encodingLabels[normalizedLabel];
762
+
763
+ if (!encoding) {
764
+ throw new RangeError(
765
+ `The encoding label provided ('${label}') is not supported.`
766
+ );
767
+ }
768
+
769
+ this.encoding = encoding;
770
+ this.fatal = Boolean(options?.fatal);
771
+ this.ignoreBOM = Boolean(options?.ignoreBOM);
772
+ }
773
+
774
+ /**
775
+ * Decode bytes to a string
776
+ *
777
+ * @param input ArrayBuffer, TypedArray, or DataView
778
+ * @param options Decode options (stream mode)
779
+ * @returns Decoded string
780
+ */
781
+ decode(input?: BufferSource | null, options?: TextDecodeOptions): string {
782
+ const stream = options?.stream ?? false;
783
+ const hadPendingBytes = this._pendingBytes.length > 0;
784
+
785
+ // Get bytes from input
786
+ let bytes: Uint8Array;
787
+ if (input === undefined || input === null) {
788
+ bytes = new Uint8Array(0);
789
+ } else if (input instanceof ArrayBuffer) {
790
+ bytes = isDetachedArrayBuffer(input) ? new Uint8Array(0) : new Uint8Array(input);
791
+ } else if (ArrayBuffer.isView(input)) {
792
+ // Always decode the underlying bytes for typed-array views rather than
793
+ // reinterpreting element values as separate bytes.
794
+ const sourceBuffer = input.buffer;
795
+ if (sourceBuffer instanceof ArrayBuffer && isDetachedArrayBuffer(sourceBuffer)) {
796
+ bytes = new Uint8Array(0);
797
+ } else {
798
+ bytes = new Uint8Array(sourceBuffer, input.byteOffset, input.byteLength);
799
+ }
800
+ } else {
801
+ throw new TypeError("Input must be an ArrayBuffer or ArrayBufferView");
802
+ }
803
+
804
+ // Combine with pending bytes from previous stream call
805
+ if (this._pendingBytes.length > 0) {
806
+ const combined = new Uint8Array(this._pendingBytes.length + bytes.length);
807
+ combined.set(this._pendingBytes);
808
+ combined.set(bytes, this._pendingBytes.length);
809
+ bytes = combined;
810
+ this._pendingBytes = [];
811
+ }
812
+
813
+ let result: string;
814
+ const enc = this.encoding;
815
+
816
+ if (enc === "utf-8") {
817
+ // Try native decoding for UTF-8 (most common case)
818
+ if (!stream && !hadPendingBytes) {
819
+ const nativeEncoding = getNativeModule('encoding');
820
+ if (nativeEncoding) {
821
+ try {
822
+ result = nativeEncoding.decodeUTF8(bytes, this.fatal);
823
+ // Handle BOM if needed
824
+ if (!this._bomSeen && !this.ignoreBOM && result.charCodeAt(0) === 0xFEFF) {
825
+ result = result.slice(1);
826
+ }
827
+ this._bomSeen = true;
828
+ } catch (e) {
829
+ // Fall through to JS implementation if native fails
830
+ if (this.fatal) {
831
+ if (e && typeof e === "object" && "code" in e) {
832
+ throw e;
833
+ }
834
+ throw createEncodingError(
835
+ e instanceof Error && e.message ? e.message : "Invalid encoded data"
836
+ );
837
+ }
838
+ result = this._decodeUTF8(bytes, stream);
839
+ }
840
+ } else {
841
+ result = this._decodeUTF8(bytes, stream);
842
+ }
843
+ } else {
844
+ result = this._decodeUTF8(bytes, stream);
845
+ }
846
+ } else if (enc === "utf-16le") {
847
+ result = this._decodeUTF16(bytes, false, stream);
848
+ } else if (enc === "utf-16be") {
849
+ result = this._decodeUTF16(bytes, true, stream);
850
+ } else if (enc === "replacement") {
851
+ result = this._decodeReplacement(bytes);
852
+ } else if (enc === "x-user-defined") {
853
+ result = this._decodeXUserDefined(bytes);
854
+ } else if (enc === "windows-1252") {
855
+ result = this._decodeSingleByte(bytes, WINDOWS_1252, true);
856
+ } else if (SINGLE_BYTE_TABLES[enc]) {
857
+ result = this._decodeSingleByte(bytes, SINGLE_BYTE_TABLES[enc]!, false);
858
+ } else {
859
+ if (NativeTextDecoderImpl && NativeTextDecoderImpl !== (TextDecoder as any)) {
860
+ try {
861
+ result = new NativeTextDecoderImpl(enc, {
862
+ fatal: this.fatal,
863
+ ignoreBOM: this.ignoreBOM,
864
+ }).decode(bytes, options);
865
+ } catch (error) {
866
+ if (this.fatal) {
867
+ throw error;
868
+ }
869
+ result = this._decodeUTF8(bytes, stream);
870
+ }
871
+ } else {
872
+ result = this._decodeUTF8(bytes, stream);
873
+ }
874
+ }
875
+
876
+ // Reset state if not streaming
877
+ if (!stream) {
878
+ this._pendingBytes = [];
879
+ this._bomSeen = false;
880
+ }
881
+
882
+ return result;
883
+ }
884
+
885
+ private _decodeSingleByte(bytes: Uint8Array, table: (number | null)[], isWindows1252: boolean): string {
886
+ const result: string[] = [];
887
+ for (let i = 0; i < bytes.length; i++) {
888
+ const byte = bytes[i];
889
+ if (byte <= 0x7F) {
890
+ result.push(String.fromCharCode(byte));
891
+ } else {
892
+ if (isWindows1252) {
893
+ // windows-1252: 0x80-0x9F use the table, 0xA0-0xFF map to Latin-1
894
+ if (byte >= 0x80 && byte <= 0x9F) {
895
+ const cp = table[byte - 0x80];
896
+ if (cp === null) {
897
+ if (this.fatal) {
898
+ throw createEncodingError("Invalid byte in encoding");
899
+ }
900
+ result.push("\ufffd");
901
+ } else {
902
+ result.push(String.fromCharCode(cp));
903
+ }
904
+ } else {
905
+ result.push(String.fromCharCode(byte));
906
+ }
907
+ } else {
908
+ const cp = table[byte - 0x80];
909
+ if (cp === null) {
910
+ if (this.fatal) {
911
+ throw createEncodingError("Invalid byte in encoding");
912
+ }
913
+ result.push("\ufffd");
914
+ } else {
915
+ result.push(String.fromCharCode(cp));
916
+ }
917
+ }
918
+ }
919
+ }
920
+ return result.join("");
921
+ }
922
+
923
+ private _decodeReplacement(bytes: Uint8Array): string {
924
+ // The "replacement" encoding: if input is non-empty, emit one U+FFFD
925
+ // and set error flag (if fatal, throw).
926
+ if (bytes.length === 0) {
927
+ return "";
928
+ }
929
+ if (this.fatal) {
930
+ throw createEncodingError("Replacement encoding always errors on non-empty input");
931
+ }
932
+ return "\ufffd";
933
+ }
934
+
935
+ private _decodeXUserDefined(bytes: Uint8Array): string {
936
+ const result: string[] = [];
937
+ for (let i = 0; i < bytes.length; i++) {
938
+ const byte = bytes[i];
939
+ if (byte <= 0x7F) {
940
+ result.push(String.fromCharCode(byte));
941
+ } else {
942
+ // x-user-defined maps 0x80-0xFF to U+F780-U+F7FF
943
+ result.push(String.fromCharCode(0xF780 + byte - 0x80));
944
+ }
945
+ }
946
+ return result.join("");
947
+ }
948
+
949
+ private _decodeUTF8(bytes: Uint8Array, stream: boolean): string {
950
+ const result: string[] = [];
951
+ let i = 0;
952
+
953
+ // Handle BOM
954
+ if (!this._bomSeen && bytes.length >= 3) {
955
+ if (
956
+ bytes[0] === 0xef &&
957
+ bytes[1] === 0xbb &&
958
+ bytes[2] === 0xbf &&
959
+ !this.ignoreBOM
960
+ ) {
961
+ i = 3;
962
+ }
963
+ this._bomSeen = true;
964
+ }
965
+
966
+ while (i < bytes.length) {
967
+ const byte1 = bytes[i];
968
+ let codePoint: number;
969
+ let bytesNeeded: number;
970
+
971
+ if ((byte1 & 0x80) === 0) {
972
+ // 1-byte sequence (ASCII)
973
+ codePoint = byte1;
974
+ bytesNeeded = 1;
975
+ } else if ((byte1 & 0xe0) === 0xc0 && byte1 >= 0xc2) {
976
+ // 2-byte sequence
977
+ codePoint = byte1 & 0x1f;
978
+ bytesNeeded = 2;
979
+ } else if ((byte1 & 0xf0) === 0xe0) {
980
+ // 3-byte sequence
981
+ codePoint = byte1 & 0x0f;
982
+ bytesNeeded = 3;
983
+ } else if ((byte1 & 0xf8) === 0xf0 && byte1 <= 0xf4) {
984
+ // 4-byte sequence
985
+ codePoint = byte1 & 0x07;
986
+ bytesNeeded = 4;
987
+ } else {
988
+ // Invalid start byte
989
+ if (this.fatal) {
990
+ throw createEncodingError("Invalid UTF-8 byte sequence");
991
+ }
992
+ result.push("\ufffd");
993
+ i++;
994
+ continue;
995
+ }
996
+
997
+ // Check if we have enough bytes
998
+ if (i + bytesNeeded > bytes.length) {
999
+ if (stream) {
1000
+ let consumed = 1;
1001
+ let malformed = false;
1002
+
1003
+ while (i + consumed < bytes.length) {
1004
+ const continuation = bytes[i + consumed];
1005
+ if (!isValidUTF8Continuation(byte1, continuation, consumed)) {
1006
+ malformed = true;
1007
+ break;
1008
+ }
1009
+ consumed++;
1010
+ }
1011
+
1012
+ if (malformed) {
1013
+ if (this.fatal) {
1014
+ throw createEncodingError("Invalid UTF-8 continuation byte");
1015
+ }
1016
+ result.push("\ufffd");
1017
+ i += consumed;
1018
+ continue;
1019
+ }
1020
+
1021
+ // Save a still-valid partial sequence for the next decode call.
1022
+ this._pendingBytes = Array.from(bytes.slice(i));
1023
+ break;
1024
+ } else if (this.fatal) {
1025
+ throw createEncodingError("Incomplete UTF-8 byte sequence");
1026
+ } else {
1027
+ let consumed = 1;
1028
+ while (i + consumed < bytes.length) {
1029
+ const continuation = bytes[i + consumed];
1030
+ if (!isValidUTF8Continuation(byte1, continuation, consumed)) {
1031
+ break;
1032
+ }
1033
+ consumed++;
1034
+ }
1035
+ result.push("\ufffd");
1036
+ if (i + consumed >= bytes.length) {
1037
+ break;
1038
+ }
1039
+ i += consumed;
1040
+ continue;
1041
+ }
1042
+ }
1043
+
1044
+ // Read continuation bytes
1045
+ let valid = true;
1046
+ for (let j = 1; j < bytesNeeded; j++) {
1047
+ const contByte = bytes[i + j];
1048
+ if ((contByte & 0xc0) !== 0x80) {
1049
+ valid = false;
1050
+ break;
1051
+ }
1052
+ codePoint = (codePoint << 6) | (contByte & 0x3f);
1053
+ }
1054
+
1055
+ if (!valid) {
1056
+ if (this.fatal) {
1057
+ throw createEncodingError("Invalid UTF-8 continuation byte");
1058
+ }
1059
+ result.push("\ufffd");
1060
+ i++;
1061
+ continue;
1062
+ }
1063
+
1064
+ // Validate code point
1065
+ if (
1066
+ codePoint > 0x10ffff ||
1067
+ (codePoint >= 0xd800 && codePoint <= 0xdfff) ||
1068
+ (bytesNeeded === 2 && codePoint < 0x80) ||
1069
+ (bytesNeeded === 3 && codePoint < 0x800) ||
1070
+ (bytesNeeded === 4 && codePoint < 0x10000)
1071
+ ) {
1072
+ if (this.fatal) {
1073
+ throw createEncodingError("Invalid UTF-8 code point");
1074
+ }
1075
+ result.push("\ufffd");
1076
+ i++;
1077
+ continue;
1078
+ }
1079
+
1080
+ // Convert code point to string
1081
+ if (codePoint <= 0xffff) {
1082
+ result.push(String.fromCharCode(codePoint));
1083
+ } else {
1084
+ // Convert to surrogate pair
1085
+ const offset = codePoint - 0x10000;
1086
+ result.push(
1087
+ String.fromCharCode(0xd800 + (offset >> 10)),
1088
+ String.fromCharCode(0xdc00 + (offset & 0x3ff))
1089
+ );
1090
+ }
1091
+
1092
+ i += bytesNeeded;
1093
+ }
1094
+
1095
+ return result.join("");
1096
+ }
1097
+
1098
+ private _decodeUTF16(
1099
+ bytes: Uint8Array,
1100
+ bigEndian: boolean,
1101
+ stream: boolean
1102
+ ): string {
1103
+ const result: string[] = [];
1104
+ let i = 0;
1105
+
1106
+ // Handle BOM
1107
+ if (!this._bomSeen && bytes.length >= 2) {
1108
+ if (bytes[0] === 0xfe && bytes[1] === 0xff && !this.ignoreBOM) {
1109
+ bigEndian = true;
1110
+ i = 2;
1111
+ } else if (bytes[0] === 0xff && bytes[1] === 0xfe && !this.ignoreBOM) {
1112
+ bigEndian = false;
1113
+ i = 2;
1114
+ }
1115
+ this._bomSeen = true;
1116
+ }
1117
+
1118
+ while (i < bytes.length) {
1119
+ if (i + 1 >= bytes.length) {
1120
+ if (stream) {
1121
+ this._pendingBytes = Array.from(bytes.slice(i));
1122
+ break;
1123
+ }
1124
+ if (this.fatal) {
1125
+ throw createEncodingError("Invalid UTF-16 byte sequence");
1126
+ }
1127
+ result.push("\ufffd");
1128
+ break;
1129
+ }
1130
+
1131
+ const unit = bigEndian
1132
+ ? (bytes[i] << 8) | bytes[i + 1]
1133
+ : bytes[i] | (bytes[i + 1] << 8);
1134
+
1135
+ // Check for surrogate pairs
1136
+ if (unit >= 0xd800 && unit <= 0xdbff) {
1137
+ // High surrogate
1138
+ if (i + 3 >= bytes.length) {
1139
+ if (stream) {
1140
+ this._pendingBytes = Array.from(bytes.slice(i));
1141
+ break;
1142
+ }
1143
+ if (this.fatal) {
1144
+ throw createEncodingError("Invalid UTF-16 surrogate pair");
1145
+ }
1146
+ result.push("\ufffd");
1147
+ i += 2;
1148
+ continue;
1149
+ }
1150
+
1151
+ const low = bigEndian
1152
+ ? (bytes[i + 2] << 8) | bytes[i + 3]
1153
+ : bytes[i + 2] | (bytes[i + 3] << 8);
1154
+
1155
+ if (low >= 0xdc00 && low <= 0xdfff) {
1156
+ result.push(String.fromCharCode(unit, low));
1157
+ i += 4;
1158
+ continue;
1159
+ }
1160
+
1161
+ // Unpaired high surrogate
1162
+ if (this.fatal) {
1163
+ throw createEncodingError("Invalid UTF-16 surrogate pair");
1164
+ }
1165
+ result.push("\ufffd");
1166
+ } else if (unit >= 0xdc00 && unit <= 0xdfff) {
1167
+ // Unpaired low surrogate
1168
+ if (this.fatal) {
1169
+ throw createEncodingError("Invalid UTF-16 surrogate pair");
1170
+ }
1171
+ result.push("\ufffd");
1172
+ } else {
1173
+ result.push(String.fromCharCode(unit));
1174
+ }
1175
+
1176
+ i += 2;
1177
+ }
1178
+
1179
+ return result.join("");
1180
+ }
1181
+ }