All Downloads are FREE. Search and download functionalities are using the official Maven repository.

de.bottlecaps.markup.blitz.codepoints.UnicodeCategory Maven / Gradle / Ivy

There is a newer version: 1.5
Show newest version
// Copyright (c) 2023-2024 Gunther Rademacher. Provided under the Apache 2 License.

package de.bottlecaps.markup.blitz.codepoints;

import static de.bottlecaps.markup.blitz.codepoints.RangeSet.builder;

import java.util.Map;
import java.util.concurrent.ConcurrentHashMap;

import de.bottlecaps.markup.blitz.Errors;
import de.bottlecaps.markup.blitz.codepoints.RangeSet.Builder;

public class UnicodeCategory {
  private static final int MAX_VALID_CODEPOINT = 0x10fffd;

  public static RangeSet forCode(String unicodeCharClassName) {
    RangeSet unicodeCharClass = codepointsByCode.get(unicodeCharClassName);
    if (unicodeCharClass == null)
      Errors.S10.thro(unicodeCharClassName);
    return unicodeCharClass;
  }

  public static boolean isSurrogate(int codepoint) {
    return codepoint >= 0xd800 && codepoint <= 0xdfff;
  }

  public static boolean isXmlName(String name) {
    return name.length() > 0
        && xmlNameStartChar.containsCodepoint(name.codePointAt(0))
        && name.codePoints().allMatch(xmlNameChar::containsCodepoint);
  }

  public static final RangeSet ALPHABET;
  static {
    RangeSet unicodeRange = builder()
        .add(Character.MIN_CODE_POINT, Character.MAX_CODE_POINT)
        .build();
    RangeSet nonCharacters = builder()
        .add(0xd800, 0xdfff)
        .add(0xfdd0, 0xfdef)
        .add(0xfffe, 0xffff)
        .add(0x1fffe, 0x1ffff)
        .add(0x2fffe, 0x2ffff)
        .add(0x3fffe, 0x3ffff)
        .add(0x4fffe, 0x4ffff)
        .add(0x5fffe, 0x5ffff)
        .add(0x6fffe, 0x6ffff)
        .add(0x7fffe, 0x7ffff)
        .add(0x8fffe, 0x8ffff)
        .add(0x9fffe, 0x9ffff)
        .add(0xafffe, 0xaffff)
        .add(0xbfffe, 0xbffff)
        .add(0xcfffe, 0xcffff)
        .add(0xdfffe, 0xdffff)
        .add(0xefffe, 0xeffff)
        .add(0xffffe, 0xfffff)
        .add(0x10fffe, 0x10ffff)
        .build();
    ALPHABET = unicodeRange.minus(nonCharacters);
  }

//  /** XML characters (per XML 1.0) */
//  public static final RangeSet xmlChar = builder()
//      .add(0x9)
//      .add(0xA)
//      .add(0xD)
//      .add(0x20, 0xD7FF)
//      .add(0xE000, 0xFFFD)
//      .add(0x10000, 0x10FFFF)
//      .build();

  /** XML characters (per XML 1.1) */
  public static final RangeSet xmlChar;
  static {
    RangeSet chars = builder()
        .add(0x1, 0xD7FF)
        .add(0xE000, 0xFFFD)
        .add(0x10000, 0x10FFFF)
        .build();
    RangeSet restrictedChars = builder()
        .add(0x1, 0x8)
        .add(0xB, 0xC)
        .add(0xE, 0x1F)
        .add(0x7F, 0x84)
        .add(0x86, 0x9F)
        .build();
    xmlChar = chars.minus(restrictedChars);
  }

  /** XML name start characters */
  public static final RangeSet xmlNameStartChar = builder()
      .add('A', 'Z')
      .add('_')
      .add('a', 'z')
      .add(0xC0, 0xD6)
      .add(0xD8, 0xF6)
      .add(0xF8,0x2FF)
      .add(0x370, 0x37D)
      .add(0x37F, 0x1FFF)
      .add(0x200C, 0x200D)
      .add(0x2070, 0x218F)
      .add(0x2C00, 0x2FEF)
      .add(0x3001, 0xD7FF)
      .add(0xF900, 0xFDCF)
      .add(0xFDF0, 0xFFFD)
      .add(0x10000, 0xEFFFF)
      .build();

  /** XML name characters */
  public static final RangeSet xmlNameChar = builder()
      .add(xmlNameStartChar)
      .add('-')
      .add('.')
      .add('0', '9')
      .add(0xB7)
      .add(0x0300, 0x036F)
      .add(0x203F, 0x2040)
      .build();

  /** The Unicode version supported here.*/
  public static final String version = "15.1";

