Actualizacion maquina principal
[dotfiles/.git] / .config / coc / extensions / node_modules / coc-prettier / node_modules / regexpp / index.mjs
diff --git a/.config/coc/extensions/node_modules/coc-prettier/node_modules/regexpp/index.mjs b/.config/coc/extensions/node_modules/coc-prettier/node_modules/regexpp/index.mjs
new file mode 100644 (file)
index 0000000..5bf62de
--- /dev/null
@@ -0,0 +1,7069 @@
+/*! @author Toru Nagashima <https://github.com/mysticatea> */
+
+
+var ast = /*#__PURE__*/Object.freeze({
+
+});
+
+function isIdStart(cp) {
+    if (cp < 0x41)
+        return false;
+    if (cp < 0x5b)
+        return true;
+    if (cp < 0x61)
+        return false;
+    if (cp < 0x7b)
+        return true;
+    return isLargeIdStart(cp);
+}
+function isIdContinue(cp) {
+    if (cp < 0x30)
+        return false;
+    if (cp < 0x3a)
+        return true;
+    if (cp < 0x41)
+        return false;
+    if (cp < 0x5b)
+        return true;
+    if (cp === 0x5f)
+        return true;
+    if (cp < 0x61)
+        return false;
+    if (cp < 0x7b)
+        return true;
+    return isLargeIdStart(cp) || isLargeIdContinue(cp);
+}
+function isLargeIdStart(cp) {
+    if (cp < 0x30a1) {
+        if (cp < 0xec0) {
+            if (cp < 0xa35) {
+                if (cp < 0x6e5) {
+                    if (cp < 0x37a) {
+                        if (cp < 0x294) {
+                            if (cp < 0xf8) {
+                                if (cp === 0xaa)
+                                    return true;
+                                if (cp === 0xb5)
+                                    return true;
+                                if (cp === 0xba)
+                                    return true;
+                                if (cp < 0xc0)
+                                    return false;
+                                if (cp < 0xd7)
+                                    return true;
+                                if (cp < 0xd8)
+                                    return false;
+                                if (cp < 0xf7)
+                                    return true;
+                                return false;
+                            }
+                            if (cp < 0x1bb)
+                                return true;
+                            if (cp === 0x1bb)
+                                return true;
+                            if (cp < 0x1bc)
+                                return false;
+                            if (cp < 0x1c0)
+                                return true;
+                            if (cp < 0x1c0)
+                                return false;
+                            if (cp < 0x1c4)
+                                return true;
+                            if (cp < 0x1c4)
+                                return false;
+                            if (cp < 0x294)
+                                return true;
+                            return false;
+                        }
+                        if (cp < 0x2ec) {
+                            if (cp === 0x294)
+                                return true;
+                            if (cp < 0x295)
+                                return false;
+                            if (cp < 0x2b0)
+                                return true;
+                            if (cp < 0x2b0)
+                                return false;
+                            if (cp < 0x2c2)
+                                return true;
+                            if (cp < 0x2c6)
+                                return false;
+                            if (cp < 0x2d2)
+                                return true;
+                            if (cp < 0x2e0)
+                                return false;
+                            if (cp < 0x2e5)
+                                return true;
+                            return false;
+                        }
+                        if (cp === 0x2ec)
+                            return true;
+                        if (cp === 0x2ee)
+                            return true;
+                        if (cp < 0x370)
+                            return false;
+                        if (cp < 0x374)
+                            return true;
+                        if (cp === 0x374)
+                            return true;
+                        if (cp < 0x376)
+                            return false;
+                        if (cp < 0x378)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x531) {
+                        if (cp < 0x38c) {
+                            if (cp === 0x37a)
+                                return true;
+                            if (cp < 0x37b)
+                                return false;
+                            if (cp < 0x37e)
+                                return true;
+                            if (cp === 0x37f)
+                                return true;
+                            if (cp === 0x386)
+                                return true;
+                            if (cp < 0x388)
+                                return false;
+                            if (cp < 0x38b)
+                                return true;
+                            return false;
+                        }
+                        if (cp === 0x38c)
+                            return true;
+                        if (cp < 0x38e)
+                            return false;
+                        if (cp < 0x3a2)
+                            return true;
+                        if (cp < 0x3a3)
+                            return false;
+                        if (cp < 0x3f6)
+                            return true;
+                        if (cp < 0x3f7)
+                            return false;
+                        if (cp < 0x482)
+                            return true;
+                        if (cp < 0x48a)
+                            return false;
+                        if (cp < 0x530)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x620) {
+                        if (cp < 0x531)
+                            return false;
+                        if (cp < 0x557)
+                            return true;
+                        if (cp === 0x559)
+                            return true;
+                        if (cp < 0x560)
+                            return false;
+                        if (cp < 0x589)
+                            return true;
+                        if (cp < 0x5d0)
+                            return false;
+                        if (cp < 0x5eb)
+                            return true;
+                        if (cp < 0x5ef)
+                            return false;
+                        if (cp < 0x5f3)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x640)
+                        return true;
+                    if (cp === 0x640)
+                        return true;
+                    if (cp < 0x641)
+                        return false;
+                    if (cp < 0x64b)
+                        return true;
+                    if (cp < 0x66e)
+                        return false;
+                    if (cp < 0x670)
+                        return true;
+                    if (cp < 0x671)
+                        return false;
+                    if (cp < 0x6d4)
+                        return true;
+                    if (cp === 0x6d5)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x950) {
+                    if (cp < 0x7fa) {
+                        if (cp < 0x712) {
+                            if (cp < 0x6e5)
+                                return false;
+                            if (cp < 0x6e7)
+                                return true;
+                            if (cp < 0x6ee)
+                                return false;
+                            if (cp < 0x6f0)
+                                return true;
+                            if (cp < 0x6fa)
+                                return false;
+                            if (cp < 0x6fd)
+                                return true;
+                            if (cp === 0x6ff)
+                                return true;
+                            if (cp === 0x710)
+                                return true;
+                            return false;
+                        }
+                        if (cp < 0x730)
+                            return true;
+                        if (cp < 0x74d)
+                            return false;
+                        if (cp < 0x7a6)
+                            return true;
+                        if (cp === 0x7b1)
+                            return true;
+                        if (cp < 0x7ca)
+                            return false;
+                        if (cp < 0x7eb)
+                            return true;
+                        if (cp < 0x7f4)
+                            return false;
+                        if (cp < 0x7f6)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x840) {
+                        if (cp === 0x7fa)
+                            return true;
+                        if (cp < 0x800)
+                            return false;
+                        if (cp < 0x816)
+                            return true;
+                        if (cp === 0x81a)
+                            return true;
+                        if (cp === 0x824)
+                            return true;
+                        if (cp === 0x828)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x859)
+                        return true;
+                    if (cp < 0x860)
+                        return false;
+                    if (cp < 0x86b)
+                        return true;
+                    if (cp < 0x8a0)
+                        return false;
+                    if (cp < 0x8b5)
+                        return true;
+                    if (cp < 0x8b6)
+                        return false;
+                    if (cp < 0x8be)
+                        return true;
+                    if (cp < 0x904)
+                        return false;
+                    if (cp < 0x93a)
+                        return true;
+                    if (cp === 0x93d)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x9bd) {
+                    if (cp < 0x98f) {
+                        if (cp === 0x950)
+                            return true;
+                        if (cp < 0x958)
+                            return false;
+                        if (cp < 0x962)
+                            return true;
+                        if (cp === 0x971)
+                            return true;
+                        if (cp < 0x972)
+                            return false;
+                        if (cp < 0x981)
+                            return true;
+                        if (cp < 0x985)
+                            return false;
+                        if (cp < 0x98d)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x991)
+                        return true;
+                    if (cp < 0x993)
+                        return false;
+                    if (cp < 0x9a9)
+                        return true;
+                    if (cp < 0x9aa)
+                        return false;
+                    if (cp < 0x9b1)
+                        return true;
+                    if (cp === 0x9b2)
+                        return true;
+                    if (cp < 0x9b6)
+                        return false;
+                    if (cp < 0x9ba)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x9fc) {
+                    if (cp === 0x9bd)
+                        return true;
+                    if (cp === 0x9ce)
+                        return true;
+                    if (cp < 0x9dc)
+                        return false;
+                    if (cp < 0x9de)
+                        return true;
+                    if (cp < 0x9df)
+                        return false;
+                    if (cp < 0x9e2)
+                        return true;
+                    if (cp < 0x9f0)
+                        return false;
+                    if (cp < 0x9f2)
+                        return true;
+                    return false;
+                }
+                if (cp === 0x9fc)
+                    return true;
+                if (cp < 0xa05)
+                    return false;
+                if (cp < 0xa0b)
+                    return true;
+                if (cp < 0xa0f)
+                    return false;
+                if (cp < 0xa11)
+                    return true;
+                if (cp < 0xa13)
+                    return false;
+                if (cp < 0xa29)
+                    return true;
+                if (cp < 0xa2a)
+                    return false;
+                if (cp < 0xa31)
+                    return true;
+                if (cp < 0xa32)
+                    return false;
+                if (cp < 0xa34)
+                    return true;
+                return false;
+            }
+            if (cp < 0xc60) {
+                if (cp < 0xb3d) {
+                    if (cp < 0xab5) {
+                        if (cp < 0xa85) {
+                            if (cp < 0xa35)
+                                return false;
+                            if (cp < 0xa37)
+                                return true;
+                            if (cp < 0xa38)
+                                return false;
+                            if (cp < 0xa3a)
+                                return true;
+                            if (cp < 0xa59)
+                                return false;
+                            if (cp < 0xa5d)
+                                return true;
+                            if (cp === 0xa5e)
+                                return true;
+                            if (cp < 0xa72)
+                                return false;
+                            if (cp < 0xa75)
+                                return true;
+                            return false;
+                        }
+                        if (cp < 0xa8e)
+                            return true;
+                        if (cp < 0xa8f)
+                            return false;
+                        if (cp < 0xa92)
+                            return true;
+                        if (cp < 0xa93)
+                            return false;
+                        if (cp < 0xaa9)
+                            return true;
+                        if (cp < 0xaaa)
+                            return false;
+                        if (cp < 0xab1)
+                            return true;
+                        if (cp < 0xab2)
+                            return false;
+                        if (cp < 0xab4)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xb05) {
+                        if (cp < 0xab5)
+                            return false;
+                        if (cp < 0xaba)
+                            return true;
+                        if (cp === 0xabd)
+                            return true;
+                        if (cp === 0xad0)
+                            return true;
+                        if (cp < 0xae0)
+                            return false;
+                        if (cp < 0xae2)
+                            return true;
+                        if (cp === 0xaf9)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xb0d)
+                        return true;
+                    if (cp < 0xb0f)
+                        return false;
+                    if (cp < 0xb11)
+                        return true;
+                    if (cp < 0xb13)
+                        return false;
+                    if (cp < 0xb29)
+                        return true;
+                    if (cp < 0xb2a)
+                        return false;
+                    if (cp < 0xb31)
+                        return true;
+                    if (cp < 0xb32)
+                        return false;
+                    if (cp < 0xb34)
+                        return true;
+                    if (cp < 0xb35)
+                        return false;
+                    if (cp < 0xb3a)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xb9e) {
+                    if (cp < 0xb85) {
+                        if (cp === 0xb3d)
+                            return true;
+                        if (cp < 0xb5c)
+                            return false;
+                        if (cp < 0xb5e)
+                            return true;
+                        if (cp < 0xb5f)
+                            return false;
+                        if (cp < 0xb62)
+                            return true;
+                        if (cp === 0xb71)
+                            return true;
+                        if (cp === 0xb83)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xb8b)
+                        return true;
+                    if (cp < 0xb8e)
+                        return false;
+                    if (cp < 0xb91)
+                        return true;
+                    if (cp < 0xb92)
+                        return false;
+                    if (cp < 0xb96)
+                        return true;
+                    if (cp < 0xb99)
+                        return false;
+                    if (cp < 0xb9b)
+                        return true;
+                    if (cp === 0xb9c)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xc05) {
+                    if (cp < 0xb9e)
+                        return false;
+                    if (cp < 0xba0)
+                        return true;
+                    if (cp < 0xba3)
+                        return false;
+                    if (cp < 0xba5)
+                        return true;
+                    if (cp < 0xba8)
+                        return false;
+                    if (cp < 0xbab)
+                        return true;
+                    if (cp < 0xbae)
+                        return false;
+                    if (cp < 0xbba)
+                        return true;
+                    if (cp === 0xbd0)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xc0d)
+                    return true;
+                if (cp < 0xc0e)
+                    return false;
+                if (cp < 0xc11)
+                    return true;
+                if (cp < 0xc12)
+                    return false;
+                if (cp < 0xc29)
+                    return true;
+                if (cp < 0xc2a)
+                    return false;
+                if (cp < 0xc3a)
+                    return true;
+                if (cp === 0xc3d)
+                    return true;
+                if (cp < 0xc58)
+                    return false;
+                if (cp < 0xc5b)
+                    return true;
+                return false;
+            }
+            if (cp < 0xdb3) {
+                if (cp < 0xcf1) {
+                    if (cp < 0xcaa) {
+                        if (cp < 0xc60)
+                            return false;
+                        if (cp < 0xc62)
+                            return true;
+                        if (cp === 0xc80)
+                            return true;
+                        if (cp < 0xc85)
+                            return false;
+                        if (cp < 0xc8d)
+                            return true;
+                        if (cp < 0xc8e)
+                            return false;
+                        if (cp < 0xc91)
+                            return true;
+                        if (cp < 0xc92)
+                            return false;
+                        if (cp < 0xca9)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xcb4)
+                        return true;
+                    if (cp < 0xcb5)
+                        return false;
+                    if (cp < 0xcba)
+                        return true;
+                    if (cp === 0xcbd)
+                        return true;
+                    if (cp === 0xcde)
+                        return true;
+                    if (cp < 0xce0)
+                        return false;
+                    if (cp < 0xce2)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xd4e) {
+                    if (cp < 0xcf1)
+                        return false;
+                    if (cp < 0xcf3)
+                        return true;
+                    if (cp < 0xd05)
+                        return false;
+                    if (cp < 0xd0d)
+                        return true;
+                    if (cp < 0xd0e)
+                        return false;
+                    if (cp < 0xd11)
+                        return true;
+                    if (cp < 0xd12)
+                        return false;
+                    if (cp < 0xd3b)
+                        return true;
+                    if (cp === 0xd3d)
+                        return true;
+                    return false;
+                }
+                if (cp === 0xd4e)
+                    return true;
+                if (cp < 0xd54)
+                    return false;
+                if (cp < 0xd57)
+                    return true;
+                if (cp < 0xd5f)
+                    return false;
+                if (cp < 0xd62)
+                    return true;
+                if (cp < 0xd7a)
+                    return false;
+                if (cp < 0xd80)
+                    return true;
+                if (cp < 0xd85)
+                    return false;
+                if (cp < 0xd97)
+                    return true;
+                if (cp < 0xd9a)
+                    return false;
+                if (cp < 0xdb2)
+                    return true;
+                return false;
+            }
+            if (cp < 0xe8a) {
+                if (cp < 0xe40) {
+                    if (cp < 0xdb3)
+                        return false;
+                    if (cp < 0xdbc)
+                        return true;
+                    if (cp === 0xdbd)
+                        return true;
+                    if (cp < 0xdc0)
+                        return false;
+                    if (cp < 0xdc7)
+                        return true;
+                    if (cp < 0xe01)
+                        return false;
+                    if (cp < 0xe31)
+                        return true;
+                    if (cp < 0xe32)
+                        return false;
+                    if (cp < 0xe34)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xe46)
+                    return true;
+                if (cp === 0xe46)
+                    return true;
+                if (cp < 0xe81)
+                    return false;
+                if (cp < 0xe83)
+                    return true;
+                if (cp === 0xe84)
+                    return true;
+                if (cp < 0xe87)
+                    return false;
+                if (cp < 0xe89)
+                    return true;
+                return false;
+            }
+            if (cp < 0xea5) {
+                if (cp === 0xe8a)
+                    return true;
+                if (cp === 0xe8d)
+                    return true;
+                if (cp < 0xe94)
+                    return false;
+                if (cp < 0xe98)
+                    return true;
+                if (cp < 0xe99)
+                    return false;
+                if (cp < 0xea0)
+                    return true;
+                if (cp < 0xea1)
+                    return false;
+                if (cp < 0xea4)
+                    return true;
+                return false;
+            }
+            if (cp === 0xea5)
+                return true;
+            if (cp === 0xea7)
+                return true;
+            if (cp < 0xeaa)
+                return false;
+            if (cp < 0xeac)
+                return true;
+            if (cp < 0xead)
+                return false;
+            if (cp < 0xeb1)
+                return true;
+            if (cp < 0xeb2)
+                return false;
+            if (cp < 0xeb4)
+                return true;
+            if (cp === 0xebd)
+                return true;
+            return false;
+        }
+        if (cp < 0x1ce9) {
+            if (cp < 0x166f) {
+                if (cp < 0x10fd) {
+                    if (cp < 0x105a) {
+                        if (cp < 0xf49) {
+                            if (cp < 0xec0)
+                                return false;
+                            if (cp < 0xec5)
+                                return true;
+                            if (cp === 0xec6)
+                                return true;
+                            if (cp < 0xedc)
+                                return false;
+                            if (cp < 0xee0)
+                                return true;
+                            if (cp === 0xf00)
+                                return true;
+                            if (cp < 0xf40)
+                                return false;
+                            if (cp < 0xf48)
+                                return true;
+                            return false;
+                        }
+                        if (cp < 0xf6d)
+                            return true;
+                        if (cp < 0xf88)
+                            return false;
+                        if (cp < 0xf8d)
+                            return true;
+                        if (cp < 0x1000)
+                            return false;
+                        if (cp < 0x102b)
+                            return true;
+                        if (cp === 0x103f)
+                            return true;
+                        if (cp < 0x1050)
+                            return false;
+                        if (cp < 0x1056)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x108e) {
+                        if (cp < 0x105a)
+                            return false;
+                        if (cp < 0x105e)
+                            return true;
+                        if (cp === 0x1061)
+                            return true;
+                        if (cp < 0x1065)
+                            return false;
+                        if (cp < 0x1067)
+                            return true;
+                        if (cp < 0x106e)
+                            return false;
+                        if (cp < 0x1071)
+                            return true;
+                        if (cp < 0x1075)
+                            return false;
+                        if (cp < 0x1082)
+                            return true;
+                        return false;
+                    }
+                    if (cp === 0x108e)
+                        return true;
+                    if (cp < 0x10a0)
+                        return false;
+                    if (cp < 0x10c6)
+                        return true;
+                    if (cp === 0x10c7)
+                        return true;
+                    if (cp === 0x10cd)
+                        return true;
+                    if (cp < 0x10d0)
+                        return false;
+                    if (cp < 0x10fb)
+                        return true;
+                    if (cp === 0x10fc)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x12b8) {
+                    if (cp < 0x125a) {
+                        if (cp < 0x10fd)
+                            return false;
+                        if (cp < 0x1100)
+                            return true;
+                        if (cp < 0x1100)
+                            return false;
+                        if (cp < 0x1249)
+                            return true;
+                        if (cp < 0x124a)
+                            return false;
+                        if (cp < 0x124e)
+                            return true;
+                        if (cp < 0x1250)
+                            return false;
+                        if (cp < 0x1257)
+                            return true;
+                        if (cp === 0x1258)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x125e)
+                        return true;
+                    if (cp < 0x1260)
+                        return false;
+                    if (cp < 0x1289)
+                        return true;
+                    if (cp < 0x128a)
+                        return false;
+                    if (cp < 0x128e)
+                        return true;
+                    if (cp < 0x1290)
+                        return false;
+                    if (cp < 0x12b1)
+                        return true;
+                    if (cp < 0x12b2)
+                        return false;
+                    if (cp < 0x12b6)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1312) {
+                    if (cp < 0x12b8)
+                        return false;
+                    if (cp < 0x12bf)
+                        return true;
+                    if (cp === 0x12c0)
+                        return true;
+                    if (cp < 0x12c2)
+                        return false;
+                    if (cp < 0x12c6)
+                        return true;
+                    if (cp < 0x12c8)
+                        return false;
+                    if (cp < 0x12d7)
+                        return true;
+                    if (cp < 0x12d8)
+                        return false;
+                    if (cp < 0x1311)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1316)
+                    return true;
+                if (cp < 0x1318)
+                    return false;
+                if (cp < 0x135b)
+                    return true;
+                if (cp < 0x1380)
+                    return false;
+                if (cp < 0x1390)
+                    return true;
+                if (cp < 0x13a0)
+                    return false;
+                if (cp < 0x13f6)
+                    return true;
+                if (cp < 0x13f8)
+                    return false;
+                if (cp < 0x13fe)
+                    return true;
+                if (cp < 0x1401)
+                    return false;
+                if (cp < 0x166d)
+                    return true;
+                return false;
+            }
+            if (cp < 0x18b0) {
+                if (cp < 0x176e) {
+                    if (cp < 0x1700) {
+                        if (cp < 0x166f)
+                            return false;
+                        if (cp < 0x1680)
+                            return true;
+                        if (cp < 0x1681)
+                            return false;
+                        if (cp < 0x169b)
+                            return true;
+                        if (cp < 0x16a0)
+                            return false;
+                        if (cp < 0x16eb)
+                            return true;
+                        if (cp < 0x16ee)
+                            return false;
+                        if (cp < 0x16f1)
+                            return true;
+                        if (cp < 0x16f1)
+                            return false;
+                        if (cp < 0x16f9)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x170d)
+                        return true;
+                    if (cp < 0x170e)
+                        return false;
+                    if (cp < 0x1712)
+                        return true;
+                    if (cp < 0x1720)
+                        return false;
+                    if (cp < 0x1732)
+                        return true;
+                    if (cp < 0x1740)
+                        return false;
+                    if (cp < 0x1752)
+                        return true;
+                    if (cp < 0x1760)
+                        return false;
+                    if (cp < 0x176d)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1843) {
+                    if (cp < 0x176e)
+                        return false;
+                    if (cp < 0x1771)
+                        return true;
+                    if (cp < 0x1780)
+                        return false;
+                    if (cp < 0x17b4)
+                        return true;
+                    if (cp === 0x17d7)
+                        return true;
+                    if (cp === 0x17dc)
+                        return true;
+                    if (cp < 0x1820)
+                        return false;
+                    if (cp < 0x1843)
+                        return true;
+                    return false;
+                }
+                if (cp === 0x1843)
+                    return true;
+                if (cp < 0x1844)
+                    return false;
+                if (cp < 0x1879)
+                    return true;
+                if (cp < 0x1880)
+                    return false;
+                if (cp < 0x1885)
+                    return true;
+                if (cp < 0x1885)
+                    return false;
+                if (cp < 0x1887)
+                    return true;
+                if (cp < 0x1887)
+                    return false;
+                if (cp < 0x18a9)
+                    return true;
+                if (cp === 0x18aa)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1b45) {
+                if (cp < 0x19b0) {
+                    if (cp < 0x18b0)
+                        return false;
+                    if (cp < 0x18f6)
+                        return true;
+                    if (cp < 0x1900)
+                        return false;
+                    if (cp < 0x191f)
+                        return true;
+                    if (cp < 0x1950)
+                        return false;
+                    if (cp < 0x196e)
+                        return true;
+                    if (cp < 0x1970)
+                        return false;
+                    if (cp < 0x1975)
+                        return true;
+                    if (cp < 0x1980)
+                        return false;
+                    if (cp < 0x19ac)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x19ca)
+                    return true;
+                if (cp < 0x1a00)
+                    return false;
+                if (cp < 0x1a17)
+                    return true;
+                if (cp < 0x1a20)
+                    return false;
+                if (cp < 0x1a55)
+                    return true;
+                if (cp === 0x1aa7)
+                    return true;
+                if (cp < 0x1b05)
+                    return false;
+                if (cp < 0x1b34)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1c4d) {
+                if (cp < 0x1b45)
+                    return false;
+                if (cp < 0x1b4c)
+                    return true;
+                if (cp < 0x1b83)
+                    return false;
+                if (cp < 0x1ba1)
+                    return true;
+                if (cp < 0x1bae)
+                    return false;
+                if (cp < 0x1bb0)
+                    return true;
+                if (cp < 0x1bba)
+                    return false;
+                if (cp < 0x1be6)
+                    return true;
+                if (cp < 0x1c00)
+                    return false;
+                if (cp < 0x1c24)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1c50)
+                return true;
+            if (cp < 0x1c5a)
+                return false;
+            if (cp < 0x1c78)
+                return true;
+            if (cp < 0x1c78)
+                return false;
+            if (cp < 0x1c7e)
+                return true;
+            if (cp < 0x1c80)
+                return false;
+            if (cp < 0x1c89)
+                return true;
+            if (cp < 0x1c90)
+                return false;
+            if (cp < 0x1cbb)
+                return true;
+            if (cp < 0x1cbd)
+                return false;
+            if (cp < 0x1cc0)
+                return true;
+            return false;
+        }
+        if (cp < 0x212f) {
+            if (cp < 0x1fc2) {
+                if (cp < 0x1f18) {
+                    if (cp < 0x1d6b) {
+                        if (cp < 0x1ce9)
+                            return false;
+                        if (cp < 0x1ced)
+                            return true;
+                        if (cp < 0x1cee)
+                            return false;
+                        if (cp < 0x1cf2)
+                            return true;
+                        if (cp < 0x1cf5)
+                            return false;
+                        if (cp < 0x1cf7)
+                            return true;
+                        if (cp < 0x1d00)
+                            return false;
+                        if (cp < 0x1d2c)
+                            return true;
+                        if (cp < 0x1d2c)
+                            return false;
+                        if (cp < 0x1d6b)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x1d78)
+                        return true;
+                    if (cp === 0x1d78)
+                        return true;
+                    if (cp < 0x1d79)
+                        return false;
+                    if (cp < 0x1d9b)
+                        return true;
+                    if (cp < 0x1d9b)
+                        return false;
+                    if (cp < 0x1dc0)
+                        return true;
+                    if (cp < 0x1e00)
+                        return false;
+                    if (cp < 0x1f16)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1f5b) {
+                    if (cp < 0x1f18)
+                        return false;
+                    if (cp < 0x1f1e)
+                        return true;
+                    if (cp < 0x1f20)
+                        return false;
+                    if (cp < 0x1f46)
+                        return true;
+                    if (cp < 0x1f48)
+                        return false;
+                    if (cp < 0x1f4e)
+                        return true;
+                    if (cp < 0x1f50)
+                        return false;
+                    if (cp < 0x1f58)
+                        return true;
+                    if (cp === 0x1f59)
+                        return true;
+                    return false;
+                }
+                if (cp === 0x1f5b)
+                    return true;
+                if (cp === 0x1f5d)
+                    return true;
+                if (cp < 0x1f5f)
+                    return false;
+                if (cp < 0x1f7e)
+                    return true;
+                if (cp < 0x1f80)
+                    return false;
+                if (cp < 0x1fb5)
+                    return true;
+                if (cp < 0x1fb6)
+                    return false;
+                if (cp < 0x1fbd)
+                    return true;
+                if (cp === 0x1fbe)
+                    return true;
+                return false;
+            }
+            if (cp < 0x2102) {
+                if (cp < 0x1ff2) {
+                    if (cp < 0x1fc2)
+                        return false;
+                    if (cp < 0x1fc5)
+                        return true;
+                    if (cp < 0x1fc6)
+                        return false;
+                    if (cp < 0x1fcd)
+                        return true;
+                    if (cp < 0x1fd0)
+                        return false;
+                    if (cp < 0x1fd4)
+                        return true;
+                    if (cp < 0x1fd6)
+                        return false;
+                    if (cp < 0x1fdc)
+                        return true;
+                    if (cp < 0x1fe0)
+                        return false;
+                    if (cp < 0x1fed)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1ff5)
+                    return true;
+                if (cp < 0x1ff6)
+                    return false;
+                if (cp < 0x1ffd)
+                    return true;
+                if (cp === 0x2071)
+                    return true;
+                if (cp === 0x207f)
+                    return true;
+                if (cp < 0x2090)
+                    return false;
+                if (cp < 0x209d)
+                    return true;
+                return false;
+            }
+            if (cp < 0x2119) {
+                if (cp === 0x2102)
+                    return true;
+                if (cp === 0x2107)
+                    return true;
+                if (cp < 0x210a)
+                    return false;
+                if (cp < 0x2114)
+                    return true;
+                if (cp === 0x2115)
+                    return true;
+                if (cp === 0x2118)
+                    return true;
+                return false;
+            }
+            if (cp < 0x211e)
+                return true;
+            if (cp === 0x2124)
+                return true;
+            if (cp === 0x2126)
+                return true;
+            if (cp === 0x2128)
+                return true;
+            if (cp < 0x212a)
+                return false;
+            if (cp < 0x212e)
+                return true;
+            if (cp === 0x212e)
+                return true;
+            return false;
+        }
+        if (cp < 0x2d80) {
+            if (cp < 0x2c30) {
+                if (cp < 0x214e) {
+                    if (cp < 0x212f)
+                        return false;
+                    if (cp < 0x2135)
+                        return true;
+                    if (cp < 0x2135)
+                        return false;
+                    if (cp < 0x2139)
+                        return true;
+                    if (cp === 0x2139)
+                        return true;
+                    if (cp < 0x213c)
+                        return false;
+                    if (cp < 0x2140)
+                        return true;
+                    if (cp < 0x2145)
+                        return false;
+                    if (cp < 0x214a)
+                        return true;
+                    return false;
+                }
+                if (cp === 0x214e)
+                    return true;
+                if (cp < 0x2160)
+                    return false;
+                if (cp < 0x2183)
+                    return true;
+                if (cp < 0x2183)
+                    return false;
+                if (cp < 0x2185)
+                    return true;
+                if (cp < 0x2185)
+                    return false;
+                if (cp < 0x2189)
+                    return true;
+                if (cp < 0x2c00)
+                    return false;
+                if (cp < 0x2c2f)
+                    return true;
+                return false;
+            }
+            if (cp < 0x2cf2) {
+                if (cp < 0x2c30)
+                    return false;
+                if (cp < 0x2c5f)
+                    return true;
+                if (cp < 0x2c60)
+                    return false;
+                if (cp < 0x2c7c)
+                    return true;
+                if (cp < 0x2c7c)
+                    return false;
+                if (cp < 0x2c7e)
+                    return true;
+                if (cp < 0x2c7e)
+                    return false;
+                if (cp < 0x2ce5)
+                    return true;
+                if (cp < 0x2ceb)
+                    return false;
+                if (cp < 0x2cef)
+                    return true;
+                return false;
+            }
+            if (cp < 0x2cf4)
+                return true;
+            if (cp < 0x2d00)
+                return false;
+            if (cp < 0x2d26)
+                return true;
+            if (cp === 0x2d27)
+                return true;
+            if (cp === 0x2d2d)
+                return true;
+            if (cp < 0x2d30)
+                return false;
+            if (cp < 0x2d68)
+                return true;
+            if (cp === 0x2d6f)
+                return true;
+            return false;
+        }
+        if (cp < 0x3006) {
+            if (cp < 0x2dc0) {
+                if (cp < 0x2d80)
+                    return false;
+                if (cp < 0x2d97)
+                    return true;
+                if (cp < 0x2da0)
+                    return false;
+                if (cp < 0x2da7)
+                    return true;
+                if (cp < 0x2da8)
+                    return false;
+                if (cp < 0x2daf)
+                    return true;
+                if (cp < 0x2db0)
+                    return false;
+                if (cp < 0x2db7)
+                    return true;
+                if (cp < 0x2db8)
+                    return false;
+                if (cp < 0x2dbf)
+                    return true;
+                return false;
+            }
+            if (cp < 0x2dc7)
+                return true;
+            if (cp < 0x2dc8)
+                return false;
+            if (cp < 0x2dcf)
+                return true;
+            if (cp < 0x2dd0)
+                return false;
+            if (cp < 0x2dd7)
+                return true;
+            if (cp < 0x2dd8)
+                return false;
+            if (cp < 0x2ddf)
+                return true;
+            if (cp === 0x3005)
+                return true;
+            return false;
+        }
+        if (cp < 0x303b) {
+            if (cp === 0x3006)
+                return true;
+            if (cp === 0x3007)
+                return true;
+            if (cp < 0x3021)
+                return false;
+            if (cp < 0x302a)
+                return true;
+            if (cp < 0x3031)
+                return false;
+            if (cp < 0x3036)
+                return true;
+            if (cp < 0x3038)
+                return false;
+            if (cp < 0x303b)
+                return true;
+            return false;
+        }
+        if (cp === 0x303b)
+            return true;
+        if (cp === 0x303c)
+            return true;
+        if (cp < 0x3041)
+            return false;
+        if (cp < 0x3097)
+            return true;
+        if (cp < 0x309b)
+            return false;
+        if (cp < 0x309d)
+            return true;
+        if (cp < 0x309d)
+            return false;
+        if (cp < 0x309f)
+            return true;
+        if (cp === 0x309f)
+            return true;
+        return false;
+    }
+    if (cp < 0x10b60) {
+        if (cp < 0xd7b0) {
+            if (cp < 0xa882) {
+                if (cp < 0xa67f) {
+                    if (cp < 0xa015) {
+                        if (cp < 0x31a0) {
+                            if (cp < 0x30a1)
+                                return false;
+                            if (cp < 0x30fb)
+                                return true;
+                            if (cp < 0x30fc)
+                                return false;
+                            if (cp < 0x30ff)
+                                return true;
+                            if (cp === 0x30ff)
+                                return true;
+                            if (cp < 0x3105)
+                                return false;
+                            if (cp < 0x3130)
+                                return true;
+                            if (cp < 0x3131)
+                                return false;
+                            if (cp < 0x318f)
+                                return true;
+                            return false;
+                        }
+                        if (cp < 0x31bb)
+                            return true;
+                        if (cp < 0x31f0)
+                            return false;
+                        if (cp < 0x3200)
+                            return true;
+                        if (cp < 0x3400)
+                            return false;
+                        if (cp < 0x4db6)
+                            return true;
+                        if (cp < 0x4e00)
+                            return false;
+                        if (cp < 0x9ff0)
+                            return true;
+                        if (cp < 0xa000)
+                            return false;
+                        if (cp < 0xa015)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xa60c) {
+                        if (cp === 0xa015)
+                            return true;
+                        if (cp < 0xa016)
+                            return false;
+                        if (cp < 0xa48d)
+                            return true;
+                        if (cp < 0xa4d0)
+                            return false;
+                        if (cp < 0xa4f8)
+                            return true;
+                        if (cp < 0xa4f8)
+                            return false;
+                        if (cp < 0xa4fe)
+                            return true;
+                        if (cp < 0xa500)
+                            return false;
+                        if (cp < 0xa60c)
+                            return true;
+                        return false;
+                    }
+                    if (cp === 0xa60c)
+                        return true;
+                    if (cp < 0xa610)
+                        return false;
+                    if (cp < 0xa620)
+                        return true;
+                    if (cp < 0xa62a)
+                        return false;
+                    if (cp < 0xa62c)
+                        return true;
+                    if (cp < 0xa640)
+                        return false;
+                    if (cp < 0xa66e)
+                        return true;
+                    if (cp === 0xa66e)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xa78b) {
+                    if (cp < 0xa717) {
+                        if (cp === 0xa67f)
+                            return true;
+                        if (cp < 0xa680)
+                            return false;
+                        if (cp < 0xa69c)
+                            return true;
+                        if (cp < 0xa69c)
+                            return false;
+                        if (cp < 0xa69e)
+                            return true;
+                        if (cp < 0xa6a0)
+                            return false;
+                        if (cp < 0xa6e6)
+                            return true;
+                        if (cp < 0xa6e6)
+                            return false;
+                        if (cp < 0xa6f0)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xa720)
+                        return true;
+                    if (cp < 0xa722)
+                        return false;
+                    if (cp < 0xa770)
+                        return true;
+                    if (cp === 0xa770)
+                        return true;
+                    if (cp < 0xa771)
+                        return false;
+                    if (cp < 0xa788)
+                        return true;
+                    if (cp === 0xa788)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xa7fa) {
+                    if (cp < 0xa78b)
+                        return false;
+                    if (cp < 0xa78f)
+                        return true;
+                    if (cp === 0xa78f)
+                        return true;
+                    if (cp < 0xa790)
+                        return false;
+                    if (cp < 0xa7ba)
+                        return true;
+                    if (cp === 0xa7f7)
+                        return true;
+                    if (cp < 0xa7f8)
+                        return false;
+                    if (cp < 0xa7fa)
+                        return true;
+                    return false;
+                }
+                if (cp === 0xa7fa)
+                    return true;
+                if (cp < 0xa7fb)
+                    return false;
+                if (cp < 0xa802)
+                    return true;
+                if (cp < 0xa803)
+                    return false;
+                if (cp < 0xa806)
+                    return true;
+                if (cp < 0xa807)
+                    return false;
+                if (cp < 0xa80b)
+                    return true;
+                if (cp < 0xa80c)
+                    return false;
+                if (cp < 0xa823)
+                    return true;
+                if (cp < 0xa840)
+                    return false;
+                if (cp < 0xa874)
+                    return true;
+                return false;
+            }
+            if (cp < 0xaab1) {
+                if (cp < 0xa9e6) {
+                    if (cp < 0xa930) {
+                        if (cp < 0xa882)
+                            return false;
+                        if (cp < 0xa8b4)
+                            return true;
+                        if (cp < 0xa8f2)
+                            return false;
+                        if (cp < 0xa8f8)
+                            return true;
+                        if (cp === 0xa8fb)
+                            return true;
+                        if (cp < 0xa8fd)
+                            return false;
+                        if (cp < 0xa8ff)
+                            return true;
+                        if (cp < 0xa90a)
+                            return false;
+                        if (cp < 0xa926)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xa947)
+                        return true;
+                    if (cp < 0xa960)
+                        return false;
+                    if (cp < 0xa97d)
+                        return true;
+                    if (cp < 0xa984)
+                        return false;
+                    if (cp < 0xa9b3)
+                        return true;
+                    if (cp === 0xa9cf)
+                        return true;
+                    if (cp < 0xa9e0)
+                        return false;
+                    if (cp < 0xa9e5)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xaa44) {
+                    if (cp === 0xa9e6)
+                        return true;
+                    if (cp < 0xa9e7)
+                        return false;
+                    if (cp < 0xa9f0)
+                        return true;
+                    if (cp < 0xa9fa)
+                        return false;
+                    if (cp < 0xa9ff)
+                        return true;
+                    if (cp < 0xaa00)
+                        return false;
+                    if (cp < 0xaa29)
+                        return true;
+                    if (cp < 0xaa40)
+                        return false;
+                    if (cp < 0xaa43)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xaa4c)
+                    return true;
+                if (cp < 0xaa60)
+                    return false;
+                if (cp < 0xaa70)
+                    return true;
+                if (cp === 0xaa70)
+                    return true;
+                if (cp < 0xaa71)
+                    return false;
+                if (cp < 0xaa77)
+                    return true;
+                if (cp === 0xaa7a)
+                    return true;
+                if (cp < 0xaa7e)
+                    return false;
+                if (cp < 0xaab0)
+                    return true;
+                return false;
+            }
+            if (cp < 0xab01) {
+                if (cp < 0xaadb) {
+                    if (cp === 0xaab1)
+                        return true;
+                    if (cp < 0xaab5)
+                        return false;
+                    if (cp < 0xaab7)
+                        return true;
+                    if (cp < 0xaab9)
+                        return false;
+                    if (cp < 0xaabe)
+                        return true;
+                    if (cp === 0xaac0)
+                        return true;
+                    if (cp === 0xaac2)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xaadd)
+                    return true;
+                if (cp === 0xaadd)
+                    return true;
+                if (cp < 0xaae0)
+                    return false;
+                if (cp < 0xaaeb)
+                    return true;
+                if (cp === 0xaaf2)
+                    return true;
+                if (cp < 0xaaf3)
+                    return false;
+                if (cp < 0xaaf5)
+                    return true;
+                return false;
+            }
+            if (cp < 0xab30) {
+                if (cp < 0xab01)
+                    return false;
+                if (cp < 0xab07)
+                    return true;
+                if (cp < 0xab09)
+                    return false;
+                if (cp < 0xab0f)
+                    return true;
+                if (cp < 0xab11)
+                    return false;
+                if (cp < 0xab17)
+                    return true;
+                if (cp < 0xab20)
+                    return false;
+                if (cp < 0xab27)
+                    return true;
+                if (cp < 0xab28)
+                    return false;
+                if (cp < 0xab2f)
+                    return true;
+                return false;
+            }
+            if (cp < 0xab5b)
+                return true;
+            if (cp < 0xab5c)
+                return false;
+            if (cp < 0xab60)
+                return true;
+            if (cp < 0xab60)
+                return false;
+            if (cp < 0xab66)
+                return true;
+            if (cp < 0xab70)
+                return false;
+            if (cp < 0xabc0)
+                return true;
+            if (cp < 0xabc0)
+                return false;
+            if (cp < 0xabe3)
+                return true;
+            if (cp < 0xac00)
+                return false;
+            if (cp < 0xd7a4)
+                return true;
+            return false;
+        }
+        if (cp < 0x1032d) {
+            if (cp < 0xff41) {
+                if (cp < 0xfb3e) {
+                    if (cp < 0xfb13) {
+                        if (cp < 0xd7b0)
+                            return false;
+                        if (cp < 0xd7c7)
+                            return true;
+                        if (cp < 0xd7cb)
+                            return false;
+                        if (cp < 0xd7fc)
+                            return true;
+                        if (cp < 0xf900)
+                            return false;
+                        if (cp < 0xfa6e)
+                            return true;
+                        if (cp < 0xfa70)
+                            return false;
+                        if (cp < 0xfada)
+                            return true;
+                        if (cp < 0xfb00)
+                            return false;
+                        if (cp < 0xfb07)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xfb18)
+                        return true;
+                    if (cp === 0xfb1d)
+                        return true;
+                    if (cp < 0xfb1f)
+                        return false;
+                    if (cp < 0xfb29)
+                        return true;
+                    if (cp < 0xfb2a)
+                        return false;
+                    if (cp < 0xfb37)
+                        return true;
+                    if (cp < 0xfb38)
+                        return false;
+                    if (cp < 0xfb3d)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xfd50) {
+                    if (cp === 0xfb3e)
+                        return true;
+                    if (cp < 0xfb40)
+                        return false;
+                    if (cp < 0xfb42)
+                        return true;
+                    if (cp < 0xfb43)
+                        return false;
+                    if (cp < 0xfb45)
+                        return true;
+                    if (cp < 0xfb46)
+                        return false;
+                    if (cp < 0xfbb2)
+                        return true;
+                    if (cp < 0xfbd3)
+                        return false;
+                    if (cp < 0xfd3e)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xfd90)
+                    return true;
+                if (cp < 0xfd92)
+                    return false;
+                if (cp < 0xfdc8)
+                    return true;
+                if (cp < 0xfdf0)
+                    return false;
+                if (cp < 0xfdfc)
+                    return true;
+                if (cp < 0xfe70)
+                    return false;
+                if (cp < 0xfe75)
+                    return true;
+                if (cp < 0xfe76)
+                    return false;
+                if (cp < 0xfefd)
+                    return true;
+                if (cp < 0xff21)
+                    return false;
+                if (cp < 0xff3b)
+                    return true;
+                return false;
+            }
+            if (cp < 0x10000) {
+                if (cp < 0xffa0) {
+                    if (cp < 0xff41)
+                        return false;
+                    if (cp < 0xff5b)
+                        return true;
+                    if (cp < 0xff66)
+                        return false;
+                    if (cp < 0xff70)
+                        return true;
+                    if (cp === 0xff70)
+                        return true;
+                    if (cp < 0xff71)
+                        return false;
+                    if (cp < 0xff9e)
+                        return true;
+                    if (cp < 0xff9e)
+                        return false;
+                    if (cp < 0xffa0)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xffbf)
+                    return true;
+                if (cp < 0xffc2)
+                    return false;
+                if (cp < 0xffc8)
+                    return true;
+                if (cp < 0xffca)
+                    return false;
+                if (cp < 0xffd0)
+                    return true;
+                if (cp < 0xffd2)
+                    return false;
+                if (cp < 0xffd8)
+                    return true;
+                if (cp < 0xffda)
+                    return false;
+                if (cp < 0xffdd)
+                    return true;
+                return false;
+            }
+            if (cp < 0x10050) {
+                if (cp < 0x10000)
+                    return false;
+                if (cp < 0x1000c)
+                    return true;
+                if (cp < 0x1000d)
+                    return false;
+                if (cp < 0x10027)
+                    return true;
+                if (cp < 0x10028)
+                    return false;
+                if (cp < 0x1003b)
+                    return true;
+                if (cp < 0x1003c)
+                    return false;
+                if (cp < 0x1003e)
+                    return true;
+                if (cp < 0x1003f)
+                    return false;
+                if (cp < 0x1004e)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1005e)
+                return true;
+            if (cp < 0x10080)
+                return false;
+            if (cp < 0x100fb)
+                return true;
+            if (cp < 0x10140)
+                return false;
+            if (cp < 0x10175)
+                return true;
+            if (cp < 0x10280)
+                return false;
+            if (cp < 0x1029d)
+                return true;
+            if (cp < 0x102a0)
+                return false;
+            if (cp < 0x102d1)
+                return true;
+            if (cp < 0x10300)
+                return false;
+            if (cp < 0x10320)
+                return true;
+            return false;
+        }
+        if (cp < 0x10837) {
+            if (cp < 0x10450) {
+                if (cp < 0x10380) {
+                    if (cp < 0x1032d)
+                        return false;
+                    if (cp < 0x10341)
+                        return true;
+                    if (cp === 0x10341)
+                        return true;
+                    if (cp < 0x10342)
+                        return false;
+                    if (cp < 0x1034a)
+                        return true;
+                    if (cp === 0x1034a)
+                        return true;
+                    if (cp < 0x10350)
+                        return false;
+                    if (cp < 0x10376)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1039e)
+                    return true;
+                if (cp < 0x103a0)
+                    return false;
+                if (cp < 0x103c4)
+                    return true;
+                if (cp < 0x103c8)
+                    return false;
+                if (cp < 0x103d0)
+                    return true;
+                if (cp < 0x103d1)
+                    return false;
+                if (cp < 0x103d6)
+                    return true;
+                if (cp < 0x10400)
+                    return false;
+                if (cp < 0x10450)
+                    return true;
+                return false;
+            }
+            if (cp < 0x10600) {
+                if (cp < 0x10450)
+                    return false;
+                if (cp < 0x1049e)
+                    return true;
+                if (cp < 0x104b0)
+                    return false;
+                if (cp < 0x104d4)
+                    return true;
+                if (cp < 0x104d8)
+                    return false;
+                if (cp < 0x104fc)
+                    return true;
+                if (cp < 0x10500)
+                    return false;
+                if (cp < 0x10528)
+                    return true;
+                if (cp < 0x10530)
+                    return false;
+                if (cp < 0x10564)
+                    return true;
+                return false;
+            }
+            if (cp < 0x10737)
+                return true;
+            if (cp < 0x10740)
+                return false;
+            if (cp < 0x10756)
+                return true;
+            if (cp < 0x10760)
+                return false;
+            if (cp < 0x10768)
+                return true;
+            if (cp < 0x10800)
+                return false;
+            if (cp < 0x10806)
+                return true;
+            if (cp === 0x10808)
+                return true;
+            if (cp < 0x1080a)
+                return false;
+            if (cp < 0x10836)
+                return true;
+            return false;
+        }
+        if (cp < 0x109be) {
+            if (cp < 0x108e0) {
+                if (cp < 0x10837)
+                    return false;
+                if (cp < 0x10839)
+                    return true;
+                if (cp === 0x1083c)
+                    return true;
+                if (cp < 0x1083f)
+                    return false;
+                if (cp < 0x10856)
+                    return true;
+                if (cp < 0x10860)
+                    return false;
+                if (cp < 0x10877)
+                    return true;
+                if (cp < 0x10880)
+                    return false;
+                if (cp < 0x1089f)
+                    return true;
+                return false;
+            }
+            if (cp < 0x108f3)
+                return true;
+            if (cp < 0x108f4)
+                return false;
+            if (cp < 0x108f6)
+                return true;
+            if (cp < 0x10900)
+                return false;
+            if (cp < 0x10916)
+                return true;
+            if (cp < 0x10920)
+                return false;
+            if (cp < 0x1093a)
+                return true;
+            if (cp < 0x10980)
+                return false;
+            if (cp < 0x109b8)
+                return true;
+            return false;
+        }
+        if (cp < 0x10a60) {
+            if (cp < 0x109be)
+                return false;
+            if (cp < 0x109c0)
+                return true;
+            if (cp === 0x10a00)
+                return true;
+            if (cp < 0x10a10)
+                return false;
+            if (cp < 0x10a14)
+                return true;
+            if (cp < 0x10a15)
+                return false;
+            if (cp < 0x10a18)
+                return true;
+            if (cp < 0x10a19)
+                return false;
+            if (cp < 0x10a36)
+                return true;
+            return false;
+        }
+        if (cp < 0x10a7d)
+            return true;
+        if (cp < 0x10a80)
+            return false;
+        if (cp < 0x10a9d)
+            return true;
+        if (cp < 0x10ac0)
+            return false;
+        if (cp < 0x10ac8)
+            return true;
+        if (cp < 0x10ac9)
+            return false;
+        if (cp < 0x10ae5)
+            return true;
+        if (cp < 0x10b00)
+            return false;
+        if (cp < 0x10b36)
+            return true;
+        if (cp < 0x10b40)
+            return false;
+        if (cp < 0x10b56)
+            return true;
+        return false;
+    }
+    if (cp < 0x16e40) {
+        if (cp < 0x11580) {
+            if (cp < 0x11213) {
+                if (cp < 0x11083) {
+                    if (cp < 0x10d00) {
+                        if (cp < 0x10b60)
+                            return false;
+                        if (cp < 0x10b73)
+                            return true;
+                        if (cp < 0x10b80)
+                            return false;
+                        if (cp < 0x10b92)
+                            return true;
+                        if (cp < 0x10c00)
+                            return false;
+                        if (cp < 0x10c49)
+                            return true;
+                        if (cp < 0x10c80)
+                            return false;
+                        if (cp < 0x10cb3)
+                            return true;
+                        if (cp < 0x10cc0)
+                            return false;
+                        if (cp < 0x10cf3)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x10d24)
+                        return true;
+                    if (cp < 0x10f00)
+                        return false;
+                    if (cp < 0x10f1d)
+                        return true;
+                    if (cp === 0x10f27)
+                        return true;
+                    if (cp < 0x10f30)
+                        return false;
+                    if (cp < 0x10f46)
+                        return true;
+                    if (cp < 0x11003)
+                        return false;
+                    if (cp < 0x11038)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x11176) {
+                    if (cp < 0x11083)
+                        return false;
+                    if (cp < 0x110b0)
+                        return true;
+                    if (cp < 0x110d0)
+                        return false;
+                    if (cp < 0x110e9)
+                        return true;
+                    if (cp < 0x11103)
+                        return false;
+                    if (cp < 0x11127)
+                        return true;
+                    if (cp === 0x11144)
+                        return true;
+                    if (cp < 0x11150)
+                        return false;
+                    if (cp < 0x11173)
+                        return true;
+                    return false;
+                }
+                if (cp === 0x11176)
+                    return true;
+                if (cp < 0x11183)
+                    return false;
+                if (cp < 0x111b3)
+                    return true;
+                if (cp < 0x111c1)
+                    return false;
+                if (cp < 0x111c5)
+                    return true;
+                if (cp === 0x111da)
+                    return true;
+                if (cp === 0x111dc)
+                    return true;
+                if (cp < 0x11200)
+                    return false;
+                if (cp < 0x11212)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1132a) {
+                if (cp < 0x1129f) {
+                    if (cp < 0x11213)
+                        return false;
+                    if (cp < 0x1122c)
+                        return true;
+                    if (cp < 0x11280)
+                        return false;
+                    if (cp < 0x11287)
+                        return true;
+                    if (cp === 0x11288)
+                        return true;
+                    if (cp < 0x1128a)
+                        return false;
+                    if (cp < 0x1128e)
+                        return true;
+                    if (cp < 0x1128f)
+                        return false;
+                    if (cp < 0x1129e)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x112a9)
+                    return true;
+                if (cp < 0x112b0)
+                    return false;
+                if (cp < 0x112df)
+                    return true;
+                if (cp < 0x11305)
+                    return false;
+                if (cp < 0x1130d)
+                    return true;
+                if (cp < 0x1130f)
+                    return false;
+                if (cp < 0x11311)
+                    return true;
+                if (cp < 0x11313)
+                    return false;
+                if (cp < 0x11329)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1135d) {
+                if (cp < 0x1132a)
+                    return false;
+                if (cp < 0x11331)
+                    return true;
+                if (cp < 0x11332)
+                    return false;
+                if (cp < 0x11334)
+                    return true;
+                if (cp < 0x11335)
+                    return false;
+                if (cp < 0x1133a)
+                    return true;
+                if (cp === 0x1133d)
+                    return true;
+                if (cp === 0x11350)
+                    return true;
+                return false;
+            }
+            if (cp < 0x11362)
+                return true;
+            if (cp < 0x11400)
+                return false;
+            if (cp < 0x11435)
+                return true;
+            if (cp < 0x11447)
+                return false;
+            if (cp < 0x1144b)
+                return true;
+            if (cp < 0x11480)
+                return false;
+            if (cp < 0x114b0)
+                return true;
+            if (cp < 0x114c4)
+                return false;
+            if (cp < 0x114c6)
+                return true;
+            if (cp === 0x114c7)
+                return true;
+            return false;
+        }
+        if (cp < 0x11d00) {
+            if (cp < 0x11a0b) {
+                if (cp < 0x11700) {
+                    if (cp < 0x11580)
+                        return false;
+                    if (cp < 0x115af)
+                        return true;
+                    if (cp < 0x115d8)
+                        return false;
+                    if (cp < 0x115dc)
+                        return true;
+                    if (cp < 0x11600)
+                        return false;
+                    if (cp < 0x11630)
+                        return true;
+                    if (cp === 0x11644)
+                        return true;
+                    if (cp < 0x11680)
+                        return false;
+                    if (cp < 0x116ab)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1171b)
+                    return true;
+                if (cp < 0x11800)
+                    return false;
+                if (cp < 0x1182c)
+                    return true;
+                if (cp < 0x118a0)
+                    return false;
+                if (cp < 0x118e0)
+                    return true;
+                if (cp === 0x118ff)
+                    return true;
+                if (cp === 0x11a00)
+                    return true;
+                return false;
+            }
+            if (cp < 0x11a9d) {
+                if (cp < 0x11a0b)
+                    return false;
+                if (cp < 0x11a33)
+                    return true;
+                if (cp === 0x11a3a)
+                    return true;
+                if (cp === 0x11a50)
+                    return true;
+                if (cp < 0x11a5c)
+                    return false;
+                if (cp < 0x11a84)
+                    return true;
+                if (cp < 0x11a86)
+                    return false;
+                if (cp < 0x11a8a)
+                    return true;
+                return false;
+            }
+            if (cp === 0x11a9d)
+                return true;
+            if (cp < 0x11ac0)
+                return false;
+            if (cp < 0x11af9)
+                return true;
+            if (cp < 0x11c00)
+                return false;
+            if (cp < 0x11c09)
+                return true;
+            if (cp < 0x11c0a)
+                return false;
+            if (cp < 0x11c2f)
+                return true;
+            if (cp === 0x11c40)
+                return true;
+            if (cp < 0x11c72)
+                return false;
+            if (cp < 0x11c90)
+                return true;
+            return false;
+        }
+        if (cp < 0x12400) {
+            if (cp < 0x11d67) {
+                if (cp < 0x11d00)
+                    return false;
+                if (cp < 0x11d07)
+                    return true;
+                if (cp < 0x11d08)
+                    return false;
+                if (cp < 0x11d0a)
+                    return true;
+                if (cp < 0x11d0b)
+                    return false;
+                if (cp < 0x11d31)
+                    return true;
+                if (cp === 0x11d46)
+                    return true;
+                if (cp < 0x11d60)
+                    return false;
+                if (cp < 0x11d66)
+                    return true;
+                return false;
+            }
+            if (cp < 0x11d69)
+                return true;
+            if (cp < 0x11d6a)
+                return false;
+            if (cp < 0x11d8a)
+                return true;
+            if (cp === 0x11d98)
+                return true;
+            if (cp < 0x11ee0)
+                return false;
+            if (cp < 0x11ef3)
+                return true;
+            if (cp < 0x12000)
+                return false;
+            if (cp < 0x1239a)
+                return true;
+            return false;
+        }
+        if (cp < 0x16a40) {
+            if (cp < 0x12400)
+                return false;
+            if (cp < 0x1246f)
+                return true;
+            if (cp < 0x12480)
+                return false;
+            if (cp < 0x12544)
+                return true;
+            if (cp < 0x13000)
+                return false;
+            if (cp < 0x1342f)
+                return true;
+            if (cp < 0x14400)
+                return false;
+            if (cp < 0x14647)
+                return true;
+            if (cp < 0x16800)
+                return false;
+            if (cp < 0x16a39)
+                return true;
+            return false;
+        }
+        if (cp < 0x16a5f)
+            return true;
+        if (cp < 0x16ad0)
+            return false;
+        if (cp < 0x16aee)
+            return true;
+        if (cp < 0x16b00)
+            return false;
+        if (cp < 0x16b30)
+            return true;
+        if (cp < 0x16b40)
+            return false;
+        if (cp < 0x16b44)
+            return true;
+        if (cp < 0x16b63)
+            return false;
+        if (cp < 0x16b78)
+            return true;
+        if (cp < 0x16b7d)
+            return false;
+        if (cp < 0x16b90)
+            return true;
+        return false;
+    }
+    if (cp < 0x1d7c4) {
+        if (cp < 0x1d4bd) {
+            if (cp < 0x1bc70) {
+                if (cp < 0x17000) {
+                    if (cp < 0x16e40)
+                        return false;
+                    if (cp < 0x16e80)
+                        return true;
+                    if (cp < 0x16f00)
+                        return false;
+                    if (cp < 0x16f45)
+                        return true;
+                    if (cp === 0x16f50)
+                        return true;
+                    if (cp < 0x16f93)
+                        return false;
+                    if (cp < 0x16fa0)
+                        return true;
+                    if (cp < 0x16fe0)
+                        return false;
+                    if (cp < 0x16fe2)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x187f2)
+                    return true;
+                if (cp < 0x18800)
+                    return false;
+                if (cp < 0x18af3)
+                    return true;
+                if (cp < 0x1b000)
+                    return false;
+                if (cp < 0x1b11f)
+                    return true;
+                if (cp < 0x1b170)
+                    return false;
+                if (cp < 0x1b2fc)
+                    return true;
+                if (cp < 0x1bc00)
+                    return false;
+                if (cp < 0x1bc6b)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1d49e) {
+                if (cp < 0x1bc70)
+                    return false;
+                if (cp < 0x1bc7d)
+                    return true;
+                if (cp < 0x1bc80)
+                    return false;
+                if (cp < 0x1bc89)
+                    return true;
+                if (cp < 0x1bc90)
+                    return false;
+                if (cp < 0x1bc9a)
+                    return true;
+                if (cp < 0x1d400)
+                    return false;
+                if (cp < 0x1d455)
+                    return true;
+                if (cp < 0x1d456)
+                    return false;
+                if (cp < 0x1d49d)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1d4a0)
+                return true;
+            if (cp === 0x1d4a2)
+                return true;
+            if (cp < 0x1d4a5)
+                return false;
+            if (cp < 0x1d4a7)
+                return true;
+            if (cp < 0x1d4a9)
+                return false;
+            if (cp < 0x1d4ad)
+                return true;
+            if (cp < 0x1d4ae)
+                return false;
+            if (cp < 0x1d4ba)
+                return true;
+            if (cp === 0x1d4bb)
+                return true;
+            return false;
+        }
+        if (cp < 0x1d552) {
+            if (cp < 0x1d51e) {
+                if (cp < 0x1d4bd)
+                    return false;
+                if (cp < 0x1d4c4)
+                    return true;
+                if (cp < 0x1d4c5)
+                    return false;
+                if (cp < 0x1d506)
+                    return true;
+                if (cp < 0x1d507)
+                    return false;
+                if (cp < 0x1d50b)
+                    return true;
+                if (cp < 0x1d50d)
+                    return false;
+                if (cp < 0x1d515)
+                    return true;
+                if (cp < 0x1d516)
+                    return false;
+                if (cp < 0x1d51d)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1d53a)
+                return true;
+            if (cp < 0x1d53b)
+                return false;
+            if (cp < 0x1d53f)
+                return true;
+            if (cp < 0x1d540)
+                return false;
+            if (cp < 0x1d545)
+                return true;
+            if (cp === 0x1d546)
+                return true;
+            if (cp < 0x1d54a)
+                return false;
+            if (cp < 0x1d551)
+                return true;
+            return false;
+        }
+        if (cp < 0x1d716) {
+            if (cp < 0x1d552)
+                return false;
+            if (cp < 0x1d6a6)
+                return true;
+            if (cp < 0x1d6a8)
+                return false;
+            if (cp < 0x1d6c1)
+                return true;
+            if (cp < 0x1d6c2)
+                return false;
+            if (cp < 0x1d6db)
+                return true;
+            if (cp < 0x1d6dc)
+                return false;
+            if (cp < 0x1d6fb)
+                return true;
+            if (cp < 0x1d6fc)
+                return false;
+            if (cp < 0x1d715)
+                return true;
+            return false;
+        }
+        if (cp < 0x1d735)
+            return true;
+        if (cp < 0x1d736)
+            return false;
+        if (cp < 0x1d74f)
+            return true;
+        if (cp < 0x1d750)
+            return false;
+        if (cp < 0x1d76f)
+            return true;
+        if (cp < 0x1d770)
+            return false;
+        if (cp < 0x1d789)
+            return true;
+        if (cp < 0x1d78a)
+            return false;
+        if (cp < 0x1d7a9)
+            return true;
+        if (cp < 0x1d7aa)
+            return false;
+        if (cp < 0x1d7c3)
+            return true;
+        return false;
+    }
+    if (cp < 0x1ee5b) {
+        if (cp < 0x1ee39) {
+            if (cp < 0x1ee21) {
+                if (cp < 0x1d7c4)
+                    return false;
+                if (cp < 0x1d7cc)
+                    return true;
+                if (cp < 0x1e800)
+                    return false;
+                if (cp < 0x1e8c5)
+                    return true;
+                if (cp < 0x1e900)
+                    return false;
+                if (cp < 0x1e944)
+                    return true;
+                if (cp < 0x1ee00)
+                    return false;
+                if (cp < 0x1ee04)
+                    return true;
+                if (cp < 0x1ee05)
+                    return false;
+                if (cp < 0x1ee20)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1ee23)
+                return true;
+            if (cp === 0x1ee24)
+                return true;
+            if (cp === 0x1ee27)
+                return true;
+            if (cp < 0x1ee29)
+                return false;
+            if (cp < 0x1ee33)
+                return true;
+            if (cp < 0x1ee34)
+                return false;
+            if (cp < 0x1ee38)
+                return true;
+            return false;
+        }
+        if (cp < 0x1ee4b) {
+            if (cp === 0x1ee39)
+                return true;
+            if (cp === 0x1ee3b)
+                return true;
+            if (cp === 0x1ee42)
+                return true;
+            if (cp === 0x1ee47)
+                return true;
+            if (cp === 0x1ee49)
+                return true;
+            return false;
+        }
+        if (cp === 0x1ee4b)
+            return true;
+        if (cp < 0x1ee4d)
+            return false;
+        if (cp < 0x1ee50)
+            return true;
+        if (cp < 0x1ee51)
+            return false;
+        if (cp < 0x1ee53)
+            return true;
+        if (cp === 0x1ee54)
+            return true;
+        if (cp === 0x1ee57)
+            return true;
+        if (cp === 0x1ee59)
+            return true;
+        return false;
+    }
+    if (cp < 0x1ee80) {
+        if (cp < 0x1ee67) {
+            if (cp === 0x1ee5b)
+                return true;
+            if (cp === 0x1ee5d)
+                return true;
+            if (cp === 0x1ee5f)
+                return true;
+            if (cp < 0x1ee61)
+                return false;
+            if (cp < 0x1ee63)
+                return true;
+            if (cp === 0x1ee64)
+                return true;
+            return false;
+        }
+        if (cp < 0x1ee6b)
+            return true;
+        if (cp < 0x1ee6c)
+            return false;
+        if (cp < 0x1ee73)
+            return true;
+        if (cp < 0x1ee74)
+            return false;
+        if (cp < 0x1ee78)
+            return true;
+        if (cp < 0x1ee79)
+            return false;
+        if (cp < 0x1ee7d)
+            return true;
+        if (cp === 0x1ee7e)
+            return true;
+        return false;
+    }
+    if (cp < 0x20000) {
+        if (cp < 0x1ee80)
+            return false;
+        if (cp < 0x1ee8a)
+            return true;
+        if (cp < 0x1ee8b)
+            return false;
+        if (cp < 0x1ee9c)
+            return true;
+        if (cp < 0x1eea1)
+            return false;
+        if (cp < 0x1eea4)
+            return true;
+        if (cp < 0x1eea5)
+            return false;
+        if (cp < 0x1eeaa)
+            return true;
+        if (cp < 0x1eeab)
+            return false;
+        if (cp < 0x1eebc)
+            return true;
+        return false;
+    }
+    if (cp < 0x2a6d7)
+        return true;
+    if (cp < 0x2a700)
+        return false;
+    if (cp < 0x2b735)
+        return true;
+    if (cp < 0x2b740)
+        return false;
+    if (cp < 0x2b81e)
+        return true;
+    if (cp < 0x2b820)
+        return false;
+    if (cp < 0x2cea2)
+        return true;
+    if (cp < 0x2ceb0)
+        return false;
+    if (cp < 0x2ebe1)
+        return true;
+    if (cp < 0x2f800)
+        return false;
+    if (cp < 0x2fa1e)
+        return true;
+    return false;
+}
+function isLargeIdContinue(cp) {
+    if (cp < 0x1cd0) {
+        if (cp < 0xd82) {
+            if (cp < 0xa83) {
+                if (cp < 0x93b) {
+                    if (cp < 0x6ea) {
+                        if (cp < 0x5c7) {
+                            if (cp === 0xb7)
+                                return true;
+                            if (cp < 0x300)
+                                return false;
+                            if (cp < 0x370)
+                                return true;
+                            if (cp === 0x387)
+                                return true;
+                            if (cp < 0x483)
+                                return false;
+                            if (cp < 0x488)
+                                return true;
+                            if (cp < 0x591)
+                                return false;
+                            if (cp < 0x5be)
+                                return true;
+                            if (cp === 0x5bf)
+                                return true;
+                            if (cp < 0x5c1)
+                                return false;
+                            if (cp < 0x5c3)
+                                return true;
+                            if (cp < 0x5c4)
+                                return false;
+                            if (cp < 0x5c6)
+                                return true;
+                            return false;
+                        }
+                        if (cp === 0x5c7)
+                            return true;
+                        if (cp < 0x610)
+                            return false;
+                        if (cp < 0x61b)
+                            return true;
+                        if (cp < 0x64b)
+                            return false;
+                        if (cp < 0x660)
+                            return true;
+                        if (cp < 0x660)
+                            return false;
+                        if (cp < 0x66a)
+                            return true;
+                        if (cp === 0x670)
+                            return true;
+                        if (cp < 0x6d6)
+                            return false;
+                        if (cp < 0x6dd)
+                            return true;
+                        if (cp < 0x6df)
+                            return false;
+                        if (cp < 0x6e5)
+                            return true;
+                        if (cp < 0x6e7)
+                            return false;
+                        if (cp < 0x6e9)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x816) {
+                        if (cp < 0x6ea)
+                            return false;
+                        if (cp < 0x6ee)
+                            return true;
+                        if (cp < 0x6f0)
+                            return false;
+                        if (cp < 0x6fa)
+                            return true;
+                        if (cp === 0x711)
+                            return true;
+                        if (cp < 0x730)
+                            return false;
+                        if (cp < 0x74b)
+                            return true;
+                        if (cp < 0x7a6)
+                            return false;
+                        if (cp < 0x7b1)
+                            return true;
+                        if (cp < 0x7c0)
+                            return false;
+                        if (cp < 0x7ca)
+                            return true;
+                        if (cp < 0x7eb)
+                            return false;
+                        if (cp < 0x7f4)
+                            return true;
+                        if (cp === 0x7fd)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x81a)
+                        return true;
+                    if (cp < 0x81b)
+                        return false;
+                    if (cp < 0x824)
+                        return true;
+                    if (cp < 0x825)
+                        return false;
+                    if (cp < 0x828)
+                        return true;
+                    if (cp < 0x829)
+                        return false;
+                    if (cp < 0x82e)
+                        return true;
+                    if (cp < 0x859)
+                        return false;
+                    if (cp < 0x85c)
+                        return true;
+                    if (cp < 0x8d3)
+                        return false;
+                    if (cp < 0x8e2)
+                        return true;
+                    if (cp < 0x8e3)
+                        return false;
+                    if (cp < 0x903)
+                        return true;
+                    if (cp === 0x903)
+                        return true;
+                    if (cp === 0x93a)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x9cd) {
+                    if (cp < 0x962) {
+                        if (cp === 0x93b)
+                            return true;
+                        if (cp === 0x93c)
+                            return true;
+                        if (cp < 0x93e)
+                            return false;
+                        if (cp < 0x941)
+                            return true;
+                        if (cp < 0x941)
+                            return false;
+                        if (cp < 0x949)
+                            return true;
+                        if (cp < 0x949)
+                            return false;
+                        if (cp < 0x94d)
+                            return true;
+                        if (cp === 0x94d)
+                            return true;
+                        if (cp < 0x94e)
+                            return false;
+                        if (cp < 0x950)
+                            return true;
+                        if (cp < 0x951)
+                            return false;
+                        if (cp < 0x958)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x964)
+                        return true;
+                    if (cp < 0x966)
+                        return false;
+                    if (cp < 0x970)
+                        return true;
+                    if (cp === 0x981)
+                        return true;
+                    if (cp < 0x982)
+                        return false;
+                    if (cp < 0x984)
+                        return true;
+                    if (cp === 0x9bc)
+                        return true;
+                    if (cp < 0x9be)
+                        return false;
+                    if (cp < 0x9c1)
+                        return true;
+                    if (cp < 0x9c1)
+                        return false;
+                    if (cp < 0x9c5)
+                        return true;
+                    if (cp < 0x9c7)
+                        return false;
+                    if (cp < 0x9c9)
+                        return true;
+                    if (cp < 0x9cb)
+                        return false;
+                    if (cp < 0x9cd)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xa3e) {
+                    if (cp === 0x9cd)
+                        return true;
+                    if (cp === 0x9d7)
+                        return true;
+                    if (cp < 0x9e2)
+                        return false;
+                    if (cp < 0x9e4)
+                        return true;
+                    if (cp < 0x9e6)
+                        return false;
+                    if (cp < 0x9f0)
+                        return true;
+                    if (cp === 0x9fe)
+                        return true;
+                    if (cp < 0xa01)
+                        return false;
+                    if (cp < 0xa03)
+                        return true;
+                    if (cp === 0xa03)
+                        return true;
+                    if (cp === 0xa3c)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xa41)
+                    return true;
+                if (cp < 0xa41)
+                    return false;
+                if (cp < 0xa43)
+                    return true;
+                if (cp < 0xa47)
+                    return false;
+                if (cp < 0xa49)
+                    return true;
+                if (cp < 0xa4b)
+                    return false;
+                if (cp < 0xa4e)
+                    return true;
+                if (cp === 0xa51)
+                    return true;
+                if (cp < 0xa66)
+                    return false;
+                if (cp < 0xa70)
+                    return true;
+                if (cp < 0xa70)
+                    return false;
+                if (cp < 0xa72)
+                    return true;
+                if (cp === 0xa75)
+                    return true;
+                if (cp < 0xa81)
+                    return false;
+                if (cp < 0xa83)
+                    return true;
+                return false;
+            }
+            if (cp < 0xc00) {
+                if (cp < 0xb41) {
+                    if (cp < 0xae2) {
+                        if (cp === 0xa83)
+                            return true;
+                        if (cp === 0xabc)
+                            return true;
+                        if (cp < 0xabe)
+                            return false;
+                        if (cp < 0xac1)
+                            return true;
+                        if (cp < 0xac1)
+                            return false;
+                        if (cp < 0xac6)
+                            return true;
+                        if (cp < 0xac7)
+                            return false;
+                        if (cp < 0xac9)
+                            return true;
+                        if (cp === 0xac9)
+                            return true;
+                        if (cp < 0xacb)
+                            return false;
+                        if (cp < 0xacd)
+                            return true;
+                        if (cp === 0xacd)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0xae4)
+                        return true;
+                    if (cp < 0xae6)
+                        return false;
+                    if (cp < 0xaf0)
+                        return true;
+                    if (cp < 0xafa)
+                        return false;
+                    if (cp < 0xb00)
+                        return true;
+                    if (cp === 0xb01)
+                        return true;
+                    if (cp < 0xb02)
+                        return false;
+                    if (cp < 0xb04)
+                        return true;
+                    if (cp === 0xb3c)
+                        return true;
+                    if (cp === 0xb3e)
+                        return true;
+                    if (cp === 0xb3f)
+                        return true;
+                    if (cp === 0xb40)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xb82) {
+                    if (cp < 0xb41)
+                        return false;
+                    if (cp < 0xb45)
+                        return true;
+                    if (cp < 0xb47)
+                        return false;
+                    if (cp < 0xb49)
+                        return true;
+                    if (cp < 0xb4b)
+                        return false;
+                    if (cp < 0xb4d)
+                        return true;
+                    if (cp === 0xb4d)
+                        return true;
+                    if (cp === 0xb56)
+                        return true;
+                    if (cp === 0xb57)
+                        return true;
+                    if (cp < 0xb62)
+                        return false;
+                    if (cp < 0xb64)
+                        return true;
+                    if (cp < 0xb66)
+                        return false;
+                    if (cp < 0xb70)
+                        return true;
+                    return false;
+                }
+                if (cp === 0xb82)
+                    return true;
+                if (cp < 0xbbe)
+                    return false;
+                if (cp < 0xbc0)
+                    return true;
+                if (cp === 0xbc0)
+                    return true;
+                if (cp < 0xbc1)
+                    return false;
+                if (cp < 0xbc3)
+                    return true;
+                if (cp < 0xbc6)
+                    return false;
+                if (cp < 0xbc9)
+                    return true;
+                if (cp < 0xbca)
+                    return false;
+                if (cp < 0xbcd)
+                    return true;
+                if (cp === 0xbcd)
+                    return true;
+                if (cp === 0xbd7)
+                    return true;
+                if (cp < 0xbe6)
+                    return false;
+                if (cp < 0xbf0)
+                    return true;
+                return false;
+            }
+            if (cp < 0xcc7) {
+                if (cp < 0xc62) {
+                    if (cp === 0xc00)
+                        return true;
+                    if (cp < 0xc01)
+                        return false;
+                    if (cp < 0xc04)
+                        return true;
+                    if (cp === 0xc04)
+                        return true;
+                    if (cp < 0xc3e)
+                        return false;
+                    if (cp < 0xc41)
+                        return true;
+                    if (cp < 0xc41)
+                        return false;
+                    if (cp < 0xc45)
+                        return true;
+                    if (cp < 0xc46)
+                        return false;
+                    if (cp < 0xc49)
+                        return true;
+                    if (cp < 0xc4a)
+                        return false;
+                    if (cp < 0xc4e)
+                        return true;
+                    if (cp < 0xc55)
+                        return false;
+                    if (cp < 0xc57)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xc64)
+                    return true;
+                if (cp < 0xc66)
+                    return false;
+                if (cp < 0xc70)
+                    return true;
+                if (cp === 0xc81)
+                    return true;
+                if (cp < 0xc82)
+                    return false;
+                if (cp < 0xc84)
+                    return true;
+                if (cp === 0xcbc)
+                    return true;
+                if (cp === 0xcbe)
+                    return true;
+                if (cp === 0xcbf)
+                    return true;
+                if (cp < 0xcc0)
+                    return false;
+                if (cp < 0xcc5)
+                    return true;
+                if (cp === 0xcc6)
+                    return true;
+                return false;
+            }
+            if (cp < 0xd3b) {
+                if (cp < 0xcc7)
+                    return false;
+                if (cp < 0xcc9)
+                    return true;
+                if (cp < 0xcca)
+                    return false;
+                if (cp < 0xccc)
+                    return true;
+                if (cp < 0xccc)
+                    return false;
+                if (cp < 0xcce)
+                    return true;
+                if (cp < 0xcd5)
+                    return false;
+                if (cp < 0xcd7)
+                    return true;
+                if (cp < 0xce2)
+                    return false;
+                if (cp < 0xce4)
+                    return true;
+                if (cp < 0xce6)
+                    return false;
+                if (cp < 0xcf0)
+                    return true;
+                if (cp < 0xd00)
+                    return false;
+                if (cp < 0xd02)
+                    return true;
+                if (cp < 0xd02)
+                    return false;
+                if (cp < 0xd04)
+                    return true;
+                return false;
+            }
+            if (cp < 0xd3d)
+                return true;
+            if (cp < 0xd3e)
+                return false;
+            if (cp < 0xd41)
+                return true;
+            if (cp < 0xd41)
+                return false;
+            if (cp < 0xd45)
+                return true;
+            if (cp < 0xd46)
+                return false;
+            if (cp < 0xd49)
+                return true;
+            if (cp < 0xd4a)
+                return false;
+            if (cp < 0xd4d)
+                return true;
+            if (cp === 0xd4d)
+                return true;
+            if (cp === 0xd57)
+                return true;
+            if (cp < 0xd62)
+                return false;
+            if (cp < 0xd64)
+                return true;
+            if (cp < 0xd66)
+                return false;
+            if (cp < 0xd70)
+                return true;
+            return false;
+        }
+        if (cp < 0x17e0) {
+            if (cp < 0x1038) {
+                if (cp < 0xf18) {
+                    if (cp < 0xe31) {
+                        if (cp < 0xd82)
+                            return false;
+                        if (cp < 0xd84)
+                            return true;
+                        if (cp === 0xdca)
+                            return true;
+                        if (cp < 0xdcf)
+                            return false;
+                        if (cp < 0xdd2)
+                            return true;
+                        if (cp < 0xdd2)
+                            return false;
+                        if (cp < 0xdd5)
+                            return true;
+                        if (cp === 0xdd6)
+                            return true;
+                        if (cp < 0xdd8)
+                            return false;
+                        if (cp < 0xde0)
+                            return true;
+                        if (cp < 0xde6)
+                            return false;
+                        if (cp < 0xdf0)
+                            return true;
+                        if (cp < 0xdf2)
+                            return false;
+                        if (cp < 0xdf4)
+                            return true;
+                        return false;
+                    }
+                    if (cp === 0xe31)
+                        return true;
+                    if (cp < 0xe34)
+                        return false;
+                    if (cp < 0xe3b)
+                        return true;
+                    if (cp < 0xe47)
+                        return false;
+                    if (cp < 0xe4f)
+                        return true;
+                    if (cp < 0xe50)
+                        return false;
+                    if (cp < 0xe5a)
+                        return true;
+                    if (cp === 0xeb1)
+                        return true;
+                    if (cp < 0xeb4)
+                        return false;
+                    if (cp < 0xeba)
+                        return true;
+                    if (cp < 0xebb)
+                        return false;
+                    if (cp < 0xebd)
+                        return true;
+                    if (cp < 0xec8)
+                        return false;
+                    if (cp < 0xece)
+                        return true;
+                    if (cp < 0xed0)
+                        return false;
+                    if (cp < 0xeda)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xf80) {
+                    if (cp < 0xf18)
+                        return false;
+                    if (cp < 0xf1a)
+                        return true;
+                    if (cp < 0xf20)
+                        return false;
+                    if (cp < 0xf2a)
+                        return true;
+                    if (cp === 0xf35)
+                        return true;
+                    if (cp === 0xf37)
+                        return true;
+                    if (cp === 0xf39)
+                        return true;
+                    if (cp < 0xf3e)
+                        return false;
+                    if (cp < 0xf40)
+                        return true;
+                    if (cp < 0xf71)
+                        return false;
+                    if (cp < 0xf7f)
+                        return true;
+                    if (cp === 0xf7f)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xf85)
+                    return true;
+                if (cp < 0xf86)
+                    return false;
+                if (cp < 0xf88)
+                    return true;
+                if (cp < 0xf8d)
+                    return false;
+                if (cp < 0xf98)
+                    return true;
+                if (cp < 0xf99)
+                    return false;
+                if (cp < 0xfbd)
+                    return true;
+                if (cp === 0xfc6)
+                    return true;
+                if (cp < 0x102b)
+                    return false;
+                if (cp < 0x102d)
+                    return true;
+                if (cp < 0x102d)
+                    return false;
+                if (cp < 0x1031)
+                    return true;
+                if (cp === 0x1031)
+                    return true;
+                if (cp < 0x1032)
+                    return false;
+                if (cp < 0x1038)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1090) {
+                if (cp < 0x1062) {
+                    if (cp === 0x1038)
+                        return true;
+                    if (cp < 0x1039)
+                        return false;
+                    if (cp < 0x103b)
+                        return true;
+                    if (cp < 0x103b)
+                        return false;
+                    if (cp < 0x103d)
+                        return true;
+                    if (cp < 0x103d)
+                        return false;
+                    if (cp < 0x103f)
+                        return true;
+                    if (cp < 0x1040)
+                        return false;
+                    if (cp < 0x104a)
+                        return true;
+                    if (cp < 0x1056)
+                        return false;
+                    if (cp < 0x1058)
+                        return true;
+                    if (cp < 0x1058)
+                        return false;
+                    if (cp < 0x105a)
+                        return true;
+                    if (cp < 0x105e)
+                        return false;
+                    if (cp < 0x1061)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1065)
+                    return true;
+                if (cp < 0x1067)
+                    return false;
+                if (cp < 0x106e)
+                    return true;
+                if (cp < 0x1071)
+                    return false;
+                if (cp < 0x1075)
+                    return true;
+                if (cp === 0x1082)
+                    return true;
+                if (cp < 0x1083)
+                    return false;
+                if (cp < 0x1085)
+                    return true;
+                if (cp < 0x1085)
+                    return false;
+                if (cp < 0x1087)
+                    return true;
+                if (cp < 0x1087)
+                    return false;
+                if (cp < 0x108d)
+                    return true;
+                if (cp === 0x108d)
+                    return true;
+                if (cp === 0x108f)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1772) {
+                if (cp < 0x1090)
+                    return false;
+                if (cp < 0x109a)
+                    return true;
+                if (cp < 0x109a)
+                    return false;
+                if (cp < 0x109d)
+                    return true;
+                if (cp === 0x109d)
+                    return true;
+                if (cp < 0x135d)
+                    return false;
+                if (cp < 0x1360)
+                    return true;
+                if (cp < 0x1369)
+                    return false;
+                if (cp < 0x1372)
+                    return true;
+                if (cp < 0x1712)
+                    return false;
+                if (cp < 0x1715)
+                    return true;
+                if (cp < 0x1732)
+                    return false;
+                if (cp < 0x1735)
+                    return true;
+                if (cp < 0x1752)
+                    return false;
+                if (cp < 0x1754)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1774)
+                return true;
+            if (cp < 0x17b4)
+                return false;
+            if (cp < 0x17b6)
+                return true;
+            if (cp === 0x17b6)
+                return true;
+            if (cp < 0x17b7)
+                return false;
+            if (cp < 0x17be)
+                return true;
+            if (cp < 0x17be)
+                return false;
+            if (cp < 0x17c6)
+                return true;
+            if (cp === 0x17c6)
+                return true;
+            if (cp < 0x17c7)
+                return false;
+            if (cp < 0x17c9)
+                return true;
+            if (cp < 0x17c9)
+                return false;
+            if (cp < 0x17d4)
+                return true;
+            if (cp === 0x17dd)
+                return true;
+            return false;
+        }
+        if (cp < 0x1b04) {
+            if (cp < 0x1a1b) {
+                if (cp < 0x1930) {
+                    if (cp < 0x17e0)
+                        return false;
+                    if (cp < 0x17ea)
+                        return true;
+                    if (cp < 0x180b)
+                        return false;
+                    if (cp < 0x180e)
+                        return true;
+                    if (cp < 0x1810)
+                        return false;
+                    if (cp < 0x181a)
+                        return true;
+                    if (cp === 0x18a9)
+                        return true;
+                    if (cp < 0x1920)
+                        return false;
+                    if (cp < 0x1923)
+                        return true;
+                    if (cp < 0x1923)
+                        return false;
+                    if (cp < 0x1927)
+                        return true;
+                    if (cp < 0x1927)
+                        return false;
+                    if (cp < 0x1929)
+                        return true;
+                    if (cp < 0x1929)
+                        return false;
+                    if (cp < 0x192c)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x1932)
+                    return true;
+                if (cp === 0x1932)
+                    return true;
+                if (cp < 0x1933)
+                    return false;
+                if (cp < 0x1939)
+                    return true;
+                if (cp < 0x1939)
+                    return false;
+                if (cp < 0x193c)
+                    return true;
+                if (cp < 0x1946)
+                    return false;
+                if (cp < 0x1950)
+                    return true;
+                if (cp < 0x19d0)
+                    return false;
+                if (cp < 0x19da)
+                    return true;
+                if (cp === 0x19da)
+                    return true;
+                if (cp < 0x1a17)
+                    return false;
+                if (cp < 0x1a19)
+                    return true;
+                if (cp < 0x1a19)
+                    return false;
+                if (cp < 0x1a1b)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1a63) {
+                if (cp === 0x1a1b)
+                    return true;
+                if (cp === 0x1a55)
+                    return true;
+                if (cp === 0x1a56)
+                    return true;
+                if (cp === 0x1a57)
+                    return true;
+                if (cp < 0x1a58)
+                    return false;
+                if (cp < 0x1a5f)
+                    return true;
+                if (cp === 0x1a60)
+                    return true;
+                if (cp === 0x1a61)
+                    return true;
+                if (cp === 0x1a62)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1a65)
+                return true;
+            if (cp < 0x1a65)
+                return false;
+            if (cp < 0x1a6d)
+                return true;
+            if (cp < 0x1a6d)
+                return false;
+            if (cp < 0x1a73)
+                return true;
+            if (cp < 0x1a73)
+                return false;
+            if (cp < 0x1a7d)
+                return true;
+            if (cp === 0x1a7f)
+                return true;
+            if (cp < 0x1a80)
+                return false;
+            if (cp < 0x1a8a)
+                return true;
+            if (cp < 0x1a90)
+                return false;
+            if (cp < 0x1a9a)
+                return true;
+            if (cp < 0x1ab0)
+                return false;
+            if (cp < 0x1abe)
+                return true;
+            if (cp < 0x1b00)
+                return false;
+            if (cp < 0x1b04)
+                return true;
+            return false;
+        }
+        if (cp < 0x1baa) {
+            if (cp < 0x1b43) {
+                if (cp === 0x1b04)
+                    return true;
+                if (cp === 0x1b34)
+                    return true;
+                if (cp === 0x1b35)
+                    return true;
+                if (cp < 0x1b36)
+                    return false;
+                if (cp < 0x1b3b)
+                    return true;
+                if (cp === 0x1b3b)
+                    return true;
+                if (cp === 0x1b3c)
+                    return true;
+                if (cp < 0x1b3d)
+                    return false;
+                if (cp < 0x1b42)
+                    return true;
+                if (cp === 0x1b42)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1b45)
+                return true;
+            if (cp < 0x1b50)
+                return false;
+            if (cp < 0x1b5a)
+                return true;
+            if (cp < 0x1b6b)
+                return false;
+            if (cp < 0x1b74)
+                return true;
+            if (cp < 0x1b80)
+                return false;
+            if (cp < 0x1b82)
+                return true;
+            if (cp === 0x1b82)
+                return true;
+            if (cp === 0x1ba1)
+                return true;
+            if (cp < 0x1ba2)
+                return false;
+            if (cp < 0x1ba6)
+                return true;
+            if (cp < 0x1ba6)
+                return false;
+            if (cp < 0x1ba8)
+                return true;
+            if (cp < 0x1ba8)
+                return false;
+            if (cp < 0x1baa)
+                return true;
+            return false;
+        }
+        if (cp < 0x1bee) {
+            if (cp === 0x1baa)
+                return true;
+            if (cp < 0x1bab)
+                return false;
+            if (cp < 0x1bae)
+                return true;
+            if (cp < 0x1bb0)
+                return false;
+            if (cp < 0x1bba)
+                return true;
+            if (cp === 0x1be6)
+                return true;
+            if (cp === 0x1be7)
+                return true;
+            if (cp < 0x1be8)
+                return false;
+            if (cp < 0x1bea)
+                return true;
+            if (cp < 0x1bea)
+                return false;
+            if (cp < 0x1bed)
+                return true;
+            if (cp === 0x1bed)
+                return true;
+            return false;
+        }
+        if (cp === 0x1bee)
+            return true;
+        if (cp < 0x1bef)
+            return false;
+        if (cp < 0x1bf2)
+            return true;
+        if (cp < 0x1bf2)
+            return false;
+        if (cp < 0x1bf4)
+            return true;
+        if (cp < 0x1c24)
+            return false;
+        if (cp < 0x1c2c)
+            return true;
+        if (cp < 0x1c2c)
+            return false;
+        if (cp < 0x1c34)
+            return true;
+        if (cp < 0x1c34)
+            return false;
+        if (cp < 0x1c36)
+            return true;
+        if (cp < 0x1c36)
+            return false;
+        if (cp < 0x1c38)
+            return true;
+        if (cp < 0x1c40)
+            return false;
+        if (cp < 0x1c4a)
+            return true;
+        if (cp < 0x1c50)
+            return false;
+        if (cp < 0x1c5a)
+            return true;
+        return false;
+    }
+    if (cp < 0x1123e) {
+        if (cp < 0xaab7) {
+            if (cp < 0xa8b4) {
+                if (cp < 0x2d7f) {
+                    if (cp < 0x1cf8) {
+                        if (cp < 0x1cd0)
+                            return false;
+                        if (cp < 0x1cd3)
+                            return true;
+                        if (cp < 0x1cd4)
+                            return false;
+                        if (cp < 0x1ce1)
+                            return true;
+                        if (cp === 0x1ce1)
+                            return true;
+                        if (cp < 0x1ce2)
+                            return false;
+                        if (cp < 0x1ce9)
+                            return true;
+                        if (cp === 0x1ced)
+                            return true;
+                        if (cp < 0x1cf2)
+                            return false;
+                        if (cp < 0x1cf4)
+                            return true;
+                        if (cp === 0x1cf4)
+                            return true;
+                        if (cp === 0x1cf7)
+                            return true;
+                        return false;
+                    }
+                    if (cp < 0x1cfa)
+                        return true;
+                    if (cp < 0x1dc0)
+                        return false;
+                    if (cp < 0x1dfa)
+                        return true;
+                    if (cp < 0x1dfb)
+                        return false;
+                    if (cp < 0x1e00)
+                        return true;
+                    if (cp < 0x203f)
+                        return false;
+                    if (cp < 0x2041)
+                        return true;
+                    if (cp === 0x2054)
+                        return true;
+                    if (cp < 0x20d0)
+                        return false;
+                    if (cp < 0x20dd)
+                        return true;
+                    if (cp === 0x20e1)
+                        return true;
+                    if (cp < 0x20e5)
+                        return false;
+                    if (cp < 0x20f1)
+                        return true;
+                    if (cp < 0x2cef)
+                        return false;
+                    if (cp < 0x2cf2)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xa69e) {
+                    if (cp === 0x2d7f)
+                        return true;
+                    if (cp < 0x2de0)
+                        return false;
+                    if (cp < 0x2e00)
+                        return true;
+                    if (cp < 0x302a)
+                        return false;
+                    if (cp < 0x302e)
+                        return true;
+                    if (cp < 0x302e)
+                        return false;
+                    if (cp < 0x3030)
+                        return true;
+                    if (cp < 0x3099)
+                        return false;
+                    if (cp < 0x309b)
+                        return true;
+                    if (cp < 0xa620)
+                        return false;
+                    if (cp < 0xa62a)
+                        return true;
+                    if (cp === 0xa66f)
+                        return true;
+                    if (cp < 0xa674)
+                        return false;
+                    if (cp < 0xa67e)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xa6a0)
+                    return true;
+                if (cp < 0xa6f0)
+                    return false;
+                if (cp < 0xa6f2)
+                    return true;
+                if (cp === 0xa802)
+                    return true;
+                if (cp === 0xa806)
+                    return true;
+                if (cp === 0xa80b)
+                    return true;
+                if (cp < 0xa823)
+                    return false;
+                if (cp < 0xa825)
+                    return true;
+                if (cp < 0xa825)
+                    return false;
+                if (cp < 0xa827)
+                    return true;
+                if (cp === 0xa827)
+                    return true;
+                if (cp < 0xa880)
+                    return false;
+                if (cp < 0xa882)
+                    return true;
+                return false;
+            }
+            if (cp < 0xa9d0) {
+                if (cp < 0xa952) {
+                    if (cp < 0xa8b4)
+                        return false;
+                    if (cp < 0xa8c4)
+                        return true;
+                    if (cp < 0xa8c4)
+                        return false;
+                    if (cp < 0xa8c6)
+                        return true;
+                    if (cp < 0xa8d0)
+                        return false;
+                    if (cp < 0xa8da)
+                        return true;
+                    if (cp < 0xa8e0)
+                        return false;
+                    if (cp < 0xa8f2)
+                        return true;
+                    if (cp === 0xa8ff)
+                        return true;
+                    if (cp < 0xa900)
+                        return false;
+                    if (cp < 0xa90a)
+                        return true;
+                    if (cp < 0xa926)
+                        return false;
+                    if (cp < 0xa92e)
+                        return true;
+                    if (cp < 0xa947)
+                        return false;
+                    if (cp < 0xa952)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xa954)
+                    return true;
+                if (cp < 0xa980)
+                    return false;
+                if (cp < 0xa983)
+                    return true;
+                if (cp === 0xa983)
+                    return true;
+                if (cp === 0xa9b3)
+                    return true;
+                if (cp < 0xa9b4)
+                    return false;
+                if (cp < 0xa9b6)
+                    return true;
+                if (cp < 0xa9b6)
+                    return false;
+                if (cp < 0xa9ba)
+                    return true;
+                if (cp < 0xa9ba)
+                    return false;
+                if (cp < 0xa9bc)
+                    return true;
+                if (cp === 0xa9bc)
+                    return true;
+                if (cp < 0xa9bd)
+                    return false;
+                if (cp < 0xa9c1)
+                    return true;
+                return false;
+            }
+            if (cp < 0xaa43) {
+                if (cp < 0xa9d0)
+                    return false;
+                if (cp < 0xa9da)
+                    return true;
+                if (cp === 0xa9e5)
+                    return true;
+                if (cp < 0xa9f0)
+                    return false;
+                if (cp < 0xa9fa)
+                    return true;
+                if (cp < 0xaa29)
+                    return false;
+                if (cp < 0xaa2f)
+                    return true;
+                if (cp < 0xaa2f)
+                    return false;
+                if (cp < 0xaa31)
+                    return true;
+                if (cp < 0xaa31)
+                    return false;
+                if (cp < 0xaa33)
+                    return true;
+                if (cp < 0xaa33)
+                    return false;
+                if (cp < 0xaa35)
+                    return true;
+                if (cp < 0xaa35)
+                    return false;
+                if (cp < 0xaa37)
+                    return true;
+                return false;
+            }
+            if (cp === 0xaa43)
+                return true;
+            if (cp === 0xaa4c)
+                return true;
+            if (cp === 0xaa4d)
+                return true;
+            if (cp < 0xaa50)
+                return false;
+            if (cp < 0xaa5a)
+                return true;
+            if (cp === 0xaa7b)
+                return true;
+            if (cp === 0xaa7c)
+                return true;
+            if (cp === 0xaa7d)
+                return true;
+            if (cp === 0xaab0)
+                return true;
+            if (cp < 0xaab2)
+                return false;
+            if (cp < 0xaab5)
+                return true;
+            return false;
+        }
+        if (cp < 0x10d30) {
+            if (cp < 0xfe00) {
+                if (cp < 0xabe3) {
+                    if (cp < 0xaab7)
+                        return false;
+                    if (cp < 0xaab9)
+                        return true;
+                    if (cp < 0xaabe)
+                        return false;
+                    if (cp < 0xaac0)
+                        return true;
+                    if (cp === 0xaac1)
+                        return true;
+                    if (cp === 0xaaeb)
+                        return true;
+                    if (cp < 0xaaec)
+                        return false;
+                    if (cp < 0xaaee)
+                        return true;
+                    if (cp < 0xaaee)
+                        return false;
+                    if (cp < 0xaaf0)
+                        return true;
+                    if (cp === 0xaaf5)
+                        return true;
+                    if (cp === 0xaaf6)
+                        return true;
+                    return false;
+                }
+                if (cp < 0xabe5)
+                    return true;
+                if (cp === 0xabe5)
+                    return true;
+                if (cp < 0xabe6)
+                    return false;
+                if (cp < 0xabe8)
+                    return true;
+                if (cp === 0xabe8)
+                    return true;
+                if (cp < 0xabe9)
+                    return false;
+                if (cp < 0xabeb)
+                    return true;
+                if (cp === 0xabec)
+                    return true;
+                if (cp === 0xabed)
+                    return true;
+                if (cp < 0xabf0)
+                    return false;
+                if (cp < 0xabfa)
+                    return true;
+                if (cp === 0xfb1e)
+                    return true;
+                return false;
+            }
+            if (cp < 0x10376) {
+                if (cp < 0xfe00)
+                    return false;
+                if (cp < 0xfe10)
+                    return true;
+                if (cp < 0xfe20)
+                    return false;
+                if (cp < 0xfe30)
+                    return true;
+                if (cp < 0xfe33)
+                    return false;
+                if (cp < 0xfe35)
+                    return true;
+                if (cp < 0xfe4d)
+                    return false;
+                if (cp < 0xfe50)
+                    return true;
+                if (cp < 0xff10)
+                    return false;
+                if (cp < 0xff1a)
+                    return true;
+                if (cp === 0xff3f)
+                    return true;
+                if (cp === 0x101fd)
+                    return true;
+                if (cp === 0x102e0)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1037b)
+                return true;
+            if (cp < 0x104a0)
+                return false;
+            if (cp < 0x104aa)
+                return true;
+            if (cp < 0x10a01)
+                return false;
+            if (cp < 0x10a04)
+                return true;
+            if (cp < 0x10a05)
+                return false;
+            if (cp < 0x10a07)
+                return true;
+            if (cp < 0x10a0c)
+                return false;
+            if (cp < 0x10a10)
+                return true;
+            if (cp < 0x10a38)
+                return false;
+            if (cp < 0x10a3b)
+                return true;
+            if (cp === 0x10a3f)
+                return true;
+            if (cp < 0x10ae5)
+                return false;
+            if (cp < 0x10ae7)
+                return true;
+            if (cp < 0x10d24)
+                return false;
+            if (cp < 0x10d28)
+                return true;
+            return false;
+        }
+        if (cp < 0x1112d) {
+            if (cp < 0x11082) {
+                if (cp < 0x10d30)
+                    return false;
+                if (cp < 0x10d3a)
+                    return true;
+                if (cp < 0x10f46)
+                    return false;
+                if (cp < 0x10f51)
+                    return true;
+                if (cp === 0x11000)
+                    return true;
+                if (cp === 0x11001)
+                    return true;
+                if (cp === 0x11002)
+                    return true;
+                if (cp < 0x11038)
+                    return false;
+                if (cp < 0x11047)
+                    return true;
+                if (cp < 0x11066)
+                    return false;
+                if (cp < 0x11070)
+                    return true;
+                if (cp < 0x1107f)
+                    return false;
+                if (cp < 0x11082)
+                    return true;
+                return false;
+            }
+            if (cp === 0x11082)
+                return true;
+            if (cp < 0x110b0)
+                return false;
+            if (cp < 0x110b3)
+                return true;
+            if (cp < 0x110b3)
+                return false;
+            if (cp < 0x110b7)
+                return true;
+            if (cp < 0x110b7)
+                return false;
+            if (cp < 0x110b9)
+                return true;
+            if (cp < 0x110b9)
+                return false;
+            if (cp < 0x110bb)
+                return true;
+            if (cp < 0x110f0)
+                return false;
+            if (cp < 0x110fa)
+                return true;
+            if (cp < 0x11100)
+                return false;
+            if (cp < 0x11103)
+                return true;
+            if (cp < 0x11127)
+                return false;
+            if (cp < 0x1112c)
+                return true;
+            if (cp === 0x1112c)
+                return true;
+            return false;
+        }
+        if (cp < 0x111bf) {
+            if (cp < 0x1112d)
+                return false;
+            if (cp < 0x11135)
+                return true;
+            if (cp < 0x11136)
+                return false;
+            if (cp < 0x11140)
+                return true;
+            if (cp < 0x11145)
+                return false;
+            if (cp < 0x11147)
+                return true;
+            if (cp === 0x11173)
+                return true;
+            if (cp < 0x11180)
+                return false;
+            if (cp < 0x11182)
+                return true;
+            if (cp === 0x11182)
+                return true;
+            if (cp < 0x111b3)
+                return false;
+            if (cp < 0x111b6)
+                return true;
+            if (cp < 0x111b6)
+                return false;
+            if (cp < 0x111bf)
+                return true;
+            return false;
+        }
+        if (cp < 0x111c1)
+            return true;
+        if (cp < 0x111c9)
+            return false;
+        if (cp < 0x111cd)
+            return true;
+        if (cp < 0x111d0)
+            return false;
+        if (cp < 0x111da)
+            return true;
+        if (cp < 0x1122c)
+            return false;
+        if (cp < 0x1122f)
+            return true;
+        if (cp < 0x1122f)
+            return false;
+        if (cp < 0x11232)
+            return true;
+        if (cp < 0x11232)
+            return false;
+        if (cp < 0x11234)
+            return true;
+        if (cp === 0x11234)
+            return true;
+        if (cp === 0x11235)
+            return true;
+        if (cp < 0x11236)
+            return false;
+        if (cp < 0x11238)
+            return true;
+        return false;
+    }
+    if (cp < 0x11a33) {
+        if (cp < 0x115af) {
+            if (cp < 0x11435) {
+                if (cp < 0x1133e) {
+                    if (cp === 0x1123e)
+                        return true;
+                    if (cp === 0x112df)
+                        return true;
+                    if (cp < 0x112e0)
+                        return false;
+                    if (cp < 0x112e3)
+                        return true;
+                    if (cp < 0x112e3)
+                        return false;
+                    if (cp < 0x112eb)
+                        return true;
+                    if (cp < 0x112f0)
+                        return false;
+                    if (cp < 0x112fa)
+                        return true;
+                    if (cp < 0x11300)
+                        return false;
+                    if (cp < 0x11302)
+                        return true;
+                    if (cp < 0x11302)
+                        return false;
+                    if (cp < 0x11304)
+                        return true;
+                    if (cp < 0x1133b)
+                        return false;
+                    if (cp < 0x1133d)
+                        return true;
+                    return false;
+                }
+                if (cp < 0x11340)
+                    return true;
+                if (cp === 0x11340)
+                    return true;
+                if (cp < 0x11341)
+                    return false;
+                if (cp < 0x11345)
+                    return true;
+                if (cp < 0x11347)
+                    return false;
+                if (cp < 0x11349)
+                    return true;
+                if (cp < 0x1134b)
+                    return false;
+                if (cp < 0x1134e)
+                    return true;
+                if (cp === 0x11357)
+                    return true;
+                if (cp < 0x11362)
+                    return false;
+                if (cp < 0x11364)
+                    return true;
+                if (cp < 0x11366)
+                    return false;
+                if (cp < 0x1136d)
+                    return true;
+                if (cp < 0x11370)
+                    return false;
+                if (cp < 0x11375)
+                    return true;
+                return false;
+            }
+            if (cp < 0x114b0) {
+                if (cp < 0x11435)
+                    return false;
+                if (cp < 0x11438)
+                    return true;
+                if (cp < 0x11438)
+                    return false;
+                if (cp < 0x11440)
+                    return true;
+                if (cp < 0x11440)
+                    return false;
+                if (cp < 0x11442)
+                    return true;
+                if (cp < 0x11442)
+                    return false;
+                if (cp < 0x11445)
+                    return true;
+                if (cp === 0x11445)
+                    return true;
+                if (cp === 0x11446)
+                    return true;
+                if (cp < 0x11450)
+                    return false;
+                if (cp < 0x1145a)
+                    return true;
+                if (cp === 0x1145e)
+                    return true;
+                return false;
+            }
+            if (cp < 0x114b3)
+                return true;
+            if (cp < 0x114b3)
+                return false;
+            if (cp < 0x114b9)
+                return true;
+            if (cp === 0x114b9)
+                return true;
+            if (cp === 0x114ba)
+                return true;
+            if (cp < 0x114bb)
+                return false;
+            if (cp < 0x114bf)
+                return true;
+            if (cp < 0x114bf)
+                return false;
+            if (cp < 0x114c1)
+                return true;
+            if (cp === 0x114c1)
+                return true;
+            if (cp < 0x114c2)
+                return false;
+            if (cp < 0x114c4)
+                return true;
+            if (cp < 0x114d0)
+                return false;
+            if (cp < 0x114da)
+                return true;
+            return false;
+        }
+        if (cp < 0x116ae) {
+            if (cp < 0x11633) {
+                if (cp < 0x115af)
+                    return false;
+                if (cp < 0x115b2)
+                    return true;
+                if (cp < 0x115b2)
+                    return false;
+                if (cp < 0x115b6)
+                    return true;
+                if (cp < 0x115b8)
+                    return false;
+                if (cp < 0x115bc)
+                    return true;
+                if (cp < 0x115bc)
+                    return false;
+                if (cp < 0x115be)
+                    return true;
+                if (cp === 0x115be)
+                    return true;
+                if (cp < 0x115bf)
+                    return false;
+                if (cp < 0x115c1)
+                    return true;
+                if (cp < 0x115dc)
+                    return false;
+                if (cp < 0x115de)
+                    return true;
+                if (cp < 0x11630)
+                    return false;
+                if (cp < 0x11633)
+                    return true;
+                return false;
+            }
+            if (cp < 0x1163b)
+                return true;
+            if (cp < 0x1163b)
+                return false;
+            if (cp < 0x1163d)
+                return true;
+            if (cp === 0x1163d)
+                return true;
+            if (cp === 0x1163e)
+                return true;
+            if (cp < 0x1163f)
+                return false;
+            if (cp < 0x11641)
+                return true;
+            if (cp < 0x11650)
+                return false;
+            if (cp < 0x1165a)
+                return true;
+            if (cp === 0x116ab)
+                return true;
+            if (cp === 0x116ac)
+                return true;
+            if (cp === 0x116ad)
+                return true;
+            return false;
+        }
+        if (cp < 0x11726) {
+            if (cp < 0x116ae)
+                return false;
+            if (cp < 0x116b0)
+                return true;
+            if (cp < 0x116b0)
+                return false;
+            if (cp < 0x116b6)
+                return true;
+            if (cp === 0x116b6)
+                return true;
+            if (cp === 0x116b7)
+                return true;
+            if (cp < 0x116c0)
+                return false;
+            if (cp < 0x116ca)
+                return true;
+            if (cp < 0x1171d)
+                return false;
+            if (cp < 0x11720)
+                return true;
+            if (cp < 0x11720)
+                return false;
+            if (cp < 0x11722)
+                return true;
+            if (cp < 0x11722)
+                return false;
+            if (cp < 0x11726)
+                return true;
+            return false;
+        }
+        if (cp === 0x11726)
+            return true;
+        if (cp < 0x11727)
+            return false;
+        if (cp < 0x1172c)
+            return true;
+        if (cp < 0x11730)
+            return false;
+        if (cp < 0x1173a)
+            return true;
+        if (cp < 0x1182c)
+            return false;
+        if (cp < 0x1182f)
+            return true;
+        if (cp < 0x1182f)
+            return false;
+        if (cp < 0x11838)
+            return true;
+        if (cp === 0x11838)
+            return true;
+        if (cp < 0x11839)
+            return false;
+        if (cp < 0x1183b)
+            return true;
+        if (cp < 0x118e0)
+            return false;
+        if (cp < 0x118ea)
+            return true;
+        if (cp < 0x11a01)
+            return false;
+        if (cp < 0x11a0b)
+            return true;
+        return false;
+    }
+    if (cp < 0x11d97) {
+        if (cp < 0x11ca9) {
+            if (cp < 0x11a97) {
+                if (cp < 0x11a33)
+                    return false;
+                if (cp < 0x11a39)
+                    return true;
+                if (cp === 0x11a39)
+                    return true;
+                if (cp < 0x11a3b)
+                    return false;
+                if (cp < 0x11a3f)
+                    return true;
+                if (cp === 0x11a47)
+                    return true;
+                if (cp < 0x11a51)
+                    return false;
+                if (cp < 0x11a57)
+                    return true;
+                if (cp < 0x11a57)
+                    return false;
+                if (cp < 0x11a59)
+                    return true;
+                if (cp < 0x11a59)
+                    return false;
+                if (cp < 0x11a5c)
+                    return true;
+                if (cp < 0x11a8a)
+                    return false;
+                if (cp < 0x11a97)
+                    return true;
+                return false;
+            }
+            if (cp === 0x11a97)
+                return true;
+            if (cp < 0x11a98)
+                return false;
+            if (cp < 0x11a9a)
+                return true;
+            if (cp === 0x11c2f)
+                return true;
+            if (cp < 0x11c30)
+                return false;
+            if (cp < 0x11c37)
+                return true;
+            if (cp < 0x11c38)
+                return false;
+            if (cp < 0x11c3e)
+                return true;
+            if (cp === 0x11c3e)
+                return true;
+            if (cp === 0x11c3f)
+                return true;
+            if (cp < 0x11c50)
+                return false;
+            if (cp < 0x11c5a)
+                return true;
+            if (cp < 0x11c92)
+                return false;
+            if (cp < 0x11ca8)
+                return true;
+            return false;
+        }
+        if (cp < 0x11d3c) {
+            if (cp === 0x11ca9)
+                return true;
+            if (cp < 0x11caa)
+                return false;
+            if (cp < 0x11cb1)
+                return true;
+            if (cp === 0x11cb1)
+                return true;
+            if (cp < 0x11cb2)
+                return false;
+            if (cp < 0x11cb4)
+                return true;
+            if (cp === 0x11cb4)
+                return true;
+            if (cp < 0x11cb5)
+                return false;
+            if (cp < 0x11cb7)
+                return true;
+            if (cp < 0x11d31)
+                return false;
+            if (cp < 0x11d37)
+                return true;
+            if (cp === 0x11d3a)
+                return true;
+            return false;
+        }
+        if (cp < 0x11d3e)
+            return true;
+        if (cp < 0x11d3f)
+            return false;
+        if (cp < 0x11d46)
+            return true;
+        if (cp === 0x11d47)
+            return true;
+        if (cp < 0x11d50)
+            return false;
+        if (cp < 0x11d5a)
+            return true;
+        if (cp < 0x11d8a)
+            return false;
+        if (cp < 0x11d8f)
+            return true;
+        if (cp < 0x11d90)
+            return false;
+        if (cp < 0x11d92)
+            return true;
+        if (cp < 0x11d93)
+            return false;
+        if (cp < 0x11d95)
+            return true;
+        if (cp === 0x11d95)
+            return true;
+        if (cp === 0x11d96)
+            return true;
+        return false;
+    }
+    if (cp < 0x1d242) {
+        if (cp < 0x16f51) {
+            if (cp === 0x11d97)
+                return true;
+            if (cp < 0x11da0)
+                return false;
+            if (cp < 0x11daa)
+                return true;
+            if (cp < 0x11ef3)
+                return false;
+            if (cp < 0x11ef5)
+                return true;
+            if (cp < 0x11ef5)
+                return false;
+            if (cp < 0x11ef7)
+                return true;
+            if (cp < 0x16a60)
+                return false;
+            if (cp < 0x16a6a)
+                return true;
+            if (cp < 0x16af0)
+                return false;
+            if (cp < 0x16af5)
+                return true;
+            if (cp < 0x16b30)
+                return false;
+            if (cp < 0x16b37)
+                return true;
+            if (cp < 0x16b50)
+                return false;
+            if (cp < 0x16b5a)
+                return true;
+            return false;
+        }
+        if (cp < 0x16f7f)
+            return true;
+        if (cp < 0x16f8f)
+            return false;
+        if (cp < 0x16f93)
+            return true;
+        if (cp < 0x1bc9d)
+            return false;
+        if (cp < 0x1bc9f)
+            return true;
+        if (cp < 0x1d165)
+            return false;
+        if (cp < 0x1d167)
+            return true;
+        if (cp < 0x1d167)
+            return false;
+        if (cp < 0x1d16a)
+            return true;
+        if (cp < 0x1d16d)
+            return false;
+        if (cp < 0x1d173)
+            return true;
+        if (cp < 0x1d17b)
+            return false;
+        if (cp < 0x1d183)
+            return true;
+        if (cp < 0x1d185)
+            return false;
+        if (cp < 0x1d18c)
+            return true;
+        if (cp < 0x1d1aa)
+            return false;
+        if (cp < 0x1d1ae)
+            return true;
+        return false;
+    }
+    if (cp < 0x1e000) {
+        if (cp < 0x1d242)
+            return false;
+        if (cp < 0x1d245)
+            return true;
+        if (cp < 0x1d7ce)
+            return false;
+        if (cp < 0x1d800)
+            return true;
+        if (cp < 0x1da00)
+            return false;
+        if (cp < 0x1da37)
+            return true;
+        if (cp < 0x1da3b)
+            return false;
+        if (cp < 0x1da6d)
+            return true;
+        if (cp === 0x1da75)
+            return true;
+        if (cp === 0x1da84)
+            return true;
+        if (cp < 0x1da9b)
+            return false;
+        if (cp < 0x1daa0)
+            return true;
+        if (cp < 0x1daa1)
+            return false;
+        if (cp < 0x1dab0)
+            return true;
+        return false;
+    }
+    if (cp < 0x1e007)
+        return true;
+    if (cp < 0x1e008)
+        return false;
+    if (cp < 0x1e019)
+        return true;
+    if (cp < 0x1e01b)
+        return false;
+    if (cp < 0x1e022)
+        return true;
+    if (cp < 0x1e023)
+        return false;
+    if (cp < 0x1e025)
+        return true;
+    if (cp < 0x1e026)
+        return false;
+    if (cp < 0x1e02b)
+        return true;
+    if (cp < 0x1e8d0)
+        return false;
+    if (cp < 0x1e8d7)
+        return true;
+    if (cp < 0x1e944)
+        return false;
+    if (cp < 0x1e94b)
+        return true;
+    if (cp < 0x1e950)
+        return false;
+    if (cp < 0x1e95a)
+        return true;
+    if (cp < 0xe0100)
+        return false;
+    if (cp < 0xe01f0)
+        return true;
+    return false;
+}
+
+const PropertyData = {
+    $LONE: new Set([
+        "ASCII",
+        "ASCII_Hex_Digit",
+        "AHex",
+        "Alphabetic",
+        "Alpha",
+        "Any",
+        "Assigned",
+        "Bidi_Control",
+        "Bidi_C",
+        "Bidi_Mirrored",
+        "Bidi_M",
+        "Case_Ignorable",
+        "CI",
+        "Cased",
+        "Changes_When_Casefolded",
+        "CWCF",
+        "Changes_When_Casemapped",
+        "CWCM",
+        "Changes_When_Lowercased",
+        "CWL",
+        "Changes_When_NFKC_Casefolded",
+        "CWKCF",
+        "Changes_When_Titlecased",
+        "CWT",
+        "Changes_When_Uppercased",
+        "CWU",
+        "Dash",
+        "Default_Ignorable_Code_Point",
+        "DI",
+        "Deprecated",
+        "Dep",
+        "Diacritic",
+        "Dia",
+        "Emoji",
+        "Emoji_Component",
+        "Emoji_Modifier",
+        "Emoji_Modifier_Base",
+        "Emoji_Presentation",
+        "Extender",
+        "Ext",
+        "Grapheme_Base",
+        "Gr_Base",
+        "Grapheme_Extend",
+        "Gr_Ext",
+        "Hex_Digit",
+        "Hex",
+        "IDS_Binary_Operator",
+        "IDSB",
+        "IDS_Trinary_Operator",
+        "IDST",
+        "ID_Continue",
+        "IDC",
+        "ID_Start",
+        "IDS",
+        "Ideographic",
+        "Ideo",
+        "Join_Control",
+        "Join_C",
+        "Logical_Order_Exception",
+        "LOE",
+        "Lowercase",
+        "Lower",
+        "Math",
+        "Noncharacter_Code_Point",
+        "NChar",
+        "Pattern_Syntax",
+        "Pat_Syn",
+        "Pattern_White_Space",
+        "Pat_WS",
+        "Quotation_Mark",
+        "QMark",
+        "Radical",
+        "Regional_Indicator",
+        "RI",
+        "Sentence_Terminal",
+        "STerm",
+        "Soft_Dotted",
+        "SD",
+        "Terminal_Punctuation",
+        "Term",
+        "Unified_Ideograph",
+        "UIdeo",
+        "Uppercase",
+        "Upper",
+        "Variation_Selector",
+        "VS",
+        "White_Space",
+        "space",
+        "XID_Continue",
+        "XIDC",
+        "XID_Start",
+        "XIDS",
+    ]),
+    General_Category: new Set([
+        "Cased_Letter",
+        "LC",
+        "Close_Punctuation",
+        "Pe",
+        "Connector_Punctuation",
+        "Pc",
+        "Control",
+        "Cc",
+        "cntrl",
+        "Currency_Symbol",
+        "Sc",
+        "Dash_Punctuation",
+        "Pd",
+        "Decimal_Number",
+        "Nd",
+        "digit",
+        "Enclosing_Mark",
+        "Me",
+        "Final_Punctuation",
+        "Pf",
+        "Format",
+        "Cf",
+        "Initial_Punctuation",
+        "Pi",
+        "Letter",
+        "L",
+        "Letter_Number",
+        "Nl",
+        "Line_Separator",
+        "Zl",
+        "Lowercase_Letter",
+        "Ll",
+        "Mark",
+        "M",
+        "Combining_Mark",
+        "Math_Symbol",
+        "Sm",
+        "Modifier_Letter",
+        "Lm",
+        "Modifier_Symbol",
+        "Sk",
+        "Nonspacing_Mark",
+        "Mn",
+        "Number",
+        "N",
+        "Open_Punctuation",
+        "Ps",
+        "Other",
+        "C",
+        "Other_Letter",
+        "Lo",
+        "Other_Number",
+        "No",
+        "Other_Punctuation",
+        "Po",
+        "Other_Symbol",
+        "So",
+        "Paragraph_Separator",
+        "Zp",
+        "Private_Use",
+        "Co",
+        "Punctuation",
+        "P",
+        "punct",
+        "Separator",
+        "Z",
+        "Space_Separator",
+        "Zs",
+        "Spacing_Mark",
+        "Mc",
+        "Surrogate",
+        "Cs",
+        "Symbol",
+        "S",
+        "Titlecase_Letter",
+        "Lt",
+        "Unassigned",
+        "Cn",
+        "Uppercase_Letter",
+        "Lu",
+    ]),
+    Script: new Set([
+        "Adlam",
+        "Adlm",
+        "Ahom",
+        "Anatolian_Hieroglyphs",
+        "Hluw",
+        "Arabic",
+        "Arab",
+        "Armenian",
+        "Armn",
+        "Avestan",
+        "Avst",
+        "Balinese",
+        "Bali",
+        "Bamum",
+        "Bamu",
+        "Bassa_Vah",
+        "Bass",
+        "Batak",
+        "Batk",
+        "Bengali",
+        "Beng",
+        "Bhaiksuki",
+        "Bhks",
+        "Bopomofo",
+        "Bopo",
+        "Brahmi",
+        "Brah",
+        "Braille",
+        "Brai",
+        "Buginese",
+        "Bugi",
+        "Buhid",
+        "Buhd",
+        "Canadian_Aboriginal",
+        "Cans",
+        "Carian",
+        "Cari",
+        "Caucasian_Albanian",
+        "Aghb",
+        "Chakma",
+        "Cakm",
+        "Cham",
+        "Cherokee",
+        "Cher",
+        "Common",
+        "Zyyy",
+        "Coptic",
+        "Copt",
+        "Qaac",
+        "Cuneiform",
+        "Xsux",
+        "Cypriot",
+        "Cprt",
+        "Cyrillic",
+        "Cyrl",
+        "Deseret",
+        "Dsrt",
+        "Devanagari",
+        "Deva",
+        "Duployan",
+        "Dupl",
+        "Egyptian_Hieroglyphs",
+        "Egyp",
+        "Elbasan",
+        "Elba",
+        "Ethiopic",
+        "Ethi",
+        "Georgian",
+        "Geor",
+        "Glagolitic",
+        "Glag",
+        "Gothic",
+        "Goth",
+        "Grantha",
+        "Gran",
+        "Greek",
+        "Grek",
+        "Gujarati",
+        "Gujr",
+        "Gurmukhi",
+        "Guru",
+        "Han",
+        "Hani",
+        "Hangul",
+        "Hang",
+        "Hanunoo",
+        "Hano",
+        "Hatran",
+        "Hatr",
+        "Hebrew",
+        "Hebr",
+        "Hiragana",
+        "Hira",
+        "Imperial_Aramaic",
+        "Armi",
+        "Inherited",
+        "Zinh",
+        "Qaai",
+        "Inscriptional_Pahlavi",
+        "Phli",
+        "Inscriptional_Parthian",
+        "Prti",
+        "Javanese",
+        "Java",
+        "Kaithi",
+        "Kthi",
+        "Kannada",
+        "Knda",
+        "Katakana",
+        "Kana",
+        "Kayah_Li",
+        "Kali",
+        "Kharoshthi",
+        "Khar",
+        "Khmer",
+        "Khmr",
+        "Khojki",
+        "Khoj",
+        "Khudawadi",
+        "Sind",
+        "Lao",
+        "Laoo",
+        "Latin",
+        "Latn",
+        "Lepcha",
+        "Lepc",
+        "Limbu",
+        "Limb",
+        "Linear_A",
+        "Lina",
+        "Linear_B",
+        "Linb",
+        "Lisu",
+        "Lycian",
+        "Lyci",
+        "Lydian",
+        "Lydi",
+        "Mahajani",
+        "Mahj",
+        "Malayalam",
+        "Mlym",
+        "Mandaic",
+        "Mand",
+        "Manichaean",
+        "Mani",
+        "Marchen",
+        "Marc",
+        "Masaram_Gondi",
+        "Gonm",
+        "Meetei_Mayek",
+        "Mtei",
+        "Mende_Kikakui",
+        "Mend",
+        "Meroitic_Cursive",
+        "Merc",
+        "Meroitic_Hieroglyphs",
+        "Mero",
+        "Miao",
+        "Plrd",
+        "Modi",
+        "Mongolian",
+        "Mong",
+        "Mro",
+        "Mroo",
+        "Multani",
+        "Mult",
+        "Myanmar",
+        "Mymr",
+        "Nabataean",
+        "Nbat",
+        "New_Tai_Lue",
+        "Talu",
+        "Newa",
+        "Nko",
+        "Nkoo",
+        "Nushu",
+        "Nshu",
+        "Ogham",
+        "Ogam",
+        "Ol_Chiki",
+        "Olck",
+        "Old_Hungarian",
+        "Hung",
+        "Old_Italic",
+        "Ital",
+        "Old_North_Arabian",
+        "Narb",
+        "Old_Permic",
+        "Perm",
+        "Old_Persian",
+        "Xpeo",
+        "Old_South_Arabian",
+        "Sarb",
+        "Old_Turkic",
+        "Orkh",
+        "Oriya",
+        "Orya",
+        "Osage",
+        "Osge",
+        "Osmanya",
+        "Osma",
+        "Pahawh_Hmong",
+        "Hmng",
+        "Palmyrene",
+        "Palm",
+        "Pau_Cin_Hau",
+        "Pauc",
+        "Phags_Pa",
+        "Phag",
+        "Phoenician",
+        "Phnx",
+        "Psalter_Pahlavi",
+        "Phlp",
+        "Rejang",
+        "Rjng",
+        "Runic",
+        "Runr",
+        "Samaritan",
+        "Samr",
+        "Saurashtra",
+        "Saur",
+        "Sharada",
+        "Shrd",
+        "Shavian",
+        "Shaw",
+        "Siddham",
+        "Sidd",
+        "SignWriting",
+        "Sgnw",
+        "Sinhala",
+        "Sinh",
+        "Sora_Sompeng",
+        "Sora",
+        "Soyombo",
+        "Soyo",
+        "Sundanese",
+        "Sund",
+        "Syloti_Nagri",
+        "Sylo",
+        "Syriac",
+        "Syrc",
+        "Tagalog",
+        "Tglg",
+        "Tagbanwa",
+        "Tagb",
+        "Tai_Le",
+        "Tale",
+        "Tai_Tham",
+        "Lana",
+        "Tai_Viet",
+        "Tavt",
+        "Takri",
+        "Takr",
+        "Tamil",
+        "Taml",
+        "Tangut",
+        "Tang",
+        "Telugu",
+        "Telu",
+        "Thaana",
+        "Thaa",
+        "Thai",
+        "Tibetan",
+        "Tibt",
+        "Tifinagh",
+        "Tfng",
+        "Tirhuta",
+        "Tirh",
+        "Ugaritic",
+        "Ugar",
+        "Vai",
+        "Vaii",
+        "Warang_Citi",
+        "Wara",
+        "Yi",
+        "Yiii",
+        "Zanabazar_Square",
+        "Zanb",
+    ]),
+};
+PropertyData.gc = PropertyData.General_Category;
+PropertyData.sc = PropertyData.Script_Extensions = PropertyData.scx =
+    PropertyData.Script;
+
+const Backspace = 0x08;
+const CharacterTabulation = 0x09;
+const LineFeed = 0x0a;
+const LineTabulation = 0x0b;
+const FormFeed = 0x0c;
+const CarriageReturn = 0x0d;
+const ExclamationMark = 0x21;
+const DollarSign = 0x24;
+const LeftParenthesis = 0x28;
+const RightParenthesis = 0x29;
+const Asterisk = 0x2a;
+const PlusSign = 0x2b;
+const Comma = 0x2c;
+const HyphenMinus = 0x2d;
+const FullStop = 0x2e;
+const Solidus = 0x2f;
+const DigitZero = 0x30;
+const DigitOne = 0x31;
+const DigitSeven = 0x37;
+const DigitNine = 0x39;
+const Colon = 0x3a;
+const LessThanSign = 0x3c;
+const EqualsSign = 0x3d;
+const GreaterThanSign = 0x3e;
+const QuestionMark = 0x3f;
+const LatinCapitalLetterA = 0x41;
+const LatinCapitalLetterB = 0x42;
+const LatinCapitalLetterD = 0x44;
+const LatinCapitalLetterF = 0x46;
+const LatinCapitalLetterP = 0x50;
+const LatinCapitalLetterS = 0x53;
+const LatinCapitalLetterW = 0x57;
+const LatinCapitalLetterZ = 0x5a;
+const LowLine = 0x5f;
+const LatinSmallLetterA = 0x61;
+const LatinSmallLetterB = 0x62;
+const LatinSmallLetterC = 0x63;
+const LatinSmallLetterD = 0x64;
+const LatinSmallLetterF = 0x66;
+const LatinSmallLetterG = 0x67;
+const LatinSmallLetterI = 0x69;
+const LatinSmallLetterK = 0x6b;
+const LatinSmallLetterM = 0x6d;
+const LatinSmallLetterN = 0x6e;
+const LatinSmallLetterP = 0x70;
+const LatinSmallLetterR = 0x72;
+const LatinSmallLetterS = 0x73;
+const LatinSmallLetterT = 0x74;
+const LatinSmallLetterU = 0x75;
+const LatinSmallLetterV = 0x76;
+const LatinSmallLetterW = 0x77;
+const LatinSmallLetterX = 0x78;
+const LatinSmallLetterY = 0x79;
+const LatinSmallLetterZ = 0x7a;
+const LeftSquareBracket = 0x5b;
+const ReverseSolidus = 0x5c;
+const RightSquareBracket = 0x5d;
+const CircumflexAccent = 0x5e;
+const LeftCurlyBracket = 0x7b;
+const VerticalLine = 0x7c;
+const RightCurlyBracket = 0x7d;
+const ZeroWidthNonJoiner = 0x200c;
+const ZeroWidthJoiner = 0x200d;
+const LineSeparator = 0x2028;
+const ParagraphSeparator = 0x2029;
+const MinCodePoint = 0x00;
+const MaxCodePoint = 0x10ffff;
+function isLatinLetter(code) {
+    return ((code >= LatinCapitalLetterA && code <= LatinCapitalLetterZ) ||
+        (code >= LatinSmallLetterA && code <= LatinSmallLetterZ));
+}
+function isDecimalDigit(code) {
+    return code >= DigitZero && code <= DigitNine;
+}
+function isOctalDigit(code) {
+    return code >= DigitZero && code <= DigitSeven;
+}
+function isHexDigit(code) {
+    return ((code >= DigitZero && code <= DigitNine) ||
+        (code >= LatinCapitalLetterA && code <= LatinCapitalLetterF) ||
+        (code >= LatinSmallLetterA && code <= LatinSmallLetterF));
+}
+function isLineTerminator(code) {
+    return (code === LineFeed ||
+        code === CarriageReturn ||
+        code === LineSeparator ||
+        code === ParagraphSeparator);
+}
+function isValidUnicode(code) {
+    return code >= MinCodePoint && code <= MaxCodePoint;
+}
+function digitToInt(code) {
+    if (code >= LatinSmallLetterA && code <= LatinSmallLetterF) {
+        return code - LatinSmallLetterA + 10;
+    }
+    if (code >= LatinCapitalLetterA && code <= LatinCapitalLetterF) {
+        return code - LatinCapitalLetterA + 10;
+    }
+    return code - DigitZero;
+}
+
+const legacyImpl = {
+    at(s, end, i) {
+        return i < end ? s.charCodeAt(i) : -1;
+    },
+    width(c) {
+        return 1;
+    },
+};
+const unicodeImpl = {
+    at(s, end, i) {
+        return i < end ? s.codePointAt(i) : -1;
+    },
+    width(c) {
+        return c > 0xffff ? 2 : 1;
+    },
+};
+class Reader {
+    constructor() {
+        this._impl = legacyImpl;
+        this._s = "";
+        this._i = 0;
+        this._end = 0;
+        this._cp1 = -1;
+        this._w1 = 1;
+        this._cp2 = -1;
+        this._w2 = 1;
+        this._cp3 = -1;
+        this._w3 = 1;
+        this._cp4 = -1;
+    }
+    get source() {
+        return this._s;
+    }
+    get index() {
+        return this._i;
+    }
+    get currentCodePoint() {
+        return this._cp1;
+    }
+    get nextCodePoint() {
+        return this._cp2;
+    }
+    get nextCodePoint2() {
+        return this._cp3;
+    }
+    get nextCodePoint3() {
+        return this._cp4;
+    }
+    reset(source, start, end, uFlag) {
+        this._impl = uFlag ? unicodeImpl : legacyImpl;
+        this._s = source;
+        this._end = end;
+        this.rewind(start);
+    }
+    rewind(index) {
+        const impl = this._impl;
+        this._i = index;
+        this._cp1 = impl.at(this._s, this._end, index);
+        this._w1 = impl.width(this._cp1);
+        this._cp2 = impl.at(this._s, this._end, index + this._w1);
+        this._w2 = impl.width(this._cp2);
+        this._cp3 = impl.at(this._s, this._end, index + this._w1 + this._w2);
+        this._w3 = impl.width(this._cp3);
+        this._cp4 = impl.at(this._s, this._end, index + this._w1 + this._w2 + this._w3);
+    }
+    advance() {
+        if (this._cp1 !== -1) {
+            const impl = this._impl;
+            this._i += this._w1;
+            this._cp1 = this._cp2;
+            this._w1 = this._w2;
+            this._cp2 = this._cp3;
+            this._w2 = impl.width(this._cp2);
+            this._cp3 = this._cp4;
+            this._w3 = impl.width(this._cp3);
+            this._cp4 = impl.at(this._s, this._end, this._i + this._w1 + this._w2 + this._w3);
+        }
+    }
+    eat(cp) {
+        if (this._cp1 === cp) {
+            this.advance();
+            return true;
+        }
+        return false;
+    }
+    eat2(cp1, cp2) {
+        if (this._cp1 === cp1 && this._cp2 === cp2) {
+            this.advance();
+            this.advance();
+            return true;
+        }
+        return false;
+    }
+    eat3(cp1, cp2, cp3) {
+        if (this._cp1 === cp1 && this._cp2 === cp2 && this._cp3 === cp3) {
+            this.advance();
+            this.advance();
+            this.advance();
+            return true;
+        }
+        return false;
+    }
+}
+
+class RegExpSyntaxError extends SyntaxError {
+    constructor(source, uFlag, index, message) {
+        if (source) {
+            if (source[0] !== "/") {
+                source = `/${source}/${uFlag ? "u" : ""}`;
+            }
+            source = `: ${source}`;
+        }
+        super(`Invalid regular expression${source}: ${message}`);
+        this.index = index;
+    }
+}
+
+function isSyntaxCharacter(cp) {
+    return (cp === CircumflexAccent ||
+        cp === DollarSign ||
+        cp === ReverseSolidus ||
+        cp === FullStop ||
+        cp === Asterisk ||
+        cp === PlusSign ||
+        cp === QuestionMark ||
+        cp === LeftParenthesis ||
+        cp === RightParenthesis ||
+        cp === LeftSquareBracket ||
+        cp === RightSquareBracket ||
+        cp === LeftCurlyBracket ||
+        cp === RightCurlyBracket ||
+        cp === VerticalLine);
+}
+function isRegExpIdentifierStart(cp) {
+    return isIdStart(cp) || cp === DollarSign || cp === LowLine;
+}
+function isRegExpIdentifierPart(cp) {
+    return (isIdContinue(cp) ||
+        cp === DollarSign ||
+        cp === LowLine ||
+        cp === ZeroWidthNonJoiner ||
+        cp === ZeroWidthJoiner);
+}
+function isUnicodePropertyNameCharacter(cp) {
+    return isLatinLetter(cp) || cp === LowLine;
+}
+function isUnicodePropertyValueCharacter(cp) {
+    return isUnicodePropertyNameCharacter(cp) || isDecimalDigit(cp);
+}
+function isValidUnicodeProperty(name, value) {
+    return PropertyData.hasOwnProperty(name) && PropertyData[name].has(value);
+}
+function isValidUnicodePropertyName(name) {
+    return PropertyData.$LONE.has(name);
+}
+class RegExpValidator {
+    constructor(options) {
+        this._reader = new Reader();
+        this._uFlag = false;
+        this._nFlag = false;
+        this._lastIntValue = 0;
+        this._lastMinValue = 0;
+        this._lastMaxValue = 0;
+        this._lastStrValue = "";
+        this._lastKeyValue = "";
+        this._lastValValue = "";
+        this._lastAssertionIsQuantifiable = false;
+        this._numCapturingParens = 0;
+        this._groupNames = new Set();
+        this._backreferenceNames = new Set();
+        this._options = options || {};
+    }
+    validateLiteral(source, start = 0, end = source.length) {
+        this._uFlag = this._nFlag = false;
+        this.reset(source, start, end);
+        this.onLiteralEnter(start);
+        if (this.eat(Solidus) && this.eatRegExpBody() && this.eat(Solidus)) {
+            const flagStart = this.index;
+            const uFlag = source.indexOf("u", flagStart) !== -1;
+            this.validateFlags(source, flagStart, end);
+            this.validatePattern(source, start + 1, flagStart - 1, uFlag);
+        }
+        else if (start >= end) {
+            this.raise("Empty");
+        }
+        else {
+            const c = String.fromCodePoint(this.currentCodePoint);
+            this.raise(`Unexpected character '${c}'`);
+        }
+        this.onLiteralLeave(start, end);
+    }
+    validateFlags(source, start = 0, end = source.length) {
+        const existingFlags = new Set();
+        let global = false;
+        let ignoreCase = false;
+        let multiline = false;
+        let sticky = false;
+        let unicode = false;
+        let dotAll = false;
+        for (let i = start; i < end; ++i) {
+            const flag = source.charCodeAt(i);
+            if (existingFlags.has(flag)) {
+                this.raise(`Duplicated flag '${source[i]}'`);
+            }
+            existingFlags.add(flag);
+            if (flag === LatinSmallLetterG) {
+                global = true;
+            }
+            else if (flag === LatinSmallLetterI) {
+                ignoreCase = true;
+            }
+            else if (flag === LatinSmallLetterM) {
+                multiline = true;
+            }
+            else if (flag === LatinSmallLetterU && this.ecmaVersion >= 2015) {
+                unicode = true;
+            }
+            else if (flag === LatinSmallLetterY && this.ecmaVersion >= 2015) {
+                sticky = true;
+            }
+            else if (flag === LatinSmallLetterS && this.ecmaVersion >= 2018) {
+                dotAll = true;
+            }
+            else {
+                this.raise(`Invalid flag '${source[i]}'`);
+            }
+        }
+        this.onFlags(start, end, global, ignoreCase, multiline, unicode, sticky, dotAll);
+    }
+    validatePattern(source, start = 0, end = source.length, uFlag = false) {
+        this._uFlag = uFlag && this.ecmaVersion >= 2015;
+        this._nFlag = uFlag && this.ecmaVersion >= 2018;
+        this.reset(source, start, end);
+        this.pattern();
+        if (!this._nFlag &&
+            this.ecmaVersion >= 2018 &&
+            this._groupNames.size > 0) {
+            this._nFlag = true;
+            this.rewind(start);
+            this.pattern();
+        }
+    }
+    get strict() {
+        return Boolean(this._options.strict || this._uFlag);
+    }
+    get ecmaVersion() {
+        return this._options.ecmaVersion || 2018;
+    }
+    onLiteralEnter(start) {
+        if (this._options.onLiteralEnter) {
+            this._options.onLiteralEnter(start);
+        }
+    }
+    onLiteralLeave(start, end) {
+        if (this._options.onLiteralLeave) {
+            this._options.onLiteralLeave(start, end);
+        }
+    }
+    onFlags(start, end, global, ignoreCase, multiline, unicode, sticky, dotAll) {
+        if (this._options.onFlags) {
+            this._options.onFlags(start, end, global, ignoreCase, multiline, unicode, sticky, dotAll);
+        }
+    }
+    onPatternEnter(start) {
+        if (this._options.onPatternEnter) {
+            this._options.onPatternEnter(start);
+        }
+    }
+    onPatternLeave(start, end) {
+        if (this._options.onPatternLeave) {
+            this._options.onPatternLeave(start, end);
+        }
+    }
+    onDisjunctionEnter(start) {
+        if (this._options.onDisjunctionEnter) {
+            this._options.onDisjunctionEnter(start);
+        }
+    }
+    onDisjunctionLeave(start, end) {
+        if (this._options.onDisjunctionLeave) {
+            this._options.onDisjunctionLeave(start, end);
+        }
+    }
+    onAlternativeEnter(start, index) {
+        if (this._options.onAlternativeEnter) {
+            this._options.onAlternativeEnter(start, index);
+        }
+    }
+    onAlternativeLeave(start, end, index) {
+        if (this._options.onAlternativeLeave) {
+            this._options.onAlternativeLeave(start, end, index);
+        }
+    }
+    onGroupEnter(start) {
+        if (this._options.onGroupEnter) {
+            this._options.onGroupEnter(start);
+        }
+    }
+    onGroupLeave(start, end) {
+        if (this._options.onGroupLeave) {
+            this._options.onGroupLeave(start, end);
+        }
+    }
+    onCapturingGroupEnter(start, name) {
+        if (this._options.onCapturingGroupEnter) {
+            this._options.onCapturingGroupEnter(start, name);
+        }
+    }
+    onCapturingGroupLeave(start, end, name) {
+        if (this._options.onCapturingGroupLeave) {
+            this._options.onCapturingGroupLeave(start, end, name);
+        }
+    }
+    onQuantifier(start, end, min, max, greedy) {
+        if (this._options.onQuantifier) {
+            this._options.onQuantifier(start, end, min, max, greedy);
+        }
+    }
+    onLookaroundAssertionEnter(start, kind, negate) {
+        if (this._options.onLookaroundAssertionEnter) {
+            this._options.onLookaroundAssertionEnter(start, kind, negate);
+        }
+    }
+    onLookaroundAssertionLeave(start, end, kind, negate) {
+        if (this._options.onLookaroundAssertionLeave) {
+            this._options.onLookaroundAssertionLeave(start, end, kind, negate);
+        }
+    }
+    onEdgeAssertion(start, end, kind) {
+        if (this._options.onEdgeAssertion) {
+            this._options.onEdgeAssertion(start, end, kind);
+        }
+    }
+    onWordBoundaryAssertion(start, end, kind, negate) {
+        if (this._options.onWordBoundaryAssertion) {
+            this._options.onWordBoundaryAssertion(start, end, kind, negate);
+        }
+    }
+    onAnyCharacterSet(start, end, kind) {
+        if (this._options.onAnyCharacterSet) {
+            this._options.onAnyCharacterSet(start, end, kind);
+        }
+    }
+    onEscapeCharacterSet(start, end, kind, negate) {
+        if (this._options.onEscapeCharacterSet) {
+            this._options.onEscapeCharacterSet(start, end, kind, negate);
+        }
+    }
+    onUnicodePropertyCharacterSet(start, end, kind, key, value, negate) {
+        if (this._options.onUnicodePropertyCharacterSet) {
+            this._options.onUnicodePropertyCharacterSet(start, end, kind, key, value, negate);
+        }
+    }
+    onCharacter(start, end, value) {
+        if (this._options.onCharacter) {
+            this._options.onCharacter(start, end, value);
+        }
+    }
+    onBackreference(start, end, ref) {
+        if (this._options.onBackreference) {
+            this._options.onBackreference(start, end, ref);
+        }
+    }
+    onCharacterClassEnter(start, negate) {
+        if (this._options.onCharacterClassEnter) {
+            this._options.onCharacterClassEnter(start, negate);
+        }
+    }
+    onCharacterClassLeave(start, end, negate) {
+        if (this._options.onCharacterClassLeave) {
+            this._options.onCharacterClassLeave(start, end, negate);
+        }
+    }
+    onCharacterClassRange(start, end, min, max) {
+        if (this._options.onCharacterClassRange) {
+            this._options.onCharacterClassRange(start, end, min, max);
+        }
+    }
+    get source() {
+        return this._reader.source;
+    }
+    get index() {
+        return this._reader.index;
+    }
+    get currentCodePoint() {
+        return this._reader.currentCodePoint;
+    }
+    get nextCodePoint() {
+        return this._reader.nextCodePoint;
+    }
+    get nextCodePoint2() {
+        return this._reader.nextCodePoint2;
+    }
+    get nextCodePoint3() {
+        return this._reader.nextCodePoint3;
+    }
+    reset(source, start, end) {
+        this._reader.reset(source, start, end, this._uFlag);
+    }
+    rewind(index) {
+        this._reader.rewind(index);
+    }
+    advance() {
+        this._reader.advance();
+    }
+    eat(cp) {
+        return this._reader.eat(cp);
+    }
+    eat2(cp1, cp2) {
+        return this._reader.eat2(cp1, cp2);
+    }
+    eat3(cp1, cp2, cp3) {
+        return this._reader.eat3(cp1, cp2, cp3);
+    }
+    raise(message) {
+        throw new RegExpSyntaxError(this.source, this._uFlag, this.index, message);
+    }
+    eatRegExpBody() {
+        const start = this.index;
+        let inClass = false;
+        let escaped = false;
+        for (;;) {
+            const cp = this.currentCodePoint;
+            if (cp === -1 || isLineTerminator(cp)) {
+                const kind = inClass ? "character class" : "regular expression";
+                this.raise(`Unterminated ${kind}`);
+            }
+            if (escaped) {
+                escaped = false;
+            }
+            else if (cp === ReverseSolidus) {
+                escaped = true;
+            }
+            else if (cp === LeftSquareBracket) {
+                inClass = true;
+            }
+            else if (cp === RightSquareBracket) {
+                inClass = false;
+            }
+            else if ((cp === Solidus && !inClass) ||
+                (cp === Asterisk && this.index === start)) {
+                break;
+            }
+            this.advance();
+        }
+        return this.index !== start;
+    }
+    pattern() {
+        const start = this.index;
+        this._numCapturingParens = this.countCapturingParens();
+        this._groupNames.clear();
+        this._backreferenceNames.clear();
+        this.onPatternEnter(start);
+        this.disjunction();
+        const cp = this.currentCodePoint;
+        if (this.currentCodePoint !== -1) {
+            if (cp === RightParenthesis) {
+                this.raise("Unmatched ')'");
+            }
+            if (cp === ReverseSolidus) {
+                this.raise("\\ at end of pattern");
+            }
+            if (cp === RightSquareBracket || cp === RightCurlyBracket) {
+                this.raise("Lone quantifier brackets");
+            }
+            const c = String.fromCodePoint(cp);
+            this.raise(`Unexpected character '${c}'`);
+        }
+        for (const name of this._backreferenceNames) {
+            if (!this._groupNames.has(name)) {
+                this.raise("Invalid named capture referenced");
+            }
+        }
+        this.onPatternLeave(start, this.index);
+    }
+    countCapturingParens() {
+        const start = this.index;
+        let inClass = false;
+        let escaped = false;
+        let count = 0;
+        let cp = 0;
+        while ((cp = this.currentCodePoint) !== -1) {
+            if (escaped) {
+                escaped = false;
+            }
+            else if (cp === ReverseSolidus) {
+                escaped = true;
+            }
+            else if (cp === LeftSquareBracket) {
+                inClass = true;
+            }
+            else if (cp === RightSquareBracket) {
+                inClass = false;
+            }
+            else if (cp === LeftParenthesis &&
+                !inClass &&
+                (this.nextCodePoint !== QuestionMark ||
+                    (this.nextCodePoint2 === LessThanSign &&
+                        this.nextCodePoint3 !== EqualsSign &&
+                        this.nextCodePoint3 !== ExclamationMark))) {
+                count += 1;
+            }
+            this.advance();
+        }
+        this.rewind(start);
+        return count;
+    }
+    disjunction() {
+        const start = this.index;
+        let i = 0;
+        this.onDisjunctionEnter(start);
+        this.alternative(i++);
+        while (this.eat(VerticalLine)) {
+            this.alternative(i++);
+        }
+        if (this.eatQuantifier(true)) {
+            this.raise("Nothing to repeat");
+        }
+        if (this.eat(LeftCurlyBracket)) {
+            this.raise("Lone quantifier brackets");
+        }
+        this.onDisjunctionLeave(start, this.index);
+    }
+    alternative(i) {
+        const start = this.index;
+        this.onAlternativeEnter(start, i);
+        while (this.currentCodePoint !== -1 && this.eatTerm()) {
+        }
+        this.onAlternativeLeave(start, this.index, i);
+    }
+    eatTerm() {
+        if (this.eatAssertion()) {
+            if (this._lastAssertionIsQuantifiable) {
+                this.eatQuantifier();
+            }
+            return true;
+        }
+        if (this.strict ? this.eatAtom() : this.eatExtendedAtom()) {
+            this.eatQuantifier();
+            return true;
+        }
+        return false;
+    }
+    eatAssertion() {
+        const start = this.index;
+        this._lastAssertionIsQuantifiable = false;
+        if (this.eat(CircumflexAccent)) {
+            this.onEdgeAssertion(start, this.index, "start");
+            return true;
+        }
+        if (this.eat(DollarSign)) {
+            this.onEdgeAssertion(start, this.index, "end");
+            return true;
+        }
+        if (this.eat2(ReverseSolidus, LatinCapitalLetterB)) {
+            this.onWordBoundaryAssertion(start, this.index, "word", true);
+            return true;
+        }
+        if (this.eat2(ReverseSolidus, LatinSmallLetterB)) {
+            this.onWordBoundaryAssertion(start, this.index, "word", false);
+            return true;
+        }
+        if (this.eat2(LeftParenthesis, QuestionMark)) {
+            const lookbehind = this.ecmaVersion >= 2018 && this.eat(LessThanSign);
+            let negate = false;
+            if (this.eat(EqualsSign) || (negate = this.eat(ExclamationMark))) {
+                const kind = lookbehind ? "lookbehind" : "lookahead";
+                this.onLookaroundAssertionEnter(start, kind, negate);
+                this.disjunction();
+                if (!this.eat(RightParenthesis)) {
+                    this.raise("Unterminated group");
+                }
+                this._lastAssertionIsQuantifiable = !lookbehind && !this.strict;
+                this.onLookaroundAssertionLeave(start, this.index, kind, negate);
+                return true;
+            }
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatQuantifier(noError = false) {
+        const start = this.index;
+        let min = 0;
+        let max = 0;
+        let greedy = false;
+        if (this.eat(Asterisk)) {
+            min = 0;
+            max = Number.POSITIVE_INFINITY;
+        }
+        else if (this.eat(PlusSign)) {
+            min = 1;
+            max = Number.POSITIVE_INFINITY;
+        }
+        else if (this.eat(QuestionMark)) {
+            min = 0;
+            max = 1;
+        }
+        else if (this.eatBracedQuantifier(noError)) {
+            min = this._lastMinValue;
+            max = this._lastMaxValue;
+        }
+        else {
+            return false;
+        }
+        greedy = !this.eat(QuestionMark);
+        if (!noError) {
+            this.onQuantifier(start, this.index, min, max, greedy);
+        }
+        return true;
+    }
+    eatBracedQuantifier(noError) {
+        const start = this.index;
+        if (this.eat(LeftCurlyBracket)) {
+            this._lastMinValue = 0;
+            this._lastMaxValue = Number.POSITIVE_INFINITY;
+            if (this.eatDecimalDigits()) {
+                this._lastMinValue = this._lastMaxValue = this._lastIntValue;
+                if (this.eat(Comma)) {
+                    this._lastMaxValue = this.eatDecimalDigits()
+                        ? this._lastIntValue
+                        : Number.POSITIVE_INFINITY;
+                }
+                if (this.eat(RightCurlyBracket)) {
+                    if (!noError && this._lastMaxValue < this._lastMinValue) {
+                        this.raise("numbers out of order in {} quantifier");
+                    }
+                    return true;
+                }
+            }
+            if (!noError && this.strict) {
+                this.raise("Incomplete quantifier");
+            }
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatAtom() {
+        return (this.eatPatternCharacter() ||
+            this.eatDot() ||
+            this.eatReverseSolidusAtomEscape() ||
+            this.eatCharacterClass() ||
+            this.eatUncapturingGroup() ||
+            this.eatCapturingGroup());
+    }
+    eatDot() {
+        if (this.eat(FullStop)) {
+            this.onAnyCharacterSet(this.index - 1, this.index, "any");
+            return true;
+        }
+        return false;
+    }
+    eatReverseSolidusAtomEscape() {
+        const start = this.index;
+        if (this.eat(ReverseSolidus)) {
+            if (this.eatAtomEscape()) {
+                return true;
+            }
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatUncapturingGroup() {
+        const start = this.index;
+        if (this.eat3(LeftParenthesis, QuestionMark, Colon)) {
+            this.onGroupEnter(start);
+            this.disjunction();
+            if (!this.eat(RightParenthesis)) {
+                this.raise("Unterminated group");
+            }
+            this.onGroupLeave(start, this.index);
+            return true;
+        }
+        return false;
+    }
+    eatCapturingGroup() {
+        const start = this.index;
+        if (this.eat(LeftParenthesis)) {
+            this._lastStrValue = "";
+            if (this.ecmaVersion >= 2018) {
+                this.groupSpecifier();
+            }
+            else if (this.currentCodePoint === QuestionMark) {
+                this.raise("Invalid group");
+            }
+            const name = this._lastStrValue || null;
+            this.onCapturingGroupEnter(start, name);
+            this.disjunction();
+            if (!this.eat(RightParenthesis)) {
+                this.raise("Unterminated group");
+            }
+            this.onCapturingGroupLeave(start, this.index, name);
+            return true;
+        }
+        return false;
+    }
+    eatExtendedAtom() {
+        return (this.eatDot() ||
+            this.eatReverseSolidusAtomEscape() ||
+            this.eatReverseSolidusFollowedByC() ||
+            this.eatCharacterClass() ||
+            this.eatUncapturingGroup() ||
+            this.eatCapturingGroup() ||
+            this.eatInvalidBracedQuantifier() ||
+            this.eatExtendedPatternCharacter());
+    }
+    eatReverseSolidusFollowedByC() {
+        if (this.currentCodePoint === ReverseSolidus &&
+            this.nextCodePoint === LatinSmallLetterC) {
+            this._lastIntValue = this.currentCodePoint;
+            this.advance();
+            this.onCharacter(this.index - 1, this.index, ReverseSolidus);
+            return true;
+        }
+        return false;
+    }
+    eatInvalidBracedQuantifier() {
+        if (this.eatBracedQuantifier(true)) {
+            this.raise("Nothing to repeat");
+        }
+        return false;
+    }
+    eatSyntaxCharacter() {
+        if (isSyntaxCharacter(this.currentCodePoint)) {
+            this._lastIntValue = this.currentCodePoint;
+            this.advance();
+            return true;
+        }
+        return false;
+    }
+    eatPatternCharacter() {
+        const start = this.index;
+        const cp = this.currentCodePoint;
+        if (cp !== -1 && !isSyntaxCharacter(cp)) {
+            this.advance();
+            this.onCharacter(start, this.index, cp);
+            return true;
+        }
+        return false;
+    }
+    eatExtendedPatternCharacter() {
+        const start = this.index;
+        const cp = this.currentCodePoint;
+        if (cp !== -1 &&
+            cp !== CircumflexAccent &&
+            cp !== DollarSign &&
+            cp !== ReverseSolidus &&
+            cp !== FullStop &&
+            cp !== Asterisk &&
+            cp !== PlusSign &&
+            cp !== QuestionMark &&
+            cp !== LeftParenthesis &&
+            cp !== RightParenthesis &&
+            cp !== LeftSquareBracket &&
+            cp !== VerticalLine) {
+            this.advance();
+            this.onCharacter(start, this.index, cp);
+            return true;
+        }
+        return false;
+    }
+    groupSpecifier() {
+        this._lastStrValue = "";
+        if (this.eat(QuestionMark)) {
+            if (this.eatGroupName()) {
+                if (!this._groupNames.has(this._lastStrValue)) {
+                    this._groupNames.add(this._lastStrValue);
+                    return;
+                }
+                this.raise("Duplicate capture group name");
+            }
+            this.raise("Invalid group");
+        }
+    }
+    eatGroupName() {
+        this._lastStrValue = "";
+        if (this.eat(LessThanSign)) {
+            if (this.eatRegExpIdentifierName() && this.eat(GreaterThanSign)) {
+                return true;
+            }
+            this.raise("Invalid capture group name");
+        }
+        return false;
+    }
+    eatRegExpIdentifierName() {
+        this._lastStrValue = "";
+        if (this.eatRegExpIdentifierStart()) {
+            this._lastStrValue += String.fromCodePoint(this._lastIntValue);
+            while (this.eatRegExpIdentifierPart()) {
+                this._lastStrValue += String.fromCodePoint(this._lastIntValue);
+            }
+            return true;
+        }
+        return false;
+    }
+    eatRegExpIdentifierStart() {
+        const start = this.index;
+        let cp = this.currentCodePoint;
+        this.advance();
+        if (cp === ReverseSolidus && this.eatRegExpUnicodeEscapeSequence()) {
+            cp = this._lastIntValue;
+        }
+        if (isRegExpIdentifierStart(cp)) {
+            this._lastIntValue = cp;
+            return true;
+        }
+        if (this.index !== start) {
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatRegExpIdentifierPart() {
+        const start = this.index;
+        let cp = this.currentCodePoint;
+        this.advance();
+        if (cp === ReverseSolidus && this.eatRegExpUnicodeEscapeSequence()) {
+            cp = this._lastIntValue;
+        }
+        if (isRegExpIdentifierPart(cp)) {
+            this._lastIntValue = cp;
+            return true;
+        }
+        if (this.index !== start) {
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatAtomEscape() {
+        if (this.eatBackreference() ||
+            this.eatCharacterClassEscape() ||
+            this.eatCharacterEscape() ||
+            (this._nFlag && this.eatKGroupName())) {
+            return true;
+        }
+        if (this.strict || this._uFlag) {
+            this.raise("Invalid escape");
+        }
+        return false;
+    }
+    eatBackreference() {
+        const start = this.index;
+        if (this.eatDecimalEscape()) {
+            const n = this._lastIntValue;
+            if (n <= this._numCapturingParens) {
+                this.onBackreference(start - 1, this.index, n);
+                return true;
+            }
+            if (this.strict) {
+                this.raise("Invalid escape");
+            }
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatKGroupName() {
+        const start = this.index;
+        if (this.eat(LatinSmallLetterK)) {
+            if (this.eatGroupName()) {
+                const groupName = this._lastStrValue;
+                this._backreferenceNames.add(groupName);
+                this.onBackreference(start - 1, this.index, groupName);
+                return true;
+            }
+            this.raise("Invalid named reference");
+        }
+        return false;
+    }
+    eatCharacterEscape() {
+        const start = this.index;
+        if (this.eatControlEscape() ||
+            this.eatCControlLetter() ||
+            this.eatZero() ||
+            this.eatHexEscapeSequence() ||
+            this.eatRegExpUnicodeEscapeSequence() ||
+            (!this.strict && this.eatLegacyOctalEscapeSequence()) ||
+            this.eatIdentityEscape()) {
+            this.onCharacter(start - 1, this.index, this._lastIntValue);
+            return true;
+        }
+        return false;
+    }
+    eatCControlLetter() {
+        const start = this.index;
+        if (this.eat(LatinSmallLetterC)) {
+            if (this.eatControlLetter()) {
+                return true;
+            }
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatZero() {
+        if (this.currentCodePoint === DigitZero &&
+            !isDecimalDigit(this.nextCodePoint)) {
+            this._lastIntValue = 0;
+            this.advance();
+            return true;
+        }
+        return false;
+    }
+    eatControlEscape() {
+        if (this.eat(LatinSmallLetterT)) {
+            this._lastIntValue = CharacterTabulation;
+            return true;
+        }
+        if (this.eat(LatinSmallLetterN)) {
+            this._lastIntValue = LineFeed;
+            return true;
+        }
+        if (this.eat(LatinSmallLetterV)) {
+            this._lastIntValue = LineTabulation;
+            return true;
+        }
+        if (this.eat(LatinSmallLetterF)) {
+            this._lastIntValue = FormFeed;
+            return true;
+        }
+        if (this.eat(LatinSmallLetterR)) {
+            this._lastIntValue = CarriageReturn;
+            return true;
+        }
+        return false;
+    }
+    eatControlLetter() {
+        const cp = this.currentCodePoint;
+        if (isLatinLetter(cp)) {
+            this.advance();
+            this._lastIntValue = cp % 0x20;
+            return true;
+        }
+        return false;
+    }
+    eatRegExpUnicodeEscapeSequence() {
+        const start = this.index;
+        if (this.eat(LatinSmallLetterU)) {
+            if (this.eatFixedHexDigits(4)) {
+                const lead = this._lastIntValue;
+                if (this._uFlag && lead >= 0xd800 && lead <= 0xdbff) {
+                    const leadSurrogateEnd = this.index;
+                    if (this.eat(ReverseSolidus) &&
+                        this.eat(LatinSmallLetterU) &&
+                        this.eatFixedHexDigits(4)) {
+                        const trail = this._lastIntValue;
+                        if (trail >= 0xdc00 && trail <= 0xdfff) {
+                            this._lastIntValue =
+                                (lead - 0xd800) * 0x400 +
+                                    (trail - 0xdc00) +
+                                    0x10000;
+                            return true;
+                        }
+                    }
+                    this.rewind(leadSurrogateEnd);
+                    this._lastIntValue = lead;
+                }
+                return true;
+            }
+            if (this._uFlag &&
+                this.eat(LeftCurlyBracket) &&
+                this.eatHexDigits() &&
+                this.eat(RightCurlyBracket) &&
+                isValidUnicode(this._lastIntValue)) {
+                return true;
+            }
+            if (this.strict || this._uFlag) {
+                this.raise("Invalid unicode escape");
+            }
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatIdentityEscape() {
+        if (this._uFlag) {
+            if (this.eatSyntaxCharacter()) {
+                return true;
+            }
+            if (this.eat(Solidus)) {
+                this._lastIntValue = Solidus;
+                return true;
+            }
+            return false;
+        }
+        if (this.isValidIdentityEscape(this.currentCodePoint)) {
+            this._lastIntValue = this.currentCodePoint;
+            this.advance();
+            return true;
+        }
+        return false;
+    }
+    isValidIdentityEscape(cp) {
+        if (cp === -1) {
+            return false;
+        }
+        if (this.strict) {
+            return !isIdContinue(cp);
+        }
+        return (cp !== LatinSmallLetterC &&
+            (!this._nFlag || cp !== LatinSmallLetterK));
+    }
+    eatDecimalEscape() {
+        this._lastIntValue = 0;
+        let cp = this.currentCodePoint;
+        if (cp >= DigitOne && cp <= DigitNine) {
+            do {
+                this._lastIntValue = 10 * this._lastIntValue + (cp - DigitZero);
+                this.advance();
+            } while ((cp = this.currentCodePoint) >= DigitZero &&
+                cp <= DigitNine);
+            return true;
+        }
+        return false;
+    }
+    eatCharacterClassEscape() {
+        const start = this.index;
+        if (this.eat(LatinSmallLetterD)) {
+            this._lastIntValue = -1;
+            this.onEscapeCharacterSet(start - 1, this.index, "digit", false);
+            return true;
+        }
+        if (this.eat(LatinCapitalLetterD)) {
+            this._lastIntValue = -1;
+            this.onEscapeCharacterSet(start - 1, this.index, "digit", true);
+            return true;
+        }
+        if (this.eat(LatinSmallLetterS)) {
+            this._lastIntValue = -1;
+            this.onEscapeCharacterSet(start - 1, this.index, "space", false);
+            return true;
+        }
+        if (this.eat(LatinCapitalLetterS)) {
+            this._lastIntValue = -1;
+            this.onEscapeCharacterSet(start - 1, this.index, "space", true);
+            return true;
+        }
+        if (this.eat(LatinSmallLetterW)) {
+            this._lastIntValue = -1;
+            this.onEscapeCharacterSet(start - 1, this.index, "word", false);
+            return true;
+        }
+        if (this.eat(LatinCapitalLetterW)) {
+            this._lastIntValue = -1;
+            this.onEscapeCharacterSet(start - 1, this.index, "word", true);
+            return true;
+        }
+        let negate = false;
+        if (this._uFlag &&
+            this.ecmaVersion >= 2018 &&
+            (this.eat(LatinSmallLetterP) ||
+                (negate = this.eat(LatinCapitalLetterP)))) {
+            this._lastIntValue = -1;
+            if (this.eat(LeftCurlyBracket) &&
+                this.eatUnicodePropertyValueExpression() &&
+                this.eat(RightCurlyBracket)) {
+                this.onUnicodePropertyCharacterSet(start - 1, this.index, "property", this._lastKeyValue, this._lastValValue || null, negate);
+                return true;
+            }
+            this.raise("Invalid property name");
+        }
+        return false;
+    }
+    eatUnicodePropertyValueExpression() {
+        const start = this.index;
+        if (this.eatUnicodePropertyName() && this.eat(EqualsSign)) {
+            this._lastKeyValue = this._lastStrValue;
+            if (this.eatUnicodePropertyValue()) {
+                this._lastValValue = this._lastStrValue;
+                if (isValidUnicodeProperty(this._lastKeyValue, this._lastValValue)) {
+                    return true;
+                }
+                this.raise("Invalid property name");
+            }
+        }
+        this.rewind(start);
+        if (this.eatLoneUnicodePropertyNameOrValue()) {
+            const nameOrValue = this._lastStrValue;
+            if (isValidUnicodeProperty("General_Category", nameOrValue)) {
+                this._lastKeyValue = "General_Category";
+                this._lastValValue = nameOrValue;
+                return true;
+            }
+            if (isValidUnicodePropertyName(nameOrValue)) {
+                this._lastKeyValue = nameOrValue;
+                this._lastValValue = "";
+                return true;
+            }
+            this.raise("Invalid property name");
+        }
+        return false;
+    }
+    eatUnicodePropertyName() {
+        this._lastStrValue = "";
+        while (isUnicodePropertyNameCharacter(this.currentCodePoint)) {
+            this._lastStrValue += String.fromCodePoint(this.currentCodePoint);
+            this.advance();
+        }
+        return this._lastStrValue !== "";
+    }
+    eatUnicodePropertyValue() {
+        this._lastStrValue = "";
+        while (isUnicodePropertyValueCharacter(this.currentCodePoint)) {
+            this._lastStrValue += String.fromCodePoint(this.currentCodePoint);
+            this.advance();
+        }
+        return this._lastStrValue !== "";
+    }
+    eatLoneUnicodePropertyNameOrValue() {
+        return this.eatUnicodePropertyValue();
+    }
+    eatCharacterClass() {
+        const start = this.index;
+        if (this.eat(LeftSquareBracket)) {
+            const negate = this.eat(CircumflexAccent);
+            this.onCharacterClassEnter(start, negate);
+            this.classRanges();
+            if (!this.eat(RightSquareBracket)) {
+                this.raise("Unterminated character class");
+            }
+            this.onCharacterClassLeave(start, this.index, negate);
+            return true;
+        }
+        return false;
+    }
+    classRanges() {
+        let start = this.index;
+        while (this.eatClassAtom()) {
+            const left = this._lastIntValue;
+            const hyphenStart = this.index;
+            if (this.eat(HyphenMinus)) {
+                this.onCharacter(hyphenStart, this.index, HyphenMinus);
+                if (this.eatClassAtom()) {
+                    const right = this._lastIntValue;
+                    if (left === -1 || right === -1) {
+                        if (this.strict) {
+                            this.raise("Invalid character class");
+                        }
+                    }
+                    else if (left > right) {
+                        this.raise("Range out of order in character class");
+                    }
+                    else {
+                        this.onCharacterClassRange(start, this.index, left, right);
+                    }
+                }
+            }
+            start = this.index;
+        }
+    }
+    eatClassAtom() {
+        const start = this.index;
+        if (this.eat(ReverseSolidus)) {
+            if (this.eatClassEscape()) {
+                return true;
+            }
+            if (this._uFlag) {
+                this.raise("Invalid escape");
+            }
+            this.rewind(start);
+        }
+        const cp = this.currentCodePoint;
+        if (cp !== -1 && cp !== RightSquareBracket) {
+            this.advance();
+            this._lastIntValue = cp;
+            this.onCharacter(start, this.index, cp);
+            return true;
+        }
+        return false;
+    }
+    eatClassEscape() {
+        const start = this.index;
+        if (this.eat(LatinSmallLetterB)) {
+            this._lastIntValue = Backspace;
+            this.onCharacter(start - 1, this.index, Backspace);
+            return true;
+        }
+        if (this._uFlag && this.eat(HyphenMinus)) {
+            this._lastIntValue = HyphenMinus;
+            this.onCharacter(start - 1, this.index, HyphenMinus);
+            return true;
+        }
+        if (!this._uFlag && this.eat(LatinSmallLetterC)) {
+            if (this.eatClassControlLetter()) {
+                this.onCharacter(start - 1, this.index, this._lastIntValue);
+                return true;
+            }
+            this.rewind(start);
+        }
+        return this.eatCharacterClassEscape() || this.eatCharacterEscape();
+    }
+    eatClassControlLetter() {
+        const cp = this.currentCodePoint;
+        if (isDecimalDigit(cp) || cp === LowLine) {
+            this.advance();
+            this._lastIntValue = cp % 0x20;
+            return true;
+        }
+        return false;
+    }
+    eatHexEscapeSequence() {
+        const start = this.index;
+        if (this.eat(LatinSmallLetterX)) {
+            if (this.eatFixedHexDigits(2)) {
+                return true;
+            }
+            if (this._uFlag) {
+                this.raise("Invalid escape");
+            }
+            this.rewind(start);
+        }
+        return false;
+    }
+    eatDecimalDigits() {
+        const start = this.index;
+        this._lastIntValue = 0;
+        while (isDecimalDigit(this.currentCodePoint)) {
+            this._lastIntValue =
+                10 * this._lastIntValue + digitToInt(this.currentCodePoint);
+            this.advance();
+        }
+        return this.index !== start;
+    }
+    eatHexDigits() {
+        const start = this.index;
+        this._lastIntValue = 0;
+        while (isHexDigit(this.currentCodePoint)) {
+            this._lastIntValue =
+                16 * this._lastIntValue + digitToInt(this.currentCodePoint);
+            this.advance();
+        }
+        return this.index !== start;
+    }
+    eatLegacyOctalEscapeSequence() {
+        if (this.eatOctalDigit()) {
+            const n1 = this._lastIntValue;
+            if (this.eatOctalDigit()) {
+                const n2 = this._lastIntValue;
+                if (n1 <= 3 && this.eatOctalDigit()) {
+                    this._lastIntValue = n1 * 64 + n2 * 8 + this._lastIntValue;
+                }
+                else {
+                    this._lastIntValue = n1 * 8 + n2;
+                }
+            }
+            else {
+                this._lastIntValue = n1;
+            }
+            return true;
+        }
+        return false;
+    }
+    eatOctalDigit() {
+        const cp = this.currentCodePoint;
+        if (isOctalDigit(cp)) {
+            this.advance();
+            this._lastIntValue = cp - DigitZero;
+            return true;
+        }
+        this._lastIntValue = 0;
+        return false;
+    }
+    eatFixedHexDigits(length) {
+        const start = this.index;
+        this._lastIntValue = 0;
+        for (let i = 0; i < length; ++i) {
+            const cp = this.currentCodePoint;
+            if (!isHexDigit(cp)) {
+                this.rewind(start);
+                return false;
+            }
+            this._lastIntValue = 16 * this._lastIntValue + digitToInt(cp);
+            this.advance();
+        }
+        return true;
+    }
+}
+
+const DummyPattern = {};
+const DummyFlags = {};
+const DummyCapturingGroup = {};
+class RegExpParserState {
+    constructor(options) {
+        this._node = DummyPattern;
+        this._flags = DummyFlags;
+        this._backreferences = [];
+        this._capturingGroups = [];
+        this.source = "";
+        this.strict = Boolean(options && options.strict);
+        this.ecmaVersion = (options && options.ecmaVersion) || 2018;
+    }
+    get pattern() {
+        if (this._node.type !== "Pattern") {
+            throw new Error("UnknownError");
+        }
+        return this._node;
+    }
+    get flags() {
+        if (this._flags.type !== "Flags") {
+            throw new Error("UnknownError");
+        }
+        return this._flags;
+    }
+    onFlags(start, end, global, ignoreCase, multiline, unicode, sticky, dotAll) {
+        this._flags = {
+            type: "Flags",
+            parent: null,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            global,
+            ignoreCase,
+            multiline,
+            unicode,
+            sticky,
+            dotAll,
+        };
+    }
+    onPatternEnter(start) {
+        this._node = {
+            type: "Pattern",
+            parent: null,
+            start,
+            end: start,
+            raw: "",
+            alternatives: [],
+        };
+        this._backreferences.length = 0;
+        this._capturingGroups.length = 0;
+    }
+    onPatternLeave(start, end) {
+        this._node.end = end;
+        this._node.raw = this.source.slice(start, end);
+        for (const reference of this._backreferences) {
+            const ref = reference.ref;
+            const group = typeof ref === "number"
+                ? this._capturingGroups[ref - 1]
+                : this._capturingGroups.find(g => g.name === ref);
+            reference.resolved = group;
+            group.references.push(reference);
+        }
+    }
+    onAlternativeEnter(start) {
+        const parent = this._node;
+        if (parent.type !== "Assertion" &&
+            parent.type !== "CapturingGroup" &&
+            parent.type !== "Group" &&
+            parent.type !== "Pattern") {
+            throw new Error("UnknownError");
+        }
+        this._node = {
+            type: "Alternative",
+            parent,
+            start,
+            end: start,
+            raw: "",
+            elements: [],
+        };
+        parent.alternatives.push(this._node);
+    }
+    onAlternativeLeave(start, end) {
+        const node = this._node;
+        if (node.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        node.end = end;
+        node.raw = this.source.slice(start, end);
+        this._node = node.parent;
+    }
+    onGroupEnter(start) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        this._node = {
+            type: "Group",
+            parent,
+            start,
+            end: start,
+            raw: "",
+            alternatives: [],
+        };
+        parent.elements.push(this._node);
+    }
+    onGroupLeave(start, end) {
+        const node = this._node;
+        if (node.type !== "Group" || node.parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        node.end = end;
+        node.raw = this.source.slice(start, end);
+        this._node = node.parent;
+    }
+    onCapturingGroupEnter(start, name) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        this._node = {
+            type: "CapturingGroup",
+            parent,
+            start,
+            end: start,
+            raw: "",
+            name,
+            alternatives: [],
+            references: [],
+        };
+        parent.elements.push(this._node);
+        this._capturingGroups.push(this._node);
+    }
+    onCapturingGroupLeave(start, end) {
+        const node = this._node;
+        if (node.type !== "CapturingGroup" ||
+            node.parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        node.end = end;
+        node.raw = this.source.slice(start, end);
+        this._node = node.parent;
+    }
+    onQuantifier(start, end, min, max, greedy) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        const element = parent.elements.pop();
+        if (element == null ||
+            element.type === "Quantifier" ||
+            (element.type === "Assertion" && element.kind !== "lookahead")) {
+            throw new Error("UnknownError");
+        }
+        const node = {
+            type: "Quantifier",
+            parent,
+            start: element.start,
+            end,
+            raw: this.source.slice(element.start, end),
+            min,
+            max,
+            greedy,
+            element,
+        };
+        parent.elements.push(node);
+        element.parent = node;
+    }
+    onLookaroundAssertionEnter(start, kind, negate) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        this._node = {
+            type: "Assertion",
+            parent,
+            start,
+            end: start,
+            raw: "",
+            kind,
+            negate,
+            alternatives: [],
+        };
+        parent.elements.push(this._node);
+    }
+    onLookaroundAssertionLeave(start, end) {
+        const node = this._node;
+        if (node.type !== "Assertion" || node.parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        node.end = end;
+        node.raw = this.source.slice(start, end);
+        this._node = node.parent;
+    }
+    onEdgeAssertion(start, end, kind) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        parent.elements.push({
+            type: "Assertion",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            kind,
+        });
+    }
+    onWordBoundaryAssertion(start, end, kind, negate) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        parent.elements.push({
+            type: "Assertion",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            kind,
+            negate,
+        });
+    }
+    onAnyCharacterSet(start, end, kind) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        parent.elements.push({
+            type: "CharacterSet",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            kind,
+        });
+    }
+    onEscapeCharacterSet(start, end, kind, negate) {
+        const parent = this._node;
+        if (parent.type !== "Alternative" && parent.type !== "CharacterClass") {
+            throw new Error("UnknownError");
+        }
+        parent.elements.push({
+            type: "CharacterSet",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            kind,
+            negate,
+        });
+    }
+    onUnicodePropertyCharacterSet(start, end, kind, key, value, negate) {
+        const parent = this._node;
+        if (parent.type !== "Alternative" && parent.type !== "CharacterClass") {
+            throw new Error("UnknownError");
+        }
+        parent.elements.push({
+            type: "CharacterSet",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            kind,
+            key,
+            value,
+            negate,
+        });
+    }
+    onCharacter(start, end, value) {
+        const parent = this._node;
+        if (parent.type !== "Alternative" && parent.type !== "CharacterClass") {
+            throw new Error("UnknownError");
+        }
+        parent.elements.push({
+            type: "Character",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            value,
+        });
+    }
+    onBackreference(start, end, ref) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        const node = {
+            type: "Backreference",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            ref,
+            resolved: DummyCapturingGroup,
+        };
+        parent.elements.push(node);
+        this._backreferences.push(node);
+    }
+    onCharacterClassEnter(start, negate) {
+        const parent = this._node;
+        if (parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        this._node = {
+            type: "CharacterClass",
+            parent,
+            start,
+            end: start,
+            raw: "",
+            negate,
+            elements: [],
+        };
+        parent.elements.push(this._node);
+    }
+    onCharacterClassLeave(start, end) {
+        const node = this._node;
+        if (node.type !== "CharacterClass" ||
+            node.parent.type !== "Alternative") {
+            throw new Error("UnknownError");
+        }
+        node.end = end;
+        node.raw = this.source.slice(start, end);
+        this._node = node.parent;
+    }
+    onCharacterClassRange(start, end) {
+        const parent = this._node;
+        if (parent.type !== "CharacterClass") {
+            throw new Error("UnknownError");
+        }
+        const elements = parent.elements;
+        const max = elements.pop();
+        const hyphen = elements.pop();
+        const min = elements.pop();
+        if (!min ||
+            !max ||
+            !hyphen ||
+            min.type !== "Character" ||
+            max.type !== "Character" ||
+            hyphen.type !== "Character" ||
+            hyphen.value !== HyphenMinus) {
+            throw new Error("UnknownError");
+        }
+        const node = {
+            type: "CharacterClassRange",
+            parent,
+            start,
+            end,
+            raw: this.source.slice(start, end),
+            min,
+            max,
+        };
+        min.parent = node;
+        max.parent = node;
+        elements.push(node);
+    }
+}
+class RegExpParser {
+    constructor(options) {
+        this._state = new RegExpParserState(options);
+        this._validator = new RegExpValidator(this._state);
+    }
+    parseLiteral(source, start = 0, end = source.length) {
+        this._state.source = source;
+        this._validator.validateLiteral(source, start, end);
+        const pattern = this._state.pattern;
+        const flags = this._state.flags;
+        const literal = {
+            type: "RegExpLiteral",
+            parent: null,
+            start,
+            end,
+            raw: source,
+            pattern,
+            flags,
+        };
+        pattern.parent = literal;
+        flags.parent = literal;
+        return literal;
+    }
+    parseFlags(source, start = 0, end = source.length) {
+        this._state.source = source;
+        this._validator.validateFlags(source, start, end);
+        return this._state.flags;
+    }
+    parsePattern(source, start = 0, end = source.length, uFlag = false) {
+        this._state.source = source;
+        this._validator.validatePattern(source, start, end, uFlag);
+        return this._state.pattern;
+    }
+}
+
+class RegExpVisitor {
+    constructor(handlers) {
+        this._handlers = handlers;
+    }
+    visit(node) {
+        switch (node.type) {
+            case "Alternative":
+                this.visitAlternative(node);
+                break;
+            case "Assertion":
+                this.visitAssertion(node);
+                break;
+            case "Backreference":
+                this.visitBackreference(node);
+                break;
+            case "CapturingGroup":
+                this.visitCapturingGroup(node);
+                break;
+            case "Character":
+                this.visitCharacter(node);
+                break;
+            case "CharacterClass":
+                this.visitCharacterClass(node);
+                break;
+            case "CharacterClassRange":
+                this.visitCharacterClassRange(node);
+                break;
+            case "CharacterSet":
+                this.visitCharacterSet(node);
+                break;
+            case "Flags":
+                this.visitFlags(node);
+                break;
+            case "Group":
+                this.visitGroup(node);
+                break;
+            case "Pattern":
+                this.visitPattern(node);
+                break;
+            case "Quantifier":
+                this.visitQuantifier(node);
+                break;
+            case "RegExpLiteral":
+                this.visitRegExpLiteral(node);
+                break;
+            default:
+                throw new Error(`Unknown type: ${node.type}`);
+        }
+    }
+    visitAlternative(node) {
+        if (this._handlers.onAlternativeEnter) {
+            this._handlers.onAlternativeEnter(node);
+        }
+        node.elements.forEach(this.visit, this);
+        if (this._handlers.onAlternativeLeave) {
+            this._handlers.onAlternativeLeave(node);
+        }
+    }
+    visitAssertion(node) {
+        if (this._handlers.onAssertionEnter) {
+            this._handlers.onAssertionEnter(node);
+        }
+        if (node.kind === "lookahead" || node.kind === "lookbehind") {
+            node.alternatives.forEach(this.visit, this);
+        }
+        if (this._handlers.onAssertionLeave) {
+            this._handlers.onAssertionLeave(node);
+        }
+    }
+    visitBackreference(node) {
+        if (this._handlers.onBackreferenceEnter) {
+            this._handlers.onBackreferenceEnter(node);
+        }
+        if (this._handlers.onBackreferenceLeave) {
+            this._handlers.onBackreferenceLeave(node);
+        }
+    }
+    visitCapturingGroup(node) {
+        if (this._handlers.onCapturingGroupEnter) {
+            this._handlers.onCapturingGroupEnter(node);
+        }
+        node.alternatives.forEach(this.visit, this);
+        if (this._handlers.onCapturingGroupLeave) {
+            this._handlers.onCapturingGroupLeave(node);
+        }
+    }
+    visitCharacter(node) {
+        if (this._handlers.onCharacterEnter) {
+            this._handlers.onCharacterEnter(node);
+        }
+        if (this._handlers.onCharacterLeave) {
+            this._handlers.onCharacterLeave(node);
+        }
+    }
+    visitCharacterClass(node) {
+        if (this._handlers.onCharacterClassEnter) {
+            this._handlers.onCharacterClassEnter(node);
+        }
+        node.elements.forEach(this.visit, this);
+        if (this._handlers.onCharacterClassLeave) {
+            this._handlers.onCharacterClassLeave(node);
+        }
+    }
+    visitCharacterClassRange(node) {
+        if (this._handlers.onCharacterClassRangeEnter) {
+            this._handlers.onCharacterClassRangeEnter(node);
+        }
+        this.visitCharacter(node.min);
+        this.visitCharacter(node.max);
+        if (this._handlers.onCharacterClassRangeLeave) {
+            this._handlers.onCharacterClassRangeLeave(node);
+        }
+    }
+    visitCharacterSet(node) {
+        if (this._handlers.onCharacterSetEnter) {
+            this._handlers.onCharacterSetEnter(node);
+        }
+        if (this._handlers.onCharacterSetLeave) {
+            this._handlers.onCharacterSetLeave(node);
+        }
+    }
+    visitFlags(node) {
+        if (this._handlers.onFlagsEnter) {
+            this._handlers.onFlagsEnter(node);
+        }
+        if (this._handlers.onFlagsLeave) {
+            this._handlers.onFlagsLeave(node);
+        }
+    }
+    visitGroup(node) {
+        if (this._handlers.onGroupEnter) {
+            this._handlers.onGroupEnter(node);
+        }
+        node.alternatives.forEach(this.visit, this);
+        if (this._handlers.onGroupLeave) {
+            this._handlers.onGroupLeave(node);
+        }
+    }
+    visitPattern(node) {
+        if (this._handlers.onPatternEnter) {
+            this._handlers.onPatternEnter(node);
+        }
+        node.alternatives.forEach(this.visit, this);
+        if (this._handlers.onPatternLeave) {
+            this._handlers.onPatternLeave(node);
+        }
+    }
+    visitQuantifier(node) {
+        if (this._handlers.onQuantifierEnter) {
+            this._handlers.onQuantifierEnter(node);
+        }
+        this.visit(node.element);
+        if (this._handlers.onQuantifierLeave) {
+            this._handlers.onQuantifierLeave(node);
+        }
+    }
+    visitRegExpLiteral(node) {
+        if (this._handlers.onRegExpLiteralEnter) {
+            this._handlers.onRegExpLiteralEnter(node);
+        }
+        this.visitPattern(node.pattern);
+        this.visitFlags(node.flags);
+        if (this._handlers.onRegExpLiteralLeave) {
+            this._handlers.onRegExpLiteralLeave(node);
+        }
+    }
+}
+
+function parseRegExpLiteral(source, options) {
+    return new RegExpParser(options).parseLiteral(String(source));
+}
+function validateRegExpLiteral(source, options) {
+    return new RegExpValidator(options).validateLiteral(source);
+}
+function visitRegExpAST(node, handlers) {
+    new RegExpVisitor(handlers).visit(node);
+}
+
+export { ast as AST, RegExpParser, RegExpValidator, parseRegExpLiteral, validateRegExpLiteral, visitRegExpAST };
+//# sourceMappingURL=index.mjs.map