re2js 2.0.1 → 2.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.
- package/README.md +111 -30
- package/build/index.cjs.cjs +1866 -414
- package/build/index.cjs.cjs.map +1 -1
- package/build/index.esm.d.ts +71 -0
- package/build/index.esm.d.ts.map +1 -1
- package/build/index.esm.js +1865 -415
- package/build/index.esm.js.map +1 -1
- package/build/index.umd.js +1866 -414
- package/build/index.umd.js.map +1 -1
- package/package.json +4 -4
package/build/index.umd.js
CHANGED
|
@@ -2,7 +2,7 @@
|
|
|
2
2
|
* re2js
|
|
3
3
|
* RE2JS is the JavaScript port of RE2, a regular expression engine that provides linear time matching
|
|
4
4
|
*
|
|
5
|
-
* @version v2.0
|
|
5
|
+
* @version v2.1.0
|
|
6
6
|
* @author Alexey Vasiliev
|
|
7
7
|
* @homepage https://github.com/le0pard/re2js#readme
|
|
8
8
|
* @repository github:le0pard/re2js
|
|
@@ -60,6 +60,23 @@
|
|
|
60
60
|
/**
|
|
61
61
|
* Various constants and helper for unicode codepoints.
|
|
62
62
|
*/
|
|
63
|
+
const ASCII_SIZE = 128;
|
|
64
|
+
const ASCII_TO_UPPER = new Int32Array(ASCII_SIZE);
|
|
65
|
+
const ASCII_TO_LOWER = new Int32Array(ASCII_SIZE);
|
|
66
|
+
for (let i = 0; i < ASCII_SIZE; i++) {
|
|
67
|
+
if (i >= 97 && i <= 122) {
|
|
68
|
+
// a-z
|
|
69
|
+
ASCII_TO_UPPER[i] = i - 32;
|
|
70
|
+
} else {
|
|
71
|
+
ASCII_TO_UPPER[i] = i;
|
|
72
|
+
}
|
|
73
|
+
if (i >= 65 && i <= 90) {
|
|
74
|
+
// A-Z
|
|
75
|
+
ASCII_TO_LOWER[i] = i + 32;
|
|
76
|
+
} else {
|
|
77
|
+
ASCII_TO_LOWER[i] = i;
|
|
78
|
+
}
|
|
79
|
+
}
|
|
63
80
|
class Codepoint {
|
|
64
81
|
// codePointAt(0)
|
|
65
82
|
static CODES = new Map([['\x07', 7], ['\b', 8], ['\t', 9], ['\n', 10], ['\v', 11], ['\f', 12], ['\r', 13], [' ', 32], ['"', 34], ['$', 36], ['&', 38], ['(', 40], [')', 41], ['*', 42], ['+', 43], ['-', 45], ['.', 46], ['0', 48], ['1', 49], ['2', 50], ['3', 51], ['4', 52], ['5', 53], ['6', 54], ['7', 55], ['8', 56], ['9', 57], [':', 58], ['<', 60], ['>', 62], ['?', 63], ['A', 65], ['B', 66], ['C', 67], ['F', 70], ['P', 80], ['Q', 81], ['U', 85], ['Z', 90], ['[', 91], ['\\', 92], [']', 93], ['^', 94], ['_', 95], ['a', 97], ['b', 98], ['f', 102], ['i', 105], ['m', 109], ['n', 110], ['r', 114], ['s', 115], ['t', 116], ['v', 118], ['x', 120], ['z', 122], ['{', 123], ['|', 124], ['}', 125]]);
|
|
@@ -67,6 +84,7 @@
|
|
|
67
84
|
// convert unicode codepoint to upper case codepoint
|
|
68
85
|
// return same codepoint, if cannot do it (or codepoint not have upper variation)
|
|
69
86
|
static toUpperCase(codepoint) {
|
|
87
|
+
if (codepoint < ASCII_SIZE) return ASCII_TO_UPPER[codepoint];
|
|
70
88
|
const s = String.fromCodePoint(codepoint).toUpperCase();
|
|
71
89
|
if (s.length > 1) {
|
|
72
90
|
return codepoint;
|
|
@@ -81,6 +99,7 @@
|
|
|
81
99
|
// convert unicode codepoint to lower case codepoint
|
|
82
100
|
// return same codepoint, if cannot do it (or codepoint not have lower variation)
|
|
83
101
|
static toLowerCase(codepoint) {
|
|
102
|
+
if (codepoint < ASCII_SIZE) return ASCII_TO_LOWER[codepoint];
|
|
84
103
|
const s = String.fromCodePoint(codepoint).toLowerCase();
|
|
85
104
|
if (s.length > 1) {
|
|
86
105
|
return codepoint;
|
|
@@ -94,9 +113,10 @@
|
|
|
94
113
|
}
|
|
95
114
|
|
|
96
115
|
class UnicodeRangeTable {
|
|
97
|
-
|
|
98
|
-
constructor(data) {
|
|
116
|
+
constructor(data, isStride1 = false) {
|
|
99
117
|
this.data = data; // A Uint32Array
|
|
118
|
+
this.isStride1 = isStride1;
|
|
119
|
+
this.SIZE = isStride1 ? 2 : 3;
|
|
100
120
|
}
|
|
101
121
|
|
|
102
122
|
// High-performance getters that do NOT allocate memory
|
|
@@ -107,14 +127,11 @@
|
|
|
107
127
|
return this.data[index * this.SIZE + 1];
|
|
108
128
|
}
|
|
109
129
|
getStride(index) {
|
|
110
|
-
return this.data[index * this.SIZE + 2];
|
|
130
|
+
return this.isStride1 ? 1 : this.data[index * this.SIZE + 2];
|
|
111
131
|
}
|
|
112
|
-
|
|
113
|
-
// Convenience getter (slower, for debugging or non-critical paths)
|
|
114
132
|
get(index) {
|
|
115
133
|
const i = index * this.SIZE;
|
|
116
|
-
|
|
117
|
-
return [this.data[i], this.data[i + 1], this.data[i + 2]];
|
|
134
|
+
return [this.data[i], this.data[i + 1], this.getStride(index)];
|
|
118
135
|
}
|
|
119
136
|
get length() {
|
|
120
137
|
return this.data.length / this.SIZE;
|
|
@@ -124,229 +141,317 @@
|
|
|
124
141
|
// GENERATED BY tools/scripts/genUnicodeTable.js; DO NOT EDIT.
|
|
125
142
|
// yarn node ./tools/scripts/genUnicodeTable.js > src/UnicodeTables.js
|
|
126
143
|
|
|
144
|
+
const B64_MAP = new Uint8Array(256);
|
|
145
|
+
for (let i = 0, b = 'ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+-'; i < 64; i++) {
|
|
146
|
+
B64_MAP[b.charCodeAt(i)] = i;
|
|
147
|
+
}
|
|
148
|
+
const decodeVLQ = str => {
|
|
149
|
+
const res = [];
|
|
150
|
+
let value = 0,
|
|
151
|
+
shift = 0;
|
|
152
|
+
for (let i = 0; i < str.length; i++) {
|
|
153
|
+
let digit = B64_MAP[str.charCodeAt(i)];
|
|
154
|
+
value |= (digit & 0x1f) << shift;
|
|
155
|
+
if ((digit & 0x20) === 0) {
|
|
156
|
+
res.push(value);
|
|
157
|
+
value = 0;
|
|
158
|
+
shift = 0;
|
|
159
|
+
} else {
|
|
160
|
+
shift += 5;
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
return res;
|
|
164
|
+
};
|
|
165
|
+
const decodeRanges = (str, isStride1) => {
|
|
166
|
+
const res = decodeVLQ(str);
|
|
167
|
+
const numRanges = isStride1 ? res.length / 2 : res.length / 3;
|
|
168
|
+
const out = new Uint32Array(numRanges * 3);
|
|
169
|
+
let current = 0,
|
|
170
|
+
resIdx = 0;
|
|
171
|
+
for (let i = 0; i < numRanges; i++) {
|
|
172
|
+
current += res[resIdx++];
|
|
173
|
+
out[i * 3] = current;
|
|
174
|
+
current += res[resIdx++];
|
|
175
|
+
out[i * 3 + 1] = current;
|
|
176
|
+
out[i * 3 + 2] = isStride1 ? 1 : res[resIdx++];
|
|
177
|
+
}
|
|
178
|
+
return out;
|
|
179
|
+
};
|
|
180
|
+
const decodeOrbit = str => {
|
|
181
|
+
const res = decodeVLQ(str);
|
|
182
|
+
const map = new Map();
|
|
183
|
+
let currentKey = 0;
|
|
184
|
+
for (let i = 0; i < res.length; i += 2) {
|
|
185
|
+
currentKey += res[i];
|
|
186
|
+
map.set(currentKey, res[i + 1]);
|
|
187
|
+
}
|
|
188
|
+
return map;
|
|
189
|
+
};
|
|
190
|
+
class LazyMap {
|
|
191
|
+
constructor(initializer) {
|
|
192
|
+
this.initializer = initializer;
|
|
193
|
+
this.cache = new Map();
|
|
194
|
+
}
|
|
195
|
+
has(key) {
|
|
196
|
+
return key in this.initializer;
|
|
197
|
+
}
|
|
198
|
+
get(key) {
|
|
199
|
+
if (this.cache.has(key)) return this.cache.get(key);
|
|
200
|
+
const fn = this.initializer[key];
|
|
201
|
+
const val = fn ? fn() : null;
|
|
202
|
+
this.cache.set(key, val);
|
|
203
|
+
return val;
|
|
204
|
+
}
|
|
205
|
+
}
|
|
127
206
|
class UnicodeTables {
|
|
128
|
-
static CASE_ORBIT = new Map([[75, 107], [107, 8490], [8490, 75], [83, 115], [115, 383], [383, 83], [181, 924], [924, 956], [956, 181], [197, 229], [229, 8491], [8491, 197], [452, 453], [453, 454], [454, 452], [455, 456], [456, 457], [457, 455], [458, 459], [459, 460], [460, 458], [497, 498], [498, 499], [499, 497], [837, 921], [921, 953], [953, 8126], [8126, 837], [914, 946], [946, 976], [976, 914], [917, 949], [949, 1013], [1013, 917], [920, 952], [952, 977], [977, 1012], [1012, 920], [922, 954], [954, 1008], [1008, 922], [928, 960], [960, 982], [982, 928], [929, 961], [961, 1009], [1009, 929], [931, 962], [962, 963], [963, 931], [934, 966], [966, 981], [981, 934], [937, 969], [969, 8486], [8486, 937], [1042, 1074], [1074, 7296], [7296, 1042], [1044, 1076], [1076, 7297], [7297, 1044], [1054, 1086], [1086, 7298], [7298, 1054], [1057, 1089], [1089, 7299], [7299, 1057], [1058, 1090], [1090, 7300], [7300, 7301], [7301, 1058], [1066, 1098], [1098, 7302], [7302, 1066], [1122, 1123], [1123, 7303], [7303, 1122], [7304, 42570], [42570, 42571], [42571, 7304], [7776, 7777], [7777, 7835], [7835, 7776], [223, 7838], [7838, 223], [8064, 8072], [8072, 8064], [8065, 8073], [8073, 8065], [8066, 8074], [8074, 8066], [8067, 8075], [8075, 8067], [8068, 8076], [8076, 8068], [8069, 8077], [8077, 8069], [8070, 8078], [8078, 8070], [8071, 8079], [8079, 8071], [8080, 8088], [8088, 8080], [8081, 8089], [8089, 8081], [8082, 8090], [8090, 8082], [8083, 8091], [8091, 8083], [8084, 8092], [8092, 8084], [8085, 8093], [8093, 8085], [8086, 8094], [8094, 8086], [8087, 8095], [8095, 8087], [8096, 8104], [8104, 8096], [8097, 8105], [8105, 8097], [8098, 8106], [8106, 8098], [8099, 8107], [8107, 8099], [8100, 8108], [8108, 8100], [8101, 8109], [8109, 8101], [8102, 8110], [8110, 8102], [8103, 8111], [8111, 8103], [8115, 8124], [8124, 8115], [8131, 8140], [8140, 8131], [912, 8147], [8147, 912], [944, 8163], [8163, 944], [8179, 8188], [8188, 8179], [64261, 64262], [64262, 64261], [66560, 66600], [66600, 66560], [66561, 66601], [66601, 66561], [66562, 66602], [66602, 66562], [66563, 66603], [66603, 66563], [66564, 66604], [66604, 66564], [66565, 66605], [66605, 66565], [66566, 66606], [66606, 66566], [66567, 66607], [66607, 66567], [66568, 66608], [66608, 66568], [66569, 66609], [66609, 66569], [66570, 66610], [66610, 66570], [66571, 66611], [66611, 66571], [66572, 66612], [66612, 66572], [66573, 66613], [66613, 66573], [66574, 66614], [66614, 66574], [66575, 66615], [66615, 66575], [66576, 66616], [66616, 66576], [66577, 66617], [66617, 66577], [66578, 66618], [66618, 66578], [66579, 66619], [66619, 66579], [66580, 66620], [66620, 66580], [66581, 66621], [66621, 66581], [66582, 66622], [66622, 66582], [66583, 66623], [66623, 66583], [66584, 66624], [66624, 66584], [66585, 66625], [66625, 66585], [66586, 66626], [66626, 66586], [66587, 66627], [66627, 66587], [66588, 66628], [66628, 66588], [66589, 66629], [66629, 66589], [66590, 66630], [66630, 66590], [66591, 66631], [66631, 66591], [66592, 66632], [66632, 66592], [66593, 66633], [66633, 66593], [66594, 66634], [66634, 66594], [66595, 66635], [66635, 66595], [66596, 66636], [66636, 66596], [66597, 66637], [66637, 66597], [66598, 66638], [66638, 66598], [66599, 66639], [66639, 66599], [66736, 66776], [66776, 66736], [66737, 66777], [66777, 66737], [66738, 66778], [66778, 66738], [66739, 66779], [66779, 66739], [66740, 66780], [66780, 66740], [66741, 66781], [66781, 66741], [66742, 66782], [66782, 66742], [66743, 66783], [66783, 66743], [66744, 66784], [66784, 66744], [66745, 66785], [66785, 66745], [66746, 66786], [66786, 66746], [66747, 66787], [66787, 66747], [66748, 66788], [66788, 66748], [66749, 66789], [66789, 66749], [66750, 66790], [66790, 66750], [66751, 66791], [66791, 66751], [66752, 66792], [66792, 66752], [66753, 66793], [66793, 66753], [66754, 66794], [66794, 66754], [66755, 66795], [66795, 66755], [66756, 66796], [66796, 66756], [66757, 66797], [66797, 66757], [66758, 66798], [66798, 66758], [66759, 66799], [66799, 66759], [66760, 66800], [66800, 66760], [66761, 66801], [66801, 66761], [66762, 66802], [66802, 66762], [66763, 66803], [66803, 66763], [66764, 66804], [66804, 66764], [66765, 66805], [66805, 66765], [66766, 66806], [66806, 66766], [66767, 66807], [66807, 66767], [66768, 66808], [66808, 66768], [66769, 66809], [66809, 66769], [66770, 66810], [66810, 66770], [66771, 66811], [66811, 66771], [66928, 66967], [66967, 66928], [66929, 66968], [66968, 66929], [66930, 66969], [66969, 66930], [66931, 66970], [66970, 66931], [66932, 66971], [66971, 66932], [66933, 66972], [66972, 66933], [66934, 66973], [66973, 66934], [66935, 66974], [66974, 66935], [66936, 66975], [66975, 66936], [66937, 66976], [66976, 66937], [66938, 66977], [66977, 66938], [66940, 66979], [66979, 66940], [66941, 66980], [66980, 66941], [66942, 66981], [66981, 66942], [66943, 66982], [66982, 66943], [66944, 66983], [66983, 66944], [66945, 66984], [66984, 66945], [66946, 66985], [66985, 66946], [66947, 66986], [66986, 66947], [66948, 66987], [66987, 66948], [66949, 66988], [66988, 66949], [66950, 66989], [66989, 66950], [66951, 66990], [66990, 66951], [66952, 66991], [66991, 66952], [66953, 66992], [66992, 66953], [66954, 66993], [66993, 66954], [66956, 66995], [66995, 66956], [66957, 66996], [66996, 66957], [66958, 66997], [66997, 66958], [66959, 66998], [66998, 66959], [66960, 66999], [66999, 66960], [66961, 67000], [67000, 66961], [66962, 67001], [67001, 66962], [66964, 67003], [67003, 66964], [66965, 67004], [67004, 66965], [68736, 68800], [68800, 68736], [68737, 68801], [68801, 68737], [68738, 68802], [68802, 68738], [68739, 68803], [68803, 68739], [68740, 68804], [68804, 68740], [68741, 68805], [68805, 68741], [68742, 68806], [68806, 68742], [68743, 68807], [68807, 68743], [68744, 68808], [68808, 68744], [68745, 68809], [68809, 68745], [68746, 68810], [68810, 68746], [68747, 68811], [68811, 68747], [68748, 68812], [68812, 68748], [68749, 68813], [68813, 68749], [68750, 68814], [68814, 68750], [68751, 68815], [68815, 68751], [68752, 68816], [68816, 68752], [68753, 68817], [68817, 68753], [68754, 68818], [68818, 68754], [68755, 68819], [68819, 68755], [68756, 68820], [68820, 68756], [68757, 68821], [68821, 68757], [68758, 68822], [68822, 68758], [68759, 68823], [68823, 68759], [68760, 68824], [68824, 68760], [68761, 68825], [68825, 68761], [68762, 68826], [68826, 68762], [68763, 68827], [68827, 68763], [68764, 68828], [68828, 68764], [68765, 68829], [68829, 68765], [68766, 68830], [68830, 68766], [68767, 68831], [68831, 68767], [68768, 68832], [68832, 68768], [68769, 68833], [68833, 68769], [68770, 68834], [68834, 68770], [68771, 68835], [68835, 68771], [68772, 68836], [68836, 68772], [68773, 68837], [68837, 68773], [68774, 68838], [68838, 68774], [68775, 68839], [68839, 68775], [68776, 68840], [68840, 68776], [68777, 68841], [68841, 68777], [68778, 68842], [68842, 68778], [68779, 68843], [68843, 68779], [68780, 68844], [68844, 68780], [68781, 68845], [68845, 68781], [68782, 68846], [68846, 68782], [68783, 68847], [68847, 68783], [68784, 68848], [68848, 68784], [68785, 68849], [68849, 68785], [68786, 68850], [68850, 68786], [68944, 68976], [68976, 68944], [68945, 68977], [68977, 68945], [68946, 68978], [68978, 68946], [68947, 68979], [68979, 68947], [68948, 68980], [68980, 68948], [68949, 68981], [68981, 68949], [68950, 68982], [68982, 68950], [68951, 68983], [68983, 68951], [68952, 68984], [68984, 68952], [68953, 68985], [68985, 68953], [68954, 68986], [68986, 68954], [68955, 68987], [68987, 68955], [68956, 68988], [68988, 68956], [68957, 68989], [68989, 68957], [68958, 68990], [68990, 68958], [68959, 68991], [68991, 68959], [68960, 68992], [68992, 68960], [68961, 68993], [68993, 68961], [68962, 68994], [68994, 68962], [68963, 68995], [68995, 68963], [68964, 68996], [68996, 68964], [68965, 68997], [68997, 68965], [71840, 71872], [71872, 71840], [71841, 71873], [71873, 71841], [71842, 71874], [71874, 71842], [71843, 71875], [71875, 71843], [71844, 71876], [71876, 71844], [71845, 71877], [71877, 71845], [71846, 71878], [71878, 71846], [71847, 71879], [71879, 71847], [71848, 71880], [71880, 71848], [71849, 71881], [71881, 71849], [71850, 71882], [71882, 71850], [71851, 71883], [71883, 71851], [71852, 71884], [71884, 71852], [71853, 71885], [71885, 71853], [71854, 71886], [71886, 71854], [71855, 71887], [71887, 71855], [71856, 71888], [71888, 71856], [71857, 71889], [71889, 71857], [71858, 71890], [71890, 71858], [71859, 71891], [71891, 71859], [71860, 71892], [71892, 71860], [71861, 71893], [71893, 71861], [71862, 71894], [71894, 71862], [71863, 71895], [71895, 71863], [71864, 71896], [71896, 71864], [71865, 71897], [71897, 71865], [71866, 71898], [71898, 71866], [71867, 71899], [71899, 71867], [71868, 71900], [71900, 71868], [71869, 71901], [71901, 71869], [71870, 71902], [71902, 71870], [71871, 71903], [71903, 71871], [93760, 93792], [93792, 93760], [93761, 93793], [93793, 93761], [93762, 93794], [93794, 93762], [93763, 93795], [93795, 93763], [93764, 93796], [93796, 93764], [93765, 93797], [93797, 93765], [93766, 93798], [93798, 93766], [93767, 93799], [93799, 93767], [93768, 93800], [93800, 93768], [93769, 93801], [93801, 93769], [93770, 93802], [93802, 93770], [93771, 93803], [93803, 93771], [93772, 93804], [93804, 93772], [93773, 93805], [93805, 93773], [93774, 93806], [93806, 93774], [93775, 93807], [93807, 93775], [93776, 93808], [93808, 93776], [93777, 93809], [93809, 93777], [93778, 93810], [93810, 93778], [93779, 93811], [93811, 93779], [93780, 93812], [93812, 93780], [93781, 93813], [93813, 93781], [93782, 93814], [93814, 93782], [93783, 93815], [93815, 93783], [93784, 93816], [93816, 93784], [93785, 93817], [93817, 93785], [93786, 93818], [93818, 93786], [93787, 93819], [93819, 93787], [93788, 93820], [93820, 93788], [93789, 93821], [93821, 93789], [93790, 93822], [93822, 93790], [93791, 93823], [93823, 93791], [125184, 125218], [125218, 125184], [125185, 125219], [125219, 125185], [125186, 125220], [125220, 125186], [125187, 125221], [125221, 125187], [125188, 125222], [125222, 125188], [125189, 125223], [125223, 125189], [125190, 125224], [125224, 125190], [125191, 125225], [125225, 125191], [125192, 125226], [125226, 125192], [125193, 125227], [125227, 125193], [125194, 125228], [125228, 125194], [125195, 125229], [125229, 125195], [125196, 125230], [125230, 125196], [125197, 125231], [125231, 125197], [125198, 125232], [125232, 125198], [125199, 125233], [125233, 125199], [125200, 125234], [125234, 125200], [125201, 125235], [125235, 125201], [125202, 125236], [125236, 125202], [125203, 125237], [125237, 125203], [125204, 125238], [125238, 125204], [125205, 125239], [125239, 125205], [125206, 125240], [125240, 125206], [125207, 125241], [125241, 125207], [125208, 125242], [125242, 125208], [125209, 125243], [125243, 125209], [125210, 125244], [125244, 125210], [125211, 125245], [125245, 125211], [125212, 125246], [125246, 125212], [125213, 125247], [125247, 125213], [125214, 125248], [125248, 125214], [125215, 125249], [125249, 125215], [125216, 125250], [125250, 125216], [125217, 125251], [125251, 125217]]);
|
|
129
|
-
static C = new UnicodeRangeTable(new Uint32Array([0, 31, 1, 127, 159, 1, 173, 888, 715, 889, 896, 7, 897, 899, 1, 907, 909, 2, 930, 1328, 398, 1367, 1368, 1, 1419, 1420, 1, 1424, 1480, 56, 1481, 1487, 1, 1515, 1518, 1, 1525, 1541, 1, 1564, 1757, 193, 1806, 1807, 1, 1867, 1868, 1, 1970, 1983, 1, 2043, 2044, 1, 2094, 2095, 1, 2111, 2140, 29, 2141, 2143, 2, 2155, 2159, 1, 2191, 2198, 1, 2274, 2436, 162, 2445, 2446, 1, 2449, 2450, 1, 2473, 2481, 8, 2483, 2485, 1, 2490, 2491, 1, 2501, 2502, 1, 2505, 2506, 1, 2511, 2518, 1, 2520, 2523, 1, 2526, 2532, 6, 2533, 2559, 26, 2560, 2564, 4, 2571, 2574, 1, 2577, 2578, 1, 2601, 2609, 8, 2612, 2618, 3, 2619, 2621, 2, 2627, 2630, 1, 2633, 2634, 1, 2638, 2640, 1, 2642, 2648, 1, 2653, 2655, 2, 2656, 2661, 1, 2679, 2688, 1, 2692, 2702, 10, 2706, 2729, 23, 2737, 2740, 3, 2746, 2747, 1, 2758, 2766, 4, 2767, 2769, 2, 2770, 2783, 1, 2788, 2789, 1, 2802, 2808, 1, 2816, 2820, 4, 2829, 2830, 1, 2833, 2834, 1, 2857, 2865, 8, 2868, 2874, 6, 2875, 2885, 10, 2886, 2889, 3, 2890, 2894, 4, 2895, 2900, 1, 2904, 2907, 1, 2910, 2916, 6, 2917, 2936, 19, 2937, 2945, 1, 2948, 2955, 7, 2956, 2957, 1, 2961, 2966, 5, 2967, 2968, 1, 2971, 2973, 2, 2976, 2978, 1, 2981, 2983, 1, 2987, 2989, 1, 3002, 3005, 1, 3011, 3013, 1, 3017, 3022, 5, 3023, 3025, 2, 3026, 3030, 1, 3032, 3045, 1, 3067, 3071, 1, 3085, 3089, 4, 3113, 3130, 17, 3131, 3141, 10, 3145, 3150, 5, 3151, 3156, 1, 3159, 3163, 4, 3164, 3166, 2, 3167, 3172, 5, 3173, 3184, 11, 3185, 3190, 1, 3213, 3217, 4, 3241, 3252, 11, 3258, 3259, 1, 3269, 3273, 4, 3278, 3284, 1, 3287, 3292, 1, 3295, 3300, 5, 3301, 3312, 11, 3316, 3327, 1, 3341, 3345, 4, 3397, 3401, 4, 3408, 3411, 1, 3428, 3429, 1, 3456, 3460, 4, 3479, 3481, 1, 3506, 3516, 10, 3518, 3519, 1, 3527, 3529, 1, 3531, 3534, 1, 3541, 3543, 2, 3552, 3557, 1, 3568, 3569, 1, 3573, 3584, 1, 3643, 3646, 1, 3676, 3712, 1, 3715, 3717, 2, 3723, 3748, 25, 3750, 3774, 24, 3775, 3781, 6, 3783, 3791, 8, 3802, 3803, 1, 3808, 3839, 1, 3912, 3949, 37, 3950, 3952, 1, 3992, 4029, 37, 4045, 4059, 14, 4060, 4095, 1, 4294, 4296, 2, 4297, 4300, 1, 4302, 4303, 1, 4681, 4686, 5, 4687, 4695, 8, 4697, 4702, 5, 4703, 4745, 42, 4750, 4751, 1, 4785, 4790, 5, 4791, 4799, 8, 4801, 4806, 5, 4807, 4823, 16, 4881, 4886, 5, 4887, 4955, 68, 4956, 4989, 33, 4990, 4991, 1, 5018, 5023, 1, 5110, 5111, 1, 5118, 5119, 1, 5789, 5791, 1, 5881, 5887, 1, 5910, 5918, 1, 5943, 5951, 1, 5972, 5983, 1, 5997, 6001, 4, 6004, 6015, 1, 6110, 6111, 1, 6122, 6127, 1, 6138, 6143, 1, 6158, 6170, 12, 6171, 6175, 1, 6265, 6271, 1, 6315, 6319, 1, 6390, 6399, 1, 6431, 6444, 13, 6445, 6447, 1, 6460, 6463, 1, 6465, 6467, 1, 6510, 6511, 1, 6517, 6527, 1, 6572, 6575, 1, 6602, 6607, 1, 6619, 6621, 1, 6684, 6685, 1, 6751, 6781, 30, 6782, 6794, 12, 6795, 6799, 1, 6810, 6815, 1, 6830, 6831, 1, 6863, 6911, 1, 6989, 7156, 167, 7157, 7163, 1, 7224, 7226, 1, 7242, 7244, 1, 7307, 7311, 1, 7355, 7356, 1, 7368, 7375, 1, 7419, 7423, 1, 7958, 7959, 1, 7966, 7967, 1, 8006, 8007, 1, 8014, 8015, 1, 8024, 8030, 2, 8062, 8063, 1, 8117, 8133, 16, 8148, 8149, 1, 8156, 8176, 20, 8177, 8181, 4, 8191, 8203, 12, 8204, 8207, 1, 8234, 8238, 1, 8288, 8303, 1, 8306, 8307, 1, 8335, 8349, 14, 8350, 8351, 1, 8385, 8399, 1, 8433, 8447, 1, 8588, 8591, 1, 9258, 9279, 1, 9291, 9311, 1, 11124, 11125, 1, 11158, 11508, 350, 11509, 11512, 1, 11558, 11560, 2, 11561, 11564, 1, 11566, 11567, 1, 11624, 11630, 1, 11633, 11646, 1, 11671, 11679, 1, 11687, 11743, 8, 11870, 11903, 1, 11930, 12020, 90, 12021, 12031, 1, 12246, 12271, 1, 12352, 12439, 87, 12440, 12544, 104, 12545, 12548, 1, 12592, 12687, 95, 12774, 12782, 1, 12831, 42125, 29294, 42126, 42127, 1, 42183, 42191, 1, 42540, 42559, 1, 42744, 42751, 1, 42958, 42959, 1, 42962, 42964, 2, 42973, 42993, 1, 43053, 43055, 1, 43066, 43071, 1, 43128, 43135, 1, 43206, 43213, 1, 43226, 43231, 1, 43348, 43358, 1, 43389, 43391, 1, 43470, 43482, 12, 43483, 43485, 1, 43519, 43575, 56, 43576, 43583, 1, 43598, 43599, 1, 43610, 43611, 1, 43715, 43738, 1, 43767, 43776, 1, 43783, 43784, 1, 43791, 43792, 1, 43799, 43807, 1, 43815, 43823, 8, 43884, 43887, 1, 44014, 44015, 1, 44026, 44031, 1, 55204, 55215, 1, 55239, 55242, 1, 55292, 63743, 1, 64110, 64111, 1, 64218, 64255, 1, 64263, 64274, 1, 64280, 64284, 1, 64311, 64317, 6, 64319, 64325, 3, 64451, 64466, 1, 64912, 64913, 1, 64968, 64974, 1, 64976, 65007, 1, 65050, 65055, 1, 65107, 65127, 20, 65132, 65135, 1, 65141, 65277, 136, 65278, 65280, 1, 65471, 65473, 1, 65480, 65481, 1, 65488, 65489, 1, 65496, 65497, 1, 65501, 65503, 1, 65511, 65519, 8, 65520, 65531, 1, 65534, 65535, 1, 65548, 65575, 27, 65595, 65598, 3, 65614, 65615, 1, 65630, 65663, 1, 65787, 65791, 1, 65795, 65798, 1, 65844, 65846, 1, 65935, 65949, 14, 65950, 65951, 1, 65953, 65999, 1, 66046, 66175, 1, 66205, 66207, 1, 66257, 66271, 1, 66300, 66303, 1, 66340, 66348, 1, 66379, 66383, 1, 66427, 66431, 1, 66462, 66500, 38, 66501, 66503, 1, 66518, 66559, 1, 66718, 66719, 1, 66730, 66735, 1, 66772, 66775, 1, 66812, 66815, 1, 66856, 66863, 1, 66916, 66926, 1, 66939, 66955, 16, 66963, 66966, 3, 66978, 66994, 16, 67002, 67005, 3, 67006, 67007, 1, 67060, 67071, 1, 67383, 67391, 1, 67414, 67423, 1, 67432, 67455, 1, 67462, 67505, 43, 67515, 67583, 1, 67590, 67591, 1, 67593, 67638, 45, 67641, 67643, 1, 67645, 67646, 1, 67670, 67743, 73, 67744, 67750, 1, 67760, 67807, 1, 67827, 67830, 3, 67831, 67834, 1, 67868, 67870, 1, 67898, 67902, 1, 67904, 67967, 1, 68024, 68027, 1, 68048, 68049, 1, 68100, 68103, 3, 68104, 68107, 1, 68116, 68120, 4, 68150, 68151, 1, 68155, 68158, 1, 68169, 68175, 1, 68185, 68191, 1, 68256, 68287, 1, 68327, 68330, 1, 68343, 68351, 1, 68406, 68408, 1, 68438, 68439, 1, 68467, 68471, 1, 68498, 68504, 1, 68509, 68520, 1, 68528, 68607, 1, 68681, 68735, 1, 68787, 68799, 1, 68851, 68857, 1, 68904, 68911, 1, 68922, 68927, 1, 68966, 68968, 1, 68998, 69005, 1, 69008, 69215, 1, 69247, 69290, 43, 69294, 69295, 1, 69298, 69313, 1, 69317, 69371, 1, 69416, 69423, 1, 69466, 69487, 1, 69514, 69551, 1, 69580, 69599, 1, 69623, 69631, 1, 69710, 69713, 1, 69750, 69758, 1, 69821, 69827, 6, 69828, 69839, 1, 69865, 69871, 1, 69882, 69887, 1, 69941, 69960, 19, 69961, 69967, 1, 70007, 70015, 1, 70112, 70133, 21, 70134, 70143, 1, 70162, 70210, 48, 70211, 70271, 1, 70279, 70281, 2, 70286, 70302, 16, 70314, 70319, 1, 70379, 70383, 1, 70394, 70399, 1, 70404, 70413, 9, 70414, 70417, 3, 70418, 70441, 23, 70449, 70452, 3, 70458, 70469, 11, 70470, 70473, 3, 70474, 70478, 4, 70479, 70481, 2, 70482, 70486, 1, 70488, 70492, 1, 70500, 70501, 1, 70509, 70511, 1, 70517, 70527, 1, 70538, 70540, 2, 70541, 70543, 2, 70582, 70593, 11, 70595, 70596, 1, 70598, 70603, 5, 70614, 70617, 3, 70618, 70624, 1, 70627, 70655, 1, 70748, 70754, 6, 70755, 70783, 1, 70856, 70863, 1, 70874, 71039, 1, 71094, 71095, 1, 71134, 71167, 1, 71237, 71247, 1, 71258, 71263, 1, 71277, 71295, 1, 71354, 71359, 1, 71370, 71375, 1, 71396, 71423, 1, 71451, 71452, 1, 71468, 71471, 1, 71495, 71679, 1, 71740, 71839, 1, 71923, 71934, 1, 71943, 71944, 1, 71946, 71947, 1, 71956, 71959, 3, 71990, 71993, 3, 71994, 72007, 13, 72008, 72015, 1, 72026, 72095, 1, 72104, 72105, 1, 72152, 72153, 1, 72165, 72191, 1, 72264, 72271, 1, 72355, 72367, 1, 72441, 72447, 1, 72458, 72639, 1, 72674, 72687, 1, 72698, 72703, 1, 72713, 72759, 46, 72774, 72783, 1, 72813, 72815, 1, 72848, 72849, 1, 72872, 72887, 15, 72888, 72959, 1, 72967, 72970, 3, 73015, 73017, 1, 73019, 73022, 3, 73032, 73039, 1, 73050, 73055, 1, 73062, 73065, 3, 73103, 73106, 3, 73113, 73119, 1, 73130, 73439, 1, 73465, 73471, 1, 73489, 73531, 42, 73532, 73533, 1, 73563, 73647, 1, 73649, 73663, 1, 73714, 73726, 1, 74650, 74751, 1, 74863, 74869, 6, 74870, 74879, 1, 75076, 77711, 1, 77811, 77823, 1, 78896, 78911, 1, 78934, 78943, 1, 82939, 82943, 1, 83527, 90367, 1, 90426, 92159, 1, 92729, 92735, 1, 92767, 92778, 11, 92779, 92781, 1, 92863, 92874, 11, 92875, 92879, 1, 92910, 92911, 1, 92918, 92927, 1, 92998, 93007, 1, 93018, 93026, 8, 93048, 93052, 1, 93072, 93503, 1, 93562, 93759, 1, 93851, 93951, 1, 94027, 94030, 1, 94088, 94094, 1, 94112, 94175, 1, 94181, 94191, 1, 94194, 94207, 1, 100344, 100351, 1, 101590, 101630, 1, 101641, 110575, 1, 110580, 110588, 8, 110591, 110883, 292, 110884, 110897, 1, 110899, 110927, 1, 110931, 110932, 1, 110934, 110947, 1, 110952, 110959, 1, 111356, 113663, 1, 113771, 113775, 1, 113789, 113791, 1, 113801, 113807, 1, 113818, 113819, 1, 113824, 117759, 1, 118010, 118015, 1, 118452, 118527, 1, 118574, 118575, 1, 118599, 118607, 1, 118724, 118783, 1, 119030, 119039, 1, 119079, 119080, 1, 119155, 119162, 1, 119275, 119295, 1, 119366, 119487, 1, 119508, 119519, 1, 119540, 119551, 1, 119639, 119647, 1, 119673, 119807, 1, 119893, 119965, 72, 119968, 119969, 1, 119971, 119972, 1, 119975, 119976, 1, 119981, 119994, 13, 119996, 120004, 8, 120070, 120075, 5, 120076, 120085, 9, 120093, 120122, 29, 120127, 120133, 6, 120135, 120137, 1, 120145, 120486, 341, 120487, 120780, 293, 120781, 121484, 703, 121485, 121498, 1, 121504, 121520, 16, 121521, 122623, 1, 122655, 122660, 1, 122667, 122879, 1, 122887, 122905, 18, 122906, 122914, 8, 122917, 122923, 6, 122924, 122927, 1, 122990, 123022, 1, 123024, 123135, 1, 123181, 123183, 1, 123198, 123199, 1, 123210, 123213, 1, 123216, 123535, 1, 123567, 123583, 1, 123642, 123646, 1, 123648, 124111, 1, 124154, 124367, 1, 124411, 124414, 1, 124416, 124895, 1, 124903, 124908, 5, 124911, 124927, 16, 125125, 125126, 1, 125143, 125183, 1, 125260, 125263, 1, 125274, 125277, 1, 125280, 126064, 1, 126133, 126208, 1, 126270, 126463, 1, 126468, 126496, 28, 126499, 126501, 2, 126502, 126504, 2, 126515, 126520, 5, 126522, 126524, 2, 126525, 126529, 1, 126531, 126534, 1, 126536, 126540, 2, 126544, 126547, 3, 126549, 126550, 1, 126552, 126560, 2, 126563, 126565, 2, 126566, 126571, 5, 126579, 126589, 5, 126591, 126602, 11, 126620, 126624, 1, 126628, 126634, 6, 126652, 126703, 1, 126706, 126975, 1, 127020, 127023, 1, 127124, 127135, 1, 127151, 127152, 1, 127168, 127184, 16, 127222, 127231, 1, 127406, 127461, 1, 127491, 127503, 1, 127548, 127551, 1, 127561, 127567, 1, 127570, 127583, 1, 127590, 127743, 1, 128728, 128731, 1, 128749, 128751, 1, 128765, 128767, 1, 128887, 128890, 1, 128986, 128991, 1, 129004, 129007, 1, 129009, 129023, 1, 129036, 129039, 1, 129096, 129103, 1, 129114, 129119, 1, 129160, 129167, 1, 129198, 129199, 1, 129212, 129215, 1, 129218, 129279, 1, 129620, 129631, 1, 129646, 129647, 1, 129661, 129663, 1, 129674, 129678, 1, 129735, 129741, 1, 129757, 129758, 1, 129770, 129775, 1, 129785, 129791, 1, 129939, 130042, 103, 130043, 131071, 1, 173792, 173823, 1, 177978, 177983, 1, 178206, 178207, 1, 183970, 183983, 1, 191457, 191471, 1, 192094, 194559, 1, 195102, 196607, 1, 201547, 201551, 1, 205744, 917759, 1, 918000, 1114111, 1]));
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
133
|
-
|
|
134
|
-
static L = new UnicodeRangeTable(new Uint32Array([65, 90, 1, 97, 122, 1, 170, 181, 11, 186, 192, 6, 193, 214, 1, 216, 246, 1, 248, 705, 1, 710, 721, 1, 736, 740, 1, 748, 750, 2, 880, 884, 1, 886, 887, 1, 890, 893, 1, 895, 902, 7, 904, 906, 1, 908, 910, 2, 911, 929, 1, 931, 1013, 1, 1015, 1153, 1, 1162, 1327, 1, 1329, 1366, 1, 1369, 1376, 7, 1377, 1416, 1, 1488, 1514, 1, 1519, 1522, 1, 1568, 1610, 1, 1646, 1647, 1, 1649, 1747, 1, 1749, 1765, 16, 1766, 1774, 8, 1775, 1786, 11, 1787, 1788, 1, 1791, 1808, 17, 1810, 1839, 1, 1869, 1957, 1, 1969, 1994, 25, 1995, 2026, 1, 2036, 2037, 1, 2042, 2048, 6, 2049, 2069, 1, 2074, 2084, 10, 2088, 2112, 24, 2113, 2136, 1, 2144, 2154, 1, 2160, 2183, 1, 2185, 2190, 1, 2208, 2249, 1, 2308, 2361, 1, 2365, 2384, 19, 2392, 2401, 1, 2417, 2432, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2493, 2510, 17, 2524, 2525, 1, 2527, 2529, 1, 2544, 2545, 1, 2556, 2565, 9, 2566, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2649, 2652, 1, 2654, 2674, 20, 2675, 2676, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2749, 2768, 19, 2784, 2785, 1, 2809, 2821, 12, 2822, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2877, 2908, 31, 2909, 2911, 2, 2912, 2913, 1, 2929, 2947, 18, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3024, 3077, 53, 3078, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3133, 3160, 27, 3161, 3162, 1, 3165, 3168, 3, 3169, 3200, 31, 3205, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3261, 3293, 32, 3294, 3296, 2, 3297, 3313, 16, 3314, 3332, 18, 3333, 3340, 1, 3342, 3344, 1, 3346, 3386, 1, 3389, 3406, 17, 3412, 3414, 1, 3423, 3425, 1, 3450, 3455, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3585, 3632, 1, 3634, 3635, 1, 3648, 3654, 1, 3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3760, 1, 3762, 3763, 1, 3773, 3776, 3, 3777, 3780, 1, 3782, 3804, 22, 3805, 3807, 1, 3840, 3904, 64, 3905, 3911, 1, 3913, 3948, 1, 3976, 3980, 1, 4096, 4138, 1, 4159, 4176, 17, 4177, 4181, 1, 4186, 4189, 1, 4193, 4197, 4, 4198, 4206, 8, 4207, 4208, 1, 4213, 4225, 1, 4238, 4256, 18, 4257, 4293, 1, 4295, 4301, 6, 4304, 4346, 1, 4348, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4992, 5007, 1, 5024, 5109, 1, 5112, 5117, 1, 5121, 5740, 1, 5743, 5759, 1, 5761, 5786, 1, 5792, 5866, 1, 5873, 5880, 1, 5888, 5905, 1, 5919, 5937, 1, 5952, 5969, 1, 5984, 5996, 1, 5998, 6000, 1, 6016, 6067, 1, 6103, 6108, 5, 6176, 6264, 1, 6272, 6276, 1, 6279, 6312, 1, 6314, 6320, 6, 6321, 6389, 1, 6400, 6430, 1, 6480, 6509, 1, 6512, 6516, 1, 6528, 6571, 1, 6576, 6601, 1, 6656, 6678, 1, 6688, 6740, 1, 6823, 6917, 94, 6918, 6963, 1, 6981, 6988, 1, 7043, 7072, 1, 7086, 7087, 1, 7098, 7141, 1, 7168, 7203, 1, 7245, 7247, 1, 7258, 7293, 1, 7296, 7306, 1, 7312, 7354, 1, 7357, 7359, 1, 7401, 7404, 1, 7406, 7411, 1, 7413, 7414, 1, 7418, 7424, 6, 7425, 7615, 1, 7680, 7957, 1, 7960, 7965, 1, 7968, 8005, 1, 8008, 8013, 1, 8016, 8023, 1, 8025, 8031, 2, 8032, 8061, 1, 8064, 8116, 1, 8118, 8124, 1, 8126, 8130, 4, 8131, 8132, 1, 8134, 8140, 1, 8144, 8147, 1, 8150, 8155, 1, 8160, 8172, 1, 8178, 8180, 1, 8182, 8188, 1, 8305, 8319, 14, 8336, 8348, 1, 8450, 8455, 5, 8458, 8467, 1, 8469, 8473, 4, 8474, 8477, 1, 8484, 8490, 2, 8491, 8493, 1, 8495, 8505, 1, 8508, 8511, 1, 8517, 8521, 1, 8526, 8579, 53, 8580, 11264, 2684, 11265, 11492, 1, 11499, 11502, 1, 11506, 11507, 1, 11520, 11557, 1, 11559, 11565, 6, 11568, 11623, 1, 11631, 11648, 17, 11649, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 11823, 12293, 470, 12294, 12337, 43, 12338, 12341, 1, 12347, 12348, 1, 12353, 12438, 1, 12445, 12447, 1, 12449, 12538, 1, 12540, 12543, 1, 12549, 12591, 1, 12593, 12686, 1, 12704, 12735, 1, 12784, 12799, 1, 13312, 19903, 1, 19968, 42124, 1, 42192, 42237, 1, 42240, 42508, 1, 42512, 42527, 1, 42538, 42539, 1, 42560, 42606, 1, 42623, 42653, 1, 42656, 42725, 1, 42775, 42783, 1, 42786, 42888, 1, 42891, 42957, 1, 42960, 42961, 1, 42963, 42965, 2, 42966, 42972, 1, 42994, 43009, 1, 43011, 43013, 1, 43015, 43018, 1, 43020, 43042, 1, 43072, 43123, 1, 43138, 43187, 1, 43250, 43255, 1, 43259, 43261, 2, 43262, 43274, 12, 43275, 43301, 1, 43312, 43334, 1, 43360, 43388, 1, 43396, 43442, 1, 43471, 43488, 17, 43489, 43492, 1, 43494, 43503, 1, 43514, 43518, 1, 43520, 43560, 1, 43584, 43586, 1, 43588, 43595, 1, 43616, 43638, 1, 43642, 43646, 4, 43647, 43695, 1, 43697, 43701, 4, 43702, 43705, 3, 43706, 43709, 1, 43712, 43714, 2, 43739, 43741, 1, 43744, 43754, 1, 43762, 43764, 1, 43777, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 43824, 43866, 1, 43868, 43881, 1, 43888, 44002, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 63744, 64109, 1, 64112, 64217, 1, 64256, 64262, 1, 64275, 64279, 1, 64285, 64287, 2, 64288, 64296, 1, 64298, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64433, 1, 64467, 64829, 1, 64848, 64911, 1, 64914, 64967, 1, 65008, 65019, 1, 65136, 65140, 1, 65142, 65276, 1, 65313, 65338, 1, 65345, 65370, 1, 65382, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1, 65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1, 66176, 66204, 1, 66208, 66256, 1, 66304, 66335, 1, 66349, 66368, 1, 66370, 66377, 1, 66384, 66421, 1, 66432, 66461, 1, 66464, 66499, 1, 66504, 66511, 1, 66560, 66717, 1, 66736, 66771, 1, 66776, 66811, 1, 66816, 66855, 1, 66864, 66915, 1, 66928, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 67008, 67059, 1, 67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3, 67648, 67669, 1, 67680, 67702, 1, 67712, 67742, 1, 67808, 67826, 1, 67828, 67829, 1, 67840, 67861, 1, 67872, 67897, 1, 67968, 68023, 1, 68030, 68031, 1, 68096, 68112, 16, 68113, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68192, 68220, 1, 68224, 68252, 1, 68288, 68295, 1, 68297, 68324, 1, 68352, 68405, 1, 68416, 68437, 1, 68448, 68466, 1, 68480, 68497, 1, 68608, 68680, 1, 68736, 68786, 1, 68800, 68850, 1, 68864, 68899, 1, 68938, 68965, 1, 68975, 68997, 1, 69248, 69289, 1, 69296, 69297, 1, 69314, 69316, 1, 69376, 69404, 1, 69415, 69424, 9, 69425, 69445, 1, 69488, 69505, 1, 69552, 69572, 1, 69600, 69622, 1, 69635, 69687, 1, 69745, 69746, 1, 69749, 69763, 14, 69764, 69807, 1, 69840, 69864, 1, 69891, 69926, 1, 69956, 69959, 3, 69968, 70002, 1, 70006, 70019, 13, 70020, 70066, 1, 70081, 70084, 1, 70106, 70108, 2, 70144, 70161, 1, 70163, 70187, 1, 70207, 70208, 1, 70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70312, 1, 70320, 70366, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70461, 70480, 19, 70493, 70497, 1, 70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70609, 26, 70611, 70656, 45, 70657, 70708, 1, 70727, 70730, 1, 70751, 70753, 1, 70784, 70831, 1, 70852, 70853, 1, 70855, 71040, 185, 71041, 71086, 1, 71128, 71131, 1, 71168, 71215, 1, 71236, 71296, 60, 71297, 71338, 1, 71352, 71424, 72, 71425, 71450, 1, 71488, 71494, 1, 71680, 71723, 1, 71840, 71903, 1, 71935, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71983, 1, 71999, 72001, 2, 72096, 72103, 1, 72106, 72144, 1, 72161, 72163, 2, 72192, 72203, 11, 72204, 72242, 1, 72250, 72272, 22, 72284, 72329, 1, 72349, 72368, 19, 72369, 72440, 1, 72640, 72672, 1, 72704, 72712, 1, 72714, 72750, 1, 72768, 72818, 50, 72819, 72847, 1, 72960, 72966, 1, 72968, 72969, 1, 72971, 73008, 1, 73030, 73056, 26, 73057, 73061, 1, 73063, 73064, 1, 73066, 73097, 1, 73112, 73440, 328, 73441, 73458, 1, 73474, 73476, 2, 73477, 73488, 1, 73490, 73523, 1, 73648, 73728, 80, 73729, 74649, 1, 74880, 75075, 1, 77712, 77808, 1, 77824, 78895, 1, 78913, 78918, 1, 78944, 82938, 1, 82944, 83526, 1, 90368, 90397, 1, 92160, 92728, 1, 92736, 92766, 1, 92784, 92862, 1, 92880, 92909, 1, 92928, 92975, 1, 92992, 92995, 1, 93027, 93047, 1, 93053, 93071, 1, 93504, 93548, 1, 93760, 93823, 1, 93952, 94026, 1, 94032, 94099, 67, 94100, 94111, 1, 94176, 94177, 1, 94179, 94208, 29, 94209, 100343, 1, 100352, 101589, 1, 101631, 101640, 1, 110576, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 110592, 110882, 1, 110898, 110928, 30, 110929, 110930, 1, 110933, 110948, 15, 110949, 110951, 1, 110960, 111355, 1, 113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 119808, 119892, 1, 119894, 119964, 1, 119966, 119967, 1, 119970, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120094, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120146, 120485, 1, 120488, 120512, 1, 120514, 120538, 1, 120540, 120570, 1, 120572, 120596, 1, 120598, 120628, 1, 120630, 120654, 1, 120656, 120686, 1, 120688, 120712, 1, 120714, 120744, 1, 120746, 120770, 1, 120772, 120779, 1, 122624, 122654, 1, 122661, 122666, 1, 122928, 122989, 1, 123136, 123180, 1, 123191, 123197, 1, 123214, 123536, 322, 123537, 123565, 1, 123584, 123627, 1, 124112, 124139, 1, 124368, 124397, 1, 124400, 124896, 496, 124897, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1, 124928, 125124, 1, 125184, 125251, 1, 125259, 126464, 1205, 126465, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1]));
|
|
135
|
-
static
|
|
136
|
-
static
|
|
137
|
-
|
|
138
|
-
|
|
139
|
-
|
|
140
|
-
|
|
141
|
-
|
|
142
|
-
static
|
|
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
|
-
static
|
|
183
|
-
|
|
184
|
-
|
|
185
|
-
static
|
|
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
|
-
static Print = new UnicodeRangeTable(new Uint32Array([33, 126, 1, 161, 172, 1, 174, 887, 1, 890, 895, 1, 900, 906, 1, 908, 910, 2, 911, 929, 1, 931, 1327, 1, 1329, 1366, 1, 1369, 1418, 1, 1421, 1423, 1, 1425, 1479, 1, 1488, 1514, 1, 1519, 1524, 1, 1542, 1563, 1, 1565, 1756, 1, 1758, 1805, 1, 1808, 1866, 1, 1869, 1969, 1, 1984, 2042, 1, 2045, 2093, 1, 2096, 2110, 1, 2112, 2139, 1, 2142, 2144, 2, 2145, 2154, 1, 2160, 2190, 1, 2199, 2273, 1, 2275, 2435, 1, 2437, 2444, 1, 2447, 2448, 1, 2451, 2472, 1, 2474, 2480, 1, 2482, 2486, 4, 2487, 2489, 1, 2492, 2500, 1, 2503, 2504, 1, 2507, 2510, 1, 2519, 2524, 5, 2525, 2527, 2, 2528, 2531, 1, 2534, 2558, 1, 2561, 2563, 1, 2565, 2570, 1, 2575, 2576, 1, 2579, 2600, 1, 2602, 2608, 1, 2610, 2611, 1, 2613, 2614, 1, 2616, 2617, 1, 2620, 2622, 2, 2623, 2626, 1, 2631, 2632, 1, 2635, 2637, 1, 2641, 2649, 8, 2650, 2652, 1, 2654, 2662, 8, 2663, 2678, 1, 2689, 2691, 1, 2693, 2701, 1, 2703, 2705, 1, 2707, 2728, 1, 2730, 2736, 1, 2738, 2739, 1, 2741, 2745, 1, 2748, 2757, 1, 2759, 2761, 1, 2763, 2765, 1, 2768, 2784, 16, 2785, 2787, 1, 2790, 2801, 1, 2809, 2815, 1, 2817, 2819, 1, 2821, 2828, 1, 2831, 2832, 1, 2835, 2856, 1, 2858, 2864, 1, 2866, 2867, 1, 2869, 2873, 1, 2876, 2884, 1, 2887, 2888, 1, 2891, 2893, 1, 2901, 2903, 1, 2908, 2909, 1, 2911, 2915, 1, 2918, 2935, 1, 2946, 2947, 1, 2949, 2954, 1, 2958, 2960, 1, 2962, 2965, 1, 2969, 2970, 1, 2972, 2974, 2, 2975, 2979, 4, 2980, 2984, 4, 2985, 2986, 1, 2990, 3001, 1, 3006, 3010, 1, 3014, 3016, 1, 3018, 3021, 1, 3024, 3031, 7, 3046, 3066, 1, 3072, 3084, 1, 3086, 3088, 1, 3090, 3112, 1, 3114, 3129, 1, 3132, 3140, 1, 3142, 3144, 1, 3146, 3149, 1, 3157, 3158, 1, 3160, 3162, 1, 3165, 3168, 3, 3169, 3171, 1, 3174, 3183, 1, 3191, 3212, 1, 3214, 3216, 1, 3218, 3240, 1, 3242, 3251, 1, 3253, 3257, 1, 3260, 3268, 1, 3270, 3272, 1, 3274, 3277, 1, 3285, 3286, 1, 3293, 3294, 1, 3296, 3299, 1, 3302, 3311, 1, 3313, 3315, 1, 3328, 3340, 1, 3342, 3344, 1, 3346, 3396, 1, 3398, 3400, 1, 3402, 3407, 1, 3412, 3427, 1, 3430, 3455, 1, 3457, 3459, 1, 3461, 3478, 1, 3482, 3505, 1, 3507, 3515, 1, 3517, 3520, 3, 3521, 3526, 1, 3530, 3535, 5, 3536, 3540, 1, 3542, 3544, 2, 3545, 3551, 1, 3558, 3567, 1, 3570, 3572, 1, 3585, 3642, 1, 3647, 3675, 1, 3713, 3714, 1, 3716, 3718, 2, 3719, 3722, 1, 3724, 3747, 1, 3749, 3751, 2, 3752, 3773, 1, 3776, 3780, 1, 3782, 3784, 2, 3785, 3790, 1, 3792, 3801, 1, 3804, 3807, 1, 3840, 3911, 1, 3913, 3948, 1, 3953, 3991, 1, 3993, 4028, 1, 4030, 4044, 1, 4046, 4058, 1, 4096, 4293, 1, 4295, 4301, 6, 4304, 4680, 1, 4682, 4685, 1, 4688, 4694, 1, 4696, 4698, 2, 4699, 4701, 1, 4704, 4744, 1, 4746, 4749, 1, 4752, 4784, 1, 4786, 4789, 1, 4792, 4798, 1, 4800, 4802, 2, 4803, 4805, 1, 4808, 4822, 1, 4824, 4880, 1, 4882, 4885, 1, 4888, 4954, 1, 4957, 4988, 1, 4992, 5017, 1, 5024, 5109, 1, 5112, 5117, 1, 5120, 5759, 1, 5761, 5788, 1, 5792, 5880, 1, 5888, 5909, 1, 5919, 5942, 1, 5952, 5971, 1, 5984, 5996, 1, 5998, 6000, 1, 6002, 6003, 1, 6016, 6109, 1, 6112, 6121, 1, 6128, 6137, 1, 6144, 6157, 1, 6159, 6169, 1, 6176, 6264, 1, 6272, 6314, 1, 6320, 6389, 1, 6400, 6430, 1, 6432, 6443, 1, 6448, 6459, 1, 6464, 6468, 4, 6469, 6509, 1, 6512, 6516, 1, 6528, 6571, 1, 6576, 6601, 1, 6608, 6618, 1, 6622, 6683, 1, 6686, 6750, 1, 6752, 6780, 1, 6783, 6793, 1, 6800, 6809, 1, 6816, 6829, 1, 6832, 6862, 1, 6912, 6988, 1, 6990, 7155, 1, 7164, 7223, 1, 7227, 7241, 1, 7245, 7306, 1, 7312, 7354, 1, 7357, 7367, 1, 7376, 7418, 1, 7424, 7957, 1, 7960, 7965, 1, 7968, 8005, 1, 8008, 8013, 1, 8016, 8023, 1, 8025, 8031, 2, 8032, 8061, 1, 8064, 8116, 1, 8118, 8132, 1, 8134, 8147, 1, 8150, 8155, 1, 8157, 8175, 1, 8178, 8180, 1, 8182, 8190, 1, 8208, 8231, 1, 8240, 8286, 1, 8304, 8305, 1, 8308, 8334, 1, 8336, 8348, 1, 8352, 8384, 1, 8400, 8432, 1, 8448, 8587, 1, 8592, 9257, 1, 9280, 9290, 1, 9312, 11123, 1, 11126, 11157, 1, 11159, 11507, 1, 11513, 11557, 1, 11559, 11565, 6, 11568, 11623, 1, 11631, 11632, 1, 11647, 11670, 1, 11680, 11686, 1, 11688, 11694, 1, 11696, 11702, 1, 11704, 11710, 1, 11712, 11718, 1, 11720, 11726, 1, 11728, 11734, 1, 11736, 11742, 1, 11744, 11869, 1, 11904, 11929, 1, 11931, 12019, 1, 12032, 12245, 1, 12272, 12287, 1, 12289, 12351, 1, 12353, 12438, 1, 12441, 12543, 1, 12549, 12591, 1, 12593, 12686, 1, 12688, 12773, 1, 12783, 12830, 1, 12832, 42124, 1, 42128, 42182, 1, 42192, 42539, 1, 42560, 42743, 1, 42752, 42957, 1, 42960, 42961, 1, 42963, 42965, 2, 42966, 42972, 1, 42994, 43052, 1, 43056, 43065, 1, 43072, 43127, 1, 43136, 43205, 1, 43214, 43225, 1, 43232, 43347, 1, 43359, 43388, 1, 43392, 43469, 1, 43471, 43481, 1, 43486, 43518, 1, 43520, 43574, 1, 43584, 43597, 1, 43600, 43609, 1, 43612, 43714, 1, 43739, 43766, 1, 43777, 43782, 1, 43785, 43790, 1, 43793, 43798, 1, 43808, 43814, 1, 43816, 43822, 1, 43824, 43883, 1, 43888, 44013, 1, 44016, 44025, 1, 44032, 55203, 1, 55216, 55238, 1, 55243, 55291, 1, 63744, 64109, 1, 64112, 64217, 1, 64256, 64262, 1, 64275, 64279, 1, 64285, 64310, 1, 64312, 64316, 1, 64318, 64320, 2, 64321, 64323, 2, 64324, 64326, 2, 64327, 64450, 1, 64467, 64911, 1, 64914, 64967, 1, 64975, 65008, 33, 65009, 65049, 1, 65056, 65106, 1, 65108, 65126, 1, 65128, 65131, 1, 65136, 65140, 1, 65142, 65276, 1, 65281, 65470, 1, 65474, 65479, 1, 65482, 65487, 1, 65490, 65495, 1, 65498, 65500, 1, 65504, 65510, 1, 65512, 65518, 1, 65532, 65533, 1, 65536, 65547, 1, 65549, 65574, 1, 65576, 65594, 1, 65596, 65597, 1, 65599, 65613, 1, 65616, 65629, 1, 65664, 65786, 1, 65792, 65794, 1, 65799, 65843, 1, 65847, 65934, 1, 65936, 65948, 1, 65952, 66000, 48, 66001, 66045, 1, 66176, 66204, 1, 66208, 66256, 1, 66272, 66299, 1, 66304, 66339, 1, 66349, 66378, 1, 66384, 66426, 1, 66432, 66461, 1, 66463, 66499, 1, 66504, 66517, 1, 66560, 66717, 1, 66720, 66729, 1, 66736, 66771, 1, 66776, 66811, 1, 66816, 66855, 1, 66864, 66915, 1, 66927, 66938, 1, 66940, 66954, 1, 66956, 66962, 1, 66964, 66965, 1, 66967, 66977, 1, 66979, 66993, 1, 66995, 67001, 1, 67003, 67004, 1, 67008, 67059, 1, 67072, 67382, 1, 67392, 67413, 1, 67424, 67431, 1, 67456, 67461, 1, 67463, 67504, 1, 67506, 67514, 1, 67584, 67589, 1, 67592, 67594, 2, 67595, 67637, 1, 67639, 67640, 1, 67644, 67647, 3, 67648, 67669, 1, 67671, 67742, 1, 67751, 67759, 1, 67808, 67826, 1, 67828, 67829, 1, 67835, 67867, 1, 67871, 67897, 1, 67903, 67968, 65, 67969, 68023, 1, 68028, 68047, 1, 68050, 68099, 1, 68101, 68102, 1, 68108, 68115, 1, 68117, 68119, 1, 68121, 68149, 1, 68152, 68154, 1, 68159, 68168, 1, 68176, 68184, 1, 68192, 68255, 1, 68288, 68326, 1, 68331, 68342, 1, 68352, 68405, 1, 68409, 68437, 1, 68440, 68466, 1, 68472, 68497, 1, 68505, 68508, 1, 68521, 68527, 1, 68608, 68680, 1, 68736, 68786, 1, 68800, 68850, 1, 68858, 68903, 1, 68912, 68921, 1, 68928, 68965, 1, 68969, 68997, 1, 69006, 69007, 1, 69216, 69246, 1, 69248, 69289, 1, 69291, 69293, 1, 69296, 69297, 1, 69314, 69316, 1, 69372, 69415, 1, 69424, 69465, 1, 69488, 69513, 1, 69552, 69579, 1, 69600, 69622, 1, 69632, 69709, 1, 69714, 69749, 1, 69759, 69820, 1, 69822, 69826, 1, 69840, 69864, 1, 69872, 69881, 1, 69888, 69940, 1, 69942, 69959, 1, 69968, 70006, 1, 70016, 70111, 1, 70113, 70132, 1, 70144, 70161, 1, 70163, 70209, 1, 70272, 70278, 1, 70280, 70282, 2, 70283, 70285, 1, 70287, 70301, 1, 70303, 70313, 1, 70320, 70378, 1, 70384, 70393, 1, 70400, 70403, 1, 70405, 70412, 1, 70415, 70416, 1, 70419, 70440, 1, 70442, 70448, 1, 70450, 70451, 1, 70453, 70457, 1, 70459, 70468, 1, 70471, 70472, 1, 70475, 70477, 1, 70480, 70487, 7, 70493, 70499, 1, 70502, 70508, 1, 70512, 70516, 1, 70528, 70537, 1, 70539, 70542, 3, 70544, 70581, 1, 70583, 70592, 1, 70594, 70597, 3, 70599, 70602, 1, 70604, 70613, 1, 70615, 70616, 1, 70625, 70626, 1, 70656, 70747, 1, 70749, 70753, 1, 70784, 70855, 1, 70864, 70873, 1, 71040, 71093, 1, 71096, 71133, 1, 71168, 71236, 1, 71248, 71257, 1, 71264, 71276, 1, 71296, 71353, 1, 71360, 71369, 1, 71376, 71395, 1, 71424, 71450, 1, 71453, 71467, 1, 71472, 71494, 1, 71680, 71739, 1, 71840, 71922, 1, 71935, 71942, 1, 71945, 71948, 3, 71949, 71955, 1, 71957, 71958, 1, 71960, 71989, 1, 71991, 71992, 1, 71995, 72006, 1, 72016, 72025, 1, 72096, 72103, 1, 72106, 72151, 1, 72154, 72164, 1, 72192, 72263, 1, 72272, 72354, 1, 72368, 72440, 1, 72448, 72457, 1, 72640, 72673, 1, 72688, 72697, 1, 72704, 72712, 1, 72714, 72758, 1, 72760, 72773, 1, 72784, 72812, 1, 72816, 72847, 1, 72850, 72871, 1, 72873, 72886, 1, 72960, 72966, 1, 72968, 72969, 1, 72971, 73014, 1, 73018, 73020, 2, 73021, 73023, 2, 73024, 73031, 1, 73040, 73049, 1, 73056, 73061, 1, 73063, 73064, 1, 73066, 73102, 1, 73104, 73105, 1, 73107, 73112, 1, 73120, 73129, 1, 73440, 73464, 1, 73472, 73488, 1, 73490, 73530, 1, 73534, 73562, 1, 73648, 73664, 16, 73665, 73713, 1, 73727, 74649, 1, 74752, 74862, 1, 74864, 74868, 1, 74880, 75075, 1, 77712, 77810, 1, 77824, 78895, 1, 78912, 78933, 1, 78944, 82938, 1, 82944, 83526, 1, 90368, 90425, 1, 92160, 92728, 1, 92736, 92766, 1, 92768, 92777, 1, 92782, 92862, 1, 92864, 92873, 1, 92880, 92909, 1, 92912, 92917, 1, 92928, 92997, 1, 93008, 93017, 1, 93019, 93025, 1, 93027, 93047, 1, 93053, 93071, 1, 93504, 93561, 1, 93760, 93850, 1, 93952, 94026, 1, 94031, 94087, 1, 94095, 94111, 1, 94176, 94180, 1, 94192, 94193, 1, 94208, 100343, 1, 100352, 101589, 1, 101631, 101640, 1, 110576, 110579, 1, 110581, 110587, 1, 110589, 110590, 1, 110592, 110882, 1, 110898, 110928, 30, 110929, 110930, 1, 110933, 110948, 15, 110949, 110951, 1, 110960, 111355, 1, 113664, 113770, 1, 113776, 113788, 1, 113792, 113800, 1, 113808, 113817, 1, 113820, 113823, 1, 117760, 118009, 1, 118016, 118451, 1, 118528, 118573, 1, 118576, 118598, 1, 118608, 118723, 1, 118784, 119029, 1, 119040, 119078, 1, 119081, 119154, 1, 119163, 119274, 1, 119296, 119365, 1, 119488, 119507, 1, 119520, 119539, 1, 119552, 119638, 1, 119648, 119672, 1, 119808, 119892, 1, 119894, 119964, 1, 119966, 119967, 1, 119970, 119973, 3, 119974, 119977, 3, 119978, 119980, 1, 119982, 119993, 1, 119995, 119997, 2, 119998, 120003, 1, 120005, 120069, 1, 120071, 120074, 1, 120077, 120084, 1, 120086, 120092, 1, 120094, 120121, 1, 120123, 120126, 1, 120128, 120132, 1, 120134, 120138, 4, 120139, 120144, 1, 120146, 120485, 1, 120488, 120779, 1, 120782, 121483, 1, 121499, 121503, 1, 121505, 121519, 1, 122624, 122654, 1, 122661, 122666, 1, 122880, 122886, 1, 122888, 122904, 1, 122907, 122913, 1, 122915, 122916, 1, 122918, 122922, 1, 122928, 122989, 1, 123023, 123136, 113, 123137, 123180, 1, 123184, 123197, 1, 123200, 123209, 1, 123214, 123215, 1, 123536, 123566, 1, 123584, 123641, 1, 123647, 124112, 465, 124113, 124153, 1, 124368, 124410, 1, 124415, 124896, 481, 124897, 124902, 1, 124904, 124907, 1, 124909, 124910, 1, 124912, 124926, 1, 124928, 125124, 1, 125127, 125142, 1, 125184, 125259, 1, 125264, 125273, 1, 125278, 125279, 1, 126065, 126132, 1, 126209, 126269, 1, 126464, 126467, 1, 126469, 126495, 1, 126497, 126498, 1, 126500, 126503, 3, 126505, 126514, 1, 126516, 126519, 1, 126521, 126523, 2, 126530, 126535, 5, 126537, 126541, 2, 126542, 126543, 1, 126545, 126546, 1, 126548, 126551, 3, 126553, 126561, 2, 126562, 126564, 2, 126567, 126570, 1, 126572, 126578, 1, 126580, 126583, 1, 126585, 126588, 1, 126590, 126592, 2, 126593, 126601, 1, 126603, 126619, 1, 126625, 126627, 1, 126629, 126633, 1, 126635, 126651, 1, 126704, 126705, 1, 126976, 127019, 1, 127024, 127123, 1, 127136, 127150, 1, 127153, 127167, 1, 127169, 127183, 1, 127185, 127221, 1, 127232, 127405, 1, 127462, 127490, 1, 127504, 127547, 1, 127552, 127560, 1, 127568, 127569, 1, 127584, 127589, 1, 127744, 128727, 1, 128732, 128748, 1, 128752, 128764, 1, 128768, 128886, 1, 128891, 128985, 1, 128992, 129003, 1, 129008, 129024, 16, 129025, 129035, 1, 129040, 129095, 1, 129104, 129113, 1, 129120, 129159, 1, 129168, 129197, 1, 129200, 129211, 1, 129216, 129217, 1, 129280, 129619, 1, 129632, 129645, 1, 129648, 129660, 1, 129664, 129673, 1, 129679, 129734, 1, 129742, 129756, 1, 129759, 129769, 1, 129776, 129784, 1, 129792, 129938, 1, 129940, 130041, 1, 131072, 173791, 1, 173824, 177977, 1, 177984, 178205, 1, 178208, 183969, 1, 183984, 191456, 1, 191472, 192093, 1, 194560, 195101, 1, 196608, 201546, 1, 201552, 205743, 1, 917760, 917999, 1]));
|
|
207
|
+
static _CASE_ORBIT = null;
|
|
208
|
+
static get CASE_ORBIT() {
|
|
209
|
+
if (!this._CASE_ORBIT) {
|
|
210
|
+
this._CASE_ORBIT = decodeOrbit('rCrDIzDYqpII-LiC8cQlHa+0HGrpI6EzClClOBmOBkOBoOBpOBnOBrOBsOBqOlByPBzPBxPyK5crCz+HCydD1dD4dB5dB6dC8dEgeBheCieDmeDpeHj-HCweD1fDxeB+9HBwfC1FE2eBxfBjeBjdD1eDmpIHycB0fEmdBgda6cBhdD4cB1cdyhBC0hBK+hBDhiBBiiBIqiBIgkHChkHKikHDjkHBkkHImkHYjjBBnkH9gGygBB0gBB+gBBhhBBlkHBihBBqhBBijBBqypB4OhzHB70H6BgzHD-GiHo8HBp8HBq8HBr8HBs8HBt8HBu8HBv8HBg8HBh8HBi8HBj8HBk8HBl8HBm8HBn8HB48HB58HB68HB78HB88HB98HB+8HB-8HBw8HBx8HBy8HBz8HB08HB18HB28HB38HBo9HBp9HBq9HBr9HBs9HBt9HBu9HBv9HBg9HBh9HBi9HBj9HBk9HBl9HBm9HBn9HE89HJz9HClaFs+HJj+HHwcQwdQ8-HJz-HqJpdErCBlG-ohBrypBBokH6lVm4+BBl4+B6nCohhCBphhCBqhhCBrhhCBshhCBthhCBuhhCBvhhCBwhhCBxhhCByhhCBzhhCB0hhCB1hhCB2hhCB3hhCB4hhCB5hhCB6hhCB7hhCB8hhCB9hhCB+hhCB-hhCBgihCBhihCBiihCBjihCBkihCBlihCBmihCBnihCBoihCBpihCBqihCBrihCBsihCBtihCBuihCBvihCBgghCBhghCBighCBjghCBkghCBlghCBmghCBnghCBoghCBpghCBqghCBrghCBsghCBtghCBughCBvghCBwghCBxghCByghCBzghCB0ghCB1ghCB2ghCB3ghCB4ghCB5ghCB6ghCB7ghCB8ghCB9ghCB+ghCB-ghCBghhCBhhhCBihhCBjhhCBkhhCBlhhCBmhhCBnhhChD4mhCB5mhCB6mhCB7mhCB8mhCB9mhCB+mhCB-mhCBgnhCBhnhCBinhCBjnhCBknhCBlnhCBmnhCBnnhCBonhCBpnhCBqnhCBrnhCBsnhCBtnhCBunhCBvnhCBwnhCBxnhCBynhCBznhCB0nhCB1nhCB2nhCB3nhCB4nhCB5nhCB6nhCB7nhCFwlhCBxlhCBylhCBzlhCB0lhCB1lhCB2lhCB3lhCB4lhCB5lhCB6lhCB7lhCB8lhCB9lhCB+lhCB-lhCBgmhCBhmhCBimhCBjmhCBkmhCBlmhCBmmhCBnmhCBomhCBpmhCBqmhCBrmhCBsmhCBtmhCBumhCBvmhCBwmhCBxmhCBymhCBzmhC1D3shCB4shCB5shCB6shCB7shCB8shCB9shCB+shCB-shCBgthCBhthCCjthCBkthCBlthCBmthCBnthCBothCBpthCBqthCBrthCBsthCBtthCButhCBvthCBwthCBxthCCzthCB0thCB1thCB2thCB3thCB4thCB5thCC7thCB8thCCwrhCBxrhCByrhCBzrhCB0rhCB1rhCB2rhCB3rhCB4rhCB5rhCB6rhCC8rhCB9rhCB+rhCB-rhCBgshCBhshCBishCBjshCBkshCBlshCBmshCBnshCBoshCBpshCBqshCCsshCBtshCBushCBvshCBwshCBxshCByshCC0shCB1shCk2BgmjCBhmjCBimjCBjmjCBkmjCBlmjCBmmjCBnmjCBomjCBpmjCBqmjCBrmjCBsmjCBtmjCBumjCBvmjCBwmjCBxmjCBymjCBzmjCB0mjCB1mjCB2mjCB3mjCB4mjCB5mjCB6mjCB7mjCB8mjCB9mjCB+mjCB-mjCBgnjCBhnjCBinjCBjnjCBknjCBlnjCBmnjCBnnjCBonjCBpnjCBqnjCBrnjCBsnjCBtnjCBunjCBvnjCBwnjCBxnjCBynjCOgkjCBhkjCBikjCBjkjCBkkjCBlkjCBmkjCBnkjCBokjCBpkjCBqkjCBrkjCBskjCBtkjCBukjCBvkjCBwkjCBxkjCBykjCBzkjCB0kjCB1kjCB2kjCB3kjCB4kjCB5kjCB6kjCB7kjCB8kjCB9kjCB+kjCB-kjCBgljCBhljCBiljCBjljCBkljCBlljCBmljCBnljCBoljCBpljCBqljCBrljCBsljCBtljCBuljCBvljCBwljCBxljCByljC+CwrjCBxrjCByrjCBzrjCB0rjCB1rjCB2rjCB3rjCB4rjCB5rjCB6rjCB7rjCB8rjCB9rjCB+rjCB-rjCBgsjCBhsjCBisjCBjsjCBksjCBlsjCLwqjCBxqjCByqjCBzqjCB0qjCB1qjCB2qjCB3qjCB4qjCB5qjCB6qjCB7qjCB8qjCB9qjCB+qjCB-qjCBgrjCBhrjCBirjCBjrjCBkrjCBlrjC74CgmmCBhmmCBimmCBjmmCBkmmCBlmmCBmmmCBnmmCBommCBpmmCBqmmCBrmmCBsmmCBtmmCBummCBvmmCBwmmCBxmmCBymmCBzmmCB0mmCB1mmCB2mmCB3mmCB4mmCB5mmCB6mmCB7mmCB8mmCB9mmCB+mmCB-mmCBglmCBhlmCBilmCBjlmCBklmCBllmCBmlmCBnlmCBolmCBplmCBqlmCBrlmCBslmCBtlmCBulmCBvlmCBwlmCBxlmCBylmCBzlmCB0lmCB1lmCB2lmCB3lmCB4lmCB5lmCB6lmCB7lmCB8lmCB9lmCB+lmCB-lmChrVgz7CBhz7CBiz7CBjz7CBkz7CBlz7CBmz7CBnz7CBoz7CBpz7CBqz7CBrz7CBsz7CBtz7CBuz7CBvz7CBwz7CBxz7CByz7CBzz7CB0z7CB1z7CB2z7CB3z7CB4z7CB5z7CB6z7CB7z7CB8z7CB9z7CB+z7CB-z7CBgy7CBhy7CBiy7CBjy7CBky7CBly7CBmy7CBny7CBoy7CBpy7CBqy7CBry7CBsy7CBty7CBuy7CBvy7CBwy7CBxy7CByy7CBzy7CB0y7CB1y7CB2y7CB3y7CB4y7CB5y7CB6y7CB7y7CB8y7CB9y7CB+y7CB-y7Ch0eip6DBjp6DBkp6DBlp6DBmp6DBnp6DBop6DBpp6DBqp6DBrp6DBsp6DBtp6DBup6DBvp6DBwp6DBxp6DByp6DBzp6DB0p6DB1p6DB2p6DB3p6DB4p6DB5p6DB6p6DB7p6DB8p6DB9p6DB+p6DB-p6DBgq6DBhq6DBiq6DBjq6DBgo6DBho6DBio6DBjo6DBko6DBlo6DBmo6DBno6DBoo6DBpo6DBqo6DBro6DBso6DBto6DBuo6DBvo6DBwo6DBxo6DByo6DBzo6DB0o6DB1o6DB2o6DB3o6DB4o6DB5o6DB6o6DB7o6DB8o6DB9o6DB+o6DB-o6DBgp6DBhp6D');
|
|
211
|
+
}
|
|
212
|
+
return this._CASE_ORBIT;
|
|
213
|
+
}
|
|
214
|
+
static _Print = null;
|
|
215
|
+
static get Print() {
|
|
216
|
+
if (!this._Print) {
|
|
217
|
+
this._Print = new UnicodeRangeTable(decodeRanges('hB9CBjBLBCpWBDFBFGBCCCBSBCsMBClBBDxBBDCBC2BBJaBFFBSVBC-FBCvBBD6BBDkDBP6BBDwBBDOBCbBDCCBJBGeBJqCBCgFBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYBDCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPBLCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGBCCBCHBDBBDVBCGBCBBCEBDIBDBBDCBICBFBBCEBDRBLBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBGMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIVBCCBCWBCJBCEBDIBCCBCDBIBBHBBCDBDJBCCBNMBCCBCyBBCCBCFBFPBDZBCCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBN5BBFcBmBBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDBhBnCBCjBBFmBBCjBBCOBCMBmBlGBCGGD4LBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBH1CBDFBD-TBCbBE4CBIVBKXBKTBNMBCCBCBBN9CBDJBHJBHNBCKBH4CBIqBBGlCBLeBCLBFLBFEEBoBBDEBMrBBFZBHKBE9BBDgCBCcBDKBHJBHNBDeByBsCBClFBJ7BBEOBE9BBGqBBDKBJqBBG1QBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBSXBJuBBSBBDaBCMBEgBBQgBBQrEBF5UBXKBWz4BBDfBC8KBGsBBCGGD3BBIBBPXBKGBCGBCGBCGBCGBCGBCGBCGBC9DBjBZBC4CBN1GBbPBC+BBC1CBDmDBGqBBC9CBC1CBKvBBCszcBE2BBK7KBV3FBJtGBDBBCCCBGBW6BBEJBH3BBJlCBJLBHzDBMdBEtCBCKBFgBBC2BBKNBDJBDmDBZbBLFBDFBDFBKGBCGBC7BBF9DBDJBHj9KBNWBFwBBloItLBDpDBnBGBNEBGZBCEBCCCBCCBCCB7DBR8NBD1BBIhBhBBoBBHyBBCSBCDBFEBCmEBF9FBEFBDFBDFBDCBEGBCGBOBBDLBCZBCSBCBBCOBDNBjB6DBGCBFsBBE3CBCMBEwBwBBsBBjEcBEwBBQbBFjBBKdBGqBBGdBCkBBFNBrB9EBDJBHjBBFjBBFnBBJzBBMLBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBCnCBJIBxBSBCBBGgBBEaBGhChCB2BBFTBDxBBCBBGHBCCBCcBDCBFJBIIBI-BBhBmBBFLBK1BBEcBDaBGZBIDBNGBxCoCB4ByBBOyBBItBBJJBHlBBEcBJBBxGeBCpBBCCBDBBRCB4BrBBJpBBXZBnBbBVWBKtCBFjBBK9BBCEBOYBIJBH0BBCRBJmBBK-CBCTBMRBCuBB-BGBCCCBCBCOBCKBH6BBGJBHDBCHBDBBDVBCGBCBBCEBCJBDBBDCBDHHGGBDGBEEBMJBCDDClBBCJBCDDCDBCJBCBBJBBe7CBCEBfnCBJJBnF1BBDlBBjBkCBMJBHMBU5BBHJBHTBdaBDOBFWB6F7BBlDyCBNHBDDDBGBCBBCdBCBBDLBKJBnCHBDtBBDKBcnCBJyCBOoCBIJB3FhBBPJBHIBCsBBCNBLcBEfBDVBCNBqCGBCBBCrBBECCBCCBHBJJBHFBCBBCkBBCBBCFBIJB3JYBIQBCoBBEcB2CQQBwBBO6cBnDuDBCEBMjGBtyCiDBOvhBBRVBL68DBGmSB61G5BBn2B4RBIeBCJBFwCBCJBHdBDFBLlCBLJBCGBCUBGSBxN5BBnG6CBmDqCBF4BBIQBhCEBMBBP3-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBDDBh7D5HBHzNBtCtBBDWBKzDB9B1HBLmBBDpCBJvDBWlCB7DTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBD9VBQEBCOBxiBeBHFB2GGBCQBDGBCBBCEBG9BBiBxDxDBrBBENBDJBFBBhKeBS5BBGxOxOBoBB3GqBBFhPhPBFBCDBCBBCOBCkGBDPBqBrCBFJBFBByYjCBtC8BBjGDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBBvIrBBFjDBNOBDOBCOBCkBBLtFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBngB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEBxq3VvHB', false));
|
|
218
|
+
}
|
|
219
|
+
return this._Print;
|
|
220
|
+
}
|
|
221
|
+
static CATEGORIES = new LazyMap({
|
|
222
|
+
C: () => new UnicodeRangeTable(decodeRanges('AfBgDgBBOrWrWBHHBCBICCVuMuMnBBBzBBBE4B4BBGBcDBHQBXhGhGxBBB8BBBmDNB8BBByBBBQddBCCMEBgBHBsCiFiFJBBDBBXIICCBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBPMMBEB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKMMBDBbEByBPBDBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBjoIBvLBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCB-FCBHBBHBBHBBECBIIIBLBDBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIB-BGGBLBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMBxhBPBXJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBF-6DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBrCHBxDUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEvq3VBxHvw-FB', false)),
|
|
223
|
+
Cc: () => new UnicodeRangeTable(decodeRanges('AfgDgB', true)),
|
|
224
|
+
Cf: () => new UnicodeRangeTable(decodeRanges('tFzqBzqBBEBXhGhGyBhMhMBxCxCs5D9-B9-BBDBbEByBEBCJBw03B6H6HBBBimEQQj7IPBhjiBDBwmFHBn0rYffB+CB', false)),
|
|
225
|
+
Cn: () => new UnicodeRangeTable(decodeRanges('4bBBHDBICCVuMuMnBBBzBBBE4B4BBGBcDBHKBvI9B9BBmDmDBMB8BBByBBBQddBCCMEBgBDDBDBuHJJBDDBXXICCBBBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBbFB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKmDmDNBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBDBvzIBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCC-FCBHBBHBBHBBECBIIIBIBGBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIBlCJBCBBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMB3iBJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBJ76DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBjGUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEwi3VBCdBhD-DBxHvw-BB---BBB---BBB', false)),
|
|
226
|
+
Co: () => new UnicodeRangeTable(decodeRanges('gg4B-nGh4hc9--BD9--B', true)),
|
|
227
|
+
Cs: () => new UnicodeRangeTable(decodeRanges('gg2B--B', true)),
|
|
228
|
+
L: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBLLFGGBVBCeBCpOBFLBPEBICCiEEBCBBDDBCHHCCBCCCBSBCyCBCqEBJlFBClBBDHHBnBBoCaBFDBuBqBBkBBBCiDBCQQBIIBLLBBBDRRCdBe4CBMZZBfBKBBFGGBUBFKKEYYBXBIKBGXBCFBSpBB7B1BBETTIJBQPBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNGB7BBBCCCBDBCXBCCCBIBCBBKDDBDBCWWBCBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNSSBkBBCGGDqBBCsKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPBR1CBDFBErTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBkBFFkC4CBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBzC+C+CBtBBSHB3BdBOBBLrBBbjBBqBCBLjBBDKBGqBBDCBqBDBCFBCBBEGGB+FBhC1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGB1DOORMBmDFFDJBCEEBDBHGCBCBCKBDDBGEBF1B1BB8zC8zCBjHBHDBEBBNlBBCGGD3BBIRRBVBKGBCGBCGBCGBCGBCGBCGBCGBxC2O2OBrBrBBDBGBBF1CBHCBC5CBCDBGqBBC9CBSfBxBPBhQ-tGBhCs0VBkCtBBDsIBEPBLBBVuBBReBDlCByBIBDmDBDiCBDBBCCCBGBWPBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBdRRBDBCJBLEBCoBBYCBCHBVWBEEEBwBBCEEBDDBDBDCCZCBDKBICBNFBDFBDFBKGBCGBCqBBCNBHyDBej9KBNWBFwBBloItLBDpDBnBGBNEBGCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBlBZBHZBM4CBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBxB9EBTjBBFjBBFnBBJzBBNKBCOBCGBCBBCKBCOBCGBCBBEzBBN2JBKVBLHBZFBCpBBCIBmCFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4ByBBOyBBOjBBnBbBKWB7HpBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB1D-BBgBHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBBRDBgBUBGSBxNsBB0G-BBhEqCBGjCjCBLBhCBBCddB2-FBJ1mBBqBJBo3IDBCGBCBBCiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBn7F0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BeBHFBmI9BBzEsBBLGBRiKiKBcBTrBBlPbBlHdBDwPwPBFBCDBCBBCOBCkGB8BjCBI1lB1lBBCBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
229
|
+
LC: () => new UnicodeRangeTable(decodeRanges('hCZBHZB7BLLBVBCeBCiGBCDBFvGBCaBhGDBDBBECBCHHCCBCCCBSBCyCBCqEBJlFBClBBKoBB44ClBBCGGDqBBDCBhV1CBDFBjkCKBGqBBDCBhCrBBgCMBChBBmD1IBDFBDlBBDFBDHBCGCBdBD0BBCGBCEEBBBCGBEDBDFBFMBGCBCGBmIFFDJBCEEBDBHGCBCBCFBFDDBCBGEBF1B1BB8zC8zCB6DBDmDBHDBEBBNlBBCGGzoetBBTbBnEtCBCWBEDBC9BBDBBCCCBGBZBBE2Z2ZBpBBGIBIvCBh6TGBNEBqgBZBHZBmlBvCBhDjBBFjBB1DKBCOBCGBCBBCKBCOBCGBCBBk2ByBBOyBB+CVBLVB74C-BBhrV-BBhsZ0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDYBCYBCeBCYBCeBCYBCeBCYBCeBCYBCHB15BJBCTBHFB2uCjCB', false)),
|
|
230
|
+
Ll: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBC2BCBQCBuBCDECBBBDCCDEEBFFDEEBBBDDDCCCDCCBCCDEECDDBDDBBBHGDCOCBSCBDDCEEC4BCBFBDDDBCCFICBjCBCaBiGCCEEEBBBTccBhBBCBBECBCWCBDBCGDB0B0BBuBBCgBCK0BCDMCBgDCxBoBBo6CqBBDCB5XFBjkCIBC2D2DBqBBgCMBChBBnD0ECBHBCgDCBHBJFBLHBJHBJFBLHBJHBJNBDHBJHBJHBJEBCBBHEEBBBCBBJDBDBBJHBLCBCBBzIEEBEEcKFDBBJDBF2B2Bs1CvBBCEEBGCFCCBCCBEBGiDCBIICFFNlBBCGG0oesBCUaCoEMCBBBC+BCBGBCCCDICFCCDCCBBBCSCGGGCMCFCCDEECICbEE2ZqBBGIBIvCBh6TGBNEBqhBZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfB7sZZBbGBCRBbZBbDBCCCBFBCKBbZBbZBbZBbZBbZBbZBbZBbZBbbBdYBCFBbYBCFBbYBCFBbYBCFBbYBCFBC15B15BBIBCTBHFB4vChBB', false)),
|
|
231
|
+
Lm: () => new UnicodeRangeTable(decodeRanges('wVRBFLBPEBICCmEGG-OnHnHlFBBuIBBFgBgBKEEhFoFoF1mBgEgE2R72B72BsDkTkTxOFBvF+BBOjBjBBjBByVOORMBg-CBByHgGgG2OsBsBBDBGiDiDB+C+CBBB34bjnBjnBBEBvIzDzDdBB6DIBxCYYqDCBEBB2OXXqEtDtDWBBoDDBKngVngVuBBBh-BFBCpBBCIB0sBhBhBxuXDB9PCBpBBBnRMBhCBBCtgQtgQBCBCGBCBByhM9BBqGGBudgjBgjB', false)),
|
|
232
|
+
Lo: () => new UnicodeRangeTable(decodeRanges('qFQQhIFFBCBxG8Z8ZBZBFDBuBfBCJBkBBBCiDBCZZBLLBBBDRRCdBe4CBMZZBfBWVBrBYBIKBGXBCFBSoBB8B1BBETTIJBROBFHBDBBDVBCGBCEEBCBERROBBCCBPBBLJJBEBFBBDVBCGBCBBCBBCBBgBDBCUUBBBRIBCCBCVBCGBCBBCEBETTQBBYMMBGBDBBDVBCGBCBBCEBEffBCCBBBQSSCFBECBCDBEBBCCCBEEBEEBBBELBX1B1BBGBCCBCWBCPBEbbBBBDDDBffFHBCCBCWBCJBCEBEgBgBBCCBQQBSSBHBCCBCoBBDRRGCBJCBZFBGRBEXBCIBCDDBFB7BvBBCBBNFB8BBBCCCBDBCXBCCCBIBCBBKDDBDBYDBhBgCgCBGBCjBBcEB0DqBBVRRBEBFDBEEEBIIBBBFMBNyDyDBnKBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBmBPByDrTBDQBCZBGqCBHHBIRBOSBPRBPMBCCBQzBBpBkCkCBhBBC0BBIEBDhBBCGGBkCBLeByBdBDEBMrBBFZB3BWBK0BBxFuBBSHB3BdBOBBLrBBbjBBqBCBLdByDDBCFBCBBE7hB7hBBCB4-C3BBZWBKGBCGBCGBCGBCGBCGBCGBCGBoR2B2BF1CBJCCB4CBFGGBpBBC9CBSfBxBPBhQ-tGBhC0wUBC2jBBkCnBBJrIBFPBLBBjCyByBBkCBqFoDoDEGBCCBCDBCWBezBBPxBB-BFBECCBMMBaBLWBacBIuBBuBEBDIBLEBCoBBYCBCHBVPBCFBEEEBwBBCEEBDDBDBDCCZBBEKBIPPBEBDFBDFBKGBCGByEiBBej9KBNWBFwBBloItLBDpDBkCCCBIBCMBCEBCCCBCCBCCBqDBiBqLBT-BBD1BBpBLB1DEBCmEBqDJBCsBBDeBEFBDFBDFBDCBkBLBCZBCSBCBBCOBDNBjB6DBmMcBEwBBwBfBOTBCHBHlBBLdBDjBBFHBhEtCBjDnBBJzBB9CzBBN2JBKVBLHB5EFBDCCBqBBCBBEDDBVBLWBKeBiCSBCBBLVBLZBnC3BBHBBhCQQBCBCCBCcBrBcBEcBkBHBCbBc1BBLVBLSBORBvDoCB4FjBBnBDBCxJxJBoBBHBBRCB8BcBLJJBUBrBRBvBUBcWBN0BB6BBBDOOBrBBhBYBbjBBeDDJiBBENNBuBBPDBWCCkBRBCYBUBBgCGBCCCBCBCOBCJBIuBBnBHBDBBDVBCGBCBBCEBETTNEBfJBCDDClBBCaaCtBtBBzBBTDBVCBfvBBVBBC5F5FBtBBqBDBlBvBBV8B8BBpBBOoCoCBZBmBGB6FrBB0GHBDDDBGBCBBCXBQCC-CHBDmBBRCCdLLBmBBIWWMtBBUTTBnCBoGgBBgBIBCkBBSyByBBcBxDGBCBBClBBWaaBEBCBBCfBPoKoKBRBQCCBLBChBB9DwCwCB4cBnHjGBtyCgDBQvhBBSFBa68DBGmSB61GdBj3B4RBIeBSuCBSdBTvBB0BUBGSB0NnBB2MqCBGwFwFB2-FBJ1mBBqBJB43IiJBQeeBBBDPPBCBJrMBloCqDBGMBEIBIJBxzI2P2PBrBBiBiKiKBcBTrBBlPaBmHdBDwPwPBFBCDBCBBCOBCkGB8pBDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQBlqE-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
233
|
+
Lt: () => new UnicodeRangeTable(decodeRanges('lOGDnB2sH2sHBGBJHBJHBNQQwBAB', false)),
|
|
234
|
+
Lu: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiB2BCDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIJDCMCDQCDDDCCBC4BCIBBCBBDCCBCBCGCiJCCEJJHCCBBBCCCBCCBPBCIBkBDDBBBEWCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBpCDBNDBNDBNEBMDBnIFFECBDCBDEEBDBHGCBCBDDBLBBG+B+B9zCvBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEEGGCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBhtZZBbZBbZBbCCBGDBDDBCBCHBbZBbBBCDBDHBCGBcBBCDBCEBCEEBFBcZBbZBbZBbZBbZBbZBfYBiBYBiBYBiBYBiBYBiB2pE2pEBgBB', false)),
|
|
235
|
+
M: () => new UnicodeRangeTable(decodeRanges('gYvDB0IGBoIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCgBB3BCBCRBCGBLBBeCB5BCCBFBDBBDCBKLLBbbDCB5BCCBDBFBBDCBEffBEEMCB5BCCBGBCCBCCBVBBXFBCCB5BCCBFBDBBDCBICBLBBf8B8BBDBECBCDBKpBpBBDB4BCCBFBCCBCDBIBBMBBeCB5BCCBFBCCBCDBIBBMBBQNNBCB4BBBCGBCCBCDBKLLBeeBBBnCFFBEBCCCBGBTBB+BDDBFBNHBjDDDBHBMGBqCBBcECFBByBTBCBBGKBCjBBKlDlDBSBYDBFCBCCBDGBEDBOLBCLLBCBgWCBzdDBdCBeBBfBBhCfBKuBuBBBBC2D2DBjBjB3DLBFLB8GEB6BJBCcBDxBxBBdByBEBwBQBnBIBNCBfMB5BNBxBTB5ECBCUBFHHDCBnG-BBxWgBB--CCBuEhDhDBeBrRFBqDBB1udDBCJBhBBBxCBBxIEEFYYBDBF0C0CBzBzBBQBbRBOnBnBBGBaMBtBDBwBNBlBkCkCBMBNJJBuBuBBBBzBCCBBBDBBGBBCqBqBBDBGBBtHHBCBBx5TiXiXBOBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB7DCB2BOBqBDDBLLBCBuBKBI+B+BBBBlBNBRBBtBNNBBBxBNBJDBCBB9CLBHDD+ELBWDB4BBBCGBDBBDCBKLLBDDBFBEEBkCIBCDDCDBCEBCPPBzCzCBQBYyCyCBSBsHGBDIBcBBzCQBrDMBmDOBhIOB2HFBCBBDDBCCCBuEuEBFBDGBEddBIBpBGBCDBJKKBJBvBPB2MHBCHBzCVBCNB7DFBECCBCCBFBCjCjCBDBCBBCEB8KDBKBBCxBxBBFBEEBYmnFmnFHOBpmLRBhuCEB8BGB5gBCCB1BBIDByCMMBslTslTBizEizEBsBBDWB-QEBEFBJHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
|
|
236
|
+
Mc: () => new UnicodeRangeTable(decodeRanges('joC4B4BDCBJDBCBBzBBB7BCBHBBDBBLsBsB7BCBjC7B7BBBBJCCB2B2BB7B7BCHHBDDBLLnDBBCBBECBCCBLqBqBBBB+BDB+BBB7BCCBDBDBBCBBKBBdPPB7B7BBBBGCBCCBLrBrBBsCsCBBBHHBTBBrKBBgCsFsFBFFHDDBaaBLLBBBDGBWBBDFBDLLBBB5zBffiEIIBGBCBB7KDBDCBFBBCFBhHBB7BCCKCCBJJBEByExBxBGCCBDBCBB+BffFBBD9B9BDCBCEEBxBxBBGBJBBsFWW35EBB0-dBBD5C5CBzBzBBOBvEBBwBxBxBBFFBDDBBBvDBBDBBZuBuBCuDuDDBBGuHuHBCCBCCBCC0gZCCgEuBuBBBBFBB0DZZB8B8BxBCBKBBO+C+CBBBEBBCrFrFBBBgBBB7BBBCDBDBBDCBKLLB1C1CBBBIDDCDBCBBCmDmDBBBJBBErDrDBBBHCCBCBDuHuHBBBHDBDyDyDBBBJBBCuDuDCBBHoDoDCBBFmImIBBBK4H4HBEBCBBFDDCvEvEBBBJDBF1C1CeBB-B4M4MPrDrDIDD2GEBFBBC-K-KBNNxBBBJBBCpvQpvQBBBlxD2BBpDBB0rYBBHFB', false)),
|
|
237
|
+
Me: () => new UnicodeRangeTable(decodeRanges('okBBB1xF-wB-wBBCBCCBsshBCB', false)),
|
|
238
|
+
Mn: () => new UnicodeRangeTable(decodeRanges('gYvDB0IEBqIsBBCCCBCCBCCpCKBxBUBRmDmDBFBDFBDBBCDBkBffBZB8CKB7BIBKZZBCBCIBCCBCEBsBCB8BIBrBXBCfB4BCCFHBFEEBFBLBBe7B7BFDBJVVBbbDBB6BFFBFFBDDBBBEffBEEMBB6BFFBDBCBBFVVBXXBEBC7B7BDCCBCBJIIBMMBff+BNNzBEE4BCCBBBGCBCDBIBBMBBe7B7BDHHGBBVBBdBB6BBBFDBJVVBeepCIIBBBC7C7CDGBNHBjDDDBHBMGBqCBBcEC4BNBCEBCBBGKBCjBBKnDnDBCBCFBCBBDBBaBBFCBRDBODDBHHQgWgWBBBzdCBeBBfBBfBBhCBBCGBJDDBJBKuBuBBBBC2D2DBjBjB3DCBFBBKHHBBB8GBBD7B7BCGBCCCDHBHJBDxBxBBMBCPByBDBxBCCBDBCGGpBIBNBBhBDBDBBCCB5BCCBEECCB7BHBDBB5ECBCMBCGBFHHEBBnG-BBxWMBFEEBKB--CCBuEhDhDBeBrRDBsDBB1udFFBIBhBBBxCBBxIEEFaaBGG4EBBbRBOnBnBBGBaKBvBCBxBDDBCBDBBoBkCkCBEBDBBDBBNJJwB0B0BCCBDBBGBBCrBrBBJJvHDDFx5Tx5TiXPBRPBuejHjH2EEBn0BCBCBBGDBpBCBFmFmFB+R+RBCBiCEB+JBBwCDBnCKByBDB8D3B3BBNBqBDDBLLBBByBDBDBBI+B+BBBBlBEBCHB-BNNB1B1BBHBLDBDgDgDBBBDCCBHHD+E+EEHBWBB6BBBEmBmBBFBEEBnCFBOECPBB2CHBDCBCYY1CFBCFFBCCBvHvHBCBHBBCBBcBB2CHBDCCBrDrDCDDBEBCmDmDCDDBCBCEBkIIBCBBhIBBCFFxEDBDBBFhBhBBIBpBFBDDBJKKBEBDCBvBMBCBB3MGBCFBCzCzCBUBDGBCBBCBB7DFBECCBCCBFBCpCpCBEEC8K8KBMMB1B1BBDBGCCYmnFmnFHOBpmLLBECBhuCEB8BGB5gBgCgCBCByC5lT5lTBizEizEBsBBDWBhRCBSHBDGBfDB1ECB89B2BBFxBBJPPXEBCOBxqBGBCQBDGBCBBCEBlDhFhFBFB4L+B+BBCB9PDB-HBBhXGBuDGB29lYvHB', false)),
|
|
239
|
+
N: () => new UnicodeRangeTable(decodeRanges('wBJB5DBBGDDBBBitBJBnEJBnGJB9MJB3DJBFFBtDJB3DJB3DJBDFBvDMB0DJBJGBoDJBpDGBISBuDJBhDJB3DJBnCTBtIJBnCJBwWTBybCBwHJBHJBXJBtJJBhEKBmFJBHJB3FJB3CJBnEJBHJB3gBEEBEBHJBnGyBBDEB3W7BBvCVB3TdBqrBqYqYaIBPCB4KDBrEJBfHBCOBhBJBoBOBh7cJB9FJBhKFB7EJBnBJBnGJBXJB3CJB3MJB34UJBuPsBBN4BBSBB2KaBlBDBeJJnEEBrGJBvdHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBxBJBHJB3IeB-EJBrBDBxDGBnEdBhEJB9BJBxEJBITB8HJB3KJB3DJB3LJBnDJBHTBtCLBlNSB+CJB3UJB3CcBkHJBnCJBnNJBnDUBshBuDBimPJBnpCJB3CJBnEJBCGBvQJBnIWB6yXJBnuBTBNTBtDYB2iBxBBhqCJBnNJB3PJB4HJBtWIBhEJB4Y6BBCCBCDBtCsBBCOBjeMBk3CJB', false)),
|
|
240
|
+
Nd: () => new UnicodeRangeTable(decodeRanges('wBJnxBJnEJnGJ9MJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJ3DJhDJ3DJnCJ3IJnCJn6BJnBJtJJhEJnFJHJ3FJ3CJnEJHJnuiBJnVJnBJnGJXJ3CJ3MJ34UJnsBJnkCJHJ9YJhEJ9BJxEJ3IJ3KJ3DJ3LJnDJHTtCJnNJnDJ3UJ3CJ3HJnCJnNJ3uQJnpCJ3CJnEJ3QJ37XJ12CxBhqCJnNJ3PJ4HJ2aJ30EJ', true)),
|
|
241
|
+
Nl: () => new UnicodeRangeTable(decodeRanges('u3FCBwzCiBBDDB-zDaaBHBPCBs1dJBxyW0BBtOJJnEEBrhIuDB', false)),
|
|
242
|
+
No: () => new UnicodeRangeTable(decodeRanges('yFBBGDDBBB2pCFB5LFB5DCBmEGB6GGBSIByNJB2hBTB0jBJBhP20B20BEFBHJBnGPBqB3W3WB6BBvCVB3TdBqrB1kB1kBBCBrEJBfHBCOBhBJBoBOBxrdFBymWsBBiCDBSBB2KaBlBDB1pBHBaGBoBIBsCEBXFBhFBBDPBDtBBhCIB1BBBfCBsCEBpDHBZHBqBGBrKFBhLeB-EJBrBDBxDGBnETB8LTBmqBBBvNIBobSB0aUBn8SGB-YWBqhZTBNTBtDYBvqFIBid6BBCCBCDBtCsBBCOBjeMB', false)),
|
|
243
|
+
P: () => new UnicodeRangeTable(decodeRanges('hBCBCFBCDBLBBEBBbCBCccCkBkBGEELBBEEE-VJJzOFBqBBB0BCCDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCmBmBBCBoCrCrCBDBFBBwDFBsFlTlTBHB4EuTuTtBBBvCCBoCBB+ECBCCBmBKB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBM9Z9ZBWBJTBCMBCLBfBBPBB6TDBeBB+hBNBwCBBgBJB0MVBgCDBhBBB8XDBCBBxDwEwEBtBBCfBDLBkNCBFJBDLBRNNjD7C7CjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HzqUzqUBxGxGBIBXiBBCNBCFFCBB2ECBCFBCDBLBBEBBbCBCccCCCBFB7MCB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDByO-J-JoFEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
|
|
244
|
+
Pc: () => new UnicodeRangeTable(decodeRanges('-Cg-Hg-HBUU-u3BBBZCBwHAB', false)),
|
|
245
|
+
Pd: () => new UnicodeRangeTable(decodeRanges('tB9qB9qB0BiyDiyDmgBqgCqgCBEBiwDDDgBBBFdd-NUUwDxszBxszBBmBmBLqFqFhzD-J-J', false)),
|
|
246
|
+
Pe: () => new UnicodeRangeTable(decodeRanges('pB0B0BgB+1D+1DC-6B-6BqtC4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECtBGCtNICEGCDBB-ozB6G6GeOCESSCCCrF0B0BgBGD', false)),
|
|
247
|
+
Pf: () => new UnicodeRangeTable(decodeRanges('7F+6H+6HEddpuDCCFDDQEE', false)),
|
|
248
|
+
Pi: () => new UnicodeRangeTable(decodeRanges('rFt7Ht7HDBBDaapuDCCFDDQEE', false)),
|
|
249
|
+
Po: () => new UnicodeRangeTable(decodeRanges('hBCBCCBDECBLLBEEBcclCGGPBBI-V-VJzOzOBEBqB3B3BDDDtBBBVBBCBBOCCBBBrCDBnDsBsBBMBqHCB3BOBgBmImIBLLtE5D5D6DnMnMNwLwL7CLLBpFpFBNBCxDxDrCEBFBBwDFBsFlTlTBHBmY9D9DBBBoCBB+ECBCCBmBFBCDB6JBB5GBBhEGBCFBhFBBLGBdCB9DDB8BEB-BBBhCHBMjajaBJJBGBJIBDDBDCBEKBCCCBIB7kDDBCBBxDwEwEBFFBBBDDDBHBCBBCDDBLLBDBCJBDDBCCCBLBDCBtNCB6B+F+FjgdBBuICBkDLL0DFB9LDB3CBBpBCBCyByBBwBwBiDMBRBB9DDB-DBBRBB6HlxUlxUBFBDXXVBBDDBECBCDBICBHCCB2E2EBBBCCBDECBLLBEEBcclBDDB7M7MBBB9UxBxB-MoXoXoGgBgBxIIBnBxDxDBFBjCGB6CDB5dEBtBDB+FGBuDBBCDB-DDBxBBBwCDBFOOCCB5CFBsDrJrJBCCBzDzDBDBLBBCpDpD7HWBqDCBdMBtCjEjEBBB9HpIpIBBB8E9C9CBGB0CCBCEB+CJB4GgDgDBDBrBBBmUBBrCMBwFxjBxjBBDB97CBB8zOBBmEiCiCBDBJpRpRBBBoJDBoK9lT9lTovHEB07C-a-aBAB', false)),
|
|
250
|
+
Ps: () => new UnicodeRangeTable(decodeRanges('oBzBzBgB-1D-1DC-6B-6B-rCEEnB4B4BQ7T7TCff-hBMCxChBhBCGC1MUChCCCiBmhBmhBCECaTTCECtNICEGCDipzBipzB4GeeCMCESSCCCrFzBzBgBEEDAB', false)),
|
|
251
|
+
S: () => new UnicodeRangeTable(decodeRanges('kBHHRCBgBCCcCCkBEBCBBDCCBCBDEEfgBgBrODBNNBGGBCCCBPB2DPPBxDxDsErIrIBBB3DCBDDDBvGvGLUUB4H4HIBBpEqLqLBHHB2H2H-DjEjEBGBlEwGwGqBmGmGiGCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WuLuLlL+E+EBgBBiLJBKIBhiBCCBBBMCBOCBOCBOBBmCOOoBCBOCBUgBBgCBBCDBCBBLCCBBBGFBCECFMMBFFBDBGDBC7B7BBFFB2LBFcBD+HBXKByCtCBXnTBtBwBBDeBLyMBX+BBFfBD1LBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBB8CBB0HBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BB6RWBKBBoDBB+EDBLDB+RCBiHPPB+9T+9TpEQB+LPBgEtBtBBCBjDCCBBBD7E7EHRRBBBgBCCcCCiEGBCGBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwSmWmWBwtCwtC2kCcBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBrbaagBaagBaagBaagBaa9B-PB4BDBzBHBCNBCBBp2BwNwNttCEE+DiOiOBvIvIBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
|
|
252
|
+
Sc: () => new UnicodeRangeTable(decodeRanges('kB+D+DBCBqnB8D8DzPBBzPBBI2H2HoImSmS8sClmClmCBfB47hBkuVkuVtD7E7E8GBBEBB3-HDB-4wBxtCxtC', false)),
|
|
253
|
+
Sk: () => new UnicodeRangeTable(decodeRanges('+CCCoCHHFEEqQDBNNBGGBCCCBPB2DPPBjoBjoB15FCCBBBMCBOCBOCBOBB9kEBBkzdWBKBBoDBBxePPBniUniUBPB8bCCjF4g9B4g9BBDB', false)),
|
|
254
|
+
Sm: () => new UnicodeRangeTable(decodeRanges('rBRRBBB+BCCuBFFmBgBgB-XwQwQBBB8xGOOoBCBOCBsEoBoBBDBHlClCBDBGBBFGDIgBgBBDDCgBgBBqIBhBBB7CffBXBpBFB2OKK3BHBwDxKxKBDBDeBLPBhIiEBX+BBFfBDhIBxBUBDFB9+zB5Z5ZCCBlFRRBBB+BCCkEHHBCBitDBBypyBaagBaagBaagBaagBaat5FBB', false)),
|
|
255
|
+
So: () => new UnicodeRangeTable(decodeRanges('mFDDFCCyerIrIBgEgEBvGvGLUUB4H4HkQ2L2LjEFBClElEwGqBqBoMCBQCCBBBDFBVECmEHBCFBCBBGDBmGBBxXJB0WzWzW+EhBBiLJBKIBksBBBCDBCBBLCCBHHBEBCECFMMBPPCBBC7B7BBKKBDBDDBCBBCBBCGBCeBDBBCCCBdBtIHBFTBDGBDwCBCdBanBBHnCBXKByCtCBX2FBCIBC1BBJuDBC3HBtBrBBhC-HBhQvBBWBBHmBBDfBCoDBmHFBmLBBvBZBC4CBN1GBbPBFOOBNNWBBHBBxKBBFJBhBlBBKRRBdBMdBJQQBeBLmBBQ-JBhuG-BBx0V2BBibDBLBBC+R+RBBBn2UPBgEuBuBBBBlPEEFBBOBB6JIB6BQBDCBCMBEwBwBBrBB7zBBBwS3jD3jD2kCHBFQBr6SDBG3qU3qUk7DvHBRzNB9EzDB9B1HBLmBBD7BBGCBXBBIdBF8BBWhCBE7F7FB1CBqlB-PB4BDBzBHBCNBCBBp2B96C96CiEyWyWBqBBFjDBNOBDOBCOBCkBBYgFB5BcBOrBBFIBIBBPFB7E6HBG3WBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBC7CB', false)),
|
|
256
|
+
Z: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBeBBGwBwBh9DAB', false)),
|
|
257
|
+
Zl: () => new UnicodeRangeTable(decodeRanges('ohIA', true)),
|
|
258
|
+
Zp: () => new UnicodeRangeTable(decodeRanges('phIA', true)),
|
|
259
|
+
Zs: () => new UnicodeRangeTable(decodeRanges('gBgEgEgvFgsCgsCBJBlBwBwBh9DAB', false))
|
|
260
|
+
});
|
|
261
|
+
static get Upper() {
|
|
262
|
+
return this.CATEGORIES.get('Lu');
|
|
263
|
+
}
|
|
264
|
+
static SCRIPTS = new LazyMap({
|
|
265
|
+
Adlam: () => new UnicodeRangeTable(decodeRanges('go6DrCFJFB', true)),
|
|
266
|
+
Ahom: () => new UnicodeRangeTable(decodeRanges('g4lCaDOFW', true)),
|
|
267
|
+
Anatolian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggxCmS', true)),
|
|
268
|
+
Arabic: () => new UnicodeRangeTable(decodeRanges('gwBEBCFBCNBCCBCfBCJBMZBCrDBChBBxCvBBxHeBCBBGqCBCcBxy8ByDBRqLBDvCBD1BBIhBhBBOBxDEBCmEBk7DeBkCCB4BDBh43BDBCaBCBBCDDCJBCDBCCCHFFCECBBBCBBCDDCICBCCDDBCGBCDBCDBCCCBIBCQBGCBCEBCQB1BBB', false)),
|
|
269
|
+
Armenian: () => new UnicodeRangeTable(decodeRanges('xpBlBDxBDCks9BE', true)),
|
|
270
|
+
Avestan: () => new UnicodeRangeTable(decodeRanges('g4iC1BEG', true)),
|
|
271
|
+
Balinese: () => new UnicodeRangeTable(decodeRanges('g4GsCCxB', true)),
|
|
272
|
+
Bamum: () => new UnicodeRangeTable(decodeRanges('g1pB3CpowB4R', true)),
|
|
273
|
+
Bassa_Vah: () => new UnicodeRangeTable(decodeRanges('w26CdDF', true)),
|
|
274
|
+
Batak: () => new UnicodeRangeTable(decodeRanges('g+GzBJD', true)),
|
|
275
|
+
Bengali: () => new UnicodeRangeTable(decodeRanges('gsCDBCHBDBBDVBCGBCEEBCBDIBDBBDDBJFFBCCBDBDYB', false)),
|
|
276
|
+
Bhaiksuki: () => new UnicodeRangeTable(decodeRanges('ggnCICsBCNLc', true)),
|
|
277
|
+
Bopomofo: () => new UnicodeRangeTable(decodeRanges('qXB6wLqBxDf', true)),
|
|
278
|
+
Brahmi: () => new UnicodeRangeTable(decodeRanges('ggkCtCFjBKA', true)),
|
|
279
|
+
Braille: () => new UnicodeRangeTable(decodeRanges('ggK-H', true)),
|
|
280
|
+
Buginese: () => new UnicodeRangeTable(decodeRanges('gwGbDB', true)),
|
|
281
|
+
Buhid: () => new UnicodeRangeTable(decodeRanges('g6FT', true)),
|
|
282
|
+
Canadian_Aboriginal: () => new UnicodeRangeTable(decodeRanges('ggF-TxRlC7tgCP', true)),
|
|
283
|
+
Carian: () => new UnicodeRangeTable(decodeRanges('g1gCwB', true)),
|
|
284
|
+
Caucasian_Albanian: () => new UnicodeRangeTable(decodeRanges('wphCzBMA', true)),
|
|
285
|
+
Chakma: () => new UnicodeRangeTable(decodeRanges('gokC0BCR', true)),
|
|
286
|
+
Cham: () => new UnicodeRangeTable(decodeRanges('gwqB2BKNDJDD', true)),
|
|
287
|
+
Cherokee: () => new UnicodeRangeTable(decodeRanges('g9E1CDFz7lBvC', true)),
|
|
288
|
+
Chorasmian: () => new UnicodeRangeTable(decodeRanges('w9jCb', true)),
|
|
289
|
+
Common: () => new UnicodeRangeTable(decodeRanges('AgCBbFBbuBBCOBCEBYgBgBiOmBBGEBDTB1DKKHCC+THHPEEhB9E9ElQiEiEB6mB6mB2MDBjJwvBwvBBBBoCBBsGBBCumBumBOIIBCBCFBCCBDmYmYBKBD2CBCKBEKBCOBSgBBgClBBCCBDFBCaBCQBqBCBF5UBXKBW-cBhIzTBDfBCoDBhQ9CBzMUBCCCBXBQHBFDB8CBBE7C7CB0E0EBOBhBlBBKxBxBB+BBgBwCBwB5C5CBmFBhuG-BBhoWhBBnDCBmFJB1HhFhFsMPPBzuUzuUBxGxGBIBXiBBCSBCDB0ECCBeBbFBbKBLuBuBBhChCBFBCGBLEBjICBFsBBEIBxCMB0BsBBlHaBltuBDB96D5HBHzNB9EzDB9B1HBLmBBD9BBEQBJBBIdBF8BB2GTBNTBN2CBKYBoE0CBCmCBCBBDDDBDDBCBCLBCCCBFBCgCBCDBDHBCGBCbBCDBCEBCEEBFBCzKBDjJBDxBByjFjCBtC8BBjWrBBFjDBNOBDOBCOBCkBBLtFB5BZBCBBOrBBFIBIBBPFB7E3eBFQBEMBE2DBF+CBHLBFQQBKBF3BBJJBHnBBJdBDLBFBB-BzKBNNBDMBEJBG3BBIOBDKBHIBIyEBClDBoghYffB+CB', false)),
|
|
290
|
+
Coptic: () => new UnicodeRangeTable(decodeRanges('ifNxkKzDGG', true)),
|
|
291
|
+
Cuneiform: () => new UnicodeRangeTable(decodeRanges('ggoC5cnDuDCEMjG', true)),
|
|
292
|
+
Cypriot: () => new UnicodeRangeTable(decodeRanges('ggiCFBDCCBqBBCBBEDD', false)),
|
|
293
|
+
Cypro_Minoan: () => new UnicodeRangeTable(decodeRanges('w8rCiD', true)),
|
|
294
|
+
Cyrillic: () => new UnicodeRangeTable(decodeRanges('ggBkEBDoFBx6FKBhFtCtCojEfBhie-CBv8VBBhw4B9BBiBAB', false)),
|
|
295
|
+
Deseret: () => new UnicodeRangeTable(decodeRanges('gghCvC', true)),
|
|
296
|
+
Devanagari: () => new UnicodeRangeTable(decodeRanges('goCwCFODZh7nBfhwcJ', true)),
|
|
297
|
+
Dives_Akuru: () => new UnicodeRangeTable(decodeRanges('gomCGBDDDBGBCBBCdBCBBDLBKJB', false)),
|
|
298
|
+
Dogra: () => new UnicodeRangeTable(decodeRanges('ggmC7B', true)),
|
|
299
|
+
Duployan: () => new UnicodeRangeTable(decodeRanges('ggvDqDGMEIIJDD', true)),
|
|
300
|
+
Egyptian_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('ggsC1iBL68D', true)),
|
|
301
|
+
Elbasan: () => new UnicodeRangeTable(decodeRanges('gohCnB', true)),
|
|
302
|
+
Elymaic: () => new UnicodeRangeTable(decodeRanges('g-jCW', true)),
|
|
303
|
+
Ethiopic: () => new UnicodeRangeTable(decodeRanges('gwEoCBCDBDGBCCCBCBDoBBCDBDgBBCDBDGBCCCBCBDOBC4BBCDBDiCBDfBEZBnvGWBKGBCGBCGBCGBCGBCGBCGBCGBjpfFBDFBDFBKGBCGBylvCGBCDBCBBCOB', false)),
|
|
304
|
+
Garay: () => new UnicodeRangeTable(decodeRanges('gqjClBEcJB', true)),
|
|
305
|
+
Georgian: () => new UnicodeRangeTable(decodeRanges('glElBBCGGDqBBCDBx8CqBBDCBhiElBBCGG', false)),
|
|
306
|
+
Glagolitic: () => new UnicodeRangeTable(decodeRanges('ggL-Ch9sDGCQDGCBCE', true)),
|
|
307
|
+
Gothic: () => new UnicodeRangeTable(decodeRanges('w5gCa', true)),
|
|
308
|
+
Grantha: () => new UnicodeRangeTable(decodeRanges('g4kCDBCHBDBBDVBCGBCBBCEBDIBDBBDCBDHHGGBDGBEEB', false)),
|
|
309
|
+
Greek: () => new UnicodeRangeTable(decodeRanges('wbDBCCBDDBCFFCCCBBBCCCBSBC+BBPPBnpGEBzBEBFEB1ChKhKBUBDFBDlBBDFBDHBCGCBdBD0BBCOBCNBDFBCSBDCBCIBoJ-xiB-xiB7uVuCBSgj0Bgj0BBkCB', false)),
|
|
310
|
+
Gujarati: () => new UnicodeRangeTable(decodeRanges('h0CCBCIBCCBCVBCGBCBBCEBDJBCCBCCBDQQBCBDLBIGB', false)),
|
|
311
|
+
Gunjala_Gondi: () => new UnicodeRangeTable(decodeRanges('grnCFCBCkBCBCFIJ', true)),
|
|
312
|
+
Gurmukhi: () => new UnicodeRangeTable(decodeRanges('hwCCBCFBFBBDVBCGBCBBCBBCBBDCCBDBFBBDCBEIIBCBCIIBPB', false)),
|
|
313
|
+
Gurung_Khema: () => new UnicodeRangeTable(decodeRanges('go4C5B', true)),
|
|
314
|
+
Han: () => new UnicodeRangeTable(decodeRanges('g0LZBC4CBN1GBwBCCaIBPDBle-tGBhC-vUBhoWtLBDpDBpodBBNBBvgkB-2pBBhB5hEBH9GBDh0FBPwpHBQtTBjtC9QBjvBq6EBG-iEB', false)),
|
|
315
|
+
Hangul: () => new UnicodeRangeTable(decodeRanges('goE-HvxHBiI9CyDeiCei3dckUj9KNWFwBl9JeEFDFDFDC', true)),
|
|
316
|
+
Hanifi_Rohingya: () => new UnicodeRangeTable(decodeRanges('gojCnBJJ', true)),
|
|
317
|
+
Hanunoo: () => new UnicodeRangeTable(decodeRanges('g5FU', true)),
|
|
318
|
+
Hatran: () => new UnicodeRangeTable(decodeRanges('gniCSCBGE', true)),
|
|
319
|
+
Hebrew: () => new UnicodeRangeTable(decodeRanges('xsB2BBJaBFFBpp9BZBCEBCCCBCCBCCBIB', false)),
|
|
320
|
+
Hiragana: () => new UnicodeRangeTable(decodeRanges('hiM1CBHCBi7-C+IBTeeBBBulQAB', false)),
|
|
321
|
+
Imperial_Aramaic: () => new UnicodeRangeTable(decodeRanges('giiCVCI', true)),
|
|
322
|
+
Inherited: () => new UnicodeRangeTable(decodeRanges('gYvDB2IBBlOKBbhXhXBCB8qEeBiQCBCMBCGBFHHEBBnG-BBtQBBjGgBB65DDBsDBBmrzBPBRNBwejHjH7iEl+uBl+uBBsBBDWBhRCBSHBDGBfDBz6rYvHB', false)),
|
|
323
|
+
Inscriptional_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g7iCSGH', true)),
|
|
324
|
+
Inscriptional_Parthian: () => new UnicodeRangeTable(decodeRanges('g6iCVDH', true)),
|
|
325
|
+
Javanese: () => new UnicodeRangeTable(decodeRanges('gsqBtCDJFB', true)),
|
|
326
|
+
Kaithi: () => new UnicodeRangeTable(decodeRanges('gkkCiCLA', true)),
|
|
327
|
+
Kannada: () => new UnicodeRangeTable(decodeRanges('gkDMCCCWCJCEDICCCDIBHBCDDJCC', true)),
|
|
328
|
+
Katakana: () => new UnicodeRangeTable(decodeRanges('hlM5CBDCBxHPBxGuBBC3CBvgzBJBCsBBzisBDBCGBCBBCgJgJBBBzBPPBCB', false)),
|
|
329
|
+
Kawi: () => new UnicodeRangeTable(decodeRanges('g4nCQCoBEc', true)),
|
|
330
|
+
Kayah_Li: () => new UnicodeRangeTable(decodeRanges('goqBtBCA', true)),
|
|
331
|
+
Kharoshthi: () => new UnicodeRangeTable(decodeRanges('gwiCDCBGHCCCcDCFJII', true)),
|
|
332
|
+
Khitan_Small_Script: () => new UnicodeRangeTable(decodeRanges('k-7C84G84GB0OBqBAB', false)),
|
|
333
|
+
Khmer: () => new UnicodeRangeTable(decodeRanges('g8F9CDJHJnPf', true)),
|
|
334
|
+
Khojki: () => new UnicodeRangeTable(decodeRanges('gwkCRCuB', true)),
|
|
335
|
+
Khudawadi: () => new UnicodeRangeTable(decodeRanges('w1kC6BGJ', true)),
|
|
336
|
+
Kirat_Rai: () => new UnicodeRangeTable(decodeRanges('gq7C5B', true)),
|
|
337
|
+
Lao: () => new UnicodeRangeTable(decodeRanges('h0DBBCCCBDBCXBCCCBVBDEBCCCBFBCJBDDB', false)),
|
|
338
|
+
Latin: () => new UnicodeRangeTable(decodeRanges('hCZBHZBwBQQGWBCeBCgOBoBEB8wGlBBHwBBGDBGMBClCBiC-HByLOORMBuEBBHccSoBB42CfBj1elDBEiCBDBBCCCBGBWNBxZqBBCIBCDB38TGB7gBZBHZBmhCFBCpBBCIBm61BeBHFB', false)),
|
|
339
|
+
Lepcha: () => new UnicodeRangeTable(decodeRanges('ggH3BEOEC', true)),
|
|
340
|
+
Limbu: () => new UnicodeRangeTable(decodeRanges('goGeBCLBFLBFEEBKB', false)),
|
|
341
|
+
Linear_A: () => new UnicodeRangeTable(decodeRanges('gwhC2JKVLH', true)),
|
|
342
|
+
Linear_B: () => new UnicodeRangeTable(decodeRanges('gggCLCZCSCBCODNjB6D', true)),
|
|
343
|
+
Lisu: () => new UnicodeRangeTable(decodeRanges('wmpBvBx1eA', true)),
|
|
344
|
+
Lycian: () => new UnicodeRangeTable(decodeRanges('g0gCc', true)),
|
|
345
|
+
Lydian: () => new UnicodeRangeTable(decodeRanges('gpiCZGA', true)),
|
|
346
|
+
Mahajani: () => new UnicodeRangeTable(decodeRanges('wqkCmB', true)),
|
|
347
|
+
Makasar: () => new UnicodeRangeTable(decodeRanges('g3nCY', true)),
|
|
348
|
+
Malayalam: () => new UnicodeRangeTable(decodeRanges('goDMCCCyBCCCFFPDZ', true)),
|
|
349
|
+
Mandaic: () => new UnicodeRangeTable(decodeRanges('giCbDA', true)),
|
|
350
|
+
Manichaean: () => new UnicodeRangeTable(decodeRanges('g2iCmBFL', true)),
|
|
351
|
+
Marchen: () => new UnicodeRangeTable(decodeRanges('wjnCfDVCN', true)),
|
|
352
|
+
Masaram_Gondi: () => new UnicodeRangeTable(decodeRanges('gonCGBCBBCrBBECCBCCBHBJJB', false)),
|
|
353
|
+
Medefaidrin: () => new UnicodeRangeTable(decodeRanges('gy7C6C', true)),
|
|
354
|
+
Meetei_Mayek: () => new UnicodeRangeTable(decodeRanges('g3qBWqGtBDJ', true)),
|
|
355
|
+
Mende_Kikakui: () => new UnicodeRangeTable(decodeRanges('gg6DkGDP', true)),
|
|
356
|
+
Meroitic_Cursive: () => new UnicodeRangeTable(decodeRanges('gtiCXFTDtB', true)),
|
|
357
|
+
Meroitic_Hieroglyphs: () => new UnicodeRangeTable(decodeRanges('gsiCf', true)),
|
|
358
|
+
Miao: () => new UnicodeRangeTable(decodeRanges('g47CqCF4BIQ', true)),
|
|
359
|
+
Modi: () => new UnicodeRangeTable(decodeRanges('gwlCkCMJ', true)),
|
|
360
|
+
Mongolian: () => new UnicodeRangeTable(decodeRanges('ggGBBDCCBSBH4CBIqBB2t-BMB', false)),
|
|
361
|
+
Mro: () => new UnicodeRangeTable(decodeRanges('gy6CeCJFB', true)),
|
|
362
|
+
Multani: () => new UnicodeRangeTable(decodeRanges('g0kCGBCCCBCBCOBCKB', false)),
|
|
363
|
+
Myanmar: () => new UnicodeRangeTable(decodeRanges('ggE-EhqmBeiDfxibT', true)),
|
|
364
|
+
Nabataean: () => new UnicodeRangeTable(decodeRanges('gkiCeJI', true)),
|
|
365
|
+
Nag_Mundari: () => new UnicodeRangeTable(decodeRanges('wm5DpB', true)),
|
|
366
|
+
Nandinagari: () => new UnicodeRangeTable(decodeRanges('gtmCHDtBDK', true)),
|
|
367
|
+
New_Tai_Lue: () => new UnicodeRangeTable(decodeRanges('gsGrBFZHKEB', true)),
|
|
368
|
+
Newa: () => new UnicodeRangeTable(decodeRanges('gglC7CCE', true)),
|
|
369
|
+
Nko: () => new UnicodeRangeTable(decodeRanges('g+B6BDC', true)),
|
|
370
|
+
Nushu: () => new UnicodeRangeTable(decodeRanges('h-7CvsQvsQBqMB', false)),
|
|
371
|
+
Nyiakeng_Puachue_Hmong: () => new UnicodeRangeTable(decodeRanges('go4DsBENDJFB', true)),
|
|
372
|
+
Ogham: () => new UnicodeRangeTable(decodeRanges('g0Fc', true)),
|
|
373
|
+
Ol_Chiki: () => new UnicodeRangeTable(decodeRanges('wiHvB', true)),
|
|
374
|
+
Ol_Onal: () => new UnicodeRangeTable(decodeRanges('wu5DqBFA', true)),
|
|
375
|
+
Old_Hungarian: () => new UnicodeRangeTable(decodeRanges('gkjCyBOyBIF', true)),
|
|
376
|
+
Old_Italic: () => new UnicodeRangeTable(decodeRanges('g4gCjBKC', true)),
|
|
377
|
+
Old_North_Arabian: () => new UnicodeRangeTable(decodeRanges('g0iCf', true)),
|
|
378
|
+
Old_Permic: () => new UnicodeRangeTable(decodeRanges('w6gCqB', true)),
|
|
379
|
+
Old_Persian: () => new UnicodeRangeTable(decodeRanges('g9gCjBFN', true)),
|
|
380
|
+
Old_Sogdian: () => new UnicodeRangeTable(decodeRanges('g4jCnB', true)),
|
|
381
|
+
Old_South_Arabian: () => new UnicodeRangeTable(decodeRanges('gziCf', true)),
|
|
382
|
+
Old_Turkic: () => new UnicodeRangeTable(decodeRanges('ggjCoC', true)),
|
|
383
|
+
Old_Uyghur: () => new UnicodeRangeTable(decodeRanges('w7jCZ', true)),
|
|
384
|
+
Oriya: () => new UnicodeRangeTable(decodeRanges('h4CCCHDBDVCGCBCEDIDBDCICFBCEDR', true)),
|
|
385
|
+
Osage: () => new UnicodeRangeTable(decodeRanges('wlhCjBFjB', true)),
|
|
386
|
+
Osmanya: () => new UnicodeRangeTable(decodeRanges('gkhCdDJ', true)),
|
|
387
|
+
Pahawh_Hmong: () => new UnicodeRangeTable(decodeRanges('g46ClCLJCGCUGS', true)),
|
|
388
|
+
Palmyrene: () => new UnicodeRangeTable(decodeRanges('gjiCf', true)),
|
|
389
|
+
Pau_Cin_Hau: () => new UnicodeRangeTable(decodeRanges('g2mC4B', true)),
|
|
390
|
+
Phags_Pa: () => new UnicodeRangeTable(decodeRanges('giqB3B', true)),
|
|
391
|
+
Phoenician: () => new UnicodeRangeTable(decodeRanges('goiCbEA', true)),
|
|
392
|
+
Psalter_Pahlavi: () => new UnicodeRangeTable(decodeRanges('g8iCRIDNG', true)),
|
|
393
|
+
Rejang: () => new UnicodeRangeTable(decodeRanges('wpqBjBMA', true)),
|
|
394
|
+
Runic: () => new UnicodeRangeTable(decodeRanges('g1FqCEK', true)),
|
|
395
|
+
Samaritan: () => new UnicodeRangeTable(decodeRanges('ggCtBDO', true)),
|
|
396
|
+
Saurashtra: () => new UnicodeRangeTable(decodeRanges('gkqBlCJL', true)),
|
|
397
|
+
Sharada: () => new UnicodeRangeTable(decodeRanges('gskC-C', true)),
|
|
398
|
+
Shavian: () => new UnicodeRangeTable(decodeRanges('wihCvB', true)),
|
|
399
|
+
Siddham: () => new UnicodeRangeTable(decodeRanges('gslC1BDlB', true)),
|
|
400
|
+
SignWriting: () => new UnicodeRangeTable(decodeRanges('gg2DrUQECO', true)),
|
|
401
|
+
Sinhala: () => new UnicodeRangeTable(decodeRanges('hsDCBCRBEXBCIBCDDBFBEFFBEBCCCBGBHJBDCBt-gCTB', false)),
|
|
402
|
+
Sogdian: () => new UnicodeRangeTable(decodeRanges('w5jCpB', true)),
|
|
403
|
+
Sora_Sompeng: () => new UnicodeRangeTable(decodeRanges('wmkCYIJ', true)),
|
|
404
|
+
Soyombo: () => new UnicodeRangeTable(decodeRanges('wymCyC', true)),
|
|
405
|
+
Sundanese: () => new UnicodeRangeTable(decodeRanges('g8G-BhIH', true)),
|
|
406
|
+
Sunuwar: () => new UnicodeRangeTable(decodeRanges('g+mChBPJ', true)),
|
|
407
|
+
Syloti_Nagri: () => new UnicodeRangeTable(decodeRanges('ggqBsB', true)),
|
|
408
|
+
Syriac: () => new UnicodeRangeTable(decodeRanges('g4BNC7BDCxIK', true)),
|
|
409
|
+
Tagalog: () => new UnicodeRangeTable(decodeRanges('g4FVKA', true)),
|
|
410
|
+
Tagbanwa: () => new UnicodeRangeTable(decodeRanges('g7FMCCCB', true)),
|
|
411
|
+
Tai_Le: () => new UnicodeRangeTable(decodeRanges('wqGdDE', true)),
|
|
412
|
+
Tai_Tham: () => new UnicodeRangeTable(decodeRanges('gxG+BCcDKHJHN', true)),
|
|
413
|
+
Tai_Viet: () => new UnicodeRangeTable(decodeRanges('g0qBiCZE', true)),
|
|
414
|
+
Takri: () => new UnicodeRangeTable(decodeRanges('g0lC5BHJ', true)),
|
|
415
|
+
Tamil: () => new UnicodeRangeTable(decodeRanges('i8CBBCFBECBCDBEBBCCCBEEBEEBBBELBFEBECBCDBDHHPUBm+kCxBBOAB', false)),
|
|
416
|
+
Tangsa: () => new UnicodeRangeTable(decodeRanges('wz6CuCCJ', true)),
|
|
417
|
+
Tangut: () => new UnicodeRangeTable(decodeRanges('g-7CgBgBB2-FBJ-XBhQIB', false)),
|
|
418
|
+
Telugu: () => new UnicodeRangeTable(decodeRanges('ggDMBCCBCWBCPBDIBCCBCDBIBBCCBDDDBCBDJBIIB', false)),
|
|
419
|
+
Thaana: () => new UnicodeRangeTable(decodeRanges('g8BxB', true)),
|
|
420
|
+
Thai: () => new UnicodeRangeTable(decodeRanges('hwD5BGb', true)),
|
|
421
|
+
Tibetan: () => new UnicodeRangeTable(decodeRanges('g4DnCCjBFmBCjBCOCGFB', true)),
|
|
422
|
+
Tifinagh: () => new UnicodeRangeTable(decodeRanges('wpL3BIBPA', true)),
|
|
423
|
+
Tirhuta: () => new UnicodeRangeTable(decodeRanges('gklCnCJJ', true)),
|
|
424
|
+
Todhri: () => new UnicodeRangeTable(decodeRanges('guhCzB', true)),
|
|
425
|
+
Toto: () => new UnicodeRangeTable(decodeRanges('w04De', true)),
|
|
426
|
+
Tulu_Tigalari: () => new UnicodeRangeTable(decodeRanges('g8kCJBCDDClBBCJBCDDCDBCJBCBBJBB', false)),
|
|
427
|
+
Ugaritic: () => new UnicodeRangeTable(decodeRanges('g8gCdCA', true)),
|
|
428
|
+
Unknown: () => new UnicodeRangeTable(decodeRanges('4bBBHDBICCVuMuMnBBBzBBBE4B4BBGBcDBHKBvI9B9BBmDmDBMB8BBByBBBQddBCCMEBgBDDBDBuHJJBDDBXXICCBBBFBBKBBDBBFHBCDBDGGBaaBEEHDBDBBXIIDGDBCCGDBDBBECBCGBFCCBFBSJBEKKEXXIDDGBBLIEBCCBNBFBBNGBIEEJBBDBBXIIDGGBKKBDDBEEBFBEDBDGGBTTBIBDHHBBBEFFBBBDCCDCBDCBECBNDBGCBEFFBCCBEBCNBWEBOEEYRRBKKEFFBFBDEEBCCBFFBLLBFBXEEYLLGBBKEEFGBDFBDFFBLLELBOEE0BEEHDBRBBbEETCBZKKCBBICBCDBHCCJFBLBBELB7BDBekBBDCCGZZCYYBGGCIILBBFfBpClBlBBCBoBlBlBQOOBjBBnGCCBDBCBB6LFFBIICFFBqBqBFBBiBFFBIICFFBQQ6BFFBkCkCBhBhBBBBbFB3CBBHBB+UCB6CGBXIBZIBVLBOEEDLB-CBBLFBLFBbFB6CGBsBEBnCJBgBNNBCBNDBCCBrBBBGKBtBDBbFBMCB-BBBiCeeBMMBEBLFBPBBgBwBBuCnFnFBGB9BCBQCB-BEBsBBBMHBsBEB3QBBHBBnBBBHBBJGCgBBB2BQQPBBHUUBEEKmDmDNBBcOOBBBiBOBiBOBtEDB7UVBMUB14BBBhB+K+KBDBuBCCBDBCBB5BGBDNBZIBI4BI-DhBBb6C6CBKB3GZBxC3C3CBoDoDBDBsB-C-C3CIBxBuzcuzcBBB4BIB9KTB5FHBvGBBDCCJUB8BCBLFB5BHBnCHBNFB1DKBfCBvCMMBCBiB4B4BBHBPBBLBBoDXBdJBHBBHBBHIBIII9BDB-DBBLFBl9KLBYDByBjoIBvLBBrDlBBILBGEBbGGCGD+DPB+NBB3BGBCfBrBFB0BUUFDBGoEoEBCC-FCBHBBHBBHBBECBIIIBIBGBBNbbUDDQBBPhBB8DEBEDBuBCB5COOBBBCuBBvBhEBeCByBOBdDBlBIBfEBsBEBfmBmBBCBPpBB-EBBLFBlBDBlBDBpBHB1BKBNQQIDDMQQIDDBBB1BLB4JIBXJBJXBHrBrBKkCBHBBCtBtBDCBCBBYpCpCBGBKvBBUDDBDBiBCBcEBC-BB5BDBVBBzBDDBDBJEEeBBEDBLGBKGBhCfBoBDBNIB3BCBeBBcEBbGBFLBIvCBqC2BB0BMB0BGBvBHBLFBnBCBeHBDvGBgBrBrBEBBDPBE2BBtBHBrBVBblBBdTBYIBvCDBlBIBlCJBCBBaGBLFB2BTTBGBoBIBhDVVBJBTwBwBB8BBICCFQQMFB8BEBLFBFJJBDDBXXIDDGLLBDDBEEBCCBEBCEBIBBICBGKBLCCBCCnBLLCBBCFFLDDBGBDcB9CGGBcBpCHBLlFB3BBBnBhBBmCKBLFBOSB7BFBLFBVbBcBBQDBY4FB9BjDB0CLBJBBCBBJDDfDDBNNBHBLlCBJBBvBBBMaBpCHB0CMBqCGBL1FBjBNBLFBKuBuBPJBeCBhBBBXPPBnCBIDDtBCBCDDKHBLFBHDDmBDDHGBL1JBaGBSqBqBBBBe0CBCOBzBMB8clDBwDGGBJBlGryCBkDMB3iBJB88DEBoS41GB7Bl2BB6RGBgBLLBCByCLLBEBfBBHJBnCJBLIIWEBUvNB7BlGB8CkDBsCDB6BGBS-BBGKBDNB5-FHB3mBoBBLm3IBFIIDkJkJBNBCcBEBBCNBFHBtMjoCBsDEBOCBKGBLBBJ76DB7HFB1NrCBvBBBYIB1D7BB3HJBoBBBjGUBnC5DBVLBVLB4CIBamEB2CoCoCDBBCBBDBBFNNCIIiCFFBJJIddFGGCCBI1K1KBlJlJB-V-VBNBGQQBuiBBgBFBH0GBISSBIIDGGBDB-BgBBCvDBuBCBPBBLDBD-JBgBQB7BEBCvOBrB1GBsBDBC-OBIFFDQQmGBBRoBBtCDBLDBDwYBlCrCB+BhGBFccDCCBCCLFFCCCBEBCDBCECEDDCBBCICDCCBFFIKFCLLSEBEGGSzBBDtIBtBDBlDLBQBBQQQmBJBvF3BBeMBtBDBKGBDNBH5EB5eDBSCBOCB4DDBgDFBNDBCOBNDB5BHBLFBpBHBfBBNDBD9BB1KLBPBBOCBLEB5BGBQBBMFBKGB0EnDnDBkgBBh3pBfB7hEFB-GBBj0FNBypHOBvThtCB-QhvBBs6EEBhjEwi3VBCdBhD-DBxHvw-FB', false)),
|
|
429
|
+
Vai: () => new UnicodeRangeTable(decodeRanges('gopBrJ', true)),
|
|
430
|
+
Vithkuqi: () => new UnicodeRangeTable(decodeRanges('wrhCKCOCGCBCKCOCGCB', true)),
|
|
431
|
+
Wancho: () => new UnicodeRangeTable(decodeRanges('g24D5BGA', true)),
|
|
432
|
+
Warang_Citi: () => new UnicodeRangeTable(decodeRanges('glmCyCNA', true)),
|
|
433
|
+
Yezidi: () => new UnicodeRangeTable(decodeRanges('g0jCpBCCDB', true)),
|
|
434
|
+
Yi: () => new UnicodeRangeTable(decodeRanges('ggoBskBE2B', true)),
|
|
435
|
+
Zanabazar_Square: () => new UnicodeRangeTable(decodeRanges('gwmCnC', true))
|
|
436
|
+
});
|
|
437
|
+
static FOLD_CATEGORIES = new LazyMap({
|
|
438
|
+
C: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
|
|
439
|
+
Cn: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false)),
|
|
440
|
+
L: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
|
|
441
|
+
LC: () => new UnicodeRangeTable(decodeRanges('latkpBtkpBCAB', false)),
|
|
442
|
+
Ll: () => new UnicodeRangeTable(decodeRanges('hCZBmDWBCGBiBuBCEECDOCDuBCBECEBBCCCBCCBBBDDBCBBCCBEBBCBBCECBCCDCCBCCBBBCCCBEEIBBCBBCBBCOCDQCDBBCCCBBBC4BCIBBCBBDCCBCBCGC3HrBrBCEEJHHCCBCCCBCCBPBCIBkBJJCUCGDDCBBDyBBxBgBCK2BCBMCD+CCDlBBq6ClBBCGGzW1CB0kCHHBpBBDCBhK0ECKgDCKHBJFBLHBJHBJFBMGCJHBZHBJHBJHBJEBMEBMDBNEBMEBqJEEBHHxC9zC9zCBuBBxBCCBBBDGCBCBCDDJCBCgDCJCCFuqeuqeCqBCUaCoEMCE8BCLECBICFCCDCCEUCBDBCEBCOCBCBCCCBEECKCZs5Vs5VBYBmmBnBBpEjBB9EKBCOBCGBCBBr3ByBB+EVB75CfBhsVfBh1ehBB', false)),
|
|
443
|
+
Lt: () => new UnicodeRangeTable(decodeRanges('kOCCBCCBCClBCCtsHHBJHBJHBMQQwBAB', false)),
|
|
444
|
+
Lu: () => new UnicodeRangeTable(decodeRanges('hDZB7BqBqBBWBCHBCuBCEECDOCDsBCDECBBBDCCDEEGDDECBDDDCCCDFFDEECDDECCGBBCBBCBBCOCBSCDBBCEECkBCEQCJDDBCCFICBEBCBBCCCBEEBCCBCBCEBDCCBDDIDDCBBEFBGLLBnFnFsBCCEEEBBBvBDBCdBCBBECBCWCBDBCGD1BvBBCgBCK0BCDMCBgDCyBlBBq6CqBBDCB5XFBjkCIBCvHvHERRzD0ECGGGC8CCBHBJFBLHBJHBJFBMGCJHBJNBzBBBNSSBPPBEEpL2B2Bs1CvBBCEEBGCHDDLiDCJCCFNNBkBBCGG0oesBCUaCoEMCE8BCLCCDICFFFCBBDSCMOCFCCDEEGECb9a9advCBi8UZBumBnBBpEjBB8EKBCOBCGBCBBk4ByBB+DVB75CfBhsVfBj1ehBB', false)),
|
|
445
|
+
M: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
|
|
446
|
+
Mn: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false))
|
|
447
|
+
});
|
|
448
|
+
static FOLD_SCRIPT = new LazyMap({
|
|
449
|
+
Common: () => new UnicodeRangeTable(decodeRanges('8cgBgB', false)),
|
|
450
|
+
Greek: () => new UnicodeRangeTable(decodeRanges('1FwUwU', false)),
|
|
451
|
+
Inherited: () => new UnicodeRangeTable(decodeRanges('5cgBgBlgHAB', false)),
|
|
452
|
+
Latin: () => new UnicodeRangeTable(decodeRanges('y+pBCC', false)),
|
|
453
|
+
Unknown: () => new UnicodeRangeTable(decodeRanges('z+pBCC', false))
|
|
454
|
+
});
|
|
350
455
|
}
|
|
351
456
|
|
|
352
457
|
/**
|
|
@@ -599,7 +704,7 @@
|
|
|
599
704
|
|
|
600
705
|
// Returns the array of runes in the specified Java UTF-16 string.
|
|
601
706
|
static stringToRunes(str) {
|
|
602
|
-
return String(str)
|
|
707
|
+
return Array.from(String(str)).map(s => s.codePointAt(0));
|
|
603
708
|
}
|
|
604
709
|
|
|
605
710
|
// Returns the Java UTF-16 string containing the single rune |r|.
|
|
@@ -870,6 +975,14 @@
|
|
|
870
975
|
endPos() {
|
|
871
976
|
return this.end;
|
|
872
977
|
}
|
|
978
|
+
hasString() {
|
|
979
|
+
return false;
|
|
980
|
+
}
|
|
981
|
+
|
|
982
|
+
// Helper for the exact-literal fast-path execution router
|
|
983
|
+
prefixLength() {
|
|
984
|
+
return 0;
|
|
985
|
+
}
|
|
873
986
|
}
|
|
874
987
|
|
|
875
988
|
// An implementation of MachineInput for UTF-8 byte arrays.
|
|
@@ -881,6 +994,14 @@
|
|
|
881
994
|
this.start = start;
|
|
882
995
|
this.end = end;
|
|
883
996
|
}
|
|
997
|
+
hasString(prefilter, pos) {
|
|
998
|
+
const target = prefilter.bytes;
|
|
999
|
+
if (target.length === 0) return true;
|
|
1000
|
+
|
|
1001
|
+
// Reuse the high-speed indexOf method already implemented below
|
|
1002
|
+
const idx = this.indexOf(this.bytes, target, this.start + pos);
|
|
1003
|
+
return idx !== -1 && idx <= this.end - target.length;
|
|
1004
|
+
}
|
|
884
1005
|
|
|
885
1006
|
// Returns the rune at the specified index; the units are
|
|
886
1007
|
// unspecified, but could be UTF-8 byte, UTF-16 char, or rune
|
|
@@ -957,10 +1078,10 @@
|
|
|
957
1078
|
indexOf(source, target, fromIndex = 0) {
|
|
958
1079
|
let targetLength = target.length;
|
|
959
1080
|
if (targetLength === 0) {
|
|
960
|
-
return -1;
|
|
1081
|
+
return fromIndex <= this.end ? fromIndex : -1;
|
|
961
1082
|
}
|
|
962
|
-
let
|
|
963
|
-
for (let i = fromIndex; i <=
|
|
1083
|
+
let limit = this.end - targetLength;
|
|
1084
|
+
for (let i = fromIndex; i <= limit; i++) {
|
|
964
1085
|
for (let j = 0; j < targetLength; j++) {
|
|
965
1086
|
if (source[i + j] !== target[j]) {
|
|
966
1087
|
break;
|
|
@@ -971,6 +1092,9 @@
|
|
|
971
1092
|
}
|
|
972
1093
|
return -1;
|
|
973
1094
|
}
|
|
1095
|
+
prefixLength(re2) {
|
|
1096
|
+
return re2.prefixUTF8.length;
|
|
1097
|
+
}
|
|
974
1098
|
}
|
|
975
1099
|
|
|
976
1100
|
// |pos| and |width| are in JS "char" units.
|
|
@@ -981,6 +1105,10 @@
|
|
|
981
1105
|
this.start = start;
|
|
982
1106
|
this.end = end;
|
|
983
1107
|
}
|
|
1108
|
+
hasString(prefilter, pos) {
|
|
1109
|
+
const idx = this.charSequence.indexOf(prefilter.str, this.start + pos);
|
|
1110
|
+
return idx !== -1 && idx <= this.end - prefilter.str.length;
|
|
1111
|
+
}
|
|
984
1112
|
|
|
985
1113
|
// Returns the rune at the specified index; the units are
|
|
986
1114
|
// unspecified, but could be UTF-8 byte, UTF-16 char, or rune
|
|
@@ -1026,6 +1154,9 @@
|
|
|
1026
1154
|
const r2 = pos < this.charSequence.length ? this.charSequence.codePointAt(pos) : -1;
|
|
1027
1155
|
return Utils.emptyOpContext(r1, r2);
|
|
1028
1156
|
}
|
|
1157
|
+
prefixLength(re2) {
|
|
1158
|
+
return re2.prefix.length;
|
|
1159
|
+
}
|
|
1029
1160
|
}
|
|
1030
1161
|
class MachineInput {
|
|
1031
1162
|
static fromUTF8(bytes, start = 0, end = bytes.length) {
|
|
@@ -1116,6 +1247,17 @@
|
|
|
1116
1247
|
}
|
|
1117
1248
|
}
|
|
1118
1249
|
|
|
1250
|
+
/**
|
|
1251
|
+
* An exception thrown for internal engine errors, such as corrupted bytecodes.
|
|
1252
|
+
*/
|
|
1253
|
+
class RE2JSInternalException extends RE2JSException {
|
|
1254
|
+
/** @param {string} message */
|
|
1255
|
+
constructor(message) {
|
|
1256
|
+
super(message);
|
|
1257
|
+
this.name = 'RE2JSInternalException';
|
|
1258
|
+
}
|
|
1259
|
+
}
|
|
1260
|
+
|
|
1119
1261
|
/**
|
|
1120
1262
|
* A stateful iterator that interprets a regex {@code RE2JS} on a specific input.
|
|
1121
1263
|
*
|
|
@@ -1318,6 +1460,23 @@
|
|
|
1318
1460
|
}
|
|
1319
1461
|
return this.substring(start, end);
|
|
1320
1462
|
}
|
|
1463
|
+
|
|
1464
|
+
/**
|
|
1465
|
+
* Returns a dictionary map of all named capturing groups and their matched values.
|
|
1466
|
+
* If a group was not matched, its value will be `null`.
|
|
1467
|
+
* @returns {Record<string, string|null>}
|
|
1468
|
+
*/
|
|
1469
|
+
getNamedGroups() {
|
|
1470
|
+
if (!this.hasMatch) {
|
|
1471
|
+
throw new RE2JSGroupException('perhaps no match attempted');
|
|
1472
|
+
}
|
|
1473
|
+
const result = {};
|
|
1474
|
+
for (const name of Object.keys(this.namedGroups)) {
|
|
1475
|
+
result[name] = this.group(name);
|
|
1476
|
+
}
|
|
1477
|
+
return result;
|
|
1478
|
+
}
|
|
1479
|
+
|
|
1321
1480
|
/**
|
|
1322
1481
|
* Returns the number of subgroups in this pattern.
|
|
1323
1482
|
*
|
|
@@ -1742,16 +1901,20 @@
|
|
|
1742
1901
|
}
|
|
1743
1902
|
return r === r0;
|
|
1744
1903
|
}
|
|
1745
|
-
|
|
1746
|
-
//
|
|
1747
|
-
|
|
1748
|
-
|
|
1749
|
-
|
|
1750
|
-
|
|
1751
|
-
|
|
1752
|
-
|
|
1904
|
+
const len = this.runes.length;
|
|
1905
|
+
// If the array is exactly 2, 4, 6, or 8 items, DO NOT fall through to binary search
|
|
1906
|
+
if (len === 2 || len === 4 || len === 6 || len === 8) {
|
|
1907
|
+
for (let j = 0; j < len; j += 2) {
|
|
1908
|
+
if (r < this.runes[j]) {
|
|
1909
|
+
return false;
|
|
1910
|
+
}
|
|
1911
|
+
if (r <= this.runes[j + 1]) {
|
|
1912
|
+
return true;
|
|
1913
|
+
}
|
|
1753
1914
|
}
|
|
1915
|
+
return false; // Stop here
|
|
1754
1916
|
}
|
|
1917
|
+
|
|
1755
1918
|
// Otherwise binary search.
|
|
1756
1919
|
let lo = 0;
|
|
1757
1920
|
let hi = this.runes.length / 2 | 0;
|
|
@@ -1769,6 +1932,40 @@
|
|
|
1769
1932
|
}
|
|
1770
1933
|
return false;
|
|
1771
1934
|
}
|
|
1935
|
+
|
|
1936
|
+
// matchRunePos checks whether the instruction matches (and consumes) r.
|
|
1937
|
+
// If so, it returns the index of the matching rune pair.
|
|
1938
|
+
// If not, it returns -1.
|
|
1939
|
+
matchRunePos(r) {
|
|
1940
|
+
if (this.runes.length === 1) {
|
|
1941
|
+
const r0 = this.runes[0];
|
|
1942
|
+
if ((this.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
1943
|
+
return Unicode.equalsIgnoreCase(r0, r) ? 0 : -1;
|
|
1944
|
+
}
|
|
1945
|
+
return r === r0 ? 0 : -1;
|
|
1946
|
+
}
|
|
1947
|
+
const len = this.runes.length;
|
|
1948
|
+
if (len === 2 || len === 4 || len === 6 || len === 8) {
|
|
1949
|
+
for (let j = 0; j < len; j += 2) {
|
|
1950
|
+
if (r < this.runes[j]) return -1;
|
|
1951
|
+
if (r <= this.runes[j + 1]) return Math.floor(j / 2);
|
|
1952
|
+
}
|
|
1953
|
+
return -1;
|
|
1954
|
+
}
|
|
1955
|
+
let lo = 0;
|
|
1956
|
+
let hi = Math.floor(len / 2);
|
|
1957
|
+
while (lo < hi) {
|
|
1958
|
+
const m = lo + hi >> 1;
|
|
1959
|
+
const c = this.runes[2 * m];
|
|
1960
|
+
if (c <= r) {
|
|
1961
|
+
if (r <= this.runes[2 * m + 1]) return m;
|
|
1962
|
+
lo = m + 1;
|
|
1963
|
+
} else {
|
|
1964
|
+
hi = m;
|
|
1965
|
+
}
|
|
1966
|
+
}
|
|
1967
|
+
return -1;
|
|
1968
|
+
}
|
|
1772
1969
|
/**
|
|
1773
1970
|
*
|
|
1774
1971
|
* @returns {string}
|
|
@@ -1784,7 +1981,7 @@
|
|
|
1784
1981
|
case Inst.EMPTY_WIDTH:
|
|
1785
1982
|
return `empty ${this.arg} -> ${this.out}`;
|
|
1786
1983
|
case Inst.MATCH:
|
|
1787
|
-
return
|
|
1984
|
+
return `match${this.arg !== 0 ? ` ${this.arg}` : ''}`;
|
|
1788
1985
|
case Inst.FAIL:
|
|
1789
1986
|
return 'fail';
|
|
1790
1987
|
case Inst.NOP:
|
|
@@ -1810,7 +2007,7 @@
|
|
|
1810
2007
|
class Thread {
|
|
1811
2008
|
constructor() {
|
|
1812
2009
|
this.inst = null;
|
|
1813
|
-
this.cap =
|
|
2010
|
+
this.cap = null; // Initialized to Int32Array later
|
|
1814
2011
|
}
|
|
1815
2012
|
}
|
|
1816
2013
|
|
|
@@ -1838,9 +2035,11 @@
|
|
|
1838
2035
|
return j;
|
|
1839
2036
|
}
|
|
1840
2037
|
clear() {
|
|
1841
|
-
|
|
1842
|
-
this.
|
|
1843
|
-
|
|
2038
|
+
// Prevent memory leaks by nulling out used object references
|
|
2039
|
+
for (let i = 0; i < this.size; i++) {
|
|
2040
|
+
this.denseThreads[i] = null;
|
|
2041
|
+
}
|
|
2042
|
+
// The sparse set logic safely ignores stale integers in Typed Arrays.
|
|
1844
2043
|
this.size = 0;
|
|
1845
2044
|
}
|
|
1846
2045
|
toString() {
|
|
@@ -1869,22 +2068,13 @@
|
|
|
1869
2068
|
m.pool = [];
|
|
1870
2069
|
m.poolSize = 0;
|
|
1871
2070
|
m.matched = false;
|
|
1872
|
-
|
|
2071
|
+
// Use Int32Array instead of standard JS array
|
|
2072
|
+
m.matchcap = new Int32Array(m.prog.numCap < 2 ? 2 : m.prog.numCap);
|
|
1873
2073
|
m.ncap = 0;
|
|
1874
2074
|
return m;
|
|
1875
2075
|
}
|
|
1876
2076
|
static fromMachine(machine) {
|
|
1877
|
-
|
|
1878
|
-
m.re2 = machine.re2;
|
|
1879
|
-
m.prog = machine.prog;
|
|
1880
|
-
m.q0 = machine.q0;
|
|
1881
|
-
m.q1 = machine.q1;
|
|
1882
|
-
m.pool = machine.pool;
|
|
1883
|
-
m.poolSize = machine.poolSize;
|
|
1884
|
-
m.matched = machine.matched;
|
|
1885
|
-
m.matchcap = machine.matchcap;
|
|
1886
|
-
m.ncap = machine.ncap;
|
|
1887
|
-
return m;
|
|
2077
|
+
return Machine.fromRE2(machine.re2);
|
|
1888
2078
|
}
|
|
1889
2079
|
|
|
1890
2080
|
// init() reinitializes an existing Machine for re-use on a new input.
|
|
@@ -1893,27 +2083,30 @@
|
|
|
1893
2083
|
if (ncap > this.matchcap.length) {
|
|
1894
2084
|
this.initNewCap(ncap);
|
|
1895
2085
|
} else {
|
|
1896
|
-
this.resetCap(
|
|
2086
|
+
this.resetCap();
|
|
1897
2087
|
}
|
|
1898
2088
|
}
|
|
1899
|
-
|
|
2089
|
+
|
|
2090
|
+
// Wipes existing typed array memory without reallocating
|
|
2091
|
+
resetCap() {
|
|
1900
2092
|
for (let i = 0; i < this.poolSize; i++) {
|
|
1901
2093
|
const t = this.pool[i];
|
|
1902
|
-
t.cap
|
|
2094
|
+
t.cap.fill(0);
|
|
1903
2095
|
}
|
|
1904
2096
|
}
|
|
1905
2097
|
initNewCap(ncap) {
|
|
1906
2098
|
for (let i = 0; i < this.poolSize; i++) {
|
|
1907
2099
|
const t = this.pool[i];
|
|
1908
|
-
t.cap =
|
|
2100
|
+
t.cap = new Int32Array(ncap);
|
|
1909
2101
|
}
|
|
1910
|
-
this.matchcap =
|
|
2102
|
+
this.matchcap = new Int32Array(ncap);
|
|
1911
2103
|
}
|
|
1912
2104
|
submatches() {
|
|
1913
2105
|
if (this.ncap === 0) {
|
|
1914
2106
|
return Utils.emptyInts();
|
|
1915
2107
|
}
|
|
1916
|
-
|
|
2108
|
+
// Use subarray() to create a zero-allocation view before converting
|
|
2109
|
+
return Array.from(this.matchcap.subarray(0, this.ncap));
|
|
1917
2110
|
}
|
|
1918
2111
|
|
|
1919
2112
|
// alloc() allocates a new thread with the given instruction.
|
|
@@ -1925,6 +2118,7 @@
|
|
|
1925
2118
|
t = this.pool[this.poolSize];
|
|
1926
2119
|
} else {
|
|
1927
2120
|
t = new Thread();
|
|
2121
|
+
t.cap = new Int32Array(this.matchcap.length);
|
|
1928
2122
|
}
|
|
1929
2123
|
t.inst = inst;
|
|
1930
2124
|
return t;
|
|
@@ -1932,16 +2126,10 @@
|
|
|
1932
2126
|
|
|
1933
2127
|
// Frees all threads on the thread queue, returning them to the free pool.
|
|
1934
2128
|
freeQueue(queue, from = 0) {
|
|
1935
|
-
const numberOfThread = queue.size - from;
|
|
1936
|
-
const requiredPoolLength = this.poolSize + numberOfThread;
|
|
1937
|
-
if (this.pool.length < requiredPoolLength) {
|
|
1938
|
-
this.pool = this.pool.slice(0, Math.max(this.pool.length * 2, requiredPoolLength));
|
|
1939
|
-
}
|
|
1940
2129
|
for (let i = from; i < queue.size; i++) {
|
|
1941
2130
|
const t = queue.denseThreads[i];
|
|
1942
2131
|
if (t !== null) {
|
|
1943
|
-
this.pool[this.poolSize] = t;
|
|
1944
|
-
this.poolSize++;
|
|
2132
|
+
this.pool[this.poolSize++] = t;
|
|
1945
2133
|
}
|
|
1946
2134
|
}
|
|
1947
2135
|
queue.clear();
|
|
@@ -1949,11 +2137,7 @@
|
|
|
1949
2137
|
|
|
1950
2138
|
// freeThread() returns t to the free pool.
|
|
1951
2139
|
freeThread(t) {
|
|
1952
|
-
|
|
1953
|
-
this.pool = this.pool.slice(0, this.pool.length * 2);
|
|
1954
|
-
}
|
|
1955
|
-
this.pool[this.poolSize] = t;
|
|
1956
|
-
this.poolSize++;
|
|
2140
|
+
this.pool[this.poolSize++] = t;
|
|
1957
2141
|
}
|
|
1958
2142
|
match(input, pos, anchor) {
|
|
1959
2143
|
const startCond = this.re2.cond;
|
|
@@ -1964,7 +2148,7 @@
|
|
|
1964
2148
|
return false;
|
|
1965
2149
|
}
|
|
1966
2150
|
this.matched = false;
|
|
1967
|
-
this.matchcap
|
|
2151
|
+
this.matchcap.fill(-1);
|
|
1968
2152
|
let runq = this.q0;
|
|
1969
2153
|
let nextq = this.q1;
|
|
1970
2154
|
let r = input.step(pos);
|
|
@@ -2035,6 +2219,85 @@
|
|
|
2035
2219
|
this.freeQueue(nextq);
|
|
2036
2220
|
return this.matched;
|
|
2037
2221
|
}
|
|
2222
|
+
matchSet(input, pos, anchor) {
|
|
2223
|
+
const startCond = this.re2.cond;
|
|
2224
|
+
if (startCond === Utils.EMPTY_ALL) return [];
|
|
2225
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2226
|
+
return [];
|
|
2227
|
+
}
|
|
2228
|
+
let runq = this.q0;
|
|
2229
|
+
let nextq = this.q1;
|
|
2230
|
+
let r = input.step(pos);
|
|
2231
|
+
let rune = r >> 3;
|
|
2232
|
+
let width = r & 7;
|
|
2233
|
+
let rune1 = -1;
|
|
2234
|
+
let width1 = 0;
|
|
2235
|
+
if (r !== MachineInputBase.EOF()) {
|
|
2236
|
+
r = input.step(pos + width);
|
|
2237
|
+
rune1 = r >> 3;
|
|
2238
|
+
width1 = r & 7;
|
|
2239
|
+
}
|
|
2240
|
+
let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
|
|
2241
|
+
const matches = new Set();
|
|
2242
|
+
while (true) {
|
|
2243
|
+
if (runq.isEmpty()) {
|
|
2244
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) break;
|
|
2245
|
+
}
|
|
2246
|
+
if (pos === 0 || anchor === RE2Flags.UNANCHORED) {
|
|
2247
|
+
this.add(runq, this.prog.start, pos, this.matchcap, flag, null);
|
|
2248
|
+
}
|
|
2249
|
+
const nextPos = pos + width;
|
|
2250
|
+
flag = input.context(nextPos);
|
|
2251
|
+
for (let j = 0; j < runq.size; j++) {
|
|
2252
|
+
let t = runq.denseThreads[j];
|
|
2253
|
+
if (t === null) continue;
|
|
2254
|
+
const i = t.inst;
|
|
2255
|
+
let add = false;
|
|
2256
|
+
switch (i.op) {
|
|
2257
|
+
case Inst.MATCH:
|
|
2258
|
+
if (anchor === RE2Flags.ANCHOR_BOTH && pos !== input.endPos()) break;
|
|
2259
|
+
matches.add(i.arg); // Record the matched Set ID
|
|
2260
|
+
break;
|
|
2261
|
+
case Inst.RUNE:
|
|
2262
|
+
add = i.matchRune(rune);
|
|
2263
|
+
break;
|
|
2264
|
+
case Inst.RUNE1:
|
|
2265
|
+
add = rune === i.runes[0];
|
|
2266
|
+
break;
|
|
2267
|
+
case Inst.RUNE_ANY:
|
|
2268
|
+
add = true;
|
|
2269
|
+
break;
|
|
2270
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
2271
|
+
add = rune !== Codepoint.CODES.get('\n');
|
|
2272
|
+
break;
|
|
2273
|
+
default:
|
|
2274
|
+
throw new RE2JSInternalException('bad inst');
|
|
2275
|
+
}
|
|
2276
|
+
if (add) {
|
|
2277
|
+
t = this.add(nextq, i.out, nextPos, t.cap, flag, t);
|
|
2278
|
+
}
|
|
2279
|
+
if (t !== null) {
|
|
2280
|
+
this.freeThread(t);
|
|
2281
|
+
runq.denseThreads[j] = null;
|
|
2282
|
+
}
|
|
2283
|
+
}
|
|
2284
|
+
runq.clear();
|
|
2285
|
+
if (width === 0) break;
|
|
2286
|
+
pos += width;
|
|
2287
|
+
rune = rune1;
|
|
2288
|
+
width = width1;
|
|
2289
|
+
if (rune !== -1) {
|
|
2290
|
+
r = input.step(pos + width);
|
|
2291
|
+
rune1 = r >> 3;
|
|
2292
|
+
width1 = r & 7;
|
|
2293
|
+
}
|
|
2294
|
+
const tmpq = runq;
|
|
2295
|
+
runq = nextq;
|
|
2296
|
+
nextq = tmpq;
|
|
2297
|
+
}
|
|
2298
|
+
this.freeQueue(nextq);
|
|
2299
|
+
return Array.from(matches).sort((a, b) => a - b);
|
|
2300
|
+
}
|
|
2038
2301
|
step(runq, nextq, pos, nextPos, c, nextCond, anchor, atEnd) {
|
|
2039
2302
|
const longest = this.re2.longest;
|
|
2040
2303
|
for (let j = 0; j < runq.size; j++) {
|
|
@@ -2055,7 +2318,9 @@
|
|
|
2055
2318
|
}
|
|
2056
2319
|
if (this.ncap > 0 && (!longest || !this.matched || this.matchcap[1] < pos)) {
|
|
2057
2320
|
t.cap[1] = pos;
|
|
2058
|
-
|
|
2321
|
+
// Using subarray creates a fast view, avoiding a full array copy
|
|
2322
|
+
// until the submatches are finalized at the very end.
|
|
2323
|
+
this.matchcap.set(t.cap.subarray(0, this.ncap));
|
|
2059
2324
|
}
|
|
2060
2325
|
if (!longest) {
|
|
2061
2326
|
this.freeQueue(runq, j + 1);
|
|
@@ -2075,7 +2340,7 @@
|
|
|
2075
2340
|
add = c !== Codepoint.CODES.get('\n');
|
|
2076
2341
|
break;
|
|
2077
2342
|
default:
|
|
2078
|
-
throw new
|
|
2343
|
+
throw new RE2JSInternalException('bad inst');
|
|
2079
2344
|
}
|
|
2080
2345
|
if (add) {
|
|
2081
2346
|
t = this.add(nextq, i.out, nextPos, t.cap, nextCond, t);
|
|
@@ -2133,7 +2398,10 @@
|
|
|
2133
2398
|
t.inst = inst;
|
|
2134
2399
|
}
|
|
2135
2400
|
if (this.ncap > 0 && t.cap !== cap) {
|
|
2136
|
-
|
|
2401
|
+
// Direct assignment utilizing Typed Array performance
|
|
2402
|
+
for (let c = 0; c < this.ncap; c++) {
|
|
2403
|
+
t.cap[c] = cap[c];
|
|
2404
|
+
}
|
|
2137
2405
|
}
|
|
2138
2406
|
q.denseThreads[d] = t;
|
|
2139
2407
|
t = null;
|
|
@@ -2165,20 +2433,24 @@
|
|
|
2165
2433
|
return true;
|
|
2166
2434
|
};
|
|
2167
2435
|
class DFAState {
|
|
2168
|
-
constructor(nfaStates, isMatch) {
|
|
2436
|
+
constructor(nfaStates, isMatch, matchIDs = []) {
|
|
2169
2437
|
this.nfaStates = nfaStates; // Int32Array of Instruction PCs
|
|
2170
2438
|
this.isMatch = isMatch; // Boolean
|
|
2439
|
+
this.matchIDs = matchIDs; // Array of integers indicating which Set patterns matched
|
|
2171
2440
|
this.nextAscii = new Array(Unicode.MAX_ASCII + 1).fill(null); // Flat array for blisteringly fast ASCII lookups
|
|
2172
2441
|
this.nextMap = new Map(); // Cache of Char -> DFAState
|
|
2173
2442
|
}
|
|
2174
2443
|
}
|
|
2175
2444
|
class DFA {
|
|
2445
|
+
static MAX_CACHE_CLEARS = 5;
|
|
2176
2446
|
constructor(prog) {
|
|
2177
2447
|
this.prog = prog;
|
|
2178
2448
|
this.stateCache = new Map(); // hash(number) -> DFAState[]
|
|
2179
2449
|
this.stateCount = 0; // Tracks total states for memory limits
|
|
2180
2450
|
this.startState = null;
|
|
2181
2451
|
this.stateLimit = 10000; // Prevent memory explosion (ReDoS protection)
|
|
2452
|
+
this.cacheClears = 0; // Track thrashing
|
|
2453
|
+
this.failed = false; // mark if DFA cannot work with provided prog
|
|
2182
2454
|
}
|
|
2183
2455
|
|
|
2184
2456
|
// Follows epsilon (empty) transitions to find all reachable states without consuming a char
|
|
@@ -2186,6 +2458,7 @@
|
|
|
2186
2458
|
const closure = new Set();
|
|
2187
2459
|
const stack = [...pcs];
|
|
2188
2460
|
let isMatch = false;
|
|
2461
|
+
const matchIDs = [];
|
|
2189
2462
|
while (stack.length > 0) {
|
|
2190
2463
|
const pc = stack.pop();
|
|
2191
2464
|
if (closure.has(pc)) continue;
|
|
@@ -2194,6 +2467,7 @@
|
|
|
2194
2467
|
switch (inst.op) {
|
|
2195
2468
|
case Inst.MATCH:
|
|
2196
2469
|
isMatch = true;
|
|
2470
|
+
if (!matchIDs.includes(inst.arg)) matchIDs.push(inst.arg);
|
|
2197
2471
|
break;
|
|
2198
2472
|
case Inst.ALT:
|
|
2199
2473
|
case Inst.ALT_MATCH:
|
|
@@ -2211,9 +2485,11 @@
|
|
|
2211
2485
|
}
|
|
2212
2486
|
}
|
|
2213
2487
|
const sortedPCs = Int32Array.from(closure).sort();
|
|
2488
|
+
matchIDs.sort((a, b) => a - b);
|
|
2214
2489
|
return {
|
|
2215
2490
|
pcs: sortedPCs,
|
|
2216
|
-
isMatch
|
|
2491
|
+
isMatch,
|
|
2492
|
+
matchIDs
|
|
2217
2493
|
};
|
|
2218
2494
|
}
|
|
2219
2495
|
|
|
@@ -2240,17 +2516,27 @@
|
|
|
2240
2516
|
this.stateCache.set(hash, bucket);
|
|
2241
2517
|
}
|
|
2242
2518
|
|
|
2519
|
+
// DFA already failed once - exit
|
|
2520
|
+
if (this.failed) return null;
|
|
2521
|
+
|
|
2243
2522
|
// Safety: prevent memory exhaustion from state explosion
|
|
2244
2523
|
// We flush the cache and return null, which seamlessly routes execution to the NFA
|
|
2245
2524
|
if (this.stateCount >= this.stateLimit) {
|
|
2246
2525
|
this.stateCache.clear();
|
|
2247
2526
|
this.stateCount = 0;
|
|
2248
2527
|
this.startState = null;
|
|
2528
|
+
this.cacheClears++;
|
|
2529
|
+
|
|
2530
|
+
// If this regex causes continuous cache thrashing, permanently fall back to NFA
|
|
2531
|
+
// to avoid spending CPU cycles constantly rebuilding the DFA tree.
|
|
2532
|
+
if (this.cacheClears >= DFA.MAX_CACHE_CLEARS) {
|
|
2533
|
+
this.failed = true;
|
|
2534
|
+
}
|
|
2249
2535
|
return null;
|
|
2250
2536
|
}
|
|
2251
2537
|
|
|
2252
2538
|
// State not found, create it and add to bucket
|
|
2253
|
-
const state = new DFAState(sortedPCs, closureResult.isMatch);
|
|
2539
|
+
const state = new DFAState(sortedPCs, closureResult.isMatch, closureResult.matchIDs);
|
|
2254
2540
|
bucket.push(state);
|
|
2255
2541
|
this.stateCount++;
|
|
2256
2542
|
return state;
|
|
@@ -2278,68 +2564,800 @@
|
|
|
2278
2564
|
nextPCs.push(inst.out);
|
|
2279
2565
|
}
|
|
2280
2566
|
}
|
|
2281
|
-
if (anchor === RE2Flags.UNANCHORED) {
|
|
2282
|
-
nextPCs.push(this.prog.start);
|
|
2567
|
+
if (anchor === RE2Flags.UNANCHORED) {
|
|
2568
|
+
nextPCs.push(this.prog.start);
|
|
2569
|
+
}
|
|
2570
|
+
const nextState = this.getState(nextPCs);
|
|
2571
|
+
|
|
2572
|
+
// Cache the result
|
|
2573
|
+
if (anchor === RE2Flags.UNANCHORED && charCode <= Unicode.MAX_ASCII) {
|
|
2574
|
+
state.nextAscii[charCode] = nextState;
|
|
2575
|
+
} else {
|
|
2576
|
+
const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
|
|
2577
|
+
state.nextMap.set(key, nextState);
|
|
2578
|
+
}
|
|
2579
|
+
return nextState;
|
|
2580
|
+
}
|
|
2581
|
+
|
|
2582
|
+
// The hot loop: Execute the Lazy DFA
|
|
2583
|
+
match(input, pos, anchor) {
|
|
2584
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2585
|
+
return false;
|
|
2586
|
+
}
|
|
2587
|
+
if (!this.startState) {
|
|
2588
|
+
this.startState = this.getState([this.prog.start]);
|
|
2589
|
+
if (!this.startState) return null; // Fallback to NFA
|
|
2590
|
+
}
|
|
2591
|
+
let endPos = input.endPos();
|
|
2592
|
+
let currentState = this.startState;
|
|
2593
|
+
if (currentState.isMatch) {
|
|
2594
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2595
|
+
if (pos === endPos) return true;
|
|
2596
|
+
} else {
|
|
2597
|
+
return true;
|
|
2598
|
+
}
|
|
2599
|
+
}
|
|
2600
|
+
let i = pos;
|
|
2601
|
+
while (i < endPos) {
|
|
2602
|
+
const r = input.step(i);
|
|
2603
|
+
const rune = r >> 3;
|
|
2604
|
+
const width = r & 7;
|
|
2605
|
+
|
|
2606
|
+
// prevent infinite loop on EOF
|
|
2607
|
+
if (width === 0) {
|
|
2608
|
+
break;
|
|
2609
|
+
}
|
|
2610
|
+
currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
|
|
2611
|
+
|
|
2612
|
+
// If we hit an unrecoverable DFA error or bailout, signal fallback
|
|
2613
|
+
if (currentState === null) return null;
|
|
2614
|
+
if (currentState.isMatch) {
|
|
2615
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2616
|
+
if (i + width === endPos) return true;
|
|
2617
|
+
} else {
|
|
2618
|
+
return true;
|
|
2619
|
+
}
|
|
2620
|
+
}
|
|
2621
|
+
|
|
2622
|
+
// If we hit a dead end, and anchored, fail early
|
|
2623
|
+
if (currentState.nfaStates.length === 0) {
|
|
2624
|
+
if (anchor !== RE2Flags.UNANCHORED) return false;
|
|
2625
|
+
}
|
|
2626
|
+
i += width;
|
|
2627
|
+
}
|
|
2628
|
+
return false;
|
|
2629
|
+
}
|
|
2630
|
+
|
|
2631
|
+
// The hot loop for evaluating Multi-Pattern Sets
|
|
2632
|
+
matchSet(input, pos, anchor) {
|
|
2633
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2634
|
+
return [];
|
|
2635
|
+
}
|
|
2636
|
+
if (!this.startState) {
|
|
2637
|
+
this.startState = this.getState([this.prog.start]);
|
|
2638
|
+
if (!this.startState) return null; // Fallback to NFA
|
|
2639
|
+
}
|
|
2640
|
+
let endPos = input.endPos();
|
|
2641
|
+
let currentState = this.startState;
|
|
2642
|
+
const matches = new Set();
|
|
2643
|
+
const checkMatch = (state, currentPos) => {
|
|
2644
|
+
if (state.isMatch) {
|
|
2645
|
+
if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2646
|
+
if (currentPos === endPos) {
|
|
2647
|
+
state.matchIDs.forEach(id => matches.add(id));
|
|
2648
|
+
}
|
|
2649
|
+
} else {
|
|
2650
|
+
state.matchIDs.forEach(id => matches.add(id));
|
|
2651
|
+
}
|
|
2652
|
+
}
|
|
2653
|
+
};
|
|
2654
|
+
checkMatch(currentState, pos);
|
|
2655
|
+
let i = pos;
|
|
2656
|
+
while (i < endPos) {
|
|
2657
|
+
const r = input.step(i);
|
|
2658
|
+
const rune = r >> 3;
|
|
2659
|
+
const width = r & 7;
|
|
2660
|
+
if (width === 0) break;
|
|
2661
|
+
currentState = anchor === RE2Flags.UNANCHORED && rune <= Unicode.MAX_ASCII && currentState.nextAscii[rune] || this.step(currentState, rune, anchor);
|
|
2662
|
+
if (currentState === null) return null; // Bailout to NFA
|
|
2663
|
+
|
|
2664
|
+
i += width;
|
|
2665
|
+
checkMatch(currentState, i);
|
|
2666
|
+
if (currentState.nfaStates.length === 0) {
|
|
2667
|
+
if (anchor !== RE2Flags.UNANCHORED) break;
|
|
2668
|
+
}
|
|
2669
|
+
}
|
|
2670
|
+
return Array.from(matches).sort((a, b) => a - b);
|
|
2671
|
+
}
|
|
2672
|
+
}
|
|
2673
|
+
|
|
2674
|
+
const VISITED_BITS = 32;
|
|
2675
|
+
const MAX_BACKTRACK_PROG = 500;
|
|
2676
|
+
const INITIAL_JOB_CAPACITY = 256; // Starting size for the job stack arrays
|
|
2677
|
+
const MAX_BACKTRACK_VECTOR = 256 * 1024; // 32 KB limit for the visited bit-mask
|
|
2678
|
+
|
|
2679
|
+
class BitState {
|
|
2680
|
+
constructor() {
|
|
2681
|
+
this.end = 0;
|
|
2682
|
+
this.cap = new Int32Array(0);
|
|
2683
|
+
this.matchcap = new Int32Array(0);
|
|
2684
|
+
this.ncap = 0;
|
|
2685
|
+
|
|
2686
|
+
// Parallel arrays acting as the backtrack job stack
|
|
2687
|
+
this.jobPc = new Int32Array(INITIAL_JOB_CAPACITY);
|
|
2688
|
+
this.jobArg = new Uint8Array(INITIAL_JOB_CAPACITY);
|
|
2689
|
+
this.jobPos = new Int32Array(INITIAL_JOB_CAPACITY);
|
|
2690
|
+
this.jobLen = 0;
|
|
2691
|
+
this.visited = new Uint32Array(0);
|
|
2692
|
+
}
|
|
2693
|
+
reset(prog, end, ncap) {
|
|
2694
|
+
this.end = end;
|
|
2695
|
+
this.jobLen = 0;
|
|
2696
|
+
this.ncap = ncap;
|
|
2697
|
+
|
|
2698
|
+
// Bitwise shift (>>> 5) instead of Math.floor( / 32)
|
|
2699
|
+
const visitedSize = prog.numInst() * (end + 1) + VISITED_BITS - 1 >>> 5;
|
|
2700
|
+
if (this.visited.length < visitedSize) {
|
|
2701
|
+
this.visited = new Uint32Array(Math.floor(MAX_BACKTRACK_VECTOR / VISITED_BITS));
|
|
2702
|
+
} else {
|
|
2703
|
+
this.visited.fill(0, 0, visitedSize);
|
|
2704
|
+
}
|
|
2705
|
+
if (this.cap.length < ncap) {
|
|
2706
|
+
// Must explicitly fill with -1 as Int32Array defaults to 0
|
|
2707
|
+
this.cap = new Int32Array(ncap).fill(-1);
|
|
2708
|
+
} else {
|
|
2709
|
+
this.cap.fill(-1, 0, ncap);
|
|
2710
|
+
}
|
|
2711
|
+
if (this.matchcap.length < ncap) {
|
|
2712
|
+
this.matchcap = new Int32Array(ncap).fill(-1);
|
|
2713
|
+
} else {
|
|
2714
|
+
this.matchcap.fill(-1, 0, ncap);
|
|
2715
|
+
}
|
|
2716
|
+
}
|
|
2717
|
+
shouldVisit(pc, pos) {
|
|
2718
|
+
const n = pc * (this.end + 1) + pos;
|
|
2719
|
+
const idx = n >>> 5; // Equivalent to Math.floor(n / 32)
|
|
2720
|
+
const mask = 1 << (n & 31); // Equivalent to n % 32
|
|
2721
|
+
|
|
2722
|
+
if ((this.visited[idx] & mask) !== 0) {
|
|
2723
|
+
return false;
|
|
2724
|
+
}
|
|
2725
|
+
this.visited[idx] |= mask;
|
|
2726
|
+
return true;
|
|
2727
|
+
}
|
|
2728
|
+
push(re2, pc, pos, arg) {
|
|
2729
|
+
if (re2.prog.getInst(pc).op !== Inst.FAIL && (arg || this.shouldVisit(pc, pos))) {
|
|
2730
|
+
if (this.jobLen >= this.jobPc.length) {
|
|
2731
|
+
const newSize = this.jobPc.length * 2;
|
|
2732
|
+
const newPc = new Int32Array(newSize);
|
|
2733
|
+
newPc.set(this.jobPc);
|
|
2734
|
+
this.jobPc = newPc;
|
|
2735
|
+
const newArg = new Uint8Array(newSize);
|
|
2736
|
+
newArg.set(this.jobArg);
|
|
2737
|
+
this.jobArg = newArg;
|
|
2738
|
+
const newPos = new Int32Array(newSize);
|
|
2739
|
+
newPos.set(this.jobPos);
|
|
2740
|
+
this.jobPos = newPos;
|
|
2741
|
+
}
|
|
2742
|
+
this.jobPc[this.jobLen] = pc;
|
|
2743
|
+
this.jobArg[this.jobLen] = arg ? 1 : 0;
|
|
2744
|
+
this.jobPos[this.jobLen] = pos;
|
|
2745
|
+
this.jobLen++;
|
|
2746
|
+
}
|
|
2747
|
+
}
|
|
2748
|
+
tryBacktrack(re2, input, pc, pos, anchor) {
|
|
2749
|
+
const longest = re2.longest;
|
|
2750
|
+
this.push(re2, pc, pos, false);
|
|
2751
|
+
while (this.jobLen > 0) {
|
|
2752
|
+
this.jobLen--;
|
|
2753
|
+
let currentPc = this.jobPc[this.jobLen];
|
|
2754
|
+
let arg = this.jobArg[this.jobLen] === 1;
|
|
2755
|
+
let currentPos = this.jobPos[this.jobLen];
|
|
2756
|
+
let skipShouldVisit = true;
|
|
2757
|
+
while (true) {
|
|
2758
|
+
if (!skipShouldVisit) {
|
|
2759
|
+
if (!this.shouldVisit(currentPc, currentPos)) {
|
|
2760
|
+
break;
|
|
2761
|
+
}
|
|
2762
|
+
}
|
|
2763
|
+
skipShouldVisit = false;
|
|
2764
|
+
const inst = re2.prog.getInst(currentPc);
|
|
2765
|
+
switch (inst.op) {
|
|
2766
|
+
case Inst.FAIL:
|
|
2767
|
+
{
|
|
2768
|
+
throw new RE2JSInternalException('unexpected InstFail');
|
|
2769
|
+
}
|
|
2770
|
+
case Inst.ALT:
|
|
2771
|
+
{
|
|
2772
|
+
if (arg) {
|
|
2773
|
+
arg = false;
|
|
2774
|
+
currentPc = inst.arg;
|
|
2775
|
+
continue;
|
|
2776
|
+
} else {
|
|
2777
|
+
this.push(re2, currentPc, currentPos, true);
|
|
2778
|
+
currentPc = inst.out;
|
|
2779
|
+
continue;
|
|
2780
|
+
}
|
|
2781
|
+
}
|
|
2782
|
+
case Inst.ALT_MATCH:
|
|
2783
|
+
{
|
|
2784
|
+
const outInst = re2.prog.getInst(inst.out);
|
|
2785
|
+
if (Inst.isRuneOp(outInst.op)) {
|
|
2786
|
+
this.push(re2, inst.arg, currentPos, false);
|
|
2787
|
+
currentPc = inst.out;
|
|
2788
|
+
continue;
|
|
2789
|
+
}
|
|
2790
|
+
this.push(re2, inst.out, this.end, false);
|
|
2791
|
+
currentPc = inst.arg;
|
|
2792
|
+
continue;
|
|
2793
|
+
}
|
|
2794
|
+
case Inst.RUNE:
|
|
2795
|
+
{
|
|
2796
|
+
const r = input.step(currentPos);
|
|
2797
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2798
|
+
if (!inst.matchRune(r >> 3)) break;
|
|
2799
|
+
currentPos += r & 7;
|
|
2800
|
+
currentPc = inst.out;
|
|
2801
|
+
continue;
|
|
2802
|
+
}
|
|
2803
|
+
case Inst.RUNE1:
|
|
2804
|
+
{
|
|
2805
|
+
const r = input.step(currentPos);
|
|
2806
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2807
|
+
if (r >> 3 !== inst.runes[0]) break;
|
|
2808
|
+
currentPos += r & 7;
|
|
2809
|
+
currentPc = inst.out;
|
|
2810
|
+
continue;
|
|
2811
|
+
}
|
|
2812
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
2813
|
+
{
|
|
2814
|
+
const r = input.step(currentPos);
|
|
2815
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2816
|
+
if (r >> 3 === 10) break;
|
|
2817
|
+
currentPos += r & 7;
|
|
2818
|
+
currentPc = inst.out;
|
|
2819
|
+
continue;
|
|
2820
|
+
}
|
|
2821
|
+
case Inst.RUNE_ANY:
|
|
2822
|
+
{
|
|
2823
|
+
const r = input.step(currentPos);
|
|
2824
|
+
if (r === MachineInputBase.EOF()) break;
|
|
2825
|
+
currentPos += r & 7;
|
|
2826
|
+
currentPc = inst.out;
|
|
2827
|
+
continue;
|
|
2828
|
+
}
|
|
2829
|
+
case Inst.CAPTURE:
|
|
2830
|
+
{
|
|
2831
|
+
if (arg) {
|
|
2832
|
+
this.cap[inst.arg] = currentPos;
|
|
2833
|
+
break;
|
|
2834
|
+
} else {
|
|
2835
|
+
if (inst.arg < this.ncap) {
|
|
2836
|
+
this.push(re2, currentPc, this.cap[inst.arg], true);
|
|
2837
|
+
this.cap[inst.arg] = currentPos;
|
|
2838
|
+
}
|
|
2839
|
+
currentPc = inst.out;
|
|
2840
|
+
continue;
|
|
2841
|
+
}
|
|
2842
|
+
}
|
|
2843
|
+
case Inst.EMPTY_WIDTH:
|
|
2844
|
+
{
|
|
2845
|
+
const flag = input.context(currentPos);
|
|
2846
|
+
if ((inst.arg & ~flag) !== 0) break;
|
|
2847
|
+
currentPc = inst.out;
|
|
2848
|
+
continue;
|
|
2849
|
+
}
|
|
2850
|
+
case Inst.NOP:
|
|
2851
|
+
{
|
|
2852
|
+
currentPc = inst.out;
|
|
2853
|
+
continue;
|
|
2854
|
+
}
|
|
2855
|
+
case Inst.MATCH:
|
|
2856
|
+
{
|
|
2857
|
+
if (anchor === RE2Flags.ANCHOR_BOTH && currentPos !== this.end) {
|
|
2858
|
+
break;
|
|
2859
|
+
}
|
|
2860
|
+
if (this.ncap === 0) return true;
|
|
2861
|
+
if (this.ncap > 1) {
|
|
2862
|
+
this.cap[1] = currentPos;
|
|
2863
|
+
}
|
|
2864
|
+
const old = this.matchcap[1];
|
|
2865
|
+
if (old === -1 || longest && currentPos > 0 && currentPos > old) {
|
|
2866
|
+
this.matchcap.set(this.cap);
|
|
2867
|
+
}
|
|
2868
|
+
if (!longest) return true;
|
|
2869
|
+
if (currentPos === this.end) return true;
|
|
2870
|
+
break;
|
|
2871
|
+
}
|
|
2872
|
+
default:
|
|
2873
|
+
{
|
|
2874
|
+
throw new RE2JSInternalException('bad inst');
|
|
2875
|
+
}
|
|
2876
|
+
}
|
|
2877
|
+
break;
|
|
2878
|
+
}
|
|
2879
|
+
}
|
|
2880
|
+
return longest && this.matchcap.length > 1 && this.matchcap[1] >= 0;
|
|
2881
|
+
}
|
|
2882
|
+
}
|
|
2883
|
+
const bitStatePool = [];
|
|
2884
|
+
class Backtracker {
|
|
2885
|
+
static shouldBacktrack(prog) {
|
|
2886
|
+
return prog.numInst() <= MAX_BACKTRACK_PROG;
|
|
2887
|
+
}
|
|
2888
|
+
static maxBitStateLen(prog) {
|
|
2889
|
+
if (!Backtracker.shouldBacktrack(prog)) {
|
|
2890
|
+
return 0;
|
|
2891
|
+
}
|
|
2892
|
+
return Math.floor(MAX_BACKTRACK_VECTOR / prog.numInst());
|
|
2893
|
+
}
|
|
2894
|
+
static execute(re2, input, pos, anchor, ncap) {
|
|
2895
|
+
const startCond = re2.cond;
|
|
2896
|
+
if (startCond === Utils.EMPTY_ALL) {
|
|
2897
|
+
return null;
|
|
2898
|
+
}
|
|
2899
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
2900
|
+
return null;
|
|
2901
|
+
}
|
|
2902
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 && pos !== 0) {
|
|
2903
|
+
return null;
|
|
2904
|
+
}
|
|
2905
|
+
const b = bitStatePool.length > 0 ? bitStatePool.pop() : new BitState();
|
|
2906
|
+
const end = input.endPos();
|
|
2907
|
+
b.reset(re2.prog, end, ncap);
|
|
2908
|
+
let matched = false;
|
|
2909
|
+
if ((startCond & Utils.EMPTY_BEGIN_TEXT) !== 0 || anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) {
|
|
2910
|
+
if (b.ncap > 0) {
|
|
2911
|
+
b.cap[0] = pos;
|
|
2912
|
+
}
|
|
2913
|
+
if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
|
|
2914
|
+
matched = true;
|
|
2915
|
+
}
|
|
2916
|
+
} else {
|
|
2917
|
+
let width = -1;
|
|
2918
|
+
for (; pos <= end && width !== 0; pos += width) {
|
|
2919
|
+
if (re2.prefix.length > 0) {
|
|
2920
|
+
const advance = input.index(re2, pos);
|
|
2921
|
+
if (advance < 0) {
|
|
2922
|
+
break;
|
|
2923
|
+
}
|
|
2924
|
+
pos += advance;
|
|
2925
|
+
}
|
|
2926
|
+
if (b.ncap > 0) {
|
|
2927
|
+
b.cap[0] = pos;
|
|
2928
|
+
}
|
|
2929
|
+
if (b.tryBacktrack(re2, input, re2.prog.start, pos, anchor)) {
|
|
2930
|
+
matched = true;
|
|
2931
|
+
break;
|
|
2932
|
+
}
|
|
2933
|
+
const r = input.step(pos);
|
|
2934
|
+
width = r === MachineInputBase.EOF() ? 0 : r & 7;
|
|
2935
|
+
}
|
|
2936
|
+
}
|
|
2937
|
+
if (!matched) {
|
|
2938
|
+
bitStatePool.push(b);
|
|
2939
|
+
return null;
|
|
2940
|
+
}
|
|
2941
|
+
|
|
2942
|
+
// Must slice so we don't accidentally leak trailing arrays from previously recycled typed arrays
|
|
2943
|
+
const result = ncap === 0 ? [] : Array.from(b.matchcap.subarray(0, ncap));
|
|
2944
|
+
bitStatePool.push(b);
|
|
2945
|
+
return result;
|
|
2946
|
+
}
|
|
2947
|
+
}
|
|
2948
|
+
|
|
2949
|
+
class QueueOnePass {
|
|
2950
|
+
constructor(size) {
|
|
2951
|
+
this.sparse = new Uint32Array(size);
|
|
2952
|
+
this.dense = new Uint32Array(size);
|
|
2953
|
+
this.size = 0;
|
|
2954
|
+
this.nextIndex = 0;
|
|
2955
|
+
}
|
|
2956
|
+
empty() {
|
|
2957
|
+
return this.nextIndex >= this.size;
|
|
2958
|
+
}
|
|
2959
|
+
next() {
|
|
2960
|
+
return this.dense[this.nextIndex++];
|
|
2961
|
+
}
|
|
2962
|
+
clear() {
|
|
2963
|
+
this.size = 0;
|
|
2964
|
+
this.nextIndex = 0;
|
|
2965
|
+
}
|
|
2966
|
+
contains(u) {
|
|
2967
|
+
return u < this.sparse.length && this.sparse[u] < this.size && this.dense[this.sparse[u]] === u;
|
|
2968
|
+
}
|
|
2969
|
+
insert(u) {
|
|
2970
|
+
if (!this.contains(u)) this.insertNew(u);
|
|
2971
|
+
}
|
|
2972
|
+
insertNew(u) {
|
|
2973
|
+
if (u >= this.sparse.length) return;
|
|
2974
|
+
this.sparse[u] = this.size;
|
|
2975
|
+
this.dense[this.size] = u;
|
|
2976
|
+
this.size++;
|
|
2977
|
+
}
|
|
2978
|
+
}
|
|
2979
|
+
const mergeRuneSets = (leftRunes, rightRunes, leftPC, rightPC) => {
|
|
2980
|
+
const leftLen = leftRunes.length;
|
|
2981
|
+
const rightLen = rightRunes.length;
|
|
2982
|
+
let lx = 0,
|
|
2983
|
+
rx = 0;
|
|
2984
|
+
const merged = [];
|
|
2985
|
+
const next = [];
|
|
2986
|
+
let ok = true;
|
|
2987
|
+
let ix = -1;
|
|
2988
|
+
const extend = isLeft => {
|
|
2989
|
+
const newArray = isLeft ? leftRunes : rightRunes;
|
|
2990
|
+
const low = isLeft ? lx : rx;
|
|
2991
|
+
const pc = isLeft ? leftPC : rightPC;
|
|
2992
|
+
if (ix > 0 && newArray[low] <= merged[ix]) return false;
|
|
2993
|
+
merged.push(newArray[low], newArray[low + 1]);
|
|
2994
|
+
if (isLeft) lx += 2;else rx += 2;
|
|
2995
|
+
ix += 2;
|
|
2996
|
+
next.push(pc);
|
|
2997
|
+
return true;
|
|
2998
|
+
};
|
|
2999
|
+
while (lx < leftLen || rx < rightLen) {
|
|
3000
|
+
if (rx >= rightLen) {
|
|
3001
|
+
ok = extend(true);
|
|
3002
|
+
} else if (lx >= leftLen) {
|
|
3003
|
+
ok = extend(false);
|
|
3004
|
+
} else if (rightRunes[rx] < leftRunes[lx]) {
|
|
3005
|
+
ok = extend(false);
|
|
3006
|
+
} else {
|
|
3007
|
+
ok = extend(true);
|
|
3008
|
+
}
|
|
3009
|
+
if (!ok) return null;
|
|
3010
|
+
}
|
|
3011
|
+
return {
|
|
3012
|
+
merged,
|
|
3013
|
+
next
|
|
3014
|
+
};
|
|
3015
|
+
};
|
|
3016
|
+
class OnePassProg {
|
|
3017
|
+
constructor(prog) {
|
|
3018
|
+
this.start = prog.start;
|
|
3019
|
+
this.numCap = prog.numCap;
|
|
3020
|
+
this.inst = new Array(prog.inst.length);
|
|
3021
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3022
|
+
const orig = prog.inst[i];
|
|
3023
|
+
const inst = new Inst(orig.op);
|
|
3024
|
+
inst.out = orig.out;
|
|
3025
|
+
inst.arg = orig.arg;
|
|
3026
|
+
inst.runes = orig.runes ? orig.runes.slice() : [];
|
|
3027
|
+
inst.next = null;
|
|
3028
|
+
this.inst[i] = inst;
|
|
3029
|
+
}
|
|
3030
|
+
}
|
|
3031
|
+
}
|
|
3032
|
+
const onePassCopy = prog => {
|
|
3033
|
+
const p = new OnePassProg(prog);
|
|
3034
|
+
|
|
3035
|
+
// Rewrites one or more common Prog constructs that enable some otherwise
|
|
3036
|
+
// non-onepass Progs to be onepass.
|
|
3037
|
+
for (let pc = 0; pc < p.inst.length; pc++) {
|
|
3038
|
+
const inst = p.inst[pc];
|
|
3039
|
+
if (inst.op !== Inst.ALT && inst.op !== Inst.ALT_MATCH) continue;
|
|
3040
|
+
let pAOther = 'out';
|
|
3041
|
+
let pAAlt = 'arg';
|
|
3042
|
+
let instAlt = p.inst[inst[pAAlt]];
|
|
3043
|
+
if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) {
|
|
3044
|
+
pAOther = 'arg';
|
|
3045
|
+
pAAlt = 'out';
|
|
3046
|
+
instAlt = p.inst[inst[pAAlt]];
|
|
3047
|
+
if (instAlt.op !== Inst.ALT && instAlt.op !== Inst.ALT_MATCH) continue;
|
|
3048
|
+
}
|
|
3049
|
+
const instOther = p.inst[inst[pAOther]];
|
|
3050
|
+
if (instOther.op === Inst.ALT || instOther.op === Inst.ALT_MATCH) continue;
|
|
3051
|
+
let pBAlt = 'out';
|
|
3052
|
+
let pBOther = 'arg';
|
|
3053
|
+
let patch = false;
|
|
3054
|
+
if (instAlt.out === pc) {
|
|
3055
|
+
patch = true;
|
|
3056
|
+
} else if (instAlt.arg === pc) {
|
|
3057
|
+
patch = true;
|
|
3058
|
+
pBAlt = 'arg';
|
|
3059
|
+
pBOther = 'out';
|
|
3060
|
+
}
|
|
3061
|
+
if (patch) instAlt[pBAlt] = inst[pAOther];
|
|
3062
|
+
if (inst[pAOther] === instAlt[pBAlt]) inst[pAAlt] = instAlt[pBOther];
|
|
3063
|
+
}
|
|
3064
|
+
return p;
|
|
3065
|
+
};
|
|
3066
|
+
const makeOnePass = p => {
|
|
3067
|
+
if (p.inst.length >= 1000) return null;
|
|
3068
|
+
const instQueue = new QueueOnePass(p.inst.length);
|
|
3069
|
+
const visitQueue = new QueueOnePass(p.inst.length);
|
|
3070
|
+
const onePassRunes = new Array(p.inst.length);
|
|
3071
|
+
const m = new Array(p.inst.length).fill(false);
|
|
3072
|
+
const check = pc => {
|
|
3073
|
+
let ok = true;
|
|
3074
|
+
const inst = p.inst[pc];
|
|
3075
|
+
if (visitQueue.contains(pc)) return true;
|
|
3076
|
+
visitQueue.insert(pc);
|
|
3077
|
+
switch (inst.op) {
|
|
3078
|
+
case Inst.ALT:
|
|
3079
|
+
case Inst.ALT_MATCH:
|
|
3080
|
+
{
|
|
3081
|
+
ok = check(inst.out) && check(inst.arg);
|
|
3082
|
+
let matchOut = m[inst.out];
|
|
3083
|
+
let matchArg = m[inst.arg];
|
|
3084
|
+
if (matchOut && matchArg) return false;
|
|
3085
|
+
if (matchArg) {
|
|
3086
|
+
const tempOut = inst.out;
|
|
3087
|
+
inst.out = inst.arg;
|
|
3088
|
+
inst.arg = tempOut;
|
|
3089
|
+
const tempMatch = matchOut;
|
|
3090
|
+
matchOut = matchArg;
|
|
3091
|
+
matchArg = tempMatch;
|
|
3092
|
+
}
|
|
3093
|
+
if (matchOut) {
|
|
3094
|
+
m[pc] = true;
|
|
3095
|
+
inst.op = Inst.ALT_MATCH;
|
|
3096
|
+
}
|
|
3097
|
+
const leftRunes = onePassRunes[inst.out] || [];
|
|
3098
|
+
const rightRunes = onePassRunes[inst.arg] || [];
|
|
3099
|
+
const mergeRes = mergeRuneSets(leftRunes, rightRunes, inst.out, inst.arg);
|
|
3100
|
+
if (!mergeRes) return false;
|
|
3101
|
+
onePassRunes[pc] = mergeRes.merged;
|
|
3102
|
+
inst.next = new Uint32Array(mergeRes.next);
|
|
3103
|
+
break;
|
|
3104
|
+
}
|
|
3105
|
+
case Inst.CAPTURE:
|
|
3106
|
+
case Inst.EMPTY_WIDTH:
|
|
3107
|
+
case Inst.NOP:
|
|
3108
|
+
{
|
|
3109
|
+
ok = check(inst.out);
|
|
3110
|
+
m[pc] = m[inst.out];
|
|
3111
|
+
onePassRunes[pc] = onePassRunes[inst.out] ? onePassRunes[inst.out].slice() : [];
|
|
3112
|
+
inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
|
|
3113
|
+
break;
|
|
3114
|
+
}
|
|
3115
|
+
case Inst.MATCH:
|
|
3116
|
+
case Inst.FAIL:
|
|
3117
|
+
{
|
|
3118
|
+
m[pc] = inst.op === Inst.MATCH;
|
|
3119
|
+
break;
|
|
3120
|
+
}
|
|
3121
|
+
case Inst.RUNE:
|
|
3122
|
+
{
|
|
3123
|
+
m[pc] = false;
|
|
3124
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3125
|
+
instQueue.insert(inst.out);
|
|
3126
|
+
if (!inst.runes || inst.runes.length === 0) {
|
|
3127
|
+
onePassRunes[pc] = [];
|
|
3128
|
+
inst.next = new Uint32Array([inst.out]);
|
|
3129
|
+
break;
|
|
3130
|
+
}
|
|
3131
|
+
let runes = [];
|
|
3132
|
+
if (inst.runes.length === 1 && (inst.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
3133
|
+
const r0 = inst.runes[0];
|
|
3134
|
+
runes.push(r0, r0);
|
|
3135
|
+
for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
|
|
3136
|
+
runes.push(r1, r1);
|
|
3137
|
+
}
|
|
3138
|
+
runes.sort((a, b) => a - b);
|
|
3139
|
+
} else {
|
|
3140
|
+
runes.push(...inst.runes);
|
|
3141
|
+
}
|
|
3142
|
+
onePassRunes[pc] = runes;
|
|
3143
|
+
inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
|
|
3144
|
+
inst.op = Inst.RUNE;
|
|
3145
|
+
break;
|
|
3146
|
+
}
|
|
3147
|
+
case Inst.RUNE1:
|
|
3148
|
+
{
|
|
3149
|
+
m[pc] = false;
|
|
3150
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3151
|
+
instQueue.insert(inst.out);
|
|
3152
|
+
let runes = [];
|
|
3153
|
+
if ((inst.arg & RE2Flags.FOLD_CASE) !== 0) {
|
|
3154
|
+
const r0 = inst.runes[0];
|
|
3155
|
+
runes.push(r0, r0);
|
|
3156
|
+
for (let r1 = Unicode.simpleFold(r0); r1 !== r0; r1 = Unicode.simpleFold(r1)) {
|
|
3157
|
+
runes.push(r1, r1);
|
|
3158
|
+
}
|
|
3159
|
+
runes.sort((a, b) => a - b);
|
|
3160
|
+
} else {
|
|
3161
|
+
runes.push(inst.runes[0], inst.runes[0]);
|
|
3162
|
+
}
|
|
3163
|
+
onePassRunes[pc] = runes;
|
|
3164
|
+
inst.next = new Uint32Array(Math.floor(runes.length / 2) + 1).fill(inst.out);
|
|
3165
|
+
inst.op = Inst.RUNE;
|
|
3166
|
+
break;
|
|
3167
|
+
}
|
|
3168
|
+
case Inst.RUNE_ANY:
|
|
3169
|
+
{
|
|
3170
|
+
m[pc] = false;
|
|
3171
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3172
|
+
instQueue.insert(inst.out);
|
|
3173
|
+
onePassRunes[pc] = [0, Unicode.MAX_RUNE];
|
|
3174
|
+
inst.next = new Uint32Array([inst.out]);
|
|
3175
|
+
break;
|
|
3176
|
+
}
|
|
3177
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3178
|
+
{
|
|
3179
|
+
m[pc] = false;
|
|
3180
|
+
if (inst.next && inst.next.length > 0) break;
|
|
3181
|
+
instQueue.insert(inst.out);
|
|
3182
|
+
onePassRunes[pc] = [0, 9, 11, Unicode.MAX_RUNE]; // \n is 10
|
|
3183
|
+
inst.next = new Uint32Array(Math.floor(onePassRunes[pc].length / 2) + 1).fill(inst.out);
|
|
3184
|
+
break;
|
|
3185
|
+
}
|
|
3186
|
+
}
|
|
3187
|
+
return ok;
|
|
3188
|
+
};
|
|
3189
|
+
instQueue.clear();
|
|
3190
|
+
instQueue.insert(p.start);
|
|
3191
|
+
while (!instQueue.empty()) {
|
|
3192
|
+
visitQueue.clear();
|
|
3193
|
+
const pc = instQueue.next();
|
|
3194
|
+
if (!check(pc)) return null;
|
|
3195
|
+
}
|
|
3196
|
+
for (let i = 0; i < p.inst.length; i++) {
|
|
3197
|
+
if (onePassRunes[i]) p.inst[i].runes = onePassRunes[i];
|
|
3198
|
+
}
|
|
3199
|
+
return p;
|
|
3200
|
+
};
|
|
3201
|
+
const cleanupOnePass = (p, original) => {
|
|
3202
|
+
for (let ix = 0; ix < original.inst.length; ix++) {
|
|
3203
|
+
const instOriginal = original.inst[ix];
|
|
3204
|
+
switch (instOriginal.op) {
|
|
3205
|
+
case Inst.ALT:
|
|
3206
|
+
case Inst.ALT_MATCH:
|
|
3207
|
+
case Inst.RUNE:
|
|
3208
|
+
break;
|
|
3209
|
+
case Inst.CAPTURE:
|
|
3210
|
+
case Inst.EMPTY_WIDTH:
|
|
3211
|
+
case Inst.NOP:
|
|
3212
|
+
case Inst.MATCH:
|
|
3213
|
+
case Inst.FAIL:
|
|
3214
|
+
p.inst[ix].next = null;
|
|
3215
|
+
break;
|
|
3216
|
+
case Inst.RUNE1:
|
|
3217
|
+
case Inst.RUNE_ANY:
|
|
3218
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3219
|
+
p.inst[ix].next = null;
|
|
3220
|
+
p.inst[ix].op = instOriginal.op;
|
|
3221
|
+
p.inst[ix].runes = instOriginal.runes ? instOriginal.runes.slice() : [];
|
|
3222
|
+
break;
|
|
3223
|
+
}
|
|
3224
|
+
}
|
|
3225
|
+
};
|
|
3226
|
+
class OnePass {
|
|
3227
|
+
static compile(prog) {
|
|
3228
|
+
if (prog.start === 0) return null;
|
|
3229
|
+
const startInst = prog.inst[prog.start];
|
|
3230
|
+
// onepass regexps must be strictly anchored
|
|
3231
|
+
if (startInst.op !== Inst.EMPTY_WIDTH || (startInst.arg & Utils.EMPTY_BEGIN_TEXT) === 0) {
|
|
3232
|
+
return null;
|
|
2283
3233
|
}
|
|
2284
|
-
|
|
2285
|
-
|
|
2286
|
-
|
|
2287
|
-
|
|
2288
|
-
|
|
2289
|
-
|
|
2290
|
-
const key = charCode + (anchor === RE2Flags.UNANCHORED ? 0 : Unicode.MAX_RUNE + 1);
|
|
2291
|
-
state.nextMap.set(key, nextState);
|
|
3234
|
+
let hasAlt = false;
|
|
3235
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3236
|
+
if (prog.inst[i].op === Inst.ALT || prog.inst[i].op === Inst.ALT_MATCH) {
|
|
3237
|
+
hasAlt = true;
|
|
3238
|
+
break;
|
|
3239
|
+
}
|
|
2292
3240
|
}
|
|
2293
|
-
|
|
2294
|
-
|
|
2295
|
-
|
|
2296
|
-
|
|
2297
|
-
|
|
2298
|
-
|
|
2299
|
-
|
|
3241
|
+
for (let i = 0; i < prog.inst.length; i++) {
|
|
3242
|
+
const inst = prog.inst[i];
|
|
3243
|
+
const opOut = prog.inst[inst.out].op;
|
|
3244
|
+
switch (inst.op) {
|
|
3245
|
+
case Inst.ALT:
|
|
3246
|
+
case Inst.ALT_MATCH:
|
|
3247
|
+
if (opOut === Inst.MATCH || prog.inst[inst.arg].op === Inst.MATCH) {
|
|
3248
|
+
return null;
|
|
3249
|
+
}
|
|
3250
|
+
break;
|
|
3251
|
+
case Inst.EMPTY_WIDTH:
|
|
3252
|
+
if (opOut === Inst.MATCH) {
|
|
3253
|
+
if ((inst.arg & Utils.EMPTY_END_TEXT) === Utils.EMPTY_END_TEXT) {
|
|
3254
|
+
continue;
|
|
3255
|
+
}
|
|
3256
|
+
return null;
|
|
3257
|
+
}
|
|
3258
|
+
break;
|
|
3259
|
+
default:
|
|
3260
|
+
if (opOut === Inst.MATCH && hasAlt) {
|
|
3261
|
+
return null;
|
|
3262
|
+
}
|
|
3263
|
+
break;
|
|
3264
|
+
}
|
|
2300
3265
|
}
|
|
2301
|
-
|
|
2302
|
-
|
|
2303
|
-
|
|
3266
|
+
let p = onePassCopy(prog);
|
|
3267
|
+
p = makeOnePass(p);
|
|
3268
|
+
if (p !== null) {
|
|
3269
|
+
cleanupOnePass(p, prog);
|
|
2304
3270
|
}
|
|
2305
|
-
|
|
2306
|
-
|
|
2307
|
-
|
|
2308
|
-
|
|
2309
|
-
|
|
2310
|
-
|
|
2311
|
-
|
|
3271
|
+
return p;
|
|
3272
|
+
}
|
|
3273
|
+
static next(inst, r) {
|
|
3274
|
+
const nextIdx = inst.matchRunePos(r);
|
|
3275
|
+
if (nextIdx >= 0) return inst.next[nextIdx];
|
|
3276
|
+
if (inst.op === Inst.ALT_MATCH) return inst.out;
|
|
3277
|
+
return 0; // fail
|
|
3278
|
+
}
|
|
3279
|
+
static execute(re2, input, pos, anchor, ncap) {
|
|
3280
|
+
const onepass = re2.onepass;
|
|
3281
|
+
if (!onepass) return null;
|
|
3282
|
+
const matchcap = new Int32Array(ncap).fill(-1);
|
|
3283
|
+
let matched = false;
|
|
3284
|
+
let r = input.step(pos);
|
|
3285
|
+
let rune = r >> 3;
|
|
3286
|
+
let width = r & 7;
|
|
3287
|
+
let r1 = MachineInputBase.EOF();
|
|
3288
|
+
let rune1 = -1;
|
|
3289
|
+
let width1 = 0;
|
|
3290
|
+
if (r !== MachineInputBase.EOF()) {
|
|
3291
|
+
r1 = input.step(pos + width);
|
|
3292
|
+
if (r1 !== MachineInputBase.EOF()) {
|
|
3293
|
+
rune1 = r1 >> 3;
|
|
3294
|
+
width1 = r1 & 7;
|
|
2312
3295
|
}
|
|
2313
3296
|
}
|
|
2314
|
-
let
|
|
2315
|
-
|
|
2316
|
-
|
|
2317
|
-
|
|
2318
|
-
|
|
2319
|
-
|
|
2320
|
-
|
|
2321
|
-
|
|
2322
|
-
|
|
3297
|
+
let flag = pos === 0 ? Utils.emptyOpContext(-1, rune) : input.context(pos);
|
|
3298
|
+
let pc = onepass.start;
|
|
3299
|
+
let inst;
|
|
3300
|
+
while (true) {
|
|
3301
|
+
inst = onepass.inst[pc];
|
|
3302
|
+
pc = inst.out;
|
|
3303
|
+
switch (inst.op) {
|
|
3304
|
+
case Inst.MATCH:
|
|
3305
|
+
{
|
|
3306
|
+
matched = true;
|
|
3307
|
+
if (matchcap.length > 0) {
|
|
3308
|
+
matchcap[0] = 0;
|
|
3309
|
+
matchcap[1] = pos;
|
|
3310
|
+
}
|
|
3311
|
+
return ncap === 0 ? [] : Array.from(matchcap);
|
|
3312
|
+
}
|
|
3313
|
+
case Inst.RUNE:
|
|
3314
|
+
if (!inst.matchRune(rune)) return null;
|
|
3315
|
+
break;
|
|
3316
|
+
case Inst.RUNE1:
|
|
3317
|
+
if (rune !== inst.runes[0]) return null;
|
|
3318
|
+
break;
|
|
3319
|
+
case Inst.RUNE_ANY:
|
|
3320
|
+
break;
|
|
3321
|
+
case Inst.RUNE_ANY_NOT_NL:
|
|
3322
|
+
if (rune === 10) return null;
|
|
3323
|
+
break;
|
|
3324
|
+
case Inst.ALT:
|
|
3325
|
+
case Inst.ALT_MATCH:
|
|
3326
|
+
pc = OnePass.next(inst, rune);
|
|
3327
|
+
continue;
|
|
3328
|
+
case Inst.FAIL:
|
|
3329
|
+
return null;
|
|
3330
|
+
case Inst.NOP:
|
|
3331
|
+
continue;
|
|
3332
|
+
case Inst.EMPTY_WIDTH:
|
|
3333
|
+
if ((inst.arg & ~flag) !== 0) return null;
|
|
3334
|
+
continue;
|
|
3335
|
+
case Inst.CAPTURE:
|
|
3336
|
+
if (inst.arg < matchcap.length) {
|
|
3337
|
+
matchcap[inst.arg] = pos;
|
|
3338
|
+
}
|
|
3339
|
+
continue;
|
|
3340
|
+
default:
|
|
3341
|
+
throw new RE2JSInternalException('bad inst');
|
|
2323
3342
|
}
|
|
2324
|
-
|
|
2325
|
-
|
|
2326
|
-
|
|
2327
|
-
|
|
2328
|
-
|
|
2329
|
-
|
|
2330
|
-
|
|
3343
|
+
if (width === 0) break;
|
|
3344
|
+
flag = Utils.emptyOpContext(rune, rune1);
|
|
3345
|
+
pos += width;
|
|
3346
|
+
rune = rune1;
|
|
3347
|
+
width = width1;
|
|
3348
|
+
if (rune !== -1) {
|
|
3349
|
+
r1 = input.step(pos + width);
|
|
3350
|
+
if (r1 !== MachineInputBase.EOF()) {
|
|
3351
|
+
rune1 = r1 >> 3;
|
|
3352
|
+
width1 = r1 & 7;
|
|
2331
3353
|
} else {
|
|
2332
|
-
|
|
3354
|
+
rune1 = -1;
|
|
3355
|
+
width1 = 0;
|
|
2333
3356
|
}
|
|
2334
3357
|
}
|
|
2335
|
-
|
|
2336
|
-
// If we hit a dead end, and anchored, fail early
|
|
2337
|
-
if (currentState.nfaStates.length === 0) {
|
|
2338
|
-
if (anchor !== RE2Flags.UNANCHORED) return false;
|
|
2339
|
-
}
|
|
2340
|
-
i += width;
|
|
2341
3358
|
}
|
|
2342
|
-
return
|
|
3359
|
+
if (!matched) return null;
|
|
3360
|
+
return ncap === 0 ? [] : Array.from(matchcap);
|
|
2343
3361
|
}
|
|
2344
3362
|
}
|
|
2345
3363
|
|
|
@@ -2424,7 +3442,7 @@
|
|
|
2424
3442
|
this.max = 0; // max for REPEAT
|
|
2425
3443
|
this.cap = 0; // capturing index, for CAPTURE
|
|
2426
3444
|
this.name = null; // capturing name, for CAPTURE
|
|
2427
|
-
this.namedGroups =
|
|
3445
|
+
this.namedGroups = Object.create(null); // map of group name -> capturing index
|
|
2428
3446
|
}
|
|
2429
3447
|
reinit() {
|
|
2430
3448
|
this.flags = 0;
|
|
@@ -2434,7 +3452,7 @@
|
|
|
2434
3452
|
this.min = 0;
|
|
2435
3453
|
this.max = 0;
|
|
2436
3454
|
this.name = null;
|
|
2437
|
-
this.namedGroups =
|
|
3455
|
+
this.namedGroups = Object.create(null);
|
|
2438
3456
|
}
|
|
2439
3457
|
toString() {
|
|
2440
3458
|
return this.appendTo();
|
|
@@ -2694,6 +3712,188 @@
|
|
|
2694
3712
|
}
|
|
2695
3713
|
}
|
|
2696
3714
|
|
|
3715
|
+
class Prefilter {
|
|
3716
|
+
static Type = {
|
|
3717
|
+
NONE: 0,
|
|
3718
|
+
EXACT: 1,
|
|
3719
|
+
AND: 2,
|
|
3720
|
+
OR: 3
|
|
3721
|
+
};
|
|
3722
|
+
constructor(type) {
|
|
3723
|
+
this.type = type;
|
|
3724
|
+
this.subs = [];
|
|
3725
|
+
this.str = '';
|
|
3726
|
+
this.bytes = null;
|
|
3727
|
+
}
|
|
3728
|
+
eval(input, pos) {
|
|
3729
|
+
switch (this.type) {
|
|
3730
|
+
case Prefilter.Type.NONE:
|
|
3731
|
+
return true;
|
|
3732
|
+
case Prefilter.Type.EXACT:
|
|
3733
|
+
return input.hasString(this, pos);
|
|
3734
|
+
case Prefilter.Type.AND:
|
|
3735
|
+
for (let i = 0; i < this.subs.length; i++) {
|
|
3736
|
+
if (!this.subs[i].eval(input, pos)) return false;
|
|
3737
|
+
}
|
|
3738
|
+
return true;
|
|
3739
|
+
case Prefilter.Type.OR:
|
|
3740
|
+
for (let i = 0; i < this.subs.length; i++) {
|
|
3741
|
+
if (this.subs[i].eval(input, pos)) return true;
|
|
3742
|
+
}
|
|
3743
|
+
return false;
|
|
3744
|
+
default:
|
|
3745
|
+
return true;
|
|
3746
|
+
}
|
|
3747
|
+
}
|
|
3748
|
+
}
|
|
3749
|
+
class PrefilterTree {
|
|
3750
|
+
static build(re) {
|
|
3751
|
+
const pf = PrefilterTree.fromRegexp(re);
|
|
3752
|
+
return PrefilterTree.simplify(pf);
|
|
3753
|
+
}
|
|
3754
|
+
static fromRegexp(re) {
|
|
3755
|
+
if (!re) return new Prefilter(Prefilter.Type.NONE);
|
|
3756
|
+
switch (re.op) {
|
|
3757
|
+
case Regexp.Op.NO_MATCH:
|
|
3758
|
+
case Regexp.Op.EMPTY_MATCH:
|
|
3759
|
+
case Regexp.Op.BEGIN_LINE:
|
|
3760
|
+
case Regexp.Op.END_LINE:
|
|
3761
|
+
case Regexp.Op.BEGIN_TEXT:
|
|
3762
|
+
case Regexp.Op.END_TEXT:
|
|
3763
|
+
case Regexp.Op.WORD_BOUNDARY:
|
|
3764
|
+
case Regexp.Op.NO_WORD_BOUNDARY:
|
|
3765
|
+
case Regexp.Op.CHAR_CLASS:
|
|
3766
|
+
case Regexp.Op.ANY_CHAR_NOT_NL:
|
|
3767
|
+
case Regexp.Op.ANY_CHAR:
|
|
3768
|
+
{
|
|
3769
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3770
|
+
}
|
|
3771
|
+
case Regexp.Op.LITERAL:
|
|
3772
|
+
{
|
|
3773
|
+
if (re.runes.length === 0 || (re.flags & RE2Flags.FOLD_CASE) !== 0) {
|
|
3774
|
+
// Skip case-folded literals for simplicity
|
|
3775
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3776
|
+
}
|
|
3777
|
+
const pf = new Prefilter(Prefilter.Type.EXACT);
|
|
3778
|
+
let str = '';
|
|
3779
|
+
for (let i = 0; i < re.runes.length; i++) {
|
|
3780
|
+
str += String.fromCodePoint(re.runes[i]);
|
|
3781
|
+
}
|
|
3782
|
+
pf.str = str;
|
|
3783
|
+
pf.bytes = Utils.stringToUtf8ByteArray(pf.str);
|
|
3784
|
+
return pf;
|
|
3785
|
+
}
|
|
3786
|
+
case Regexp.Op.CAPTURE:
|
|
3787
|
+
case Regexp.Op.PLUS:
|
|
3788
|
+
{
|
|
3789
|
+
return PrefilterTree.fromRegexp(re.subs[0]);
|
|
3790
|
+
}
|
|
3791
|
+
case Regexp.Op.REPEAT:
|
|
3792
|
+
{
|
|
3793
|
+
if (re.min >= 1) {
|
|
3794
|
+
return PrefilterTree.fromRegexp(re.subs[0]);
|
|
3795
|
+
}
|
|
3796
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3797
|
+
}
|
|
3798
|
+
case Regexp.Op.CONCAT:
|
|
3799
|
+
{
|
|
3800
|
+
const pf = new Prefilter(Prefilter.Type.AND);
|
|
3801
|
+
for (const sub of re.subs) {
|
|
3802
|
+
pf.subs.push(PrefilterTree.fromRegexp(sub));
|
|
3803
|
+
}
|
|
3804
|
+
return pf;
|
|
3805
|
+
}
|
|
3806
|
+
case Regexp.Op.ALTERNATE:
|
|
3807
|
+
{
|
|
3808
|
+
const pf = new Prefilter(Prefilter.Type.OR);
|
|
3809
|
+
for (const sub of re.subs) {
|
|
3810
|
+
pf.subs.push(PrefilterTree.fromRegexp(sub));
|
|
3811
|
+
}
|
|
3812
|
+
return pf;
|
|
3813
|
+
}
|
|
3814
|
+
default:
|
|
3815
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3816
|
+
}
|
|
3817
|
+
}
|
|
3818
|
+
static simplify(pf) {
|
|
3819
|
+
if (pf.type === Prefilter.Type.EXACT || pf.type === Prefilter.Type.NONE) {
|
|
3820
|
+
return pf;
|
|
3821
|
+
}
|
|
3822
|
+
if (pf.type === Prefilter.Type.AND) {
|
|
3823
|
+
const newSubs = [];
|
|
3824
|
+
for (const sub of pf.subs) {
|
|
3825
|
+
const s = PrefilterTree.simplify(sub);
|
|
3826
|
+
if (s.type !== Prefilter.Type.NONE) {
|
|
3827
|
+
if (s.type === Prefilter.Type.AND) {
|
|
3828
|
+
newSubs.push(...s.subs);
|
|
3829
|
+
} else {
|
|
3830
|
+
newSubs.push(s);
|
|
3831
|
+
}
|
|
3832
|
+
}
|
|
3833
|
+
}
|
|
3834
|
+
if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
|
|
3835
|
+
if (newSubs.length === 1) return newSubs[0];
|
|
3836
|
+
pf.subs = newSubs;
|
|
3837
|
+
return pf;
|
|
3838
|
+
}
|
|
3839
|
+
if (pf.type === Prefilter.Type.OR) {
|
|
3840
|
+
const newSubs = [];
|
|
3841
|
+
for (const sub of pf.subs) {
|
|
3842
|
+
const s = PrefilterTree.simplify(sub);
|
|
3843
|
+
if (s.type === Prefilter.Type.NONE) {
|
|
3844
|
+
// If any branch of an OR has no requirements, the whole OR has no requirements
|
|
3845
|
+
return new Prefilter(Prefilter.Type.NONE);
|
|
3846
|
+
}
|
|
3847
|
+
if (s.type === Prefilter.Type.OR) {
|
|
3848
|
+
newSubs.push(...s.subs);
|
|
3849
|
+
} else {
|
|
3850
|
+
newSubs.push(s);
|
|
3851
|
+
}
|
|
3852
|
+
}
|
|
3853
|
+
if (newSubs.length === 0) return new Prefilter(Prefilter.Type.NONE);
|
|
3854
|
+
if (newSubs.length === 1) return newSubs[0];
|
|
3855
|
+
|
|
3856
|
+
// De-duplicate EXACT branches
|
|
3857
|
+
const seen = new Set();
|
|
3858
|
+
const uniqueSubs = [];
|
|
3859
|
+
for (const sub of newSubs) {
|
|
3860
|
+
if (sub.type === Prefilter.Type.EXACT) {
|
|
3861
|
+
if (!seen.has(sub.str)) {
|
|
3862
|
+
seen.add(sub.str);
|
|
3863
|
+
uniqueSubs.push(sub);
|
|
3864
|
+
}
|
|
3865
|
+
} else {
|
|
3866
|
+
uniqueSubs.push(sub);
|
|
3867
|
+
}
|
|
3868
|
+
}
|
|
3869
|
+
pf.subs = uniqueSubs;
|
|
3870
|
+
return pf;
|
|
3871
|
+
}
|
|
3872
|
+
return pf;
|
|
3873
|
+
}
|
|
3874
|
+
}
|
|
3875
|
+
|
|
3876
|
+
/**
|
|
3877
|
+
* A list of instruction pointers waiting to be patched.
|
|
3878
|
+
* Tracks both `head` and `tail` to allow O(1) appending during compilation.
|
|
3879
|
+
* * Values are encoded integers, not standard memory pointers:
|
|
3880
|
+
* - Program instruction index: `l >> 1`
|
|
3881
|
+
* - Patch `.out` field if: `(l & 1) === 0`
|
|
3882
|
+
* - Patch `.arg` field if: `(l & 1) === 1`
|
|
3883
|
+
* - `0` denotes an empty list.
|
|
3884
|
+
* * @see https://swtch.com/~rsc/regexp/regexp1.html
|
|
3885
|
+
*/
|
|
3886
|
+
class PatchList {
|
|
3887
|
+
/**
|
|
3888
|
+
* @param {number} head - Encoded pointer to the start of the patch list.
|
|
3889
|
+
* @param {number} tail - Encoded pointer to the end of the patch list.
|
|
3890
|
+
*/
|
|
3891
|
+
constructor(head = 0, tail = 0) {
|
|
3892
|
+
this.head = head;
|
|
3893
|
+
this.tail = tail;
|
|
3894
|
+
}
|
|
3895
|
+
}
|
|
3896
|
+
|
|
2697
3897
|
/**
|
|
2698
3898
|
* A Prog is a compiled regular expression program.
|
|
2699
3899
|
*/
|
|
@@ -2795,39 +3995,30 @@
|
|
|
2795
3995
|
return i.arg;
|
|
2796
3996
|
}
|
|
2797
3997
|
patch(l, val) {
|
|
2798
|
-
|
|
2799
|
-
|
|
2800
|
-
|
|
2801
|
-
|
|
3998
|
+
let head = l.head;
|
|
3999
|
+
while (head !== 0) {
|
|
4000
|
+
const i = this.inst[head >> 1];
|
|
4001
|
+
if ((head & 1) === 0) {
|
|
4002
|
+
head = i.out;
|
|
2802
4003
|
i.out = val;
|
|
2803
4004
|
} else {
|
|
2804
|
-
|
|
4005
|
+
head = i.arg;
|
|
2805
4006
|
i.arg = val;
|
|
2806
4007
|
}
|
|
2807
4008
|
}
|
|
2808
4009
|
}
|
|
2809
4010
|
append(l1, l2) {
|
|
2810
|
-
if (l1 === 0)
|
|
2811
|
-
|
|
2812
|
-
|
|
2813
|
-
|
|
2814
|
-
|
|
2815
|
-
|
|
2816
|
-
|
|
2817
|
-
for (;;) {
|
|
2818
|
-
const next = this.next(last);
|
|
2819
|
-
if (next === 0) {
|
|
2820
|
-
break;
|
|
2821
|
-
}
|
|
2822
|
-
last = next;
|
|
2823
|
-
}
|
|
2824
|
-
const i = this.inst[last >> 1];
|
|
2825
|
-
if ((last & 1) === 0) {
|
|
2826
|
-
i.out = l2;
|
|
4011
|
+
if (l1.head === 0) return l2;
|
|
4012
|
+
if (l2.head === 0) return l1;
|
|
4013
|
+
|
|
4014
|
+
// We know exactly where the tail is
|
|
4015
|
+
const i = this.inst[l1.tail >> 1];
|
|
4016
|
+
if ((l1.tail & 1) === 0) {
|
|
4017
|
+
i.out = l2.head;
|
|
2827
4018
|
} else {
|
|
2828
|
-
i.arg = l2;
|
|
4019
|
+
i.arg = l2.head;
|
|
2829
4020
|
}
|
|
2830
|
-
return l1;
|
|
4021
|
+
return new PatchList(l1.head, l2.tail);
|
|
2831
4022
|
}
|
|
2832
4023
|
/**
|
|
2833
4024
|
*
|
|
@@ -2856,7 +4047,7 @@
|
|
|
2856
4047
|
* @class
|
|
2857
4048
|
*/
|
|
2858
4049
|
class Frag {
|
|
2859
|
-
constructor(i = 0, out =
|
|
4050
|
+
constructor(i = 0, out = new PatchList(), nullable = false) {
|
|
2860
4051
|
this.i = i; // an instruction address (pc).
|
|
2861
4052
|
this.out = out; // a patch list; see explanation in Prog.js
|
|
2862
4053
|
this.nullable = nullable; // whether the fragment can match the empty string
|
|
@@ -2881,6 +4072,33 @@
|
|
|
2881
4072
|
c.prog.start = f.i;
|
|
2882
4073
|
return c.prog;
|
|
2883
4074
|
}
|
|
4075
|
+
static compileSet(regexps) {
|
|
4076
|
+
const c = new Compiler();
|
|
4077
|
+
if (regexps.length === 0) {
|
|
4078
|
+
c.prog.start = c.newInst(Inst.FAIL).i;
|
|
4079
|
+
return c.prog;
|
|
4080
|
+
}
|
|
4081
|
+
let starts = [];
|
|
4082
|
+
for (let i = 0; i < regexps.length; i++) {
|
|
4083
|
+
const f = c.compile(regexps[i]);
|
|
4084
|
+
const m = c.newInst(Inst.MATCH);
|
|
4085
|
+
c.prog.getInst(m.i).arg = i; // Store the regex index
|
|
4086
|
+
c.prog.patch(f.out, m.i);
|
|
4087
|
+
starts.push(f.i);
|
|
4088
|
+
}
|
|
4089
|
+
|
|
4090
|
+
// Link starts together via ALT
|
|
4091
|
+
let start = starts[0];
|
|
4092
|
+
for (let i = 1; i < starts.length; i++) {
|
|
4093
|
+
const f = c.newInst(Inst.ALT);
|
|
4094
|
+
const inst = c.prog.getInst(f.i);
|
|
4095
|
+
inst.out = start;
|
|
4096
|
+
inst.arg = starts[i];
|
|
4097
|
+
start = f.i;
|
|
4098
|
+
}
|
|
4099
|
+
c.prog.start = start;
|
|
4100
|
+
return c.prog;
|
|
4101
|
+
}
|
|
2884
4102
|
constructor() {
|
|
2885
4103
|
this.prog = new Prog();
|
|
2886
4104
|
this.newInst(Inst.FAIL);
|
|
@@ -2893,7 +4111,7 @@
|
|
|
2893
4111
|
// Returns a no-op fragment. Sometimes unavoidable.
|
|
2894
4112
|
nop() {
|
|
2895
4113
|
const f = this.newInst(Inst.NOP);
|
|
2896
|
-
f.out = f.i << 1;
|
|
4114
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2897
4115
|
return f;
|
|
2898
4116
|
}
|
|
2899
4117
|
fail() {
|
|
@@ -2904,7 +4122,7 @@
|
|
|
2904
4122
|
// Given a fragment a, returns a fragment with capturing parens around a.
|
|
2905
4123
|
cap(arg) {
|
|
2906
4124
|
const f = this.newInst(Inst.CAPTURE);
|
|
2907
|
-
f.out = f.i << 1;
|
|
4125
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2908
4126
|
this.prog.getInst(f.i).arg = arg;
|
|
2909
4127
|
if (this.prog.numCap < arg + 1) {
|
|
2910
4128
|
this.prog.numCap = arg + 1;
|
|
@@ -2952,10 +4170,10 @@
|
|
|
2952
4170
|
const i = this.prog.getInst(f.i);
|
|
2953
4171
|
if (nongreedy) {
|
|
2954
4172
|
i.arg = f1.i;
|
|
2955
|
-
f.out = f.i << 1;
|
|
4173
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2956
4174
|
} else {
|
|
2957
4175
|
i.out = f1.i;
|
|
2958
|
-
f.out = f.i << 1 | 1;
|
|
4176
|
+
f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
|
|
2959
4177
|
}
|
|
2960
4178
|
this.prog.patch(f1.out, f.i);
|
|
2961
4179
|
return f;
|
|
@@ -2967,10 +4185,10 @@
|
|
|
2967
4185
|
const i = this.prog.getInst(f.i);
|
|
2968
4186
|
if (nongreedy) {
|
|
2969
4187
|
i.arg = f1.i;
|
|
2970
|
-
f.out = f.i << 1;
|
|
4188
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2971
4189
|
} else {
|
|
2972
4190
|
i.out = f1.i;
|
|
2973
|
-
f.out = f.i << 1 | 1;
|
|
4191
|
+
f.out = new PatchList(f.i << 1 | 1, f.i << 1 | 1);
|
|
2974
4192
|
}
|
|
2975
4193
|
f.out = this.prog.append(f.out, f1.out);
|
|
2976
4194
|
return f;
|
|
@@ -2993,7 +4211,7 @@
|
|
|
2993
4211
|
empty(op) {
|
|
2994
4212
|
const f = this.newInst(Inst.EMPTY_WIDTH);
|
|
2995
4213
|
this.prog.getInst(f.i).arg = op;
|
|
2996
|
-
f.out = f.i << 1;
|
|
4214
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
2997
4215
|
return f;
|
|
2998
4216
|
}
|
|
2999
4217
|
|
|
@@ -3008,7 +4226,7 @@
|
|
|
3008
4226
|
flags &= -2;
|
|
3009
4227
|
}
|
|
3010
4228
|
i.arg = flags;
|
|
3011
|
-
f.out = f.i << 1;
|
|
4229
|
+
f.out = new PatchList(f.i << 1, f.i << 1);
|
|
3012
4230
|
if ((flags & RE2Flags.FOLD_CASE) === 0 && runes.length === 1 || runes.length === 2 && runes[0] === runes[1]) {
|
|
3013
4231
|
i.op = Inst.RUNE1;
|
|
3014
4232
|
} else if (runes.length === 2 && runes[0] === 0 && runes[1] === Unicode.MAX_RUNE) {
|
|
@@ -3113,23 +4331,92 @@
|
|
|
3113
4331
|
}
|
|
3114
4332
|
switch (re.op) {
|
|
3115
4333
|
case Regexp.Op.CAPTURE:
|
|
4334
|
+
{
|
|
4335
|
+
const sub = Simplify.simplify(re.subs[0]);
|
|
4336
|
+
if (sub !== re.subs[0]) {
|
|
4337
|
+
const nre = Regexp.fromRegexp(re);
|
|
4338
|
+
nre.runes = [];
|
|
4339
|
+
nre.subs = [sub];
|
|
4340
|
+
return nre;
|
|
4341
|
+
}
|
|
4342
|
+
return re;
|
|
4343
|
+
}
|
|
3116
4344
|
case Regexp.Op.CONCAT:
|
|
3117
4345
|
case Regexp.Op.ALTERNATE:
|
|
3118
4346
|
{
|
|
3119
|
-
|
|
4347
|
+
const newSubs = [];
|
|
4348
|
+
let changed = false;
|
|
3120
4349
|
for (let i = 0; i < re.subs.length; i++) {
|
|
3121
4350
|
const sub = re.subs[i];
|
|
3122
4351
|
const nsub = Simplify.simplify(sub);
|
|
3123
|
-
if (
|
|
3124
|
-
|
|
3125
|
-
|
|
3126
|
-
|
|
4352
|
+
if (nsub !== sub) {
|
|
4353
|
+
changed = true;
|
|
4354
|
+
}
|
|
4355
|
+
if (re.op === Regexp.Op.CONCAT) {
|
|
4356
|
+
// If any part of a CONCAT is mathematically impossible,
|
|
4357
|
+
// the entire CONCAT sequence becomes impossible.
|
|
4358
|
+
if (nsub.op === Regexp.Op.NO_MATCH) {
|
|
4359
|
+
return new Regexp(Regexp.Op.NO_MATCH);
|
|
4360
|
+
}
|
|
4361
|
+
// Drop empty 0-width match nodes entirely from sequences
|
|
4362
|
+
if (nsub.op === Regexp.Op.EMPTY_MATCH) {
|
|
4363
|
+
changed = true;
|
|
4364
|
+
continue;
|
|
4365
|
+
}
|
|
4366
|
+
// Flatten nested concatenations
|
|
4367
|
+
if (nsub.op === Regexp.Op.CONCAT) {
|
|
4368
|
+
changed = true;
|
|
4369
|
+
newSubs.push(...nsub.subs);
|
|
4370
|
+
continue;
|
|
4371
|
+
}
|
|
4372
|
+
} else if (re.op === Regexp.Op.ALTERNATE) {
|
|
4373
|
+
// Drop impossible branches from alternations
|
|
4374
|
+
if (nsub.op === Regexp.Op.NO_MATCH) {
|
|
4375
|
+
changed = true;
|
|
4376
|
+
continue;
|
|
4377
|
+
}
|
|
4378
|
+
// Flatten nested alternations
|
|
4379
|
+
if (nsub.op === Regexp.Op.ALTERNATE) {
|
|
4380
|
+
changed = true;
|
|
4381
|
+
newSubs.push(...nsub.subs);
|
|
4382
|
+
continue;
|
|
4383
|
+
}
|
|
4384
|
+
}
|
|
4385
|
+
newSubs.push(nsub);
|
|
4386
|
+
}
|
|
4387
|
+
if (changed) {
|
|
4388
|
+
// If we filtered out all nodes, return the mathematically correct fallback
|
|
4389
|
+
if (newSubs.length === 0) {
|
|
4390
|
+
return new Regexp(re.op === Regexp.Op.CONCAT ? Regexp.Op.EMPTY_MATCH : Regexp.Op.NO_MATCH);
|
|
3127
4391
|
}
|
|
3128
|
-
|
|
3129
|
-
|
|
4392
|
+
// If only 1 node remains, we don't need a CONCAT/ALT container at all
|
|
4393
|
+
if (newSubs.length === 1) {
|
|
4394
|
+
return newSubs[0];
|
|
3130
4395
|
}
|
|
4396
|
+
const nre = Regexp.fromRegexp(re);
|
|
4397
|
+
nre.runes = [];
|
|
4398
|
+
nre.subs = newSubs;
|
|
4399
|
+
return nre;
|
|
4400
|
+
}
|
|
4401
|
+
return re;
|
|
4402
|
+
}
|
|
4403
|
+
case Regexp.Op.CHAR_CLASS:
|
|
4404
|
+
{
|
|
4405
|
+
if (re.runes === null) return re;
|
|
4406
|
+
|
|
4407
|
+
// Empty character classes match nothing.
|
|
4408
|
+
if (re.runes.length === 0) {
|
|
4409
|
+
return new Regexp(Regexp.Op.NO_MATCH);
|
|
4410
|
+
}
|
|
4411
|
+
// Full character classes match everything.
|
|
4412
|
+
if (re.runes.length === 2 && re.runes[0] === 0 && re.runes[1] === Unicode.MAX_RUNE) {
|
|
4413
|
+
return new Regexp(Regexp.Op.ANY_CHAR);
|
|
4414
|
+
}
|
|
4415
|
+
// Standard catch-all except newline
|
|
4416
|
+
if (re.runes.length === 4 && re.runes[0] === 0 && re.runes[1] === Codepoint.CODES.get('\n') - 1 && re.runes[2] === Codepoint.CODES.get('\n') + 1 && re.runes[3] === Unicode.MAX_RUNE) {
|
|
4417
|
+
return new Regexp(Regexp.Op.ANY_CHAR_NOT_NL);
|
|
3131
4418
|
}
|
|
3132
|
-
return
|
|
4419
|
+
return re;
|
|
3133
4420
|
}
|
|
3134
4421
|
case Regexp.Op.STAR:
|
|
3135
4422
|
case Regexp.Op.PLUS:
|
|
@@ -3166,7 +4453,9 @@
|
|
|
3166
4453
|
}
|
|
3167
4454
|
subs.push(Simplify.simplify1(Regexp.Op.PLUS, re.flags, sub, null));
|
|
3168
4455
|
nre.subs = subs.slice(0);
|
|
3169
|
-
|
|
4456
|
+
|
|
4457
|
+
// Ensure newly created CONCAT is properly flattened
|
|
4458
|
+
return Simplify.simplify(nre);
|
|
3170
4459
|
}
|
|
3171
4460
|
// Special case x{0} handled above.
|
|
3172
4461
|
|
|
@@ -3204,7 +4493,8 @@
|
|
|
3204
4493
|
if (prefixSubs !== null) {
|
|
3205
4494
|
const prefix = new Regexp(Regexp.Op.CONCAT);
|
|
3206
4495
|
prefix.subs = prefixSubs.slice(0);
|
|
3207
|
-
|
|
4496
|
+
// Ensure newly created CONCAT is properly flattened
|
|
4497
|
+
return Simplify.simplify(prefix);
|
|
3208
4498
|
}
|
|
3209
4499
|
|
|
3210
4500
|
// Some degenerate case like min > max or min < max < 0.
|
|
@@ -3237,6 +4527,13 @@
|
|
|
3237
4527
|
return sub;
|
|
3238
4528
|
}
|
|
3239
4529
|
|
|
4530
|
+
// Handle impossible targets gracefully.
|
|
4531
|
+
// e.g. Trying to match "NO_MATCH" 0 or 1 times (QUEST/STAR) evaluates to EMPTY_MATCH.
|
|
4532
|
+
if (sub.op === Regexp.Op.NO_MATCH) {
|
|
4533
|
+
if (op === Regexp.Op.PLUS) return sub; // 1+ times is impossible
|
|
4534
|
+
return new Regexp(Regexp.Op.EMPTY_MATCH);
|
|
4535
|
+
}
|
|
4536
|
+
|
|
3240
4537
|
// The operators are idempotent if the flags match.
|
|
3241
4538
|
if (op === sub.op && (flags & RE2Flags.NON_GREEDY) === (sub.flags & RE2Flags.NON_GREEDY)) {
|
|
3242
4539
|
return sub;
|
|
@@ -3244,10 +4541,10 @@
|
|
|
3244
4541
|
if (re !== null && re.op === op && (re.flags & RE2Flags.NON_GREEDY) === (flags & RE2Flags.NON_GREEDY) && sub === re.subs[0]) {
|
|
3245
4542
|
return re;
|
|
3246
4543
|
}
|
|
3247
|
-
|
|
3248
|
-
|
|
3249
|
-
|
|
3250
|
-
return
|
|
4544
|
+
const nre = new Regexp(op);
|
|
4545
|
+
nre.flags = flags;
|
|
4546
|
+
nre.subs = [sub];
|
|
4547
|
+
return nre;
|
|
3251
4548
|
}
|
|
3252
4549
|
}
|
|
3253
4550
|
|
|
@@ -3593,16 +4890,6 @@
|
|
|
3593
4890
|
}
|
|
3594
4891
|
}
|
|
3595
4892
|
|
|
3596
|
-
class Pair {
|
|
3597
|
-
static of(first, second) {
|
|
3598
|
-
return new Pair(first, second);
|
|
3599
|
-
}
|
|
3600
|
-
constructor(first, second) {
|
|
3601
|
-
this.first = first;
|
|
3602
|
-
this.second = second;
|
|
3603
|
-
}
|
|
3604
|
-
}
|
|
3605
|
-
|
|
3606
4893
|
// StringIterator: a stream of runes with an opaque cursor, permitting
|
|
3607
4894
|
// rewinding. The units of the cursor are not specified beyond the
|
|
3608
4895
|
// fact that ASCII characters are single width. (Cursor positions
|
|
@@ -3749,18 +5036,59 @@
|
|
|
3749
5036
|
// stride).
|
|
3750
5037
|
static ANY_TABLE = new UnicodeRangeTable(new Uint32Array([0, Unicode.MAX_RUNE, 1]));
|
|
3751
5038
|
|
|
5039
|
+
// Ascii tables
|
|
5040
|
+
static ASCII_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1]));
|
|
5041
|
+
static ASCII_FOLD_TABLE = new UnicodeRangeTable(new Uint32Array([0, 0x7f, 1, 0x017f, 0x017f, 1,
|
|
5042
|
+
// Old English long s (ſ), folds to S/s.
|
|
5043
|
+
0x212a, 0x212a, 1 // Kelvin K, folds to K/k.
|
|
5044
|
+
]));
|
|
5045
|
+
|
|
3752
5046
|
// unicodeTable() returns the Unicode RangeTable identified by name
|
|
3753
5047
|
// and the table of additional fold-equivalent code points.
|
|
3754
5048
|
// Returns null if |name| does not identify a Unicode character range.
|
|
3755
5049
|
static unicodeTable(name) {
|
|
3756
5050
|
if (name === 'Any') {
|
|
3757
|
-
return
|
|
5051
|
+
return {
|
|
5052
|
+
tab: Parser.ANY_TABLE,
|
|
5053
|
+
fold: Parser.ANY_TABLE,
|
|
5054
|
+
sign: 1
|
|
5055
|
+
};
|
|
5056
|
+
}
|
|
5057
|
+
if (name === 'Ascii') {
|
|
5058
|
+
return {
|
|
5059
|
+
tab: Parser.ASCII_TABLE,
|
|
5060
|
+
fold: Parser.ASCII_FOLD_TABLE,
|
|
5061
|
+
sign: 1
|
|
5062
|
+
};
|
|
5063
|
+
}
|
|
5064
|
+
if (name === 'Assigned') {
|
|
5065
|
+
// Assigned is the mathematical inversion of Cn (Unassigned)
|
|
5066
|
+
return {
|
|
5067
|
+
tab: UnicodeTables.CATEGORIES.get('Cn'),
|
|
5068
|
+
fold: UnicodeTables.CATEGORIES.get('Cn'),
|
|
5069
|
+
sign: -1
|
|
5070
|
+
};
|
|
5071
|
+
}
|
|
5072
|
+
if (name === 'Lc') {
|
|
5073
|
+
return {
|
|
5074
|
+
tab: UnicodeTables.CATEGORIES.get('LC'),
|
|
5075
|
+
fold: UnicodeTables.FOLD_CATEGORIES.get('LC'),
|
|
5076
|
+
sign: 1
|
|
5077
|
+
};
|
|
3758
5078
|
}
|
|
3759
5079
|
if (UnicodeTables.CATEGORIES.has(name)) {
|
|
3760
|
-
return
|
|
5080
|
+
return {
|
|
5081
|
+
tab: UnicodeTables.CATEGORIES.get(name),
|
|
5082
|
+
fold: UnicodeTables.FOLD_CATEGORIES.get(name),
|
|
5083
|
+
sign: 1
|
|
5084
|
+
};
|
|
3761
5085
|
}
|
|
3762
5086
|
if (UnicodeTables.SCRIPTS.has(name)) {
|
|
3763
|
-
return
|
|
5087
|
+
return {
|
|
5088
|
+
tab: UnicodeTables.SCRIPTS.get(name),
|
|
5089
|
+
fold: UnicodeTables.FOLD_SCRIPT.get(name),
|
|
5090
|
+
sign: 1
|
|
5091
|
+
};
|
|
3764
5092
|
}
|
|
3765
5093
|
return null;
|
|
3766
5094
|
}
|
|
@@ -4069,7 +5397,7 @@
|
|
|
4069
5397
|
this.flags = flags;
|
|
4070
5398
|
// number of capturing groups seen
|
|
4071
5399
|
this.numCap = 0;
|
|
4072
|
-
this.namedGroups =
|
|
5400
|
+
this.namedGroups = Object.create(null);
|
|
4073
5401
|
// Stack of parsed expressions.
|
|
4074
5402
|
this.stack = [];
|
|
4075
5403
|
this.free = null;
|
|
@@ -4480,8 +5808,9 @@
|
|
|
4480
5808
|
let i = 0;
|
|
4481
5809
|
for (let sub of subs) {
|
|
4482
5810
|
if (sub.op === op) {
|
|
4483
|
-
|
|
4484
|
-
|
|
5811
|
+
for (let j = 0; j < sub.subs.length; j++) {
|
|
5812
|
+
newsubs[i++] = sub.subs[j];
|
|
5813
|
+
}
|
|
4485
5814
|
this.reuse(sub);
|
|
4486
5815
|
} else {
|
|
4487
5816
|
newsubs[i++] = sub;
|
|
@@ -4912,9 +6241,11 @@
|
|
|
4912
6241
|
const i = lit.indexOf('\\E');
|
|
4913
6242
|
if (i >= 0) {
|
|
4914
6243
|
lit = lit.substring(0, i);
|
|
6244
|
+
t.skipString(lit);
|
|
6245
|
+
t.skipString('\\E');
|
|
6246
|
+
} else {
|
|
6247
|
+
t.skipString(lit);
|
|
4915
6248
|
}
|
|
4916
|
-
t.skipString(lit);
|
|
4917
|
-
t.skipString('\\E');
|
|
4918
6249
|
let j = 0;
|
|
4919
6250
|
while (j < lit.length) {
|
|
4920
6251
|
const codepoint = lit.codePointAt(j);
|
|
@@ -4930,6 +6261,9 @@
|
|
|
4930
6261
|
t.rewindTo(savedPos);
|
|
4931
6262
|
break;
|
|
4932
6263
|
}
|
|
6264
|
+
} else {
|
|
6265
|
+
// Unconditionally rewind if PERL_X is off, or if string ended abruptly
|
|
6266
|
+
t.rewindTo(savedPos);
|
|
4933
6267
|
}
|
|
4934
6268
|
const re = this.newRegexp(Regexp.Op.CHAR_CLASS);
|
|
4935
6269
|
re.flags = this.flags;
|
|
@@ -5255,8 +6589,11 @@
|
|
|
5255
6589
|
if (pair === null) {
|
|
5256
6590
|
throw new RE2JSSyntaxException(Parser.ERR_INVALID_CHAR_RANGE, t.from(startPos));
|
|
5257
6591
|
}
|
|
5258
|
-
|
|
5259
|
-
|
|
6592
|
+
if (pair.sign < 0) {
|
|
6593
|
+
sign = 0 - sign;
|
|
6594
|
+
}
|
|
6595
|
+
const tab = pair.tab;
|
|
6596
|
+
const fold = pair.fold; // fold-equivalent table
|
|
5260
6597
|
// Variation of CharClass.appendGroup() for tables.
|
|
5261
6598
|
if ((this.flags & RE2Flags.FOLD_CASE) === 0 || fold === null) {
|
|
5262
6599
|
cc.appendTableWithSign(tab, sign);
|
|
@@ -5400,6 +6737,7 @@
|
|
|
5400
6737
|
res.prefixUTF8 = re2.prefixUTF8;
|
|
5401
6738
|
res.prefixComplete = re2.prefixComplete;
|
|
5402
6739
|
res.prefixRune = re2.prefixRune;
|
|
6740
|
+
res.prefilter = re2.prefilter;
|
|
5403
6741
|
return res;
|
|
5404
6742
|
}
|
|
5405
6743
|
|
|
@@ -5442,8 +6780,10 @@
|
|
|
5442
6780
|
let re = Parser.parse(expr, mode);
|
|
5443
6781
|
const maxCap = re.maxCap();
|
|
5444
6782
|
re = Simplify.simplify(re);
|
|
6783
|
+
const prefilter = PrefilterTree.build(re);
|
|
5445
6784
|
const prog = Compiler.compileRegexp(re);
|
|
5446
6785
|
const re2 = new RE2(expr, prog, maxCap, longest);
|
|
6786
|
+
re2.prefilter = prefilter.type === Prefilter.Type.NONE ? null : prefilter;
|
|
5447
6787
|
const [prefixCompl, prefixStr] = prog.prefix();
|
|
5448
6788
|
re2.prefixComplete = prefixCompl;
|
|
5449
6789
|
re2.prefix = prefixStr;
|
|
@@ -5475,12 +6815,78 @@
|
|
|
5475
6815
|
this.prefixComplete = false; // true if prefix is the entire regexp
|
|
5476
6816
|
this.prefixRune = 0; // first rune in prefix
|
|
5477
6817
|
this.pooled = new AtomicReference(); // Cache of machines for running regexp. Forms a Treiber stack.
|
|
5478
|
-
this.dfa = new DFA(prog); //
|
|
6818
|
+
this.dfa = new DFA(this.prog); // initialize Lazy DFA
|
|
6819
|
+
this.onepass = OnePass.compile(this.prog); // compile OnePass
|
|
6820
|
+
this.prefilter = null;
|
|
6821
|
+
}
|
|
6822
|
+
matchPrefixComplete(input, pos, anchor, ncap) {
|
|
6823
|
+
// If strictly anchored, execution must start at 0
|
|
6824
|
+
if ((anchor === RE2Flags.ANCHOR_START || anchor === RE2Flags.ANCHOR_BOTH) && pos !== 0) {
|
|
6825
|
+
return null;
|
|
6826
|
+
}
|
|
6827
|
+
let matchStart = -1;
|
|
6828
|
+
let matchEnd = -1;
|
|
6829
|
+
const pLen = input.prefixLength(this);
|
|
6830
|
+
if (anchor === RE2Flags.UNANCHORED) {
|
|
6831
|
+
const idx = input.index(this, pos);
|
|
6832
|
+
if (idx < 0) return null;
|
|
6833
|
+
matchStart = pos + idx;
|
|
6834
|
+
matchEnd = matchStart + pLen;
|
|
6835
|
+
} else if (anchor === RE2Flags.ANCHOR_BOTH) {
|
|
6836
|
+
if (input.endPos() !== pLen) return null;
|
|
6837
|
+
const idx = input.index(this, 0);
|
|
6838
|
+
if (idx !== 0) return null;
|
|
6839
|
+
matchStart = 0;
|
|
6840
|
+
matchEnd = pLen;
|
|
6841
|
+
} else if (anchor === RE2Flags.ANCHOR_START) {
|
|
6842
|
+
const idx = input.index(this, 0);
|
|
6843
|
+
if (idx !== 0) return null;
|
|
6844
|
+
matchStart = 0;
|
|
6845
|
+
matchEnd = pLen;
|
|
6846
|
+
}
|
|
6847
|
+
if (matchStart < 0) return null;
|
|
6848
|
+
|
|
6849
|
+
// If captures are requested (e.g. findSubmatch instead of test), populate bounds
|
|
6850
|
+
if (ncap > 0) {
|
|
6851
|
+
const matchcap = new Int32Array(ncap).fill(-1);
|
|
6852
|
+
matchcap[0] = matchStart;
|
|
6853
|
+
matchcap[1] = matchEnd;
|
|
6854
|
+
return Array.from(matchcap);
|
|
6855
|
+
}
|
|
6856
|
+
return []; // Matched successfully, but no capture data requested
|
|
5479
6857
|
}
|
|
5480
6858
|
executeEngine(input, pos, anchor, ncap) {
|
|
6859
|
+
// LITERAL FAST PATH
|
|
6860
|
+
// If the entire regex is just a literal string (and no nested capture boundaries are requested),
|
|
6861
|
+
// bypass all state machines and execute via V8's blistering fast native indexOf
|
|
6862
|
+
if (this.prefixComplete && (ncap === 0 || this.numSubexp === 0)) {
|
|
6863
|
+
return this.matchPrefixComplete(input, pos, anchor, ncap);
|
|
6864
|
+
}
|
|
6865
|
+
|
|
6866
|
+
// PREFILTER FAST PATH
|
|
6867
|
+
// If the unanchored query requires specific literal strings (e.g. "a.*b"),
|
|
6868
|
+
// verify those strings exist using high-speed JS string searches before waking up the state engines.
|
|
6869
|
+
if (this.prefilter !== null && anchor === RE2Flags.UNANCHORED) {
|
|
6870
|
+
if (!this.prefilter.eval(input, pos)) {
|
|
6871
|
+
return null;
|
|
6872
|
+
}
|
|
6873
|
+
}
|
|
6874
|
+
|
|
6875
|
+
// FAST PATH: OnePass DFA engine.
|
|
6876
|
+
// If compiled successfully, it perfectly supports capture groups
|
|
6877
|
+
// and is blisteringly fast since it skips thread queues completely.
|
|
6878
|
+
if (this.onepass !== null) {
|
|
6879
|
+
return OnePass.execute(this, input, pos, anchor, ncap);
|
|
6880
|
+
}
|
|
6881
|
+
|
|
5481
6882
|
// If the user wants capturing groups (ncap > 0), the DFA mathematically CANNOT do it.
|
|
5482
6883
|
// We must use the NFA.
|
|
5483
6884
|
if (ncap > 0) {
|
|
6885
|
+
// Backtracker bit-state execution bounds check
|
|
6886
|
+
if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
|
|
6887
|
+
return Backtracker.execute(this, input, pos, anchor, ncap);
|
|
6888
|
+
}
|
|
6889
|
+
// NFA execution
|
|
5484
6890
|
return this.doExecuteNFA(input, pos, anchor, ncap);
|
|
5485
6891
|
}
|
|
5486
6892
|
const dfaResult = this.dfa.match(input, pos, anchor);
|
|
@@ -5489,6 +6895,11 @@
|
|
|
5489
6895
|
return dfaResult ? [] : null; // Return empty array to signify "matched but no captures"
|
|
5490
6896
|
}
|
|
5491
6897
|
|
|
6898
|
+
// Backtracker bit-state execution bounds check
|
|
6899
|
+
if (input.endPos() <= Backtracker.maxBitStateLen(this.prog)) {
|
|
6900
|
+
return Backtracker.execute(this, input, pos, anchor, ncap);
|
|
6901
|
+
}
|
|
6902
|
+
|
|
5492
6903
|
// Fallback to NFA
|
|
5493
6904
|
return this.doExecuteNFA(input, pos, anchor, ncap);
|
|
5494
6905
|
}
|
|
@@ -6069,6 +7480,50 @@
|
|
|
6069
7480
|
}
|
|
6070
7481
|
}
|
|
6071
7482
|
|
|
7483
|
+
class RE2Set {
|
|
7484
|
+
constructor(anchor = RE2Flags.UNANCHORED, flags = RE2Flags.PERL) {
|
|
7485
|
+
this.anchor = anchor;
|
|
7486
|
+
this.flags = flags;
|
|
7487
|
+
this.regexps = [];
|
|
7488
|
+
this.prog = null;
|
|
7489
|
+
this.dfa = null;
|
|
7490
|
+
this.dummyRe2 = null;
|
|
7491
|
+
}
|
|
7492
|
+
add(pattern) {
|
|
7493
|
+
if (this.prog) {
|
|
7494
|
+
throw new RE2JSCompileException('Cannot add patterns after compile');
|
|
7495
|
+
}
|
|
7496
|
+
const re = Parser.parse(pattern, this.flags);
|
|
7497
|
+
this.regexps.push(Simplify.simplify(re));
|
|
7498
|
+
return this.regexps.length - 1;
|
|
7499
|
+
}
|
|
7500
|
+
compile() {
|
|
7501
|
+
if (this.prog) return;
|
|
7502
|
+
this.prog = Compiler.compileSet(this.regexps);
|
|
7503
|
+
this.dfa = new DFA(this.prog);
|
|
7504
|
+
this.dummyRe2 = {
|
|
7505
|
+
prog: this.prog,
|
|
7506
|
+
cond: this.prog.startCond(),
|
|
7507
|
+
prefix: '',
|
|
7508
|
+
prefixRune: 0,
|
|
7509
|
+
longest: false
|
|
7510
|
+
};
|
|
7511
|
+
}
|
|
7512
|
+
match(input) {
|
|
7513
|
+
if (!this.prog) this.compile();
|
|
7514
|
+
const machineInput = Array.isArray(input) ? MachineInput.fromUTF8(input) : MachineInput.fromUTF16(input);
|
|
7515
|
+
|
|
7516
|
+
// Fast path: Try the blistering fast DFA
|
|
7517
|
+
const dfaResult = this.dfa.matchSet(machineInput, 0, this.anchor);
|
|
7518
|
+
if (dfaResult !== null) return dfaResult;
|
|
7519
|
+
|
|
7520
|
+
// Safe Fallback: Handle boundaries (\b) or massive state explosions via NFA
|
|
7521
|
+
const machine = Machine.fromRE2(this.dummyRe2);
|
|
7522
|
+
machine.init(0);
|
|
7523
|
+
return machine.matchSet(machineInput, 0, this.anchor);
|
|
7524
|
+
}
|
|
7525
|
+
}
|
|
7526
|
+
|
|
6072
7527
|
/**
|
|
6073
7528
|
* Transform JS regex string to RE2 regex string
|
|
6074
7529
|
*/
|
|
@@ -6079,13 +7534,6 @@
|
|
|
6079
7534
|
static isHexadecimal(ch) {
|
|
6080
7535
|
return '0' <= ch && ch <= '9' || 'A' <= ch && ch <= 'F' || 'a' <= ch && ch <= 'f';
|
|
6081
7536
|
}
|
|
6082
|
-
static getUtf8CharSize(ch) {
|
|
6083
|
-
const code = ch.charCodeAt(0);
|
|
6084
|
-
if (code < 0x80) return 1; // 1-byte (ASCII)
|
|
6085
|
-
if (code < 0x800) return 2; // 2-byte
|
|
6086
|
-
if (code < 0x10000) return 3; // 3-byte
|
|
6087
|
-
return 4; // 4-byte (surrogate pairs, rare characters)
|
|
6088
|
-
}
|
|
6089
7537
|
static translate(data) {
|
|
6090
7538
|
if (typeof data !== 'string') {
|
|
6091
7539
|
return data;
|
|
@@ -6158,7 +7606,8 @@
|
|
|
6158
7606
|
default:
|
|
6159
7607
|
{
|
|
6160
7608
|
result += '\\';
|
|
6161
|
-
let
|
|
7609
|
+
let cp = data.codePointAt(i + 1);
|
|
7610
|
+
let symSize = Utils.charCount(cp);
|
|
6162
7611
|
result += data.substring(i + 1, i + 1 + symSize);
|
|
6163
7612
|
i += symSize + 1;
|
|
6164
7613
|
continue;
|
|
@@ -6178,7 +7627,8 @@
|
|
|
6178
7627
|
continue;
|
|
6179
7628
|
}
|
|
6180
7629
|
}
|
|
6181
|
-
let
|
|
7630
|
+
let cp = data.codePointAt(i);
|
|
7631
|
+
let symSize = Utils.charCount(cp);
|
|
6182
7632
|
result += data.substring(i, i + symSize);
|
|
6183
7633
|
i += symSize;
|
|
6184
7634
|
}
|
|
@@ -6541,7 +7991,9 @@
|
|
|
6541
7991
|
exports.RE2JSException = RE2JSException;
|
|
6542
7992
|
exports.RE2JSFlagsException = RE2JSFlagsException;
|
|
6543
7993
|
exports.RE2JSGroupException = RE2JSGroupException;
|
|
7994
|
+
exports.RE2JSInternalException = RE2JSInternalException;
|
|
6544
7995
|
exports.RE2JSSyntaxException = RE2JSSyntaxException;
|
|
7996
|
+
exports.RE2Set = RE2Set;
|
|
6545
7997
|
|
|
6546
7998
|
}));
|
|
6547
7999
|
//# sourceMappingURL=index.umd.js.map
|