  /**
   * Generated from UnicodeData.txt on 2023-11-30T17:10:00+01:00
   * by de.bottlecaps.markup.blitz.codepoints.UnicodeCategoryMap#main
   *
   * @see UnicodeData.txt
   */
  public static final Map codepointsByCode = new ConcurrentHashMap<>();
  static {
    codepointsByCode.put("Cc", builder().add(0x0, 0x1f).add(0x7f, 0x9f).build());
    codepointsByCode.put("Cf", builder().add(0xad).add(0x600, 0x605).add(0x61c).add(0x6dd).add(0x70f).add(0x890, 0x891).add(0x8e2).add(0x180e).add(0x200b, 0x200f).add(0x202a, 0x202e).add(0x2060, 0x2064).add(0x2066, 0x206f).add(0xfeff).add(0xfff9, 0xfffb).add(0x110bd).add(0x110cd).add(0x13430, 0x1343f).add(0x1bca0, 0x1bca3).add(0x1d173, 0x1d17a).add(0xe0001).add(0xe0020, 0xe007f).build());
    codepointsByCode.put("Co", builder().add(0xe000, 0xf8ff).add(0xf0000, 0xffffd).add(0x100000, 0x10fffd).build());
    codepointsByCode.put("Cs", builder().add(0xd800, 0xdfff).build());
    codepointsByCode.put("Ll", builder().add('a', 'z').add(0xb5).add(0xdf, 0xf6).add(0xf8, 0xff).add(0x101).add(0x103).add(0x105).add(0x107).add(0x109).add(0x10b).add(0x10d).add(0x10f).add(0x111).add(0x113).add(0x115).add(0x117).add(0x119).add(0x11b).add(0x11d).add(0x11f).add(0x121).add(0x123).add(0x125).add(0x127).add(0x129).add(0x12b).add(0x12d).add(0x12f).add(0x131).add(0x133).add(0x135).add(0x137, 0x138).add(0x13a).add(0x13c).add(0x13e).add(0x140).add(0x142).add(0x144).add(0x146).add(0x148, 0x149).add(0x14b).add(0x14d).add(0x14f).add(0x151).add(0x153).add(0x155).add(0x157).add(0x159).add(0x15b).add(0x15d).add(0x15f).add(0x161).add(0x163).add(0x165).add(0x167).add(0x169).add(0x16b).add(0x16d).add(0x16f).add(0x171).add(0x173).add(0x175).add(0x177).add(0x17a).add(0x17c).add(0x17e, 0x180).add(0x183).add(0x185).add(0x188).add(0x18c, 0x18d).add(0x192).add(0x195).add(0x199, 0x19b).add(0x19e).add(0x1a1).add(0x1a3).add(0x1a5).add(0x1a8).add(0x1aa, 0x1ab).add(0x1ad).add(0x1b0).add(0x1b4).add(0x1b6).add(0x1b9, 0x1ba).add(0x1bd, 0x1bf).add(0x1c6).add(0x1c9).add(0x1cc).add(0x1ce).add(0x1d0).add(0x1d2).add(0x1d4).add(0x1d6).add(0x1d8).add(0x1da).add(0x1dc, 0x1dd).add(0x1df).add(0x1e1).add(0x1e3).add(0x1e5).add(0x1e7).add(0x1e9).add(0x1eb).add(0x1ed).add(0x1ef, 0x1f0).add(0x1f3).add(0x1f5).add(0x1f9).add(0x1fb).add(0x1fd).add(0x1ff).add(0x201).add(0x203).add(0x205).add(0x207).add(0x209).add(0x20b).add(0x20d).add(0x20f).add(0x211).add(0x213).add(0x215).add(0x217).add(0x219).add(0x21b).add(0x21d).add(0x21f).add(0x221).add(0x223).add(0x225).add(0x227).add(0x229).add(0x22b).add(0x22d).add(0x22f).add(0x231).add(0x233, 0x239).add(0x23c).add(0x23f, 0x240).add(0x242).add(0x247).add(0x249).add(0x24b).add(0x24d).add(0x24f, 0x293).add(0x295, 0x2af).add(0x371).add(0x373).add(0x377).add(0x37b, 0x37d).add(0x390).add(0x3ac, 0x3ce).add(0x3d0, 0x3d1).add(0x3d5, 0x3d7).add(0x3d9).add(0x3db).add(0x3dd).add(0x3df).add(0x3e1).add(0x3e3).add(0x3e5).add(0x3e7).add(0x3e9).add(0x3eb).add(0x3ed).add(0x3ef, 0x3f3).add(0x3f5).add(0x3f8).add(0x3fb, 0x3fc).add(0x430, 0x45f).add(0x461).add(0x463).add(0x465).add(0x467).add(0x469).add(0x46b).add(0x46d).add(0x46f).add(0x471).add(0x473).add(0x475).add(0x477).add(0x479).add(0x47b).add(0x47d).add(0x47f).add(0x481).add(0x48b).add(0x48d).add(0x48f).add(0x491).add(0x493).add(0x495).add(0x497).add(0x499).add(0x49b).add(0x49d).add(0x49f).add(0x4a1).add(0x4a3).add(0x4a5).add(0x4a7).add(0x4a9).add(0x4ab).add(0x4ad).add(0x4af).add(0x4b1).add(0x4b3).add(0x4b5).add(0x4b7).add(0x4b9).add(0x4bb).add(0x4bd).add(0x4bf).add(0x4c2).add(0x4c4).add(0x4c6).add(0x4c8).add(0x4ca).add(0x4cc).add(0x4ce, 0x4cf).add(0x4d1).add(0x4d3).add(0x4d5).add(0x4d7).add(0x4d9).add(0x4db).add(0x4dd).add(0x4df).add(0x4e1).add(0x4e3).add(0x4e5).add(0x4e7).add(0x4e9).add(0x4eb).add(0x4ed).add(0x4ef).add(0x4f1).add(0x4f3).add(0x4f5).add(0x4f7).add(0x4f9).add(0x4fb).add(0x4fd).add(0x4ff).add(0x501).add(0x503).add(0x505).add(0x507).add(0x509).add(0x50b).add(0x50d).add(0x50f).add(0x511).add(0x513).add(0x515).add(0x517).add(0x519).add(0x51b).add(0x51d).add(0x51f).add(0x521).add(0x523).add(0x525).add(0x527).add(0x529).add(0x52b).add(0x52d).add(0x52f).add(0x560, 0x588).add(0x10d0, 0x10fa).add(0x10fd, 0x10ff).add(0x13f8, 0x13fd).add(0x1c80, 0x1c88).add(0x1d00, 0x1d2b).add(0x1d6b, 0x1d77).add(0x1d79, 0x1d9a).add(0x1e01).add(0x1e03).add(0x1e05).add(0x1e07).add(0x1e09).add(0x1e0b).add(0x1e0d).add(0x1e0f).add(0x1e11).add(0x1e13).add(0x1e15).add(0x1e17).add(0x1e19).add(0x1e1b).add(0x1e1d).add(0x1e1f).add(0x1e21).add(0x1e23).add(0x1e25).add(0x1e27).add(0x1e29).add(0x1e2b).add(0x1e2d).add(0x1e2f).add(0x1e31).add(0x1e33).add(0x1e35).add(0x1e37).add(0x1e39).add(0x1e3b).add(0x1e3d).add(0x1e3f).add(0x1e41).add(0x1e43).add(0x1e45).add(0x1e47).add(0x1e49).add(0x1e4b).add(0x1e4d).add(0x1e4f).add(0x1e51).add(0x1e53).add(0x1e55).add(0x1e57).add(0x1e59).add(0x1e5b).add(0x1e5d).add(0x1e5f).add(0x1e61).add(0x1e63).add(0x1e65).add(0x1e67).add(0x1e69).add(0x1e6b).add(0x1e6d).add(0x1e6f).add(0x1e71).add(0x1e73).add(0x1e75).add(0x1e77).add(0x1e79).add(0x1e7b).add(0x1e7d).add(0x1e7f).add(0x1e81).add(0x1e83).add(0x1e85).add(0x1e87).add(0x1e89).add(0x1e8b).add(0x1e8d).add(0x1e8f).add(0x1e91).add(0x1e93).add(0x1e95, 0x1e9d).add(0x1e9f).add(0x1ea1).add(0x1ea3).add(0x1ea5).add(0x1ea7).add(0x1ea9).add(0x1eab).add(0x1ead).add(0x1eaf).add(0x1eb1).add(0x1eb3).add(0x1eb5).add(0x1eb7).add(0x1eb9).add(0x1ebb).add(0x1ebd).add(0x1ebf).add(0x1ec1).add(0x1ec3).add(0x1ec5).add(0x1ec7).add(0x1ec9).add(0x1ecb).add(0x1ecd).add(0x1ecf).add(0x1ed1).add(0x1ed3).add(0x1ed5).add(0x1ed7).add(0x1ed9).add(0x1edb).add(0x1edd).add(0x1edf).add(0x1ee1).add(0x1ee3).add(0x1ee5).add(0x1ee7).add(0x1ee9).add(0x1eeb).add(0x1eed).add(0x1eef).add(0x1ef1).add(0x1ef3).add(0x1ef5).add(0x1ef7).add(0x1ef9).add(0x1efb).add(0x1efd).add(0x1eff, 0x1f07).add(0x1f10, 0x1f15).add(0x1f20, 0x1f27).add(0x1f30, 0x1f37).add(0x1f40, 0x1f45).add(0x1f50, 0x1f57).add(0x1f60, 0x1f67).add(0x1f70, 0x1f7d).add(0x1f80, 0x1f87).add(0x1f90, 0x1f97).add(0x1fa0, 0x1fa7).add(0x1fb0, 0x1fb4).add(0x1fb6, 0x1fb7).add(0x1fbe).add(0x1fc2, 0x1fc4).add(0x1fc6, 0x1fc7).add(0x1fd0, 0x1fd3).add(0x1fd6, 0x1fd7).add(0x1fe0, 0x1fe7).add(0x1ff2, 0x1ff4).add(0x1ff6, 0x1ff7).add(0x210a).add(0x210e, 0x210f).add(0x2113).add(0x212f).add(0x2134).add(0x2139).add(0x213c, 0x213d).add(0x2146, 0x2149).add(0x214e).add(0x2184).add(0x2c30, 0x2c5f).add(0x2c61).add(0x2c65, 0x2c66).add(0x2c68).add(0x2c6a).add(0x2c6c).add(0x2c71).add(0x2c73, 0x2c74).add(0x2c76, 0x2c7b).add(0x2c81).add(0x2c83).add(0x2c85).add(0x2c87).add(0x2c89).add(0x2c8b).add(0x2c8d).add(0x2c8f).add(0x2c91).add(0x2c93).add(0x2c95).add(0x2c97).add(0x2c99).add(0x2c9b).add(0x2c9d).add(0x2c9f).add(0x2ca1).add(0x2ca3).add(0x2ca5).add(0x2ca7).add(0x2ca9).add(0x2cab).add(0x2cad).add(0x2caf).add(0x2cb1).add(0x2cb3).add(0x2cb5).add(0x2cb7).add(0x2cb9).add(0x2cbb).add(0x2cbd).add(0x2cbf).add(0x2cc1).add(0x2cc3).add(0x2cc5).add(0x2cc7).add(0x2cc9).add(0x2ccb).add(0x2ccd).add(0x2ccf).add(0x2cd1).add(0x2cd3).add(0x2cd5).add(0x2cd7).add(0x2cd9).add(0x2cdb).add(0x2cdd).add(0x2cdf).add(0x2ce1).add(0x2ce3, 0x2ce4).add(0x2cec).add(0x2cee).add(0x2cf3).add(0x2d00, 0x2d25).add(0x2d27).add(0x2d2d).add(0xa641).add(0xa643).add(0xa645).add(0xa647).add(0xa649).add(0xa64b).add(0xa64d).add(0xa64f).add(0xa651).add(0xa653).add(0xa655).add(0xa657).add(0xa659).add(0xa65b).add(0xa65d).add(0xa65f).add(0xa661).add(0xa663).add(0xa665).add(0xa667).add(0xa669).add(0xa66b).add(0xa66d).add(0xa681).add(0xa683).add(0xa685).add(0xa687).add(0xa689).add(0xa68b).add(0xa68d).add(0xa68f).add(0xa691).add(0xa693).add(0xa695).add(0xa697).add(0xa699).add(0xa69b).add(0xa723).add(0xa725).add(0xa727).add(0xa729).add(0xa72b).add(0xa72d).add(0xa72f, 0xa731).add(0xa733).add(0xa735).add(0xa737).add(0xa739).add(0xa73b).add(0xa73d).add(0xa73f).add(0xa741).add(0xa743).add(0xa745).add(0xa747).add(0xa749).add(0xa74b).add(0xa74d).add(0xa74f).add(0xa751).add(0xa753).add(0xa755).add(0xa757).add(0xa759).add(0xa75b).add(0xa75d).add(0xa75f).add(0xa761).add(0xa763).add(0xa765).add(0xa767).add(0xa769).add(0xa76b).add(0xa76d).add(0xa76f).add(0xa771, 0xa778).add(0xa77a).add(0xa77c).add(0xa77f).add(0xa781).add(0xa783).add(0xa785).add(0xa787).add(0xa78c).add(0xa78e).add(0xa791).add(0xa793, 0xa795).add(0xa797).add(0xa799).add(0xa79b).add(0xa79d).add(0xa79f).add(0xa7a1).add(0xa7a3).add(0xa7a5).add(0xa7a7).add(0xa7a9).add(0xa7af).add(0xa7b5).add(0xa7b7).add(0xa7b9).add(0xa7bb).add(0xa7bd).add(0xa7bf).add(0xa7c1).add(0xa7c3).add(0xa7c8).add(0xa7ca).add(0xa7d1).add(0xa7d3).add(0xa7d5).add(0xa7d7).add(0xa7d9).add(0xa7f6).add(0xa7fa).add(0xab30, 0xab5a).add(0xab60, 0xab68).add(0xab70, 0xabbf).add(0xfb00, 0xfb06).add(0xfb13, 0xfb17).add(0xff41, 0xff5a).add(0x10428, 0x1044f).add(0x104d8, 0x104fb).add(0x10597, 0x105a1).add(0x105a3, 0x105b1).add(0x105b3, 0x105b9).add(0x105bb, 0x105bc).add(0x10cc0, 0x10cf2).add(0x118c0, 0x118df).add(0x16e60, 0x16e7f).add(0x1d41a, 0x1d433).add(0x1d44e, 0x1d454).add(0x1d456, 0x1d467).add(0x1d482, 0x1d49b).add(0x1d4b6, 0x1d4b9).add(0x1d4bb).add(0x1d4bd, 0x1d4c3).add(0x1d4c5, 0x1d4cf).add(0x1d4ea, 0x1d503).add(0x1d51e, 0x1d537).add(0x1d552, 0x1d56b).add(0x1d586, 0x1d59f).add(0x1d5ba, 0x1d5d3).add(0x1d5ee, 0x1d607).add(0x1d622, 0x1d63b).add(0x1d656, 0x1d66f).add(0x1d68a, 0x1d6a5).add(0x1d6c2, 0x1d6da).add(0x1d6dc, 0x1d6e1).add(0x1d6fc, 0x1d714).add(0x1d716, 0x1d71b).add(0x1d736, 0x1d74e).add(0x1d750, 0x1d755).add(0x1d770, 0x1d788).add(0x1d78a, 0x1d78f).add(0x1d7aa, 0x1d7c2).add(0x1d7c4, 0x1d7c9).add(0x1d7cb).add(0x1df00, 0x1df09).add(0x1df0b, 0x1df1e).add(0x1df25, 0x1df2a).add(0x1e922, 0x1e943).build());
    codepointsByCode.put("Lm", builder().add(0x2b0, 0x2c1).add(0x2c6, 0x2d1).add(0x2e0, 0x2e4).add(0x2ec).add(0x2ee).add(0x374).add(0x37a).add(0x559).add(0x640).add(0x6e5, 0x6e6).add(0x7f4, 0x7f5).add(0x7fa).add(0x81a).add(0x824).add(0x828).add(0x8c9).add(0x971).add(0xe46).add(0xec6).add(0x10fc).add(0x17d7).add(0x1843).add(0x1aa7).add(0x1c78, 0x1c7d).add(0x1d2c, 0x1d6a).add(0x1d78).add(0x1d9b, 0x1dbf).add(0x2071).add(0x207f).add(0x2090, 0x209c).add(0x2c7c, 0x2c7d).add(0x2d6f).add(0x2e2f).add(0x3005).add(0x3031, 0x3035).add(0x303b).add(0x309d, 0x309e).add(0x30fc, 0x30fe).add(0xa015).add(0xa4f8, 0xa4fd).add(0xa60c).add(0xa67f).add(0xa69c, 0xa69d).add(0xa717, 0xa71f).add(0xa770).add(0xa788).add(0xa7f2, 0xa7f4).add(0xa7f8, 0xa7f9).add(0xa9cf).add(0xa9e6).add(0xaa70).add(0xaadd).add(0xaaf3, 0xaaf4).add(0xab5c, 0xab5f).add(0xab69).add(0xff70).add(0xff9e, 0xff9f).add(0x10780, 0x10785).add(0x10787, 0x107b0).add(0x107b2, 0x107ba).add(0x16b40, 0x16b43).add(0x16f93, 0x16f9f).add(0x16fe0, 0x16fe1).add(0x16fe3).add(0x1aff0, 0x1aff3).add(0x1aff5, 0x1affb).add(0x1affd, 0x1affe).add(0x1e030, 0x1e06d).add(0x1e137, 0x1e13d).add(0x1e4eb).add(0x1e94b).build());
    codepointsByCode.put("Lo", builder().add(0xaa).add(0xba).add(0x1bb).add(0x1c0, 0x1c3).add(0x294).add(0x5d0, 0x5ea).add(0x5ef, 0x5f2).add(0x620, 0x63f).add(0x641, 0x64a).add(0x66e, 0x66f).add(0x671, 0x6d3).add(0x6d5).add(0x6ee, 0x6ef).add(0x6fa, 0x6fc).add(0x6ff).add(0x710).add(0x712, 0x72f).add(0x74d, 0x7a5).add(0x7b1).add(0x7ca, 0x7ea).add(0x800, 0x815).add(0x840, 0x858).add(0x860, 0x86a).add(0x870, 0x887).add(0x889, 0x88e).add(0x8a0, 0x8c8).add(0x904, 0x939).add(0x93d).add(0x950).add(0x958, 0x961).add(0x972, 0x980).add(0x985, 0x98c).add(0x98f, 0x990).add(0x993, 0x9a8).add(0x9aa, 0x9b0).add(0x9b2).add(0x9b6, 0x9b9).add(0x9bd).add(0x9ce).add(0x9dc, 0x9dd).add(0x9df, 0x9e1).add(0x9f0, 0x9f1).add(0x9fc).add(0xa05, 0xa0a).add(0xa0f, 0xa10).add(0xa13, 0xa28).add(0xa2a, 0xa30).add(0xa32, 0xa33).add(0xa35, 0xa36).add(0xa38, 0xa39).add(0xa59, 0xa5c).add(0xa5e).add(0xa72, 0xa74).add(0xa85, 0xa8d).add(0xa8f, 0xa91).add(0xa93, 0xaa8).add(0xaaa, 0xab0).add(0xab2, 0xab3).add(0xab5, 0xab9).add(0xabd).add(0xad0).add(0xae0, 0xae1).add(0xaf9).add(0xb05, 0xb0c).add(0xb0f, 0xb10).add(0xb13, 0xb28).add(0xb2a, 0xb30).add(0xb32, 0xb33).add(0xb35, 0xb39).add(0xb3d).add(0xb5c, 0xb5d).add(0xb5f, 0xb61).add(0xb71).add(0xb83).add(0xb85, 0xb8a).add(0xb8e, 0xb90).add(0xb92, 0xb95).add(0xb99, 0xb9a).add(0xb9c).add(0xb9e, 0xb9f).add(0xba3, 0xba4).add(0xba8, 0xbaa).add(0xbae, 0xbb9).add(0xbd0).add(0xc05, 0xc0c).add(0xc0e, 0xc10).add(0xc12, 0xc28).add(0xc2a, 0xc39).add(0xc3d).add(0xc58, 0xc5a).add(0xc5d).add(0xc60, 0xc61).add(0xc80).add(0xc85, 0xc8c).add(0xc8e, 0xc90).add(0xc92, 0xca8).add(0xcaa, 0xcb3).add(0xcb5, 0xcb9).add(0xcbd).add(0xcdd, 0xcde).add(0xce0, 0xce1).add(0xcf1, 0xcf2).add(0xd04, 0xd0c).add(0xd0e, 0xd10).add(0xd12, 0xd3a).add(0xd3d).add(0xd4e).add(0xd54, 0xd56).add(0xd5f, 0xd61).add(0xd7a, 0xd7f).add(0xd85, 0xd96).add(0xd9a, 0xdb1).add(0xdb3, 0xdbb).add(0xdbd).add(0xdc0, 0xdc6).add(0xe01, 0xe30).add(0xe32, 0xe33).add(0xe40, 0xe45).add(0xe81, 0xe82).add(0xe84).add(0xe86, 0xe8a).add(0xe8c, 0xea3).add(0xea5).add(0xea7, 0xeb0).add(0xeb2, 0xeb3).add(0xebd).add(0xec0, 0xec4).add(0xedc, 0xedf).add(0xf00).add(0xf40, 0xf47).add(0xf49, 0xf6c).add(0xf88, 0xf8c).add(0x1000, 0x102a).add(0x103f).add(0x1050, 0x1055).add(0x105a, 0x105d).add(0x1061).add(0x1065, 0x1066).add(0x106e, 0x1070).add(0x1075, 0x1081).add(0x108e).add(0x1100, 0x1248).add(0x124a, 0x124d).add(0x1250, 0x1256).add(0x1258).add(0x125a, 0x125d).add(0x1260, 0x1288).add(0x128a, 0x128d).add(0x1290, 0x12b0).add(0x12b2, 0x12b5).add(0x12b8, 0x12be).add(0x12c0).add(0x12c2, 0x12c5).add(0x12c8, 0x12d6).add(0x12d8, 0x1310).add(0x1312, 0x1315).add(0x1318, 0x135a).add(0x1380, 0x138f).add(0x1401, 0x166c).add(0x166f, 0x167f).add(0x1681, 0x169a).add(0x16a0, 0x16ea).add(0x16f1, 0x16f8).add(0x1700, 0x1711).add(0x171f, 0x1731).add(0x1740, 0x1751).add(0x1760, 0x176c).add(0x176e, 0x1770).add(0x1780, 0x17b3).add(0x17dc).add(0x1820, 0x1842).add(0x1844, 0x1878).add(0x1880, 0x1884).add(0x1887, 0x18a8).add(0x18aa).add(0x18b0, 0x18f5).add(0x1900, 0x191e).add(0x1950, 0x196d).add(0x1970, 0x1974).add(0x1980, 0x19ab).add(0x19b0, 0x19c9).add(0x1a00, 0x1a16).add(0x1a20, 0x1a54).add(0x1b05, 0x1b33).add(0x1b45, 0x1b4c).add(0x1b83, 0x1ba0).add(0x1bae, 0x1baf).add(0x1bba, 0x1be5).add(0x1c00, 0x1c23).add(0x1c4d, 0x1c4f).add(0x1c5a, 0x1c77).add(0x1ce9, 0x1cec).add(0x1cee, 0x1cf3).add(0x1cf5, 0x1cf6).add(0x1cfa).add(0x2135, 0x2138).add(0x2d30, 0x2d67).add(0x2d80, 0x2d96).add(0x2da0, 0x2da6).add(0x2da8, 0x2dae).add(0x2db0, 0x2db6).add(0x2db8, 0x2dbe).add(0x2dc0, 0x2dc6).add(0x2dc8, 0x2dce).add(0x2dd0, 0x2dd6).add(0x2dd8, 0x2dde).add(0x3006).add(0x303c).add(0x3041, 0x3096).add(0x309f).add(0x30a1, 0x30fa).add(0x30ff).add(0x3105, 0x312f).add(0x3131, 0x318e).add(0x31a0, 0x31bf).add(0x31f0, 0x31ff).add(0x3400, 0x4dbf).add(0x4e00, 0xa014).add(0xa016, 0xa48c).add(0xa4d0, 0xa4f7).add(0xa500, 0xa60b).add(0xa610, 0xa61f).add(0xa62a, 0xa62b).add(0xa66e).add(0xa6a0, 0xa6e5).add(0xa78f).add(0xa7f7).add(0xa7fb, 0xa801).add(0xa803, 0xa805).add(0xa807, 0xa80a).add(0xa80c, 0xa822).add(0xa840, 0xa873).add(0xa882, 0xa8b3).add(0xa8f2, 0xa8f7).add(0xa8fb).add(0xa8fd, 0xa8fe).add(0xa90a, 0xa925).add(0xa930, 0xa946).add(0xa960, 0xa97c).add(0xa984, 0xa9b2).add(0xa9e0, 0xa9e4).add(0xa9e7, 0xa9ef).add(0xa9fa, 0xa9fe).add(0xaa00, 0xaa28).add(0xaa40, 0xaa42).add(0xaa44, 0xaa4b).add(0xaa60, 0xaa6f).add(0xaa71, 0xaa76).add(0xaa7a).add(0xaa7e, 0xaaaf).add(0xaab1).add(0xaab5, 0xaab6).add(0xaab9, 0xaabd).add(0xaac0).add(0xaac2).add(0xaadb, 0xaadc).add(0xaae0, 0xaaea).add(0xaaf2).add(0xab01, 0xab06).add(0xab09, 0xab0e).add(0xab11, 0xab16).add(0xab20, 0xab26).add(0xab28, 0xab2e).add(0xabc0, 0xabe2).add(0xac00, 0xd7a3).add(0xd7b0, 0xd7c6).add(0xd7cb, 0xd7fb).add(0xf900, 0xfa6d).add(0xfa70, 0xfad9).add(0xfb1d).add(0xfb1f, 0xfb28).add(0xfb2a, 0xfb36).add(0xfb38, 0xfb3c).add(0xfb3e).add(0xfb40, 0xfb41).add(0xfb43, 0xfb44).add(0xfb46, 0xfbb1).add(0xfbd3, 0xfd3d).add(0xfd50, 0xfd8f).add(0xfd92, 0xfdc7).add(0xfdf0, 0xfdfb).add(0xfe70, 0xfe74).add(0xfe76, 0xfefc).add(0xff66, 0xff6f).add(0xff71, 0xff9d).add(0xffa0, 0xffbe).add(0xffc2, 0xffc7).add(0xffca, 0xffcf).add(0xffd2, 0xffd7).add(0xffda, 0xffdc).add(0x10000, 0x1000b).add(0x1000d, 0x10026).add(0x10028, 0x1003a).add(0x1003c, 0x1003d).add(0x1003f, 0x1004d).add(0x10050, 0x1005d).add(0x10080, 0x100fa).add(0x10280, 0x1029c).add(0x102a0, 0x102d0).add(0x10300, 0x1031f).add(0x1032d, 0x10340).add(0x10342, 0x10349).add(0x10350, 0x10375).add(0x10380, 0x1039d).add(0x103a0, 0x103c3).add(0x103c8, 0x103cf).add(0x10450, 0x1049d).add(0x10500, 0x10527).add(0x10530, 0x10563).add(0x10600, 0x10736).add(0x10740, 0x10755).add(0x10760, 0x10767).add(0x10800, 0x10805).add(0x10808).add(0x1080a, 0x10835).add(0x10837, 0x10838).add(0x1083c).add(0x1083f, 0x10855).add(0x10860, 0x10876).add(0x10880, 0x1089e).add(0x108e0, 0x108f2).add(0x108f4, 0x108f5).add(0x10900, 0x10915).add(0x10920, 0x10939).add(0x10980, 0x109b7).add(0x109be, 0x109bf).add(0x10a00).add(0x10a10, 0x10a13).add(0x10a15, 0x10a17).add(0x10a19, 0x10a35).add(0x10a60, 0x10a7c).add(0x10a80, 0x10a9c).add(0x10ac0, 0x10ac7).add(0x10ac9, 0x10ae4).add(0x10b00, 0x10b35).add(0x10b40, 0x10b55).add(0x10b60, 0x10b72).add(0x10b80, 0x10b91).add(0x10c00, 0x10c48).add(0x10d00, 0x10d23).add(0x10e80, 0x10ea9).add(0x10eb0, 0x10eb1).add(0x10f00, 0x10f1c).add(0x10f27).add(0x10f30, 0x10f45).add(0x10f70, 0x10f81).add(0x10fb0, 0x10fc4).add(0x10fe0, 0x10ff6).add(0x11003, 0x11037).add(0x11071, 0x11072).add(0x11075).add(0x11083, 0x110af).add(0x110d0, 0x110e8).add(0x11103, 0x11126).add(0x11144).add(0x11147).add(0x11150, 0x11172).add(0x11176).add(0x11183, 0x111b2).add(0x111c1, 0x111c4).add(0x111da).add(0x111dc).add(0x11200, 0x11211).add(0x11213, 0x1122b).add(0x1123f, 0x11240).add(0x11280, 0x11286).add(0x11288).add(0x1128a, 0x1128d).add(0x1128f, 0x1129d).add(0x1129f, 0x112a8).add(0x112b0, 0x112de).add(0x11305, 0x1130c).add(0x1130f, 0x11310).add(0x11313, 0x11328).add(0x1132a, 0x11330).add(0x11332, 0x11333).add(0x11335, 0x11339).add(0x1133d).add(0x11350).add(0x1135d, 0x11361).add(0x11400, 0x11434).add(0x11447, 0x1144a).add(0x1145f, 0x11461).add(0x11480, 0x114af).add(0x114c4, 0x114c5).add(0x114c7).add(0x11580, 0x115ae).add(0x115d8, 0x115db).add(0x11600, 0x1162f).add(0x11644).add(0x11680, 0x116aa).add(0x116b8).add(0x11700, 0x1171a).add(0x11740, 0x11746).add(0x11800, 0x1182b).add(0x118ff, 0x11906).add(0x11909).add(0x1190c, 0x11913).add(0x11915, 0x11916).add(0x11918, 0x1192f).add(0x1193f).add(0x11941).add(0x119a0, 0x119a7).add(0x119aa, 0x119d0).add(0x119e1).add(0x119e3).add(0x11a00).add(0x11a0b, 0x11a32).add(0x11a3a).add(0x11a50).add(0x11a5c, 0x11a89).add(0x11a9d).add(0x11ab0, 0x11af8).add(0x11c00, 0x11c08).add(0x11c0a, 0x11c2e).add(0x11c40).add(0x11c72, 0x11c8f).add(0x11d00, 0x11d06).add(0x11d08, 0x11d09).add(0x11d0b, 0x11d30).add(0x11d46).add(0x11d60, 0x11d65).add(0x11d67, 0x11d68).add(0x11d6a, 0x11d89).add(0x11d98).add(0x11ee0, 0x11ef2).add(0x11f02).add(0x11f04, 0x11f10).add(0x11f12, 0x11f33).add(0x11fb0).add(0x12000, 0x12399).add(0x12480, 0x12543).add(0x12f90, 0x12ff0).add(0x13000, 0x1342f).add(0x13441, 0x13446).add(0x14400, 0x14646).add(0x16800, 0x16a38).add(0x16a40, 0x16a5e).add(0x16a70, 0x16abe).add(0x16ad0, 0x16aed).add(0x16b00, 0x16b2f).add(0x16b63, 0x16b77).add(0x16b7d, 0x16b8f).add(0x16f00, 0x16f4a).add(0x16f50).add(0x17000, 0x187f7).add(0x18800, 0x18cd5).add(0x18d00, 0x18d08).add(0x1b000, 0x1b122).add(0x1b132).add(0x1b150, 0x1b152).add(0x1b155).add(0x1b164, 0x1b167).add(0x1b170, 0x1b2fb).add(0x1bc00, 0x1bc6a).add(0x1bc70, 0x1bc7c).add(0x1bc80, 0x1bc88).add(0x1bc90, 0x1bc99).add(0x1df0a).add(0x1e100, 0x1e12c).add(0x1e14e).add(0x1e290, 0x1e2ad).add(0x1e2c0, 0x1e2eb).add(0x1e4d0, 0x1e4ea).add(0x1e7e0, 0x1e7e6).add(0x1e7e8, 0x1e7eb).add(0x1e7ed, 0x1e7ee).add(0x1e7f0, 0x1e7fe).add(0x1e800, 0x1e8c4).add(0x1ee00, 0x1ee03).add(0x1ee05, 0x1ee1f).add(0x1ee21, 0x1ee22).add(0x1ee24).add(0x1ee27).add(0x1ee29, 0x1ee32).add(0x1ee34, 0x1ee37).add(0x1ee39).add(0x1ee3b).add(0x1ee42).add(0x1ee47).add(0x1ee49).add(0x1ee4b).add(0x1ee4d, 0x1ee4f).add(0x1ee51, 0x1ee52).add(0x1ee54).add(0x1ee57).add(0x1ee59).add(0x1ee5b).add(0x1ee5d).add(0x1ee5f).add(0x1ee61, 0x1ee62).add(0x1ee64).add(0x1ee67, 0x1ee6a).add(0x1ee6c, 0x1ee72).add(0x1ee74, 0x1ee77).add(0x1ee79, 0x1ee7c).add(0x1ee7e).add(0x1ee80, 0x1ee89).add(0x1ee8b, 0x1ee9b).add(0x1eea1, 0x1eea3).add(0x1eea5, 0x1eea9).add(0x1eeab, 0x1eebb).add(0x20000, 0x2a6df).add(0x2a700, 0x2b739).add(0x2b740, 0x2b81d).add(0x2b820, 0x2cea1).add(0x2ceb0, 0x2ebe0).add(0x2ebf0, 0x2ee5d).add(0x2f800, 0x2fa1d).add(0x30000, 0x3134a).add(0x31350, 0x323af).build());
    codepointsByCode.put("Lt", builder().add(0x1c5).add(0x1c8).add(0x1cb).add(0x1f2).add(0x1f88, 0x1f8f).add(0x1f98, 0x1f9f).add(0x1fa8, 0x1faf).add(0x1fbc).add(0x1fcc).add(0x1ffc).build());
    codepointsByCode.put("Lu", builder().add('A', 'Z').add(0xc0, 0xd6).add(0xd8, 0xde).add(0x100).add(0x102).add(0x104).add(0x106).add(0x108).add(0x10a).add(0x10c).add(0x10e).add(0x110).add(0x112).add(0x114).add(0x116).add(0x118).add(0x11a).add(0x11c).add(0x11e).add(0x120).add(0x122).add(0x124).add(0x126).add(0x128).add(0x12a).add(0x12c).add(0x12e).add(0x130).add(0x132).add(0x134).add(0x136).add(0x139).add(0x13b).add(0x13d).add(0x13f).add(0x141).add(0x143).add(0x145).add(0x147).add(0x14a).add(0x14c).add(0x14e).add(0x150).add(0x152).add(0x154).add(0x156).add(0x158).add(0x15a).add(0x15c).add(0x15e).add(0x160).add(0x162).add(0x164).add(0x166).add(0x168).add(0x16a).add(0x16c).add(0x16e).add(0x170).add(0x172).add(0x174).add(0x176).add(0x178, 0x179).add(0x17b).add(0x17d).add(0x181, 0x182).add(0x184).add(0x186, 0x187).add(0x189, 0x18b).add(0x18e, 0x191).add(0x193, 0x194).add(0x196, 0x198).add(0x19c, 0x19d).add(0x19f, 0x1a0).add(0x1a2).add(0x1a4).add(0x1a6, 0x1a7).add(0x1a9).add(0x1ac).add(0x1ae, 0x1af).add(0x1b1, 0x1b3).add(0x1b5).add(0x1b7, 0x1b8).add(0x1bc).add(0x1c4).add(0x1c7).add(0x1ca).add(0x1cd).add(0x1cf).add(0x1d1).add(0x1d3).add(0x1d5).add(0x1d7).add(0x1d9).add(0x1db).add(0x1de).add(0x1e0).add(0x1e2).add(0x1e4).add(0x1e6).add(0x1e8).add(0x1ea).add(0x1ec).add(0x1ee).add(0x1f1).add(0x1f4).add(0x1f6, 0x1f8).add(0x1fa).add(0x1fc).add(0x1fe).add(0x200).add(0x202).add(0x204).add(0x206).add(0x208).add(0x20a).add(0x20c).add(0x20e).add(0x210).add(0x212).add(0x214).add(0x216).add(0x218).add(0x21a).add(0x21c).add(0x21e).add(0x220).add(0x222).add(0x224).add(0x226).add(0x228).add(0x22a).add(0x22c).add(0x22e).add(0x230).add(0x232).add(0x23a, 0x23b).add(0x23d, 0x23e).add(0x241).add(0x243, 0x246).add(0x248).add(0x24a).add(0x24c).add(0x24e).add(0x370).add(0x372).add(0x376).add(0x37f).add(0x386).add(0x388, 0x38a).add(0x38c).add(0x38e, 0x38f).add(0x391, 0x3a1).add(0x3a3, 0x3ab).add(0x3cf).add(0x3d2, 0x3d4).add(0x3d8).add(0x3da).add(0x3dc).add(0x3de).add(0x3e0).add(0x3e2).add(0x3e4).add(0x3e6).add(0x3e8).add(0x3ea).add(0x3ec).add(0x3ee).add(0x3f4).add(0x3f7).add(0x3f9, 0x3fa).add(0x3fd, 0x42f).add(0x460).add(0x462).add(0x464).add(0x466).add(0x468).add(0x46a).add(0x46c).add(0x46e).add(0x470).add(0x472).add(0x474).add(0x476).add(0x478).add(0x47a).add(0x47c).add(0x47e).add(0x480).add(0x48a).add(0x48c).add(0x48e).add(0x490).add(0x492).add(0x494).add(0x496).add(0x498).add(0x49a).add(0x49c).add(0x49e).add(0x4a0).add(0x4a2).add(0x4a4).add(0x4a6).add(0x4a8).add(0x4aa).add(0x4ac).add(0x4ae).add(0x4b0).add(0x4b2).add(0x4b4).add(0x4b6).add(0x4b8).add(0x4ba).add(0x4bc).add(0x4be).add(0x4c0, 0x4c1).add(0x4c3).add(0x4c5).add(0x4c7).add(0x4c9).add(0x4cb).add(0x4cd).add(0x4d0).add(0x4d2).add(0x4d4).add(0x4d6).add(0x4d8).add(0x4da).add(0x4dc).add(0x4de).add(0x4e0).add(0x4e2).add(0x4e4).add(0x4e6).add(0x4e8).add(0x4ea).add(0x4ec).add(0x4ee).add(0x4f0).add(0x4f2).add(0x4f4).add(0x4f6).add(0x4f8).add(0x4fa).add(0x4fc).add(0x4fe).add(0x500).add(0x502).add(0x504).add(0x506).add(0x508).add(0x50a).add(0x50c).add(0x50e).add(0x510).add(0x512).add(0x514).add(0x516).add(0x518).add(0x51a).add(0x51c).add(0x51e).add(0x520).add(0x522).add(0x524).add(0x526).add(0x528).add(0x52a).add(0x52c).add(0x52e).add(0x531, 0x556).add(0x10a0, 0x10c5).add(0x10c7).add(0x10cd).add(0x13a0, 0x13f5).add(0x1c90, 0x1cba).add(0x1cbd, 0x1cbf).add(0x1e00).add(0x1e02).add(0x1e04).add(0x1e06).add(0x1e08).add(0x1e0a).add(0x1e0c).add(0x1e0e).add(0x1e10).add(0x1e12).add(0x1e14).add(0x1e16).add(0x1e18).add(0x1e1a).add(0x1e1c).add(0x1e1e).add(0x1e20).add(0x1e22).add(0x1e24).add(0x1e26).add(0x1e28).add(0x1e2a).add(0x1e2c).add(0x1e2e).add(0x1e30).add(0x1e32).add(0x1e34).add(0x1e36).add(0x1e38).add(0x1e3a).add(0x1e3c).add(0x1e3e).add(0x1e40).add(0x1e42).add(0x1e44).add(0x1e46).add(0x1e48).add(0x1e4a).add(0x1e4c).add(0x1e4e).add(0x1e50).add(0x1e52).add(0x1e54).add(0x1e56).add(0x1e58).add(0x1e5a).add(0x1e5c).add(0x1e5e).add(0x1e60).add(0x1e62).add(0x1e64).add(0x1e66).add(0x1e68).add(0x1e6a).add(0x1e6c).add(0x1e6e).add(0x1e70).add(0x1e72).add(0x1e74).add(0x1e76).add(0x1e78).add(0x1e7a).add(0x1e7c).add(0x1e7e).add(0x1e80).add(0x1e82).add(0x1e84).add(0x1e86).add(0x1e88).add(0x1e8a).add(0x1e8c).add(0x1e8e).add(0x1e90).add(0x1e92).add(0x1e94).add(0x1e9e).add(0x1ea0).add(0x1ea2).add(0x1ea4).add(0x1ea6).add(0x1ea8).add(0x1eaa).add(0x1eac).add(0x1eae).add(0x1eb0).add(0x1eb2).add(0x1eb4).add(0x1eb6).add(0x1eb8).add(0x1eba).add(0x1ebc).add(0x1ebe).add(0x1ec0).add(0x1ec2).add(0x1ec4).add(0x1ec6).add(0x1ec8).add(0x1eca).add(0x1ecc).add(0x1ece).add(0x1ed0).add(0x1ed2).add(0x1ed4).add(0x1ed6).add(0x1ed8).add(0x1eda).add(0x1edc).add(0x1ede).add(0x1ee0).add(0x1ee2).add(0x1ee4).add(0x1ee6).add(0x1ee8).add(0x1eea).add(0x1eec).add(0x1eee).add(0x1ef0).add(0x1ef2).add(0x1ef4).add(0x1ef6).add(0x1ef8).add(0x1efa).add(0x1efc).add(0x1efe).add(0x1f08, 0x1f0f).add(0x1f18, 0x1f1d).add(0x1f28, 0x1f2f).add(0x1f38, 0x1f3f).add(0x1f48, 0x1f4d).add(0x1f59).add(0x1f5b).add(0x1f5d).add(0x1f5f).add(0x1f68, 0x1f6f).add(0x1fb8, 0x1fbb).add(0x1fc8, 0x1fcb).add(0x1fd8, 0x1fdb).add(0x1fe8, 0x1fec).add(0x1ff8, 0x1ffb).add(0x2102).add(0x2107).add(0x210b, 0x210d).add(0x2110, 0x2112).add(0x2115).add(0x2119, 0x211d).add(0x2124).add(0x2126).add(0x2128).add(0x212a, 0x212d).add(0x2130, 0x2133).add(0x213e, 0x213f).add(0x2145).add(0x2183).add(0x2c00, 0x2c2f).add(0x2c60).add(0x2c62, 0x2c64).add(0x2c67).add(0x2c69).add(0x2c6b).add(0x2c6d, 0x2c70).add(0x2c72).add(0x2c75).add(0x2c7e, 0x2c80).add(0x2c82).add(0x2c84).add(0x2c86).add(0x2c88).add(0x2c8a).add(0x2c8c).add(0x2c8e).add(0x2c90).add(0x2c92).add(0x2c94).add(0x2c96).add(0x2c98).add(0x2c9a).add(0x2c9c).add(0x2c9e).add(0x2ca0).add(0x2ca2).add(0x2ca4).add(0x2ca6).add(0x2ca8).add(0x2caa).add(0x2cac).add(0x2cae).add(0x2cb0).add(0x2cb2).add(0x2cb4).add(0x2cb6).add(0x2cb8).add(0x2cba).add(0x2cbc).add(0x2cbe).add(0x2cc0).add(0x2cc2).add(0x2cc4).add(0x2cc6).add(0x2cc8).add(0x2cca).add(0x2ccc).add(0x2cce).add(0x2cd0).add(0x2cd2).add(0x2cd4).add(0x2cd6).add(0x2cd8).add(0x2cda).add(0x2cdc).add(0x2cde).add(0x2ce0).add(0x2ce2).add(0x2ceb).add(0x2ced).add(0x2cf2).add(0xa640).add(0xa642).add(0xa644).add(0xa646).add(0xa648).add(0xa64a).add(0xa64c).add(0xa64e).add(0xa650).add(0xa652).add(0xa654).add(0xa656).add(0xa658).add(0xa65a).add(0xa65c).add(0xa65e).add(0xa660).add(0xa662).add(0xa664).add(0xa666).add(0xa668).add(0xa66a).add(0xa66c).add(0xa680).add(0xa682).add(0xa684).add(0xa686).add(0xa688).add(0xa68a).add(0xa68c).add(0xa68e).add(0xa690).add(0xa692).add(0xa694).add(0xa696).add(0xa698).add(0xa69a).add(0xa722).add(0xa724).add(0xa726).add(0xa728).add(0xa72a).add(0xa72c).add(0xa72e).add(0xa732).add(0xa734).add(0xa736).add(0xa738).add(0xa73a).add(0xa73c).add(0xa73e).add(0xa740).add(0xa742).add(0xa744).add(0xa746).add(0xa748).add(0xa74a).add(0xa74c).add(0xa74e).add(0xa750).add(0xa752).add(0xa754).add(0xa756).add(0xa758).add(0xa75a).add(0xa75c).add(0xa75e).add(0xa760).add(0xa762).add(0xa764).add(0xa766).add(0xa768).add(0xa76a).add(0xa76c).add(0xa76e).add(0xa779).add(0xa77b).add(0xa77d, 0xa77e).add(0xa780).add(0xa782).add(0xa784).add(0xa786).add(0xa78b).add(0xa78d).add(0xa790).add(0xa792).add(0xa796).add(0xa798).add(0xa79a).add(0xa79c).add(0xa79e).add(0xa7a0).add(0xa7a2).add(0xa7a4).add(0xa7a6).add(0xa7a8).add(0xa7aa, 0xa7ae).add(0xa7b0, 0xa7b4).add(0xa7b6).add(0xa7b8).add(0xa7ba).add(0xa7bc).add(0xa7be).add(0xa7c0).add(0xa7c2).add(0xa7c4, 0xa7c7).add(0xa7c9).add(0xa7d0).add(0xa7d6).add(0xa7d8).add(0xa7f5).add(0xff21, 0xff3a).add(0x10400, 0x10427).add(0x104b0, 0x104d3).add(0x10570, 0x1057a).add(0x1057c, 0x1058a).add(0x1058c, 0x10592).add(0x10594, 0x10595).add(0x10c80, 0x10cb2).add(0x118a0, 0x118bf).add(0x16e40, 0x16e5f).add(0x1d400, 0x1d419).add(0x1d434, 0x1d44d).add(0x1d468, 0x1d481).add(0x1d49c).add(0x1d49e, 0x1d49f).add(0x1d4a2).add(0x1d4a5, 0x1d4a6).add(0x1d4a9, 0x1d4ac).add(0x1d4ae, 0x1d4b5).add(0x1d4d0, 0x1d4e9).add(0x1d504, 0x1d505).add(0x1d507, 0x1d50a).add(0x1d50d, 0x1d514).add(0x1d516, 0x1d51c).add(0x1d538, 0x1d539).add(0x1d53b, 0x1d53e).add(0x1d540, 0x1d544).add(0x1d546).add(0x1d54a, 0x1d550).add(0x1d56c, 0x1d585).add(0x1d5a0, 0x1d5b9).add(0x1d5d4, 0x1d5ed).add(0x1d608, 0x1d621).add(0x1d63c, 0x1d655).add(0x1d670, 0x1d689).add(0x1d6a8, 0x1d6c0).add(0x1d6e2, 0x1d6fa).add(0x1d71c, 0x1d734).add(0x1d756, 0x1d76e).add(0x1d790, 0x1d7a8).add(0x1d7ca).add(0x1e900, 0x1e921).build());
    codepointsByCode.put("Mc", builder().add(0x903).add(0x93b).add(0x93e, 0x940).add(0x949, 0x94c).add(0x94e, 0x94f).add(0x982, 0x983).add(0x9be, 0x9c0).add(0x9c7, 0x9c8).add(0x9cb, 0x9cc).add(0x9d7).add(0xa03).add(0xa3e, 0xa40).add(0xa83).add(0xabe, 0xac0).add(0xac9).add(0xacb, 0xacc).add(0xb02, 0xb03).add(0xb3e).add(0xb40).add(0xb47, 0xb48).add(0xb4b, 0xb4c).add(0xb57).add(0xbbe, 0xbbf).add(0xbc1, 0xbc2).add(0xbc6, 0xbc8).add(0xbca, 0xbcc).add(0xbd7).add(0xc01, 0xc03).add(0xc41, 0xc44).add(0xc82, 0xc83).add(0xcbe).add(0xcc0, 0xcc4).add(0xcc7, 0xcc8).add(0xcca, 0xccb).add(0xcd5, 0xcd6).add(0xcf3).add(0xd02, 0xd03).add(0xd3e, 0xd40).add(0xd46, 0xd48).add(0xd4a, 0xd4c).add(0xd57).add(0xd82, 0xd83).add(0xdcf, 0xdd1).add(0xdd8, 0xddf).add(0xdf2, 0xdf3).add(0xf3e, 0xf3f).add(0xf7f).add(0x102b, 0x102c).add(0x1031).add(0x1038).add(0x103b, 0x103c).add(0x1056, 0x1057).add(0x1062, 0x1064).add(0x1067, 0x106d).add(0x1083, 0x1084).add(0x1087, 0x108c).add(0x108f).add(0x109a, 0x109c).add(0x1715).add(0x1734).add(0x17b6).add(0x17be, 0x17c5).add(0x17c7, 0x17c8).add(0x1923, 0x1926).add(0x1929, 0x192b).add(0x1930, 0x1931).add(0x1933, 0x1938).add(0x1a19, 0x1a1a).add(0x1a55).add(0x1a57).add(0x1a61).add(0x1a63, 0x1a64).add(0x1a6d, 0x1a72).add(0x1b04).add(0x1b35).add(0x1b3b).add(0x1b3d, 0x1b41).add(0x1b43, 0x1b44).add(0x1b82).add(0x1ba1).add(0x1ba6, 0x1ba7).add(0x1baa).add(0x1be7).add(0x1bea, 0x1bec).add(0x1bee).add(0x1bf2, 0x1bf3).add(0x1c24, 0x1c2b).add(0x1c34, 0x1c35).add(0x1ce1).add(0x1cf7).add(0x302e, 0x302f).add(0xa823, 0xa824).add(0xa827).add(0xa880, 0xa881).add(0xa8b4, 0xa8c3).add(0xa952, 0xa953).add(0xa983).add(0xa9b4, 0xa9b5).add(0xa9ba, 0xa9bb).add(0xa9be, 0xa9c0).add(0xaa2f, 0xaa30).add(0xaa33, 0xaa34).add(0xaa4d).add(0xaa7b).add(0xaa7d).add(0xaaeb).add(0xaaee, 0xaaef).add(0xaaf5).add(0xabe3, 0xabe4).add(0xabe6, 0xabe7).add(0xabe9, 0xabea).add(0xabec).add(0x11000).add(0x11002).add(0x11082).add(0x110b0, 0x110b2).add(0x110b7, 0x110b8).add(0x1112c).add(0x11145, 0x11146).add(0x11182).add(0x111b3, 0x111b5).add(0x111bf, 0x111c0).add(0x111ce).add(0x1122c, 0x1122e).add(0x11232, 0x11233).add(0x11235).add(0x112e0, 0x112e2).add(0x11302, 0x11303).add(0x1133e, 0x1133f).add(0x11341, 0x11344).add(0x11347, 0x11348).add(0x1134b, 0x1134d).add(0x11357).add(0x11362, 0x11363).add(0x11435, 0x11437).add(0x11440, 0x11441).add(0x11445).add(0x114b0, 0x114b2).add(0x114b9).add(0x114bb, 0x114be).add(0x114c1).add(0x115af, 0x115b1).add(0x115b8, 0x115bb).add(0x115be).add(0x11630, 0x11632).add(0x1163b, 0x1163c).add(0x1163e).add(0x116ac).add(0x116ae, 0x116af).add(0x116b6).add(0x11720, 0x11721).add(0x11726).add(0x1182c, 0x1182e).add(0x11838).add(0x11930, 0x11935).add(0x11937, 0x11938).add(0x1193d).add(0x11940).add(0x11942).add(0x119d1, 0x119d3).add(0x119dc, 0x119df).add(0x119e4).add(0x11a39).add(0x11a57, 0x11a58).add(0x11a97).add(0x11c2f).add(0x11c3e).add(0x11ca9).add(0x11cb1).add(0x11cb4).add(0x11d8a, 0x11d8e).add(0x11d93, 0x11d94).add(0x11d96).add(0x11ef5, 0x11ef6).add(0x11f03).add(0x11f34, 0x11f35).add(0x11f3e, 0x11f3f).add(0x11f41).add(0x16f51, 0x16f87).add(0x16ff0, 0x16ff1).add(0x1d165, 0x1d166).add(0x1d16d, 0x1d172).build());
    codepointsByCode.put("Me", builder().add(0x488, 0x489).add(0x1abe).add(0x20dd, 0x20e0).add(0x20e2, 0x20e4).add(0xa670, 0xa672).build());
    codepointsByCode.put("Mn", builder().add(0x300, 0x36f).add(0x483, 0x487).add(0x591, 0x5bd).add(0x5bf).add(0x5c1, 0x5c2).add(0x5c4, 0x5c5).add(0x5c7).add(0x610, 0x61a).add(0x64b, 0x65f).add(0x670).add(0x6d6, 0x6dc).add(0x6df, 0x6e4).add(0x6e7, 0x6e8).add(0x6ea, 0x6ed).add(0x711).add(0x730, 0x74a).add(0x7a6, 0x7b0).add(0x7eb, 0x7f3).add(0x7fd).add(0x816, 0x819).add(0x81b, 0x823).add(0x825, 0x827).add(0x829, 0x82d).add(0x859, 0x85b).add(0x898, 0x89f).add(0x8ca, 0x8e1).add(0x8e3, 0x902).add(0x93a).add(0x93c).add(0x941, 0x948).add(0x94d).add(0x951, 0x957).add(0x962, 0x963).add(0x981).add(0x9bc).add(0x9c1, 0x9c4).add(0x9cd).add(0x9e2, 0x9e3).add(0x9fe).add(0xa01, 0xa02).add(0xa3c).add(0xa41, 0xa42).add(0xa47, 0xa48).add(0xa4b, 0xa4d).add(0xa51).add(0xa70, 0xa71).add(0xa75).add(0xa81, 0xa82).add(0xabc).add(0xac1, 0xac5).add(0xac7, 0xac8).add(0xacd).add(0xae2, 0xae3).add(0xafa, 0xaff).add(0xb01).add(0xb3c).add(0xb3f).add(0xb41, 0xb44).add(0xb4d).add(0xb55, 0xb56).add(0xb62, 0xb63).add(0xb82).add(0xbc0).add(0xbcd).add(0xc00).add(0xc04).add(0xc3c).add(0xc3e, 0xc40).add(0xc46, 0xc48).add(0xc4a, 0xc4d).add(0xc55, 0xc56).add(0xc62, 0xc63).add(0xc81).add(0xcbc).add(0xcbf).add(0xcc6).add(0xccc, 0xccd).add(0xce2, 0xce3).add(0xd00, 0xd01).add(0xd3b, 0xd3c).add(0xd41, 0xd44).add(0xd4d).add(0xd62, 0xd63).add(0xd81).add(0xdca).add(0xdd2, 0xdd4).add(0xdd6).add(0xe31).add(0xe34, 0xe3a).add(0xe47, 0xe4e).add(0xeb1).add(0xeb4, 0xebc).add(0xec8, 0xece).add(0xf18, 0xf19).add(0xf35).add(0xf37).add(0xf39).add(0xf71, 0xf7e).add(0xf80, 0xf84).add(0xf86, 0xf87).add(0xf8d, 0xf97).add(0xf99, 0xfbc).add(0xfc6).add(0x102d, 0x1030).add(0x1032, 0x1037).add(0x1039, 0x103a).add(0x103d, 0x103e).add(0x1058, 0x1059).add(0x105e, 0x1060).add(0x1071, 0x1074).add(0x1082).add(0x1085, 0x1086).add(0x108d).add(0x109d).add(0x135d, 0x135f).add(0x1712, 0x1714).add(0x1732, 0x1733).add(0x1752, 0x1753).add(0x1772, 0x1773).add(0x17b4, 0x17b5).add(0x17b7, 0x17bd).add(0x17c6).add(0x17c9, 0x17d3).add(0x17dd).add(0x180b, 0x180d).add(0x180f).add(0x1885, 0x1886).add(0x18a9).add(0x1920, 0x1922).add(0x1927, 0x1928).add(0x1932).add(0x1939, 0x193b).add(0x1a17, 0x1a18).add(0x1a1b).add(0x1a56).add(0x1a58, 0x1a5e).add(0x1a60).add(0x1a62).add(0x1a65, 0x1a6c).add(0x1a73, 0x1a7c).add(0x1a7f).add(0x1ab0, 0x1abd).add(0x1abf, 0x1ace).add(0x1b00, 0x1b03).add(0x1b34).add(0x1b36, 0x1b3a).add(0x1b3c).add(0x1b42).add(0x1b6b, 0x1b73).add(0x1b80, 0x1b81).add(0x1ba2, 0x1ba5).add(0x1ba8, 0x1ba9).add(0x1bab, 0x1bad).add(0x1be6).add(0x1be8, 0x1be9).add(0x1bed).add(0x1bef, 0x1bf1).add(0x1c2c, 0x1c33).add(0x1c36, 0x1c37).add(0x1cd0, 0x1cd2).add(0x1cd4, 0x1ce0).add(0x1ce2, 0x1ce8).add(0x1ced).add(0x1cf4).add(0x1cf8, 0x1cf9).add(0x1dc0, 0x1dff).add(0x20d0, 0x20dc).add(0x20e1).add(0x20e5, 0x20f0).add(0x2cef, 0x2cf1).add(0x2d7f).add(0x2de0, 0x2dff).add(0x302a, 0x302d).add(0x3099, 0x309a).add(0xa66f).add(0xa674, 0xa67d).add(0xa69e, 0xa69f).add(0xa6f0, 0xa6f1).add(0xa802).add(0xa806).add(0xa80b).add(0xa825, 0xa826).add(0xa82c).add(0xa8c4, 0xa8c5).add(0xa8e0, 0xa8f1).add(0xa8ff).add(0xa926, 0xa92d).add(0xa947, 0xa951).add(0xa980, 0xa982).add(0xa9b3).add(0xa9b6, 0xa9b9).add(0xa9bc, 0xa9bd).add(0xa9e5).add(0xaa29, 0xaa2e).add(0xaa31, 0xaa32).add(0xaa35, 0xaa36).add(0xaa43).add(0xaa4c).add(0xaa7c).add(0xaab0).add(0xaab2, 0xaab4).add(0xaab7, 0xaab8).add(0xaabe, 0xaabf).add(0xaac1).add(0xaaec, 0xaaed).add(0xaaf6).add(0xabe5).add(0xabe8).add(0xabed).add(0xfb1e).add(0xfe00, 0xfe0f).add(0xfe20, 0xfe2f).add(0x101fd).add(0x102e0).add(0x10376, 0x1037a).add(0x10a01, 0x10a03).add(0x10a05, 0x10a06).add(0x10a0c, 0x10a0f).add(0x10a38, 0x10a3a).add(0x10a3f).add(0x10ae5, 0x10ae6).add(0x10d24, 0x10d27).add(0x10eab, 0x10eac).add(0x10efd, 0x10eff).add(0x10f46, 0x10f50).add(0x10f82, 0x10f85).add(0x11001).add(0x11038, 0x11046).add(0x11070).add(0x11073, 0x11074).add(0x1107f, 0x11081).add(0x110b3, 0x110b6).add(0x110b9, 0x110ba).add(0x110c2).add(0x11100, 0x11102).add(0x11127, 0x1112b).add(0x1112d, 0x11134).add(0x11173).add(0x11180, 0x11181).add(0x111b6, 0x111be).add(0x111c9, 0x111cc).add(0x111cf).add(0x1122f, 0x11231).add(0x11234).add(0x11236, 0x11237).add(0x1123e).add(0x11241).add(0x112df).add(0x112e3, 0x112ea).add(0x11300, 0x11301).add(0x1133b, 0x1133c).add(0x11340).add(0x11366, 0x1136c).add(0x11370, 0x11374).add(0x11438, 0x1143f).add(0x11442, 0x11444).add(0x11446).add(0x1145e).add(0x114b3, 0x114b8).add(0x114ba).add(0x114bf, 0x114c0).add(0x114c2, 0x114c3).add(0x115b2, 0x115b5).add(0x115bc, 0x115bd).add(0x115bf, 0x115c0).add(0x115dc, 0x115dd).add(0x11633, 0x1163a).add(0x1163d).add(0x1163f, 0x11640).add(0x116ab).add(0x116ad).add(0x116b0, 0x116b5).add(0x116b7).add(0x1171d, 0x1171f).add(0x11722, 0x11725).add(0x11727, 0x1172b).add(0x1182f, 0x11837).add(0x11839, 0x1183a).add(0x1193b, 0x1193c).add(0x1193e).add(0x11943).add(0x119d4, 0x119d7).add(0x119da, 0x119db).add(0x119e0).add(0x11a01, 0x11a0a).add(0x11a33, 0x11a38).add(0x11a3b, 0x11a3e).add(0x11a47).add(0x11a51, 0x11a56).add(0x11a59, 0x11a5b).add(0x11a8a, 0x11a96).add(0x11a98, 0x11a99).add(0x11c30, 0x11c36).add(0x11c38, 0x11c3d).add(0x11c3f).add(0x11c92, 0x11ca7).add(0x11caa, 0x11cb0).add(0x11cb2, 0x11cb3).add(0x11cb5, 0x11cb6).add(0x11d31, 0x11d36).add(0x11d3a).add(0x11d3c, 0x11d3d).add(0x11d3f, 0x11d45).add(0x11d47).add(0x11d90, 0x11d91).add(0x11d95).add(0x11d97).add(0x11ef3, 0x11ef4).add(0x11f00, 0x11f01).add(0x11f36, 0x11f3a).add(0x11f40).add(0x11f42).add(0x13440).add(0x13447, 0x13455).add(0x16af0, 0x16af4).add(0x16b30, 0x16b36).add(0x16f4f).add(0x16f8f, 0x16f92).add(0x16fe4).add(0x1bc9d, 0x1bc9e).add(0x1cf00, 0x1cf2d).add(0x1cf30, 0x1cf46).add(0x1d167, 0x1d169).add(0x1d17b, 0x1d182).add(0x1d185, 0x1d18b).add(0x1d1aa, 0x1d1ad).add(0x1d242, 0x1d244).add(0x1da00, 0x1da36).add(0x1da3b, 0x1da6c).add(0x1da75).add(0x1da84).add(0x1da9b, 0x1da9f).add(0x1daa1, 0x1daaf).add(0x1e000, 0x1e006).add(0x1e008, 0x1e018).add(0x1e01b, 0x1e021).add(0x1e023, 0x1e024).add(0x1e026, 0x1e02a).add(0x1e08f).add(0x1e130, 0x1e136).add(0x1e2ae).add(0x1e2ec, 0x1e2ef).add(0x1e4ec, 0x1e4ef).add(0x1e8d0, 0x1e8d6).add(0x1e944, 0x1e94a).add(0xe0100, 0xe01ef).build());
    codepointsByCode.put("Nd", builder().add('0', '9').add(0x660, 0x669).add(0x6f0, 0x6f9).add(0x7c0, 0x7c9).add(0x966, 0x96f).add(0x9e6, 0x9ef).add(0xa66, 0xa6f).add(0xae6, 0xaef).add(0xb66, 0xb6f).add(0xbe6, 0xbef).add(0xc66, 0xc6f).add(0xce6, 0xcef).add(0xd66, 0xd6f).add(0xde6, 0xdef).add(0xe50, 0xe59).add(0xed0, 0xed9).add(0xf20, 0xf29).add(0x1040, 0x1049).add(0x1090, 0x1099).add(0x17e0, 0x17e9).add(0x1810, 0x1819).add(0x1946, 0x194f).add(0x19d0, 0x19d9).add(0x1a80, 0x1a89).add(0x1a90, 0x1a99).add(0x1b50, 0x1b59).add(0x1bb0, 0x1bb9).add(0x1c40, 0x1c49).add(0x1c50, 0x1c59).add(0xa620, 0xa629).add(0xa8d0, 0xa8d9).add(0xa900, 0xa909).add(0xa9d0, 0xa9d9).add(0xa9f0, 0xa9f9).add(0xaa50, 0xaa59).add(0xabf0, 0xabf9).add(0xff10, 0xff19).add(0x104a0, 0x104a9).add(0x10d30, 0x10d39).add(0x11066, 0x1106f).add(0x110f0, 0x110f9).add(0x11136, 0x1113f).add(0x111d0, 0x111d9).add(0x112f0, 0x112f9).add(0x11450, 0x11459).add(0x114d0, 0x114d9).add(0x11650, 0x11659).add(0x116c0, 0x116c9).add(0x11730, 0x11739).add(0x118e0, 0x118e9).add(0x11950, 0x11959).add(0x11c50, 0x11c59).add(0x11d50, 0x11d59).add(0x11da0, 0x11da9).add(0x11f50, 0x11f59).add(0x16a60, 0x16a69).add(0x16ac0, 0x16ac9).add(0x16b50, 0x16b59).add(0x1d7ce, 0x1d7ff).add(0x1e140, 0x1e149).add(0x1e2f0, 0x1e2f9).add(0x1e4f0, 0x1e4f9).add(0x1e950, 0x1e959).add(0x1fbf0, 0x1fbf9).build());
    codepointsByCode.put("Nl", builder().add(0x16ee, 0x16f0).add(0x2160, 0x2182).add(0x2185, 0x2188).add(0x3007).add(0x3021, 0x3029).add(0x3038, 0x303a).add(0xa6e6, 0xa6ef).add(0x10140, 0x10174).add(0x10341).add(0x1034a).add(0x103d1, 0x103d5).add(0x12400, 0x1246e).build());
    codepointsByCode.put("No", builder().add(0xb2, 0xb3).add(0xb9).add(0xbc, 0xbe).add(0x9f4, 0x9f9).add(0xb72, 0xb77).add(0xbf0, 0xbf2).add(0xc78, 0xc7e).add(0xd58, 0xd5e).add(0xd70, 0xd78).add(0xf2a, 0xf33).add(0x1369, 0x137c).add(0x17f0, 0x17f9).add(0x19da).add(0x2070).add(0x2074, 0x2079).add(0x2080, 0x2089).add(0x2150, 0x215f).add(0x2189).add(0x2460, 0x249b).add(0x24ea, 0x24ff).add(0x2776, 0x2793).add(0x2cfd).add(0x3192, 0x3195).add(0x3220, 0x3229).add(0x3248, 0x324f).add(0x3251, 0x325f).add(0x3280, 0x3289).add(0x32b1, 0x32bf).add(0xa830, 0xa835).add(0x10107, 0x10133).add(0x10175, 0x10178).add(0x1018a, 0x1018b).add(0x102e1, 0x102fb).add(0x10320, 0x10323).add(0x10858, 0x1085f).add(0x10879, 0x1087f).add(0x108a7, 0x108af).add(0x108fb, 0x108ff).add(0x10916, 0x1091b).add(0x109bc, 0x109bd).add(0x109c0, 0x109cf).add(0x109d2, 0x109ff).add(0x10a40, 0x10a48).add(0x10a7d, 0x10a7e).add(0x10a9d, 0x10a9f).add(0x10aeb, 0x10aef).add(0x10b58, 0x10b5f).add(0x10b78, 0x10b7f).add(0x10ba9, 0x10baf).add(0x10cfa, 0x10cff).add(0x10e60, 0x10e7e).add(0x10f1d, 0x10f26).add(0x10f51, 0x10f54).add(0x10fc5, 0x10fcb).add(0x11052, 0x11065).add(0x111e1, 0x111f4).add(0x1173a, 0x1173b).add(0x118ea, 0x118f2).add(0x11c5a, 0x11c6c).add(0x11fc0, 0x11fd4).add(0x16b5b, 0x16b61).add(0x16e80, 0x16e96).add(0x1d2c0, 0x1d2d3).add(0x1d2e0, 0x1d2f3).add(0x1d360, 0x1d378).add(0x1e8c7, 0x1e8cf).add(0x1ec71, 0x1ecab).add(0x1ecad, 0x1ecaf).add(0x1ecb1, 0x1ecb4).add(0x1ed01, 0x1ed2d).add(0x1ed2f, 0x1ed3d).add(0x1f100, 0x1f10c).build());
    codepointsByCode.put("Pc", builder().add('_').add(0x203f, 0x2040).add(0x2054).add(0xfe33, 0xfe34).add(0xfe4d, 0xfe4f).add(0xff3f).build());
    codepointsByCode.put("Pd", builder().add('-').add(0x58a).add(0x5be).add(0x1400).add(0x1806).add(0x2010, 0x2015).add(0x2e17).add(0x2e1a).add(0x2e3a, 0x2e3b).add(0x2e40).add(0x2e5d).add(0x301c).add(0x3030).add(0x30a0).add(0xfe31, 0xfe32).add(0xfe58).add(0xfe63).add(0xff0d).add(0x10ead).build());
    codepointsByCode.put("Pe", builder().add(')').add(']').add('}').add(0xf3b).add(0xf3d).add(0x169c).add(0x2046).add(0x207e).add(0x208e).add(0x2309).add(0x230b).add(0x232a).add(0x2769).add(0x276b).add(0x276d).add(0x276f).add(0x2771).add(0x2773).add(0x2775).add(0x27c6).add(0x27e7).add(0x27e9).add(0x27eb).add(0x27ed).add(0x27ef).add(0x2984).add(0x2986).add(0x2988).add(0x298a).add(0x298c).add(0x298e).add(0x2990).add(0x2992).add(0x2994).add(0x2996).add(0x2998).add(0x29d9).add(0x29db).add(0x29fd).add(0x2e23).add(0x2e25).add(0x2e27).add(0x2e29).add(0x2e56).add(0x2e58).add(0x2e5a).add(0x2e5c).add(0x3009).add(0x300b).add(0x300d).add(0x300f).add(0x3011).add(0x3015).add(0x3017).add(0x3019).add(0x301b).add(0x301e, 0x301f).add(0xfd3e).add(0xfe18).add(0xfe36).add(0xfe38).add(0xfe3a).add(0xfe3c).add(0xfe3e).add(0xfe40).add(0xfe42).add(0xfe44).add(0xfe48).add(0xfe5a).add(0xfe5c).add(0xfe5e).add(0xff09).add(0xff3d).add(0xff5d).add(0xff60).add(0xff63).build());
    codepointsByCode.put("Pf", builder().add(0xbb).add(0x2019).add(0x201d).add(0x203a).add(0x2e03).add(0x2e05).add(0x2e0a).add(0x2e0d).add(0x2e1d).add(0x2e21).build());
    codepointsByCode.put("Pi", builder().add(0xab).add(0x2018).add(0x201b, 0x201c).add(0x201f).add(0x2039).add(0x2e02).add(0x2e04).add(0x2e09).add(0x2e0c).add(0x2e1c).add(0x2e20).build());
    codepointsByCode.put("Po", builder().add('!', '#').add('%', '\'').add('*').add(',').add('.', '/').add(':', ';').add('?', '@').add('\\').add(0xa1).add(0xa7).add(0xb6, 0xb7).add(0xbf).add(0x37e).add(0x387).add(0x55a, 0x55f).add(0x589).add(0x5c0).add(0x5c3).add(0x5c6).add(0x5f3, 0x5f4).add(0x609, 0x60a).add(0x60c, 0x60d).add(0x61b).add(0x61d, 0x61f).add(0x66a, 0x66d).add(0x6d4).add(0x700, 0x70d).add(0x7f7, 0x7f9).add(0x830, 0x83e).add(0x85e).add(0x964, 0x965).add(0x970).add(0x9fd).add(0xa76).add(0xaf0).add(0xc77).add(0xc84).add(0xdf4).add(0xe4f).add(0xe5a, 0xe5b).add(0xf04, 0xf12).add(0xf14).add(0xf85).add(0xfd0, 0xfd4).add(0xfd9, 0xfda).add(0x104a, 0x104f).add(0x10fb).add(0x1360, 0x1368).add(0x166e).add(0x16eb, 0x16ed).add(0x1735, 0x1736).add(0x17d4, 0x17d6).add(0x17d8, 0x17da).add(0x1800, 0x1805).add(0x1807, 0x180a).add(0x1944, 0x1945).add(0x1a1e, 0x1a1f).add(0x1aa0, 0x1aa6).add(0x1aa8, 0x1aad).add(0x1b5a, 0x1b60).add(0x1b7d, 0x1b7e).add(0x1bfc, 0x1bff).add(0x1c3b, 0x1c3f).add(0x1c7e, 0x1c7f).add(0x1cc0, 0x1cc7).add(0x1cd3).add(0x2016, 0x2017).add(0x2020, 0x2027).add(0x2030, 0x2038).add(0x203b, 0x203e).add(0x2041, 0x2043).add(0x2047, 0x2051).add(0x2053).add(0x2055, 0x205e).add(0x2cf9, 0x2cfc).add(0x2cfe, 0x2cff).add(0x2d70).add(0x2e00, 0x2e01).add(0x2e06, 0x2e08).add(0x2e0b).add(0x2e0e, 0x2e16).add(0x2e18, 0x2e19).add(0x2e1b).add(0x2e1e, 0x2e1f).add(0x2e2a, 0x2e2e).add(0x2e30, 0x2e39).add(0x2e3c, 0x2e3f).add(0x2e41).add(0x2e43, 0x2e4f).add(0x2e52, 0x2e54).add(0x3001, 0x3003).add(0x303d).add(0x30fb).add(0xa4fe, 0xa4ff).add(0xa60d, 0xa60f).add(0xa673).add(0xa67e).add(0xa6f2, 0xa6f7).add(0xa874, 0xa877).add(0xa8ce, 0xa8cf).add(0xa8f8, 0xa8fa).add(0xa8fc).add(0xa92e, 0xa92f).add(0xa95f).add(0xa9c1, 0xa9cd).add(0xa9de, 0xa9df).add(0xaa5c, 0xaa5f).add(0xaade, 0xaadf).add(0xaaf0, 0xaaf1).add(0xabeb).add(0xfe10, 0xfe16).add(0xfe19).add(0xfe30).add(0xfe45, 0xfe46).add(0xfe49, 0xfe4c).add(0xfe50, 0xfe52).add(0xfe54, 0xfe57).add(0xfe5f, 0xfe61).add(0xfe68).add(0xfe6a, 0xfe6b).add(0xff01, 0xff03).add(0xff05, 0xff07).add(0xff0a).add(0xff0c).add(0xff0e, 0xff0f).add(0xff1a, 0xff1b).add(0xff1f, 0xff20).add(0xff3c).add(0xff61).add(0xff64, 0xff65).add(0x10100, 0x10102).add(0x1039f).add(0x103d0).add(0x1056f).add(0x10857).add(0x1091f).add(0x1093f).add(0x10a50, 0x10a58).add(0x10a7f).add(0x10af0, 0x10af6).add(0x10b39, 0x10b3f).add(0x10b99, 0x10b9c).add(0x10f55, 0x10f59).add(0x10f86, 0x10f89).add(0x11047, 0x1104d).add(0x110bb, 0x110bc).add(0x110be, 0x110c1).add(0x11140, 0x11143).add(0x11174, 0x11175).add(0x111c5, 0x111c8).add(0x111cd).add(0x111db).add(0x111dd, 0x111df).add(0x11238, 0x1123d).add(0x112a9).add(0x1144b, 0x1144f).add(0x1145a, 0x1145b).add(0x1145d).add(0x114c6).add(0x115c1, 0x115d7).add(0x11641, 0x11643).add(0x11660, 0x1166c).add(0x116b9).add(0x1173c, 0x1173e).add(0x1183b).add(0x11944, 0x11946).add(0x119e2).add(0x11a3f, 0x11a46).add(0x11a9a, 0x11a9c).add(0x11a9e, 0x11aa2).add(0x11b00, 0x11b09).add(0x11c41, 0x11c45).add(0x11c70, 0x11c71).add(0x11ef7, 0x11ef8).add(0x11f43, 0x11f4f).add(0x11fff).add(0x12470, 0x12474).add(0x12ff1, 0x12ff2).add(0x16a6e, 0x16a6f).add(0x16af5).add(0x16b37, 0x16b3b).add(0x16b44).add(0x16e97, 0x16e9a).add(0x16fe2).add(0x1bc9f).add(0x1da87, 0x1da8b).add(0x1e95e, 0x1e95f).build());
    codepointsByCode.put("Ps", builder().add('(').add('[').add('{').add(0xf3a).add(0xf3c).add(0x169b).add(0x201a).add(0x201e).add(0x2045).add(0x207d).add(0x208d).add(0x2308).add(0x230a).add(0x2329).add(0x2768).add(0x276a).add(0x276c).add(0x276e).add(0x2770).add(0x2772).add(0x2774).add(0x27c5).add(0x27e6).add(0x27e8).add(0x27ea).add(0x27ec).add(0x27ee).add(0x2983).add(0x2985).add(0x2987).add(0x2989).add(0x298b).add(0x298d).add(0x298f).add(0x2991).add(0x2993).add(0x2995).add(0x2997).add(0x29d8).add(0x29da).add(0x29fc).add(0x2e22).add(0x2e24).add(0x2e26).add(0x2e28).add(0x2e42).add(0x2e55).add(0x2e57).add(0x2e59).add(0x2e5b).add(0x3008).add(0x300a).add(0x300c).add(0x300e).add(0x3010).add(0x3014).add(0x3016).add(0x3018).add(0x301a).add(0x301d).add(0xfd3f).add(0xfe17).add(0xfe35).add(0xfe37).add(0xfe39).add(0xfe3b).add(0xfe3d).add(0xfe3f).add(0xfe41).add(0xfe43).add(0xfe47).add(0xfe59).add(0xfe5b).add(0xfe5d).add(0xff08).add(0xff3b).add(0xff5b).add(0xff5f).add(0xff62).build());
    codepointsByCode.put("Sc", builder().add('$').add(0xa2, 0xa5).add(0x58f).add(0x60b).add(0x7fe, 0x7ff).add(0x9f2, 0x9f3).add(0x9fb).add(0xaf1).add(0xbf9).add(0xe3f).add(0x17db).add(0x20a0, 0x20c0).add(0xa838).add(0xfdfc).add(0xfe69).add(0xff04).add(0xffe0, 0xffe1).add(0xffe5, 0xffe6).add(0x11fdd, 0x11fe0).add(0x1e2ff).add(0x1ecb0).build());
    codepointsByCode.put("Sk", builder().add('^').add('`').add(0xa8).add(0xaf).add(0xb4).add(0xb8).add(0x2c2, 0x2c5).add(0x2d2, 0x2df).add(0x2e5, 0x2eb).add(0x2ed).add(0x2ef, 0x2ff).add(0x375).add(0x384, 0x385).add(0x888).add(0x1fbd).add(0x1fbf, 0x1fc1).add(0x1fcd, 0x1fcf).add(0x1fdd, 0x1fdf).add(0x1fed, 0x1fef).add(0x1ffd, 0x1ffe).add(0x309b, 0x309c).add(0xa700, 0xa716).add(0xa720, 0xa721).add(0xa789, 0xa78a).add(0xab5b).add(0xab6a, 0xab6b).add(0xfbb2, 0xfbc2).add(0xff3e).add(0xff40).add(0xffe3).add(0x1f3fb, 0x1f3ff).build());
    codepointsByCode.put("Sm", builder().add('+').add('<', '>').add('|').add('~').add(0xac).add(0xb1).add(0xd7).add(0xf7).add(0x3f6).add(0x606, 0x608).add(0x2044).add(0x2052).add(0x207a, 0x207c).add(0x208a, 0x208c).add(0x2118).add(0x2140, 0x2144).add(0x214b).add(0x2190, 0x2194).add(0x219a, 0x219b).add(0x21a0).add(0x21a3).add(0x21a6).add(0x21ae).add(0x21ce, 0x21cf).add(0x21d2).add(0x21d4).add(0x21f4, 0x22ff).add(0x2320, 0x2321).add(0x237c).add(0x239b, 0x23b3).add(0x23dc, 0x23e1).add(0x25b7).add(0x25c1).add(0x25f8, 0x25ff).add(0x266f).add(0x27c0, 0x27c4).add(0x27c7, 0x27e5).add(0x27f0, 0x27ff).add(0x2900, 0x2982).add(0x2999, 0x29d7).add(0x29dc, 0x29fb).add(0x29fe, 0x2aff).add(0x2b30, 0x2b44).add(0x2b47, 0x2b4c).add(0xfb29).add(0xfe62).add(0xfe64, 0xfe66).add(0xff0b).add(0xff1c, 0xff1e).add(0xff5c).add(0xff5e).add(0xffe2).add(0xffe9, 0xffec).add(0x1d6c1).add(0x1d6db).add(0x1d6fb).add(0x1d715).add(0x1d735).add(0x1d74f).add(0x1d76f).add(0x1d789).add(0x1d7a9).add(0x1d7c3).add(0x1eef0, 0x1eef1).build());
    codepointsByCode.put("So", builder().add(0xa6).add(0xa9).add(0xae).add(0xb0).add(0x482).add(0x58d, 0x58e).add(0x60e, 0x60f).add(0x6de).add(0x6e9).add(0x6fd, 0x6fe).add(0x7f6).add(0x9fa).add(0xb70).add(0xbf3, 0xbf8).add(0xbfa).add(0xc7f).add(0xd4f).add(0xd79).add(0xf01, 0xf03).add(0xf13).add(0xf15, 0xf17).add(0xf1a, 0xf1f).add(0xf34).add(0xf36).add(0xf38).add(0xfbe, 0xfc5).add(0xfc7, 0xfcc).add(0xfce, 0xfcf).add(0xfd5, 0xfd8).add(0x109e, 0x109f).add(0x1390, 0x1399).add(0x166d).add(0x1940).add(0x19de, 0x19ff).add(0x1b61, 0x1b6a).add(0x1b74, 0x1b7c).add(0x2100, 0x2101).add(0x2103, 0x2106).add(0x2108, 0x2109).add(0x2114).add(0x2116, 0x2117).add(0x211e, 0x2123).add(0x2125).add(0x2127).add(0x2129).add(0x212e).add(0x213a, 0x213b).add(0x214a).add(0x214c, 0x214d).add(0x214f).add(0x218a, 0x218b).add(0x2195, 0x2199).add(0x219c, 0x219f).add(0x21a1, 0x21a2).add(0x21a4, 0x21a5).add(0x21a7, 0x21ad).add(0x21af, 0x21cd).add(0x21d0, 0x21d1).add(0x21d3).add(0x21d5, 0x21f3).add(0x2300, 0x2307).add(0x230c, 0x231f).add(0x2322, 0x2328).add(0x232b, 0x237b).add(0x237d, 0x239a).add(0x23b4, 0x23db).add(0x23e2, 0x2426).add(0x2440, 0x244a).add(0x249c, 0x24e9).add(0x2500, 0x25b6).add(0x25b8, 0x25c0).add(0x25c2, 0x25f7).add(0x2600, 0x266e).add(0x2670, 0x2767).add(0x2794, 0x27bf).add(0x2800, 0x28ff).add(0x2b00, 0x2b2f).add(0x2b45, 0x2b46).add(0x2b4d, 0x2b73).add(0x2b76, 0x2b95).add(0x2b97, 0x2bff).add(0x2ce5, 0x2cea).add(0x2e50, 0x2e51).add(0x2e80, 0x2e99).add(0x2e9b, 0x2ef3).add(0x2f00, 0x2fd5).add(0x2ff0, 0x2fff).add(0x3004).add(0x3012, 0x3013).add(0x3020).add(0x3036, 0x3037).add(0x303e, 0x303f).add(0x3190, 0x3191).add(0x3196, 0x319f).add(0x31c0, 0x31e3).add(0x31ef).add(0x3200, 0x321e).add(0x322a, 0x3247).add(0x3250).add(0x3260, 0x327f).add(0x328a, 0x32b0).add(0x32c0, 0x33ff).add(0x4dc0, 0x4dff).add(0xa490, 0xa4c6).add(0xa828, 0xa82b).add(0xa836, 0xa837).add(0xa839).add(0xaa77, 0xaa79).add(0xfd40, 0xfd4f).add(0xfdcf).add(0xfdfd, 0xfdff).add(0xffe4).add(0xffe8).add(0xffed, 0xffee).add(0xfffc, 0xfffd).add(0x10137, 0x1013f).add(0x10179, 0x10189).add(0x1018c, 0x1018e).add(0x10190, 0x1019c).add(0x101a0).add(0x101d0, 0x101fc).add(0x10877, 0x10878).add(0x10ac8).add(0x1173f).add(0x11fd5, 0x11fdc).add(0x11fe1, 0x11ff1).add(0x16b3c, 0x16b3f).add(0x16b45).add(0x1bc9c).add(0x1cf50, 0x1cfc3).add(0x1d000, 0x1d0f5).add(0x1d100, 0x1d126).add(0x1d129, 0x1d164).add(0x1d16a, 0x1d16c).add(0x1d183, 0x1d184).add(0x1d18c, 0x1d1a9).add(0x1d1ae, 0x1d1ea).add(0x1d200, 0x1d241).add(0x1d245).add(0x1d300, 0x1d356).add(0x1d800, 0x1d9ff).add(0x1da37, 0x1da3a).add(0x1da6d, 0x1da74).add(0x1da76, 0x1da83).add(0x1da85, 0x1da86).add(0x1e14f).add(0x1ecac).add(0x1ed2e).add(0x1f000, 0x1f02b).add(0x1f030, 0x1f093).add(0x1f0a0, 0x1f0ae).add(0x1f0b1, 0x1f0bf).add(0x1f0c1, 0x1f0cf).add(0x1f0d1, 0x1f0f5).add(0x1f10d, 0x1f1ad).add(0x1f1e6, 0x1f202).add(0x1f210, 0x1f23b).add(0x1f240, 0x1f248).add(0x1f250, 0x1f251).add(0x1f260, 0x1f265).add(0x1f300, 0x1f3fa).add(0x1f400, 0x1f6d7).add(0x1f6dc, 0x1f6ec).add(0x1f6f0, 0x1f6fc).add(0x1f700, 0x1f776).add(0x1f77b, 0x1f7d9).add(0x1f7e0, 0x1f7eb).add(0x1f7f0).add(0x1f800, 0x1f80b).add(0x1f810, 0x1f847).add(0x1f850, 0x1f859).add(0x1f860, 0x1f887).add(0x1f890, 0x1f8ad).add(0x1f8b0, 0x1f8b1).add(0x1f900, 0x1fa53).add(0x1fa60, 0x1fa6d).add(0x1fa70, 0x1fa7c).add(0x1fa80, 0x1fa88).add(0x1fa90, 0x1fabd).add(0x1fabf, 0x1fac5).add(0x1face, 0x1fadb).add(0x1fae0, 0x1fae8).add(0x1faf0, 0x1faf8).add(0x1fb00, 0x1fb92).add(0x1fb94, 0x1fbca).build());
    codepointsByCode.put("Zl", builder().add(0x2028).build());
    codepointsByCode.put("Zp", builder().add(0x2029).build());
    codepointsByCode.put("Zs", builder().add(' ').add(0xa0).add(0x1680).add(0x2000, 0x200a).add(0x202f).add(0x205f).add(0x3000).build());

    // Category "Cn"
    Builder allOfTheAbove = builder();
    codepointsByCode.values().forEach(allOfTheAbove::add);
    codepointsByCode.put("Cn",
        builder().add(Character.MIN_CODE_POINT, MAX_VALID_CODEPOINT).build()
        .minus(allOfTheAbove.build()));

    // Categories with single letter names
    codepointsByCode.keySet().stream().map(name -> name.substring(0, 1)).distinct().forEach(name -> {
      Builder category = builder();
      codepointsByCode.entrySet().stream()
        .filter(e -> e.getKey().startsWith(name))
        .forEach(e -> category.add(e.getValue()));
      codepointsByCode.put(name, category.build());
    });

    // Category "LC"
    codepointsByCode.put("LC", builder()
        .add(codepointsByCode.get("Ll"))
        .add(codepointsByCode.get("Lt"))
        .add(codepointsByCode.get("Lu"))
        .build());
  }

}




© 2015 - 2025 Weber Informatics LLC | Privacy Policy