├── favicon.ico ├── favicon.png ├── .vscode └── settings.json ├── .gitattributes ├── LICENSE ├── .gitignore ├── package.json ├── src ├── cli.js ├── ascii-hypercube.coffee ├── test.js └── app.coffee ├── index.html ├── README.md └── lib └── grapheme-splitter.js /favicon.ico: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1j01/ascii-hypercube/HEAD/favicon.ico -------------------------------------------------------------------------------- /favicon.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/1j01/ascii-hypercube/HEAD/favicon.png -------------------------------------------------------------------------------- /.vscode/settings.json: -------------------------------------------------------------------------------- 1 | { 2 | "cSpell.words": [ 3 | "AESTHETIC", 4 | "argparse", 5 | "ASCII", 6 | "Bitstream", 7 | "HYPERCUBE", 8 | "hyperrectangle", 9 | "hyperrectangular", 10 | "metavar", 11 | "monospaced", 12 | "monospacing", 13 | "nargs", 14 | "Odhner", 15 | "online", 16 | "PYERRAHTHH", 17 | "tesseract", 18 | "tesseracts", 19 | "Vaporwave", 20 | "webpage", 21 | "YHRRAHT" 22 | ] 23 | } -------------------------------------------------------------------------------- /.gitattributes: -------------------------------------------------------------------------------- 1 | # Auto detect text files and perform LF normalization 2 | * text=auto 3 | 4 | # Custom for Visual Studio 5 | *.cs diff=csharp 6 | 7 | # Standard to msysgit 8 | *.doc diff=astextplain 9 | *.DOC diff=astextplain 10 | *.docx diff=astextplain 11 | *.DOCX diff=astextplain 12 | *.dot diff=astextplain 13 | *.DOT diff=astextplain 14 | *.pdf diff=astextplain 15 | *.PDF diff=astextplain 16 | *.rtf diff=astextplain 17 | *.RTF diff=astextplain 18 | -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2018 Isaiah Odhner 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /.gitignore: -------------------------------------------------------------------------------- 1 | # Compiled code 2 | build/ 3 | 4 | # ----------------------------- 5 | 6 | # Logs 7 | logs 8 | *.log 9 | npm-debug.log* 10 | 11 | # Runtime data 12 | pids 13 | *.pid 14 | *.seed 15 | 16 | # Directory for instrumented libs generated by jscoverage/JSCover 17 | lib-cov 18 | 19 | # Coverage directory used by tools like istanbul 20 | coverage 21 | 22 | # Grunt intermediate storage (https://gruntjs.com/creating-plugins#storing-task-files) 23 | .grunt 24 | 25 | # node-waf configuration 26 | .lock-wscript 27 | 28 | # Compiled binary addons (https://nodejs.org/api/addons.html) 29 | build/Release 30 | 31 | # Dependency directories 32 | node_modules 33 | jspm_packages 34 | 35 | # Optional npm cache directory 36 | .npm 37 | 38 | # Optional REPL history 39 | .node_repl_history 40 | 41 | # ========================= 42 | # Operating System Files 43 | # ========================= 44 | 45 | # OSX 46 | # ========================= 47 | 48 | .DS_Store 49 | .AppleDouble 50 | .LSOverride 51 | 52 | # Thumbnails 53 | ._* 54 | 55 | # Files that might appear in the root of a volume 56 | .DocumentRevisions-V100 57 | .fseventsd 58 | .Spotlight-V100 59 | .TemporaryItems 60 | .Trashes 61 | .VolumeIcon.icns 62 | 63 | # Directories potentially created on remote AFP share 64 | .AppleDB 65 | .AppleDesktop 66 | Network Trash Folder 67 | Temporary Items 68 | .apdisk 69 | 70 | # Windows 71 | # ========================= 72 | 73 | # Windows image file caches 74 | Thumbs.db 75 | ehthumbs.db 76 | 77 | # Folder config file 78 | Desktop.ini 79 | 80 | # Recycle Bin used on file shares 81 | $RECYCLE.BIN/ 82 | 83 | # Windows Installer files 84 | *.cab 85 | *.msi 86 | *.msm 87 | *.msp 88 | 89 | # Windows shortcuts 90 | *.lnk 91 | -------------------------------------------------------------------------------- /package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "ascii-hypercube", 3 | "version": "1.0.0", 4 | "description": "Render tesseracts as text", 5 | "main": "build/ascii-hypercube.js", 6 | "bin": { 7 | "ascii-hypercube": "src/cli.js" 8 | }, 9 | "files": [ 10 | "build/", 11 | "src/", 12 | "LICENSE", 13 | "README.md" 14 | ], 15 | "directories": { 16 | "lib": "src" 17 | }, 18 | "scripts": { 19 | "build": "coffee -c -o build/ src/", 20 | "prepare": "npm run build", 21 | "prepublishOnly": "npm run update-cli-docs", 22 | "test": "npm run build && node src/test.js", 23 | "update-cli-docs": "node -e \"const fs = require('fs'); fs.writeFileSync('README.md', fs.readFileSync('README.md', 'utf8').replace(/```HELP_OUTPUT.+?```/s, '```HELP_OUTPUT\\n' + require('child_process').execSync('ascii-hypercube --help').toString().trim() + '\\n```'))\"" 24 | }, 25 | "repository": { 26 | "type": "git", 27 | "url": "git+https://github.com/1j01/ascii-hypercube.git" 28 | }, 29 | "keywords": [ 30 | "cube", 31 | "tesseract", 32 | "hypercube", 33 | "hyperrectangle", 34 | "text", 35 | "ascii", 36 | "geometry", 37 | "ascii-art", 38 | "text-art", 39 | "shapes", 40 | "dimensions", 41 | "2d", 42 | "3d", 43 | "4d", 44 | "5d" 45 | ], 46 | "author": "Isaiah Odhner (https://isaiahodhner.io)", 47 | "license": "MIT", 48 | "bugs": { 49 | "url": "https://github.com/1j01/ascii-hypercube/issues" 50 | }, 51 | "homepage": "https://github.com/1j01/ascii-hypercube#readme", 52 | "devDependencies": { 53 | "coffeescript": "2.4.1" 54 | }, 55 | "dependencies": { 56 | "argparse": "^2.0.1", 57 | "grapheme-splitter": "^1.0.4" 58 | } 59 | } 60 | -------------------------------------------------------------------------------- /src/cli.js: -------------------------------------------------------------------------------- 1 | #!/usr/bin/env node 2 | 3 | const argparse = require('argparse'); 4 | const { renderHypercube } = require('../build/ascii-hypercube.js'); 5 | 6 | const parser = new argparse.ArgumentParser({ 7 | prog: 'ascii-hypercube', 8 | description: 'CLI to render hypercubes with text along an arbitrary number of dimensions', 9 | epilog: `Example: ascii-hypercube -d 2,0 11 'RATHER HYPER' -d 0,1 11 'RATHER HYPER' -d 1,1 4 '\\\\' -d 3,1 8 '\\~' -d -1,1 3 '\\/'` 10 | }); 11 | 12 | parser.add_argument('-d', '--dimension', { 13 | help: 'Define a dimension, with travel per glyph, length of edges along the dimension, and text. Can be specified multiple times. Travel must be given as a pair of numbers with no spaces, e.g. "-1,0" or "(-1,0)"', 14 | action: 'append', // Allow multiple --dimension arguments 15 | nargs: 3, 16 | metavar: ['TRAVEL', 'LENGTH', 'TEXT'], 17 | }); 18 | 19 | parser.add_argument('-s', '--stats', { 20 | help: 'Print statistics about the overlaps', 21 | action: 'store_true', 22 | }); 23 | 24 | // Hack so that "-1,0" is parsed as a positional argument instead of a flag 25 | // They have a rule for negative numbers, but it matches the whole argument, doesn't allow comma separated numbers 26 | // I could just change it to match at the start (i.e. as a prefix, using ^ but dropping $), 27 | // but I've changed it to match the end or a comma, to be more conservative with the change. 28 | parser._negative_number_matcher = /^-\d+(?:$|,)|^-\d*\.\d+(?:$|,)/; // default /^-\d+$|^-\d*\.\d+$/ 29 | 30 | const args = parser.parse_args(); 31 | 32 | const dimensions = args.dimension.map(dimArgs => { 33 | let [travel, length, text] = dimArgs; 34 | // const xyMatch = travel.match(/\((-?\d+,-?\d+)\)/); 35 | // if (!xyMatch) { 36 | // throw new Error(`Invalid travel format: ${JSON.stringify(travel)}. Expected format: "(-1,0)"`); 37 | // } 38 | const [xPerGlyph, yPerGlyph] = travel.replace(/^\((.*)\)$/, "$1").split(',').map(Number); 39 | length = Number(length); 40 | return { length, xPerGlyph, yPerGlyph, text }; 41 | }); 42 | 43 | const result = renderHypercube(dimensions); 44 | 45 | console.log(result.text); 46 | 47 | if (args.stats) { 48 | let overlapDescription = "(none - any overlapping glyphs match each other)"; 49 | if (result.numOverlaps > 0) { 50 | overlapDescription = "\n" + Object.entries(result.overlaps).map(([under, overs]) => 51 | Object.entries(overs).map(([over, nOver]) => 52 | `- '${over}' over '${under}' (${nOver})` 53 | ).join("\n") 54 | ).join("\n"); 55 | } 56 | console.log('Number of Overlaps:', result.numOverlaps); 57 | console.log('Overlaps:', overlapDescription); 58 | } 59 | -------------------------------------------------------------------------------- /src/ascii-hypercube.coffee: -------------------------------------------------------------------------------- 1 | 2 | grid = [] 3 | 4 | numOverlaps = 0 5 | overlaps = {} 6 | 7 | plotGlyph = (glyph, x, y)-> 8 | if grid.length <= y 9 | console?.warn? "Expanding vertically" 10 | for i in [grid.length..y] 11 | grid[i] = [] 12 | if grid[y].length < x 13 | for i in [grid[y].length..x] 14 | grid[y][i] = " " 15 | existing = grid[y][x] 16 | if existing? and existing isnt " " and existing isnt glyph 17 | overlaps[existing] ?= {} 18 | overlaps[existing][glyph] ?= 0 19 | overlaps[existing][glyph] += 1 20 | numOverlaps += 1 21 | grid[y][x] = glyph 22 | 23 | plotHypercubeVertices = (dimensions, glyph, x, y)-> 24 | 25 | [furtherDimensions..., _] = dimensions 26 | 27 | if furtherDimensions.length 28 | dimension = furtherDimensions[furtherDimensions.length - 1] 29 | plotHypercubeVertices(furtherDimensions, glyph, x, y) 30 | plotHypercubeVertices(furtherDimensions, glyph, 31 | x + dimension.length * dimension.xPerGlyph 32 | y + dimension.length * dimension.yPerGlyph 33 | ) 34 | else 35 | plotGlyph(glyph, x, y) 36 | 37 | plotHypercube = (dimensions, x, y)-> 38 | 39 | [furtherDimensions..., dimension] = dimensions 40 | {length, xPerGlyph, yPerGlyph, glyphs} = dimension 41 | 42 | if length > 0 and glyphs.length > 0 43 | for i in [1..length] 44 | glyph = glyphs[i % glyphs.length] 45 | plotHypercubeVertices(dimensions, glyph, x + i * xPerGlyph, y + i * yPerGlyph) 46 | if length > 0 47 | if furtherDimensions.length 48 | plotHypercube(furtherDimensions, x, y) 49 | plotHypercube(furtherDimensions, x + length * xPerGlyph, y + length * yPerGlyph) 50 | else if glyphs.length > 0 51 | plotGlyph(glyphs[0], x, y) 52 | else 53 | # skip this dimension for the sake of overlap counting mainly 54 | plotHypercube(furtherDimensions, x, y) 55 | 56 | renderHypercube = (dimensions, splitter)-> 57 | x = 0 58 | y = 0 59 | width = 0 60 | height = 0 61 | for dimension in dimensions 62 | width = Math.max(width, width + dimension.length * dimension.xPerGlyph) 63 | height = Math.max(height, height + dimension.length * dimension.yPerGlyph) 64 | x = Math.max(x, x - dimension.length * dimension.xPerGlyph) 65 | y = Math.max(y, y - dimension.length * dimension.yPerGlyph) 66 | width += x 67 | height += y 68 | grid = 69 | for [0..height] 70 | [] 71 | # for [0..width] 72 | # " " 73 | 74 | numOverlaps = 0 75 | overlaps = {} 76 | 77 | for dimension in dimensions 78 | # Not using `dimension.glyphs ?= ...` because if the objects are reused, the glyphs would be reused too (cached forever) 79 | # TODO: don't modify the input objects at all 80 | if dimension.text? 81 | dimension.glyphs = (splitter ?= new (window?.GraphemeSplitter ? require('grapheme-splitter'))()).splitGraphemes(dimension.text) 82 | 83 | if dimensions.length > 0 84 | plotHypercube(dimensions, x, y) 85 | 86 | text = 87 | (line.join("") for line in grid).join("\n") 88 | 89 | return { text, overlaps, numOverlaps } 90 | 91 | # TODO: ESM export 92 | if module? 93 | module.exports = 94 | renderHypercube: renderHypercube 95 | else 96 | window.renderHypercube = renderHypercube 97 | -------------------------------------------------------------------------------- /src/test.js: -------------------------------------------------------------------------------- 1 | const { renderHypercube } = require('../build/ascii-hypercube.js'); 2 | 3 | const tests = [ 4 | // Edge case: zero-cube 5 | { 6 | dimensions: [], 7 | expectedText: ``, 8 | }, 9 | // Cube (3D) 10 | { 11 | dimensions: [ 12 | {length: 4, xPerGlyph: 2, yPerGlyph: 0, text: "CUBIC"}, 13 | {length: 4, xPerGlyph: 0, yPerGlyph: 1, text: "CUBIC"}, 14 | {length: 2, xPerGlyph: 2, yPerGlyph: 1, text: "\\"}, 15 | ], 16 | expectedText: `C U B I C 17 | U \\ U \\ 18 | B C U B I C 19 | I U I U 20 | C U B I C B 21 | \\ I \\ I 22 | C U B I C`, 23 | }, 24 | // Cube (3D) with extra dimensions of length 0 25 | { 26 | dimensions: [ 27 | {length: 4, xPerGlyph: 2, yPerGlyph: 0, text: "CUBIC"}, 28 | {length: 4, xPerGlyph: 0, yPerGlyph: 1, text: "CUBIC"}, 29 | {length: 2, xPerGlyph: 2, yPerGlyph: 1, text: "\\"}, 30 | {length: 0, xPerGlyph: 3, yPerGlyph: 1, text: "~"}, 31 | {length: 0, xPerGlyph: -1, yPerGlyph: 1, text: "/"}, 32 | ], 33 | expectedText: `C U B I C 34 | U \\ U \\ 35 | B C U B I C 36 | I U I U 37 | C U B I C B 38 | \\ I \\ I 39 | C U B I C`, 40 | }, 41 | // Tesseract (4D) 42 | { 43 | dimensions: [ 44 | {length: 4, xPerGlyph: 2, yPerGlyph: 0, text: "CUBIC"}, 45 | {length: 4, xPerGlyph: 0, yPerGlyph: 1, text: "CUBIC"}, 46 | {length: 2, xPerGlyph: 2, yPerGlyph: 1, text: "\\"}, 47 | {length: 3, xPerGlyph: -1, yPerGlyph: 1, text: "/"}, 48 | ], 49 | expectedText: ` C U B I C 50 | /U \\ /U \\ 51 | / B C U B I C 52 | C UIB IUC I /U 53 | U \\C U BUI\\C / B 54 | B / C\\UIB I C\\ I 55 | I/ U CIU BUI C 56 | C U B I C B / 57 | \\ I/ \\ I/ 58 | C U B I C`, 59 | }, 60 | // 5-cube (5D) 61 | { 62 | dimensions: [ 63 | {length: 11, xPerGlyph: 2, yPerGlyph: 0, text: "RATHER HYPER"}, 64 | {length: 11, xPerGlyph: 0, yPerGlyph: 1, text: "RATHER HYPER"}, 65 | {length: 4, xPerGlyph: 1, yPerGlyph: 1, text: "\\"}, 66 | {length: 8, xPerGlyph: 3, yPerGlyph: 1, text: "~"}, 67 | {length: 3, xPerGlyph: -1, yPerGlyph: 1, text: "/"}, 68 | ], 69 | expectedText: ` R A T H E R H Y P E R 70 | /A\\ ~ /A\\ ~ 71 | / T \\ ~ / T \\ ~ 72 | R AHT H E R H Y P E R H \\ ~ 73 | A\\ ~ R A T H E R HA\\ ~ E R ~ 74 | T \\R ~A ~ ~ T \\R ~A ~ ~ 75 | H \\ / T ~ ~ ~H \\ / T ~ ~ ~ 76 | E HR AHT H E R H Y P EHR H ~ ~ ~ 77 | R YA ~ ~ ~ R YAR ~ T H E ~ H Y P E R 78 | PT R ~ ~ PTA\\R ~ ~ ~ /A\\ 79 | H EH ~ ~H EHT \\ ~ ~ ~ T \\ 80 | Y REA H H E R ~H Y PYERRAHTHH E R H Y P E R H~ \\ 81 | P / R ~Y ~ P A\\RE~Y R A T H E ~ HA\\ P E R 82 | E/ \\ P ~ E/T \\R P/A ~ T \\R /A 83 | R A H HEE R H Y P E R H~H\\\\E T ~ H~ \\ / T 84 | \\ ~Y R A T H E R H \\E~YHRRAHT H E~R H Y P EHR H 85 | \\ P ~ ~ ~ R PYA E~ ~ R YA E 86 | \\E/ ~ ~ ~ \\EPT ~ ~ ~ PT R 87 | R A T H E R H Y P H REH ~ ~ H EH 88 | ~ ~ ~ Y RE~ H H E ~ H Y PYE RE H 89 | ~ ~ ~ P / R Y~ ~ ~ P / R Y 90 | ~ ~ E~ \\ P ~ ~ E~ \\ P 91 | ~ R A H HEE R H Y P E R H \\E 92 | ~ \\ Y R A T H E ~ H \\ PYE R 93 | ~ \\ P / ~ \\ P / 94 | ~ \\E/ ~ \\E/ 95 | R A T H E R H Y P E R`, 96 | }, 97 | ]; 98 | 99 | let failed = false; 100 | tests.forEach(({ dimensions, expectedText }, i) => { 101 | const actual = renderHypercube(dimensions); 102 | if (actual.text !== expectedText) { 103 | console.error(`Test ${i} failed: expected\n${expectedText}\nbut got\n${actual.text}\n`); 104 | // Comparing text with whitespace from the terminal can be hard. Hex is an option, although it's not great since it's super abstract. 105 | // console.error(`Test ${i} failed: expected\n${new Buffer(expectedText).toString('hex')}\nbut got\n${new Buffer(actual.text).toString('hex')}`); 106 | failed = true; 107 | } 108 | }); 109 | if (failed) { 110 | process.exit(1); 111 | } else { 112 | console.log('All tests passed'); 113 | } 114 | -------------------------------------------------------------------------------- /index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | 5 | ASCII Hypercube 6 | 7 | 8 | 9 | 10 | 138 | 139 | 140 |
141 |

ASCII Hypercube

142 | 143 |
144 |
145 |

146 | Create AESTHETIC square, cube, and tesseract ASCII art, and more. 147 |

148 |

149 | You can configure each dimension with 150 | the length (number of drawn glyphs minus one), 151 | text to be drawn across line segments (which will be repeated if its shorter than the length), 152 | and the projection’s offset vector (in characters) per unit of length. 153 |

154 |
155 |
156 |

Input

157 |
158 |
159 | 160 |
161 |
162 |
163 |

Output

164 |
165 | 166 |
167 |
168 | 169 | 170 | 171 | 175 | 176 |
177 | 178 |
179 |
180 |
181 |

182 | The output is intended to be used with a monospaced font. 183 | To get monospacing on Reddit, GitHub, and other places that support Markdown, 184 | check “Format for Markdown” above, which will indent the output by four spaces. 185 | Be sure to leave blank lines on either side of the output, if including alongside other text. 186 |

187 |

188 | You may also find an option to create “code blocks” in some forums/apps/services, 189 | in the form of an icon that generally looks like 190 | a pair of angle brackets 191 | or curly brackets . 192 | Select the text to format and click this icon (where available) to get monospaced text. 193 |

194 |

195 | Recommended: make further edits by importing in ASCIIFlow Infinity 196 | (not affiliated), or my own project, Textual Paint. 197 |

198 |
199 | 205 | 206 | 207 | 208 | 209 | 210 | -------------------------------------------------------------------------------- /src/app.coffee: -------------------------------------------------------------------------------- 1 | # import {renderHypercube} from "./ascii-hypercube.js" 2 | # renderHypercube = await import("./ascii-hypercube.js").then(m => m.renderHypercube) 3 | 4 | form = document.getElementById("inputs") 5 | addDimensionButton = document.getElementById("add-dimension") 6 | outputTextarea = document.getElementById("output-textarea") 7 | copyToClipboardButton = document.getElementById("copy-to-clipboard") 8 | markdownFormatCheckbox = document.getElementById("markdown-format-checkbox") 9 | overlapSummary = document.getElementById("overlap-summary") 10 | overlapDetails = document.getElementById("overlap-details") 11 | copiedIndicator = document.getElementById("copied-to-clipboard") 12 | 13 | updateOutputArea = (output)-> 14 | if markdownFormatCheckbox.checked 15 | outputTextarea.value = output.text.split("\n").map( 16 | (str)-> str.replace(/^/g," ") 17 | ).join("\n") 18 | else 19 | outputTextarea.value = output.text 20 | 21 | style = window.getComputedStyle(outputTextarea, null) 22 | paddingTop = parseFloat(style.getPropertyValue("padding-top")) 23 | paddingBottom = parseFloat(style.getPropertyValue("padding-bottom")) 24 | 25 | outputTextarea.style.height = "1px" 26 | scrollHeight = outputTextarea.scrollHeight 27 | # outputTextarea.style.height = "#{outputTextarea.scrollHeight + 50}px" 28 | # console.log outputTextarea.scrollHeight, paddingTop, paddingBottom 29 | # outputTextarea.style.height = "#{scrollHeight + 50}px" 30 | outputTextarea.style.height = "#{scrollHeight + paddingTop + paddingBottom}px" 31 | 32 | overlapSummary.textContent = 33 | if output.numOverlaps > 0 34 | "🙈 #{output.numOverlaps} glyphs occlude differing glyphs" 35 | else 36 | "👌 all overlapping glyphs match" 37 | 38 | overlapDetails.innerHTML = 39 | if output.numOverlaps > 0 40 | "" 47 | else 48 | "Specific occluding glyphs would be listed here." 49 | 50 | # TODO: form validation 51 | 52 | splitter = new GraphemeSplitter 53 | 54 | dimensions = [ 55 | {length: 4, xPerGlyph: 2, yPerGlyph: 0, text: "CUBIC"} 56 | {length: 4, xPerGlyph: 0, yPerGlyph: 1, text: "CUBIC"} 57 | {length: 2, xPerGlyph: 2, yPerGlyph: 1, text: "\\"} 58 | {length: 0, xPerGlyph: 3, yPerGlyph: 1, text: "~"} 59 | {length: 0, xPerGlyph: -1, yPerGlyph: 1, text: "/"} 60 | ] 61 | 62 | do compute = -> 63 | 64 | # for dimension in dimensions 65 | # dimension.glyphs = splitter.splitGraphemes(dimension.text) 66 | 67 | output = renderHypercube(dimensions, splitter) 68 | 69 | updateOutputArea(output) 70 | 71 | makeDimensionRow = (ndName, dimension)-> 72 | containerEl = document.createElement("p") 73 | 74 | labelEl = document.createElement("label") 75 | textInput = document.createElement("input") 76 | textInput.type = "text" 77 | textInput.className = "text-input" 78 | textInput.value = dimension.text 79 | textInput.addEventListener "input", -> 80 | dimension.text = textInput.value 81 | lengthForText = splitter.splitGraphemes(dimension.text).length - 1 82 | if lengthForText > dimension.length 83 | dimension.length = lengthForText 84 | lengthInput.value = lengthForText 85 | compute() 86 | labelEl.appendChild(document.createTextNode("#{ndName} ")) 87 | labelEl.appendChild(document.createTextNode("Text: ")) 88 | labelEl.appendChild(textInput) 89 | containerEl.appendChild(labelEl) 90 | 91 | labelEl = document.createElement("label") 92 | lengthInput = document.createElement("input") 93 | lengthInput.type = "number" 94 | lengthInput.min = 0 95 | lengthInput.step = 1 96 | lengthInput.value = dimension.length 97 | lengthInput.required = true 98 | lengthInput.addEventListener "input", -> 99 | unless isNaN(parseInt(lengthInput.value)) 100 | dimension.length = parseInt(lengthInput.value) 101 | compute() 102 | labelEl.appendChild(document.createTextNode("Length: ")) 103 | labelEl.appendChild(lengthInput) 104 | containerEl.appendChild(labelEl) 105 | 106 | labelEl = document.createElement("label") 107 | offsetInput = document.createElement("input") 108 | offsetInput.type = "text" 109 | offsetInput.className = "vector-input" 110 | offsetInput.value = "#{dimension.xPerGlyph}, #{dimension.yPerGlyph}" 111 | offsetInput.required = true 112 | offsetInput.pattern = "-?\\d+\\s*,\\s*-?\\d+" 113 | offsetInput.addEventListener "input", -> 114 | [xStr, yStr] = offsetInput.value.split(",") 115 | unless isNaN(parseInt(xStr)) 116 | dimension.xPerGlyph = parseInt(xStr) 117 | unless isNaN(parseInt(yStr)) 118 | dimension.yPerGlyph = parseInt(yStr) 119 | compute() 120 | labelEl.appendChild(document.createTextNode("Offset per glyph: ")) 121 | labelEl.appendChild(offsetInput) 122 | containerEl.appendChild(labelEl) 123 | 124 | containerEl 125 | 126 | for dimension, i in dimensions 127 | el = makeDimensionRow("#{i + 1}D", dimension) 128 | form.appendChild(el) 129 | 130 | addDimensionButton.addEventListener "click", -> 131 | xPerGlyph = ~~(Math.random() * 5) - 2 132 | yPerGlyph = ~~(Math.random() * 5) - 2 133 | length = ~~(Math.random() * 5) + 2 134 | if xPerGlyph is 0 and yPerGlyph is 0 135 | yPerGlyph = 5 136 | dimension = {length, xPerGlyph, yPerGlyph, text: "*"} 137 | dimensions.push(dimension) 138 | el = makeDimensionRow("#{dimensions.length}D", dimension) 139 | form.appendChild(el) 140 | compute() 141 | 142 | for input in document.querySelectorAll("form input") 143 | input.addEventListener("input", compute) 144 | 145 | # Optimization: could retain output and only call updateOutputArea 146 | markdownFormatCheckbox.addEventListener("change", compute) 147 | 148 | tid = -1 149 | showCopiedIndicator = -> 150 | copiedIndicator.removeAttribute("aria-hidden") 151 | copiedIndicator.innerHTML = copiedIndicator.innerHTML 152 | clearTimeout(tid) 153 | tid = setTimeout -> 154 | copiedIndicator.setAttribute("aria-hidden", "true") 155 | , 1500 156 | 157 | setTimeout -> 158 | copiedIndicator.style.animation = "bump 0.2s 1" 159 | , 15 160 | copiedIndicator.addEventListener "animationend", -> 161 | copiedIndicator.style.animation = "none" 162 | 163 | copyToClipboardButton.addEventListener "click", -> 164 | 165 | if navigator.clipboard?.writeText 166 | navigator.clipboard.writeText(outputTextarea.value).then(showCopiedIndicator) 167 | else 168 | # Select the text field contents 169 | outputTextarea.select() 170 | # Copy the text field contents to the clipboard 171 | success = document.execCommand("copy") 172 | 173 | if success 174 | showCopiedIndicator() 175 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # ASCII HYPERCUBE 2 | Create word cubes and other [hyperrectangular] ASCII art. 3 | 4 | [Try it out `online` on this `webpage`。](https://1j01.github.io/ascii-hypercube/) 5 | 6 | [hyperrectangular]: https://en.wikipedia.org/wiki/Hyperrectangle 7 | 8 | ## Examples 9 | 10 | ### 1D 11 | 12 | N O T V E R Y I N T E R E S T I N G 13 | 14 | If you want actual wide text, use [Vaporwave Text Generator](https://lingojam.com/VaporwaveTextGenerator). 15 | 16 | ### 2D 17 | 18 | S Q U A R E S O N E → T W O ONE→TWO 19 | Q Q N N N N 20 | U M E H U E E E E 21 | A E E A ↓ ↓ ↓ ↓ 22 | R H E H R T T T T 23 | E E W W W W 24 | S Q U A R E S O N E → T W O ONE→TWO 25 | 26 | T Y P E S E T T E X T T Y P E S E T 27 | E E E E E E 28 | S S S S X X 29 | T Y P E S E T T E X T T Y P E S E T 30 | 31 | ### 3D 32 | 33 | H A H Y E A H 34 | A\ A\ 35 | H H A H Y E A H 36 | A A C U B I C 37 | Y H Y H / U / U 38 | E E C U B I C B 39 | A Y A Y U I U I 40 | H E H Y E A H E B C U B I C 41 | \A \A I / I / 42 | H A H Y E A H C U B I C 43 | 44 | ### 4D 45 | 46 | T E S S E R A C T 47 | E\ . E\ . 48 | S \ . S \ . 49 | S \ . S \ . 50 | E \ T E S S E R A C T 51 | R T E S SE\ RRA C T E\ 52 | A E . S \ A E . S \ 53 | C S .S \C S .S \ 54 | T E SSS E R E C \ S E . \ 55 | \ . E R T E S S E RRA C T 56 | \ R. A E\ R. A E 57 | \ A . C S \ A . C S 58 | \C T E SSS ECR A C T S 59 | T E S S \ R E C T \ E 60 | . \ R . \ R 61 | . \ A . \ A 62 | . \C . \C 63 | T E S S E R A C T 64 | 65 | ### 5D 66 | 67 | R A T H E R H Y P E R 68 | /A\ ~ /A\ ~ 69 | / T \ ~ / T \ ~ 70 | R AHT H E R ~ H Y P E R H \ ~ 71 | A\ ~ R A T H E R HA\ ~ E R ~ 72 | T \R ~A ~ ~ T \R ~A ~ ~ 73 | H \ / T ~ ~ ~H \ / T ~ ~ ~ 74 | E HR AHT H E R ~ H Y P EHR H ~ ~ ~ 75 | R YA ~ ~ ~ R YAR ~ T H E ~ H Y P E R 76 | PT R ~ ~ ~ PTA\R ~ ~ ~ /A\ 77 | H EH ~ ~H EHT \ ~ ~ ~ T \ 78 | Y REA H H E R ~H Y PYERRAHTHH E R H Y P E R H~ \ 79 | P / R ~Y ~ P A\RE~Y R A T H E ~ HA\ P E R 80 | E/ \ P ~ E/T \R P/A ~ T \R /A 81 | R A H HEE R ~ H Y P E R H~H\\E T ~ H~ \ / T 82 | \ ~Y R A T H E R H \E~YHRRAHT H E~R H Y P EHR H 83 | \ P ~ ~ ~ R PYA E~ ~ R YA E 84 | \E/ ~ ~ ~ \EPT ~ ~ ~ PT R 85 | R A T H E R ~ H Y P H REH ~ ~ H EH 86 | ~ ~ ~ Y RE~ H H E ~ H Y PYE RE H 87 | ~ ~ ~ P / R Y~ ~ ~ P / R Y 88 | ~ ~ E~ \ P ~ ~ E~ \ P 89 | ~ R A H HEE R H Y P E R H \E 90 | ~ \ Y R A T H E ~ H \ PYE R 91 | ~ \ P / ~ \ P / 92 | ~ \E/ ~ \E/ 93 | R A T H E R H Y P E R 94 | 95 | ## Library Usage 96 | 97 | Install with npm: 98 | 99 | ```sh 100 | npm install ascii-hypercube 101 | ``` 102 | 103 | Use in your code: 104 | ```js 105 | const { renderHypercube } = require('ascii-hypercube') 106 | 107 | const dimensions = [ 108 | { length: 4, xPerGlyph: 2, yPerGlyph: 0, text: "CUBIC" }, 109 | { length: 4, xPerGlyph: 0, yPerGlyph: 1, text: "CUBIC" }, 110 | { length: 2, xPerGlyph: -2, yPerGlyph: 1, text: "/" }, 111 | ]; 112 | const { text, numOverlaps, overlaps } = renderHypercube(dimensions); 113 | 114 | console.log(text); 115 | ``` 116 | 117 | If you want to use the browser version, you can include the [script](https://unpkg.com/ascii-hypercube) in your HTML: 118 | 119 | ```html 120 | 121 | ``` 122 | 123 | and it will define a global `renderHypercube` function. 124 | 125 | ## API 126 | 127 | ### `renderHypercube(dimensions: Dimension[], splitter?: GraphemeSplitter): { text: string, numOverlaps: number, overlaps: OverlapStats }` 128 | 129 | - `dimensions` is an array of objects with the following properties: 130 | - `length` is the number of steps **between** the first and last glyph along the dimension. It should be one less than the number of glyphs to be plotted. 131 | - `xPerGlyph` is the number of characters to move right for each plotted glyph 132 | - `yPerGlyph` is the number of characters to move down for each plotted glyph 133 | - `text` is the text to render along edges of the dimension. It is repeated if `length` is greater than **or equal to** the length of the text. 134 | - `glyphs` is an alternative to `text` if you have already split the text into graphemes. Exactly one of `text` or `glyphs` should be provided. 135 | 136 | - `splitter` is an optional [GraphemeSplitter](https://github.com/orling/grapheme-splitter) object with a `splitGraphemes` method. 137 | - When loaded in a browser, the library will try to use the global `GraphemeSplitter` if available. 138 | - In Node.js, `grapheme-splitter` is included as a dependency and will be used automatically. 139 | - If you want to use a different library or a custom implementation, you can pass it in here. 140 | 141 | - Returns an object with the following properties: 142 | - `text` is the rendered hypercube as a string 143 | - `numOverlaps` is the number of times a glyph was plotted that didn't match the glyph that was already there 144 | - `overlaps` is an object that gives statistics about the overlaps. 145 | - Each key is a glyph that was overwritten, and each value is an object with keys being overriding glyphs and values being the number of times that overlap occurred. 146 | 147 | ## CLI 148 | 149 | You can also use the command-line interface. If you have Node.js installed, you can simply use `npx` to run it: 150 | 151 | ```sh 152 | npx ascii-hypercube -d 2,0 3 'TEST' -d 0,1 3 'TEXT' -d -1,1 4 '///' 153 | ``` 154 | 155 | To install as a global command: 156 | 157 | ```sh 158 | npm install -g ascii-hypercube 159 | ``` 160 | 161 | Then you can run it without `npx`. 162 | 163 | ```HELP_OUTPUT 164 | usage: ascii-hypercube [-h] [-d TRAVEL LENGTH TEXT] [-s] 165 | 166 | CLI to render hypercubes with text along an arbitrary number of dimensions 167 | 168 | optional arguments: 169 | -h, --help show this help message and exit 170 | -d TRAVEL LENGTH TEXT, --dimension TRAVEL LENGTH TEXT 171 | Define a dimension, with travel per glyph, length of 172 | edges along the dimension, and text. Can be specified 173 | multiple times. Travel must be given as a pair of 174 | numbers with no spaces, e.g. "-1,0" or "(-1,0)" 175 | -s, --stats Print statistics about the overlaps 176 | 177 | Example: ascii-hypercube -d 2,0 11 'RATHER HYPER' -d 0,1 11 'RATHER HYPER' -d 178 | 1,1 4 '\\' -d 3,1 8 '\~' -d -1,1 3 '\/' 179 | ``` 180 | 181 | ## Development 182 | 183 | This project is written in CoffeeScript. 184 | 185 | ### Library 186 | 187 | Add tests to [`src/test.js`](src/test.js) and run them with: 188 | ```sh 189 | npm test 190 | ``` 191 | 192 | ### Web App 193 | 194 | Any static file server will do. One that auto-reloads is nice: 195 | ```sh 196 | npx live-server . 197 | ``` 198 | 199 | ### CLI 200 | 201 | Update help in this readme with: 202 | ```sh 203 | npm run update-cli-docs 204 | ``` 205 | 206 | ## License 207 | 208 | MIT-licensed; see [LICENSE](LICENSE) for details 209 | 210 | -------------------------------------------------------------------------------- /lib/grapheme-splitter.js: -------------------------------------------------------------------------------- 1 | /* 2 | Breaks a Javascript string into individual user-perceived "characters" 3 | called extended grapheme clusters by implementing the Unicode UAX-29 standard, version 10.0.0 4 | 5 | Usage: 6 | var splitter = new GraphemeSplitter(); 7 | //returns an array of strings, one string for each grapheme cluster 8 | var graphemes = splitter.splitGraphemes(string); 9 | 10 | */ 11 | function GraphemeSplitter(){ 12 | var CR = 0, 13 | LF = 1, 14 | Control = 2, 15 | Extend = 3, 16 | Regional_Indicator = 4, 17 | SpacingMark = 5, 18 | L = 6, 19 | V = 7, 20 | T = 8, 21 | LV = 9, 22 | LVT = 10, 23 | Other = 11, 24 | Prepend = 12, 25 | E_Base = 13, 26 | E_Modifier = 14, 27 | ZWJ = 15, 28 | Glue_After_Zwj = 16, 29 | E_Base_GAZ = 17; 30 | 31 | // BreakTypes 32 | var NotBreak = 0, 33 | BreakStart = 1, 34 | Break = 2, 35 | BreakLastRegional = 3, 36 | BreakPenultimateRegional = 4; 37 | 38 | function isSurrogate(str, pos) { 39 | return 0xd800 <= str.charCodeAt(pos) && str.charCodeAt(pos) <= 0xdbff && 40 | 0xdc00 <= str.charCodeAt(pos + 1) && str.charCodeAt(pos + 1) <= 0xdfff; 41 | } 42 | 43 | // Private function, gets a Unicode code point from a JavaScript UTF-16 string 44 | // handling surrogate pairs appropriately 45 | function codePointAt(str, idx){ 46 | if(idx === undefined){ 47 | idx = 0; 48 | } 49 | var code = str.charCodeAt(idx); 50 | 51 | // if a high surrogate 52 | if (0xD800 <= code && code <= 0xDBFF && 53 | idx < str.length - 1){ 54 | var hi = code; 55 | var low = str.charCodeAt(idx + 1); 56 | if (0xDC00 <= low && low <= 0xDFFF){ 57 | return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; 58 | } 59 | return hi; 60 | } 61 | 62 | // if a low surrogate 63 | if (0xDC00 <= code && code <= 0xDFFF && 64 | idx >= 1){ 65 | var hi = str.charCodeAt(idx - 1); 66 | var low = code; 67 | if (0xD800 <= hi && hi <= 0xDBFF){ 68 | return ((hi - 0xD800) * 0x400) + (low - 0xDC00) + 0x10000; 69 | } 70 | return low; 71 | } 72 | 73 | //just return the char if an unmatched surrogate half or a 74 | //single-char codepoint 75 | return code; 76 | } 77 | 78 | // Private function, returns whether a break is allowed between the 79 | // two given grapheme breaking classes 80 | function shouldBreak(start, mid, end){ 81 | var all = [start].concat(mid).concat([end]); 82 | var previous = all[all.length - 2] 83 | var next = end 84 | 85 | // Lookahead termintor for: 86 | // GB10. (E_Base | EBG) Extend* ? E_Modifier 87 | var eModifierIndex = all.lastIndexOf(E_Modifier) 88 | if(eModifierIndex > 1 && 89 | all.slice(1, eModifierIndex).every(function(c){return c == Extend}) && 90 | [Extend, E_Base, E_Base_GAZ].indexOf(start) == -1){ 91 | return Break 92 | } 93 | 94 | // Lookahead termintor for: 95 | // GB12. ^ (RI RI)* RI ? RI 96 | // GB13. [^RI] (RI RI)* RI ? RI 97 | var rIIndex = all.lastIndexOf(Regional_Indicator) 98 | if(rIIndex > 0 && 99 | all.slice(1, rIIndex).every(function(c){return c == Regional_Indicator}) && 100 | [Prepend, Regional_Indicator].indexOf(previous) == -1) { 101 | if(all.filter(function(c){return c == Regional_Indicator}).length % 2 == 1) { 102 | return BreakLastRegional 103 | } 104 | else { 105 | return BreakPenultimateRegional 106 | } 107 | } 108 | 109 | // GB3. CR X LF 110 | if(previous == CR && next == LF){ 111 | return NotBreak; 112 | } 113 | // GB4. (Control|CR|LF) ÷ 114 | else if(previous == Control || previous == CR || previous == LF){ 115 | if(next == E_Modifier && mid.every(function(c){return c == Extend})){ 116 | return Break 117 | } 118 | else { 119 | return BreakStart 120 | } 121 | } 122 | // GB5. ÷ (Control|CR|LF) 123 | else if(next == Control || next == CR || next == LF){ 124 | return BreakStart; 125 | } 126 | // GB6. L X (L|V|LV|LVT) 127 | else if(previous == L && 128 | (next == L || next == V || next == LV || next == LVT)){ 129 | return NotBreak; 130 | } 131 | // GB7. (LV|V) X (V|T) 132 | else if((previous == LV || previous == V) && 133 | (next == V || next == T)){ 134 | return NotBreak; 135 | } 136 | // GB8. (LVT|T) X (T) 137 | else if((previous == LVT || previous == T) && 138 | next == T){ 139 | return NotBreak; 140 | } 141 | // GB9. X (Extend|ZWJ) 142 | else if (next == Extend || next == ZWJ){ 143 | return NotBreak; 144 | } 145 | // GB9a. X SpacingMark 146 | else if(next == SpacingMark){ 147 | return NotBreak; 148 | } 149 | // GB9b. Prepend X 150 | else if (previous == Prepend){ 151 | return NotBreak; 152 | } 153 | 154 | // GB10. (E_Base | EBG) Extend* ? E_Modifier 155 | var previousNonExtendIndex = all.indexOf(Extend) != -1 ? all.lastIndexOf(Extend) - 1 : all.length - 2; 156 | if([E_Base, E_Base_GAZ].indexOf(all[previousNonExtendIndex]) != -1 && 157 | all.slice(previousNonExtendIndex + 1, -1).every(function(c){return c == Extend}) && 158 | next == E_Modifier){ 159 | return NotBreak; 160 | } 161 | 162 | // GB11. ZWJ ? (Glue_After_Zwj | EBG) 163 | if(previous == ZWJ && [Glue_After_Zwj, E_Base_GAZ].indexOf(next) != -1) { 164 | return NotBreak; 165 | } 166 | 167 | // GB12. ^ (RI RI)* RI ? RI 168 | // GB13. [^RI] (RI RI)* RI ? RI 169 | if(mid.indexOf(Regional_Indicator) != -1) { 170 | return Break; 171 | } 172 | if(previous == Regional_Indicator && next == Regional_Indicator) { 173 | return NotBreak; 174 | } 175 | 176 | // GB999. Any ? Any 177 | return BreakStart; 178 | } 179 | 180 | // Returns the next grapheme break in the string after the given index 181 | this.nextBreak = function(string, index){ 182 | if(index === undefined){ 183 | index = 0; 184 | } 185 | if(index < 0){ 186 | return 0; 187 | } 188 | if(index >= string.length - 1){ 189 | return string.length; 190 | } 191 | var prev = getGraphemeBreakProperty(codePointAt(string, index)); 192 | var mid = [] 193 | for (var i = index + 1; i < string.length; i++) { 194 | // check for already processed low surrogates 195 | if(isSurrogate(string, i - 1)){ 196 | continue; 197 | } 198 | 199 | var next = getGraphemeBreakProperty(codePointAt(string, i)); 200 | if(shouldBreak(prev, mid, next)){ 201 | return i; 202 | } 203 | 204 | mid.push(next); 205 | } 206 | return string.length; 207 | }; 208 | 209 | // Breaks the given string into an array of grapheme cluster strings 210 | this.splitGraphemes = function(str){ 211 | var res = []; 212 | var index = 0; 213 | var brk; 214 | while((brk = this.nextBreak(str, index)) < str.length){ 215 | res.push(str.slice(index, brk)); 216 | index = brk; 217 | } 218 | if(index < str.length){ 219 | res.push(str.slice(index)); 220 | } 221 | return res; 222 | }; 223 | 224 | // Returns the number of grapheme clusters there are in the given string 225 | this.countGraphemes = function(str){ 226 | var count = 0; 227 | var index = 0; 228 | var brk; 229 | while((brk = this.nextBreak(str, index)) < str.length){ 230 | index = brk; 231 | count++; 232 | } 233 | if(index < str.length){ 234 | count++; 235 | } 236 | return count; 237 | }; 238 | 239 | //given a Unicode code point, determines this symbol's grapheme break property 240 | function getGraphemeBreakProperty(code){ 241 | 242 | //grapheme break property for Unicode 10.0.0, 243 | //taken from http://www.unicode.org/Public/10.0.0/ucd/auxiliary/GraphemeBreakProperty.txt 244 | //and adapted to JavaScript rules 245 | 246 | if( 247 | (0x0600 <= code && code <= 0x0605) || // Cf [6] ARABIC NUMBER SIGN..ARABIC NUMBER MARK ABOVE 248 | 0x06DD == code || // Cf ARABIC END OF AYAH 249 | 0x070F == code || // Cf SYRIAC ABBREVIATION MARK 250 | 0x08E2 == code || // Cf ARABIC DISPUTED END OF AYAH 251 | 0x0D4E == code || // Lo MALAYALAM LETTER DOT REPH 252 | 0x110BD == code || // Cf KAITHI NUMBER SIGN 253 | (0x111C2 <= code && code <= 0x111C3) || // Lo [2] SHARADA SIGN JIHVAMULIYA..SHARADA SIGN UPADHMANIYA 254 | 0x11A3A == code || // Lo ZANABAZAR SQUARE CLUSTER-INITIAL LETTER RA 255 | (0x11A86 <= code && code <= 0x11A89) || // Lo [4] SOYOMBO CLUSTER-INITIAL LETTER RA..SOYOMBO CLUSTER-INITIAL LETTER SA 256 | 0x11D46 == code // Lo MASARAM GONDI REPHA 257 | ){ 258 | return Prepend; 259 | } 260 | if( 261 | 0x000D == code // Cc 262 | ){ 263 | return CR; 264 | } 265 | 266 | if( 267 | 0x000A == code // Cc 268 | ){ 269 | return LF; 270 | } 271 | 272 | 273 | if( 274 | (0x0000 <= code && code <= 0x0009) || // Cc [10] .. 275 | (0x000B <= code && code <= 0x000C) || // Cc [2] .. 276 | (0x000E <= code && code <= 0x001F) || // Cc [18] .. 277 | (0x007F <= code && code <= 0x009F) || // Cc [33] .. 278 | 0x00AD == code || // Cf SOFT HYPHEN 279 | 0x061C == code || // Cf ARABIC LETTER MARK 280 | 281 | 0x180E == code || // Cf MONGOLIAN VOWEL SEPARATOR 282 | 0x200B == code || // Cf ZERO WIDTH SPACE 283 | (0x200E <= code && code <= 0x200F) || // Cf [2] LEFT-TO-RIGHT MARK..RIGHT-TO-LEFT MARK 284 | 0x2028 == code || // Zl LINE SEPARATOR 285 | 0x2029 == code || // Zp PARAGRAPH SEPARATOR 286 | (0x202A <= code && code <= 0x202E) || // Cf [5] LEFT-TO-RIGHT EMBEDDING..RIGHT-TO-LEFT OVERRIDE 287 | (0x2060 <= code && code <= 0x2064) || // Cf [5] WORD JOINER..INVISIBLE PLUS 288 | 0x2065 == code || // Cn 289 | (0x2066 <= code && code <= 0x206F) || // Cf [10] LEFT-TO-RIGHT ISOLATE..NOMINAL DIGIT SHAPES 290 | (0xD800 <= code && code <= 0xDFFF) || // Cs [2048] .. 291 | 0xFEFF == code || // Cf ZERO WIDTH NO-BREAK SPACE 292 | (0xFFF0 <= code && code <= 0xFFF8) || // Cn [9] .. 293 | (0xFFF9 <= code && code <= 0xFFFB) || // Cf [3] INTERLINEAR ANNOTATION ANCHOR..INTERLINEAR ANNOTATION TERMINATOR 294 | (0x1BCA0 <= code && code <= 0x1BCA3) || // Cf [4] SHORTHAND FORMAT LETTER OVERLAP..SHORTHAND FORMAT UP STEP 295 | (0x1D173 <= code && code <= 0x1D17A) || // Cf [8] MUSICAL SYMBOL BEGIN BEAM..MUSICAL SYMBOL END PHRASE 296 | 0xE0000 == code || // Cn 297 | 0xE0001 == code || // Cf LANGUAGE TAG 298 | (0xE0002 <= code && code <= 0xE001F) || // Cn [30] .. 299 | (0xE0080 <= code && code <= 0xE00FF) || // Cn [128] .. 300 | (0xE01F0 <= code && code <= 0xE0FFF) // Cn [3600] .. 301 | ){ 302 | return Control; 303 | } 304 | 305 | 306 | if( 307 | (0x0300 <= code && code <= 0x036F) || // Mn [112] COMBINING GRAVE ACCENT..COMBINING LATIN SMALL LETTER X 308 | (0x0483 <= code && code <= 0x0487) || // Mn [5] COMBINING CYRILLIC TITLO..COMBINING CYRILLIC POKRYTIE 309 | (0x0488 <= code && code <= 0x0489) || // Me [2] COMBINING CYRILLIC HUNDRED THOUSANDS SIGN..COMBINING CYRILLIC MILLIONS SIGN 310 | (0x0591 <= code && code <= 0x05BD) || // Mn [45] HEBREW ACCENT ETNAHTA..HEBREW POINT METEG 311 | 0x05BF == code || // Mn HEBREW POINT RAFE 312 | (0x05C1 <= code && code <= 0x05C2) || // Mn [2] HEBREW POINT SHIN DOT..HEBREW POINT SIN DOT 313 | (0x05C4 <= code && code <= 0x05C5) || // Mn [2] HEBREW MARK UPPER DOT..HEBREW MARK LOWER DOT 314 | 0x05C7 == code || // Mn HEBREW POINT QAMATS QATAN 315 | (0x0610 <= code && code <= 0x061A) || // Mn [11] ARABIC SIGN SALLALLAHOU ALAYHE WASSALLAM..ARABIC SMALL KASRA 316 | (0x064B <= code && code <= 0x065F) || // Mn [21] ARABIC FATHATAN..ARABIC WAVY HAMZA BELOW 317 | 0x0670 == code || // Mn ARABIC LETTER SUPERSCRIPT ALEF 318 | (0x06D6 <= code && code <= 0x06DC) || // Mn [7] ARABIC SMALL HIGH LIGATURE SAD WITH LAM WITH ALEF MAKSURA..ARABIC SMALL HIGH SEEN 319 | (0x06DF <= code && code <= 0x06E4) || // Mn [6] ARABIC SMALL HIGH ROUNDED ZERO..ARABIC SMALL HIGH MADDA 320 | (0x06E7 <= code && code <= 0x06E8) || // Mn [2] ARABIC SMALL HIGH YEH..ARABIC SMALL HIGH NOON 321 | (0x06EA <= code && code <= 0x06ED) || // Mn [4] ARABIC EMPTY CENTRE LOW STOP..ARABIC SMALL LOW MEEM 322 | 0x0711 == code || // Mn SYRIAC LETTER SUPERSCRIPT ALAPH 323 | (0x0730 <= code && code <= 0x074A) || // Mn [27] SYRIAC PTHAHA ABOVE..SYRIAC BARREKH 324 | (0x07A6 <= code && code <= 0x07B0) || // Mn [11] THAANA ABAFILI..THAANA SUKUN 325 | (0x07EB <= code && code <= 0x07F3) || // Mn [9] NKO COMBINING SHORT HIGH TONE..NKO COMBINING DOUBLE DOT ABOVE 326 | (0x0816 <= code && code <= 0x0819) || // Mn [4] SAMARITAN MARK IN..SAMARITAN MARK DAGESH 327 | (0x081B <= code && code <= 0x0823) || // Mn [9] SAMARITAN MARK EPENTHETIC YUT..SAMARITAN VOWEL SIGN A 328 | (0x0825 <= code && code <= 0x0827) || // Mn [3] SAMARITAN VOWEL SIGN SHORT A..SAMARITAN VOWEL SIGN U 329 | (0x0829 <= code && code <= 0x082D) || // Mn [5] SAMARITAN VOWEL SIGN LONG I..SAMARITAN MARK NEQUDAA 330 | (0x0859 <= code && code <= 0x085B) || // Mn [3] MANDAIC AFFRICATION MARK..MANDAIC GEMINATION MARK 331 | (0x08D4 <= code && code <= 0x08E1) || // Mn [14] ARABIC SMALL HIGH WORD AR-RUB..ARABIC SMALL HIGH SIGN SAFHA 332 | (0x08E3 <= code && code <= 0x0902) || // Mn [32] ARABIC TURNED DAMMA BELOW..DEVANAGARI SIGN ANUSVARA 333 | 0x093A == code || // Mn DEVANAGARI VOWEL SIGN OE 334 | 0x093C == code || // Mn DEVANAGARI SIGN NUKTA 335 | (0x0941 <= code && code <= 0x0948) || // Mn [8] DEVANAGARI VOWEL SIGN U..DEVANAGARI VOWEL SIGN AI 336 | 0x094D == code || // Mn DEVANAGARI SIGN VIRAMA 337 | (0x0951 <= code && code <= 0x0957) || // Mn [7] DEVANAGARI STRESS SIGN UDATTA..DEVANAGARI VOWEL SIGN UUE 338 | (0x0962 <= code && code <= 0x0963) || // Mn [2] DEVANAGARI VOWEL SIGN VOCALIC L..DEVANAGARI VOWEL SIGN VOCALIC LL 339 | 0x0981 == code || // Mn BENGALI SIGN CANDRABINDU 340 | 0x09BC == code || // Mn BENGALI SIGN NUKTA 341 | 0x09BE == code || // Mc BENGALI VOWEL SIGN AA 342 | (0x09C1 <= code && code <= 0x09C4) || // Mn [4] BENGALI VOWEL SIGN U..BENGALI VOWEL SIGN VOCALIC RR 343 | 0x09CD == code || // Mn BENGALI SIGN VIRAMA 344 | 0x09D7 == code || // Mc BENGALI AU LENGTH MARK 345 | (0x09E2 <= code && code <= 0x09E3) || // Mn [2] BENGALI VOWEL SIGN VOCALIC L..BENGALI VOWEL SIGN VOCALIC LL 346 | (0x0A01 <= code && code <= 0x0A02) || // Mn [2] GURMUKHI SIGN ADAK BINDI..GURMUKHI SIGN BINDI 347 | 0x0A3C == code || // Mn GURMUKHI SIGN NUKTA 348 | (0x0A41 <= code && code <= 0x0A42) || // Mn [2] GURMUKHI VOWEL SIGN U..GURMUKHI VOWEL SIGN UU 349 | (0x0A47 <= code && code <= 0x0A48) || // Mn [2] GURMUKHI VOWEL SIGN EE..GURMUKHI VOWEL SIGN AI 350 | (0x0A4B <= code && code <= 0x0A4D) || // Mn [3] GURMUKHI VOWEL SIGN OO..GURMUKHI SIGN VIRAMA 351 | 0x0A51 == code || // Mn GURMUKHI SIGN UDAAT 352 | (0x0A70 <= code && code <= 0x0A71) || // Mn [2] GURMUKHI TIPPI..GURMUKHI ADDAK 353 | 0x0A75 == code || // Mn GURMUKHI SIGN YAKASH 354 | (0x0A81 <= code && code <= 0x0A82) || // Mn [2] GUJARATI SIGN CANDRABINDU..GUJARATI SIGN ANUSVARA 355 | 0x0ABC == code || // Mn GUJARATI SIGN NUKTA 356 | (0x0AC1 <= code && code <= 0x0AC5) || // Mn [5] GUJARATI VOWEL SIGN U..GUJARATI VOWEL SIGN CANDRA E 357 | (0x0AC7 <= code && code <= 0x0AC8) || // Mn [2] GUJARATI VOWEL SIGN E..GUJARATI VOWEL SIGN AI 358 | 0x0ACD == code || // Mn GUJARATI SIGN VIRAMA 359 | (0x0AE2 <= code && code <= 0x0AE3) || // Mn [2] GUJARATI VOWEL SIGN VOCALIC L..GUJARATI VOWEL SIGN VOCALIC LL 360 | (0x0AFA <= code && code <= 0x0AFF) || // Mn [6] GUJARATI SIGN SUKUN..GUJARATI SIGN TWO-CIRCLE NUKTA ABOVE 361 | 0x0B01 == code || // Mn ORIYA SIGN CANDRABINDU 362 | 0x0B3C == code || // Mn ORIYA SIGN NUKTA 363 | 0x0B3E == code || // Mc ORIYA VOWEL SIGN AA 364 | 0x0B3F == code || // Mn ORIYA VOWEL SIGN I 365 | (0x0B41 <= code && code <= 0x0B44) || // Mn [4] ORIYA VOWEL SIGN U..ORIYA VOWEL SIGN VOCALIC RR 366 | 0x0B4D == code || // Mn ORIYA SIGN VIRAMA 367 | 0x0B56 == code || // Mn ORIYA AI LENGTH MARK 368 | 0x0B57 == code || // Mc ORIYA AU LENGTH MARK 369 | (0x0B62 <= code && code <= 0x0B63) || // Mn [2] ORIYA VOWEL SIGN VOCALIC L..ORIYA VOWEL SIGN VOCALIC LL 370 | 0x0B82 == code || // Mn TAMIL SIGN ANUSVARA 371 | 0x0BBE == code || // Mc TAMIL VOWEL SIGN AA 372 | 0x0BC0 == code || // Mn TAMIL VOWEL SIGN II 373 | 0x0BCD == code || // Mn TAMIL SIGN VIRAMA 374 | 0x0BD7 == code || // Mc TAMIL AU LENGTH MARK 375 | 0x0C00 == code || // Mn TELUGU SIGN COMBINING CANDRABINDU ABOVE 376 | (0x0C3E <= code && code <= 0x0C40) || // Mn [3] TELUGU VOWEL SIGN AA..TELUGU VOWEL SIGN II 377 | (0x0C46 <= code && code <= 0x0C48) || // Mn [3] TELUGU VOWEL SIGN E..TELUGU VOWEL SIGN AI 378 | (0x0C4A <= code && code <= 0x0C4D) || // Mn [4] TELUGU VOWEL SIGN O..TELUGU SIGN VIRAMA 379 | (0x0C55 <= code && code <= 0x0C56) || // Mn [2] TELUGU LENGTH MARK..TELUGU AI LENGTH MARK 380 | (0x0C62 <= code && code <= 0x0C63) || // Mn [2] TELUGU VOWEL SIGN VOCALIC L..TELUGU VOWEL SIGN VOCALIC LL 381 | 0x0C81 == code || // Mn KANNADA SIGN CANDRABINDU 382 | 0x0CBC == code || // Mn KANNADA SIGN NUKTA 383 | 0x0CBF == code || // Mn KANNADA VOWEL SIGN I 384 | 0x0CC2 == code || // Mc KANNADA VOWEL SIGN UU 385 | 0x0CC6 == code || // Mn KANNADA VOWEL SIGN E 386 | (0x0CCC <= code && code <= 0x0CCD) || // Mn [2] KANNADA VOWEL SIGN AU..KANNADA SIGN VIRAMA 387 | (0x0CD5 <= code && code <= 0x0CD6) || // Mc [2] KANNADA LENGTH MARK..KANNADA AI LENGTH MARK 388 | (0x0CE2 <= code && code <= 0x0CE3) || // Mn [2] KANNADA VOWEL SIGN VOCALIC L..KANNADA VOWEL SIGN VOCALIC LL 389 | (0x0D00 <= code && code <= 0x0D01) || // Mn [2] MALAYALAM SIGN COMBINING ANUSVARA ABOVE..MALAYALAM SIGN CANDRABINDU 390 | (0x0D3B <= code && code <= 0x0D3C) || // Mn [2] MALAYALAM SIGN VERTICAL BAR VIRAMA..MALAYALAM SIGN CIRCULAR VIRAMA 391 | 0x0D3E == code || // Mc MALAYALAM VOWEL SIGN AA 392 | (0x0D41 <= code && code <= 0x0D44) || // Mn [4] MALAYALAM VOWEL SIGN U..MALAYALAM VOWEL SIGN VOCALIC RR 393 | 0x0D4D == code || // Mn MALAYALAM SIGN VIRAMA 394 | 0x0D57 == code || // Mc MALAYALAM AU LENGTH MARK 395 | (0x0D62 <= code && code <= 0x0D63) || // Mn [2] MALAYALAM VOWEL SIGN VOCALIC L..MALAYALAM VOWEL SIGN VOCALIC LL 396 | 0x0DCA == code || // Mn SINHALA SIGN AL-LAKUNA 397 | 0x0DCF == code || // Mc SINHALA VOWEL SIGN AELA-PILLA 398 | (0x0DD2 <= code && code <= 0x0DD4) || // Mn [3] SINHALA VOWEL SIGN KETTI IS-PILLA..SINHALA VOWEL SIGN KETTI PAA-PILLA 399 | 0x0DD6 == code || // Mn SINHALA VOWEL SIGN DIGA PAA-PILLA 400 | 0x0DDF == code || // Mc SINHALA VOWEL SIGN GAYANUKITTA 401 | 0x0E31 == code || // Mn THAI CHARACTER MAI HAN-AKAT 402 | (0x0E34 <= code && code <= 0x0E3A) || // Mn [7] THAI CHARACTER SARA I..THAI CHARACTER PHINTHU 403 | (0x0E47 <= code && code <= 0x0E4E) || // Mn [8] THAI CHARACTER MAITAIKHU..THAI CHARACTER YAMAKKAN 404 | 0x0EB1 == code || // Mn LAO VOWEL SIGN MAI KAN 405 | (0x0EB4 <= code && code <= 0x0EB9) || // Mn [6] LAO VOWEL SIGN I..LAO VOWEL SIGN UU 406 | (0x0EBB <= code && code <= 0x0EBC) || // Mn [2] LAO VOWEL SIGN MAI KON..LAO SEMIVOWEL SIGN LO 407 | (0x0EC8 <= code && code <= 0x0ECD) || // Mn [6] LAO TONE MAI EK..LAO NIGGAHITA 408 | (0x0F18 <= code && code <= 0x0F19) || // Mn [2] TIBETAN ASTROLOGICAL SIGN -KHYUD PA..TIBETAN ASTROLOGICAL SIGN SDONG TSHUGS 409 | 0x0F35 == code || // Mn TIBETAN MARK NGAS BZUNG NYI ZLA 410 | 0x0F37 == code || // Mn TIBETAN MARK NGAS BZUNG SGOR RTAGS 411 | 0x0F39 == code || // Mn TIBETAN MARK TSA -PHRU 412 | (0x0F71 <= code && code <= 0x0F7E) || // Mn [14] TIBETAN VOWEL SIGN AA..TIBETAN SIGN RJES SU NGA RO 413 | (0x0F80 <= code && code <= 0x0F84) || // Mn [5] TIBETAN VOWEL SIGN REVERSED I..TIBETAN MARK HALANTA 414 | (0x0F86 <= code && code <= 0x0F87) || // Mn [2] TIBETAN SIGN LCI RTAGS..TIBETAN SIGN YANG RTAGS 415 | (0x0F8D <= code && code <= 0x0F97) || // Mn [11] TIBETAN SUBJOINED SIGN LCE TSA CAN..TIBETAN SUBJOINED LETTER JA 416 | (0x0F99 <= code && code <= 0x0FBC) || // Mn [36] TIBETAN SUBJOINED LETTER NYA..TIBETAN SUBJOINED LETTER FIXED-FORM RA 417 | 0x0FC6 == code || // Mn TIBETAN SYMBOL PADMA GDAN 418 | (0x102D <= code && code <= 0x1030) || // Mn [4] MYANMAR VOWEL SIGN I..MYANMAR VOWEL SIGN UU 419 | (0x1032 <= code && code <= 0x1037) || // Mn [6] MYANMAR VOWEL SIGN AI..MYANMAR SIGN DOT BELOW 420 | (0x1039 <= code && code <= 0x103A) || // Mn [2] MYANMAR SIGN VIRAMA..MYANMAR SIGN ASAT 421 | (0x103D <= code && code <= 0x103E) || // Mn [2] MYANMAR CONSONANT SIGN MEDIAL WA..MYANMAR CONSONANT SIGN MEDIAL HA 422 | (0x1058 <= code && code <= 0x1059) || // Mn [2] MYANMAR VOWEL SIGN VOCALIC L..MYANMAR VOWEL SIGN VOCALIC LL 423 | (0x105E <= code && code <= 0x1060) || // Mn [3] MYANMAR CONSONANT SIGN MON MEDIAL NA..MYANMAR CONSONANT SIGN MON MEDIAL LA 424 | (0x1071 <= code && code <= 0x1074) || // Mn [4] MYANMAR VOWEL SIGN GEBA KAREN I..MYANMAR VOWEL SIGN KAYAH EE 425 | 0x1082 == code || // Mn MYANMAR CONSONANT SIGN SHAN MEDIAL WA 426 | (0x1085 <= code && code <= 0x1086) || // Mn [2] MYANMAR VOWEL SIGN SHAN E ABOVE..MYANMAR VOWEL SIGN SHAN FINAL Y 427 | 0x108D == code || // Mn MYANMAR SIGN SHAN COUNCIL EMPHATIC TONE 428 | 0x109D == code || // Mn MYANMAR VOWEL SIGN AITON AI 429 | (0x135D <= code && code <= 0x135F) || // Mn [3] ETHIOPIC COMBINING GEMINATION AND VOWEL LENGTH MARK..ETHIOPIC COMBINING GEMINATION MARK 430 | (0x1712 <= code && code <= 0x1714) || // Mn [3] TAGALOG VOWEL SIGN I..TAGALOG SIGN VIRAMA 431 | (0x1732 <= code && code <= 0x1734) || // Mn [3] HANUNOO VOWEL SIGN I..HANUNOO SIGN PAMUDPOD 432 | (0x1752 <= code && code <= 0x1753) || // Mn [2] BUHID VOWEL SIGN I..BUHID VOWEL SIGN U 433 | (0x1772 <= code && code <= 0x1773) || // Mn [2] TAGBANWA VOWEL SIGN I..TAGBANWA VOWEL SIGN U 434 | (0x17B4 <= code && code <= 0x17B5) || // Mn [2] KHMER VOWEL INHERENT AQ..KHMER VOWEL INHERENT AA 435 | (0x17B7 <= code && code <= 0x17BD) || // Mn [7] KHMER VOWEL SIGN I..KHMER VOWEL SIGN UA 436 | 0x17C6 == code || // Mn KHMER SIGN NIKAHIT 437 | (0x17C9 <= code && code <= 0x17D3) || // Mn [11] KHMER SIGN MUUSIKATOAN..KHMER SIGN BATHAMASAT 438 | 0x17DD == code || // Mn KHMER SIGN ATTHACAN 439 | (0x180B <= code && code <= 0x180D) || // Mn [3] MONGOLIAN FREE VARIATION SELECTOR ONE..MONGOLIAN FREE VARIATION SELECTOR THREE 440 | (0x1885 <= code && code <= 0x1886) || // Mn [2] MONGOLIAN LETTER ALI GALI BALUDA..MONGOLIAN LETTER ALI GALI THREE BALUDA 441 | 0x18A9 == code || // Mn MONGOLIAN LETTER ALI GALI DAGALGA 442 | (0x1920 <= code && code <= 0x1922) || // Mn [3] LIMBU VOWEL SIGN A..LIMBU VOWEL SIGN U 443 | (0x1927 <= code && code <= 0x1928) || // Mn [2] LIMBU VOWEL SIGN E..LIMBU VOWEL SIGN O 444 | 0x1932 == code || // Mn LIMBU SMALL LETTER ANUSVARA 445 | (0x1939 <= code && code <= 0x193B) || // Mn [3] LIMBU SIGN MUKPHRENG..LIMBU SIGN SA-I 446 | (0x1A17 <= code && code <= 0x1A18) || // Mn [2] BUGINESE VOWEL SIGN I..BUGINESE VOWEL SIGN U 447 | 0x1A1B == code || // Mn BUGINESE VOWEL SIGN AE 448 | 0x1A56 == code || // Mn TAI THAM CONSONANT SIGN MEDIAL LA 449 | (0x1A58 <= code && code <= 0x1A5E) || // Mn [7] TAI THAM SIGN MAI KANG LAI..TAI THAM CONSONANT SIGN SA 450 | 0x1A60 == code || // Mn TAI THAM SIGN SAKOT 451 | 0x1A62 == code || // Mn TAI THAM VOWEL SIGN MAI SAT 452 | (0x1A65 <= code && code <= 0x1A6C) || // Mn [8] TAI THAM VOWEL SIGN I..TAI THAM VOWEL SIGN OA BELOW 453 | (0x1A73 <= code && code <= 0x1A7C) || // Mn [10] TAI THAM VOWEL SIGN OA ABOVE..TAI THAM SIGN KHUEN-LUE KARAN 454 | 0x1A7F == code || // Mn TAI THAM COMBINING CRYPTOGRAMMIC DOT 455 | (0x1AB0 <= code && code <= 0x1ABD) || // Mn [14] COMBINING DOUBLED CIRCUMFLEX ACCENT..COMBINING PARENTHESES BELOW 456 | 0x1ABE == code || // Me COMBINING PARENTHESES OVERLAY 457 | (0x1B00 <= code && code <= 0x1B03) || // Mn [4] BALINESE SIGN ULU RICEM..BALINESE SIGN SURANG 458 | 0x1B34 == code || // Mn BALINESE SIGN REREKAN 459 | (0x1B36 <= code && code <= 0x1B3A) || // Mn [5] BALINESE VOWEL SIGN ULU..BALINESE VOWEL SIGN RA REPA 460 | 0x1B3C == code || // Mn BALINESE VOWEL SIGN LA LENGA 461 | 0x1B42 == code || // Mn BALINESE VOWEL SIGN PEPET 462 | (0x1B6B <= code && code <= 0x1B73) || // Mn [9] BALINESE MUSICAL SYMBOL COMBINING TEGEH..BALINESE MUSICAL SYMBOL COMBINING GONG 463 | (0x1B80 <= code && code <= 0x1B81) || // Mn [2] SUNDANESE SIGN PANYECEK..SUNDANESE SIGN PANGLAYAR 464 | (0x1BA2 <= code && code <= 0x1BA5) || // Mn [4] SUNDANESE CONSONANT SIGN PANYAKRA..SUNDANESE VOWEL SIGN PANYUKU 465 | (0x1BA8 <= code && code <= 0x1BA9) || // Mn [2] SUNDANESE VOWEL SIGN PAMEPET..SUNDANESE VOWEL SIGN PANEULEUNG 466 | (0x1BAB <= code && code <= 0x1BAD) || // Mn [3] SUNDANESE SIGN VIRAMA..SUNDANESE CONSONANT SIGN PASANGAN WA 467 | 0x1BE6 == code || // Mn BATAK SIGN TOMPI 468 | (0x1BE8 <= code && code <= 0x1BE9) || // Mn [2] BATAK VOWEL SIGN PAKPAK E..BATAK VOWEL SIGN EE 469 | 0x1BED == code || // Mn BATAK VOWEL SIGN KARO O 470 | (0x1BEF <= code && code <= 0x1BF1) || // Mn [3] BATAK VOWEL SIGN U FOR SIMALUNGUN SA..BATAK CONSONANT SIGN H 471 | (0x1C2C <= code && code <= 0x1C33) || // Mn [8] LEPCHA VOWEL SIGN E..LEPCHA CONSONANT SIGN T 472 | (0x1C36 <= code && code <= 0x1C37) || // Mn [2] LEPCHA SIGN RAN..LEPCHA SIGN NUKTA 473 | (0x1CD0 <= code && code <= 0x1CD2) || // Mn [3] VEDIC TONE KARSHANA..VEDIC TONE PRENKHA 474 | (0x1CD4 <= code && code <= 0x1CE0) || // Mn [13] VEDIC SIGN YAJURVEDIC MIDLINE SVARITA..VEDIC TONE RIGVEDIC KASHMIRI INDEPENDENT SVARITA 475 | (0x1CE2 <= code && code <= 0x1CE8) || // Mn [7] VEDIC SIGN VISARGA SVARITA..VEDIC SIGN VISARGA ANUDATTA WITH TAIL 476 | 0x1CED == code || // Mn VEDIC SIGN TIRYAK 477 | 0x1CF4 == code || // Mn VEDIC TONE CANDRA ABOVE 478 | (0x1CF8 <= code && code <= 0x1CF9) || // Mn [2] VEDIC TONE RING ABOVE..VEDIC TONE DOUBLE RING ABOVE 479 | (0x1DC0 <= code && code <= 0x1DF9) || // Mn [58] COMBINING DOTTED GRAVE ACCENT..COMBINING WIDE INVERTED BRIDGE BELOW 480 | (0x1DFB <= code && code <= 0x1DFF) || // Mn [5] COMBINING DELETION MARK..COMBINING RIGHT ARROWHEAD AND DOWN ARROWHEAD BELOW 481 | 0x200C == code || // Cf ZERO WIDTH NON-JOINER 482 | (0x20D0 <= code && code <= 0x20DC) || // Mn [13] COMBINING LEFT HARPOON ABOVE..COMBINING FOUR DOTS ABOVE 483 | (0x20DD <= code && code <= 0x20E0) || // Me [4] COMBINING ENCLOSING CIRCLE..COMBINING ENCLOSING CIRCLE BACKSLASH 484 | 0x20E1 == code || // Mn COMBINING LEFT RIGHT ARROW ABOVE 485 | (0x20E2 <= code && code <= 0x20E4) || // Me [3] COMBINING ENCLOSING SCREEN..COMBINING ENCLOSING UPWARD POINTING TRIANGLE 486 | (0x20E5 <= code && code <= 0x20F0) || // Mn [12] COMBINING REVERSE SOLIDUS OVERLAY..COMBINING ASTERISK ABOVE 487 | (0x2CEF <= code && code <= 0x2CF1) || // Mn [3] COPTIC COMBINING NI ABOVE..COPTIC COMBINING SPIRITUS LENIS 488 | 0x2D7F == code || // Mn TIFINAGH CONSONANT JOINER 489 | (0x2DE0 <= code && code <= 0x2DFF) || // Mn [32] COMBINING CYRILLIC LETTER BE..COMBINING CYRILLIC LETTER IOTIFIED BIG YUS 490 | (0x302A <= code && code <= 0x302D) || // Mn [4] IDEOGRAPHIC LEVEL TONE MARK..IDEOGRAPHIC ENTERING TONE MARK 491 | (0x302E <= code && code <= 0x302F) || // Mc [2] HANGUL SINGLE DOT TONE MARK..HANGUL DOUBLE DOT TONE MARK 492 | (0x3099 <= code && code <= 0x309A) || // Mn [2] COMBINING KATAKANA-HIRAGANA VOICED SOUND MARK..COMBINING KATAKANA-HIRAGANA SEMI-VOICED SOUND MARK 493 | 0xA66F == code || // Mn COMBINING CYRILLIC VZMET 494 | (0xA670 <= code && code <= 0xA672) || // Me [3] COMBINING CYRILLIC TEN MILLIONS SIGN..COMBINING CYRILLIC THOUSAND MILLIONS SIGN 495 | (0xA674 <= code && code <= 0xA67D) || // Mn [10] COMBINING CYRILLIC LETTER UKRAINIAN IE..COMBINING CYRILLIC PAYEROK 496 | (0xA69E <= code && code <= 0xA69F) || // Mn [2] COMBINING CYRILLIC LETTER EF..COMBINING CYRILLIC LETTER IOTIFIED E 497 | (0xA6F0 <= code && code <= 0xA6F1) || // Mn [2] BAMUM COMBINING MARK KOQNDON..BAMUM COMBINING MARK TUKWENTIS 498 | 0xA802 == code || // Mn SYLOTI NAGRI SIGN DVISVARA 499 | 0xA806 == code || // Mn SYLOTI NAGRI SIGN HASANTA 500 | 0xA80B == code || // Mn SYLOTI NAGRI SIGN ANUSVARA 501 | (0xA825 <= code && code <= 0xA826) || // Mn [2] SYLOTI NAGRI VOWEL SIGN U..SYLOTI NAGRI VOWEL SIGN E 502 | (0xA8C4 <= code && code <= 0xA8C5) || // Mn [2] SAURASHTRA SIGN VIRAMA..SAURASHTRA SIGN CANDRABINDU 503 | (0xA8E0 <= code && code <= 0xA8F1) || // Mn [18] COMBINING DEVANAGARI DIGIT ZERO..COMBINING DEVANAGARI SIGN AVAGRAHA 504 | (0xA926 <= code && code <= 0xA92D) || // Mn [8] KAYAH LI VOWEL UE..KAYAH LI TONE CALYA PLOPHU 505 | (0xA947 <= code && code <= 0xA951) || // Mn [11] REJANG VOWEL SIGN I..REJANG CONSONANT SIGN R 506 | (0xA980 <= code && code <= 0xA982) || // Mn [3] JAVANESE SIGN PANYANGGA..JAVANESE SIGN LAYAR 507 | 0xA9B3 == code || // Mn JAVANESE SIGN CECAK TELU 508 | (0xA9B6 <= code && code <= 0xA9B9) || // Mn [4] JAVANESE VOWEL SIGN WULU..JAVANESE VOWEL SIGN SUKU MENDUT 509 | 0xA9BC == code || // Mn JAVANESE VOWEL SIGN PEPET 510 | 0xA9E5 == code || // Mn MYANMAR SIGN SHAN SAW 511 | (0xAA29 <= code && code <= 0xAA2E) || // Mn [6] CHAM VOWEL SIGN AA..CHAM VOWEL SIGN OE 512 | (0xAA31 <= code && code <= 0xAA32) || // Mn [2] CHAM VOWEL SIGN AU..CHAM VOWEL SIGN UE 513 | (0xAA35 <= code && code <= 0xAA36) || // Mn [2] CHAM CONSONANT SIGN LA..CHAM CONSONANT SIGN WA 514 | 0xAA43 == code || // Mn CHAM CONSONANT SIGN FINAL NG 515 | 0xAA4C == code || // Mn CHAM CONSONANT SIGN FINAL M 516 | 0xAA7C == code || // Mn MYANMAR SIGN TAI LAING TONE-2 517 | 0xAAB0 == code || // Mn TAI VIET MAI KANG 518 | (0xAAB2 <= code && code <= 0xAAB4) || // Mn [3] TAI VIET VOWEL I..TAI VIET VOWEL U 519 | (0xAAB7 <= code && code <= 0xAAB8) || // Mn [2] TAI VIET MAI KHIT..TAI VIET VOWEL IA 520 | (0xAABE <= code && code <= 0xAABF) || // Mn [2] TAI VIET VOWEL AM..TAI VIET TONE MAI EK 521 | 0xAAC1 == code || // Mn TAI VIET TONE MAI THO 522 | (0xAAEC <= code && code <= 0xAAED) || // Mn [2] MEETEI MAYEK VOWEL SIGN UU..MEETEI MAYEK VOWEL SIGN AAI 523 | 0xAAF6 == code || // Mn MEETEI MAYEK VIRAMA 524 | 0xABE5 == code || // Mn MEETEI MAYEK VOWEL SIGN ANAP 525 | 0xABE8 == code || // Mn MEETEI MAYEK VOWEL SIGN UNAP 526 | 0xABED == code || // Mn MEETEI MAYEK APUN IYEK 527 | 0xFB1E == code || // Mn HEBREW POINT JUDEO-SPANISH VARIKA 528 | (0xFE00 <= code && code <= 0xFE0F) || // Mn [16] VARIATION SELECTOR-1..VARIATION SELECTOR-16 529 | (0xFE20 <= code && code <= 0xFE2F) || // Mn [16] COMBINING LIGATURE LEFT HALF..COMBINING CYRILLIC TITLO RIGHT HALF 530 | (0xFF9E <= code && code <= 0xFF9F) || // Lm [2] HALFWIDTH KATAKANA VOICED SOUND MARK..HALFWIDTH KATAKANA SEMI-VOICED SOUND MARK 531 | 0x101FD == code || // Mn PHAISTOS DISC SIGN COMBINING OBLIQUE STROKE 532 | 0x102E0 == code || // Mn COPTIC EPACT THOUSANDS MARK 533 | (0x10376 <= code && code <= 0x1037A) || // Mn [5] COMBINING OLD PERMIC LETTER AN..COMBINING OLD PERMIC LETTER SII 534 | (0x10A01 <= code && code <= 0x10A03) || // Mn [3] KHAROSHTHI VOWEL SIGN I..KHAROSHTHI VOWEL SIGN VOCALIC R 535 | (0x10A05 <= code && code <= 0x10A06) || // Mn [2] KHAROSHTHI VOWEL SIGN E..KHAROSHTHI VOWEL SIGN O 536 | (0x10A0C <= code && code <= 0x10A0F) || // Mn [4] KHAROSHTHI VOWEL LENGTH MARK..KHAROSHTHI SIGN VISARGA 537 | (0x10A38 <= code && code <= 0x10A3A) || // Mn [3] KHAROSHTHI SIGN BAR ABOVE..KHAROSHTHI SIGN DOT BELOW 538 | 0x10A3F == code || // Mn KHAROSHTHI VIRAMA 539 | (0x10AE5 <= code && code <= 0x10AE6) || // Mn [2] MANICHAEAN ABBREVIATION MARK ABOVE..MANICHAEAN ABBREVIATION MARK BELOW 540 | 0x11001 == code || // Mn BRAHMI SIGN ANUSVARA 541 | (0x11038 <= code && code <= 0x11046) || // Mn [15] BRAHMI VOWEL SIGN AA..BRAHMI VIRAMA 542 | (0x1107F <= code && code <= 0x11081) || // Mn [3] BRAHMI NUMBER JOINER..KAITHI SIGN ANUSVARA 543 | (0x110B3 <= code && code <= 0x110B6) || // Mn [4] KAITHI VOWEL SIGN U..KAITHI VOWEL SIGN AI 544 | (0x110B9 <= code && code <= 0x110BA) || // Mn [2] KAITHI SIGN VIRAMA..KAITHI SIGN NUKTA 545 | (0x11100 <= code && code <= 0x11102) || // Mn [3] CHAKMA SIGN CANDRABINDU..CHAKMA SIGN VISARGA 546 | (0x11127 <= code && code <= 0x1112B) || // Mn [5] CHAKMA VOWEL SIGN A..CHAKMA VOWEL SIGN UU 547 | (0x1112D <= code && code <= 0x11134) || // Mn [8] CHAKMA VOWEL SIGN AI..CHAKMA MAAYYAA 548 | 0x11173 == code || // Mn MAHAJANI SIGN NUKTA 549 | (0x11180 <= code && code <= 0x11181) || // Mn [2] SHARADA SIGN CANDRABINDU..SHARADA SIGN ANUSVARA 550 | (0x111B6 <= code && code <= 0x111BE) || // Mn [9] SHARADA VOWEL SIGN U..SHARADA VOWEL SIGN O 551 | (0x111CA <= code && code <= 0x111CC) || // Mn [3] SHARADA SIGN NUKTA..SHARADA EXTRA SHORT VOWEL MARK 552 | (0x1122F <= code && code <= 0x11231) || // Mn [3] KHOJKI VOWEL SIGN U..KHOJKI VOWEL SIGN AI 553 | 0x11234 == code || // Mn KHOJKI SIGN ANUSVARA 554 | (0x11236 <= code && code <= 0x11237) || // Mn [2] KHOJKI SIGN NUKTA..KHOJKI SIGN SHADDA 555 | 0x1123E == code || // Mn KHOJKI SIGN SUKUN 556 | 0x112DF == code || // Mn KHUDAWADI SIGN ANUSVARA 557 | (0x112E3 <= code && code <= 0x112EA) || // Mn [8] KHUDAWADI VOWEL SIGN U..KHUDAWADI SIGN VIRAMA 558 | (0x11300 <= code && code <= 0x11301) || // Mn [2] GRANTHA SIGN COMBINING ANUSVARA ABOVE..GRANTHA SIGN CANDRABINDU 559 | 0x1133C == code || // Mn GRANTHA SIGN NUKTA 560 | 0x1133E == code || // Mc GRANTHA VOWEL SIGN AA 561 | 0x11340 == code || // Mn GRANTHA VOWEL SIGN II 562 | 0x11357 == code || // Mc GRANTHA AU LENGTH MARK 563 | (0x11366 <= code && code <= 0x1136C) || // Mn [7] COMBINING GRANTHA DIGIT ZERO..COMBINING GRANTHA DIGIT SIX 564 | (0x11370 <= code && code <= 0x11374) || // Mn [5] COMBINING GRANTHA LETTER A..COMBINING GRANTHA LETTER PA 565 | (0x11438 <= code && code <= 0x1143F) || // Mn [8] NEWA VOWEL SIGN U..NEWA VOWEL SIGN AI 566 | (0x11442 <= code && code <= 0x11444) || // Mn [3] NEWA SIGN VIRAMA..NEWA SIGN ANUSVARA 567 | 0x11446 == code || // Mn NEWA SIGN NUKTA 568 | 0x114B0 == code || // Mc TIRHUTA VOWEL SIGN AA 569 | (0x114B3 <= code && code <= 0x114B8) || // Mn [6] TIRHUTA VOWEL SIGN U..TIRHUTA VOWEL SIGN VOCALIC LL 570 | 0x114BA == code || // Mn TIRHUTA VOWEL SIGN SHORT E 571 | 0x114BD == code || // Mc TIRHUTA VOWEL SIGN SHORT O 572 | (0x114BF <= code && code <= 0x114C0) || // Mn [2] TIRHUTA SIGN CANDRABINDU..TIRHUTA SIGN ANUSVARA 573 | (0x114C2 <= code && code <= 0x114C3) || // Mn [2] TIRHUTA SIGN VIRAMA..TIRHUTA SIGN NUKTA 574 | 0x115AF == code || // Mc SIDDHAM VOWEL SIGN AA 575 | (0x115B2 <= code && code <= 0x115B5) || // Mn [4] SIDDHAM VOWEL SIGN U..SIDDHAM VOWEL SIGN VOCALIC RR 576 | (0x115BC <= code && code <= 0x115BD) || // Mn [2] SIDDHAM SIGN CANDRABINDU..SIDDHAM SIGN ANUSVARA 577 | (0x115BF <= code && code <= 0x115C0) || // Mn [2] SIDDHAM SIGN VIRAMA..SIDDHAM SIGN NUKTA 578 | (0x115DC <= code && code <= 0x115DD) || // Mn [2] SIDDHAM VOWEL SIGN ALTERNATE U..SIDDHAM VOWEL SIGN ALTERNATE UU 579 | (0x11633 <= code && code <= 0x1163A) || // Mn [8] MODI VOWEL SIGN U..MODI VOWEL SIGN AI 580 | 0x1163D == code || // Mn MODI SIGN ANUSVARA 581 | (0x1163F <= code && code <= 0x11640) || // Mn [2] MODI SIGN VIRAMA..MODI SIGN ARDHACANDRA 582 | 0x116AB == code || // Mn TAKRI SIGN ANUSVARA 583 | 0x116AD == code || // Mn TAKRI VOWEL SIGN AA 584 | (0x116B0 <= code && code <= 0x116B5) || // Mn [6] TAKRI VOWEL SIGN U..TAKRI VOWEL SIGN AU 585 | 0x116B7 == code || // Mn TAKRI SIGN NUKTA 586 | (0x1171D <= code && code <= 0x1171F) || // Mn [3] AHOM CONSONANT SIGN MEDIAL LA..AHOM CONSONANT SIGN MEDIAL LIGATING RA 587 | (0x11722 <= code && code <= 0x11725) || // Mn [4] AHOM VOWEL SIGN I..AHOM VOWEL SIGN UU 588 | (0x11727 <= code && code <= 0x1172B) || // Mn [5] AHOM VOWEL SIGN AW..AHOM SIGN KILLER 589 | (0x11A01 <= code && code <= 0x11A06) || // Mn [6] ZANABAZAR SQUARE VOWEL SIGN I..ZANABAZAR SQUARE VOWEL SIGN O 590 | (0x11A09 <= code && code <= 0x11A0A) || // Mn [2] ZANABAZAR SQUARE VOWEL SIGN REVERSED I..ZANABAZAR SQUARE VOWEL LENGTH MARK 591 | (0x11A33 <= code && code <= 0x11A38) || // Mn [6] ZANABAZAR SQUARE FINAL CONSONANT MARK..ZANABAZAR SQUARE SIGN ANUSVARA 592 | (0x11A3B <= code && code <= 0x11A3E) || // Mn [4] ZANABAZAR SQUARE CLUSTER-FINAL LETTER YA..ZANABAZAR SQUARE CLUSTER-FINAL LETTER VA 593 | 0x11A47 == code || // Mn ZANABAZAR SQUARE SUBJOINER 594 | (0x11A51 <= code && code <= 0x11A56) || // Mn [6] SOYOMBO VOWEL SIGN I..SOYOMBO VOWEL SIGN OE 595 | (0x11A59 <= code && code <= 0x11A5B) || // Mn [3] SOYOMBO VOWEL SIGN VOCALIC R..SOYOMBO VOWEL LENGTH MARK 596 | (0x11A8A <= code && code <= 0x11A96) || // Mn [13] SOYOMBO FINAL CONSONANT SIGN G..SOYOMBO SIGN ANUSVARA 597 | (0x11A98 <= code && code <= 0x11A99) || // Mn [2] SOYOMBO GEMINATION MARK..SOYOMBO SUBJOINER 598 | (0x11C30 <= code && code <= 0x11C36) || // Mn [7] BHAIKSUKI VOWEL SIGN I..BHAIKSUKI VOWEL SIGN VOCALIC L 599 | (0x11C38 <= code && code <= 0x11C3D) || // Mn [6] BHAIKSUKI VOWEL SIGN E..BHAIKSUKI SIGN ANUSVARA 600 | 0x11C3F == code || // Mn BHAIKSUKI SIGN VIRAMA 601 | (0x11C92 <= code && code <= 0x11CA7) || // Mn [22] MARCHEN SUBJOINED LETTER KA..MARCHEN SUBJOINED LETTER ZA 602 | (0x11CAA <= code && code <= 0x11CB0) || // Mn [7] MARCHEN SUBJOINED LETTER RA..MARCHEN VOWEL SIGN AA 603 | (0x11CB2 <= code && code <= 0x11CB3) || // Mn [2] MARCHEN VOWEL SIGN U..MARCHEN VOWEL SIGN E 604 | (0x11CB5 <= code && code <= 0x11CB6) || // Mn [2] MARCHEN SIGN ANUSVARA..MARCHEN SIGN CANDRABINDU 605 | (0x11D31 <= code && code <= 0x11D36) || // Mn [6] MASARAM GONDI VOWEL SIGN AA..MASARAM GONDI VOWEL SIGN VOCALIC R 606 | 0x11D3A == code || // Mn MASARAM GONDI VOWEL SIGN E 607 | (0x11D3C <= code && code <= 0x11D3D) || // Mn [2] MASARAM GONDI VOWEL SIGN AI..MASARAM GONDI VOWEL SIGN O 608 | (0x11D3F <= code && code <= 0x11D45) || // Mn [7] MASARAM GONDI VOWEL SIGN AU..MASARAM GONDI VIRAMA 609 | 0x11D47 == code || // Mn MASARAM GONDI RA-KARA 610 | (0x16AF0 <= code && code <= 0x16AF4) || // Mn [5] BASSA VAH COMBINING HIGH TONE..BASSA VAH COMBINING HIGH-LOW TONE 611 | (0x16B30 <= code && code <= 0x16B36) || // Mn [7] PAHAWH HMONG MARK CIM TUB..PAHAWH HMONG MARK CIM TAUM 612 | (0x16F8F <= code && code <= 0x16F92) || // Mn [4] MIAO TONE RIGHT..MIAO TONE BELOW 613 | (0x1BC9D <= code && code <= 0x1BC9E) || // Mn [2] DUPLOYAN THICK LETTER SELECTOR..DUPLOYAN DOUBLE MARK 614 | 0x1D165 == code || // Mc MUSICAL SYMBOL COMBINING STEM 615 | (0x1D167 <= code && code <= 0x1D169) || // Mn [3] MUSICAL SYMBOL COMBINING TREMOLO-1..MUSICAL SYMBOL COMBINING TREMOLO-3 616 | (0x1D16E <= code && code <= 0x1D172) || // Mc [5] MUSICAL SYMBOL COMBINING FLAG-1..MUSICAL SYMBOL COMBINING FLAG-5 617 | (0x1D17B <= code && code <= 0x1D182) || // Mn [8] MUSICAL SYMBOL COMBINING ACCENT..MUSICAL SYMBOL COMBINING LOURE 618 | (0x1D185 <= code && code <= 0x1D18B) || // Mn [7] MUSICAL SYMBOL COMBINING DOIT..MUSICAL SYMBOL COMBINING TRIPLE TONGUE 619 | (0x1D1AA <= code && code <= 0x1D1AD) || // Mn [4] MUSICAL SYMBOL COMBINING DOWN BOW..MUSICAL SYMBOL COMBINING SNAP PIZZICATO 620 | (0x1D242 <= code && code <= 0x1D244) || // Mn [3] COMBINING GREEK MUSICAL TRISEME..COMBINING GREEK MUSICAL PENTASEME 621 | (0x1DA00 <= code && code <= 0x1DA36) || // Mn [55] SIGNWRITING HEAD RIM..SIGNWRITING AIR SUCKING IN 622 | (0x1DA3B <= code && code <= 0x1DA6C) || // Mn [50] SIGNWRITING MOUTH CLOSED NEUTRAL..SIGNWRITING EXCITEMENT 623 | 0x1DA75 == code || // Mn SIGNWRITING UPPER BODY TILTING FROM HIP JOINTS 624 | 0x1DA84 == code || // Mn SIGNWRITING LOCATION HEAD NECK 625 | (0x1DA9B <= code && code <= 0x1DA9F) || // Mn [5] SIGNWRITING FILL MODIFIER-2..SIGNWRITING FILL MODIFIER-6 626 | (0x1DAA1 <= code && code <= 0x1DAAF) || // Mn [15] SIGNWRITING ROTATION MODIFIER-2..SIGNWRITING ROTATION MODIFIER-16 627 | (0x1E000 <= code && code <= 0x1E006) || // Mn [7] COMBINING GLAGOLITIC LETTER AZU..COMBINING GLAGOLITIC LETTER ZHIVETE 628 | (0x1E008 <= code && code <= 0x1E018) || // Mn [17] COMBINING GLAGOLITIC LETTER ZEMLJA..COMBINING GLAGOLITIC LETTER HERU 629 | (0x1E01B <= code && code <= 0x1E021) || // Mn [7] COMBINING GLAGOLITIC LETTER SHTA..COMBINING GLAGOLITIC LETTER YATI 630 | (0x1E023 <= code && code <= 0x1E024) || // Mn [2] COMBINING GLAGOLITIC LETTER YU..COMBINING GLAGOLITIC LETTER SMALL YUS 631 | (0x1E026 <= code && code <= 0x1E02A) || // Mn [5] COMBINING GLAGOLITIC LETTER YO..COMBINING GLAGOLITIC LETTER FITA 632 | (0x1E8D0 <= code && code <= 0x1E8D6) || // Mn [7] MENDE KIKAKUI COMBINING NUMBER TEENS..MENDE KIKAKUI COMBINING NUMBER MILLIONS 633 | (0x1E944 <= code && code <= 0x1E94A) || // Mn [7] ADLAM ALIF LENGTHENER..ADLAM NUKTA 634 | (0xE0020 <= code && code <= 0xE007F) || // Cf [96] TAG SPACE..CANCEL TAG 635 | (0xE0100 <= code && code <= 0xE01EF) // Mn [240] VARIATION SELECTOR-17..VARIATION SELECTOR-256 636 | ){ 637 | return Extend; 638 | } 639 | 640 | 641 | if( 642 | (0x1F1E6 <= code && code <= 0x1F1FF) // So [26] REGIONAL INDICATOR SYMBOL LETTER A..REGIONAL INDICATOR SYMBOL LETTER Z 643 | ){ 644 | return Regional_Indicator; 645 | } 646 | 647 | if( 648 | 0x0903 == code || // Mc DEVANAGARI SIGN VISARGA 649 | 0x093B == code || // Mc DEVANAGARI VOWEL SIGN OOE 650 | (0x093E <= code && code <= 0x0940) || // Mc [3] DEVANAGARI VOWEL SIGN AA..DEVANAGARI VOWEL SIGN II 651 | (0x0949 <= code && code <= 0x094C) || // Mc [4] DEVANAGARI VOWEL SIGN CANDRA O..DEVANAGARI VOWEL SIGN AU 652 | (0x094E <= code && code <= 0x094F) || // Mc [2] DEVANAGARI VOWEL SIGN PRISHTHAMATRA E..DEVANAGARI VOWEL SIGN AW 653 | (0x0982 <= code && code <= 0x0983) || // Mc [2] BENGALI SIGN ANUSVARA..BENGALI SIGN VISARGA 654 | (0x09BF <= code && code <= 0x09C0) || // Mc [2] BENGALI VOWEL SIGN I..BENGALI VOWEL SIGN II 655 | (0x09C7 <= code && code <= 0x09C8) || // Mc [2] BENGALI VOWEL SIGN E..BENGALI VOWEL SIGN AI 656 | (0x09CB <= code && code <= 0x09CC) || // Mc [2] BENGALI VOWEL SIGN O..BENGALI VOWEL SIGN AU 657 | 0x0A03 == code || // Mc GURMUKHI SIGN VISARGA 658 | (0x0A3E <= code && code <= 0x0A40) || // Mc [3] GURMUKHI VOWEL SIGN AA..GURMUKHI VOWEL SIGN II 659 | 0x0A83 == code || // Mc GUJARATI SIGN VISARGA 660 | (0x0ABE <= code && code <= 0x0AC0) || // Mc [3] GUJARATI VOWEL SIGN AA..GUJARATI VOWEL SIGN II 661 | 0x0AC9 == code || // Mc GUJARATI VOWEL SIGN CANDRA O 662 | (0x0ACB <= code && code <= 0x0ACC) || // Mc [2] GUJARATI VOWEL SIGN O..GUJARATI VOWEL SIGN AU 663 | (0x0B02 <= code && code <= 0x0B03) || // Mc [2] ORIYA SIGN ANUSVARA..ORIYA SIGN VISARGA 664 | 0x0B40 == code || // Mc ORIYA VOWEL SIGN II 665 | (0x0B47 <= code && code <= 0x0B48) || // Mc [2] ORIYA VOWEL SIGN E..ORIYA VOWEL SIGN AI 666 | (0x0B4B <= code && code <= 0x0B4C) || // Mc [2] ORIYA VOWEL SIGN O..ORIYA VOWEL SIGN AU 667 | 0x0BBF == code || // Mc TAMIL VOWEL SIGN I 668 | (0x0BC1 <= code && code <= 0x0BC2) || // Mc [2] TAMIL VOWEL SIGN U..TAMIL VOWEL SIGN UU 669 | (0x0BC6 <= code && code <= 0x0BC8) || // Mc [3] TAMIL VOWEL SIGN E..TAMIL VOWEL SIGN AI 670 | (0x0BCA <= code && code <= 0x0BCC) || // Mc [3] TAMIL VOWEL SIGN O..TAMIL VOWEL SIGN AU 671 | (0x0C01 <= code && code <= 0x0C03) || // Mc [3] TELUGU SIGN CANDRABINDU..TELUGU SIGN VISARGA 672 | (0x0C41 <= code && code <= 0x0C44) || // Mc [4] TELUGU VOWEL SIGN U..TELUGU VOWEL SIGN VOCALIC RR 673 | (0x0C82 <= code && code <= 0x0C83) || // Mc [2] KANNADA SIGN ANUSVARA..KANNADA SIGN VISARGA 674 | 0x0CBE == code || // Mc KANNADA VOWEL SIGN AA 675 | (0x0CC0 <= code && code <= 0x0CC1) || // Mc [2] KANNADA VOWEL SIGN II..KANNADA VOWEL SIGN U 676 | (0x0CC3 <= code && code <= 0x0CC4) || // Mc [2] KANNADA VOWEL SIGN VOCALIC R..KANNADA VOWEL SIGN VOCALIC RR 677 | (0x0CC7 <= code && code <= 0x0CC8) || // Mc [2] KANNADA VOWEL SIGN EE..KANNADA VOWEL SIGN AI 678 | (0x0CCA <= code && code <= 0x0CCB) || // Mc [2] KANNADA VOWEL SIGN O..KANNADA VOWEL SIGN OO 679 | (0x0D02 <= code && code <= 0x0D03) || // Mc [2] MALAYALAM SIGN ANUSVARA..MALAYALAM SIGN VISARGA 680 | (0x0D3F <= code && code <= 0x0D40) || // Mc [2] MALAYALAM VOWEL SIGN I..MALAYALAM VOWEL SIGN II 681 | (0x0D46 <= code && code <= 0x0D48) || // Mc [3] MALAYALAM VOWEL SIGN E..MALAYALAM VOWEL SIGN AI 682 | (0x0D4A <= code && code <= 0x0D4C) || // Mc [3] MALAYALAM VOWEL SIGN O..MALAYALAM VOWEL SIGN AU 683 | (0x0D82 <= code && code <= 0x0D83) || // Mc [2] SINHALA SIGN ANUSVARAYA..SINHALA SIGN VISARGAYA 684 | (0x0DD0 <= code && code <= 0x0DD1) || // Mc [2] SINHALA VOWEL SIGN KETTI AEDA-PILLA..SINHALA VOWEL SIGN DIGA AEDA-PILLA 685 | (0x0DD8 <= code && code <= 0x0DDE) || // Mc [7] SINHALA VOWEL SIGN GAETTA-PILLA..SINHALA VOWEL SIGN KOMBUVA HAA GAYANUKITTA 686 | (0x0DF2 <= code && code <= 0x0DF3) || // Mc [2] SINHALA VOWEL SIGN DIGA GAETTA-PILLA..SINHALA VOWEL SIGN DIGA GAYANUKITTA 687 | 0x0E33 == code || // Lo THAI CHARACTER SARA AM 688 | 0x0EB3 == code || // Lo LAO VOWEL SIGN AM 689 | (0x0F3E <= code && code <= 0x0F3F) || // Mc [2] TIBETAN SIGN YAR TSHES..TIBETAN SIGN MAR TSHES 690 | 0x0F7F == code || // Mc TIBETAN SIGN RNAM BCAD 691 | 0x1031 == code || // Mc MYANMAR VOWEL SIGN E 692 | (0x103B <= code && code <= 0x103C) || // Mc [2] MYANMAR CONSONANT SIGN MEDIAL YA..MYANMAR CONSONANT SIGN MEDIAL RA 693 | (0x1056 <= code && code <= 0x1057) || // Mc [2] MYANMAR VOWEL SIGN VOCALIC R..MYANMAR VOWEL SIGN VOCALIC RR 694 | 0x1084 == code || // Mc MYANMAR VOWEL SIGN SHAN E 695 | 0x17B6 == code || // Mc KHMER VOWEL SIGN AA 696 | (0x17BE <= code && code <= 0x17C5) || // Mc [8] KHMER VOWEL SIGN OE..KHMER VOWEL SIGN AU 697 | (0x17C7 <= code && code <= 0x17C8) || // Mc [2] KHMER SIGN REAHMUK..KHMER SIGN YUUKALEAPINTU 698 | (0x1923 <= code && code <= 0x1926) || // Mc [4] LIMBU VOWEL SIGN EE..LIMBU VOWEL SIGN AU 699 | (0x1929 <= code && code <= 0x192B) || // Mc [3] LIMBU SUBJOINED LETTER YA..LIMBU SUBJOINED LETTER WA 700 | (0x1930 <= code && code <= 0x1931) || // Mc [2] LIMBU SMALL LETTER KA..LIMBU SMALL LETTER NGA 701 | (0x1933 <= code && code <= 0x1938) || // Mc [6] LIMBU SMALL LETTER TA..LIMBU SMALL LETTER LA 702 | (0x1A19 <= code && code <= 0x1A1A) || // Mc [2] BUGINESE VOWEL SIGN E..BUGINESE VOWEL SIGN O 703 | 0x1A55 == code || // Mc TAI THAM CONSONANT SIGN MEDIAL RA 704 | 0x1A57 == code || // Mc TAI THAM CONSONANT SIGN LA TANG LAI 705 | (0x1A6D <= code && code <= 0x1A72) || // Mc [6] TAI THAM VOWEL SIGN OY..TAI THAM VOWEL SIGN THAM AI 706 | 0x1B04 == code || // Mc BALINESE SIGN BISAH 707 | 0x1B35 == code || // Mc BALINESE VOWEL SIGN TEDUNG 708 | 0x1B3B == code || // Mc BALINESE VOWEL SIGN RA REPA TEDUNG 709 | (0x1B3D <= code && code <= 0x1B41) || // Mc [5] BALINESE VOWEL SIGN LA LENGA TEDUNG..BALINESE VOWEL SIGN TALING REPA TEDUNG 710 | (0x1B43 <= code && code <= 0x1B44) || // Mc [2] BALINESE VOWEL SIGN PEPET TEDUNG..BALINESE ADEG ADEG 711 | 0x1B82 == code || // Mc SUNDANESE SIGN PANGWISAD 712 | 0x1BA1 == code || // Mc SUNDANESE CONSONANT SIGN PAMINGKAL 713 | (0x1BA6 <= code && code <= 0x1BA7) || // Mc [2] SUNDANESE VOWEL SIGN PANAELAENG..SUNDANESE VOWEL SIGN PANOLONG 714 | 0x1BAA == code || // Mc SUNDANESE SIGN PAMAAEH 715 | 0x1BE7 == code || // Mc BATAK VOWEL SIGN E 716 | (0x1BEA <= code && code <= 0x1BEC) || // Mc [3] BATAK VOWEL SIGN I..BATAK VOWEL SIGN O 717 | 0x1BEE == code || // Mc BATAK VOWEL SIGN U 718 | (0x1BF2 <= code && code <= 0x1BF3) || // Mc [2] BATAK PANGOLAT..BATAK PANONGONAN 719 | (0x1C24 <= code && code <= 0x1C2B) || // Mc [8] LEPCHA SUBJOINED LETTER YA..LEPCHA VOWEL SIGN UU 720 | (0x1C34 <= code && code <= 0x1C35) || // Mc [2] LEPCHA CONSONANT SIGN NYIN-DO..LEPCHA CONSONANT SIGN KANG 721 | 0x1CE1 == code || // Mc VEDIC TONE ATHARVAVEDIC INDEPENDENT SVARITA 722 | (0x1CF2 <= code && code <= 0x1CF3) || // Mc [2] VEDIC SIGN ARDHAVISARGA..VEDIC SIGN ROTATED ARDHAVISARGA 723 | 0x1CF7 == code || // Mc VEDIC SIGN ATIKRAMA 724 | (0xA823 <= code && code <= 0xA824) || // Mc [2] SYLOTI NAGRI VOWEL SIGN A..SYLOTI NAGRI VOWEL SIGN I 725 | 0xA827 == code || // Mc SYLOTI NAGRI VOWEL SIGN OO 726 | (0xA880 <= code && code <= 0xA881) || // Mc [2] SAURASHTRA SIGN ANUSVARA..SAURASHTRA SIGN VISARGA 727 | (0xA8B4 <= code && code <= 0xA8C3) || // Mc [16] SAURASHTRA CONSONANT SIGN HAARU..SAURASHTRA VOWEL SIGN AU 728 | (0xA952 <= code && code <= 0xA953) || // Mc [2] REJANG CONSONANT SIGN H..REJANG VIRAMA 729 | 0xA983 == code || // Mc JAVANESE SIGN WIGNYAN 730 | (0xA9B4 <= code && code <= 0xA9B5) || // Mc [2] JAVANESE VOWEL SIGN TARUNG..JAVANESE VOWEL SIGN TOLONG 731 | (0xA9BA <= code && code <= 0xA9BB) || // Mc [2] JAVANESE VOWEL SIGN TALING..JAVANESE VOWEL SIGN DIRGA MURE 732 | (0xA9BD <= code && code <= 0xA9C0) || // Mc [4] JAVANESE CONSONANT SIGN KERET..JAVANESE PANGKON 733 | (0xAA2F <= code && code <= 0xAA30) || // Mc [2] CHAM VOWEL SIGN O..CHAM VOWEL SIGN AI 734 | (0xAA33 <= code && code <= 0xAA34) || // Mc [2] CHAM CONSONANT SIGN YA..CHAM CONSONANT SIGN RA 735 | 0xAA4D == code || // Mc CHAM CONSONANT SIGN FINAL H 736 | 0xAAEB == code || // Mc MEETEI MAYEK VOWEL SIGN II 737 | (0xAAEE <= code && code <= 0xAAEF) || // Mc [2] MEETEI MAYEK VOWEL SIGN AU..MEETEI MAYEK VOWEL SIGN AAU 738 | 0xAAF5 == code || // Mc MEETEI MAYEK VOWEL SIGN VISARGA 739 | (0xABE3 <= code && code <= 0xABE4) || // Mc [2] MEETEI MAYEK VOWEL SIGN ONAP..MEETEI MAYEK VOWEL SIGN INAP 740 | (0xABE6 <= code && code <= 0xABE7) || // Mc [2] MEETEI MAYEK VOWEL SIGN YENAP..MEETEI MAYEK VOWEL SIGN SOUNAP 741 | (0xABE9 <= code && code <= 0xABEA) || // Mc [2] MEETEI MAYEK VOWEL SIGN CHEINAP..MEETEI MAYEK VOWEL SIGN NUNG 742 | 0xABEC == code || // Mc MEETEI MAYEK LUM IYEK 743 | 0x11000 == code || // Mc BRAHMI SIGN CANDRABINDU 744 | 0x11002 == code || // Mc BRAHMI SIGN VISARGA 745 | 0x11082 == code || // Mc KAITHI SIGN VISARGA 746 | (0x110B0 <= code && code <= 0x110B2) || // Mc [3] KAITHI VOWEL SIGN AA..KAITHI VOWEL SIGN II 747 | (0x110B7 <= code && code <= 0x110B8) || // Mc [2] KAITHI VOWEL SIGN O..KAITHI VOWEL SIGN AU 748 | 0x1112C == code || // Mc CHAKMA VOWEL SIGN E 749 | 0x11182 == code || // Mc SHARADA SIGN VISARGA 750 | (0x111B3 <= code && code <= 0x111B5) || // Mc [3] SHARADA VOWEL SIGN AA..SHARADA VOWEL SIGN II 751 | (0x111BF <= code && code <= 0x111C0) || // Mc [2] SHARADA VOWEL SIGN AU..SHARADA SIGN VIRAMA 752 | (0x1122C <= code && code <= 0x1122E) || // Mc [3] KHOJKI VOWEL SIGN AA..KHOJKI VOWEL SIGN II 753 | (0x11232 <= code && code <= 0x11233) || // Mc [2] KHOJKI VOWEL SIGN O..KHOJKI VOWEL SIGN AU 754 | 0x11235 == code || // Mc KHOJKI SIGN VIRAMA 755 | (0x112E0 <= code && code <= 0x112E2) || // Mc [3] KHUDAWADI VOWEL SIGN AA..KHUDAWADI VOWEL SIGN II 756 | (0x11302 <= code && code <= 0x11303) || // Mc [2] GRANTHA SIGN ANUSVARA..GRANTHA SIGN VISARGA 757 | 0x1133F == code || // Mc GRANTHA VOWEL SIGN I 758 | (0x11341 <= code && code <= 0x11344) || // Mc [4] GRANTHA VOWEL SIGN U..GRANTHA VOWEL SIGN VOCALIC RR 759 | (0x11347 <= code && code <= 0x11348) || // Mc [2] GRANTHA VOWEL SIGN EE..GRANTHA VOWEL SIGN AI 760 | (0x1134B <= code && code <= 0x1134D) || // Mc [3] GRANTHA VOWEL SIGN OO..GRANTHA SIGN VIRAMA 761 | (0x11362 <= code && code <= 0x11363) || // Mc [2] GRANTHA VOWEL SIGN VOCALIC L..GRANTHA VOWEL SIGN VOCALIC LL 762 | (0x11435 <= code && code <= 0x11437) || // Mc [3] NEWA VOWEL SIGN AA..NEWA VOWEL SIGN II 763 | (0x11440 <= code && code <= 0x11441) || // Mc [2] NEWA VOWEL SIGN O..NEWA VOWEL SIGN AU 764 | 0x11445 == code || // Mc NEWA SIGN VISARGA 765 | (0x114B1 <= code && code <= 0x114B2) || // Mc [2] TIRHUTA VOWEL SIGN I..TIRHUTA VOWEL SIGN II 766 | 0x114B9 == code || // Mc TIRHUTA VOWEL SIGN E 767 | (0x114BB <= code && code <= 0x114BC) || // Mc [2] TIRHUTA VOWEL SIGN AI..TIRHUTA VOWEL SIGN O 768 | 0x114BE == code || // Mc TIRHUTA VOWEL SIGN AU 769 | 0x114C1 == code || // Mc TIRHUTA SIGN VISARGA 770 | (0x115B0 <= code && code <= 0x115B1) || // Mc [2] SIDDHAM VOWEL SIGN I..SIDDHAM VOWEL SIGN II 771 | (0x115B8 <= code && code <= 0x115BB) || // Mc [4] SIDDHAM VOWEL SIGN E..SIDDHAM VOWEL SIGN AU 772 | 0x115BE == code || // Mc SIDDHAM SIGN VISARGA 773 | (0x11630 <= code && code <= 0x11632) || // Mc [3] MODI VOWEL SIGN AA..MODI VOWEL SIGN II 774 | (0x1163B <= code && code <= 0x1163C) || // Mc [2] MODI VOWEL SIGN O..MODI VOWEL SIGN AU 775 | 0x1163E == code || // Mc MODI SIGN VISARGA 776 | 0x116AC == code || // Mc TAKRI SIGN VISARGA 777 | (0x116AE <= code && code <= 0x116AF) || // Mc [2] TAKRI VOWEL SIGN I..TAKRI VOWEL SIGN II 778 | 0x116B6 == code || // Mc TAKRI SIGN VIRAMA 779 | (0x11720 <= code && code <= 0x11721) || // Mc [2] AHOM VOWEL SIGN A..AHOM VOWEL SIGN AA 780 | 0x11726 == code || // Mc AHOM VOWEL SIGN E 781 | (0x11A07 <= code && code <= 0x11A08) || // Mc [2] ZANABAZAR SQUARE VOWEL SIGN AI..ZANABAZAR SQUARE VOWEL SIGN AU 782 | 0x11A39 == code || // Mc ZANABAZAR SQUARE SIGN VISARGA 783 | (0x11A57 <= code && code <= 0x11A58) || // Mc [2] SOYOMBO VOWEL SIGN AI..SOYOMBO VOWEL SIGN AU 784 | 0x11A97 == code || // Mc SOYOMBO SIGN VISARGA 785 | 0x11C2F == code || // Mc BHAIKSUKI VOWEL SIGN AA 786 | 0x11C3E == code || // Mc BHAIKSUKI SIGN VISARGA 787 | 0x11CA9 == code || // Mc MARCHEN SUBJOINED LETTER YA 788 | 0x11CB1 == code || // Mc MARCHEN VOWEL SIGN I 789 | 0x11CB4 == code || // Mc MARCHEN VOWEL SIGN O 790 | (0x16F51 <= code && code <= 0x16F7E) || // Mc [46] MIAO SIGN ASPIRATION..MIAO VOWEL SIGN NG 791 | 0x1D166 == code || // Mc MUSICAL SYMBOL COMBINING SPRECHGESANG STEM 792 | 0x1D16D == code // Mc MUSICAL SYMBOL COMBINING AUGMENTATION DOT 793 | ){ 794 | return SpacingMark; 795 | } 796 | 797 | 798 | if( 799 | (0x1100 <= code && code <= 0x115F) || // Lo [96] HANGUL CHOSEONG KIYEOK..HANGUL CHOSEONG FILLER 800 | (0xA960 <= code && code <= 0xA97C) // Lo [29] HANGUL CHOSEONG TIKEUT-MIEUM..HANGUL CHOSEONG SSANGYEORINHIEUH 801 | ){ 802 | return L; 803 | } 804 | 805 | if( 806 | (0x1160 <= code && code <= 0x11A7) || // Lo [72] HANGUL JUNGSEONG FILLER..HANGUL JUNGSEONG O-YAE 807 | (0xD7B0 <= code && code <= 0xD7C6) // Lo [23] HANGUL JUNGSEONG O-YEO..HANGUL JUNGSEONG ARAEA-E 808 | ){ 809 | return V; 810 | } 811 | 812 | 813 | if( 814 | (0x11A8 <= code && code <= 0x11FF) || // Lo [88] HANGUL JONGSEONG KIYEOK..HANGUL JONGSEONG SSANGNIEUN 815 | (0xD7CB <= code && code <= 0xD7FB) // Lo [49] HANGUL JONGSEONG NIEUN-RIEUL..HANGUL JONGSEONG PHIEUPH-THIEUTH 816 | ){ 817 | return T; 818 | } 819 | 820 | if( 821 | 0xAC00 == code || // Lo HANGUL SYLLABLE GA 822 | 0xAC1C == code || // Lo HANGUL SYLLABLE GAE 823 | 0xAC38 == code || // Lo HANGUL SYLLABLE GYA 824 | 0xAC54 == code || // Lo HANGUL SYLLABLE GYAE 825 | 0xAC70 == code || // Lo HANGUL SYLLABLE GEO 826 | 0xAC8C == code || // Lo HANGUL SYLLABLE GE 827 | 0xACA8 == code || // Lo HANGUL SYLLABLE GYEO 828 | 0xACC4 == code || // Lo HANGUL SYLLABLE GYE 829 | 0xACE0 == code || // Lo HANGUL SYLLABLE GO 830 | 0xACFC == code || // Lo HANGUL SYLLABLE GWA 831 | 0xAD18 == code || // Lo HANGUL SYLLABLE GWAE 832 | 0xAD34 == code || // Lo HANGUL SYLLABLE GOE 833 | 0xAD50 == code || // Lo HANGUL SYLLABLE GYO 834 | 0xAD6C == code || // Lo HANGUL SYLLABLE GU 835 | 0xAD88 == code || // Lo HANGUL SYLLABLE GWEO 836 | 0xADA4 == code || // Lo HANGUL SYLLABLE GWE 837 | 0xADC0 == code || // Lo HANGUL SYLLABLE GWI 838 | 0xADDC == code || // Lo HANGUL SYLLABLE GYU 839 | 0xADF8 == code || // Lo HANGUL SYLLABLE GEU 840 | 0xAE14 == code || // Lo HANGUL SYLLABLE GYI 841 | 0xAE30 == code || // Lo HANGUL SYLLABLE GI 842 | 0xAE4C == code || // Lo HANGUL SYLLABLE GGA 843 | 0xAE68 == code || // Lo HANGUL SYLLABLE GGAE 844 | 0xAE84 == code || // Lo HANGUL SYLLABLE GGYA 845 | 0xAEA0 == code || // Lo HANGUL SYLLABLE GGYAE 846 | 0xAEBC == code || // Lo HANGUL SYLLABLE GGEO 847 | 0xAED8 == code || // Lo HANGUL SYLLABLE GGE 848 | 0xAEF4 == code || // Lo HANGUL SYLLABLE GGYEO 849 | 0xAF10 == code || // Lo HANGUL SYLLABLE GGYE 850 | 0xAF2C == code || // Lo HANGUL SYLLABLE GGO 851 | 0xAF48 == code || // Lo HANGUL SYLLABLE GGWA 852 | 0xAF64 == code || // Lo HANGUL SYLLABLE GGWAE 853 | 0xAF80 == code || // Lo HANGUL SYLLABLE GGOE 854 | 0xAF9C == code || // Lo HANGUL SYLLABLE GGYO 855 | 0xAFB8 == code || // Lo HANGUL SYLLABLE GGU 856 | 0xAFD4 == code || // Lo HANGUL SYLLABLE GGWEO 857 | 0xAFF0 == code || // Lo HANGUL SYLLABLE GGWE 858 | 0xB00C == code || // Lo HANGUL SYLLABLE GGWI 859 | 0xB028 == code || // Lo HANGUL SYLLABLE GGYU 860 | 0xB044 == code || // Lo HANGUL SYLLABLE GGEU 861 | 0xB060 == code || // Lo HANGUL SYLLABLE GGYI 862 | 0xB07C == code || // Lo HANGUL SYLLABLE GGI 863 | 0xB098 == code || // Lo HANGUL SYLLABLE NA 864 | 0xB0B4 == code || // Lo HANGUL SYLLABLE NAE 865 | 0xB0D0 == code || // Lo HANGUL SYLLABLE NYA 866 | 0xB0EC == code || // Lo HANGUL SYLLABLE NYAE 867 | 0xB108 == code || // Lo HANGUL SYLLABLE NEO 868 | 0xB124 == code || // Lo HANGUL SYLLABLE NE 869 | 0xB140 == code || // Lo HANGUL SYLLABLE NYEO 870 | 0xB15C == code || // Lo HANGUL SYLLABLE NYE 871 | 0xB178 == code || // Lo HANGUL SYLLABLE NO 872 | 0xB194 == code || // Lo HANGUL SYLLABLE NWA 873 | 0xB1B0 == code || // Lo HANGUL SYLLABLE NWAE 874 | 0xB1CC == code || // Lo HANGUL SYLLABLE NOE 875 | 0xB1E8 == code || // Lo HANGUL SYLLABLE NYO 876 | 0xB204 == code || // Lo HANGUL SYLLABLE NU 877 | 0xB220 == code || // Lo HANGUL SYLLABLE NWEO 878 | 0xB23C == code || // Lo HANGUL SYLLABLE NWE 879 | 0xB258 == code || // Lo HANGUL SYLLABLE NWI 880 | 0xB274 == code || // Lo HANGUL SYLLABLE NYU 881 | 0xB290 == code || // Lo HANGUL SYLLABLE NEU 882 | 0xB2AC == code || // Lo HANGUL SYLLABLE NYI 883 | 0xB2C8 == code || // Lo HANGUL SYLLABLE NI 884 | 0xB2E4 == code || // Lo HANGUL SYLLABLE DA 885 | 0xB300 == code || // Lo HANGUL SYLLABLE DAE 886 | 0xB31C == code || // Lo HANGUL SYLLABLE DYA 887 | 0xB338 == code || // Lo HANGUL SYLLABLE DYAE 888 | 0xB354 == code || // Lo HANGUL SYLLABLE DEO 889 | 0xB370 == code || // Lo HANGUL SYLLABLE DE 890 | 0xB38C == code || // Lo HANGUL SYLLABLE DYEO 891 | 0xB3A8 == code || // Lo HANGUL SYLLABLE DYE 892 | 0xB3C4 == code || // Lo HANGUL SYLLABLE DO 893 | 0xB3E0 == code || // Lo HANGUL SYLLABLE DWA 894 | 0xB3FC == code || // Lo HANGUL SYLLABLE DWAE 895 | 0xB418 == code || // Lo HANGUL SYLLABLE DOE 896 | 0xB434 == code || // Lo HANGUL SYLLABLE DYO 897 | 0xB450 == code || // Lo HANGUL SYLLABLE DU 898 | 0xB46C == code || // Lo HANGUL SYLLABLE DWEO 899 | 0xB488 == code || // Lo HANGUL SYLLABLE DWE 900 | 0xB4A4 == code || // Lo HANGUL SYLLABLE DWI 901 | 0xB4C0 == code || // Lo HANGUL SYLLABLE DYU 902 | 0xB4DC == code || // Lo HANGUL SYLLABLE DEU 903 | 0xB4F8 == code || // Lo HANGUL SYLLABLE DYI 904 | 0xB514 == code || // Lo HANGUL SYLLABLE DI 905 | 0xB530 == code || // Lo HANGUL SYLLABLE DDA 906 | 0xB54C == code || // Lo HANGUL SYLLABLE DDAE 907 | 0xB568 == code || // Lo HANGUL SYLLABLE DDYA 908 | 0xB584 == code || // Lo HANGUL SYLLABLE DDYAE 909 | 0xB5A0 == code || // Lo HANGUL SYLLABLE DDEO 910 | 0xB5BC == code || // Lo HANGUL SYLLABLE DDE 911 | 0xB5D8 == code || // Lo HANGUL SYLLABLE DDYEO 912 | 0xB5F4 == code || // Lo HANGUL SYLLABLE DDYE 913 | 0xB610 == code || // Lo HANGUL SYLLABLE DDO 914 | 0xB62C == code || // Lo HANGUL SYLLABLE DDWA 915 | 0xB648 == code || // Lo HANGUL SYLLABLE DDWAE 916 | 0xB664 == code || // Lo HANGUL SYLLABLE DDOE 917 | 0xB680 == code || // Lo HANGUL SYLLABLE DDYO 918 | 0xB69C == code || // Lo HANGUL SYLLABLE DDU 919 | 0xB6B8 == code || // Lo HANGUL SYLLABLE DDWEO 920 | 0xB6D4 == code || // Lo HANGUL SYLLABLE DDWE 921 | 0xB6F0 == code || // Lo HANGUL SYLLABLE DDWI 922 | 0xB70C == code || // Lo HANGUL SYLLABLE DDYU 923 | 0xB728 == code || // Lo HANGUL SYLLABLE DDEU 924 | 0xB744 == code || // Lo HANGUL SYLLABLE DDYI 925 | 0xB760 == code || // Lo HANGUL SYLLABLE DDI 926 | 0xB77C == code || // Lo HANGUL SYLLABLE RA 927 | 0xB798 == code || // Lo HANGUL SYLLABLE RAE 928 | 0xB7B4 == code || // Lo HANGUL SYLLABLE RYA 929 | 0xB7D0 == code || // Lo HANGUL SYLLABLE RYAE 930 | 0xB7EC == code || // Lo HANGUL SYLLABLE REO 931 | 0xB808 == code || // Lo HANGUL SYLLABLE RE 932 | 0xB824 == code || // Lo HANGUL SYLLABLE RYEO 933 | 0xB840 == code || // Lo HANGUL SYLLABLE RYE 934 | 0xB85C == code || // Lo HANGUL SYLLABLE RO 935 | 0xB878 == code || // Lo HANGUL SYLLABLE RWA 936 | 0xB894 == code || // Lo HANGUL SYLLABLE RWAE 937 | 0xB8B0 == code || // Lo HANGUL SYLLABLE ROE 938 | 0xB8CC == code || // Lo HANGUL SYLLABLE RYO 939 | 0xB8E8 == code || // Lo HANGUL SYLLABLE RU 940 | 0xB904 == code || // Lo HANGUL SYLLABLE RWEO 941 | 0xB920 == code || // Lo HANGUL SYLLABLE RWE 942 | 0xB93C == code || // Lo HANGUL SYLLABLE RWI 943 | 0xB958 == code || // Lo HANGUL SYLLABLE RYU 944 | 0xB974 == code || // Lo HANGUL SYLLABLE REU 945 | 0xB990 == code || // Lo HANGUL SYLLABLE RYI 946 | 0xB9AC == code || // Lo HANGUL SYLLABLE RI 947 | 0xB9C8 == code || // Lo HANGUL SYLLABLE MA 948 | 0xB9E4 == code || // Lo HANGUL SYLLABLE MAE 949 | 0xBA00 == code || // Lo HANGUL SYLLABLE MYA 950 | 0xBA1C == code || // Lo HANGUL SYLLABLE MYAE 951 | 0xBA38 == code || // Lo HANGUL SYLLABLE MEO 952 | 0xBA54 == code || // Lo HANGUL SYLLABLE ME 953 | 0xBA70 == code || // Lo HANGUL SYLLABLE MYEO 954 | 0xBA8C == code || // Lo HANGUL SYLLABLE MYE 955 | 0xBAA8 == code || // Lo HANGUL SYLLABLE MO 956 | 0xBAC4 == code || // Lo HANGUL SYLLABLE MWA 957 | 0xBAE0 == code || // Lo HANGUL SYLLABLE MWAE 958 | 0xBAFC == code || // Lo HANGUL SYLLABLE MOE 959 | 0xBB18 == code || // Lo HANGUL SYLLABLE MYO 960 | 0xBB34 == code || // Lo HANGUL SYLLABLE MU 961 | 0xBB50 == code || // Lo HANGUL SYLLABLE MWEO 962 | 0xBB6C == code || // Lo HANGUL SYLLABLE MWE 963 | 0xBB88 == code || // Lo HANGUL SYLLABLE MWI 964 | 0xBBA4 == code || // Lo HANGUL SYLLABLE MYU 965 | 0xBBC0 == code || // Lo HANGUL SYLLABLE MEU 966 | 0xBBDC == code || // Lo HANGUL SYLLABLE MYI 967 | 0xBBF8 == code || // Lo HANGUL SYLLABLE MI 968 | 0xBC14 == code || // Lo HANGUL SYLLABLE BA 969 | 0xBC30 == code || // Lo HANGUL SYLLABLE BAE 970 | 0xBC4C == code || // Lo HANGUL SYLLABLE BYA 971 | 0xBC68 == code || // Lo HANGUL SYLLABLE BYAE 972 | 0xBC84 == code || // Lo HANGUL SYLLABLE BEO 973 | 0xBCA0 == code || // Lo HANGUL SYLLABLE BE 974 | 0xBCBC == code || // Lo HANGUL SYLLABLE BYEO 975 | 0xBCD8 == code || // Lo HANGUL SYLLABLE BYE 976 | 0xBCF4 == code || // Lo HANGUL SYLLABLE BO 977 | 0xBD10 == code || // Lo HANGUL SYLLABLE BWA 978 | 0xBD2C == code || // Lo HANGUL SYLLABLE BWAE 979 | 0xBD48 == code || // Lo HANGUL SYLLABLE BOE 980 | 0xBD64 == code || // Lo HANGUL SYLLABLE BYO 981 | 0xBD80 == code || // Lo HANGUL SYLLABLE BU 982 | 0xBD9C == code || // Lo HANGUL SYLLABLE BWEO 983 | 0xBDB8 == code || // Lo HANGUL SYLLABLE BWE 984 | 0xBDD4 == code || // Lo HANGUL SYLLABLE BWI 985 | 0xBDF0 == code || // Lo HANGUL SYLLABLE BYU 986 | 0xBE0C == code || // Lo HANGUL SYLLABLE BEU 987 | 0xBE28 == code || // Lo HANGUL SYLLABLE BYI 988 | 0xBE44 == code || // Lo HANGUL SYLLABLE BI 989 | 0xBE60 == code || // Lo HANGUL SYLLABLE BBA 990 | 0xBE7C == code || // Lo HANGUL SYLLABLE BBAE 991 | 0xBE98 == code || // Lo HANGUL SYLLABLE BBYA 992 | 0xBEB4 == code || // Lo HANGUL SYLLABLE BBYAE 993 | 0xBED0 == code || // Lo HANGUL SYLLABLE BBEO 994 | 0xBEEC == code || // Lo HANGUL SYLLABLE BBE 995 | 0xBF08 == code || // Lo HANGUL SYLLABLE BBYEO 996 | 0xBF24 == code || // Lo HANGUL SYLLABLE BBYE 997 | 0xBF40 == code || // Lo HANGUL SYLLABLE BBO 998 | 0xBF5C == code || // Lo HANGUL SYLLABLE BBWA 999 | 0xBF78 == code || // Lo HANGUL SYLLABLE BBWAE 1000 | 0xBF94 == code || // Lo HANGUL SYLLABLE BBOE 1001 | 0xBFB0 == code || // Lo HANGUL SYLLABLE BBYO 1002 | 0xBFCC == code || // Lo HANGUL SYLLABLE BBU 1003 | 0xBFE8 == code || // Lo HANGUL SYLLABLE BBWEO 1004 | 0xC004 == code || // Lo HANGUL SYLLABLE BBWE 1005 | 0xC020 == code || // Lo HANGUL SYLLABLE BBWI 1006 | 0xC03C == code || // Lo HANGUL SYLLABLE BBYU 1007 | 0xC058 == code || // Lo HANGUL SYLLABLE BBEU 1008 | 0xC074 == code || // Lo HANGUL SYLLABLE BBYI 1009 | 0xC090 == code || // Lo HANGUL SYLLABLE BBI 1010 | 0xC0AC == code || // Lo HANGUL SYLLABLE SA 1011 | 0xC0C8 == code || // Lo HANGUL SYLLABLE SAE 1012 | 0xC0E4 == code || // Lo HANGUL SYLLABLE SYA 1013 | 0xC100 == code || // Lo HANGUL SYLLABLE SYAE 1014 | 0xC11C == code || // Lo HANGUL SYLLABLE SEO 1015 | 0xC138 == code || // Lo HANGUL SYLLABLE SE 1016 | 0xC154 == code || // Lo HANGUL SYLLABLE SYEO 1017 | 0xC170 == code || // Lo HANGUL SYLLABLE SYE 1018 | 0xC18C == code || // Lo HANGUL SYLLABLE SO 1019 | 0xC1A8 == code || // Lo HANGUL SYLLABLE SWA 1020 | 0xC1C4 == code || // Lo HANGUL SYLLABLE SWAE 1021 | 0xC1E0 == code || // Lo HANGUL SYLLABLE SOE 1022 | 0xC1FC == code || // Lo HANGUL SYLLABLE SYO 1023 | 0xC218 == code || // Lo HANGUL SYLLABLE SU 1024 | 0xC234 == code || // Lo HANGUL SYLLABLE SWEO 1025 | 0xC250 == code || // Lo HANGUL SYLLABLE SWE 1026 | 0xC26C == code || // Lo HANGUL SYLLABLE SWI 1027 | 0xC288 == code || // Lo HANGUL SYLLABLE SYU 1028 | 0xC2A4 == code || // Lo HANGUL SYLLABLE SEU 1029 | 0xC2C0 == code || // Lo HANGUL SYLLABLE SYI 1030 | 0xC2DC == code || // Lo HANGUL SYLLABLE SI 1031 | 0xC2F8 == code || // Lo HANGUL SYLLABLE SSA 1032 | 0xC314 == code || // Lo HANGUL SYLLABLE SSAE 1033 | 0xC330 == code || // Lo HANGUL SYLLABLE SSYA 1034 | 0xC34C == code || // Lo HANGUL SYLLABLE SSYAE 1035 | 0xC368 == code || // Lo HANGUL SYLLABLE SSEO 1036 | 0xC384 == code || // Lo HANGUL SYLLABLE SSE 1037 | 0xC3A0 == code || // Lo HANGUL SYLLABLE SSYEO 1038 | 0xC3BC == code || // Lo HANGUL SYLLABLE SSYE 1039 | 0xC3D8 == code || // Lo HANGUL SYLLABLE SSO 1040 | 0xC3F4 == code || // Lo HANGUL SYLLABLE SSWA 1041 | 0xC410 == code || // Lo HANGUL SYLLABLE SSWAE 1042 | 0xC42C == code || // Lo HANGUL SYLLABLE SSOE 1043 | 0xC448 == code || // Lo HANGUL SYLLABLE SSYO 1044 | 0xC464 == code || // Lo HANGUL SYLLABLE SSU 1045 | 0xC480 == code || // Lo HANGUL SYLLABLE SSWEO 1046 | 0xC49C == code || // Lo HANGUL SYLLABLE SSWE 1047 | 0xC4B8 == code || // Lo HANGUL SYLLABLE SSWI 1048 | 0xC4D4 == code || // Lo HANGUL SYLLABLE SSYU 1049 | 0xC4F0 == code || // Lo HANGUL SYLLABLE SSEU 1050 | 0xC50C == code || // Lo HANGUL SYLLABLE SSYI 1051 | 0xC528 == code || // Lo HANGUL SYLLABLE SSI 1052 | 0xC544 == code || // Lo HANGUL SYLLABLE A 1053 | 0xC560 == code || // Lo HANGUL SYLLABLE AE 1054 | 0xC57C == code || // Lo HANGUL SYLLABLE YA 1055 | 0xC598 == code || // Lo HANGUL SYLLABLE YAE 1056 | 0xC5B4 == code || // Lo HANGUL SYLLABLE EO 1057 | 0xC5D0 == code || // Lo HANGUL SYLLABLE E 1058 | 0xC5EC == code || // Lo HANGUL SYLLABLE YEO 1059 | 0xC608 == code || // Lo HANGUL SYLLABLE YE 1060 | 0xC624 == code || // Lo HANGUL SYLLABLE O 1061 | 0xC640 == code || // Lo HANGUL SYLLABLE WA 1062 | 0xC65C == code || // Lo HANGUL SYLLABLE WAE 1063 | 0xC678 == code || // Lo HANGUL SYLLABLE OE 1064 | 0xC694 == code || // Lo HANGUL SYLLABLE YO 1065 | 0xC6B0 == code || // Lo HANGUL SYLLABLE U 1066 | 0xC6CC == code || // Lo HANGUL SYLLABLE WEO 1067 | 0xC6E8 == code || // Lo HANGUL SYLLABLE WE 1068 | 0xC704 == code || // Lo HANGUL SYLLABLE WI 1069 | 0xC720 == code || // Lo HANGUL SYLLABLE YU 1070 | 0xC73C == code || // Lo HANGUL SYLLABLE EU 1071 | 0xC758 == code || // Lo HANGUL SYLLABLE YI 1072 | 0xC774 == code || // Lo HANGUL SYLLABLE I 1073 | 0xC790 == code || // Lo HANGUL SYLLABLE JA 1074 | 0xC7AC == code || // Lo HANGUL SYLLABLE JAE 1075 | 0xC7C8 == code || // Lo HANGUL SYLLABLE JYA 1076 | 0xC7E4 == code || // Lo HANGUL SYLLABLE JYAE 1077 | 0xC800 == code || // Lo HANGUL SYLLABLE JEO 1078 | 0xC81C == code || // Lo HANGUL SYLLABLE JE 1079 | 0xC838 == code || // Lo HANGUL SYLLABLE JYEO 1080 | 0xC854 == code || // Lo HANGUL SYLLABLE JYE 1081 | 0xC870 == code || // Lo HANGUL SYLLABLE JO 1082 | 0xC88C == code || // Lo HANGUL SYLLABLE JWA 1083 | 0xC8A8 == code || // Lo HANGUL SYLLABLE JWAE 1084 | 0xC8C4 == code || // Lo HANGUL SYLLABLE JOE 1085 | 0xC8E0 == code || // Lo HANGUL SYLLABLE JYO 1086 | 0xC8FC == code || // Lo HANGUL SYLLABLE JU 1087 | 0xC918 == code || // Lo HANGUL SYLLABLE JWEO 1088 | 0xC934 == code || // Lo HANGUL SYLLABLE JWE 1089 | 0xC950 == code || // Lo HANGUL SYLLABLE JWI 1090 | 0xC96C == code || // Lo HANGUL SYLLABLE JYU 1091 | 0xC988 == code || // Lo HANGUL SYLLABLE JEU 1092 | 0xC9A4 == code || // Lo HANGUL SYLLABLE JYI 1093 | 0xC9C0 == code || // Lo HANGUL SYLLABLE JI 1094 | 0xC9DC == code || // Lo HANGUL SYLLABLE JJA 1095 | 0xC9F8 == code || // Lo HANGUL SYLLABLE JJAE 1096 | 0xCA14 == code || // Lo HANGUL SYLLABLE JJYA 1097 | 0xCA30 == code || // Lo HANGUL SYLLABLE JJYAE 1098 | 0xCA4C == code || // Lo HANGUL SYLLABLE JJEO 1099 | 0xCA68 == code || // Lo HANGUL SYLLABLE JJE 1100 | 0xCA84 == code || // Lo HANGUL SYLLABLE JJYEO 1101 | 0xCAA0 == code || // Lo HANGUL SYLLABLE JJYE 1102 | 0xCABC == code || // Lo HANGUL SYLLABLE JJO 1103 | 0xCAD8 == code || // Lo HANGUL SYLLABLE JJWA 1104 | 0xCAF4 == code || // Lo HANGUL SYLLABLE JJWAE 1105 | 0xCB10 == code || // Lo HANGUL SYLLABLE JJOE 1106 | 0xCB2C == code || // Lo HANGUL SYLLABLE JJYO 1107 | 0xCB48 == code || // Lo HANGUL SYLLABLE JJU 1108 | 0xCB64 == code || // Lo HANGUL SYLLABLE JJWEO 1109 | 0xCB80 == code || // Lo HANGUL SYLLABLE JJWE 1110 | 0xCB9C == code || // Lo HANGUL SYLLABLE JJWI 1111 | 0xCBB8 == code || // Lo HANGUL SYLLABLE JJYU 1112 | 0xCBD4 == code || // Lo HANGUL SYLLABLE JJEU 1113 | 0xCBF0 == code || // Lo HANGUL SYLLABLE JJYI 1114 | 0xCC0C == code || // Lo HANGUL SYLLABLE JJI 1115 | 0xCC28 == code || // Lo HANGUL SYLLABLE CA 1116 | 0xCC44 == code || // Lo HANGUL SYLLABLE CAE 1117 | 0xCC60 == code || // Lo HANGUL SYLLABLE CYA 1118 | 0xCC7C == code || // Lo HANGUL SYLLABLE CYAE 1119 | 0xCC98 == code || // Lo HANGUL SYLLABLE CEO 1120 | 0xCCB4 == code || // Lo HANGUL SYLLABLE CE 1121 | 0xCCD0 == code || // Lo HANGUL SYLLABLE CYEO 1122 | 0xCCEC == code || // Lo HANGUL SYLLABLE CYE 1123 | 0xCD08 == code || // Lo HANGUL SYLLABLE CO 1124 | 0xCD24 == code || // Lo HANGUL SYLLABLE CWA 1125 | 0xCD40 == code || // Lo HANGUL SYLLABLE CWAE 1126 | 0xCD5C == code || // Lo HANGUL SYLLABLE COE 1127 | 0xCD78 == code || // Lo HANGUL SYLLABLE CYO 1128 | 0xCD94 == code || // Lo HANGUL SYLLABLE CU 1129 | 0xCDB0 == code || // Lo HANGUL SYLLABLE CWEO 1130 | 0xCDCC == code || // Lo HANGUL SYLLABLE CWE 1131 | 0xCDE8 == code || // Lo HANGUL SYLLABLE CWI 1132 | 0xCE04 == code || // Lo HANGUL SYLLABLE CYU 1133 | 0xCE20 == code || // Lo HANGUL SYLLABLE CEU 1134 | 0xCE3C == code || // Lo HANGUL SYLLABLE CYI 1135 | 0xCE58 == code || // Lo HANGUL SYLLABLE CI 1136 | 0xCE74 == code || // Lo HANGUL SYLLABLE KA 1137 | 0xCE90 == code || // Lo HANGUL SYLLABLE KAE 1138 | 0xCEAC == code || // Lo HANGUL SYLLABLE KYA 1139 | 0xCEC8 == code || // Lo HANGUL SYLLABLE KYAE 1140 | 0xCEE4 == code || // Lo HANGUL SYLLABLE KEO 1141 | 0xCF00 == code || // Lo HANGUL SYLLABLE KE 1142 | 0xCF1C == code || // Lo HANGUL SYLLABLE KYEO 1143 | 0xCF38 == code || // Lo HANGUL SYLLABLE KYE 1144 | 0xCF54 == code || // Lo HANGUL SYLLABLE KO 1145 | 0xCF70 == code || // Lo HANGUL SYLLABLE KWA 1146 | 0xCF8C == code || // Lo HANGUL SYLLABLE KWAE 1147 | 0xCFA8 == code || // Lo HANGUL SYLLABLE KOE 1148 | 0xCFC4 == code || // Lo HANGUL SYLLABLE KYO 1149 | 0xCFE0 == code || // Lo HANGUL SYLLABLE KU 1150 | 0xCFFC == code || // Lo HANGUL SYLLABLE KWEO 1151 | 0xD018 == code || // Lo HANGUL SYLLABLE KWE 1152 | 0xD034 == code || // Lo HANGUL SYLLABLE KWI 1153 | 0xD050 == code || // Lo HANGUL SYLLABLE KYU 1154 | 0xD06C == code || // Lo HANGUL SYLLABLE KEU 1155 | 0xD088 == code || // Lo HANGUL SYLLABLE KYI 1156 | 0xD0A4 == code || // Lo HANGUL SYLLABLE KI 1157 | 0xD0C0 == code || // Lo HANGUL SYLLABLE TA 1158 | 0xD0DC == code || // Lo HANGUL SYLLABLE TAE 1159 | 0xD0F8 == code || // Lo HANGUL SYLLABLE TYA 1160 | 0xD114 == code || // Lo HANGUL SYLLABLE TYAE 1161 | 0xD130 == code || // Lo HANGUL SYLLABLE TEO 1162 | 0xD14C == code || // Lo HANGUL SYLLABLE TE 1163 | 0xD168 == code || // Lo HANGUL SYLLABLE TYEO 1164 | 0xD184 == code || // Lo HANGUL SYLLABLE TYE 1165 | 0xD1A0 == code || // Lo HANGUL SYLLABLE TO 1166 | 0xD1BC == code || // Lo HANGUL SYLLABLE TWA 1167 | 0xD1D8 == code || // Lo HANGUL SYLLABLE TWAE 1168 | 0xD1F4 == code || // Lo HANGUL SYLLABLE TOE 1169 | 0xD210 == code || // Lo HANGUL SYLLABLE TYO 1170 | 0xD22C == code || // Lo HANGUL SYLLABLE TU 1171 | 0xD248 == code || // Lo HANGUL SYLLABLE TWEO 1172 | 0xD264 == code || // Lo HANGUL SYLLABLE TWE 1173 | 0xD280 == code || // Lo HANGUL SYLLABLE TWI 1174 | 0xD29C == code || // Lo HANGUL SYLLABLE TYU 1175 | 0xD2B8 == code || // Lo HANGUL SYLLABLE TEU 1176 | 0xD2D4 == code || // Lo HANGUL SYLLABLE TYI 1177 | 0xD2F0 == code || // Lo HANGUL SYLLABLE TI 1178 | 0xD30C == code || // Lo HANGUL SYLLABLE PA 1179 | 0xD328 == code || // Lo HANGUL SYLLABLE PAE 1180 | 0xD344 == code || // Lo HANGUL SYLLABLE PYA 1181 | 0xD360 == code || // Lo HANGUL SYLLABLE PYAE 1182 | 0xD37C == code || // Lo HANGUL SYLLABLE PEO 1183 | 0xD398 == code || // Lo HANGUL SYLLABLE PE 1184 | 0xD3B4 == code || // Lo HANGUL SYLLABLE PYEO 1185 | 0xD3D0 == code || // Lo HANGUL SYLLABLE PYE 1186 | 0xD3EC == code || // Lo HANGUL SYLLABLE PO 1187 | 0xD408 == code || // Lo HANGUL SYLLABLE PWA 1188 | 0xD424 == code || // Lo HANGUL SYLLABLE PWAE 1189 | 0xD440 == code || // Lo HANGUL SYLLABLE POE 1190 | 0xD45C == code || // Lo HANGUL SYLLABLE PYO 1191 | 0xD478 == code || // Lo HANGUL SYLLABLE PU 1192 | 0xD494 == code || // Lo HANGUL SYLLABLE PWEO 1193 | 0xD4B0 == code || // Lo HANGUL SYLLABLE PWE 1194 | 0xD4CC == code || // Lo HANGUL SYLLABLE PWI 1195 | 0xD4E8 == code || // Lo HANGUL SYLLABLE PYU 1196 | 0xD504 == code || // Lo HANGUL SYLLABLE PEU 1197 | 0xD520 == code || // Lo HANGUL SYLLABLE PYI 1198 | 0xD53C == code || // Lo HANGUL SYLLABLE PI 1199 | 0xD558 == code || // Lo HANGUL SYLLABLE HA 1200 | 0xD574 == code || // Lo HANGUL SYLLABLE HAE 1201 | 0xD590 == code || // Lo HANGUL SYLLABLE HYA 1202 | 0xD5AC == code || // Lo HANGUL SYLLABLE HYAE 1203 | 0xD5C8 == code || // Lo HANGUL SYLLABLE HEO 1204 | 0xD5E4 == code || // Lo HANGUL SYLLABLE HE 1205 | 0xD600 == code || // Lo HANGUL SYLLABLE HYEO 1206 | 0xD61C == code || // Lo HANGUL SYLLABLE HYE 1207 | 0xD638 == code || // Lo HANGUL SYLLABLE HO 1208 | 0xD654 == code || // Lo HANGUL SYLLABLE HWA 1209 | 0xD670 == code || // Lo HANGUL SYLLABLE HWAE 1210 | 0xD68C == code || // Lo HANGUL SYLLABLE HOE 1211 | 0xD6A8 == code || // Lo HANGUL SYLLABLE HYO 1212 | 0xD6C4 == code || // Lo HANGUL SYLLABLE HU 1213 | 0xD6E0 == code || // Lo HANGUL SYLLABLE HWEO 1214 | 0xD6FC == code || // Lo HANGUL SYLLABLE HWE 1215 | 0xD718 == code || // Lo HANGUL SYLLABLE HWI 1216 | 0xD734 == code || // Lo HANGUL SYLLABLE HYU 1217 | 0xD750 == code || // Lo HANGUL SYLLABLE HEU 1218 | 0xD76C == code || // Lo HANGUL SYLLABLE HYI 1219 | 0xD788 == code // Lo HANGUL SYLLABLE HI 1220 | ){ 1221 | return LV; 1222 | } 1223 | 1224 | if( 1225 | (0xAC01 <= code && code <= 0xAC1B) || // Lo [27] HANGUL SYLLABLE GAG..HANGUL SYLLABLE GAH 1226 | (0xAC1D <= code && code <= 0xAC37) || // Lo [27] HANGUL SYLLABLE GAEG..HANGUL SYLLABLE GAEH 1227 | (0xAC39 <= code && code <= 0xAC53) || // Lo [27] HANGUL SYLLABLE GYAG..HANGUL SYLLABLE GYAH 1228 | (0xAC55 <= code && code <= 0xAC6F) || // Lo [27] HANGUL SYLLABLE GYAEG..HANGUL SYLLABLE GYAEH 1229 | (0xAC71 <= code && code <= 0xAC8B) || // Lo [27] HANGUL SYLLABLE GEOG..HANGUL SYLLABLE GEOH 1230 | (0xAC8D <= code && code <= 0xACA7) || // Lo [27] HANGUL SYLLABLE GEG..HANGUL SYLLABLE GEH 1231 | (0xACA9 <= code && code <= 0xACC3) || // Lo [27] HANGUL SYLLABLE GYEOG..HANGUL SYLLABLE GYEOH 1232 | (0xACC5 <= code && code <= 0xACDF) || // Lo [27] HANGUL SYLLABLE GYEG..HANGUL SYLLABLE GYEH 1233 | (0xACE1 <= code && code <= 0xACFB) || // Lo [27] HANGUL SYLLABLE GOG..HANGUL SYLLABLE GOH 1234 | (0xACFD <= code && code <= 0xAD17) || // Lo [27] HANGUL SYLLABLE GWAG..HANGUL SYLLABLE GWAH 1235 | (0xAD19 <= code && code <= 0xAD33) || // Lo [27] HANGUL SYLLABLE GWAEG..HANGUL SYLLABLE GWAEH 1236 | (0xAD35 <= code && code <= 0xAD4F) || // Lo [27] HANGUL SYLLABLE GOEG..HANGUL SYLLABLE GOEH 1237 | (0xAD51 <= code && code <= 0xAD6B) || // Lo [27] HANGUL SYLLABLE GYOG..HANGUL SYLLABLE GYOH 1238 | (0xAD6D <= code && code <= 0xAD87) || // Lo [27] HANGUL SYLLABLE GUG..HANGUL SYLLABLE GUH 1239 | (0xAD89 <= code && code <= 0xADA3) || // Lo [27] HANGUL SYLLABLE GWEOG..HANGUL SYLLABLE GWEOH 1240 | (0xADA5 <= code && code <= 0xADBF) || // Lo [27] HANGUL SYLLABLE GWEG..HANGUL SYLLABLE GWEH 1241 | (0xADC1 <= code && code <= 0xADDB) || // Lo [27] HANGUL SYLLABLE GWIG..HANGUL SYLLABLE GWIH 1242 | (0xADDD <= code && code <= 0xADF7) || // Lo [27] HANGUL SYLLABLE GYUG..HANGUL SYLLABLE GYUH 1243 | (0xADF9 <= code && code <= 0xAE13) || // Lo [27] HANGUL SYLLABLE GEUG..HANGUL SYLLABLE GEUH 1244 | (0xAE15 <= code && code <= 0xAE2F) || // Lo [27] HANGUL SYLLABLE GYIG..HANGUL SYLLABLE GYIH 1245 | (0xAE31 <= code && code <= 0xAE4B) || // Lo [27] HANGUL SYLLABLE GIG..HANGUL SYLLABLE GIH 1246 | (0xAE4D <= code && code <= 0xAE67) || // Lo [27] HANGUL SYLLABLE GGAG..HANGUL SYLLABLE GGAH 1247 | (0xAE69 <= code && code <= 0xAE83) || // Lo [27] HANGUL SYLLABLE GGAEG..HANGUL SYLLABLE GGAEH 1248 | (0xAE85 <= code && code <= 0xAE9F) || // Lo [27] HANGUL SYLLABLE GGYAG..HANGUL SYLLABLE GGYAH 1249 | (0xAEA1 <= code && code <= 0xAEBB) || // Lo [27] HANGUL SYLLABLE GGYAEG..HANGUL SYLLABLE GGYAEH 1250 | (0xAEBD <= code && code <= 0xAED7) || // Lo [27] HANGUL SYLLABLE GGEOG..HANGUL SYLLABLE GGEOH 1251 | (0xAED9 <= code && code <= 0xAEF3) || // Lo [27] HANGUL SYLLABLE GGEG..HANGUL SYLLABLE GGEH 1252 | (0xAEF5 <= code && code <= 0xAF0F) || // Lo [27] HANGUL SYLLABLE GGYEOG..HANGUL SYLLABLE GGYEOH 1253 | (0xAF11 <= code && code <= 0xAF2B) || // Lo [27] HANGUL SYLLABLE GGYEG..HANGUL SYLLABLE GGYEH 1254 | (0xAF2D <= code && code <= 0xAF47) || // Lo [27] HANGUL SYLLABLE GGOG..HANGUL SYLLABLE GGOH 1255 | (0xAF49 <= code && code <= 0xAF63) || // Lo [27] HANGUL SYLLABLE GGWAG..HANGUL SYLLABLE GGWAH 1256 | (0xAF65 <= code && code <= 0xAF7F) || // Lo [27] HANGUL SYLLABLE GGWAEG..HANGUL SYLLABLE GGWAEH 1257 | (0xAF81 <= code && code <= 0xAF9B) || // Lo [27] HANGUL SYLLABLE GGOEG..HANGUL SYLLABLE GGOEH 1258 | (0xAF9D <= code && code <= 0xAFB7) || // Lo [27] HANGUL SYLLABLE GGYOG..HANGUL SYLLABLE GGYOH 1259 | (0xAFB9 <= code && code <= 0xAFD3) || // Lo [27] HANGUL SYLLABLE GGUG..HANGUL SYLLABLE GGUH 1260 | (0xAFD5 <= code && code <= 0xAFEF) || // Lo [27] HANGUL SYLLABLE GGWEOG..HANGUL SYLLABLE GGWEOH 1261 | (0xAFF1 <= code && code <= 0xB00B) || // Lo [27] HANGUL SYLLABLE GGWEG..HANGUL SYLLABLE GGWEH 1262 | (0xB00D <= code && code <= 0xB027) || // Lo [27] HANGUL SYLLABLE GGWIG..HANGUL SYLLABLE GGWIH 1263 | (0xB029 <= code && code <= 0xB043) || // Lo [27] HANGUL SYLLABLE GGYUG..HANGUL SYLLABLE GGYUH 1264 | (0xB045 <= code && code <= 0xB05F) || // Lo [27] HANGUL SYLLABLE GGEUG..HANGUL SYLLABLE GGEUH 1265 | (0xB061 <= code && code <= 0xB07B) || // Lo [27] HANGUL SYLLABLE GGYIG..HANGUL SYLLABLE GGYIH 1266 | (0xB07D <= code && code <= 0xB097) || // Lo [27] HANGUL SYLLABLE GGIG..HANGUL SYLLABLE GGIH 1267 | (0xB099 <= code && code <= 0xB0B3) || // Lo [27] HANGUL SYLLABLE NAG..HANGUL SYLLABLE NAH 1268 | (0xB0B5 <= code && code <= 0xB0CF) || // Lo [27] HANGUL SYLLABLE NAEG..HANGUL SYLLABLE NAEH 1269 | (0xB0D1 <= code && code <= 0xB0EB) || // Lo [27] HANGUL SYLLABLE NYAG..HANGUL SYLLABLE NYAH 1270 | (0xB0ED <= code && code <= 0xB107) || // Lo [27] HANGUL SYLLABLE NYAEG..HANGUL SYLLABLE NYAEH 1271 | (0xB109 <= code && code <= 0xB123) || // Lo [27] HANGUL SYLLABLE NEOG..HANGUL SYLLABLE NEOH 1272 | (0xB125 <= code && code <= 0xB13F) || // Lo [27] HANGUL SYLLABLE NEG..HANGUL SYLLABLE NEH 1273 | (0xB141 <= code && code <= 0xB15B) || // Lo [27] HANGUL SYLLABLE NYEOG..HANGUL SYLLABLE NYEOH 1274 | (0xB15D <= code && code <= 0xB177) || // Lo [27] HANGUL SYLLABLE NYEG..HANGUL SYLLABLE NYEH 1275 | (0xB179 <= code && code <= 0xB193) || // Lo [27] HANGUL SYLLABLE NOG..HANGUL SYLLABLE NOH 1276 | (0xB195 <= code && code <= 0xB1AF) || // Lo [27] HANGUL SYLLABLE NWAG..HANGUL SYLLABLE NWAH 1277 | (0xB1B1 <= code && code <= 0xB1CB) || // Lo [27] HANGUL SYLLABLE NWAEG..HANGUL SYLLABLE NWAEH 1278 | (0xB1CD <= code && code <= 0xB1E7) || // Lo [27] HANGUL SYLLABLE NOEG..HANGUL SYLLABLE NOEH 1279 | (0xB1E9 <= code && code <= 0xB203) || // Lo [27] HANGUL SYLLABLE NYOG..HANGUL SYLLABLE NYOH 1280 | (0xB205 <= code && code <= 0xB21F) || // Lo [27] HANGUL SYLLABLE NUG..HANGUL SYLLABLE NUH 1281 | (0xB221 <= code && code <= 0xB23B) || // Lo [27] HANGUL SYLLABLE NWEOG..HANGUL SYLLABLE NWEOH 1282 | (0xB23D <= code && code <= 0xB257) || // Lo [27] HANGUL SYLLABLE NWEG..HANGUL SYLLABLE NWEH 1283 | (0xB259 <= code && code <= 0xB273) || // Lo [27] HANGUL SYLLABLE NWIG..HANGUL SYLLABLE NWIH 1284 | (0xB275 <= code && code <= 0xB28F) || // Lo [27] HANGUL SYLLABLE NYUG..HANGUL SYLLABLE NYUH 1285 | (0xB291 <= code && code <= 0xB2AB) || // Lo [27] HANGUL SYLLABLE NEUG..HANGUL SYLLABLE NEUH 1286 | (0xB2AD <= code && code <= 0xB2C7) || // Lo [27] HANGUL SYLLABLE NYIG..HANGUL SYLLABLE NYIH 1287 | (0xB2C9 <= code && code <= 0xB2E3) || // Lo [27] HANGUL SYLLABLE NIG..HANGUL SYLLABLE NIH 1288 | (0xB2E5 <= code && code <= 0xB2FF) || // Lo [27] HANGUL SYLLABLE DAG..HANGUL SYLLABLE DAH 1289 | (0xB301 <= code && code <= 0xB31B) || // Lo [27] HANGUL SYLLABLE DAEG..HANGUL SYLLABLE DAEH 1290 | (0xB31D <= code && code <= 0xB337) || // Lo [27] HANGUL SYLLABLE DYAG..HANGUL SYLLABLE DYAH 1291 | (0xB339 <= code && code <= 0xB353) || // Lo [27] HANGUL SYLLABLE DYAEG..HANGUL SYLLABLE DYAEH 1292 | (0xB355 <= code && code <= 0xB36F) || // Lo [27] HANGUL SYLLABLE DEOG..HANGUL SYLLABLE DEOH 1293 | (0xB371 <= code && code <= 0xB38B) || // Lo [27] HANGUL SYLLABLE DEG..HANGUL SYLLABLE DEH 1294 | (0xB38D <= code && code <= 0xB3A7) || // Lo [27] HANGUL SYLLABLE DYEOG..HANGUL SYLLABLE DYEOH 1295 | (0xB3A9 <= code && code <= 0xB3C3) || // Lo [27] HANGUL SYLLABLE DYEG..HANGUL SYLLABLE DYEH 1296 | (0xB3C5 <= code && code <= 0xB3DF) || // Lo [27] HANGUL SYLLABLE DOG..HANGUL SYLLABLE DOH 1297 | (0xB3E1 <= code && code <= 0xB3FB) || // Lo [27] HANGUL SYLLABLE DWAG..HANGUL SYLLABLE DWAH 1298 | (0xB3FD <= code && code <= 0xB417) || // Lo [27] HANGUL SYLLABLE DWAEG..HANGUL SYLLABLE DWAEH 1299 | (0xB419 <= code && code <= 0xB433) || // Lo [27] HANGUL SYLLABLE DOEG..HANGUL SYLLABLE DOEH 1300 | (0xB435 <= code && code <= 0xB44F) || // Lo [27] HANGUL SYLLABLE DYOG..HANGUL SYLLABLE DYOH 1301 | (0xB451 <= code && code <= 0xB46B) || // Lo [27] HANGUL SYLLABLE DUG..HANGUL SYLLABLE DUH 1302 | (0xB46D <= code && code <= 0xB487) || // Lo [27] HANGUL SYLLABLE DWEOG..HANGUL SYLLABLE DWEOH 1303 | (0xB489 <= code && code <= 0xB4A3) || // Lo [27] HANGUL SYLLABLE DWEG..HANGUL SYLLABLE DWEH 1304 | (0xB4A5 <= code && code <= 0xB4BF) || // Lo [27] HANGUL SYLLABLE DWIG..HANGUL SYLLABLE DWIH 1305 | (0xB4C1 <= code && code <= 0xB4DB) || // Lo [27] HANGUL SYLLABLE DYUG..HANGUL SYLLABLE DYUH 1306 | (0xB4DD <= code && code <= 0xB4F7) || // Lo [27] HANGUL SYLLABLE DEUG..HANGUL SYLLABLE DEUH 1307 | (0xB4F9 <= code && code <= 0xB513) || // Lo [27] HANGUL SYLLABLE DYIG..HANGUL SYLLABLE DYIH 1308 | (0xB515 <= code && code <= 0xB52F) || // Lo [27] HANGUL SYLLABLE DIG..HANGUL SYLLABLE DIH 1309 | (0xB531 <= code && code <= 0xB54B) || // Lo [27] HANGUL SYLLABLE DDAG..HANGUL SYLLABLE DDAH 1310 | (0xB54D <= code && code <= 0xB567) || // Lo [27] HANGUL SYLLABLE DDAEG..HANGUL SYLLABLE DDAEH 1311 | (0xB569 <= code && code <= 0xB583) || // Lo [27] HANGUL SYLLABLE DDYAG..HANGUL SYLLABLE DDYAH 1312 | (0xB585 <= code && code <= 0xB59F) || // Lo [27] HANGUL SYLLABLE DDYAEG..HANGUL SYLLABLE DDYAEH 1313 | (0xB5A1 <= code && code <= 0xB5BB) || // Lo [27] HANGUL SYLLABLE DDEOG..HANGUL SYLLABLE DDEOH 1314 | (0xB5BD <= code && code <= 0xB5D7) || // Lo [27] HANGUL SYLLABLE DDEG..HANGUL SYLLABLE DDEH 1315 | (0xB5D9 <= code && code <= 0xB5F3) || // Lo [27] HANGUL SYLLABLE DDYEOG..HANGUL SYLLABLE DDYEOH 1316 | (0xB5F5 <= code && code <= 0xB60F) || // Lo [27] HANGUL SYLLABLE DDYEG..HANGUL SYLLABLE DDYEH 1317 | (0xB611 <= code && code <= 0xB62B) || // Lo [27] HANGUL SYLLABLE DDOG..HANGUL SYLLABLE DDOH 1318 | (0xB62D <= code && code <= 0xB647) || // Lo [27] HANGUL SYLLABLE DDWAG..HANGUL SYLLABLE DDWAH 1319 | (0xB649 <= code && code <= 0xB663) || // Lo [27] HANGUL SYLLABLE DDWAEG..HANGUL SYLLABLE DDWAEH 1320 | (0xB665 <= code && code <= 0xB67F) || // Lo [27] HANGUL SYLLABLE DDOEG..HANGUL SYLLABLE DDOEH 1321 | (0xB681 <= code && code <= 0xB69B) || // Lo [27] HANGUL SYLLABLE DDYOG..HANGUL SYLLABLE DDYOH 1322 | (0xB69D <= code && code <= 0xB6B7) || // Lo [27] HANGUL SYLLABLE DDUG..HANGUL SYLLABLE DDUH 1323 | (0xB6B9 <= code && code <= 0xB6D3) || // Lo [27] HANGUL SYLLABLE DDWEOG..HANGUL SYLLABLE DDWEOH 1324 | (0xB6D5 <= code && code <= 0xB6EF) || // Lo [27] HANGUL SYLLABLE DDWEG..HANGUL SYLLABLE DDWEH 1325 | (0xB6F1 <= code && code <= 0xB70B) || // Lo [27] HANGUL SYLLABLE DDWIG..HANGUL SYLLABLE DDWIH 1326 | (0xB70D <= code && code <= 0xB727) || // Lo [27] HANGUL SYLLABLE DDYUG..HANGUL SYLLABLE DDYUH 1327 | (0xB729 <= code && code <= 0xB743) || // Lo [27] HANGUL SYLLABLE DDEUG..HANGUL SYLLABLE DDEUH 1328 | (0xB745 <= code && code <= 0xB75F) || // Lo [27] HANGUL SYLLABLE DDYIG..HANGUL SYLLABLE DDYIH 1329 | (0xB761 <= code && code <= 0xB77B) || // Lo [27] HANGUL SYLLABLE DDIG..HANGUL SYLLABLE DDIH 1330 | (0xB77D <= code && code <= 0xB797) || // Lo [27] HANGUL SYLLABLE RAG..HANGUL SYLLABLE RAH 1331 | (0xB799 <= code && code <= 0xB7B3) || // Lo [27] HANGUL SYLLABLE RAEG..HANGUL SYLLABLE RAEH 1332 | (0xB7B5 <= code && code <= 0xB7CF) || // Lo [27] HANGUL SYLLABLE RYAG..HANGUL SYLLABLE RYAH 1333 | (0xB7D1 <= code && code <= 0xB7EB) || // Lo [27] HANGUL SYLLABLE RYAEG..HANGUL SYLLABLE RYAEH 1334 | (0xB7ED <= code && code <= 0xB807) || // Lo [27] HANGUL SYLLABLE REOG..HANGUL SYLLABLE REOH 1335 | (0xB809 <= code && code <= 0xB823) || // Lo [27] HANGUL SYLLABLE REG..HANGUL SYLLABLE REH 1336 | (0xB825 <= code && code <= 0xB83F) || // Lo [27] HANGUL SYLLABLE RYEOG..HANGUL SYLLABLE RYEOH 1337 | (0xB841 <= code && code <= 0xB85B) || // Lo [27] HANGUL SYLLABLE RYEG..HANGUL SYLLABLE RYEH 1338 | (0xB85D <= code && code <= 0xB877) || // Lo [27] HANGUL SYLLABLE ROG..HANGUL SYLLABLE ROH 1339 | (0xB879 <= code && code <= 0xB893) || // Lo [27] HANGUL SYLLABLE RWAG..HANGUL SYLLABLE RWAH 1340 | (0xB895 <= code && code <= 0xB8AF) || // Lo [27] HANGUL SYLLABLE RWAEG..HANGUL SYLLABLE RWAEH 1341 | (0xB8B1 <= code && code <= 0xB8CB) || // Lo [27] HANGUL SYLLABLE ROEG..HANGUL SYLLABLE ROEH 1342 | (0xB8CD <= code && code <= 0xB8E7) || // Lo [27] HANGUL SYLLABLE RYOG..HANGUL SYLLABLE RYOH 1343 | (0xB8E9 <= code && code <= 0xB903) || // Lo [27] HANGUL SYLLABLE RUG..HANGUL SYLLABLE RUH 1344 | (0xB905 <= code && code <= 0xB91F) || // Lo [27] HANGUL SYLLABLE RWEOG..HANGUL SYLLABLE RWEOH 1345 | (0xB921 <= code && code <= 0xB93B) || // Lo [27] HANGUL SYLLABLE RWEG..HANGUL SYLLABLE RWEH 1346 | (0xB93D <= code && code <= 0xB957) || // Lo [27] HANGUL SYLLABLE RWIG..HANGUL SYLLABLE RWIH 1347 | (0xB959 <= code && code <= 0xB973) || // Lo [27] HANGUL SYLLABLE RYUG..HANGUL SYLLABLE RYUH 1348 | (0xB975 <= code && code <= 0xB98F) || // Lo [27] HANGUL SYLLABLE REUG..HANGUL SYLLABLE REUH 1349 | (0xB991 <= code && code <= 0xB9AB) || // Lo [27] HANGUL SYLLABLE RYIG..HANGUL SYLLABLE RYIH 1350 | (0xB9AD <= code && code <= 0xB9C7) || // Lo [27] HANGUL SYLLABLE RIG..HANGUL SYLLABLE RIH 1351 | (0xB9C9 <= code && code <= 0xB9E3) || // Lo [27] HANGUL SYLLABLE MAG..HANGUL SYLLABLE MAH 1352 | (0xB9E5 <= code && code <= 0xB9FF) || // Lo [27] HANGUL SYLLABLE MAEG..HANGUL SYLLABLE MAEH 1353 | (0xBA01 <= code && code <= 0xBA1B) || // Lo [27] HANGUL SYLLABLE MYAG..HANGUL SYLLABLE MYAH 1354 | (0xBA1D <= code && code <= 0xBA37) || // Lo [27] HANGUL SYLLABLE MYAEG..HANGUL SYLLABLE MYAEH 1355 | (0xBA39 <= code && code <= 0xBA53) || // Lo [27] HANGUL SYLLABLE MEOG..HANGUL SYLLABLE MEOH 1356 | (0xBA55 <= code && code <= 0xBA6F) || // Lo [27] HANGUL SYLLABLE MEG..HANGUL SYLLABLE MEH 1357 | (0xBA71 <= code && code <= 0xBA8B) || // Lo [27] HANGUL SYLLABLE MYEOG..HANGUL SYLLABLE MYEOH 1358 | (0xBA8D <= code && code <= 0xBAA7) || // Lo [27] HANGUL SYLLABLE MYEG..HANGUL SYLLABLE MYEH 1359 | (0xBAA9 <= code && code <= 0xBAC3) || // Lo [27] HANGUL SYLLABLE MOG..HANGUL SYLLABLE MOH 1360 | (0xBAC5 <= code && code <= 0xBADF) || // Lo [27] HANGUL SYLLABLE MWAG..HANGUL SYLLABLE MWAH 1361 | (0xBAE1 <= code && code <= 0xBAFB) || // Lo [27] HANGUL SYLLABLE MWAEG..HANGUL SYLLABLE MWAEH 1362 | (0xBAFD <= code && code <= 0xBB17) || // Lo [27] HANGUL SYLLABLE MOEG..HANGUL SYLLABLE MOEH 1363 | (0xBB19 <= code && code <= 0xBB33) || // Lo [27] HANGUL SYLLABLE MYOG..HANGUL SYLLABLE MYOH 1364 | (0xBB35 <= code && code <= 0xBB4F) || // Lo [27] HANGUL SYLLABLE MUG..HANGUL SYLLABLE MUH 1365 | (0xBB51 <= code && code <= 0xBB6B) || // Lo [27] HANGUL SYLLABLE MWEOG..HANGUL SYLLABLE MWEOH 1366 | (0xBB6D <= code && code <= 0xBB87) || // Lo [27] HANGUL SYLLABLE MWEG..HANGUL SYLLABLE MWEH 1367 | (0xBB89 <= code && code <= 0xBBA3) || // Lo [27] HANGUL SYLLABLE MWIG..HANGUL SYLLABLE MWIH 1368 | (0xBBA5 <= code && code <= 0xBBBF) || // Lo [27] HANGUL SYLLABLE MYUG..HANGUL SYLLABLE MYUH 1369 | (0xBBC1 <= code && code <= 0xBBDB) || // Lo [27] HANGUL SYLLABLE MEUG..HANGUL SYLLABLE MEUH 1370 | (0xBBDD <= code && code <= 0xBBF7) || // Lo [27] HANGUL SYLLABLE MYIG..HANGUL SYLLABLE MYIH 1371 | (0xBBF9 <= code && code <= 0xBC13) || // Lo [27] HANGUL SYLLABLE MIG..HANGUL SYLLABLE MIH 1372 | (0xBC15 <= code && code <= 0xBC2F) || // Lo [27] HANGUL SYLLABLE BAG..HANGUL SYLLABLE BAH 1373 | (0xBC31 <= code && code <= 0xBC4B) || // Lo [27] HANGUL SYLLABLE BAEG..HANGUL SYLLABLE BAEH 1374 | (0xBC4D <= code && code <= 0xBC67) || // Lo [27] HANGUL SYLLABLE BYAG..HANGUL SYLLABLE BYAH 1375 | (0xBC69 <= code && code <= 0xBC83) || // Lo [27] HANGUL SYLLABLE BYAEG..HANGUL SYLLABLE BYAEH 1376 | (0xBC85 <= code && code <= 0xBC9F) || // Lo [27] HANGUL SYLLABLE BEOG..HANGUL SYLLABLE BEOH 1377 | (0xBCA1 <= code && code <= 0xBCBB) || // Lo [27] HANGUL SYLLABLE BEG..HANGUL SYLLABLE BEH 1378 | (0xBCBD <= code && code <= 0xBCD7) || // Lo [27] HANGUL SYLLABLE BYEOG..HANGUL SYLLABLE BYEOH 1379 | (0xBCD9 <= code && code <= 0xBCF3) || // Lo [27] HANGUL SYLLABLE BYEG..HANGUL SYLLABLE BYEH 1380 | (0xBCF5 <= code && code <= 0xBD0F) || // Lo [27] HANGUL SYLLABLE BOG..HANGUL SYLLABLE BOH 1381 | (0xBD11 <= code && code <= 0xBD2B) || // Lo [27] HANGUL SYLLABLE BWAG..HANGUL SYLLABLE BWAH 1382 | (0xBD2D <= code && code <= 0xBD47) || // Lo [27] HANGUL SYLLABLE BWAEG..HANGUL SYLLABLE BWAEH 1383 | (0xBD49 <= code && code <= 0xBD63) || // Lo [27] HANGUL SYLLABLE BOEG..HANGUL SYLLABLE BOEH 1384 | (0xBD65 <= code && code <= 0xBD7F) || // Lo [27] HANGUL SYLLABLE BYOG..HANGUL SYLLABLE BYOH 1385 | (0xBD81 <= code && code <= 0xBD9B) || // Lo [27] HANGUL SYLLABLE BUG..HANGUL SYLLABLE BUH 1386 | (0xBD9D <= code && code <= 0xBDB7) || // Lo [27] HANGUL SYLLABLE BWEOG..HANGUL SYLLABLE BWEOH 1387 | (0xBDB9 <= code && code <= 0xBDD3) || // Lo [27] HANGUL SYLLABLE BWEG..HANGUL SYLLABLE BWEH 1388 | (0xBDD5 <= code && code <= 0xBDEF) || // Lo [27] HANGUL SYLLABLE BWIG..HANGUL SYLLABLE BWIH 1389 | (0xBDF1 <= code && code <= 0xBE0B) || // Lo [27] HANGUL SYLLABLE BYUG..HANGUL SYLLABLE BYUH 1390 | (0xBE0D <= code && code <= 0xBE27) || // Lo [27] HANGUL SYLLABLE BEUG..HANGUL SYLLABLE BEUH 1391 | (0xBE29 <= code && code <= 0xBE43) || // Lo [27] HANGUL SYLLABLE BYIG..HANGUL SYLLABLE BYIH 1392 | (0xBE45 <= code && code <= 0xBE5F) || // Lo [27] HANGUL SYLLABLE BIG..HANGUL SYLLABLE BIH 1393 | (0xBE61 <= code && code <= 0xBE7B) || // Lo [27] HANGUL SYLLABLE BBAG..HANGUL SYLLABLE BBAH 1394 | (0xBE7D <= code && code <= 0xBE97) || // Lo [27] HANGUL SYLLABLE BBAEG..HANGUL SYLLABLE BBAEH 1395 | (0xBE99 <= code && code <= 0xBEB3) || // Lo [27] HANGUL SYLLABLE BBYAG..HANGUL SYLLABLE BBYAH 1396 | (0xBEB5 <= code && code <= 0xBECF) || // Lo [27] HANGUL SYLLABLE BBYAEG..HANGUL SYLLABLE BBYAEH 1397 | (0xBED1 <= code && code <= 0xBEEB) || // Lo [27] HANGUL SYLLABLE BBEOG..HANGUL SYLLABLE BBEOH 1398 | (0xBEED <= code && code <= 0xBF07) || // Lo [27] HANGUL SYLLABLE BBEG..HANGUL SYLLABLE BBEH 1399 | (0xBF09 <= code && code <= 0xBF23) || // Lo [27] HANGUL SYLLABLE BBYEOG..HANGUL SYLLABLE BBYEOH 1400 | (0xBF25 <= code && code <= 0xBF3F) || // Lo [27] HANGUL SYLLABLE BBYEG..HANGUL SYLLABLE BBYEH 1401 | (0xBF41 <= code && code <= 0xBF5B) || // Lo [27] HANGUL SYLLABLE BBOG..HANGUL SYLLABLE BBOH 1402 | (0xBF5D <= code && code <= 0xBF77) || // Lo [27] HANGUL SYLLABLE BBWAG..HANGUL SYLLABLE BBWAH 1403 | (0xBF79 <= code && code <= 0xBF93) || // Lo [27] HANGUL SYLLABLE BBWAEG..HANGUL SYLLABLE BBWAEH 1404 | (0xBF95 <= code && code <= 0xBFAF) || // Lo [27] HANGUL SYLLABLE BBOEG..HANGUL SYLLABLE BBOEH 1405 | (0xBFB1 <= code && code <= 0xBFCB) || // Lo [27] HANGUL SYLLABLE BBYOG..HANGUL SYLLABLE BBYOH 1406 | (0xBFCD <= code && code <= 0xBFE7) || // Lo [27] HANGUL SYLLABLE BBUG..HANGUL SYLLABLE BBUH 1407 | (0xBFE9 <= code && code <= 0xC003) || // Lo [27] HANGUL SYLLABLE BBWEOG..HANGUL SYLLABLE BBWEOH 1408 | (0xC005 <= code && code <= 0xC01F) || // Lo [27] HANGUL SYLLABLE BBWEG..HANGUL SYLLABLE BBWEH 1409 | (0xC021 <= code && code <= 0xC03B) || // Lo [27] HANGUL SYLLABLE BBWIG..HANGUL SYLLABLE BBWIH 1410 | (0xC03D <= code && code <= 0xC057) || // Lo [27] HANGUL SYLLABLE BBYUG..HANGUL SYLLABLE BBYUH 1411 | (0xC059 <= code && code <= 0xC073) || // Lo [27] HANGUL SYLLABLE BBEUG..HANGUL SYLLABLE BBEUH 1412 | (0xC075 <= code && code <= 0xC08F) || // Lo [27] HANGUL SYLLABLE BBYIG..HANGUL SYLLABLE BBYIH 1413 | (0xC091 <= code && code <= 0xC0AB) || // Lo [27] HANGUL SYLLABLE BBIG..HANGUL SYLLABLE BBIH 1414 | (0xC0AD <= code && code <= 0xC0C7) || // Lo [27] HANGUL SYLLABLE SAG..HANGUL SYLLABLE SAH 1415 | (0xC0C9 <= code && code <= 0xC0E3) || // Lo [27] HANGUL SYLLABLE SAEG..HANGUL SYLLABLE SAEH 1416 | (0xC0E5 <= code && code <= 0xC0FF) || // Lo [27] HANGUL SYLLABLE SYAG..HANGUL SYLLABLE SYAH 1417 | (0xC101 <= code && code <= 0xC11B) || // Lo [27] HANGUL SYLLABLE SYAEG..HANGUL SYLLABLE SYAEH 1418 | (0xC11D <= code && code <= 0xC137) || // Lo [27] HANGUL SYLLABLE SEOG..HANGUL SYLLABLE SEOH 1419 | (0xC139 <= code && code <= 0xC153) || // Lo [27] HANGUL SYLLABLE SEG..HANGUL SYLLABLE SEH 1420 | (0xC155 <= code && code <= 0xC16F) || // Lo [27] HANGUL SYLLABLE SYEOG..HANGUL SYLLABLE SYEOH 1421 | (0xC171 <= code && code <= 0xC18B) || // Lo [27] HANGUL SYLLABLE SYEG..HANGUL SYLLABLE SYEH 1422 | (0xC18D <= code && code <= 0xC1A7) || // Lo [27] HANGUL SYLLABLE SOG..HANGUL SYLLABLE SOH 1423 | (0xC1A9 <= code && code <= 0xC1C3) || // Lo [27] HANGUL SYLLABLE SWAG..HANGUL SYLLABLE SWAH 1424 | (0xC1C5 <= code && code <= 0xC1DF) || // Lo [27] HANGUL SYLLABLE SWAEG..HANGUL SYLLABLE SWAEH 1425 | (0xC1E1 <= code && code <= 0xC1FB) || // Lo [27] HANGUL SYLLABLE SOEG..HANGUL SYLLABLE SOEH 1426 | (0xC1FD <= code && code <= 0xC217) || // Lo [27] HANGUL SYLLABLE SYOG..HANGUL SYLLABLE SYOH 1427 | (0xC219 <= code && code <= 0xC233) || // Lo [27] HANGUL SYLLABLE SUG..HANGUL SYLLABLE SUH 1428 | (0xC235 <= code && code <= 0xC24F) || // Lo [27] HANGUL SYLLABLE SWEOG..HANGUL SYLLABLE SWEOH 1429 | (0xC251 <= code && code <= 0xC26B) || // Lo [27] HANGUL SYLLABLE SWEG..HANGUL SYLLABLE SWEH 1430 | (0xC26D <= code && code <= 0xC287) || // Lo [27] HANGUL SYLLABLE SWIG..HANGUL SYLLABLE SWIH 1431 | (0xC289 <= code && code <= 0xC2A3) || // Lo [27] HANGUL SYLLABLE SYUG..HANGUL SYLLABLE SYUH 1432 | (0xC2A5 <= code && code <= 0xC2BF) || // Lo [27] HANGUL SYLLABLE SEUG..HANGUL SYLLABLE SEUH 1433 | (0xC2C1 <= code && code <= 0xC2DB) || // Lo [27] HANGUL SYLLABLE SYIG..HANGUL SYLLABLE SYIH 1434 | (0xC2DD <= code && code <= 0xC2F7) || // Lo [27] HANGUL SYLLABLE SIG..HANGUL SYLLABLE SIH 1435 | (0xC2F9 <= code && code <= 0xC313) || // Lo [27] HANGUL SYLLABLE SSAG..HANGUL SYLLABLE SSAH 1436 | (0xC315 <= code && code <= 0xC32F) || // Lo [27] HANGUL SYLLABLE SSAEG..HANGUL SYLLABLE SSAEH 1437 | (0xC331 <= code && code <= 0xC34B) || // Lo [27] HANGUL SYLLABLE SSYAG..HANGUL SYLLABLE SSYAH 1438 | (0xC34D <= code && code <= 0xC367) || // Lo [27] HANGUL SYLLABLE SSYAEG..HANGUL SYLLABLE SSYAEH 1439 | (0xC369 <= code && code <= 0xC383) || // Lo [27] HANGUL SYLLABLE SSEOG..HANGUL SYLLABLE SSEOH 1440 | (0xC385 <= code && code <= 0xC39F) || // Lo [27] HANGUL SYLLABLE SSEG..HANGUL SYLLABLE SSEH 1441 | (0xC3A1 <= code && code <= 0xC3BB) || // Lo [27] HANGUL SYLLABLE SSYEOG..HANGUL SYLLABLE SSYEOH 1442 | (0xC3BD <= code && code <= 0xC3D7) || // Lo [27] HANGUL SYLLABLE SSYEG..HANGUL SYLLABLE SSYEH 1443 | (0xC3D9 <= code && code <= 0xC3F3) || // Lo [27] HANGUL SYLLABLE SSOG..HANGUL SYLLABLE SSOH 1444 | (0xC3F5 <= code && code <= 0xC40F) || // Lo [27] HANGUL SYLLABLE SSWAG..HANGUL SYLLABLE SSWAH 1445 | (0xC411 <= code && code <= 0xC42B) || // Lo [27] HANGUL SYLLABLE SSWAEG..HANGUL SYLLABLE SSWAEH 1446 | (0xC42D <= code && code <= 0xC447) || // Lo [27] HANGUL SYLLABLE SSOEG..HANGUL SYLLABLE SSOEH 1447 | (0xC449 <= code && code <= 0xC463) || // Lo [27] HANGUL SYLLABLE SSYOG..HANGUL SYLLABLE SSYOH 1448 | (0xC465 <= code && code <= 0xC47F) || // Lo [27] HANGUL SYLLABLE SSUG..HANGUL SYLLABLE SSUH 1449 | (0xC481 <= code && code <= 0xC49B) || // Lo [27] HANGUL SYLLABLE SSWEOG..HANGUL SYLLABLE SSWEOH 1450 | (0xC49D <= code && code <= 0xC4B7) || // Lo [27] HANGUL SYLLABLE SSWEG..HANGUL SYLLABLE SSWEH 1451 | (0xC4B9 <= code && code <= 0xC4D3) || // Lo [27] HANGUL SYLLABLE SSWIG..HANGUL SYLLABLE SSWIH 1452 | (0xC4D5 <= code && code <= 0xC4EF) || // Lo [27] HANGUL SYLLABLE SSYUG..HANGUL SYLLABLE SSYUH 1453 | (0xC4F1 <= code && code <= 0xC50B) || // Lo [27] HANGUL SYLLABLE SSEUG..HANGUL SYLLABLE SSEUH 1454 | (0xC50D <= code && code <= 0xC527) || // Lo [27] HANGUL SYLLABLE SSYIG..HANGUL SYLLABLE SSYIH 1455 | (0xC529 <= code && code <= 0xC543) || // Lo [27] HANGUL SYLLABLE SSIG..HANGUL SYLLABLE SSIH 1456 | (0xC545 <= code && code <= 0xC55F) || // Lo [27] HANGUL SYLLABLE AG..HANGUL SYLLABLE AH 1457 | (0xC561 <= code && code <= 0xC57B) || // Lo [27] HANGUL SYLLABLE AEG..HANGUL SYLLABLE AEH 1458 | (0xC57D <= code && code <= 0xC597) || // Lo [27] HANGUL SYLLABLE YAG..HANGUL SYLLABLE YAH 1459 | (0xC599 <= code && code <= 0xC5B3) || // Lo [27] HANGUL SYLLABLE YAEG..HANGUL SYLLABLE YAEH 1460 | (0xC5B5 <= code && code <= 0xC5CF) || // Lo [27] HANGUL SYLLABLE EOG..HANGUL SYLLABLE EOH 1461 | (0xC5D1 <= code && code <= 0xC5EB) || // Lo [27] HANGUL SYLLABLE EG..HANGUL SYLLABLE EH 1462 | (0xC5ED <= code && code <= 0xC607) || // Lo [27] HANGUL SYLLABLE YEOG..HANGUL SYLLABLE YEOH 1463 | (0xC609 <= code && code <= 0xC623) || // Lo [27] HANGUL SYLLABLE YEG..HANGUL SYLLABLE YEH 1464 | (0xC625 <= code && code <= 0xC63F) || // Lo [27] HANGUL SYLLABLE OG..HANGUL SYLLABLE OH 1465 | (0xC641 <= code && code <= 0xC65B) || // Lo [27] HANGUL SYLLABLE WAG..HANGUL SYLLABLE WAH 1466 | (0xC65D <= code && code <= 0xC677) || // Lo [27] HANGUL SYLLABLE WAEG..HANGUL SYLLABLE WAEH 1467 | (0xC679 <= code && code <= 0xC693) || // Lo [27] HANGUL SYLLABLE OEG..HANGUL SYLLABLE OEH 1468 | (0xC695 <= code && code <= 0xC6AF) || // Lo [27] HANGUL SYLLABLE YOG..HANGUL SYLLABLE YOH 1469 | (0xC6B1 <= code && code <= 0xC6CB) || // Lo [27] HANGUL SYLLABLE UG..HANGUL SYLLABLE UH 1470 | (0xC6CD <= code && code <= 0xC6E7) || // Lo [27] HANGUL SYLLABLE WEOG..HANGUL SYLLABLE WEOH 1471 | (0xC6E9 <= code && code <= 0xC703) || // Lo [27] HANGUL SYLLABLE WEG..HANGUL SYLLABLE WEH 1472 | (0xC705 <= code && code <= 0xC71F) || // Lo [27] HANGUL SYLLABLE WIG..HANGUL SYLLABLE WIH 1473 | (0xC721 <= code && code <= 0xC73B) || // Lo [27] HANGUL SYLLABLE YUG..HANGUL SYLLABLE YUH 1474 | (0xC73D <= code && code <= 0xC757) || // Lo [27] HANGUL SYLLABLE EUG..HANGUL SYLLABLE EUH 1475 | (0xC759 <= code && code <= 0xC773) || // Lo [27] HANGUL SYLLABLE YIG..HANGUL SYLLABLE YIH 1476 | (0xC775 <= code && code <= 0xC78F) || // Lo [27] HANGUL SYLLABLE IG..HANGUL SYLLABLE IH 1477 | (0xC791 <= code && code <= 0xC7AB) || // Lo [27] HANGUL SYLLABLE JAG..HANGUL SYLLABLE JAH 1478 | (0xC7AD <= code && code <= 0xC7C7) || // Lo [27] HANGUL SYLLABLE JAEG..HANGUL SYLLABLE JAEH 1479 | (0xC7C9 <= code && code <= 0xC7E3) || // Lo [27] HANGUL SYLLABLE JYAG..HANGUL SYLLABLE JYAH 1480 | (0xC7E5 <= code && code <= 0xC7FF) || // Lo [27] HANGUL SYLLABLE JYAEG..HANGUL SYLLABLE JYAEH 1481 | (0xC801 <= code && code <= 0xC81B) || // Lo [27] HANGUL SYLLABLE JEOG..HANGUL SYLLABLE JEOH 1482 | (0xC81D <= code && code <= 0xC837) || // Lo [27] HANGUL SYLLABLE JEG..HANGUL SYLLABLE JEH 1483 | (0xC839 <= code && code <= 0xC853) || // Lo [27] HANGUL SYLLABLE JYEOG..HANGUL SYLLABLE JYEOH 1484 | (0xC855 <= code && code <= 0xC86F) || // Lo [27] HANGUL SYLLABLE JYEG..HANGUL SYLLABLE JYEH 1485 | (0xC871 <= code && code <= 0xC88B) || // Lo [27] HANGUL SYLLABLE JOG..HANGUL SYLLABLE JOH 1486 | (0xC88D <= code && code <= 0xC8A7) || // Lo [27] HANGUL SYLLABLE JWAG..HANGUL SYLLABLE JWAH 1487 | (0xC8A9 <= code && code <= 0xC8C3) || // Lo [27] HANGUL SYLLABLE JWAEG..HANGUL SYLLABLE JWAEH 1488 | (0xC8C5 <= code && code <= 0xC8DF) || // Lo [27] HANGUL SYLLABLE JOEG..HANGUL SYLLABLE JOEH 1489 | (0xC8E1 <= code && code <= 0xC8FB) || // Lo [27] HANGUL SYLLABLE JYOG..HANGUL SYLLABLE JYOH 1490 | (0xC8FD <= code && code <= 0xC917) || // Lo [27] HANGUL SYLLABLE JUG..HANGUL SYLLABLE JUH 1491 | (0xC919 <= code && code <= 0xC933) || // Lo [27] HANGUL SYLLABLE JWEOG..HANGUL SYLLABLE JWEOH 1492 | (0xC935 <= code && code <= 0xC94F) || // Lo [27] HANGUL SYLLABLE JWEG..HANGUL SYLLABLE JWEH 1493 | (0xC951 <= code && code <= 0xC96B) || // Lo [27] HANGUL SYLLABLE JWIG..HANGUL SYLLABLE JWIH 1494 | (0xC96D <= code && code <= 0xC987) || // Lo [27] HANGUL SYLLABLE JYUG..HANGUL SYLLABLE JYUH 1495 | (0xC989 <= code && code <= 0xC9A3) || // Lo [27] HANGUL SYLLABLE JEUG..HANGUL SYLLABLE JEUH 1496 | (0xC9A5 <= code && code <= 0xC9BF) || // Lo [27] HANGUL SYLLABLE JYIG..HANGUL SYLLABLE JYIH 1497 | (0xC9C1 <= code && code <= 0xC9DB) || // Lo [27] HANGUL SYLLABLE JIG..HANGUL SYLLABLE JIH 1498 | (0xC9DD <= code && code <= 0xC9F7) || // Lo [27] HANGUL SYLLABLE JJAG..HANGUL SYLLABLE JJAH 1499 | (0xC9F9 <= code && code <= 0xCA13) || // Lo [27] HANGUL SYLLABLE JJAEG..HANGUL SYLLABLE JJAEH 1500 | (0xCA15 <= code && code <= 0xCA2F) || // Lo [27] HANGUL SYLLABLE JJYAG..HANGUL SYLLABLE JJYAH 1501 | (0xCA31 <= code && code <= 0xCA4B) || // Lo [27] HANGUL SYLLABLE JJYAEG..HANGUL SYLLABLE JJYAEH 1502 | (0xCA4D <= code && code <= 0xCA67) || // Lo [27] HANGUL SYLLABLE JJEOG..HANGUL SYLLABLE JJEOH 1503 | (0xCA69 <= code && code <= 0xCA83) || // Lo [27] HANGUL SYLLABLE JJEG..HANGUL SYLLABLE JJEH 1504 | (0xCA85 <= code && code <= 0xCA9F) || // Lo [27] HANGUL SYLLABLE JJYEOG..HANGUL SYLLABLE JJYEOH 1505 | (0xCAA1 <= code && code <= 0xCABB) || // Lo [27] HANGUL SYLLABLE JJYEG..HANGUL SYLLABLE JJYEH 1506 | (0xCABD <= code && code <= 0xCAD7) || // Lo [27] HANGUL SYLLABLE JJOG..HANGUL SYLLABLE JJOH 1507 | (0xCAD9 <= code && code <= 0xCAF3) || // Lo [27] HANGUL SYLLABLE JJWAG..HANGUL SYLLABLE JJWAH 1508 | (0xCAF5 <= code && code <= 0xCB0F) || // Lo [27] HANGUL SYLLABLE JJWAEG..HANGUL SYLLABLE JJWAEH 1509 | (0xCB11 <= code && code <= 0xCB2B) || // Lo [27] HANGUL SYLLABLE JJOEG..HANGUL SYLLABLE JJOEH 1510 | (0xCB2D <= code && code <= 0xCB47) || // Lo [27] HANGUL SYLLABLE JJYOG..HANGUL SYLLABLE JJYOH 1511 | (0xCB49 <= code && code <= 0xCB63) || // Lo [27] HANGUL SYLLABLE JJUG..HANGUL SYLLABLE JJUH 1512 | (0xCB65 <= code && code <= 0xCB7F) || // Lo [27] HANGUL SYLLABLE JJWEOG..HANGUL SYLLABLE JJWEOH 1513 | (0xCB81 <= code && code <= 0xCB9B) || // Lo [27] HANGUL SYLLABLE JJWEG..HANGUL SYLLABLE JJWEH 1514 | (0xCB9D <= code && code <= 0xCBB7) || // Lo [27] HANGUL SYLLABLE JJWIG..HANGUL SYLLABLE JJWIH 1515 | (0xCBB9 <= code && code <= 0xCBD3) || // Lo [27] HANGUL SYLLABLE JJYUG..HANGUL SYLLABLE JJYUH 1516 | (0xCBD5 <= code && code <= 0xCBEF) || // Lo [27] HANGUL SYLLABLE JJEUG..HANGUL SYLLABLE JJEUH 1517 | (0xCBF1 <= code && code <= 0xCC0B) || // Lo [27] HANGUL SYLLABLE JJYIG..HANGUL SYLLABLE JJYIH 1518 | (0xCC0D <= code && code <= 0xCC27) || // Lo [27] HANGUL SYLLABLE JJIG..HANGUL SYLLABLE JJIH 1519 | (0xCC29 <= code && code <= 0xCC43) || // Lo [27] HANGUL SYLLABLE CAG..HANGUL SYLLABLE CAH 1520 | (0xCC45 <= code && code <= 0xCC5F) || // Lo [27] HANGUL SYLLABLE CAEG..HANGUL SYLLABLE CAEH 1521 | (0xCC61 <= code && code <= 0xCC7B) || // Lo [27] HANGUL SYLLABLE CYAG..HANGUL SYLLABLE CYAH 1522 | (0xCC7D <= code && code <= 0xCC97) || // Lo [27] HANGUL SYLLABLE CYAEG..HANGUL SYLLABLE CYAEH 1523 | (0xCC99 <= code && code <= 0xCCB3) || // Lo [27] HANGUL SYLLABLE CEOG..HANGUL SYLLABLE CEOH 1524 | (0xCCB5 <= code && code <= 0xCCCF) || // Lo [27] HANGUL SYLLABLE CEG..HANGUL SYLLABLE CEH 1525 | (0xCCD1 <= code && code <= 0xCCEB) || // Lo [27] HANGUL SYLLABLE CYEOG..HANGUL SYLLABLE CYEOH 1526 | (0xCCED <= code && code <= 0xCD07) || // Lo [27] HANGUL SYLLABLE CYEG..HANGUL SYLLABLE CYEH 1527 | (0xCD09 <= code && code <= 0xCD23) || // Lo [27] HANGUL SYLLABLE COG..HANGUL SYLLABLE COH 1528 | (0xCD25 <= code && code <= 0xCD3F) || // Lo [27] HANGUL SYLLABLE CWAG..HANGUL SYLLABLE CWAH 1529 | (0xCD41 <= code && code <= 0xCD5B) || // Lo [27] HANGUL SYLLABLE CWAEG..HANGUL SYLLABLE CWAEH 1530 | (0xCD5D <= code && code <= 0xCD77) || // Lo [27] HANGUL SYLLABLE COEG..HANGUL SYLLABLE COEH 1531 | (0xCD79 <= code && code <= 0xCD93) || // Lo [27] HANGUL SYLLABLE CYOG..HANGUL SYLLABLE CYOH 1532 | (0xCD95 <= code && code <= 0xCDAF) || // Lo [27] HANGUL SYLLABLE CUG..HANGUL SYLLABLE CUH 1533 | (0xCDB1 <= code && code <= 0xCDCB) || // Lo [27] HANGUL SYLLABLE CWEOG..HANGUL SYLLABLE CWEOH 1534 | (0xCDCD <= code && code <= 0xCDE7) || // Lo [27] HANGUL SYLLABLE CWEG..HANGUL SYLLABLE CWEH 1535 | (0xCDE9 <= code && code <= 0xCE03) || // Lo [27] HANGUL SYLLABLE CWIG..HANGUL SYLLABLE CWIH 1536 | (0xCE05 <= code && code <= 0xCE1F) || // Lo [27] HANGUL SYLLABLE CYUG..HANGUL SYLLABLE CYUH 1537 | (0xCE21 <= code && code <= 0xCE3B) || // Lo [27] HANGUL SYLLABLE CEUG..HANGUL SYLLABLE CEUH 1538 | (0xCE3D <= code && code <= 0xCE57) || // Lo [27] HANGUL SYLLABLE CYIG..HANGUL SYLLABLE CYIH 1539 | (0xCE59 <= code && code <= 0xCE73) || // Lo [27] HANGUL SYLLABLE CIG..HANGUL SYLLABLE CIH 1540 | (0xCE75 <= code && code <= 0xCE8F) || // Lo [27] HANGUL SYLLABLE KAG..HANGUL SYLLABLE KAH 1541 | (0xCE91 <= code && code <= 0xCEAB) || // Lo [27] HANGUL SYLLABLE KAEG..HANGUL SYLLABLE KAEH 1542 | (0xCEAD <= code && code <= 0xCEC7) || // Lo [27] HANGUL SYLLABLE KYAG..HANGUL SYLLABLE KYAH 1543 | (0xCEC9 <= code && code <= 0xCEE3) || // Lo [27] HANGUL SYLLABLE KYAEG..HANGUL SYLLABLE KYAEH 1544 | (0xCEE5 <= code && code <= 0xCEFF) || // Lo [27] HANGUL SYLLABLE KEOG..HANGUL SYLLABLE KEOH 1545 | (0xCF01 <= code && code <= 0xCF1B) || // Lo [27] HANGUL SYLLABLE KEG..HANGUL SYLLABLE KEH 1546 | (0xCF1D <= code && code <= 0xCF37) || // Lo [27] HANGUL SYLLABLE KYEOG..HANGUL SYLLABLE KYEOH 1547 | (0xCF39 <= code && code <= 0xCF53) || // Lo [27] HANGUL SYLLABLE KYEG..HANGUL SYLLABLE KYEH 1548 | (0xCF55 <= code && code <= 0xCF6F) || // Lo [27] HANGUL SYLLABLE KOG..HANGUL SYLLABLE KOH 1549 | (0xCF71 <= code && code <= 0xCF8B) || // Lo [27] HANGUL SYLLABLE KWAG..HANGUL SYLLABLE KWAH 1550 | (0xCF8D <= code && code <= 0xCFA7) || // Lo [27] HANGUL SYLLABLE KWAEG..HANGUL SYLLABLE KWAEH 1551 | (0xCFA9 <= code && code <= 0xCFC3) || // Lo [27] HANGUL SYLLABLE KOEG..HANGUL SYLLABLE KOEH 1552 | (0xCFC5 <= code && code <= 0xCFDF) || // Lo [27] HANGUL SYLLABLE KYOG..HANGUL SYLLABLE KYOH 1553 | (0xCFE1 <= code && code <= 0xCFFB) || // Lo [27] HANGUL SYLLABLE KUG..HANGUL SYLLABLE KUH 1554 | (0xCFFD <= code && code <= 0xD017) || // Lo [27] HANGUL SYLLABLE KWEOG..HANGUL SYLLABLE KWEOH 1555 | (0xD019 <= code && code <= 0xD033) || // Lo [27] HANGUL SYLLABLE KWEG..HANGUL SYLLABLE KWEH 1556 | (0xD035 <= code && code <= 0xD04F) || // Lo [27] HANGUL SYLLABLE KWIG..HANGUL SYLLABLE KWIH 1557 | (0xD051 <= code && code <= 0xD06B) || // Lo [27] HANGUL SYLLABLE KYUG..HANGUL SYLLABLE KYUH 1558 | (0xD06D <= code && code <= 0xD087) || // Lo [27] HANGUL SYLLABLE KEUG..HANGUL SYLLABLE KEUH 1559 | (0xD089 <= code && code <= 0xD0A3) || // Lo [27] HANGUL SYLLABLE KYIG..HANGUL SYLLABLE KYIH 1560 | (0xD0A5 <= code && code <= 0xD0BF) || // Lo [27] HANGUL SYLLABLE KIG..HANGUL SYLLABLE KIH 1561 | (0xD0C1 <= code && code <= 0xD0DB) || // Lo [27] HANGUL SYLLABLE TAG..HANGUL SYLLABLE TAH 1562 | (0xD0DD <= code && code <= 0xD0F7) || // Lo [27] HANGUL SYLLABLE TAEG..HANGUL SYLLABLE TAEH 1563 | (0xD0F9 <= code && code <= 0xD113) || // Lo [27] HANGUL SYLLABLE TYAG..HANGUL SYLLABLE TYAH 1564 | (0xD115 <= code && code <= 0xD12F) || // Lo [27] HANGUL SYLLABLE TYAEG..HANGUL SYLLABLE TYAEH 1565 | (0xD131 <= code && code <= 0xD14B) || // Lo [27] HANGUL SYLLABLE TEOG..HANGUL SYLLABLE TEOH 1566 | (0xD14D <= code && code <= 0xD167) || // Lo [27] HANGUL SYLLABLE TEG..HANGUL SYLLABLE TEH 1567 | (0xD169 <= code && code <= 0xD183) || // Lo [27] HANGUL SYLLABLE TYEOG..HANGUL SYLLABLE TYEOH 1568 | (0xD185 <= code && code <= 0xD19F) || // Lo [27] HANGUL SYLLABLE TYEG..HANGUL SYLLABLE TYEH 1569 | (0xD1A1 <= code && code <= 0xD1BB) || // Lo [27] HANGUL SYLLABLE TOG..HANGUL SYLLABLE TOH 1570 | (0xD1BD <= code && code <= 0xD1D7) || // Lo [27] HANGUL SYLLABLE TWAG..HANGUL SYLLABLE TWAH 1571 | (0xD1D9 <= code && code <= 0xD1F3) || // Lo [27] HANGUL SYLLABLE TWAEG..HANGUL SYLLABLE TWAEH 1572 | (0xD1F5 <= code && code <= 0xD20F) || // Lo [27] HANGUL SYLLABLE TOEG..HANGUL SYLLABLE TOEH 1573 | (0xD211 <= code && code <= 0xD22B) || // Lo [27] HANGUL SYLLABLE TYOG..HANGUL SYLLABLE TYOH 1574 | (0xD22D <= code && code <= 0xD247) || // Lo [27] HANGUL SYLLABLE TUG..HANGUL SYLLABLE TUH 1575 | (0xD249 <= code && code <= 0xD263) || // Lo [27] HANGUL SYLLABLE TWEOG..HANGUL SYLLABLE TWEOH 1576 | (0xD265 <= code && code <= 0xD27F) || // Lo [27] HANGUL SYLLABLE TWEG..HANGUL SYLLABLE TWEH 1577 | (0xD281 <= code && code <= 0xD29B) || // Lo [27] HANGUL SYLLABLE TWIG..HANGUL SYLLABLE TWIH 1578 | (0xD29D <= code && code <= 0xD2B7) || // Lo [27] HANGUL SYLLABLE TYUG..HANGUL SYLLABLE TYUH 1579 | (0xD2B9 <= code && code <= 0xD2D3) || // Lo [27] HANGUL SYLLABLE TEUG..HANGUL SYLLABLE TEUH 1580 | (0xD2D5 <= code && code <= 0xD2EF) || // Lo [27] HANGUL SYLLABLE TYIG..HANGUL SYLLABLE TYIH 1581 | (0xD2F1 <= code && code <= 0xD30B) || // Lo [27] HANGUL SYLLABLE TIG..HANGUL SYLLABLE TIH 1582 | (0xD30D <= code && code <= 0xD327) || // Lo [27] HANGUL SYLLABLE PAG..HANGUL SYLLABLE PAH 1583 | (0xD329 <= code && code <= 0xD343) || // Lo [27] HANGUL SYLLABLE PAEG..HANGUL SYLLABLE PAEH 1584 | (0xD345 <= code && code <= 0xD35F) || // Lo [27] HANGUL SYLLABLE PYAG..HANGUL SYLLABLE PYAH 1585 | (0xD361 <= code && code <= 0xD37B) || // Lo [27] HANGUL SYLLABLE PYAEG..HANGUL SYLLABLE PYAEH 1586 | (0xD37D <= code && code <= 0xD397) || // Lo [27] HANGUL SYLLABLE PEOG..HANGUL SYLLABLE PEOH 1587 | (0xD399 <= code && code <= 0xD3B3) || // Lo [27] HANGUL SYLLABLE PEG..HANGUL SYLLABLE PEH 1588 | (0xD3B5 <= code && code <= 0xD3CF) || // Lo [27] HANGUL SYLLABLE PYEOG..HANGUL SYLLABLE PYEOH 1589 | (0xD3D1 <= code && code <= 0xD3EB) || // Lo [27] HANGUL SYLLABLE PYEG..HANGUL SYLLABLE PYEH 1590 | (0xD3ED <= code && code <= 0xD407) || // Lo [27] HANGUL SYLLABLE POG..HANGUL SYLLABLE POH 1591 | (0xD409 <= code && code <= 0xD423) || // Lo [27] HANGUL SYLLABLE PWAG..HANGUL SYLLABLE PWAH 1592 | (0xD425 <= code && code <= 0xD43F) || // Lo [27] HANGUL SYLLABLE PWAEG..HANGUL SYLLABLE PWAEH 1593 | (0xD441 <= code && code <= 0xD45B) || // Lo [27] HANGUL SYLLABLE POEG..HANGUL SYLLABLE POEH 1594 | (0xD45D <= code && code <= 0xD477) || // Lo [27] HANGUL SYLLABLE PYOG..HANGUL SYLLABLE PYOH 1595 | (0xD479 <= code && code <= 0xD493) || // Lo [27] HANGUL SYLLABLE PUG..HANGUL SYLLABLE PUH 1596 | (0xD495 <= code && code <= 0xD4AF) || // Lo [27] HANGUL SYLLABLE PWEOG..HANGUL SYLLABLE PWEOH 1597 | (0xD4B1 <= code && code <= 0xD4CB) || // Lo [27] HANGUL SYLLABLE PWEG..HANGUL SYLLABLE PWEH 1598 | (0xD4CD <= code && code <= 0xD4E7) || // Lo [27] HANGUL SYLLABLE PWIG..HANGUL SYLLABLE PWIH 1599 | (0xD4E9 <= code && code <= 0xD503) || // Lo [27] HANGUL SYLLABLE PYUG..HANGUL SYLLABLE PYUH 1600 | (0xD505 <= code && code <= 0xD51F) || // Lo [27] HANGUL SYLLABLE PEUG..HANGUL SYLLABLE PEUH 1601 | (0xD521 <= code && code <= 0xD53B) || // Lo [27] HANGUL SYLLABLE PYIG..HANGUL SYLLABLE PYIH 1602 | (0xD53D <= code && code <= 0xD557) || // Lo [27] HANGUL SYLLABLE PIG..HANGUL SYLLABLE PIH 1603 | (0xD559 <= code && code <= 0xD573) || // Lo [27] HANGUL SYLLABLE HAG..HANGUL SYLLABLE HAH 1604 | (0xD575 <= code && code <= 0xD58F) || // Lo [27] HANGUL SYLLABLE HAEG..HANGUL SYLLABLE HAEH 1605 | (0xD591 <= code && code <= 0xD5AB) || // Lo [27] HANGUL SYLLABLE HYAG..HANGUL SYLLABLE HYAH 1606 | (0xD5AD <= code && code <= 0xD5C7) || // Lo [27] HANGUL SYLLABLE HYAEG..HANGUL SYLLABLE HYAEH 1607 | (0xD5C9 <= code && code <= 0xD5E3) || // Lo [27] HANGUL SYLLABLE HEOG..HANGUL SYLLABLE HEOH 1608 | (0xD5E5 <= code && code <= 0xD5FF) || // Lo [27] HANGUL SYLLABLE HEG..HANGUL SYLLABLE HEH 1609 | (0xD601 <= code && code <= 0xD61B) || // Lo [27] HANGUL SYLLABLE HYEOG..HANGUL SYLLABLE HYEOH 1610 | (0xD61D <= code && code <= 0xD637) || // Lo [27] HANGUL SYLLABLE HYEG..HANGUL SYLLABLE HYEH 1611 | (0xD639 <= code && code <= 0xD653) || // Lo [27] HANGUL SYLLABLE HOG..HANGUL SYLLABLE HOH 1612 | (0xD655 <= code && code <= 0xD66F) || // Lo [27] HANGUL SYLLABLE HWAG..HANGUL SYLLABLE HWAH 1613 | (0xD671 <= code && code <= 0xD68B) || // Lo [27] HANGUL SYLLABLE HWAEG..HANGUL SYLLABLE HWAEH 1614 | (0xD68D <= code && code <= 0xD6A7) || // Lo [27] HANGUL SYLLABLE HOEG..HANGUL SYLLABLE HOEH 1615 | (0xD6A9 <= code && code <= 0xD6C3) || // Lo [27] HANGUL SYLLABLE HYOG..HANGUL SYLLABLE HYOH 1616 | (0xD6C5 <= code && code <= 0xD6DF) || // Lo [27] HANGUL SYLLABLE HUG..HANGUL SYLLABLE HUH 1617 | (0xD6E1 <= code && code <= 0xD6FB) || // Lo [27] HANGUL SYLLABLE HWEOG..HANGUL SYLLABLE HWEOH 1618 | (0xD6FD <= code && code <= 0xD717) || // Lo [27] HANGUL SYLLABLE HWEG..HANGUL SYLLABLE HWEH 1619 | (0xD719 <= code && code <= 0xD733) || // Lo [27] HANGUL SYLLABLE HWIG..HANGUL SYLLABLE HWIH 1620 | (0xD735 <= code && code <= 0xD74F) || // Lo [27] HANGUL SYLLABLE HYUG..HANGUL SYLLABLE HYUH 1621 | (0xD751 <= code && code <= 0xD76B) || // Lo [27] HANGUL SYLLABLE HEUG..HANGUL SYLLABLE HEUH 1622 | (0xD76D <= code && code <= 0xD787) || // Lo [27] HANGUL SYLLABLE HYIG..HANGUL SYLLABLE HYIH 1623 | (0xD789 <= code && code <= 0xD7A3) // Lo [27] HANGUL SYLLABLE HIG..HANGUL SYLLABLE HIH 1624 | ){ 1625 | return LVT; 1626 | } 1627 | 1628 | if( 1629 | 0x261D == code || // So WHITE UP POINTING INDEX 1630 | 0x26F9 == code || // So PERSON WITH BALL 1631 | (0x270A <= code && code <= 0x270D) || // So [4] RAISED FIST..WRITING HAND 1632 | 0x1F385 == code || // So FATHER CHRISTMAS 1633 | (0x1F3C2 <= code && code <= 0x1F3C4) || // So [3] SNOWBOARDER..SURFER 1634 | 0x1F3C7 == code || // So HORSE RACING 1635 | (0x1F3CA <= code && code <= 0x1F3CC) || // So [3] SWIMMER..GOLFER 1636 | (0x1F442 <= code && code <= 0x1F443) || // So [2] EAR..NOSE 1637 | (0x1F446 <= code && code <= 0x1F450) || // So [11] WHITE UP POINTING BACKHAND INDEX..OPEN HANDS SIGN 1638 | 0x1F46E == code || // So POLICE OFFICER 1639 | (0x1F470 <= code && code <= 0x1F478) || // So [9] BRIDE WITH VEIL..PRINCESS 1640 | 0x1F47C == code || // So BABY ANGEL 1641 | (0x1F481 <= code && code <= 0x1F483) || // So [3] INFORMATION DESK PERSON..DANCER 1642 | (0x1F485 <= code && code <= 0x1F487) || // So [3] NAIL POLISH..HAIRCUT 1643 | 0x1F4AA == code || // So FLEXED BICEPS 1644 | (0x1F574 <= code && code <= 0x1F575) || // So [2] MAN IN BUSINESS SUIT LEVITATING..SLEUTH OR SPY 1645 | 0x1F57A == code || // So MAN DANCING 1646 | 0x1F590 == code || // So RAISED HAND WITH FINGERS SPLAYED 1647 | (0x1F595 <= code && code <= 0x1F596) || // So [2] REVERSED HAND WITH MIDDLE FINGER EXTENDED..RAISED HAND WITH PART BETWEEN MIDDLE AND RING FINGERS 1648 | (0x1F645 <= code && code <= 0x1F647) || // So [3] FACE WITH NO GOOD GESTURE..PERSON BOWING DEEPLY 1649 | (0x1F64B <= code && code <= 0x1F64F) || // So [5] HAPPY PERSON RAISING ONE HAND..PERSON WITH FOLDED HANDS 1650 | 0x1F6A3 == code || // So ROWBOAT 1651 | (0x1F6B4 <= code && code <= 0x1F6B6) || // So [3] BICYCLIST..PEDESTRIAN 1652 | 0x1F6C0 == code || // So BATH 1653 | 0x1F6CC == code || // So SLEEPING ACCOMMODATION 1654 | (0x1F918 <= code && code <= 0x1F91C) || // So [5] SIGN OF THE HORNS..RIGHT-FACING FIST 1655 | (0x1F91E <= code && code <= 0x1F91F) || // So [2] HAND WITH INDEX AND MIDDLE FINGERS CROSSED..I LOVE YOU HAND SIGN 1656 | 0x1F926 == code || // So FACE PALM 1657 | (0x1F930 <= code && code <= 0x1F939) || // So [10] PREGNANT WOMAN..JUGGLING 1658 | (0x1F93D <= code && code <= 0x1F93E) || // So [2] WATER POLO..HANDBALL 1659 | (0x1F9D1 <= code && code <= 0x1F9DD) // So [13] ADULT..ELF 1660 | ){ 1661 | return E_Base; 1662 | } 1663 | 1664 | if( 1665 | (0x1F3FB <= code && code <= 0x1F3FF) // Sk [5] EMOJI MODIFIER FITZPATRICK TYPE-1-2..EMOJI MODIFIER FITZPATRICK TYPE-6 1666 | ){ 1667 | return E_Modifier; 1668 | } 1669 | 1670 | if( 1671 | 0x200D == code // Cf ZERO WIDTH JOINER 1672 | ){ 1673 | return ZWJ; 1674 | } 1675 | 1676 | if( 1677 | 0x2640 == code || // So FEMALE SIGN 1678 | 0x2642 == code || // So MALE SIGN 1679 | (0x2695 <= code && code <= 0x2696) || // So [2] STAFF OF AESCULAPIUS..SCALES 1680 | 0x2708 == code || // So AIRPLANE 1681 | 0x2764 == code || // So HEAVY BLACK HEART 1682 | 0x1F308 == code || // So RAINBOW 1683 | 0x1F33E == code || // So EAR OF RICE 1684 | 0x1F373 == code || // So COOKING 1685 | 0x1F393 == code || // So GRADUATION CAP 1686 | 0x1F3A4 == code || // So MICROPHONE 1687 | 0x1F3A8 == code || // So ARTIST PALETTE 1688 | 0x1F3EB == code || // So SCHOOL 1689 | 0x1F3ED == code || // So FACTORY 1690 | 0x1F48B == code || // So KISS MARK 1691 | (0x1F4BB <= code && code <= 0x1F4BC) || // So [2] PERSONAL COMPUTER..BRIEFCASE 1692 | 0x1F527 == code || // So WRENCH 1693 | 0x1F52C == code || // So MICROSCOPE 1694 | 0x1F5E8 == code || // So LEFT SPEECH BUBBLE 1695 | 0x1F680 == code || // So ROCKET 1696 | 0x1F692 == code // So FIRE ENGINE 1697 | ){ 1698 | return Glue_After_Zwj; 1699 | } 1700 | 1701 | if( 1702 | (0x1F466 <= code && code <= 0x1F469) // So [4] BOY..WOMAN 1703 | ){ 1704 | return E_Base_GAZ; 1705 | } 1706 | 1707 | 1708 | //all unlisted characters have a grapheme break property of "Other" 1709 | return Other; 1710 | } 1711 | return this; 1712 | } 1713 | 1714 | if (typeof module != 'undefined' && module.exports) { 1715 | module.exports = GraphemeSplitter; 1716 | } 1717 | --------------------------------------------------------------------------------