author | prr |
Tue, 09 Aug 2016 16:20:02 -0700 | |
changeset 40435 | 553eb1a50733 |
parent 40434 | 49d6193f196f |
child 40436 | 94ae0ede53a5 |
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.cc Tue Aug 09 16:20:02 2016 -0700 @@ -104,7 +104,6 @@ if (!length || length >= 1u << 31 || - data + length < data /* overflows */ || !(blob = hb_object_create<hb_blob_t> ())) { if (destroy) destroy (user_data);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-blob.h Tue Aug 09 16:20:02 2016 -0700 @@ -64,7 +64,7 @@ typedef struct hb_blob_t hb_blob_t; -hb_blob_t * +HB_EXTERN hb_blob_t * hb_blob_create (const char *data, unsigned int length, hb_memory_mode_t mode, @@ -77,21 +77,21 @@ * modify the parent data as that data may be * shared among multiple sub-blobs. */ -hb_blob_t * +HB_EXTERN hb_blob_t * hb_blob_create_sub_blob (hb_blob_t *parent, unsigned int offset, unsigned int length); -hb_blob_t * +HB_EXTERN hb_blob_t * hb_blob_get_empty (void); -hb_blob_t * +HB_EXTERN hb_blob_t * hb_blob_reference (hb_blob_t *blob); -void +HB_EXTERN void hb_blob_destroy (hb_blob_t *blob); -hb_bool_t +HB_EXTERN hb_bool_t hb_blob_set_user_data (hb_blob_t *blob, hb_user_data_key_t *key, void * data, @@ -99,25 +99,25 @@ hb_bool_t replace); -void * +HB_EXTERN void * hb_blob_get_user_data (hb_blob_t *blob, hb_user_data_key_t *key); -void +HB_EXTERN void hb_blob_make_immutable (hb_blob_t *blob); -hb_bool_t +HB_EXTERN hb_bool_t hb_blob_is_immutable (hb_blob_t *blob); -unsigned int +HB_EXTERN unsigned int hb_blob_get_length (hb_blob_t *blob); -const char * +HB_EXTERN const char * hb_blob_get_data (hb_blob_t *blob, unsigned int *length); -char * +HB_EXTERN char * hb_blob_get_data_writable (hb_blob_t *blob, unsigned int *length);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -35,9 +35,36 @@ #include "hb-unicode-private.hh" +#ifndef HB_BUFFER_MAX_EXPANSION_FACTOR +#define HB_BUFFER_MAX_EXPANSION_FACTOR 32 +#endif +#ifndef HB_BUFFER_MAX_LEN_MIN +#define HB_BUFFER_MAX_LEN_MIN 8192 +#endif +#ifndef HB_BUFFER_MAX_LEN_DEFAULT +#define HB_BUFFER_MAX_LEN_DEFAULT 0x3FFFFFFF /* Shaping more than a billion chars? Let us know! */ +#endif + ASSERT_STATIC (sizeof (hb_glyph_info_t) == 20); ASSERT_STATIC (sizeof (hb_glyph_info_t) == sizeof (hb_glyph_position_t)); +HB_MARK_AS_FLAG_T (hb_buffer_flags_t); +HB_MARK_AS_FLAG_T (hb_buffer_serialize_flags_t); + +enum hb_buffer_scratch_flags_t { + HB_BUFFER_SCRATCH_FLAG_DEFAULT = 0x00000000u, + HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII = 0x00000001u, + HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES = 0x00000002u, + HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK = 0x00000004u, + HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT = 0x00000008u, + /* Reserved for complex shapers' internal use. */ + HB_BUFFER_SCRATCH_FLAG_COMPLEX0 = 0x01000000u, + HB_BUFFER_SCRATCH_FLAG_COMPLEX1 = 0x02000000u, + HB_BUFFER_SCRATCH_FLAG_COMPLEX2 = 0x04000000u, + HB_BUFFER_SCRATCH_FLAG_COMPLEX3 = 0x08000000u, +}; +HB_MARK_AS_FLAG_T (hb_buffer_scratch_flags_t); + /* * hb_buffer_t @@ -52,6 +79,8 @@ hb_buffer_flags_t flags; /* BOT / EOT / etc. */ hb_buffer_cluster_level_t cluster_level; hb_codepoint_t replacement; /* U+FFFD or something else. */ + hb_buffer_scratch_flags_t scratch_flags; /* Have space-flallback, etc. */ + unsigned int max_len; /* Maximum allowed len. */ /* Buffer contents */ hb_buffer_content_type_t content_type; @@ -76,17 +105,13 @@ inline hb_glyph_position_t &cur_pos (unsigned int i = 0) { return pos[idx + i]; } inline hb_glyph_position_t cur_pos (unsigned int i = 0) const { return pos[idx + i]; } - inline hb_glyph_info_t &prev (void) { return out_info[out_len - 1]; } - inline hb_glyph_info_t prev (void) const { return info[out_len - 1]; } + inline hb_glyph_info_t &prev (void) { return out_info[out_len ? out_len - 1 : 0]; } + inline hb_glyph_info_t prev (void) const { return out_info[out_len ? out_len - 1 : 0]; } inline bool has_separate_output (void) const { return info != out_info; } unsigned int serial; - /* These reflect current allocations of the bytes in glyph_info_t's var1 and var2. */ - uint8_t allocated_var_bytes[8]; - const char *allocated_var_owner[8]; - /* Text before / after the main buffer contents. * Always in Unicode, and ordered outward. * Index 0 is for "pre-context", 1 for "post-context". */ @@ -94,6 +119,52 @@ hb_codepoint_t context[2][CONTEXT_LENGTH]; unsigned int context_len[2]; + /* Debugging API */ + hb_buffer_message_func_t message_func; + void *message_data; + hb_destroy_func_t message_destroy; + + /* Internal debugging. */ + /* The bits here reflect current allocations of the bytes in glyph_info_t's var1 and var2. */ +#ifndef HB_NDEBUG + uint8_t allocated_var_bits; +#endif + inline void allocate_var (unsigned int start, unsigned int count) + { +#ifndef HB_NDEBUG + unsigned int end = start + count; + assert (end <= 8); + unsigned int bits = (1<<end) - (1<<start); + assert (0 == (allocated_var_bits & bits)); + allocated_var_bits |= bits; +#endif + } + inline void deallocate_var (unsigned int start, unsigned int count) + { +#ifndef HB_NDEBUG + unsigned int end = start + count; + assert (end <= 8); + unsigned int bits = (1<<end) - (1<<start); + assert (bits == (allocated_var_bits & bits)); + allocated_var_bits &= ~bits; +#endif + } + inline void assert_var (unsigned int start, unsigned int count) + { +#ifndef HB_NDEBUG + unsigned int end = start + count; + assert (end <= 8); + unsigned int bits = (1<<end) - (1<<start); + assert (bits == (allocated_var_bits & bits)); +#endif + } + inline void deallocate_var_all (void) + { +#ifndef HB_NDEBUG + allocated_var_bits = 0; +#endif + } + /* Methods */ @@ -106,11 +177,6 @@ { return len - idx; } inline unsigned int next_serial (void) { return serial++; } - HB_INTERNAL void allocate_var (unsigned int byte_i, unsigned int count, const char *owner); - HB_INTERNAL void deallocate_var (unsigned int byte_i, unsigned int count, const char *owner); - HB_INTERNAL void assert_var (unsigned int byte_i, unsigned int count, const char *owner); - HB_INTERNAL void deallocate_var_all (void); - HB_INTERNAL void add (hb_codepoint_t codepoint, unsigned int cluster); HB_INTERNAL void add_info (const hb_glyph_info_t &glyph_info); @@ -203,18 +269,28 @@ inline void clear_context (unsigned int side) { context_len[side] = 0; } HB_INTERNAL void sort (unsigned int start, unsigned int end, int(*compar)(const hb_glyph_info_t *, const hb_glyph_info_t *)); + + inline bool messaging (void) { return unlikely (message_func); } + inline bool message (hb_font_t *font, const char *fmt, ...) HB_PRINTF_FUNC(3, 4) + { + if (!messaging ()) + return true; + va_list ap; + va_start (ap, fmt); + bool ret = message_impl (font, fmt, ap); + va_end (ap); + return ret; + } + HB_INTERNAL bool message_impl (hb_font_t *font, const char *fmt, va_list ap) HB_PRINTF_FUNC(3, 0); }; -#define HB_BUFFER_XALLOCATE_VAR(b, func, var, owner) \ +#define HB_BUFFER_XALLOCATE_VAR(b, func, var) \ b->func (offsetof (hb_glyph_info_t, var) - offsetof(hb_glyph_info_t, var1), \ - sizeof (b->info[0].var), owner) -#define HB_BUFFER_ALLOCATE_VAR(b, var) \ - HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var (), #var) -#define HB_BUFFER_DEALLOCATE_VAR(b, var) \ - HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var (), #var) -#define HB_BUFFER_ASSERT_VAR(b, var) \ - HB_BUFFER_XALLOCATE_VAR (b, assert_var, var (), #var) + sizeof (b->info[0].var)) +#define HB_BUFFER_ALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, allocate_var, var ()) +#define HB_BUFFER_DEALLOCATE_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, deallocate_var, var ()) +#define HB_BUFFER_ASSERT_VAR(b, var) HB_BUFFER_XALLOCATE_VAR (b, assert_var, var ()) #endif /* HB_BUFFER_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer-serialize.cc Tue Aug 09 16:20:02 2016 -0700 @@ -36,11 +36,12 @@ /** * hb_buffer_serialize_list_formats: * - * + * Returns a list of supported buffer serialization formats. * * Return value: (transfer none): + * A string array of buffer serialization formats. Should not be freed. * - * Since: 0.9.2 + * Since: 0.9.7 **/ const char ** hb_buffer_serialize_list_formats (void) @@ -50,14 +51,17 @@ /** * hb_buffer_serialize_format_from_string: - * @str: - * @len: + * @str: (array length=len) (element-type uint8_t): a string to parse + * @len: length of @str, or -1 if string is %NULL terminated * - * + * Parses a string into an #hb_buffer_serialize_format_t. Does not check if + * @str is a valid buffer serialization format, use + * hb_buffer_serialize_list_formats() to get the list of supported formats. * * Return value: + * The parsed #hb_buffer_serialize_format_t. * - * Since: 0.9.2 + * Since: 0.9.7 **/ hb_buffer_serialize_format_t hb_buffer_serialize_format_from_string (const char *str, int len) @@ -68,13 +72,15 @@ /** * hb_buffer_serialize_format_to_string: - * @format: + * @format: an #hb_buffer_serialize_format_t to convert. * - * + * Converts @format to the string corresponding it, or %NULL if it is not a valid + * #hb_buffer_serialize_format_t. * - * Return value: + * Return value: (transfer none): + * A %NULL terminated string corresponding to @format. Should not be freed. * - * Since: 0.9.2 + * Since: 0.9.7 **/ const char * hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format) @@ -242,24 +248,51 @@ return end - start; } -/* Returns number of items, starting at start, that were serialized. */ /** * hb_buffer_serialize_glyphs: - * @buffer: a buffer. - * @start: - * @end: - * @buf: (array length=buf_size): - * @buf_size: - * @buf_consumed: (out): - * @font: - * @format: - * @flags: + * @buffer: an #hb_buffer_t buffer. + * @start: the first item in @buffer to serialize. + * @end: the last item in @buffer to serialize. + * @buf: (out) (array length=buf_size) (element-type uint8_t): output string to + * write serialized buffer into. + * @buf_size: the size of @buf. + * @buf_consumed: (out) (allow-none): if not %NULL, will be set to the number of byes written into @buf. + * @font: (allow-none): the #hb_font_t used to shape this buffer, needed to + * read glyph names and extents. If %NULL, and empty font will be used. + * @format: the #hb_buffer_serialize_format_t to use for formatting the output. + * @flags: the #hb_buffer_serialize_flags_t that control what glyph properties + * to serialize. + * + * Serializes @buffer into a textual representation of its glyph content, + * useful for showing the contents of the buffer, for example during debugging. + * There are currently two supported serialization formats: * + * ## text + * A human-readable, plain text format. + * The serialized glyphs will look something like: * + * ``` + * [uni0651=0@518,0+0|uni0628=0+1897] + * ``` + * - The serialized glyphs are delimited with `[` and `]`. + * - Glyphs are separated with `|` + * - Each glyph starts with glyph name, or glyph index if + * #HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES flag is set. Then, + * - If #HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS is not set, `=` then #hb_glyph_info_t.cluster. + * - If #HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS is not set, the #hb_glyph_position_t in the format: + * - If both #hb_glyph_position_t.x_offset and #hb_glyph_position_t.y_offset are not 0, `@x_offset,y_offset`. Then, + * - `+x_advance`, then `,y_advance` if #hb_glyph_position_t.y_advance is not 0. Then, + * - If #HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS is set, the + * #hb_glyph_extents_t in the format + * `<x_bearing,y_bearing,width,height>` + * + * ## json + * TODO. * * Return value: + * The number of serialized items. * - * Since: 0.9.2 + * Since: 0.9.7 **/ unsigned int hb_buffer_serialize_glyphs (hb_buffer_t *buffer, @@ -267,8 +300,8 @@ unsigned int end, char *buf, unsigned int buf_size, - unsigned int *buf_consumed, /* May be NULL */ - hb_font_t *font, /* May be NULL */ + unsigned int *buf_consumed, + hb_font_t *font, hb_buffer_serialize_format_t format, hb_buffer_serialize_flags_t flags) { @@ -282,6 +315,9 @@ assert ((!buffer->len && buffer->content_type == HB_BUFFER_CONTENT_TYPE_INVALID) || buffer->content_type == HB_BUFFER_CONTENT_TYPE_GLYPHS); + if (!buffer->have_positions) + flags |= HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS; + if (unlikely (start == end)) return 0; @@ -355,7 +391,7 @@ /** * hb_buffer_deserialize_glyphs: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t buffer. * @buf: (array length=buf_len): * @buf_len: * @end_ptr: (out): @@ -366,7 +402,7 @@ * * Return value: * - * Since: 0.9.2 + * Since: 0.9.7 **/ hb_bool_t hb_buffer_deserialize_glyphs (hb_buffer_t *buffer,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.cc Tue Aug 09 16:20:02 2016 -0700 @@ -35,8 +35,26 @@ #define HB_DEBUG_BUFFER (HB_DEBUG+0) #endif +/** + * SECTION: hb-buffer + * @title: Buffers + * @short_description: Input and output buffers + * @include: hb.h + * + * Buffers serve dual role in HarfBuzz; they hold the input characters that are + * passed hb_shape(), and after shaping they hold the output glyphs. + **/ /** + * hb_segment_properties_equal: + * @a: first #hb_segment_properties_t to compare. + * @b: second #hb_segment_properties_t to compare. + * + * Checks the equality of two #hb_segment_properties_t's. + * + * Return value: + * %true if all properties of @a equal those of @b, false otherwise. + * * Since: 0.9.7 **/ hb_bool_t @@ -52,6 +70,14 @@ } /** + * hb_segment_properties_hash: + * @p: #hb_segment_properties_t to hash. + * + * Creates a hash representing @p. + * + * Return value: + * A hash of @p. + * * Since: 0.9.7 **/ unsigned int @@ -91,6 +117,11 @@ { if (unlikely (in_error)) return false; + if (unlikely (size > max_len)) + { + in_error = true; + return false; + } unsigned int new_allocated = allocated; hb_glyph_position_t *new_pos = NULL; @@ -152,6 +183,12 @@ if (unlikely (!ensure (len + count))) return false; memmove (info + idx + count, info + idx, (len - idx) * sizeof (info[0])); + if (idx + count > len) + { + /* Under memory failure we might expose this area. At least + * clean it up. Oh well... */ + memset (info + len, 0, (idx + count - len) * sizeof (info[0])); + } len += count; idx += count; @@ -198,6 +235,7 @@ hb_segment_properties_t default_props = HB_SEGMENT_PROPERTIES_DEFAULT; props = default_props; + scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT; content_type = HB_BUFFER_CONTENT_TYPE_INVALID; in_error = false; @@ -210,11 +248,11 @@ out_info = info; serial = 0; - memset (allocated_var_bytes, 0, sizeof allocated_var_bytes); - memset (allocated_var_owner, 0, sizeof allocated_var_owner); memset (context, 0, sizeof context); memset (context_len, 0, sizeof context_len); + + deallocate_var_all (); } void @@ -375,6 +413,8 @@ idx = i; return true; } + if (unlikely (in_error)) + return false; assert (i <= out_len + (len - idx)); @@ -392,6 +432,8 @@ /* Tricky part: rewinding... */ unsigned int count = out_len - i; + /* This will blow in our face if memory allocation fails later + * in this same lookup... */ if (unlikely (idx < count && !shift_forward (count + 32))) return false; assert (idx >= count); @@ -627,82 +669,19 @@ } -static inline void -dump_var_allocation (const hb_buffer_t *buffer) -{ - char buf[80]; - for (unsigned int i = 0; i < 8; i++) - buf[i] = '0' + buffer->allocated_var_bytes[7 - i]; - buf[8] = '\0'; - DEBUG_MSG (BUFFER, buffer, - "Current var allocation: %s", - buf); -} - -void hb_buffer_t::allocate_var (unsigned int byte_i, unsigned int count, const char *owner) -{ - assert (byte_i < 8 && byte_i + count <= 8); - - if (DEBUG_ENABLED (BUFFER)) - dump_var_allocation (this); - DEBUG_MSG (BUFFER, this, - "Allocating var bytes %d..%d for %s", - byte_i, byte_i + count - 1, owner); - - for (unsigned int i = byte_i; i < byte_i + count; i++) { - assert (!allocated_var_bytes[i]); - allocated_var_bytes[i]++; - allocated_var_owner[i] = owner; - } -} - -void hb_buffer_t::deallocate_var (unsigned int byte_i, unsigned int count, const char *owner) -{ - if (DEBUG_ENABLED (BUFFER)) - dump_var_allocation (this); - - DEBUG_MSG (BUFFER, this, - "Deallocating var bytes %d..%d for %s", - byte_i, byte_i + count - 1, owner); - - assert (byte_i < 8 && byte_i + count <= 8); - for (unsigned int i = byte_i; i < byte_i + count; i++) { - assert (allocated_var_bytes[i]); - assert (0 == strcmp (allocated_var_owner[i], owner)); - allocated_var_bytes[i]--; - } -} - -void hb_buffer_t::assert_var (unsigned int byte_i, unsigned int count, const char *owner) -{ - if (DEBUG_ENABLED (BUFFER)) - dump_var_allocation (this); - - DEBUG_MSG (BUFFER, this, - "Asserting var bytes %d..%d for %s", - byte_i, byte_i + count - 1, owner); - - assert (byte_i < 8 && byte_i + count <= 8); - for (unsigned int i = byte_i; i < byte_i + count; i++) { - assert (allocated_var_bytes[i]); - assert (0 == strcmp (allocated_var_owner[i], owner)); - } -} - -void hb_buffer_t::deallocate_var_all (void) -{ - memset (allocated_var_bytes, 0, sizeof (allocated_var_bytes)); - memset (allocated_var_owner, 0, sizeof (allocated_var_owner)); -} - /* Public API */ /** * hb_buffer_create: (Xconstructor) * - * + * Creates a new #hb_buffer_t with all properties to defaults. * - * Return value: (transfer full) + * Return value: (transfer full): + * A newly allocated #hb_buffer_t with a reference count of 1. The initial + * reference count should be released with hb_buffer_destroy() when you are done + * using the #hb_buffer_t. This function never returns %NULL. If memory cannot + * be allocated, a special #hb_buffer_t object will be returned on which + * hb_buffer_allocation_successful() returns %false. * * Since: 0.9.2 **/ @@ -714,6 +693,8 @@ if (!(buffer = hb_object_create<hb_buffer_t> ())) return hb_buffer_get_empty (); + buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT; + buffer->reset (); return buffer; @@ -738,6 +719,8 @@ HB_BUFFER_FLAG_DEFAULT, HB_BUFFER_CLUSTER_LEVEL_DEFAULT, HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT, + HB_BUFFER_SCRATCH_FLAG_DEFAULT, + HB_BUFFER_MAX_LEN_DEFAULT, HB_BUFFER_CONTENT_TYPE_INVALID, HB_SEGMENT_PROPERTIES_DEFAULT, @@ -753,11 +736,13 @@ /** * hb_buffer_reference: (skip) - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * Increases the reference count on @buffer by one. This prevents @buffer from + * being destroyed until a matching call to hb_buffer_destroy() is made. * * Return value: (transfer full): + * The referenced #hb_buffer_t. * * Since: 0.9.2 **/ @@ -769,9 +754,11 @@ /** * hb_buffer_destroy: (skip) - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * Deallocate the @buffer. + * Decreases the reference count on @buffer by one. If the result is zero, then + * @buffer and all associated resources are freed. See hb_buffer_reference(). * * Since: 0.9.2 **/ @@ -784,13 +771,15 @@ free (buffer->info); free (buffer->pos); + if (buffer->message_destroy) + buffer->message_destroy (buffer->message_data); free (buffer); } /** * hb_buffer_set_user_data: (skip) - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * @key: * @data: * @destroy: @@ -814,7 +803,7 @@ /** * hb_buffer_get_user_data: (skip) - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * @key: * * @@ -833,10 +822,11 @@ /** * hb_buffer_set_content_type: - * @buffer: a buffer. - * @content_type: + * @buffer: an #hb_buffer_t. + * @content_type: the type of buffer contents to set * - * + * Sets the type of @buffer contents, buffers are either empty, contain + * characters (before shaping) or glyphs (the result of shaping). * * Since: 0.9.5 **/ @@ -849,11 +839,12 @@ /** * hb_buffer_get_content_type: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * see hb_buffer_set_content_type(). * * Return value: + * The type of @buffer contents. * * Since: 0.9.5 **/ @@ -866,7 +857,7 @@ /** * hb_buffer_set_unicode_funcs: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * @unicode_funcs: * * @@ -891,7 +882,7 @@ /** * hb_buffer_get_unicode_funcs: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * * * @@ -907,10 +898,16 @@ /** * hb_buffer_set_direction: - * @buffer: a buffer. - * @direction: + * @buffer: an #hb_buffer_t. + * @direction: the #hb_direction_t of the @buffer * - * + * Set the text flow direction of the buffer. No shaping can happen without + * setting @buffer direction, and it controls the visual direction for the + * output glyphs; for RTL direction the glyphs will be reversed. Many layout + * features depend on the proper setting of the direction, for example, + * reversing RTL text before shaping, then shaping with LTR direction is not + * the same as keeping the text in logical order and shaping with RTL + * direction. * * Since: 0.9.2 **/ @@ -927,11 +924,12 @@ /** * hb_buffer_get_direction: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * See hb_buffer_set_direction() * * Return value: + * The direction of the @buffer. * * Since: 0.9.2 **/ @@ -943,10 +941,18 @@ /** * hb_buffer_set_script: - * @buffer: a buffer. - * @script: + * @buffer: an #hb_buffer_t. + * @script: an #hb_script_t to set. + * + * Sets the script of @buffer to @script. * + * Script is crucial for choosing the proper shaping behaviour for scripts that + * require it (e.g. Arabic) and the which OpenType features defined in the font + * to be applied. * + * You can pass one of the predefined #hb_script_t values, or use + * hb_script_from_string() or hb_script_from_iso15924_tag() to get the + * corresponding script from an ISOÂ 15924 script tag. * * Since: 0.9.2 **/ @@ -962,11 +968,12 @@ /** * hb_buffer_get_script: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * See hb_buffer_set_script(). * * Return value: + * The #hb_script_t of the @buffer. * * Since: 0.9.2 **/ @@ -978,10 +985,18 @@ /** * hb_buffer_set_language: - * @buffer: a buffer. - * @language: + * @buffer: an #hb_buffer_t. + * @language: an hb_language_t to set. + * + * Sets the language of @buffer to @language. * + * Languages are crucial for selecting which OpenType feature to apply to the + * buffer which can result in applying language-specific behaviour. Languages + * are orthogonal to the scripts, and though they are related, they are + * different concepts and should not be confused with each other. * + * Use hb_language_from_string() to convert from ISOÂ 639 language codes to + * #hb_language_t. * * Since: 0.9.2 **/ @@ -997,11 +1012,12 @@ /** * hb_buffer_get_language: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * See hb_buffer_set_language(). * * Return value: (transfer none): + * The #hb_language_t of the buffer. Must not be freed by the caller. * * Since: 0.9.2 **/ @@ -1013,10 +1029,12 @@ /** * hb_buffer_set_segment_properties: - * @buffer: a buffer. - * @props: + * @buffer: an #hb_buffer_t. + * @props: an #hb_segment_properties_t to use. * - * + * Sets the segment properties of the buffer, a shortcut for calling + * hb_buffer_set_direction(), hb_buffer_set_script() and + * hb_buffer_set_language() individually. * * Since: 0.9.7 **/ @@ -1032,10 +1050,10 @@ /** * hb_buffer_get_segment_properties: - * @buffer: a buffer. - * @props: (out): + * @buffer: an #hb_buffer_t. + * @props: (out): the output #hb_segment_properties_t. * - * + * Sets @props to the #hb_segment_properties_t of @buffer. * * Since: 0.9.7 **/ @@ -1049,10 +1067,10 @@ /** * hb_buffer_set_flags: - * @buffer: a buffer. - * @flags: + * @buffer: an #hb_buffer_t. + * @flags: the buffer flags to set. * - * + * Sets @buffer flags to @flags. See #hb_buffer_flags_t. * * Since: 0.9.7 **/ @@ -1068,11 +1086,12 @@ /** * hb_buffer_get_flags: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * See hb_buffer_set_flags(). * * Return value: + * The @buffer flags. * * Since: 0.9.7 **/ @@ -1084,7 +1103,7 @@ /** * hb_buffer_set_cluster_level: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * @cluster_level: * * @@ -1103,7 +1122,7 @@ /** * hb_buffer_get_cluster_level: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * * * @@ -1120,10 +1139,13 @@ /** * hb_buffer_set_replacement_codepoint: - * @buffer: a buffer. - * @replacement: + * @buffer: an #hb_buffer_t. + * @replacement: the replacement #hb_codepoint_t * + * Sets the #hb_codepoint_t that replaces invalid entries for a given encoding + * when adding text to @buffer. * + * Default is %HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT. * * Since: 0.9.31 **/ @@ -1139,11 +1161,12 @@ /** * hb_buffer_get_replacement_codepoint: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * See hb_buffer_set_replacement_codepoint(). * * Return value: + * The @buffer replacement #hb_codepoint_t. * * Since: 0.9.31 **/ @@ -1156,9 +1179,10 @@ /** * hb_buffer_reset: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * Resets the buffer to its initial status, as if it was just newly created + * with hb_buffer_create(). * * Since: 0.9.2 **/ @@ -1170,9 +1194,10 @@ /** * hb_buffer_clear_contents: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * Similar to hb_buffer_reset(), but does not clear the Unicode functions and + * the replacement code point. * * Since: 0.9.11 **/ @@ -1184,12 +1209,13 @@ /** * hb_buffer_pre_allocate: - * @buffer: a buffer. - * @size: + * @buffer: an #hb_buffer_t. + * @size: number of items to pre allocate. * - * + * Pre allocates memory for @buffer to fit at least @size number of items. * * Return value: + * %true if @buffer memory allocation succeeded, %false otherwise. * * Since: 0.9.2 **/ @@ -1201,11 +1227,12 @@ /** * hb_buffer_allocation_successful: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * - * + * Check if allocating memory for the buffer succeeded. * * Return value: + * %true if @buffer memory allocation succeeded, %false otherwise. * * Since: 0.9.2 **/ @@ -1217,11 +1244,18 @@ /** * hb_buffer_add: - * @buffer: a buffer. - * @codepoint: - * @cluster: + * @buffer: an #hb_buffer_t. + * @codepoint: a Unicode code point. + * @cluster: the cluster value of @codepoint. * + * Appends a character with the Unicode value of @codepoint to @buffer, and + * gives it the initial cluster value of @cluster. Clusters can be any thing + * the client wants, they are usually used to refer to the index of the + * character in the input text stream and are output in + * #hb_glyph_info_t.cluster field. * + * This function does not check the validity of @codepoint, it is up to the + * caller to ensure it is a valid Unicode code point. * * Since: 0.9.7 **/ @@ -1236,12 +1270,14 @@ /** * hb_buffer_set_length: - * @buffer: a buffer. - * @length: + * @buffer: an #hb_buffer_t. + * @length: the new length of @buffer. * - * + * Similar to hb_buffer_pre_allocate(), but clears any new items added at the + * end. * * Return value: + * %true if @buffer memory allocation succeeded, %false otherwise. * * Since: 0.9.2 **/ @@ -1276,11 +1312,13 @@ /** * hb_buffer_get_length: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * * Returns the number of items in the buffer. * - * Return value: buffer length. + * Return value: + * The @buffer length. + * The value valid as long as buffer has not been modified. * * Since: 0.9.2 **/ @@ -1292,13 +1330,15 @@ /** * hb_buffer_get_glyph_infos: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * @length: (out): output array length. * - * Returns buffer glyph information array. Returned pointer - * is valid as long as buffer contents are not modified. + * Returns @buffer glyph information array. Returned pointer + * is valid as long as @buffer contents are not modified. * - * Return value: (transfer none) (array length=length): buffer glyph information array. + * Return value: (transfer none) (array length=length): + * The @buffer glyph information array. + * The value valid as long as buffer has not been modified. * * Since: 0.9.2 **/ @@ -1314,13 +1354,15 @@ /** * hb_buffer_get_glyph_positions: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * @length: (out): output length. * - * Returns buffer glyph position array. Returned pointer - * is valid as long as buffer contents are not modified. + * Returns @buffer glyph position array. Returned pointer + * is valid as long as @buffer contents are not modified. * - * Return value: (transfer none) (array length=length): buffer glyph position array. + * Return value: (transfer none) (array length=length): + * The @buffer glyph position array. + * The value valid as long as buffer has not been modified. * * Since: 0.9.2 **/ @@ -1339,7 +1381,7 @@ /** * hb_buffer_reverse: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * * Reverses buffer contents. * @@ -1353,7 +1395,7 @@ /** * hb_buffer_reverse_range: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * @start: start index. * @end: end index. * @@ -1370,7 +1412,7 @@ /** * hb_buffer_reverse_clusters: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * * Reverses buffer clusters. That is, the buffer contents are * reversed, then each cluster (consecutive items having the @@ -1386,7 +1428,7 @@ /** * hb_buffer_guess_segment_properties: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * * Sets unset buffer segment properties based on buffer Unicode * contents. If buffer is not empty, it must have content type @@ -1485,13 +1527,18 @@ /** * hb_buffer_add_utf8: - * @buffer: a buffer. - * @text: (array length=text_length) (element-type uint8_t): - * @text_length: - * @item_offset: - * @item_length: + * @buffer: an #hb_buffer_t. + * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8 + * characters to append. + * @text_length: the length of the @text, or -1 if it is %NULL terminated. + * @item_offset: the offset of the first character to add to the @buffer. + * @item_length: the number of characters to add to the @buffer, or -1 for the + * end of @text (assuming it is %NULL terminated). * + * See hb_buffer_add_codepoints(). * + * Replaces invalid UTF-8 characters with the @buffer replacement code point, + * see hb_buffer_set_replacement_codepoint(). * * Since: 0.9.2 **/ @@ -1507,13 +1554,17 @@ /** * hb_buffer_add_utf16: - * @buffer: a buffer. - * @text: (array length=text_length): - * @text_length: - * @item_offset: - * @item_length: + * @buffer: an #hb_buffer_t. + * @text: (array length=text_length): an array of UTF-16 characters to append. + * @text_length: the length of the @text, or -1 if it is %NULL terminated. + * @item_offset: the offset of the first character to add to the @buffer. + * @item_length: the number of characters to add to the @buffer, or -1 for the + * end of @text (assuming it is %NULL terminated). * + * See hb_buffer_add_codepoints(). * + * Replaces invalid UTF-16 characters with the @buffer replacement code point, + * see hb_buffer_set_replacement_codepoint(). * * Since: 0.9.2 **/ @@ -1529,13 +1580,17 @@ /** * hb_buffer_add_utf32: - * @buffer: a buffer. - * @text: (array length=text_length): - * @text_length: - * @item_offset: - * @item_length: + * @buffer: an #hb_buffer_t. + * @text: (array length=text_length): an array of UTF-32 characters to append. + * @text_length: the length of the @text, or -1 if it is %NULL terminated. + * @item_offset: the offset of the first character to add to the @buffer. + * @item_length: the number of characters to add to the @buffer, or -1 for the + * end of @text (assuming it is %NULL terminated). * + * See hb_buffer_add_codepoints(). * + * Replaces invalid UTF-32 characters with the @buffer replacement code point, + * see hb_buffer_set_replacement_codepoint(). * * Since: 0.9.2 **/ @@ -1551,13 +1606,18 @@ /** * hb_buffer_add_latin1: - * @buffer: a buffer. - * @text: (array length=text_length) (element-type uint8_t): - * @text_length: - * @item_offset: - * @item_length: + * @buffer: an #hb_buffer_t. + * @text: (array length=text_length) (element-type uint8_t): an array of UTF-8 + * characters to append. + * @text_length: the length of the @text, or -1 if it is %NULL terminated. + * @item_offset: the offset of the first character to add to the @buffer. + * @item_length: the number of characters to add to the @buffer, or -1 for the + * end of @text (assuming it is %NULL terminated). * + * Similar to hb_buffer_add_codepoints(), but allows only access to first 256 + * Unicode code points that can fit in 8-bit strings. * + * <note>Has nothing to do with non-Unicode Latin-1 encoding.</note> * * Since: 0.9.39 **/ @@ -1573,13 +1633,25 @@ /** * hb_buffer_add_codepoints: - * @buffer: a buffer. - * @text: (array length=text_length): - * @text_length: - * @item_offset: - * @item_length: + * @buffer: a #hb_buffer_t to append characters to. + * @text: (array length=text_length): an array of Unicode code points to append. + * @text_length: the length of the @text, or -1 if it is %NULL terminated. + * @item_offset: the offset of the first code point to add to the @buffer. + * @item_length: the number of code points to add to the @buffer, or -1 for the + * end of @text (assuming it is %NULL terminated). * + * Appends characters from @text array to @buffer. The @item_offset is the + * position of the first character from @text that will be appended, and + * @item_length is the number of character. When shaping part of a larger text + * (e.g. a run of text from a paragraph), instead of passing just the substring + * corresponding to the run, it is preferable to pass the whole + * paragraph and specify the run start and length as @item_offset and + * @item_length, respectively, to give HarfBuzz the full context to be able, + * for example, to do cross-run Arabic shaping or properly handle combining + * marks at stat of run. * + * This function does not check the validity of @text, it is up to the caller + * to ensure it contains a valid Unicode code points. * * Since: 0.9.31 **/ @@ -1651,9 +1723,12 @@ /** * hb_buffer_normalize_glyphs: - * @buffer: a buffer. + * @buffer: an #hb_buffer_t. * + * Reorders a glyph buffer to have canonical in-cluster glyph order / position. + * The resulting clusters should behave identical to pre-reordering clusters. * + * <note>This has nothing to do with Unicode normalization.</note> * * Since: 0.9.2 **/ @@ -1699,3 +1774,45 @@ } } } + +/* + * Debugging. + */ + +/** + * hb_buffer_set_message_func: + * @buffer: an #hb_buffer_t. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 1.1.3 + **/ +void +hb_buffer_set_message_func (hb_buffer_t *buffer, + hb_buffer_message_func_t func, + void *user_data, hb_destroy_func_t destroy) +{ + if (buffer->message_destroy) + buffer->message_destroy (buffer->message_data); + + if (func) { + buffer->message_func = func; + buffer->message_data = user_data; + buffer->message_destroy = destroy; + } else { + buffer->message_func = NULL; + buffer->message_data = NULL; + buffer->message_destroy = NULL; + } +} + +bool +hb_buffer_t::message_impl (hb_font_t *font, const char *fmt, va_list ap) +{ + char buf[100]; + vsnprintf (buf, sizeof (buf), fmt, ap); + return (bool) this->message_func (this, font, buf, this->message_data); +}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-buffer.h Tue Aug 09 16:20:02 2016 -0700 @@ -40,7 +40,27 @@ HB_BEGIN_DECLS - +/** + * hb_glyph_info_t: + * @codepoint: either a Unicode code point (before shaping) or a glyph index + * (after shaping). + * @mask: + * @cluster: the index of the character in the original text that corresponds + * to this #hb_glyph_info_t, or whatever the client passes to + * hb_buffer_add(). More than one #hb_glyph_info_t can have the same + * @cluster value, if they resulted from the same character (e.g. one + * to many glyph substitution), and when more than one character gets + * merged in the same glyph (e.g. many to one glyph substitution) the + * #hb_glyph_info_t will have the smallest cluster value of them. + * By default some characters are merged into the same cluster + * (e.g. combining marks have the same cluster as their bases) + * even if they are separate glyphs, hb_buffer_set_cluster_level() + * allow selecting more fine-grained cluster handling. + * + * The #hb_glyph_info_t is the structure that holds information about the + * glyphs and their relation to input text. + * + */ typedef struct hb_glyph_info_t { hb_codepoint_t codepoint; hb_mask_t mask; @@ -51,6 +71,22 @@ hb_var_int_t var2; } hb_glyph_info_t; +/** + * hb_glyph_position_t: + * @x_advance: how much the line advances after drawing this glyph when setting + * text in horizontal direction. + * @y_advance: how much the line advances after drawing this glyph when setting + * text in vertical direction. + * @x_offset: how much the glyph moves on the X-axis before drawing it, this + * should not affect how much the line advances. + * @y_offset: how much the glyph moves on the Y-axis before drawing it, this + * should not affect how much the line advances. + * + * The #hb_glyph_position_t is the structure that holds the positions of the + * glyph in both horizontal and vertical directions. All positions in + * #hb_glyph_position_t are relative to the current point. + * + */ typedef struct hb_glyph_position_t { hb_position_t x_advance; hb_position_t y_advance; @@ -61,7 +97,16 @@ hb_var_int_t var; } hb_glyph_position_t; - +/** + * hb_segment_properties_t: + * @direction: the #hb_direction_t of the buffer, see hb_buffer_set_direction(). + * @script: the #hb_script_t of the buffer, see hb_buffer_set_script(). + * @language: the #hb_language_t of the buffer, see hb_buffer_set_language(). + * + * The structure that holds various text properties of an #hb_buffer_t. Can be + * set and retrieved using hb_buffer_set_segment_properties() and + * hb_buffer_get_segment_properties(), respectively. + */ typedef struct hb_segment_properties_t { hb_direction_t direction; hb_script_t script; @@ -77,101 +122,125 @@ NULL, \ NULL} -hb_bool_t +HB_EXTERN hb_bool_t hb_segment_properties_equal (const hb_segment_properties_t *a, const hb_segment_properties_t *b); -unsigned int +HB_EXTERN unsigned int hb_segment_properties_hash (const hb_segment_properties_t *p); -/* - * hb_buffer_t +/** + * hb_buffer_t: + * + * The main structure holding the input text and its properties before shaping, + * and output glyphs and their information after shaping. */ typedef struct hb_buffer_t hb_buffer_t; -hb_buffer_t * +HB_EXTERN hb_buffer_t * hb_buffer_create (void); -hb_buffer_t * +HB_EXTERN hb_buffer_t * hb_buffer_get_empty (void); -hb_buffer_t * +HB_EXTERN hb_buffer_t * hb_buffer_reference (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_destroy (hb_buffer_t *buffer); -hb_bool_t +HB_EXTERN hb_bool_t hb_buffer_set_user_data (hb_buffer_t *buffer, hb_user_data_key_t *key, void * data, hb_destroy_func_t destroy, hb_bool_t replace); -void * +HB_EXTERN void * hb_buffer_get_user_data (hb_buffer_t *buffer, hb_user_data_key_t *key); - +/** + * hb_buffer_content_type_t: + * @HB_BUFFER_CONTENT_TYPE_INVALID: Initial value for new buffer. + * @HB_BUFFER_CONTENT_TYPE_UNICODE: The buffer contains input characters (before shaping). + * @HB_BUFFER_CONTENT_TYPE_GLYPHS: The buffer contains output glyphs (after shaping). + */ typedef enum { HB_BUFFER_CONTENT_TYPE_INVALID = 0, HB_BUFFER_CONTENT_TYPE_UNICODE, HB_BUFFER_CONTENT_TYPE_GLYPHS } hb_buffer_content_type_t; -void +HB_EXTERN void hb_buffer_set_content_type (hb_buffer_t *buffer, hb_buffer_content_type_t content_type); -hb_buffer_content_type_t +HB_EXTERN hb_buffer_content_type_t hb_buffer_get_content_type (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_set_unicode_funcs (hb_buffer_t *buffer, hb_unicode_funcs_t *unicode_funcs); -hb_unicode_funcs_t * +HB_EXTERN hb_unicode_funcs_t * hb_buffer_get_unicode_funcs (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_set_direction (hb_buffer_t *buffer, hb_direction_t direction); -hb_direction_t +HB_EXTERN hb_direction_t hb_buffer_get_direction (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_set_script (hb_buffer_t *buffer, hb_script_t script); -hb_script_t +HB_EXTERN hb_script_t hb_buffer_get_script (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_set_language (hb_buffer_t *buffer, hb_language_t language); -hb_language_t +HB_EXTERN hb_language_t hb_buffer_get_language (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_set_segment_properties (hb_buffer_t *buffer, const hb_segment_properties_t *props); -void +HB_EXTERN void hb_buffer_get_segment_properties (hb_buffer_t *buffer, hb_segment_properties_t *props); -void +HB_EXTERN void hb_buffer_guess_segment_properties (hb_buffer_t *buffer); -/* +/** + * hb_buffer_flags_t: + * @HB_BUFFER_FLAG_DEFAULT: the default buffer flag. + * @HB_BUFFER_FLAG_BOT: flag indicating that special handling of the beginning + * of text paragraph can be applied to this buffer. Should usually + * be set, unless you are passing to the buffer only part + * of the text without the full context. + * @HB_BUFFER_FLAG_EOT: flag indicating that special handling of the end of text + * paragraph can be applied to this buffer, similar to + * @HB_BUFFER_FLAG_EOT. + * @HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES: + * flag indication that character with Default_Ignorable + * Unicode property should use the corresponding glyph + * from the font, instead of hiding them (currently done + * by replacing them with the space glyph and zeroing the + * advance width.) + * * Since: 0.9.20 */ typedef enum { /*< flags >*/ @@ -181,11 +250,11 @@ HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES = 0x00000004u } hb_buffer_flags_t; -void +HB_EXTERN void hb_buffer_set_flags (hb_buffer_t *buffer, hb_buffer_flags_t flags); -hb_buffer_flags_t +HB_EXTERN hb_buffer_flags_t hb_buffer_get_flags (hb_buffer_t *buffer); /* @@ -198,93 +267,92 @@ HB_BUFFER_CLUSTER_LEVEL_DEFAULT = HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES } hb_buffer_cluster_level_t; -void +HB_EXTERN void hb_buffer_set_cluster_level (hb_buffer_t *buffer, hb_buffer_cluster_level_t cluster_level); -hb_buffer_cluster_level_t +HB_EXTERN hb_buffer_cluster_level_t hb_buffer_get_cluster_level (hb_buffer_t *buffer); +/** + * HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT: + * + * The default code point for replacing invalid characters in a given encoding. + * Set to U+FFFD REPLACEMENT CHARACTER. + * + * Since: 0.9.31 + */ #define HB_BUFFER_REPLACEMENT_CODEPOINT_DEFAULT 0xFFFDu -/* Sets codepoint used to replace invalid UTF-8/16/32 entries. - * Default is 0xFFFDu. */ -void +HB_EXTERN void hb_buffer_set_replacement_codepoint (hb_buffer_t *buffer, hb_codepoint_t replacement); -hb_codepoint_t +HB_EXTERN hb_codepoint_t hb_buffer_get_replacement_codepoint (hb_buffer_t *buffer); -/* Resets the buffer. Afterwards it's as if it was just created, - * except that it has a larger buffer allocated perhaps... */ -void +HB_EXTERN void hb_buffer_reset (hb_buffer_t *buffer); -/* Like reset, but does NOT clear unicode_funcs and replacement_codepoint. */ -void +HB_EXTERN void hb_buffer_clear_contents (hb_buffer_t *buffer); -/* Returns false if allocation failed */ -hb_bool_t +HB_EXTERN hb_bool_t hb_buffer_pre_allocate (hb_buffer_t *buffer, unsigned int size); -/* Returns false if allocation has failed before */ -hb_bool_t +HB_EXTERN hb_bool_t hb_buffer_allocation_successful (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_reverse (hb_buffer_t *buffer); -void +HB_EXTERN void hb_buffer_reverse_range (hb_buffer_t *buffer, unsigned int start, unsigned int end); -void +HB_EXTERN void hb_buffer_reverse_clusters (hb_buffer_t *buffer); /* Filling the buffer in */ -void +HB_EXTERN void hb_buffer_add (hb_buffer_t *buffer, hb_codepoint_t codepoint, unsigned int cluster); -void +HB_EXTERN void hb_buffer_add_utf8 (hb_buffer_t *buffer, const char *text, int text_length, unsigned int item_offset, int item_length); -void +HB_EXTERN void hb_buffer_add_utf16 (hb_buffer_t *buffer, const uint16_t *text, int text_length, unsigned int item_offset, int item_length); -void +HB_EXTERN void hb_buffer_add_utf32 (hb_buffer_t *buffer, const uint32_t *text, int text_length, unsigned int item_offset, int item_length); -/* Allows only access to first 256 Unicode codepoints. */ -void +HB_EXTERN void hb_buffer_add_latin1 (hb_buffer_t *buffer, const uint8_t *text, int text_length, unsigned int item_offset, int item_length); -/* Like add_utf32 but does NOT check for invalid Unicode codepoints. */ -void +HB_EXTERN void hb_buffer_add_codepoints (hb_buffer_t *buffer, const hb_codepoint_t *text, int text_length, @@ -292,32 +360,25 @@ int item_length); -/* Clears any new items added at the end */ -hb_bool_t +HB_EXTERN hb_bool_t hb_buffer_set_length (hb_buffer_t *buffer, unsigned int length); -/* Return value valid as long as buffer not modified */ -unsigned int +HB_EXTERN unsigned int hb_buffer_get_length (hb_buffer_t *buffer); /* Getting glyphs out of the buffer */ -/* Return value valid as long as buffer not modified */ -hb_glyph_info_t * +HB_EXTERN hb_glyph_info_t * hb_buffer_get_glyph_infos (hb_buffer_t *buffer, unsigned int *length); -/* Return value valid as long as buffer not modified */ -hb_glyph_position_t * +HB_EXTERN hb_glyph_position_t * hb_buffer_get_glyph_positions (hb_buffer_t *buffer, unsigned int *length); -/* Reorders a glyph buffer to have canonical in-cluster glyph order / position. - * The resulting clusters should behave identical to pre-reordering clusters. - * NOTE: This has nothing to do with Unicode normalization. */ -void +HB_EXTERN void hb_buffer_normalize_glyphs (hb_buffer_t *buffer); @@ -325,7 +386,16 @@ * Serialize */ -/* +/** + * hb_buffer_serialize_flags_t: + * @HB_BUFFER_SERIALIZE_FLAG_DEFAULT: serialize glyph names, clusters and positions. + * @HB_BUFFER_SERIALIZE_FLAG_NO_CLUSTERS: do not serialize glyph cluster. + * @HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS: do not serialize glyph position information. + * @HB_BUFFER_SERIALIZE_FLAG_NO_GLYPH_NAMES: do no serialize glyph name. + * @HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS: serialize glyph extents. + * + * Flags that control what glyph information are serialized in hb_buffer_serialize_glyphs(). + * * Since: 0.9.20 */ typedef enum { /*< flags >*/ @@ -336,43 +406,67 @@ HB_BUFFER_SERIALIZE_FLAG_GLYPH_EXTENTS = 0x00000008u } hb_buffer_serialize_flags_t; +/** + * hb_buffer_serialize_format_t: + * @HB_BUFFER_SERIALIZE_FORMAT_TEXT: a human-readable, plain text format. + * @HB_BUFFER_SERIALIZE_FORMAT_JSON: a machine-readable JSON format. + * @HB_BUFFER_SERIALIZE_FORMAT_INVALID: invalid format. + * + * The buffer serialization and de-serialization format used in + * hb_buffer_serialize_glyphs() and hb_buffer_deserialize_glyphs(). + * + * Since: 0.9.2 + */ typedef enum { HB_BUFFER_SERIALIZE_FORMAT_TEXT = HB_TAG('T','E','X','T'), HB_BUFFER_SERIALIZE_FORMAT_JSON = HB_TAG('J','S','O','N'), HB_BUFFER_SERIALIZE_FORMAT_INVALID = HB_TAG_NONE } hb_buffer_serialize_format_t; -/* len=-1 means str is NUL-terminated. */ -hb_buffer_serialize_format_t +HB_EXTERN hb_buffer_serialize_format_t hb_buffer_serialize_format_from_string (const char *str, int len); -const char * +HB_EXTERN const char * hb_buffer_serialize_format_to_string (hb_buffer_serialize_format_t format); -const char ** +HB_EXTERN const char ** hb_buffer_serialize_list_formats (void); -/* Returns number of items, starting at start, that were serialized. */ -unsigned int +HB_EXTERN unsigned int hb_buffer_serialize_glyphs (hb_buffer_t *buffer, unsigned int start, unsigned int end, char *buf, unsigned int buf_size, - unsigned int *buf_consumed, /* May be NULL */ - hb_font_t *font, /* May be NULL */ + unsigned int *buf_consumed, + hb_font_t *font, hb_buffer_serialize_format_t format, hb_buffer_serialize_flags_t flags); -hb_bool_t +HB_EXTERN hb_bool_t hb_buffer_deserialize_glyphs (hb_buffer_t *buffer, const char *buf, - int buf_len, /* -1 means nul-terminated */ - const char **end_ptr, /* May be NULL */ - hb_font_t *font, /* May be NULL */ + int buf_len, + const char **end_ptr, + hb_font_t *font, hb_buffer_serialize_format_t format); +/* + * Debugging. + */ + +typedef hb_bool_t (*hb_buffer_message_func_t) (hb_buffer_t *buffer, + hb_font_t *font, + const char *message, + void *user_data); + +HB_EXTERN void +hb_buffer_set_message_func (hb_buffer_t *buffer, + hb_buffer_message_func_t func, + void *user_data, hb_destroy_func_t destroy); + + HB_END_DECLS #endif /* HB_BUFFER_H */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.cc Tue Aug 09 16:20:02 2016 -0700 @@ -88,7 +88,7 @@ /** * hb_tag_to_string: * @tag: - * @buf: (array fixed-size=4): + * @buf: (out caller-allocates) (array fixed-size=4) (element-type uint8_t): * * * @@ -281,12 +281,15 @@ /** * hb_language_from_string: - * @str: (array length=len) (element-type uint8_t): - * @len: + * @str: (array length=len) (element-type uint8_t): a string representing + * ISOÂ 639 language code + * @len: length of the @str, or -1 if it is %NULL-terminated. * - * + * Converts @str representing an ISOÂ 639 language code to the corresponding + * #hb_language_t. * * Return value: (transfer none): + * The #hb_language_t corresponding to the ISOÂ 639 language code. * * Since: 0.9.2 **/ @@ -314,11 +317,13 @@ /** * hb_language_to_string: - * @language: + * @language: an #hb_language_t to convert. * - * + * See hb_language_from_string(). * * Return value: (transfer none): + * A %NULL-terminated string representing the @language. Must not be freed by + * the caller. * * Since: 0.9.2 **/ @@ -357,11 +362,12 @@ /** * hb_script_from_iso15924_tag: - * @tag: + * @tag: an #hb_tag_t representing an ISOÂ 15924 tag. * - * + * Converts an ISOÂ 15924 script tag to a corresponding #hb_script_t. * * Return value: + * An #hb_script_t corresponding to the ISOÂ 15924 tag. * * Since: 0.9.2 **/ @@ -401,28 +407,33 @@ /** * hb_script_from_string: - * @s: (array length=len) (element-type uint8_t): - * @len: + * @str: (array length=len) (element-type uint8_t): a string representing an + * ISOÂ 15924 tag. + * @len: length of the @str, or -1 if it is %NULL-terminated. * - * + * Converts a string @str representing an ISOÂ 15924 script tag to a + * corresponding #hb_script_t. Shorthand for hb_tag_from_string() then + * hb_script_from_iso15924_tag(). * * Return value: + * An #hb_script_t corresponding to the ISOÂ 15924 tag. * * Since: 0.9.2 **/ hb_script_t -hb_script_from_string (const char *s, int len) +hb_script_from_string (const char *str, int len) { - return hb_script_from_iso15924_tag (hb_tag_from_string (s, len)); + return hb_script_from_iso15924_tag (hb_tag_from_string (str, len)); } /** * hb_script_to_iso15924_tag: - * @script: + * @script: an #hb_script_ to convert. * - * + * See hb_script_from_iso15924_tag(). * * Return value: + * An #hb_tag_t representing an ISOÂ 15924 script tag. * * Since: 0.9.2 **/ @@ -496,6 +507,9 @@ /* Unicode-8.0 additions */ case HB_SCRIPT_OLD_HUNGARIAN: + /* Unicode-9.0 additions */ + case HB_SCRIPT_ADLAM: + return HB_DIRECTION_RTL; } @@ -521,7 +535,7 @@ } } hb_user_data_item_t item = {key, data, destroy}; - bool ret = !!items.replace_or_insert (item, lock, replace); + bool ret = !!items.replace_or_insert (item, lock, (bool) replace); return ret; } @@ -529,7 +543,7 @@ void * hb_user_data_array_t::get (hb_user_data_key_t *key) { - hb_user_data_item_t item = {NULL }; + hb_user_data_item_t item = {NULL, NULL, NULL}; return items.find (key, &item, lock) ? item.data : NULL; }
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-common.h Tue Aug 09 16:20:02 2016 -0700 @@ -98,16 +98,22 @@ #define HB_TAG_MAX_SIGNED HB_TAG(0x7f,0xff,0xff,0xff) /* len=-1 means str is NUL-terminated. */ -hb_tag_t +HB_EXTERN hb_tag_t hb_tag_from_string (const char *str, int len); /* buf should have 4 bytes. */ -void +HB_EXTERN void hb_tag_to_string (hb_tag_t tag, char *buf); -/* hb_direction_t */ - +/** + * hb_direction_t: + * @HB_DIRECTION_INVALID: Initial, unset direction. + * @HB_DIRECTION_LTR: Text is set horizontally from left to right. + * @HB_DIRECTION_RTL: Text is set horizontally from right to left. + * @HB_DIRECTION_TTB: Text is set vertically from top to bottom. + * @HB_DIRECTION_BTT: Text is set vertically from bottom to top. + */ typedef enum { HB_DIRECTION_INVALID = 0, HB_DIRECTION_LTR = 4, @@ -117,10 +123,10 @@ } hb_direction_t; /* len=-1 means str is NUL-terminated */ -hb_direction_t +HB_EXTERN hb_direction_t hb_direction_from_string (const char *str, int len); -const char * +HB_EXTERN const char * hb_direction_to_string (hb_direction_t direction); #define HB_DIRECTION_IS_VALID(dir) ((((unsigned int) (dir)) & ~3U) == 4) @@ -136,16 +142,15 @@ typedef const struct hb_language_impl_t *hb_language_t; -/* len=-1 means str is NUL-terminated */ -hb_language_t +HB_EXTERN hb_language_t hb_language_from_string (const char *str, int len); -const char * +HB_EXTERN const char * hb_language_to_string (hb_language_t language); #define HB_LANGUAGE_INVALID ((hb_language_t) NULL) -hb_language_t +HB_EXTERN hb_language_t hb_language_get_default (void); @@ -306,6 +311,16 @@ /*8.0*/ HB_SCRIPT_OLD_HUNGARIAN = HB_TAG ('H','u','n','g'), /*8.0*/ HB_SCRIPT_SIGNWRITING = HB_TAG ('S','g','n','w'), + /* + * Since 1.3.0 + */ + /*9.0*/ HB_SCRIPT_ADLAM = HB_TAG ('A','d','l','m'), + /*9.0*/ HB_SCRIPT_BHAIKSUKI = HB_TAG ('B','h','k','s'), + /*9.0*/ HB_SCRIPT_MARCHEN = HB_TAG ('M','a','r','c'), + /*9.0*/ HB_SCRIPT_OSAGE = HB_TAG ('O','s','g','e'), + /*9.0*/ HB_SCRIPT_TANGUT = HB_TAG ('T','a','n','g'), + /*9.0*/ HB_SCRIPT_NEWA = HB_TAG ('N','e','w','a'), + /* No script set. */ HB_SCRIPT_INVALID = HB_TAG_NONE, @@ -324,18 +339,16 @@ /* Script functions */ -hb_script_t +HB_EXTERN hb_script_t hb_script_from_iso15924_tag (hb_tag_t tag); -/* sugar for tag_from_string() then script_from_iso15924_tag */ -/* len=-1 means s is NUL-terminated */ -hb_script_t -hb_script_from_string (const char *s, int len); +HB_EXTERN hb_script_t +hb_script_from_string (const char *str, int len); -hb_tag_t +HB_EXTERN hb_tag_t hb_script_to_iso15924_tag (hb_script_t script); -hb_direction_t +HB_EXTERN hb_direction_t hb_script_get_horizontal_direction (hb_script_t script);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.cc Tue Aug 09 16:20:02 2016 -0700 @@ -27,7 +27,6 @@ */ #define HB_SHAPER coretext -#define hb_coretext_shaper_face_data_t CGFont #include "hb-shaper-impl-private.hh" #include "hb-coretext.h" @@ -78,6 +77,29 @@ * shaper face data */ +static CTFontDescriptorRef +get_last_resort_font_desc (void) +{ + // TODO Handle allocation failures? + CTFontDescriptorRef last_resort = CTFontDescriptorCreateWithNameAndSize (CFSTR("LastResort"), 0); + CFArrayRef cascade_list = CFArrayCreate (kCFAllocatorDefault, + (const void **) &last_resort, + 1, + &kCFTypeArrayCallBacks); + CFRelease (last_resort); + CFDictionaryRef attributes = CFDictionaryCreate (kCFAllocatorDefault, + (const void **) &kCTFontCascadeListAttribute, + (const void **) &cascade_list, + 1, + &kCFTypeDictionaryKeyCallBacks, + &kCFTypeDictionaryValueCallBacks); + CFRelease (cascade_list); + + CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes); + CFRelease (attributes); + return font_desc; +} + static void release_data (void *info, const void *data, size_t size) { @@ -87,14 +109,13 @@ hb_blob_destroy ((hb_blob_t *) info); } -hb_coretext_shaper_face_data_t * -_hb_coretext_shaper_face_data_create (hb_face_t *face) +static CGFontRef +create_cg_font (hb_face_t *face) { - hb_coretext_shaper_face_data_t *data = NULL; - + CGFontRef cg_font = NULL; if (face->destroy == (hb_destroy_func_t) CGFontRelease) { - data = CGFontRetain ((CGFontRef) face->user_data); + cg_font = CGFontRetain ((CGFontRef) face->user_data); } else { @@ -107,13 +128,98 @@ CGDataProviderRef provider = CGDataProviderCreateWithData (blob, blob_data, blob_length, &release_data); if (likely (provider)) { - data = CGFontCreateWithDataProvider (provider); + cg_font = CGFontCreateWithDataProvider (provider); + if (unlikely (!cg_font)) + DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed"); CGDataProviderRelease (provider); } } + return cg_font; +} - if (unlikely (!data)) { - DEBUG_MSG (CORETEXT, face, "Face CGFontCreateWithDataProvider() failed"); +static CTFontRef +create_ct_font (CGFontRef cg_font, CGFloat font_size) +{ + CTFontRef ct_font = CTFontCreateWithGraphicsFont (cg_font, font_size, NULL, NULL); + if (unlikely (!ct_font)) { + DEBUG_MSG (CORETEXT, cg_font, "Font CTFontCreateWithGraphicsFont() failed"); + return NULL; + } + CFURLRef original_url = (CFURLRef)CTFontCopyAttribute(ct_font, kCTFontURLAttribute); + + /* Create font copy with cascade list that has LastResort first; this speeds up CoreText + * font fallback which we don't need anyway. */ + { + CTFontDescriptorRef last_resort_font_desc = get_last_resort_font_desc (); + CTFontRef new_ct_font = CTFontCreateCopyWithAttributes (ct_font, 0.0, NULL, last_resort_font_desc); + CFRelease (last_resort_font_desc); + if (new_ct_font) + { + /* The CTFontCreateCopyWithAttributes call fails to stay on the same font + * when reconfiguring the cascade list and may switch to a different font + * when there are fonts that go by the same name, since the descriptor is + * just name and size. + * + * Avoid reconfiguring the cascade lists if the new font is outside the + * system locations that we cannot access from the sandboxed renderer + * process in Blink. This can be detected by the new file URL location + * that the newly found font points to. */ + CFURLRef new_url = (CFURLRef) CTFontCopyAttribute (new_ct_font, kCTFontURLAttribute); + // Keep reconfigured font if URL cannot be retrieved (seems to be the case + // on Mac OS 10.12 Sierra), speculative fix for crbug.com/625606 + if (!original_url || !new_url || CFEqual (original_url, new_url)) { + CFRelease (ct_font); + ct_font = new_ct_font; + } else { + CFRelease (new_ct_font); + DEBUG_MSG (CORETEXT, ct_font, "Discarding reconfigured CTFont, location changed."); + } + if (new_url) + CFRelease (new_url); + } + else + DEBUG_MSG (CORETEXT, ct_font, "Font copy with empty cascade list failed"); + } + + if (original_url) + CFRelease (original_url); + return ct_font; +} + +struct hb_coretext_shaper_face_data_t { + CGFontRef cg_font; + CTFontRef ct_font; +}; + +hb_coretext_shaper_face_data_t * +_hb_coretext_shaper_face_data_create (hb_face_t *face) +{ + hb_coretext_shaper_face_data_t *data = (hb_coretext_shaper_face_data_t *) calloc (1, sizeof (hb_coretext_shaper_face_data_t)); + if (unlikely (!data)) + return NULL; + + data->cg_font = create_cg_font (face); + if (unlikely (!data->cg_font)) + { + DEBUG_MSG (CORETEXT, face, "CGFont creation failed.."); + free (data); + return NULL; + } + + /* We use 36pt size instead of UPEM, because CoreText implements the 'trak' table, + * which can make the font too tight at large sizes. 36pt should be a good semi-neutral + * size. + * + * Since we always create CTFont at a fixed size, our CTFont lives in face_data + * instead of font_data. Which is good, because when people change scale on + * hb_font_t, we won't need to update our CTFont. */ + data->ct_font = create_ct_font (data->cg_font, 36.); + if (unlikely (!data->ct_font)) + { + DEBUG_MSG (CORETEXT, face, "CTFont creation failed."); + CFRelease (data->cg_font); + free (data); + return NULL; } return data; @@ -122,7 +228,9 @@ void _hb_coretext_shaper_face_data_destroy (hb_coretext_shaper_face_data_t *data) { - CFRelease (data); + CFRelease (data->ct_font); + CFRelease (data->cg_font); + free (data); } /* @@ -133,7 +241,7 @@ { if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - return face_data; + return face_data->cg_font; } @@ -141,49 +249,17 @@ * shaper font data */ -struct hb_coretext_shaper_font_data_t { - CTFontRef ct_font; - CGFloat x_mult, y_mult; /* From CT space to HB space. */ -}; +struct hb_coretext_shaper_font_data_t {}; hb_coretext_shaper_font_data_t * -_hb_coretext_shaper_font_data_create (hb_font_t *font) +_hb_coretext_shaper_font_data_create (hb_font_t *font HB_UNUSED) { - if (unlikely (!hb_coretext_shaper_face_data_ensure (font->face))) return NULL; - - hb_coretext_shaper_font_data_t *data = (hb_coretext_shaper_font_data_t *) calloc (1, sizeof (hb_coretext_shaper_font_data_t)); - if (unlikely (!data)) - return NULL; - - hb_face_t *face = font->face; - hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - - /* Choose a CoreText font size and calculate multipliers to convert to HarfBuzz space. */ - /* TODO: use upem instead of 36? */ - CGFloat font_size = 36.; /* Default... */ - /* No idea if the following is even a good idea. */ - if (font->y_ppem) - font_size = font->y_ppem; - - if (font_size < 0) - font_size = -font_size; - data->x_mult = (CGFloat) font->x_scale / font_size; - data->y_mult = (CGFloat) font->y_scale / font_size; - data->ct_font = CTFontCreateWithGraphicsFont (face_data, font_size, NULL, NULL); - if (unlikely (!data->ct_font)) { - DEBUG_MSG (CORETEXT, font, "Font CTFontCreateWithGraphicsFont() failed"); - free (data); - return NULL; - } - - return data; + return (hb_coretext_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; } void _hb_coretext_shaper_font_data_destroy (hb_coretext_shaper_font_data_t *data) { - CFRelease (data->ct_font); - free (data); } @@ -209,9 +285,10 @@ CTFontRef hb_coretext_font_get_ct_font (hb_font_t *font) { - if (unlikely (!hb_coretext_shaper_font_data_ensure (font))) return NULL; - hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font); - return font_data->ct_font; + hb_face_t *face = font->face; + if (unlikely (!hb_coretext_shaper_face_data_ensure (face))) return NULL; + hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); + return face_data->ct_font; } @@ -444,7 +521,10 @@ { hb_face_t *face = font->face; hb_coretext_shaper_face_data_t *face_data = HB_SHAPER_DATA_GET (face); - hb_coretext_shaper_font_data_t *font_data = HB_SHAPER_DATA_GET (font); + + CGFloat ct_font_size = CTFontGetSize (face_data->ct_font); + CGFloat x_mult = (CGFloat) font->x_scale / ct_font_size; + CGFloat y_mult = (CGFloat) font->y_scale / ct_font_size; /* Attach marks to their bases, to match the 'ot' shaper. * Adapted from hb-ot-shape:hb_form_clusters(). @@ -453,6 +533,7 @@ * B1 M1 B2 M2, and B1-B2 form a ligature, M2's cluster will * continue pointing to B2 even though B2 was merged into B1's * cluster... */ + if (buffer->cluster_level == HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES) { hb_unicode_funcs_t *unicode = buffer->unicode; unsigned int count = buffer->len; @@ -575,7 +656,7 @@ CTFontDescriptorRef font_desc = CTFontDescriptorCreateWithAttributes (attributes); CFRelease (attributes); - range->font = CTFontCreateCopyWithAttributes (font_data->ct_font, 0.0, NULL, font_desc); + range->font = CTFontCreateCopyWithAttributes (face_data->ct_font, 0.0, NULL, font_desc); CFRelease (font_desc); } else @@ -693,7 +774,6 @@ scratch += old_scratch_used; scratch_size -= old_scratch_used; } -retry: { string_ref = CFStringCreateWithCharactersNoCopy (NULL, pchars, chars_len, @@ -733,7 +813,7 @@ CFRelease (lang); } CFAttributedStringSetAttribute (attr_string, CFRangeMake (0, chars_len), - kCTFontAttributeName, font_data->ct_font); + kCTFontAttributeName, face_data->ct_font); if (num_features) { @@ -826,7 +906,7 @@ */ CFDictionaryRef attributes = CTRunGetAttributes (run); CTFontRef run_ct_font = static_cast<CTFontRef>(CFDictionaryGetValue (attributes, kCTFontAttributeName)); - if (!CFEqual (run_ct_font, font_data->ct_font)) + if (!CFEqual (run_ct_font, face_data->ct_font)) { /* The run doesn't use our main font instance. We have to figure out * whether font fallback happened, or this is just CoreText giving us @@ -846,15 +926,11 @@ * backend. * * However, even that wouldn't work if we were passed in the CGFont to - * begin with. - * - * Webkit uses a slightly different approach: it installs LastResort - * as fallback chain, and then checks PS name of used font against - * LastResort. That one is safe for any font except for LastResort, - * as opposed to ours, which can fail if we are using any uninstalled - * font that has the same name as an installed font. + * construct a hb_face to begin with. * * See: http://github.com/behdad/harfbuzz/pull/36 + * + * Also see: https://bugs.chromium.org/p/chromium/issues/detail?id=597098 */ bool matched = false; for (unsigned int i = 0; i < range_records.len; i++) @@ -868,13 +944,13 @@ CGFontRef run_cg_font = CTFontCopyGraphicsFont (run_ct_font, 0); if (run_cg_font) { - matched = CFEqual (run_cg_font, face_data); + matched = CFEqual (run_cg_font, face_data->cg_font); CFRelease (run_cg_font); } } if (!matched) { - CFStringRef font_ps_name = CTFontCopyName (font_data->ct_font, kCTFontPostScriptNameKey); + CFStringRef font_ps_name = CTFontCopyName (face_data->ct_font, kCTFontPostScriptNameKey); CFStringRef run_ps_name = CTFontCopyName (run_ct_font, kCTFontPostScriptNameKey); CFComparisonResult result = CFStringCompare (run_ps_name, font_ps_name, 0); CFRelease (run_ps_name); @@ -994,7 +1070,6 @@ positions = position_buf; } hb_glyph_info_t *info = run_info; - CGFloat x_mult = font_data->x_mult, y_mult = font_data->y_mult; if (HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction)) { hb_position_t x_offset = (positions[0].x - advances_so_far) * x_mult; @@ -1129,10 +1204,6 @@ * AAT shaper */ -HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, face) -HB_SHAPER_DATA_ENSURE_DECLARE(coretext_aat, font) - - /* * shaper face data */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-coretext.h Tue Aug 09 16:20:02 2016 -0700 @@ -44,14 +44,14 @@ #define HB_CORETEXT_TAG_MORX HB_TAG('m','o','r','x') -hb_face_t * +HB_EXTERN hb_face_t * hb_coretext_face_create (CGFontRef cg_font); -CGFontRef +HB_EXTERN CGFontRef hb_coretext_face_get_cg_font (hb_face_t *face); -CTFontRef +HB_EXTERN CTFontRef hb_coretext_font_get_ct_font (hb_font_t *font);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-deprecated.h Tue Aug 09 16:20:02 2016 -0700 @@ -44,6 +44,16 @@ #define HB_BUFFER_FLAGS_DEFAULT HB_BUFFER_FLAG_DEFAULT #define HB_BUFFER_SERIALIZE_FLAGS_DEFAULT HB_BUFFER_SERIALIZE_FLAG_DEFAULT +typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data, + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data); + +HB_EXTERN void +hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_func_t func, + void *user_data, hb_destroy_func_t destroy); + #endif HB_END_DECLS
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-face.h Tue Aug 09 16:20:02 2016 -0700 @@ -43,28 +43,28 @@ typedef struct hb_face_t hb_face_t; -hb_face_t * +HB_EXTERN hb_face_t * hb_face_create (hb_blob_t *blob, unsigned int index); typedef hb_blob_t * (*hb_reference_table_func_t) (hb_face_t *face, hb_tag_t tag, void *user_data); /* calls destroy() when not needing user_data anymore */ -hb_face_t * +HB_EXTERN hb_face_t * hb_face_create_for_tables (hb_reference_table_func_t reference_table_func, void *user_data, hb_destroy_func_t destroy); -hb_face_t * +HB_EXTERN hb_face_t * hb_face_get_empty (void); -hb_face_t * +HB_EXTERN hb_face_t * hb_face_reference (hb_face_t *face); -void +HB_EXTERN void hb_face_destroy (hb_face_t *face); -hb_bool_t +HB_EXTERN hb_bool_t hb_face_set_user_data (hb_face_t *face, hb_user_data_key_t *key, void * data, @@ -72,43 +72,43 @@ hb_bool_t replace); -void * +HB_EXTERN void * hb_face_get_user_data (hb_face_t *face, hb_user_data_key_t *key); -void +HB_EXTERN void hb_face_make_immutable (hb_face_t *face); -hb_bool_t +HB_EXTERN hb_bool_t hb_face_is_immutable (hb_face_t *face); -hb_blob_t * +HB_EXTERN hb_blob_t * hb_face_reference_table (hb_face_t *face, hb_tag_t tag); -hb_blob_t * +HB_EXTERN hb_blob_t * hb_face_reference_blob (hb_face_t *face); -void +HB_EXTERN void hb_face_set_index (hb_face_t *face, unsigned int index); -unsigned int +HB_EXTERN unsigned int hb_face_get_index (hb_face_t *face); -void +HB_EXTERN void hb_face_set_upem (hb_face_t *face, unsigned int upem); -unsigned int +HB_EXTERN unsigned int hb_face_get_upem (hb_face_t *face); -void +HB_EXTERN void hb_face_set_glyph_count (hb_face_t *face, unsigned int glyph_count); -unsigned int +HB_EXTERN unsigned int hb_face_get_glyph_count (hb_face_t *face);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-fallback-shape.cc Tue Aug 09 16:20:02 2016 -0700 @@ -106,7 +106,7 @@ */ hb_codepoint_t space; - bool has_space = font->get_glyph (' ', 0, &space); + bool has_space = (bool) font->get_nominal_glyph (' ', &space); buffer->clear_positions (); @@ -123,7 +123,7 @@ pos[i].y_advance = 0; continue; } - font->get_glyph (info[i].codepoint, 0, &info[i].codepoint); + font->get_nominal_glyph (info[i].codepoint, &info[i].codepoint); font->get_glyph_advance_for_direction (info[i].codepoint, direction, &pos[i].x_advance,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -42,7 +42,10 @@ */ #define HB_FONT_FUNCS_IMPLEMENT_CALLBACKS \ - HB_FONT_FUNC_IMPLEMENT (glyph) \ + HB_FONT_FUNC_IMPLEMENT (font_h_extents) \ + HB_FONT_FUNC_IMPLEMENT (font_v_extents) \ + HB_FONT_FUNC_IMPLEMENT (nominal_glyph) \ + HB_FONT_FUNC_IMPLEMENT (variation_glyph) \ HB_FONT_FUNC_IMPLEMENT (glyph_h_advance) \ HB_FONT_FUNC_IMPLEMENT (glyph_v_advance) \ HB_FONT_FUNC_IMPLEMENT (glyph_h_origin) \ @@ -61,14 +64,6 @@ hb_bool_t immutable; - /* Don't access these directly. Call hb_font_get_*() instead. */ - - struct { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name; - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT - } get; - struct { #define HB_FONT_FUNC_IMPLEMENT(name) void *name; HB_FONT_FUNCS_IMPLEMENT_CALLBACKS @@ -80,6 +75,16 @@ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT } destroy; + + /* Don't access these directly. Call font->get_*() instead. */ + union get_t { + struct get_funcs_t { +#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_func_t name; + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + } f; + void (*array[VAR]) (void); + } get; }; @@ -144,95 +149,133 @@ /* Public getters */ - inline hb_bool_t has_glyph (hb_codepoint_t unicode) + HB_INTERNAL bool has_func (unsigned int i); + + /* has_* ... */ +#define HB_FONT_FUNC_IMPLEMENT(name) \ + bool \ + has_##name##_func (void) \ + { \ + hb_font_funcs_t *funcs = this->klass; \ + unsigned int i = offsetof (hb_font_funcs_t::get_t::get_funcs_t, name) / sizeof (funcs->get.array[0]); \ + return has_func (i); \ + } + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + + inline hb_bool_t get_font_h_extents (hb_font_extents_t *extents) { - hb_codepoint_t glyph; - return get_glyph (unicode, 0, &glyph); + memset (extents, 0, sizeof (*extents)); + return klass->get.f.font_h_extents (this, user_data, + extents, + klass->user_data.font_h_extents); + } + inline hb_bool_t get_font_v_extents (hb_font_extents_t *extents) + { + memset (extents, 0, sizeof (*extents)); + return klass->get.f.font_v_extents (this, user_data, + extents, + klass->user_data.font_v_extents); } - inline hb_bool_t get_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector, - hb_codepoint_t *glyph) + inline bool has_glyph (hb_codepoint_t unicode) + { + hb_codepoint_t glyph; + return get_nominal_glyph (unicode, &glyph); + } + + inline hb_bool_t get_nominal_glyph (hb_codepoint_t unicode, + hb_codepoint_t *glyph) { *glyph = 0; - return klass->get.glyph (this, user_data, - unicode, variation_selector, glyph, - klass->user_data.glyph); + return klass->get.f.nominal_glyph (this, user_data, + unicode, glyph, + klass->user_data.nominal_glyph); + } + + inline hb_bool_t get_variation_glyph (hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) + { + *glyph = 0; + return klass->get.f.variation_glyph (this, user_data, + unicode, variation_selector, glyph, + klass->user_data.variation_glyph); } inline hb_position_t get_glyph_h_advance (hb_codepoint_t glyph) { - return klass->get.glyph_h_advance (this, user_data, - glyph, - klass->user_data.glyph_h_advance); + return klass->get.f.glyph_h_advance (this, user_data, + glyph, + klass->user_data.glyph_h_advance); } inline hb_position_t get_glyph_v_advance (hb_codepoint_t glyph) { - return klass->get.glyph_v_advance (this, user_data, - glyph, - klass->user_data.glyph_v_advance); + return klass->get.f.glyph_v_advance (this, user_data, + glyph, + klass->user_data.glyph_v_advance); } inline hb_bool_t get_glyph_h_origin (hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y) { *x = *y = 0; - return klass->get.glyph_h_origin (this, user_data, - glyph, x, y, - klass->user_data.glyph_h_origin); + return klass->get.f.glyph_h_origin (this, user_data, + glyph, x, y, + klass->user_data.glyph_h_origin); } inline hb_bool_t get_glyph_v_origin (hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y) { *x = *y = 0; - return klass->get.glyph_v_origin (this, user_data, - glyph, x, y, - klass->user_data.glyph_v_origin); + return klass->get.f.glyph_v_origin (this, user_data, + glyph, x, y, + klass->user_data.glyph_v_origin); } inline hb_position_t get_glyph_h_kerning (hb_codepoint_t left_glyph, hb_codepoint_t right_glyph) { - return klass->get.glyph_h_kerning (this, user_data, - left_glyph, right_glyph, - klass->user_data.glyph_h_kerning); + return klass->get.f.glyph_h_kerning (this, user_data, + left_glyph, right_glyph, + klass->user_data.glyph_h_kerning); } inline hb_position_t get_glyph_v_kerning (hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph) { - return klass->get.glyph_v_kerning (this, user_data, - top_glyph, bottom_glyph, - klass->user_data.glyph_v_kerning); + return klass->get.f.glyph_v_kerning (this, user_data, + top_glyph, bottom_glyph, + klass->user_data.glyph_v_kerning); } inline hb_bool_t get_glyph_extents (hb_codepoint_t glyph, hb_glyph_extents_t *extents) { memset (extents, 0, sizeof (*extents)); - return klass->get.glyph_extents (this, user_data, - glyph, - extents, - klass->user_data.glyph_extents); + return klass->get.f.glyph_extents (this, user_data, + glyph, + extents, + klass->user_data.glyph_extents); } inline hb_bool_t get_glyph_contour_point (hb_codepoint_t glyph, unsigned int point_index, hb_position_t *x, hb_position_t *y) { *x = *y = 0; - return klass->get.glyph_contour_point (this, user_data, - glyph, point_index, - x, y, - klass->user_data.glyph_contour_point); + return klass->get.f.glyph_contour_point (this, user_data, + glyph, point_index, + x, y, + klass->user_data.glyph_contour_point); } inline hb_bool_t get_glyph_name (hb_codepoint_t glyph, char *name, unsigned int size) { if (size) *name = '\0'; - return klass->get.glyph_name (this, user_data, - glyph, - name, size, - klass->user_data.glyph_name); + return klass->get.f.glyph_name (this, user_data, + glyph, + name, size, + klass->user_data.glyph_name); } inline hb_bool_t get_glyph_from_name (const char *name, int len, /* -1 means nul-terminated */ @@ -240,15 +283,35 @@ { *glyph = 0; if (len == -1) len = strlen (name); - return klass->get.glyph_from_name (this, user_data, - name, len, - glyph, - klass->user_data.glyph_from_name); + return klass->get.f.glyph_from_name (this, user_data, + name, len, + glyph, + klass->user_data.glyph_from_name); } /* A bit higher-level, and with fallback */ + inline void get_extents_for_direction (hb_direction_t direction, + hb_font_extents_t *extents) + { + if (likely (HB_DIRECTION_IS_HORIZONTAL (direction))) { + if (!get_font_h_extents (extents)) + { + extents->ascender = y_scale * .8; + extents->descender = y_scale - extents->ascender; + extents->line_gap = 0; + } + } else { + if (!get_font_v_extents (extents)) + { + extents->ascender = x_scale / 2; + extents->descender = x_scale - extents->ascender; + extents->line_gap = 0; + } + } + } + inline void get_glyph_advance_for_direction (hb_codepoint_t glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y) @@ -268,7 +331,7 @@ { *x = get_glyph_h_advance (glyph) / 2; - /* TODO use font_metrics.ascent */ + /* TODO use font_extents.ascender */ *y = y_scale; } @@ -298,6 +361,26 @@ } } + inline void add_glyph_h_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_h_origin (glyph, &origin_x, &origin_y); + + *x += origin_x; + *y += origin_y; + } + inline void add_glyph_v_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_v_origin (glyph, &origin_x, &origin_y); + + *x += origin_x; + *y += origin_y; + } inline void add_glyph_origin_for_direction (hb_codepoint_t glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y) @@ -310,6 +393,26 @@ *y += origin_y; } + inline void subtract_glyph_h_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_h_origin (glyph, &origin_x, &origin_y); + + *x -= origin_x; + *y -= origin_y; + } + inline void subtract_glyph_v_origin (hb_codepoint_t glyph, + hb_position_t *x, hb_position_t *y) + { + hb_position_t origin_x, origin_y; + + get_glyph_v_origin (glyph, &origin_x, &origin_y); + + *x -= origin_x; + *y -= origin_y; + } inline void subtract_glyph_origin_for_direction (hb_codepoint_t glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y) @@ -394,7 +497,7 @@ hb_codepoint_t unichar; if (0 == strncmp (s, "uni", 3) && hb_codepoint_parse (s + 3, len - 3, 16, &unichar) && - get_glyph (unichar, 0, glyph)) + get_nominal_glyph (unichar, glyph)) return true; } @@ -402,7 +505,13 @@ } private: - inline hb_position_t em_scale (int16_t v, int scale) { return (hb_position_t) (v * (int64_t) scale / face->get_upem ()); } + inline hb_position_t em_scale (int16_t v, int scale) + { + int upem = face->get_upem (); + int64_t scaled = v * (int64_t) scale; + scaled += scaled >= 0 ? upem/2 : -upem/2; /* Round. */ + return (hb_position_t) (scaled / upem); + } }; #define HB_SHAPER_DATA_CREATE_FUNC_EXTRA_ARGS
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.cc Tue Aug 09 16:20:02 2016 -0700 @@ -45,130 +45,246 @@ */ static hb_bool_t -hb_font_get_glyph_nil (hb_font_t *font, - void *font_data HB_UNUSED, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) +hb_font_get_font_h_extents_nil (hb_font_t *font, + void *font_data HB_UNUSED, + hb_font_extents_t *metrics, + void *user_data HB_UNUSED) +{ + memset (metrics, 0, sizeof (*metrics)); + return false; +} +static hb_bool_t +hb_font_get_font_h_extents_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_font_extents_t *metrics, + void *user_data HB_UNUSED) { - if (font->parent) - return font->parent->get_glyph (unicode, variation_selector, glyph); + hb_bool_t ret = font->parent->get_font_h_extents (metrics); + if (ret) { + metrics->ascender = font->parent_scale_y_distance (metrics->ascender); + metrics->descender = font->parent_scale_y_distance (metrics->descender); + metrics->line_gap = font->parent_scale_y_distance (metrics->line_gap); + } + return ret; +} +static hb_bool_t +hb_font_get_font_v_extents_nil (hb_font_t *font, + void *font_data HB_UNUSED, + hb_font_extents_t *metrics, + void *user_data HB_UNUSED) +{ + memset (metrics, 0, sizeof (*metrics)); + return false; +} +static hb_bool_t +hb_font_get_font_v_extents_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_font_extents_t *metrics, + void *user_data HB_UNUSED) +{ + hb_bool_t ret = font->parent->get_font_v_extents (metrics); + if (ret) { + metrics->ascender = font->parent_scale_x_distance (metrics->ascender); + metrics->descender = font->parent_scale_x_distance (metrics->descender); + metrics->line_gap = font->parent_scale_x_distance (metrics->line_gap); + } + return ret; +} + +static hb_bool_t +hb_font_get_nominal_glyph_nil (hb_font_t *font HB_UNUSED, + void *font_data HB_UNUSED, + hb_codepoint_t unicode, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) +{ *glyph = 0; return false; } +static hb_bool_t +hb_font_get_nominal_glyph_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t unicode, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) +{ + return font->parent->get_nominal_glyph (unicode, glyph); +} + +static hb_bool_t +hb_font_get_variation_glyph_nil (hb_font_t *font HB_UNUSED, + void *font_data HB_UNUSED, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) +{ + *glyph = 0; + return false; +} +static hb_bool_t +hb_font_get_variation_glyph_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) +{ + return font->parent->get_variation_glyph (unicode, variation_selector, glyph); +} + static hb_position_t -hb_font_get_glyph_h_advance_nil (hb_font_t *font, +hb_font_get_glyph_h_advance_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) { - if (font->parent) - return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph)); - return font->x_scale; } +static hb_position_t +hb_font_get_glyph_h_advance_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + void *user_data HB_UNUSED) +{ + return font->parent_scale_x_distance (font->parent->get_glyph_h_advance (glyph)); +} static hb_position_t -hb_font_get_glyph_v_advance_nil (hb_font_t *font, +hb_font_get_glyph_v_advance_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t glyph, void *user_data HB_UNUSED) { - if (font->parent) - return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); - + /* TODO use font_extents.ascender+descender */ return font->y_scale; } +static hb_position_t +hb_font_get_glyph_v_advance_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + void *user_data HB_UNUSED) +{ + return font->parent_scale_y_distance (font->parent->get_glyph_v_advance (glyph)); +} static hb_bool_t -hb_font_get_glyph_h_origin_nil (hb_font_t *font, +hb_font_get_glyph_h_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { - if (font->parent) { - hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y); - if (ret) - font->parent_scale_position (x, y); - return ret; - } - *x = *y = 0; - return false; + return true; +} +static hb_bool_t +hb_font_get_glyph_h_origin_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) +{ + hb_bool_t ret = font->parent->get_glyph_h_origin (glyph, x, y); + if (ret) + font->parent_scale_position (x, y); + return ret; } static hb_bool_t -hb_font_get_glyph_v_origin_nil (hb_font_t *font, +hb_font_get_glyph_v_origin_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y, void *user_data HB_UNUSED) { - if (font->parent) { - hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y); - if (ret) - font->parent_scale_position (x, y); - return ret; - } - *x = *y = 0; return false; } +static hb_bool_t +hb_font_get_glyph_v_origin_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) +{ + hb_bool_t ret = font->parent->get_glyph_v_origin (glyph, x, y); + if (ret) + font->parent_scale_position (x, y); + return ret; +} static hb_position_t -hb_font_get_glyph_h_kerning_nil (hb_font_t *font, +hb_font_get_glyph_h_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t left_glyph, hb_codepoint_t right_glyph, void *user_data HB_UNUSED) { - if (font->parent) - return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph)); - return 0; } +static hb_position_t +hb_font_get_glyph_h_kerning_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t left_glyph, + hb_codepoint_t right_glyph, + void *user_data HB_UNUSED) +{ + return font->parent_scale_x_distance (font->parent->get_glyph_h_kerning (left_glyph, right_glyph)); +} static hb_position_t -hb_font_get_glyph_v_kerning_nil (hb_font_t *font, +hb_font_get_glyph_v_kerning_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph, void *user_data HB_UNUSED) { - if (font->parent) - return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph)); - return 0; } +static hb_position_t +hb_font_get_glyph_v_kerning_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t top_glyph, + hb_codepoint_t bottom_glyph, + void *user_data HB_UNUSED) +{ + return font->parent_scale_y_distance (font->parent->get_glyph_v_kerning (top_glyph, bottom_glyph)); +} static hb_bool_t -hb_font_get_glyph_extents_nil (hb_font_t *font, +hb_font_get_glyph_extents_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t glyph, hb_glyph_extents_t *extents, void *user_data HB_UNUSED) { - if (font->parent) { - hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents); - if (ret) { - font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); - font->parent_scale_distance (&extents->width, &extents->height); - } - return ret; - } - memset (extents, 0, sizeof (*extents)); return false; } +static hb_bool_t +hb_font_get_glyph_extents_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + hb_glyph_extents_t *extents, + void *user_data HB_UNUSED) +{ + hb_bool_t ret = font->parent->get_glyph_extents (glyph, extents); + if (ret) { + font->parent_scale_position (&extents->x_bearing, &extents->y_bearing); + font->parent_scale_distance (&extents->width, &extents->height); + } + return ret; +} static hb_bool_t -hb_font_get_glyph_contour_point_nil (hb_font_t *font, +hb_font_get_glyph_contour_point_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t glyph, unsigned int point_index, @@ -176,45 +292,63 @@ hb_position_t *y, void *user_data HB_UNUSED) { - if (font->parent) { - hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y); - if (ret) - font->parent_scale_position (x, y); - return ret; - } - *x = *y = 0; return false; } +static hb_bool_t +hb_font_get_glyph_contour_point_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + unsigned int point_index, + hb_position_t *x, + hb_position_t *y, + void *user_data HB_UNUSED) +{ + hb_bool_t ret = font->parent->get_glyph_contour_point (glyph, point_index, x, y); + if (ret) + font->parent_scale_position (x, y); + return ret; +} static hb_bool_t -hb_font_get_glyph_name_nil (hb_font_t *font, +hb_font_get_glyph_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, hb_codepoint_t glyph, char *name, unsigned int size, void *user_data HB_UNUSED) { - if (font->parent) - return font->parent->get_glyph_name (glyph, name, size); - if (size) *name = '\0'; return false; } +static hb_bool_t +hb_font_get_glyph_name_parent (hb_font_t *font, + void *font_data HB_UNUSED, + hb_codepoint_t glyph, + char *name, unsigned int size, + void *user_data HB_UNUSED) +{ + return font->parent->get_glyph_name (glyph, name, size); +} static hb_bool_t -hb_font_get_glyph_from_name_nil (hb_font_t *font, +hb_font_get_glyph_from_name_nil (hb_font_t *font HB_UNUSED, void *font_data HB_UNUSED, const char *name, int len, /* -1 means nul-terminated */ hb_codepoint_t *glyph, void *user_data HB_UNUSED) { - if (font->parent) - return font->parent->get_glyph_from_name (name, len, glyph); - *glyph = 0; return false; } - +static hb_bool_t +hb_font_get_glyph_from_name_parent (hb_font_t *font, + void *font_data HB_UNUSED, + const char *name, int len, /* -1 means nul-terminated */ + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) +{ + return font->parent->get_glyph_from_name (name, len, glyph); +} static const hb_font_funcs_t _hb_font_funcs_nil = { HB_OBJECT_HEADER_STATIC, @@ -222,9 +356,44 @@ true, /* immutable */ { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil, +#define HB_FONT_FUNC_IMPLEMENT(name) NULL, + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + }, + { +#define HB_FONT_FUNC_IMPLEMENT(name) NULL, HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT + }, + { + { +#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_nil, + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + } + } +}; +static const hb_font_funcs_t _hb_font_funcs_parent = { + HB_OBJECT_HEADER_STATIC, + + true, /* immutable */ + + { +#define HB_FONT_FUNC_IMPLEMENT(name) NULL, + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + }, + { +#define HB_FONT_FUNC_IMPLEMENT(name) NULL, + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + }, + { + { +#define HB_FONT_FUNC_IMPLEMENT(name) hb_font_get_##name##_parent, + HB_FONT_FUNCS_IMPLEMENT_CALLBACKS +#undef HB_FONT_FUNC_IMPLEMENT + } } }; @@ -246,7 +415,7 @@ if (!(ffuncs = hb_object_create<hb_font_funcs_t> ())) return hb_font_funcs_get_empty (); - ffuncs->get = _hb_font_funcs_nil.get; + ffuncs->get = _hb_font_funcs_parent.get; return ffuncs; } @@ -263,7 +432,7 @@ hb_font_funcs_t * hb_font_funcs_get_empty (void) { - return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_nil); + return const_cast<hb_font_funcs_t *> (&_hb_font_funcs_parent); } /** @@ -398,11 +567,11 @@ ffuncs->destroy.name (ffuncs->user_data.name); \ \ if (func) { \ - ffuncs->get.name = func; \ + ffuncs->get.f.name = func; \ ffuncs->user_data.name = user_data; \ ffuncs->destroy.name = destroy; \ } else { \ - ffuncs->get.name = hb_font_get_##name##_nil; \ + ffuncs->get.f.name = hb_font_get_##name##_parent; \ ffuncs->user_data.name = NULL; \ ffuncs->destroy.name = NULL; \ } \ @@ -411,10 +580,53 @@ HB_FONT_FUNCS_IMPLEMENT_CALLBACKS #undef HB_FONT_FUNC_IMPLEMENT +bool +hb_font_t::has_func (unsigned int i) +{ + if (parent && parent != hb_font_get_empty () && parent->has_func (i)) + return true; + return this->klass->get.array[i] != _hb_font_funcs_parent.get.array[i]; +} /* Public getters */ /** + * hb_font_get_h_extents: + * @font: a font. + * @extents: (out): + * + * + * + * Return value: + * + * Since: 1.1.3 + **/ +hb_bool_t +hb_font_get_h_extents (hb_font_t *font, + hb_font_extents_t *extents) +{ + return font->get_font_h_extents (extents); +} + +/** + * hb_font_get_v_extents: + * @font: a font. + * @extents: (out): + * + * + * + * Return value: + * + * Since: 1.1.3 + **/ +hb_bool_t +hb_font_get_v_extents (hb_font_t *font, + hb_font_extents_t *extents) +{ + return font->get_font_v_extents (extents); +} + +/** * hb_font_get_glyph: * @font: a font. * @unicode: @@ -432,7 +644,50 @@ hb_codepoint_t unicode, hb_codepoint_t variation_selector, hb_codepoint_t *glyph) { - return font->get_glyph (unicode, variation_selector, glyph); + if (unlikely (variation_selector)) + return font->get_variation_glyph (unicode, variation_selector, glyph); + return font->get_nominal_glyph (unicode, glyph); +} + +/** + * hb_font_get_nominal_glyph: + * @font: a font. + * @unicode: + * @glyph: (out): + * + * + * + * Return value: + * + * Since: 1.2.3 + **/ +hb_bool_t +hb_font_get_nominal_glyph (hb_font_t *font, + hb_codepoint_t unicode, + hb_codepoint_t *glyph) +{ + return font->get_nominal_glyph (unicode, glyph); +} + +/** + * hb_font_get_variation_glyph: + * @font: a font. + * @unicode: + * @variation_selector: + * @glyph: (out): + * + * + * + * Return value: + * + * Since: 1.2.3 + **/ +hb_bool_t +hb_font_get_variation_glyph (hb_font_t *font, + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) +{ + return font->get_variation_glyph (unicode, variation_selector, glyph); } /** @@ -639,6 +894,23 @@ /* A bit higher-level, and with fallback */ /** + * hb_font_get_extents_for_direction: + * @font: a font. + * @direction: + * @extents: + * + * + * + * Since: 1.1.3 + **/ +void +hb_font_get_extents_for_direction (hb_font_t *font, + hb_direction_t direction, + hb_font_extents_t *extents) +{ + return font->get_extents_for_direction (direction, extents); +} +/** * hb_font_get_glyph_advance_for_direction: * @font: a font. * @glyph: @@ -858,6 +1130,7 @@ return hb_font_get_empty (); hb_face_make_immutable (face); + font->parent = hb_font_get_empty (); font->face = hb_face_reference (face); font->klass = hb_font_funcs_get_empty (); @@ -917,8 +1190,8 @@ NULL, /* parent */ const_cast<hb_face_t *> (&_hb_face_nil), - 0, /* x_scale */ - 0, /* y_scale */ + 1000, /* x_scale */ + 1000, /* y_scale */ 0, /* x_ppem */ 0, /* y_ppem */ @@ -1264,3 +1537,131 @@ if (x_ppem) *x_ppem = font->x_ppem; if (y_ppem) *y_ppem = font->y_ppem; } + + +#ifndef HB_DISABLE_DEPRECATED + +/* + * Deprecated get_glyph_func(): + */ + +struct hb_trampoline_closure_t +{ + void *user_data; + hb_destroy_func_t destroy; + unsigned int ref_count; +}; + +template <typename FuncType> +struct hb_trampoline_t +{ + hb_trampoline_closure_t closure; /* Must be first. */ + FuncType func; +}; + +template <typename FuncType> +static hb_trampoline_t<FuncType> * +trampoline_create (FuncType func, + void *user_data, + hb_destroy_func_t destroy) +{ + typedef hb_trampoline_t<FuncType> trampoline_t; + + trampoline_t *trampoline = (trampoline_t *) calloc (1, sizeof (trampoline_t)); + + if (unlikely (!trampoline)) + return NULL; + + trampoline->closure.user_data = user_data; + trampoline->closure.destroy = destroy; + trampoline->closure.ref_count = 1; + trampoline->func = func; + + return trampoline; +} + +static void +trampoline_reference (hb_trampoline_closure_t *closure) +{ + closure->ref_count++; +} + +static void +trampoline_destroy (void *user_data) +{ + hb_trampoline_closure_t *closure = (hb_trampoline_closure_t *) user_data; + + if (--closure->ref_count) + return; + + if (closure->destroy) + closure->destroy (closure->user_data); + free (closure); +} + +typedef hb_trampoline_t<hb_font_get_glyph_func_t> hb_font_get_glyph_trampoline_t; + +static hb_bool_t +hb_font_get_nominal_glyph_trampoline (hb_font_t *font, + void *font_data, + hb_codepoint_t unicode, + hb_codepoint_t *glyph, + void *user_data) +{ + hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data; + return trampoline->func (font, font_data, unicode, 0, glyph, trampoline->closure.user_data); +} + +static hb_bool_t +hb_font_get_variation_glyph_trampoline (hb_font_t *font, + void *font_data, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data) +{ + hb_font_get_glyph_trampoline_t *trampoline = (hb_font_get_glyph_trampoline_t *) user_data; + return trampoline->func (font, font_data, unicode, variation_selector, glyph, trampoline->closure.user_data); +} + +/** + * hb_font_funcs_set_glyph_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * Deprecated. Use hb_font_funcs_set_nominal_glyph_func() and + * hb_font_funcs_set_variation_glyph_func() instead. + * + * Since: 0.9.2 + * Deprecated: 1.2.3 + **/ +void +hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, + hb_font_get_glyph_func_t func, + void *user_data, hb_destroy_func_t destroy) +{ + hb_font_get_glyph_trampoline_t *trampoline; + + trampoline = trampoline_create (func, user_data, destroy); + if (unlikely (!trampoline)) + { + if (destroy) + destroy (user_data); + return; + } + + hb_font_funcs_set_nominal_glyph_func (ffuncs, + hb_font_get_nominal_glyph_trampoline, + trampoline, + trampoline_destroy); + + trampoline_reference (&trampoline->closure); + hb_font_funcs_set_variation_glyph_func (ffuncs, + hb_font_get_variation_glyph_trampoline, + trampoline, + trampoline_destroy); +} + +#endif /* HB_DISABLE_DEPRECATED */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-font.h Tue Aug 09 16:20:02 2016 -0700 @@ -46,19 +46,19 @@ typedef struct hb_font_funcs_t hb_font_funcs_t; -hb_font_funcs_t * +HB_EXTERN hb_font_funcs_t * hb_font_funcs_create (void); -hb_font_funcs_t * +HB_EXTERN hb_font_funcs_t * hb_font_funcs_get_empty (void); -hb_font_funcs_t * +HB_EXTERN hb_font_funcs_t * hb_font_funcs_reference (hb_font_funcs_t *ffuncs); -void +HB_EXTERN void hb_font_funcs_destroy (hb_font_funcs_t *ffuncs); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_funcs_set_user_data (hb_font_funcs_t *ffuncs, hb_user_data_key_t *key, void * data, @@ -66,19 +66,37 @@ hb_bool_t replace); -void * +HB_EXTERN void * hb_font_funcs_get_user_data (hb_font_funcs_t *ffuncs, hb_user_data_key_t *key); -void +HB_EXTERN void hb_font_funcs_make_immutable (hb_font_funcs_t *ffuncs); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_funcs_is_immutable (hb_font_funcs_t *ffuncs); -/* glyph extents */ +/* font and glyph extents */ + +/* Note that typically ascender is positive and descender negative in coordinate systems that grow up. */ +typedef struct hb_font_extents_t +{ + hb_position_t ascender; /* typographic ascender. */ + hb_position_t descender; /* typographic descender. */ + hb_position_t line_gap; /* suggested line spacing gap. */ + /*< private >*/ + hb_position_t reserved9; + hb_position_t reserved8; + hb_position_t reserved7; + hb_position_t reserved6; + hb_position_t reserved5; + hb_position_t reserved4; + hb_position_t reserved3; + hb_position_t reserved2; + hb_position_t reserved1; +} hb_font_extents_t; /* Note that height is negative in coordinate systems that grow up. */ typedef struct hb_glyph_extents_t @@ -89,13 +107,23 @@ hb_position_t height; /* distance from top to bottom side. */ } hb_glyph_extents_t; - /* func types */ -typedef hb_bool_t (*hb_font_get_glyph_func_t) (hb_font_t *font, void *font_data, - hb_codepoint_t unicode, hb_codepoint_t variation_selector, - hb_codepoint_t *glyph, - void *user_data); +typedef hb_bool_t (*hb_font_get_font_extents_func_t) (hb_font_t *font, void *font_data, + hb_font_extents_t *metrics, + void *user_data); +typedef hb_font_get_font_extents_func_t hb_font_get_font_h_extents_func_t; +typedef hb_font_get_font_extents_func_t hb_font_get_font_v_extents_func_t; + + +typedef hb_bool_t (*hb_font_get_nominal_glyph_func_t) (hb_font_t *font, void *font_data, + hb_codepoint_t unicode, + hb_codepoint_t *glyph, + void *user_data); +typedef hb_bool_t (*hb_font_get_variation_glyph_func_t) (hb_font_t *font, void *font_data, + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data); typedef hb_position_t (*hb_font_get_glyph_advance_func_t) (hb_font_t *font, void *font_data, @@ -141,7 +169,23 @@ /* func setters */ /** - * hb_font_funcs_set_glyph_func: + * hb_font_funcs_set_font_h_extents_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 1.1.2 + **/ +HB_EXTERN void +hb_font_funcs_set_font_h_extents_func (hb_font_funcs_t *ffuncs, + hb_font_get_font_h_extents_func_t func, + void *user_data, hb_destroy_func_t destroy); + +/** + * hb_font_funcs_set_font_v_extents_func: * @ffuncs: font functions. * @func: (closure user_data) (destroy destroy) (scope notified): * @user_data: @@ -149,12 +193,44 @@ * * * - * Since: 0.9.2 + * Since: 1.1.2 + **/ +HB_EXTERN void +hb_font_funcs_set_font_v_extents_func (hb_font_funcs_t *ffuncs, + hb_font_get_font_v_extents_func_t func, + void *user_data, hb_destroy_func_t destroy); + +/** + * hb_font_funcs_set_nominal_glyph_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 1.2.3 **/ -void -hb_font_funcs_set_glyph_func (hb_font_funcs_t *ffuncs, - hb_font_get_glyph_func_t func, - void *user_data, hb_destroy_func_t destroy); +HB_EXTERN void +hb_font_funcs_set_nominal_glyph_func (hb_font_funcs_t *ffuncs, + hb_font_get_nominal_glyph_func_t func, + void *user_data, hb_destroy_func_t destroy); + +/** + * hb_font_funcs_set_variation_glyph_func: + * @ffuncs: font functions. + * @func: (closure user_data) (destroy destroy) (scope notified): + * @user_data: + * @destroy: + * + * + * + * Since: 1.2.3 + **/ +HB_EXTERN void +hb_font_funcs_set_variation_glyph_func (hb_font_funcs_t *ffuncs, + hb_font_get_variation_glyph_func_t func, + void *user_data, hb_destroy_func_t destroy); /** * hb_font_funcs_set_glyph_h_advance_func: @@ -167,7 +243,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_h_advance_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_h_advance_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -183,7 +259,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_v_advance_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_v_advance_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -199,7 +275,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_h_origin_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_h_origin_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -215,7 +291,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_v_origin_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_v_origin_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -231,7 +307,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_h_kerning_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_h_kerning_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -247,7 +323,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_v_kerning_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_v_kerning_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -263,7 +339,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_extents_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_extents_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -279,7 +355,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_contour_point_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_contour_point_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -295,7 +371,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_name_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_name_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -311,57 +387,67 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_font_funcs_set_glyph_from_name_func (hb_font_funcs_t *ffuncs, hb_font_get_glyph_from_name_func_t func, void *user_data, hb_destroy_func_t destroy); - /* func dispatch */ -hb_bool_t -hb_font_get_glyph (hb_font_t *font, - hb_codepoint_t unicode, hb_codepoint_t variation_selector, - hb_codepoint_t *glyph); +HB_EXTERN hb_bool_t +hb_font_get_h_extents (hb_font_t *font, + hb_font_extents_t *extents); +HB_EXTERN hb_bool_t +hb_font_get_v_extents (hb_font_t *font, + hb_font_extents_t *extents); -hb_position_t +HB_EXTERN hb_bool_t +hb_font_get_nominal_glyph (hb_font_t *font, + hb_codepoint_t unicode, + hb_codepoint_t *glyph); +HB_EXTERN hb_bool_t +hb_font_get_variation_glyph (hb_font_t *font, + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph); + +HB_EXTERN hb_position_t hb_font_get_glyph_h_advance (hb_font_t *font, hb_codepoint_t glyph); -hb_position_t +HB_EXTERN hb_position_t hb_font_get_glyph_v_advance (hb_font_t *font, hb_codepoint_t glyph); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_h_origin (hb_font_t *font, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_v_origin (hb_font_t *font, hb_codepoint_t glyph, hb_position_t *x, hb_position_t *y); -hb_position_t +HB_EXTERN hb_position_t hb_font_get_glyph_h_kerning (hb_font_t *font, hb_codepoint_t left_glyph, hb_codepoint_t right_glyph); -hb_position_t +HB_EXTERN hb_position_t hb_font_get_glyph_v_kerning (hb_font_t *font, hb_codepoint_t top_glyph, hb_codepoint_t bottom_glyph); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_extents (hb_font_t *font, hb_codepoint_t glyph, hb_glyph_extents_t *extents); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_contour_point (hb_font_t *font, hb_codepoint_t glyph, unsigned int point_index, hb_position_t *x, hb_position_t *y); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_name (hb_font_t *font, hb_codepoint_t glyph, char *name, unsigned int size); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_from_name (hb_font_t *font, const char *name, int len, /* -1 means nul-terminated */ hb_codepoint_t *glyph); @@ -369,52 +455,63 @@ /* high-level funcs, with fallback */ -void +/* Calls either hb_font_get_nominal_glyph() if variation_selector is 0, + * otherwise callse hb_font_get_variation_glyph(). */ +HB_EXTERN hb_bool_t +hb_font_get_glyph (hb_font_t *font, + hb_codepoint_t unicode, hb_codepoint_t variation_selector, + hb_codepoint_t *glyph); + +HB_EXTERN void +hb_font_get_extents_for_direction (hb_font_t *font, + hb_direction_t direction, + hb_font_extents_t *extents); +HB_EXTERN void hb_font_get_glyph_advance_for_direction (hb_font_t *font, hb_codepoint_t glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y); -void +HB_EXTERN void hb_font_get_glyph_origin_for_direction (hb_font_t *font, hb_codepoint_t glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y); -void +HB_EXTERN void hb_font_add_glyph_origin_for_direction (hb_font_t *font, hb_codepoint_t glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y); -void +HB_EXTERN void hb_font_subtract_glyph_origin_for_direction (hb_font_t *font, hb_codepoint_t glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y); -void +HB_EXTERN void hb_font_get_glyph_kerning_for_direction (hb_font_t *font, hb_codepoint_t first_glyph, hb_codepoint_t second_glyph, hb_direction_t direction, hb_position_t *x, hb_position_t *y); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_extents_for_origin (hb_font_t *font, hb_codepoint_t glyph, hb_direction_t direction, hb_glyph_extents_t *extents); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_get_glyph_contour_point_for_origin (hb_font_t *font, hb_codepoint_t glyph, unsigned int point_index, hb_direction_t direction, hb_position_t *x, hb_position_t *y); /* Generates gidDDD if glyph has no name. */ -void +HB_EXTERN void hb_font_glyph_to_string (hb_font_t *font, hb_codepoint_t glyph, char *s, unsigned int size); /* Parses gidDDD and uniUUUU strings automatically. */ -hb_bool_t +HB_EXTERN hb_bool_t hb_font_glyph_from_string (hb_font_t *font, const char *s, int len, /* -1 means nul-terminated */ hb_codepoint_t *glyph); @@ -426,22 +523,22 @@ /* Fonts are very light-weight objects */ -hb_font_t * +HB_EXTERN hb_font_t * hb_font_create (hb_face_t *face); -hb_font_t * +HB_EXTERN hb_font_t * hb_font_create_sub_font (hb_font_t *parent); -hb_font_t * +HB_EXTERN hb_font_t * hb_font_get_empty (void); -hb_font_t * +HB_EXTERN hb_font_t * hb_font_reference (hb_font_t *font); -void +HB_EXTERN void hb_font_destroy (hb_font_t *font); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_set_user_data (hb_font_t *font, hb_user_data_key_t *key, void * data, @@ -449,46 +546,46 @@ hb_bool_t replace); -void * +HB_EXTERN void * hb_font_get_user_data (hb_font_t *font, hb_user_data_key_t *key); -void +HB_EXTERN void hb_font_make_immutable (hb_font_t *font); -hb_bool_t +HB_EXTERN hb_bool_t hb_font_is_immutable (hb_font_t *font); -void +HB_EXTERN void hb_font_set_parent (hb_font_t *font, hb_font_t *parent); -hb_font_t * +HB_EXTERN hb_font_t * hb_font_get_parent (hb_font_t *font); -hb_face_t * +HB_EXTERN hb_face_t * hb_font_get_face (hb_font_t *font); -void +HB_EXTERN void hb_font_set_funcs (hb_font_t *font, hb_font_funcs_t *klass, void *font_data, hb_destroy_func_t destroy); /* Be *very* careful with this function! */ -void +HB_EXTERN void hb_font_set_funcs_data (hb_font_t *font, void *font_data, hb_destroy_func_t destroy); -void +HB_EXTERN void hb_font_set_scale (hb_font_t *font, int x_scale, int y_scale); -void +HB_EXTERN void hb_font_get_scale (hb_font_t *font, int *x_scale, int *y_scale); @@ -496,12 +593,12 @@ /* * A zero value means "no hinting in that direction" */ -void +HB_EXTERN void hb_font_set_ppem (hb_font_t *font, unsigned int x_ppem, unsigned int y_ppem); -void +HB_EXTERN void hb_font_get_ppem (hb_font_t *font, unsigned int *x_ppem, unsigned int *y_ppem);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.cc Tue Aug 09 16:20:02 2016 -0700 @@ -70,11 +70,12 @@ { FT_Face ft_face; int load_flags; + bool symbol; /* Whether selected cmap is symbol cmap. */ bool unref; /* Whether to destroy ft_face when done. */ }; static hb_ft_font_t * -_hb_ft_font_create (FT_Face ft_face, bool unref) +_hb_ft_font_create (FT_Face ft_face, bool symbol, bool unref) { hb_ft_font_t *ft_font = (hb_ft_font_t *) calloc (1, sizeof (hb_ft_font_t)); @@ -82,6 +83,7 @@ return NULL; ft_font->ft_face = ft_face; + ft_font->symbol = symbol; ft_font->unref = unref; ft_font->load_flags = FT_LOAD_DEFAULT | FT_LOAD_NO_HINTING; @@ -90,10 +92,16 @@ } static void +_hb_ft_face_destroy (FT_Face ft_face) +{ + FT_Done_Face (ft_face); +} + +static void _hb_ft_font_destroy (hb_ft_font_t *ft_font) { if (ft_font->unref) - FT_Done_Face (ft_font->ft_face); + _hb_ft_face_destroy (ft_font->ft_face); free (ft_font); } @@ -155,21 +163,46 @@ static hb_bool_t -hb_ft_get_glyph (hb_font_t *font HB_UNUSED, - void *font_data, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) - +hb_ft_get_nominal_glyph (hb_font_t *font HB_UNUSED, + void *font_data, + hb_codepoint_t unicode, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) { const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; - unsigned int g; + unsigned int g = FT_Get_Char_Index (ft_font->ft_face, unicode); - if (likely (!variation_selector)) - g = FT_Get_Char_Index (ft_font->ft_face, unicode); - else - g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector); + if (unlikely (!g)) + { + if (unlikely (ft_font->symbol) && unicode <= 0x00FFu) + { + /* For symbol-encoded OpenType fonts, we duplicate the + * U+F000..F0FF range at U+0000..U+00FF. That's what + * Windows seems to do, and that's hinted about at: + * http://www.microsoft.com/typography/otspec/recom.htm + * under "Non-Standard (Symbol) Fonts". */ + g = FT_Get_Char_Index (ft_font->ft_face, 0xF000u + unicode); + if (!g) + return false; + } + else + return false; + } + + *glyph = g; + return true; +} + +static hb_bool_t +hb_ft_get_variation_glyph (hb_font_t *font HB_UNUSED, + void *font_data, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) +{ + const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + unsigned int g = FT_Face_GetCharVariantIndex (ft_font->ft_face, unicode, variation_selector); if (unlikely (!g)) return false; @@ -217,18 +250,6 @@ } static hb_bool_t -hb_ft_get_glyph_h_origin (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph HB_UNUSED, - hb_position_t *x HB_UNUSED, - hb_position_t *y HB_UNUSED, - void *user_data HB_UNUSED) -{ - /* We always work in the horizontal coordinates. */ - return true; -} - -static hb_bool_t hb_ft_get_glyph_v_origin (hb_font_t *font HB_UNUSED, void *font_data, hb_codepoint_t glyph, @@ -272,17 +293,6 @@ return kerningv.x; } -static hb_position_t -hb_ft_get_glyph_v_kerning (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t top_glyph HB_UNUSED, - hb_codepoint_t bottom_glyph HB_UNUSED, - void *user_data HB_UNUSED) -{ - /* FreeType API doesn't support vertical kerning */ - return 0; -} - static hb_bool_t hb_ft_get_glyph_extents (hb_font_t *font HB_UNUSED, void *font_data, @@ -300,6 +310,16 @@ extents->y_bearing = ft_face->glyph->metrics.horiBearingY; extents->width = ft_face->glyph->metrics.width; extents->height = -ft_face->glyph->metrics.height; + if (font->x_scale < 0) + { + extents->x_bearing = -extents->x_bearing; + extents->width = -extents->width; + } + if (font->y_scale < 0) + { + extents->y_bearing = -extents->y_bearing; + extents->height = -extents->height; + } return true; } @@ -379,25 +399,78 @@ return *glyph != 0; } +static hb_bool_t +hb_ft_get_font_h_extents (hb_font_t *font HB_UNUSED, + void *font_data, + hb_font_extents_t *metrics, + void *user_data HB_UNUSED) +{ + const hb_ft_font_t *ft_font = (const hb_ft_font_t *) font_data; + FT_Face ft_face = ft_font->ft_face; + metrics->ascender = ft_face->size->metrics.ascender; + metrics->descender = ft_face->size->metrics.descender; + metrics->line_gap = ft_face->size->metrics.height - (ft_face->size->metrics.ascender - ft_face->size->metrics.descender); + if (font->y_scale < 0) + { + metrics->ascender = -metrics->ascender; + metrics->descender = -metrics->descender; + metrics->line_gap = -metrics->line_gap; + } + return true; +} + +static hb_font_funcs_t *static_ft_funcs = NULL; + +#ifdef HB_USE_ATEXIT +static +void free_static_ft_funcs (void) +{ + hb_font_funcs_destroy (static_ft_funcs); +} +#endif static void _hb_ft_font_set_funcs (hb_font_t *font, FT_Face ft_face, bool unref) { - static const hb_font_funcs_t ft_ffuncs = { - HB_OBJECT_HEADER_STATIC, +retry: + hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ft_funcs); - true, /* immutable */ + if (unlikely (!funcs)) + { + funcs = hb_font_funcs_create (); - { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_ft_get_##name, - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT + hb_font_funcs_set_font_h_extents_func (funcs, hb_ft_get_font_h_extents, NULL, NULL); + //hb_font_funcs_set_font_v_extents_func (funcs, hb_ft_get_font_v_extents, NULL, NULL); + hb_font_funcs_set_nominal_glyph_func (funcs, hb_ft_get_nominal_glyph, NULL, NULL); + hb_font_funcs_set_variation_glyph_func (funcs, hb_ft_get_variation_glyph, NULL, NULL); + hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ft_get_glyph_h_advance, NULL, NULL); + hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ft_get_glyph_v_advance, NULL, NULL); + //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ft_get_glyph_h_origin, NULL, NULL); + hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ft_get_glyph_v_origin, NULL, NULL); + hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ft_get_glyph_h_kerning, NULL, NULL); + //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ft_get_glyph_v_kerning, NULL, NULL); + hb_font_funcs_set_glyph_extents_func (funcs, hb_ft_get_glyph_extents, NULL, NULL); + hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ft_get_glyph_contour_point, NULL, NULL); + hb_font_funcs_set_glyph_name_func (funcs, hb_ft_get_glyph_name, NULL, NULL); + hb_font_funcs_set_glyph_from_name_func (funcs, hb_ft_get_glyph_from_name, NULL, NULL); + + hb_font_funcs_make_immutable (funcs); + + if (!hb_atomic_ptr_cmpexch (&static_ft_funcs, NULL, funcs)) { + hb_font_funcs_destroy (funcs); + goto retry; } + +#ifdef HB_USE_ATEXIT + atexit (free_static_ft_funcs); /* First person registers atexit() callback. */ +#endif }; + bool symbol = ft_face->charmap && ft_face->charmap->encoding == FT_ENCODING_MS_SYMBOL; + hb_font_set_funcs (font, - const_cast<hb_font_funcs_t *> (&ft_ffuncs), - _hb_ft_font_create (ft_face, unref), + funcs, + _hb_ft_font_create (ft_face, symbol, unref), (hb_destroy_func_t) _hb_ft_font_destroy); } @@ -477,7 +550,7 @@ hb_ft_face_create_referenced (FT_Face ft_face) { FT_Reference_Face (ft_face); - return hb_ft_face_create (ft_face, (hb_destroy_func_t) FT_Done_Face); + return hb_ft_face_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy); } static void @@ -557,7 +630,7 @@ hb_ft_font_create_referenced (FT_Face ft_face) { FT_Reference_Face (ft_face); - return hb_ft_font_create (ft_face, (hb_destroy_func_t) FT_Done_Face); + return hb_ft_font_create (ft_face, (hb_destroy_func_t) _hb_ft_face_destroy); } @@ -626,7 +699,8 @@ return; } - FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE); + if (FT_Select_Charmap (ft_face, FT_ENCODING_UNICODE)) + FT_Select_Charmap (ft_face, FT_ENCODING_MS_SYMBOL); FT_Set_Char_Size (ft_face, abs (font->x_scale), abs (font->y_scale),
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ft.h Tue Aug 09 16:20:02 2016 -0700 @@ -59,7 +59,7 @@ * probably should use (the more recent) hb_ft_face_create_referenced() * instead. */ -hb_face_t * +HB_EXTERN hb_face_t * hb_ft_face_create (FT_Face ft_face, hb_destroy_func_t destroy); @@ -71,7 +71,7 @@ * Client is still responsible for making sure that ft-face is destroyed * after hb-face is. */ -hb_face_t * +HB_EXTERN hb_face_t * hb_ft_face_create_cached (FT_Face ft_face); /* This version is like hb_ft_face_create(), except that it calls @@ -81,7 +81,7 @@ * This is the most convenient version to use. Use it unless you have * very good reasons not to. */ -hb_face_t * +HB_EXTERN hb_face_t * hb_ft_face_create_referenced (FT_Face ft_face); @@ -98,26 +98,26 @@ /* See notes on hb_ft_face_create(). Same issues re lifecycle-management * apply here. Use hb_ft_font_create_referenced() if you can. */ -hb_font_t * +HB_EXTERN hb_font_t * hb_ft_font_create (FT_Face ft_face, hb_destroy_func_t destroy); /* See notes on hb_ft_face_create_referenced() re lifecycle-management * issues. */ -hb_font_t * +HB_EXTERN hb_font_t * hb_ft_font_create_referenced (FT_Face ft_face); -FT_Face +HB_EXTERN FT_Face hb_ft_font_get_face (hb_font_t *font); -void +HB_EXTERN void hb_ft_font_set_load_flags (hb_font_t *font, int load_flags); -int +HB_EXTERN int hb_ft_font_get_load_flags (hb_font_t *font); /* Makes an hb_font_t use FreeType internally to implement font functions. */ -void +HB_EXTERN void hb_ft_font_set_funcs (hb_font_t *font);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-file-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -140,7 +140,7 @@ protected: Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ - FixedVersion version; /* Version of the TTC Header (1.0), + FixedVersion<>version; /* Version of the TTC Header (1.0), * 0x00010000u */ ArrayOf<OffsetTo<OffsetTable, ULONG>, ULONG> table; /* Array of offsets to the OffsetTable for each font @@ -187,7 +187,7 @@ union { struct { Tag ttcTag; /* TrueType Collection ID string: 'ttcf' */ - FixedVersion version; /* Version of the TTC Header (1.0 or 2.0), + FixedVersion<>version; /* Version of the TTC Header (1.0 or 2.0), * 0x00010000u or 0x00020000u */ } header; TTCHeaderVersion1 version1;
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-open-type-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -101,10 +101,8 @@ #define DEFINE_SIZE_STATIC(size) \ DEFINE_INSTANCE_ASSERTION (sizeof (*this) == (size)); \ static const unsigned int static_size = (size); \ - static const unsigned int min_size = (size) - -/* Size signifying variable-sized array */ -#define VAR 1 + static const unsigned int min_size = (size); \ + inline unsigned int get_size (void) const { return (size); } #define DEFINE_SIZE_UNION(size, _member) \ DEFINE_INSTANCE_ASSERTION (this->u._member.static_size == (size)); \ @@ -185,7 +183,7 @@ /* This limits sanitizing time on really broken fonts. */ #ifndef HB_SANITIZE_MAX_EDITS -#define HB_SANITIZE_MAX_EDITS 100 +#define HB_SANITIZE_MAX_EDITS 32 #endif struct hb_sanitize_context_t : @@ -399,9 +397,9 @@ struct hb_serialize_context_t { - inline hb_serialize_context_t (void *start, unsigned int size) + inline hb_serialize_context_t (void *start_, unsigned int size) { - this->start = (char *) start; + this->start = (char *) start_; this->end = this->start + size; this->ran_out_of_room = false; @@ -495,10 +493,10 @@ return reinterpret_cast<Type *> (&obj); } - inline void truncate (void *head) + inline void truncate (void *new_head) { - assert (this->start < head && head <= this->head); - this->head = (char *) head; + assert (this->start < new_head && new_head <= this->head); + this->head = (char *) new_head; } unsigned int debug_depth; @@ -665,6 +663,24 @@ /* 16-bit unsigned integer (USHORT) that describes a quantity in FUnits. */ typedef USHORT UFWORD; +/* 16-bit signed fixed number with the low 14 bits of fraction (2.14). */ +struct F2DOT14 : SHORT +{ + //inline float to_float (void) const { return ???; } + //inline void set_float (float f) { v.set (f * ???); } + public: + DEFINE_SIZE_STATIC (2); +}; + +/* 32-bit signed fixed-point number (16.16). */ +struct Fixed: LONG +{ + //inline float to_float (void) const { return ???; } + //inline void set_float (float f) { v.set (f * ???); } + public: + DEFINE_SIZE_STATIC (4); +}; + /* Date represented in number of seconds since 12:00 midnight, January 1, * 1904. The value is represented as a signed 64-bit integer. */ struct LONGDATETIME @@ -742,9 +758,10 @@ * Version Numbers */ +template <typename FixedType=USHORT> struct FixedVersion { - inline uint32_t to_int (void) const { return (major << 16) + minor; } + inline uint32_t to_int (void) const { return (major << (sizeof(FixedType) * 8)) + minor; } inline bool sanitize (hb_sanitize_context_t *c) const { @@ -752,10 +769,10 @@ return_trace (c->check_struct (this)); } - USHORT major; - USHORT minor; + FixedType major; + FixedType minor; public: - DEFINE_SIZE_STATIC (4); + DEFINE_SIZE_STATIC (2 * sizeof(FixedType)); };
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-cmap-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -69,61 +69,78 @@ struct CmapSubtableFormat4 { - inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + struct accelerator_t { - unsigned int segCount; + inline void init (const CmapSubtableFormat4 *subtable) + { + segCount = subtable->segCountX2 / 2; + endCount = subtable->values; + startCount = endCount + segCount + 1; + idDelta = startCount + segCount; + idRangeOffset = idDelta + segCount; + glyphIdArray = idRangeOffset + segCount; + glyphIdArrayLength = (subtable->length - 16 - 8 * segCount) / 2; + } + + static inline bool get_glyph_func (const void *obj, hb_codepoint_t codepoint, hb_codepoint_t *glyph) + { + const accelerator_t *thiz = (const accelerator_t *) obj; + + /* Custom two-array bsearch. */ + int min = 0, max = (int) thiz->segCount - 1; + const USHORT *startCount = thiz->startCount; + const USHORT *endCount = thiz->endCount; + unsigned int i; + while (min <= max) + { + int mid = (min + max) / 2; + if (codepoint < startCount[mid]) + max = mid - 1; + else if (codepoint > endCount[mid]) + min = mid + 1; + else + { + i = mid; + goto found; + } + } + return false; + + found: + hb_codepoint_t gid; + unsigned int rangeOffset = thiz->idRangeOffset[i]; + if (rangeOffset == 0) + gid = codepoint + thiz->idDelta[i]; + else + { + /* Somebody has been smoking... */ + unsigned int index = rangeOffset / 2 + (codepoint - thiz->startCount[i]) + i - thiz->segCount; + if (unlikely (index >= thiz->glyphIdArrayLength)) + return false; + gid = thiz->glyphIdArray[index]; + if (unlikely (!gid)) + return false; + gid += thiz->idDelta[i]; + } + + *glyph = gid & 0xFFFFu; + return true; + } + const USHORT *endCount; const USHORT *startCount; const USHORT *idDelta; const USHORT *idRangeOffset; const USHORT *glyphIdArray; + unsigned int segCount; unsigned int glyphIdArrayLength; - - segCount = this->segCountX2 / 2; - endCount = this->values; - startCount = endCount + segCount + 1; - idDelta = startCount + segCount; - idRangeOffset = idDelta + segCount; - glyphIdArray = idRangeOffset + segCount; - glyphIdArrayLength = (this->length - 16 - 8 * segCount) / 2; + }; - /* Custom two-array bsearch. */ - int min = 0, max = (int) segCount - 1; - unsigned int i; - while (min <= max) - { - int mid = (min + max) / 2; - if (codepoint < startCount[mid]) - max = mid - 1; - else if (codepoint > endCount[mid]) - min = mid + 1; - else - { - i = mid; - goto found; - } - } - return false; - - found: - hb_codepoint_t gid; - unsigned int rangeOffset = idRangeOffset[i]; - if (rangeOffset == 0) - gid = codepoint + idDelta[i]; - else - { - /* Somebody has been smoking... */ - unsigned int index = rangeOffset / 2 + (codepoint - startCount[i]) + i - segCount; - if (unlikely (index >= glyphIdArrayLength)) - return false; - gid = glyphIdArray[index]; - if (unlikely (!gid)) - return false; - gid += idDelta[i]; - } - - *glyph = gid & 0xFFFFu; - return true; + inline bool get_glyph (hb_codepoint_t codepoint, hb_codepoint_t *glyph) const + { + accelerator_t accel; + accel.init (this); + return accel.get_glyph_func (&accel, codepoint, glyph); } inline bool sanitize (hb_sanitize_context_t *c) const @@ -388,7 +405,7 @@ } protected: - USHORT format; /* Format number is set to 0. */ + USHORT format; /* Format number is set to 14. */ ULONG lengthZ; /* Byte length of this subtable. */ SortedArrayOf<VariationSelectorRecord, ULONG> record; /* Variation selector records; sorted @@ -416,16 +433,6 @@ } } - inline glyph_variant_t get_glyph_variant (hb_codepoint_t codepoint, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph) const - { - switch (u.format) { - case 14: return u.format14.get_glyph_variant(codepoint, variation_selector, glyph); - default: return GLYPH_VARIANT_NOT_FOUND; - } - } - inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); @@ -442,7 +449,7 @@ } } - protected: + public: union { USHORT format; /* Format identifier */ CmapSubtableFormat0 format0;
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.cc Tue Aug 09 16:20:02 2016 -0700 @@ -35,6 +35,8 @@ #include "hb-ot-head-table.hh" #include "hb-ot-hhea-table.hh" #include "hb-ot-hmtx-table.hh" +#include "hb-ot-os2-table.hh" +//#include "hb-ot-post-table.hh" struct hb_ot_face_metrics_accelerator_t @@ -42,24 +44,58 @@ unsigned int num_metrics; unsigned int num_advances; unsigned int default_advance; + unsigned short ascender; + unsigned short descender; + unsigned short line_gap; + const OT::_mtx *table; hb_blob_t *blob; inline void init (hb_face_t *face, - hb_tag_t _hea_tag, hb_tag_t _mtx_tag, - unsigned int default_advance_) + hb_tag_t _hea_tag, + hb_tag_t _mtx_tag, + hb_tag_t os2_tag) { - this->default_advance = default_advance_; - this->num_metrics = face->get_num_glyphs (); + this->default_advance = face->get_upem (); + + bool got_font_extents = false; + if (os2_tag) + { + hb_blob_t *os2_blob = OT::Sanitizer<OT::os2>::sanitize (face->reference_table (os2_tag)); + const OT::os2 *os2 = OT::Sanitizer<OT::os2>::lock_instance (os2_blob); +#define USE_TYPO_METRICS (1u<<7) + if (0 != (os2->fsSelection & USE_TYPO_METRICS)) + { + this->ascender = os2->sTypoAscender; + this->descender = os2->sTypoDescender; + this->line_gap = os2->sTypoLineGap; + got_font_extents = (this->ascender | this->descender) != 0; + } + hb_blob_destroy (os2_blob); + } hb_blob_t *_hea_blob = OT::Sanitizer<OT::_hea>::sanitize (face->reference_table (_hea_tag)); const OT::_hea *_hea = OT::Sanitizer<OT::_hea>::lock_instance (_hea_blob); this->num_advances = _hea->numberOfLongMetrics; + if (!got_font_extents) + { + this->ascender = _hea->ascender; + this->descender = _hea->descender; + this->line_gap = _hea->lineGap; + } hb_blob_destroy (_hea_blob); this->blob = OT::Sanitizer<OT::_mtx>::sanitize (face->reference_table (_mtx_tag)); - if (unlikely (!this->num_advances || - 2 * (this->num_advances + this->num_metrics) > hb_blob_get_length (this->blob))) + + /* Cap num_metrics() and num_advances() based on table length. */ + unsigned int len = hb_blob_get_length (this->blob); + if (unlikely (this->num_advances * 4 > len)) + this->num_advances = len / 4; + this->num_metrics = this->num_advances + (len - 4 * this->num_advances) / 2; + + /* We MUST set num_metrics to zero if num_advances is zero. + * Our get_advance() depends on that. */ + if (unlikely (!this->num_advances)) { this->num_metrics = this->num_advances = 0; hb_blob_destroy (this->blob); @@ -166,10 +202,48 @@ } }; +typedef bool (*hb_cmap_get_glyph_func_t) (const void *obj, + hb_codepoint_t codepoint, + hb_codepoint_t *glyph); + +template <typename Type> +static inline bool get_glyph_from (const void *obj, + hb_codepoint_t codepoint, + hb_codepoint_t *glyph) +{ + const Type *typed_obj = (const Type *) obj; + return typed_obj->get_glyph (codepoint, glyph); +} + +template <typename Type> +static inline bool get_glyph_from_symbol (const void *obj, + hb_codepoint_t codepoint, + hb_codepoint_t *glyph) +{ + const Type *typed_obj = (const Type *) obj; + if (likely (typed_obj->get_glyph (codepoint, glyph))) + return true; + + if (codepoint <= 0x00FFu) + { + /* For symbol-encoded OpenType fonts, we duplicate the + * U+F000..F0FF range at U+0000..U+00FF. That's what + * Windows seems to do, and that's hinted about at: + * http://www.microsoft.com/typography/otspec/recom.htm + * under "Non-Standard (Symbol) Fonts". */ + return typed_obj->get_glyph (0xF000u + codepoint, glyph); + } + + return false; +} + struct hb_ot_face_cmap_accelerator_t { - const OT::CmapSubtable *table; - const OT::CmapSubtable *uvs_table; + hb_cmap_get_glyph_func_t get_glyph_func; + const void *get_glyph_data; + OT::CmapSubtableFormat4::accelerator_t format4_accel; + + const OT::CmapSubtableFormat14 *uvs_table; hb_blob_t *blob; inline void init (hb_face_t *face) @@ -177,8 +251,9 @@ this->blob = OT::Sanitizer<OT::cmap>::sanitize (face->reference_table (HB_OT_TAG_cmap)); const OT::cmap *cmap = OT::Sanitizer<OT::cmap>::lock_instance (this->blob); const OT::CmapSubtable *subtable = NULL; - const OT::CmapSubtable *subtable_uvs = NULL; + const OT::CmapSubtableFormat14 *subtable_uvs = NULL; + bool symbol = false; /* 32-bit subtables. */ if (!subtable) subtable = cmap->find_subtable (3, 10); if (!subtable) subtable = cmap->find_subtable (0, 6); @@ -189,17 +264,38 @@ if (!subtable) subtable = cmap->find_subtable (0, 2); if (!subtable) subtable = cmap->find_subtable (0, 1); if (!subtable) subtable = cmap->find_subtable (0, 0); - if (!subtable) subtable = cmap->find_subtable (3, 0); + if (!subtable)(subtable = cmap->find_subtable (3, 0)) && (symbol = true); /* Meh. */ if (!subtable) subtable = &OT::Null(OT::CmapSubtable); /* UVS subtable. */ - if (!subtable_uvs) subtable_uvs = cmap->find_subtable (0, 5); + if (!subtable_uvs) + { + const OT::CmapSubtable *st = cmap->find_subtable (0, 5); + if (st && st->u.format == 14) + subtable_uvs = &st->u.format14; + } /* Meh. */ - if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtable); + if (!subtable_uvs) subtable_uvs = &OT::Null(OT::CmapSubtableFormat14); + + this->uvs_table = subtable_uvs; - this->table = subtable; - this->uvs_table = subtable_uvs; + this->get_glyph_data = subtable; + if (unlikely (symbol)) + this->get_glyph_func = get_glyph_from_symbol<OT::CmapSubtable>; + else + switch (subtable->u.format) { + /* Accelerate format 4 and format 12. */ + default: this->get_glyph_func = get_glyph_from<OT::CmapSubtable>; break; + case 12: this->get_glyph_func = get_glyph_from<OT::CmapSubtableFormat12>; break; + case 4: + { + this->format4_accel.init (&subtable->u.format4); + this->get_glyph_data = &this->format4_accel; + this->get_glyph_func = this->format4_accel.get_glyph_func; + } + break; + } } inline void fini (void) @@ -207,33 +303,77 @@ hb_blob_destroy (this->blob); } - inline bool get_glyph (hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph) const + inline bool get_nominal_glyph (hb_codepoint_t unicode, + hb_codepoint_t *glyph) const { - if (unlikely (variation_selector)) + return this->get_glyph_func (this->get_glyph_data, unicode, glyph); + } + + inline bool get_variation_glyph (hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph) const + { + switch (this->uvs_table->get_glyph_variant (unicode, + variation_selector, + glyph)) { - switch (this->uvs_table->get_glyph_variant (unicode, - variation_selector, - glyph)) - { - case OT::GLYPH_VARIANT_NOT_FOUND: return false; - case OT::GLYPH_VARIANT_FOUND: return true; - case OT::GLYPH_VARIANT_USE_DEFAULT: break; - } + case OT::GLYPH_VARIANT_NOT_FOUND: return false; + case OT::GLYPH_VARIANT_FOUND: return true; + case OT::GLYPH_VARIANT_USE_DEFAULT: break; } - return this->table->get_glyph (unicode, glyph); + return get_nominal_glyph (unicode, glyph); } }; +template <typename T> +struct hb_lazy_loader_t +{ + inline void init (hb_face_t *face_) + { + face = face_; + instance = NULL; + } + + inline void fini (void) + { + if (instance && instance != &OT::Null(T)) + { + instance->fini(); + free (instance); + } + } + + inline const T* operator-> (void) const + { + retry: + T *p = (T *) hb_atomic_ptr_get (&instance); + if (unlikely (!p)) + { + p = (T *) calloc (1, sizeof (T)); + if (unlikely (!p)) + return &OT::Null(T); + p->init (face); + if (unlikely (!hb_atomic_ptr_cmpexch (const_cast<T **>(&instance), NULL, p))) + { + p->fini (); + goto retry; + } + } + return p; + } + + private: + hb_face_t *face; + T *instance; +}; struct hb_ot_font_t { hb_ot_face_cmap_accelerator_t cmap; hb_ot_face_metrics_accelerator_t h_metrics; hb_ot_face_metrics_accelerator_t v_metrics; - hb_ot_face_glyf_accelerator_t glyf; + hb_lazy_loader_t<hb_ot_face_glyf_accelerator_t> glyf; }; @@ -245,11 +385,9 @@ if (unlikely (!ot_font)) return NULL; - unsigned int upem = face->get_upem (); - ot_font->cmap.init (face); - ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, upem>>1); - ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, upem); /* TODO Can we do this lazily? */ + ot_font->h_metrics.init (face, HB_OT_TAG_hhea, HB_OT_TAG_hmtx, HB_OT_TAG_os2); + ot_font->v_metrics.init (face, HB_OT_TAG_vhea, HB_OT_TAG_vmtx, HB_TAG_NONE); /* TODO Can we do this lazily? */ ot_font->glyf.init (face); return ot_font; @@ -268,16 +406,27 @@ static hb_bool_t -hb_ot_get_glyph (hb_font_t *font HB_UNUSED, - void *font_data, - hb_codepoint_t unicode, - hb_codepoint_t variation_selector, - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) +hb_ot_get_nominal_glyph (hb_font_t *font HB_UNUSED, + void *font_data, + hb_codepoint_t unicode, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) { const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - return ot_font->cmap.get_glyph (unicode, variation_selector, glyph); + return ot_font->cmap.get_nominal_glyph (unicode, glyph); +} + +static hb_bool_t +hb_ot_get_variation_glyph (hb_font_t *font HB_UNUSED, + void *font_data, + hb_codepoint_t unicode, + hb_codepoint_t variation_selector, + hb_codepoint_t *glyph, + void *user_data HB_UNUSED) +{ + const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; + return ot_font->cmap.get_variation_glyph (unicode, variation_selector, glyph); } static hb_position_t @@ -301,52 +450,6 @@ } static hb_bool_t -hb_ot_get_glyph_h_origin (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t glyph HB_UNUSED, - hb_position_t *x HB_UNUSED, - hb_position_t *y HB_UNUSED, - void *user_data HB_UNUSED) -{ - /* We always work in the horizontal coordinates. */ - return true; -} - -static hb_bool_t -hb_ot_get_glyph_v_origin (hb_font_t *font HB_UNUSED, - void *font_data, - hb_codepoint_t glyph, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) -{ - /* TODO */ - return false; -} - -static hb_position_t -hb_ot_get_glyph_h_kerning (hb_font_t *font, - void *font_data, - hb_codepoint_t left_glyph, - hb_codepoint_t right_glyph, - void *user_data HB_UNUSED) -{ - /* TODO */ - return 0; -} - -static hb_position_t -hb_ot_get_glyph_v_kerning (hb_font_t *font HB_UNUSED, - void *font_data HB_UNUSED, - hb_codepoint_t top_glyph HB_UNUSED, - hb_codepoint_t bottom_glyph HB_UNUSED, - void *user_data HB_UNUSED) -{ - /* OpenType doesn't have vertical-kerning other than GPOS. */ - return 0; -} - -static hb_bool_t hb_ot_get_glyph_extents (hb_font_t *font HB_UNUSED, void *font_data, hb_codepoint_t glyph, @@ -354,7 +457,7 @@ void *user_data HB_UNUSED) { const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; - bool ret = ot_font->glyf.get_extents (glyph, extents); + bool ret = ot_font->glyf->get_extents (glyph, extents); extents->x_bearing = font->em_scale_x (extents->x_bearing); extents->y_bearing = font->em_scale_y (extents->y_bearing); extents->width = font->em_scale_x (extents->width); @@ -363,61 +466,85 @@ } static hb_bool_t -hb_ot_get_glyph_contour_point (hb_font_t *font HB_UNUSED, - void *font_data, - hb_codepoint_t glyph, - unsigned int point_index, - hb_position_t *x, - hb_position_t *y, - void *user_data HB_UNUSED) +hb_ot_get_font_h_extents (hb_font_t *font HB_UNUSED, + void *font_data, + hb_font_extents_t *metrics, + void *user_data HB_UNUSED) { - /* TODO */ - return false; + const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; + metrics->ascender = font->em_scale_y (ot_font->h_metrics.ascender); + metrics->descender = font->em_scale_y (ot_font->h_metrics.descender); + metrics->line_gap = font->em_scale_y (ot_font->h_metrics.line_gap); + return true; } static hb_bool_t -hb_ot_get_glyph_name (hb_font_t *font HB_UNUSED, - void *font_data, - hb_codepoint_t glyph, - char *name, unsigned int size, - void *user_data HB_UNUSED) +hb_ot_get_font_v_extents (hb_font_t *font HB_UNUSED, + void *font_data, + hb_font_extents_t *metrics, + void *user_data HB_UNUSED) { - /* TODO */ - return false; + const hb_ot_font_t *ot_font = (const hb_ot_font_t *) font_data; + metrics->ascender = font->em_scale_x (ot_font->v_metrics.ascender); + metrics->descender = font->em_scale_x (ot_font->v_metrics.descender); + metrics->line_gap = font->em_scale_x (ot_font->v_metrics.line_gap); + return true; } -static hb_bool_t -hb_ot_get_glyph_from_name (hb_font_t *font HB_UNUSED, - void *font_data, - const char *name, int len, /* -1 means nul-terminated */ - hb_codepoint_t *glyph, - void *user_data HB_UNUSED) +static hb_font_funcs_t *static_ot_funcs = NULL; + +#ifdef HB_USE_ATEXIT +static +void free_static_ot_funcs (void) { - /* TODO */ - return false; + hb_font_funcs_destroy (static_ot_funcs); } - +#endif static hb_font_funcs_t * _hb_ot_get_font_funcs (void) { - static const hb_font_funcs_t ot_ffuncs = { - HB_OBJECT_HEADER_STATIC, +retry: + hb_font_funcs_t *funcs = (hb_font_funcs_t *) hb_atomic_ptr_get (&static_ot_funcs); - true, /* immutable */ + if (unlikely (!funcs)) + { + funcs = hb_font_funcs_create (); - { -#define HB_FONT_FUNC_IMPLEMENT(name) hb_ot_get_##name, - HB_FONT_FUNCS_IMPLEMENT_CALLBACKS -#undef HB_FONT_FUNC_IMPLEMENT + hb_font_funcs_set_font_h_extents_func (funcs, hb_ot_get_font_h_extents, NULL, NULL); + hb_font_funcs_set_font_v_extents_func (funcs, hb_ot_get_font_v_extents, NULL, NULL); + hb_font_funcs_set_nominal_glyph_func (funcs, hb_ot_get_nominal_glyph, NULL, NULL); + hb_font_funcs_set_variation_glyph_func (funcs, hb_ot_get_variation_glyph, NULL, NULL); + hb_font_funcs_set_glyph_h_advance_func (funcs, hb_ot_get_glyph_h_advance, NULL, NULL); + hb_font_funcs_set_glyph_v_advance_func (funcs, hb_ot_get_glyph_v_advance, NULL, NULL); + //hb_font_funcs_set_glyph_h_origin_func (funcs, hb_ot_get_glyph_h_origin, NULL, NULL); + //hb_font_funcs_set_glyph_v_origin_func (funcs, hb_ot_get_glyph_v_origin, NULL, NULL); + //hb_font_funcs_set_glyph_h_kerning_func (funcs, hb_ot_get_glyph_h_kerning, NULL, NULL); TODO + //hb_font_funcs_set_glyph_v_kerning_func (funcs, hb_ot_get_glyph_v_kerning, NULL, NULL); + hb_font_funcs_set_glyph_extents_func (funcs, hb_ot_get_glyph_extents, NULL, NULL); + //hb_font_funcs_set_glyph_contour_point_func (funcs, hb_ot_get_glyph_contour_point, NULL, NULL); TODO + //hb_font_funcs_set_glyph_name_func (funcs, hb_ot_get_glyph_name, NULL, NULL); TODO + //hb_font_funcs_set_glyph_from_name_func (funcs, hb_ot_get_glyph_from_name, NULL, NULL); TODO + + hb_font_funcs_make_immutable (funcs); + + if (!hb_atomic_ptr_cmpexch (&static_ot_funcs, NULL, funcs)) { + hb_font_funcs_destroy (funcs); + goto retry; } + +#ifdef HB_USE_ATEXIT + atexit (free_static_ot_funcs); /* First person registers atexit() callback. */ +#endif }; - return const_cast<hb_font_funcs_t *> (&ot_ffuncs); + return funcs; } /** + * hb_ot_font_set_funcs: + * * Since: 0.9.28 **/ void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-font.h Tue Aug 09 16:20:02 2016 -0700 @@ -36,7 +36,7 @@ HB_BEGIN_DECLS -void +HB_EXTERN void hb_ot_font_set_funcs (hb_font_t *font);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-glyf-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -90,10 +90,10 @@ * greater than or equal to zero, * this is a simple glyph; if negative, * this is a composite glyph. */ - SHORT xMin; /* Minimum x for coordinate data. */ - SHORT yMin; /* Minimum y for coordinate data. */ - SHORT xMax; /* Maximum x for coordinate data. */ - SHORT yMax; /* Maximum y for coordinate data. */ + FWORD xMin; /* Minimum x for coordinate data. */ + FWORD yMin; /* Minimum y for coordinate data. */ + FWORD xMax; /* Maximum x for coordinate data. */ + FWORD yMax; /* Maximum y for coordinate data. */ DEFINE_SIZE_STATIC (10); };
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-head-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -55,13 +55,15 @@ inline bool sanitize (hb_sanitize_context_t *c) const { TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && likely (version.major == 1)); + return_trace (c->check_struct (this) && + version.major == 1 && + magicNumber == 0x5F0F3CF5u); } protected: - FixedVersion version; /* Version of the head table--currently + FixedVersion<>version; /* Version of the head table--currently * 0x00010000u for version 1.0. */ - FixedVersion fontRevision; /* Set by font manufacturer. */ + FixedVersion<>fontRevision; /* Set by font manufacturer. */ ULONG checkSumAdjustment; /* To compute: set it to 0, sum the * entire font as ULONG, then store * 0xB1B0AFBAu - sum. */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hhea-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -56,7 +56,7 @@ } public: - FixedVersion version; /* 0x00010000u for version 1.0. */ + FixedVersion<>version; /* 0x00010000u for version 1.0. */ FWORD ascender; /* Typographic ascent. */ FWORD descender; /* Typographic descent. */ FWORD lineGap; /* Typographic line gap. */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-hmtx-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -44,8 +44,8 @@ struct LongMetric { - USHORT advance; /* Advance width/height. */ - SHORT lsb; /* Leading (left/top) side bearing. */ + UFWORD advance; /* Advance width/height. */ + FWORD lsb; /* Leading (left/top) side bearing. */ public: DEFINE_SIZE_STATIC (4); }; @@ -74,7 +74,7 @@ * be in the array, but that entry is * required. The last entry applies to * all subsequent glyphs. */ - SHORT leadingBearingX[VAR]; /* Here the advance is assumed + FWORD leadingBearingX[VAR]; /* Here the advance is assumed * to be the same as the advance * for the last entry above. The * number of entries in this array is
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-common-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -34,6 +34,14 @@ #include "hb-set-private.hh" +#ifndef HB_MAX_NESTING_LEVEL +#define HB_MAX_NESTING_LEVEL 6 +#endif +#ifndef HB_MAX_CONTEXT_LENGTH +#define HB_MAX_CONTEXT_LENGTH 64 +#endif + + namespace OT { @@ -44,8 +52,6 @@ #define NOT_COVERED ((unsigned int) -1) -#define MAX_NESTING_LEVEL 6 -#define MAX_CONTEXT_LENGTH 64 @@ -539,6 +545,9 @@ c->try_set (&featureParams, new_offset) && !featureParams.sanitize (c, this, closure ? closure->tag : HB_TAG_NONE)) return_trace (false); + + if (c->edit_count > 1) + c->edit_count--; /* This was a "legitimate" edit; don't contribute to error count. */ } return_trace (true); @@ -573,6 +582,11 @@ DEFINE_SIZE_STATIC (2); }; +} /* namespace OT */ +/* This has to be outside the namespace. */ +HB_MARK_AS_FLAG_T (OT::LookupFlag::Flags); +namespace OT { + struct Lookup { inline unsigned int get_subtable_count (void) const { return subTable.len; } @@ -756,7 +770,11 @@ TRACE_SERIALIZE (this); if (unlikely (!c->extend_min (*this))) return_trace (false); - if (unlikely (!num_glyphs)) return_trace (true); + if (unlikely (!num_glyphs)) + { + rangeRecord.len.set (0); + return_trace (true); + } unsigned int num_ranges = 1; for (unsigned int i = 1; i < num_glyphs; i++) @@ -1156,6 +1174,21 @@ inline hb_position_t get_y_delta (hb_font_t *font) const { return get_delta (font->y_ppem, font->y_scale); } + inline unsigned int get_size (void) const + { + unsigned int f = deltaFormat; + if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size; + return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f))); + } + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this) && c->check_range (this, this->get_size ())); + } + + private: + inline int get_delta (unsigned int ppem, int scale) const { if (!ppem) return 0; @@ -1166,8 +1199,6 @@ return (int) (pixels * (int64_t) scale / ppem); } - - inline int get_delta_pixels (unsigned int ppem_size) const { unsigned int f = deltaFormat; @@ -1191,19 +1222,6 @@ return delta; } - inline unsigned int get_size (void) const - { - unsigned int f = deltaFormat; - if (unlikely (f < 1 || f > 3 || startSize > endSize)) return 3 * USHORT::static_size; - return USHORT::static_size * (4 + ((endSize - startSize) >> (4 - f))); - } - - inline bool sanitize (hb_sanitize_context_t *c) const - { - TRACE_SANITIZE (this); - return_trace (c->check_struct (this) && c->check_range (this, this->get_size ())); - } - protected: USHORT startSize; /* Smallest size to correct--in ppem */ USHORT endSize; /* Largest size to correct--in ppem */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gdef-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -409,7 +409,7 @@ protected: - FixedVersion version; /* Version of the GDEF table--currently + FixedVersion<>version; /* Version of the GDEF table--currently * 0x00010002u */ OffsetTo<ClassDef> glyphClassDef; /* Offset to class definition table
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gpos-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -36,8 +36,17 @@ /* buffer **position** var allocations */ -#define attach_lookback() var.u16[0] /* number of glyphs to go back to attach this glyph to its base */ -#define cursive_chain() var.i16[1] /* character to which this connects, may be positive or negative */ +#define attach_chain() var.i16[0] /* glyph to which this attaches to, relative to current glyphs; negative for going back, positive for forward. */ +#define attach_type() var.u8[2] /* attachment type */ +/* Note! if attach_chain() is zero, the value of attach_type() is irrelevant. */ + +enum attach_type_t { + ATTACH_TYPE_NONE = 0X00, + + /* Each attachment should be either a mark or a cursive; can't be both. */ + ATTACH_TYPE_MARK = 0X01, + ATTACH_TYPE_CURSIVE = 0X02, +}; /* Shared Tables: ValueRecord, Anchor Table, and MarkArray */ @@ -425,7 +434,9 @@ hb_glyph_position_t &o = buffer->cur_pos(); o.x_offset = base_x - mark_x; o.y_offset = base_y - mark_y; - o.attach_lookback() = buffer->idx - glyph_pos; + o.attach_type() = ATTACH_TYPE_MARK; + o.attach_chain() = (int) glyph_pos - (int) buffer->idx; + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; buffer->idx++; return_trace (true); @@ -741,7 +752,7 @@ inline void collect_glyphs (hb_collect_glyphs_context_t *c) const { TRACE_COLLECT_GLYPHS (this); - /* (this+coverage).add_coverage (c->input); // Don't need this. */ + (this+coverage).add_coverage (c->input); unsigned int count1 = class1Count; const ClassDef &klass1 = this+classDef1; @@ -906,9 +917,6 @@ TRACE_APPLY (this); hb_buffer_t *buffer = c->buffer; - /* We don't handle mark glyphs here. */ - if (unlikely (_hb_glyph_info_is_mark (&buffer->cur()))) return_trace (false); - const EntryExitRecord &this_record = entryExitRecord[(this+coverage).get_coverage (buffer->cur().codepoint)]; if (!this_record.exitAnchor) return_trace (false); @@ -992,7 +1000,9 @@ */ reverse_cursive_minor_offset (pos, child, c->direction, parent); - pos[child].cursive_chain() = parent - child; + pos[child].attach_type() = ATTACH_TYPE_CURSIVE; + pos[child].attach_chain() = (int) parent - (int) child; + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT; if (likely (HB_DIRECTION_IS_HORIZONTAL (c->direction))) pos[child].y_offset = y_offset; else @@ -1067,7 +1077,7 @@ unsigned int mark_index = (this+markCoverage).get_coverage (buffer->cur().codepoint); if (likely (mark_index == NOT_COVERED)) return_trace (false); - /* now we search backwards for a non-mark glyph */ + /* Now we search backwards for a non-mark glyph */ hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); @@ -1079,7 +1089,7 @@ } while (1); /* Checking that matched glyph is actually a base glyph by GDEF is too strong; disabled */ - if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ } + //if (!_hb_glyph_info_is_base_glyph (&buffer->info[skippy_iter.idx])) { return_trace (false); } unsigned int base_index = (this+baseCoverage).get_coverage (buffer->info[skippy_iter.idx].codepoint); if (base_index == NOT_COVERED) return_trace (false); @@ -1168,14 +1178,14 @@ unsigned int mark_index = (this+markCoverage).get_coverage (buffer->cur().codepoint); if (likely (mark_index == NOT_COVERED)) return_trace (false); - /* now we search backwards for a non-mark glyph */ + /* Now we search backwards for a non-mark glyph */ hb_apply_context_t::skipping_iterator_t &skippy_iter = c->iter_input; skippy_iter.reset (buffer->idx, 1); skippy_iter.set_lookup_props (LookupFlag::IgnoreMarks); if (!skippy_iter.prev ()) return_trace (false); /* Checking that matched glyph is actually a ligature by GDEF is too strong; disabled */ - if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { /*return_trace (false);*/ } + //if (!_hb_glyph_info_is_ligature (&buffer->info[skippy_iter.idx])) { return_trace (false); } unsigned int j = skippy_iter.idx; unsigned int lig_index = (this+ligatureCoverage).get_coverage (buffer->info[j].codepoint); @@ -1499,7 +1509,8 @@ { return CastR<PosLookup> (GSUBGPOS::get_lookup (i)); } static inline void position_start (hb_font_t *font, hb_buffer_t *buffer); - static inline void position_finish (hb_font_t *font, hb_buffer_t *buffer); + static inline void position_finish_advances (hb_font_t *font, hb_buffer_t *buffer); + static inline void position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer); inline bool sanitize (hb_sanitize_context_t *c) const { @@ -1516,13 +1527,13 @@ static void reverse_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction, unsigned int new_parent) { - unsigned int j = pos[i].cursive_chain(); - if (likely (!j)) + int chain = pos[i].attach_chain(), type = pos[i].attach_type(); + if (likely (!chain || 0 == (type & ATTACH_TYPE_CURSIVE))) return; - j += i; + pos[i].attach_chain() = 0; - pos[i].cursive_chain() = 0; + unsigned int j = (int) i + chain; /* Stop if we see new parent in the chain. */ if (j == new_parent) @@ -1535,62 +1546,68 @@ else pos[j].x_offset = -pos[i].x_offset; - pos[j].cursive_chain() = i - j; + pos[j].attach_chain() = -chain; + pos[j].attach_type() = type; } static void -fix_cursive_minor_offset (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction) +propagate_attachment_offsets (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction) { - unsigned int j = pos[i].cursive_chain(); - if (likely (!j)) + /* Adjusts offsets of attached glyphs (both cursive and mark) to accumulate + * offset of glyph they are attached to. */ + int chain = pos[i].attach_chain(), type = pos[i].attach_type(); + if (likely (!chain)) return; - j += i; + unsigned int j = (int) i + chain; - pos[i].cursive_chain() = 0; - - fix_cursive_minor_offset (pos, j, direction); + pos[i].attach_chain() = 0; - if (HB_DIRECTION_IS_HORIZONTAL (direction)) - pos[i].y_offset += pos[j].y_offset; - else - pos[i].x_offset += pos[j].x_offset; -} + propagate_attachment_offsets (pos, j, direction); + + assert (!!(type & ATTACH_TYPE_MARK) ^ !!(type & ATTACH_TYPE_CURSIVE)); -static void -fix_mark_attachment (hb_glyph_position_t *pos, unsigned int i, hb_direction_t direction) -{ - if (likely (!(pos[i].attach_lookback()))) - return; - - unsigned int j = i - pos[i].attach_lookback(); - - pos[i].x_offset += pos[j].x_offset; - pos[i].y_offset += pos[j].y_offset; + if (type & ATTACH_TYPE_CURSIVE) + { + if (HB_DIRECTION_IS_HORIZONTAL (direction)) + pos[i].y_offset += pos[j].y_offset; + else + pos[i].x_offset += pos[j].x_offset; + } + else /*if (type & ATTACH_TYPE_MARK)*/ + { + pos[i].x_offset += pos[j].x_offset; + pos[i].y_offset += pos[j].y_offset; - if (HB_DIRECTION_IS_FORWARD (direction)) - for (unsigned int k = j; k < i; k++) { - pos[i].x_offset -= pos[k].x_advance; - pos[i].y_offset -= pos[k].y_advance; - } - else - for (unsigned int k = j + 1; k < i + 1; k++) { - pos[i].x_offset += pos[k].x_advance; - pos[i].y_offset += pos[k].y_advance; - } + assert (j < i); + if (HB_DIRECTION_IS_FORWARD (direction)) + for (unsigned int k = j; k < i; k++) { + pos[i].x_offset -= pos[k].x_advance; + pos[i].y_offset -= pos[k].y_advance; + } + else + for (unsigned int k = j + 1; k < i + 1; k++) { + pos[i].x_offset += pos[k].x_advance; + pos[i].y_offset += pos[k].y_advance; + } + } } void GPOS::position_start (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) { - buffer->clear_positions (); - unsigned int count = buffer->len; for (unsigned int i = 0; i < count; i++) - buffer->pos[i].attach_lookback() = buffer->pos[i].cursive_chain() = 0; + buffer->pos[i].attach_chain() = buffer->pos[i].attach_type() = 0; } void -GPOS::position_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) +GPOS::position_finish_advances (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) +{ + //_hb_buffer_assert_gsubgpos_vars (buffer); +} + +void +GPOS::position_finish_offsets (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer) { _hb_buffer_assert_gsubgpos_vars (buffer); @@ -1598,13 +1615,10 @@ hb_glyph_position_t *pos = hb_buffer_get_glyph_positions (buffer, &len); hb_direction_t direction = buffer->props.direction; - /* Handle cursive connections */ - for (unsigned int i = 0; i < len; i++) - fix_cursive_minor_offset (pos, i, direction); - /* Handle attachments */ - for (unsigned int i = 0; i < len; i++) - fix_mark_attachment (pos, i, direction); + if (buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_GPOS_ATTACHMENT) + for (unsigned int i = 0; i < len; i++) + propagate_attachment_offsets (pos, i, direction); } @@ -1633,8 +1647,8 @@ } -#undef attach_lookback -#undef cursive_chain +#undef attach_chain +#undef attach_type } /* namespace OT */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsub-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -265,16 +265,6 @@ TRACE_APPLY (this); unsigned int count = substitute.len; - /* TODO: - * Testing shows that Uniscribe actually allows zero-len susbstitute, - * which essentially deletes a glyph. We don't allow for now. It - * can be confusing to the client since the cluster from the deleted - * glyph won't be merged with any output cluster... Also, currently - * buffer->move_to() makes assumptions about this too. Perhaps fix - * in the future after figuring out what to do with the clusters. - */ - if (unlikely (!count)) return_trace (false); - /* Special-case to make it in-place and not consider this * as a "multiplied" substitution. */ if (unlikely (count == 1)) @@ -282,6 +272,13 @@ c->replace_glyph (substitute.array[0]); return_trace (true); } + /* Spec disallows this, but Uniscribe allows it. + * https://github.com/behdad/harfbuzz/issues/253 */ + else if (unlikely (count == 0)) + { + c->buffer->delete_glyph (); + return_trace (true); + } unsigned int klass = _hb_glyph_info_is_ligature (&c->buffer->cur()) ? HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : 0; @@ -630,7 +627,7 @@ unsigned int total_component_count = 0; unsigned int match_length = 0; - unsigned int match_positions[MAX_CONTEXT_LENGTH]; + unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; if (likely (!match_input (c, count, &component[1], @@ -970,7 +967,7 @@ inline bool apply (hb_apply_context_t *c) const { TRACE_APPLY (this); - if (unlikely (c->nesting_level_left != MAX_NESTING_LEVEL)) + if (unlikely (c->nesting_level_left != HB_MAX_NESTING_LEVEL)) return_trace (false); /* No chaining to this type */ unsigned int index = (this+coverage).get_coverage (c->buffer->cur().codepoint); @@ -1268,7 +1265,6 @@ { return CastR<SubstLookup> (GSUBGPOS::get_lookup (i)); } static inline void substitute_start (hb_font_t *font, hb_buffer_t *buffer); - static inline void substitute_finish (hb_font_t *font, hb_buffer_t *buffer); inline bool sanitize (hb_sanitize_context_t *c) const { @@ -1289,19 +1285,32 @@ const GDEF &gdef = *hb_ot_layout_from_face (font->face)->gdef; unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) { - _hb_glyph_info_set_glyph_props (&buffer->info[i], gdef.get_glyph_props (buffer->info[i].codepoint)); - _hb_glyph_info_clear_lig_props (&buffer->info[i]); + unsigned int props = gdef.get_glyph_props (info[i].codepoint); + if (!props) + { + /* Never mark default-ignorables as marks. + * They won't get in the way of lookups anyway, + * but having them as mark will cause them to be skipped + * over if the lookup-flag says so, but at least for the + * Mongolian variation selectors, looks like Uniscribe + * marks them as non-mark. Some Mongolian fonts without + * GDEF rely on this. Another notable character that + * this applies to is COMBINING GRAPHEME JOINER. */ + props = (_hb_glyph_info_get_general_category (&info[i]) != + HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK || + _hb_glyph_info_is_default_ignorable (&info[i])) ? + HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : + HB_OT_LAYOUT_GLYPH_PROPS_MARK; + } + _hb_glyph_info_set_glyph_props (&info[i], props); + _hb_glyph_info_clear_lig_props (&info[i]); buffer->info[i].syllable() = 0; } } -void -GSUB::substitute_finish (hb_font_t *font HB_UNUSED, hb_buffer_t *buffer HB_UNUSED) -{ -} - /* Out-of-class implementation for methods recursing */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-gsubgpos-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -74,7 +74,7 @@ hb_closure_context_t (hb_face_t *face_, hb_set_t *glyphs_, - unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) : + unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) : face (face_), glyphs (glyphs_), recurse_func (NULL), @@ -196,7 +196,7 @@ hb_set_t *glyphs_input, /* OUT. May be NULL */ hb_set_t *glyphs_after, /* OUT. May be NULL */ hb_set_t *glyphs_output, /* OUT. May be NULL */ - unsigned int nesting_level_left_ = MAX_NESTING_LEVEL) : + unsigned int nesting_level_left_ = HB_MAX_NESTING_LEVEL) : face (face_), before (glyphs_before ? glyphs_before : hb_set_get_empty ()), input (glyphs_input ? glyphs_input : hb_set_get_empty ()), @@ -319,7 +319,7 @@ if (!c->check_glyph_property (&info, lookup_props)) return SKIP_YES; - if (unlikely (_hb_glyph_info_is_default_ignorable (&info) && + if (unlikely (_hb_glyph_info_is_default_ignorable_and_not_fvs (&info) && (ignore_zwnj || !_hb_glyph_info_is_zwnj (&info)) && (ignore_zwj || !_hb_glyph_info_is_zwj (&info)))) return SKIP_MAYBE; @@ -355,11 +355,11 @@ { matcher.set_lookup_props (lookup_props); } - inline void set_match_func (matcher_t::match_func_t match_func, - const void *match_data, + inline void set_match_func (matcher_t::match_func_t match_func_, + const void *match_data_, const USHORT glyph_data[]) { - matcher.set_match_func (match_func, match_data); + matcher.set_match_func (match_func_, match_data_); match_glyph_data = glyph_data; } @@ -483,7 +483,7 @@ lookup_mask (1), auto_zwj (true), recurse_func (NULL), - nesting_level_left (MAX_NESTING_LEVEL), + nesting_level_left (HB_MAX_NESTING_LEVEL), lookup_props (0), gdef (*hb_ot_layout_from_face (face)->gdef), has_glyph_classes (gdef.has_glyph_classes ()), @@ -704,13 +704,13 @@ match_func_t match_func, const void *match_data, unsigned int *end_offset, - unsigned int match_positions[MAX_CONTEXT_LENGTH], + unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], bool *p_is_mark_ligature = NULL, unsigned int *p_total_component_count = NULL) { TRACE_APPLY (NULL); - if (unlikely (count > MAX_CONTEXT_LENGTH)) return_trace (false); + if (unlikely (count > HB_MAX_CONTEXT_LENGTH)) return_trace (false); hb_buffer_t *buffer = c->buffer; @@ -784,7 +784,7 @@ } static inline bool ligate_input (hb_apply_context_t *c, unsigned int count, /* Including the first glyph */ - unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */ + unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */ unsigned int match_length, hb_codepoint_t lig_glyph, bool is_mark_ligature, @@ -836,19 +836,21 @@ if (_hb_glyph_info_get_general_category (&buffer->cur()) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) { _hb_glyph_info_set_general_category (&buffer->cur(), HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER); - _hb_glyph_info_set_modified_combining_class (&buffer->cur(), 0); } } c->replace_glyph_with_ligature (lig_glyph, klass); for (unsigned int i = 1; i < count; i++) { - while (buffer->idx < match_positions[i]) + while (buffer->idx < match_positions[i] && !buffer->in_error) { if (!is_mark_ligature) { + unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->cur()); + if (this_comp == 0) + this_comp = last_num_components; unsigned int new_lig_comp = components_so_far - last_num_components + - MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->cur()), 1u), last_num_components); - _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp); + MIN (this_comp, last_num_components); + _hb_glyph_info_set_lig_props_for_mark (&buffer->cur(), lig_id, new_lig_comp); } buffer->next_glyph (); } @@ -865,8 +867,11 @@ /* Re-adjust components for any marks following. */ for (unsigned int i = buffer->idx; i < buffer->len; i++) { if (last_lig_id == _hb_glyph_info_get_lig_id (&buffer->info[i])) { + unsigned int this_comp = _hb_glyph_info_get_lig_comp (&buffer->info[i]); + if (!this_comp) + break; unsigned int new_lig_comp = components_so_far - last_num_components + - MIN (MAX (_hb_glyph_info_get_lig_comp (&buffer->info[i]), 1u), last_num_components); + MIN (this_comp, last_num_components); _hb_glyph_info_set_lig_props_for_mark (&buffer->info[i], lig_id, new_lig_comp); } else break; @@ -944,7 +949,7 @@ static inline bool apply_lookup (hb_apply_context_t *c, unsigned int count, /* Including the first glyph */ - unsigned int match_positions[MAX_CONTEXT_LENGTH], /* Including the first glyph */ + unsigned int match_positions[HB_MAX_CONTEXT_LENGTH], /* Including the first glyph */ unsigned int lookupCount, const LookupRecord lookupRecord[], /* Array of LookupRecords--in design order */ unsigned int match_length) @@ -966,12 +971,17 @@ match_positions[j] += delta; } - for (unsigned int i = 0; i < lookupCount; i++) + for (unsigned int i = 0; i < lookupCount && !buffer->in_error; i++) { unsigned int idx = lookupRecord[i].sequenceIndex; if (idx >= count) continue; + /* Don't recurse to ourself at same position. + * Note that this test is too naive, it doesn't catch longer loops. */ + if (idx == 0 && lookupRecord[i].lookupListIndex == c->lookup_index) + continue; + buffer->move_to (match_positions[idx]); unsigned int orig_len = buffer->backtrack_len () + buffer->lookahead_len (); @@ -986,16 +996,19 @@ /* Recursed lookup changed buffer len. Adjust. */ - /* end can't go back past the current match position. - * Note: this is only true because we do NOT allow MultipleSubst - * with zero sequence len. */ - end = MAX ((int) match_positions[idx] + 1, int (end) + delta); + end = int (end) + delta; + if (end <= match_positions[idx]) + { + /* There can't be any further changes. */ + assert (end == match_positions[idx]); + break; + } unsigned int next = idx + 1; /* next now is the position after the recursed lookup. */ if (delta > 0) { - if (unlikely (delta + count > MAX_CONTEXT_LENGTH)) + if (unlikely (delta + count > HB_MAX_CONTEXT_LENGTH)) break; } else @@ -1094,7 +1107,7 @@ ContextApplyLookupContext &lookup_context) { unsigned int match_length = 0; - unsigned int match_positions[MAX_CONTEXT_LENGTH]; + unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; return match_input (c, inputCount, input, lookup_context.funcs.match, lookup_context.match_data, @@ -1621,7 +1634,7 @@ ChainContextApplyLookupContext &lookup_context) { unsigned int match_length = 0; - unsigned int match_positions[MAX_CONTEXT_LENGTH]; + unsigned int match_positions[HB_MAX_CONTEXT_LENGTH]; return match_input (c, inputCount, input, lookup_context.funcs.match, lookup_context.match_data[1], @@ -2267,7 +2280,7 @@ } protected: - FixedVersion version; /* Version of the GSUB/GPOS table--initially set + FixedVersion<>version; /* Version of the GSUB/GPOS table--initially set * to 0x00010000u */ OffsetTo<ScriptList> scriptList; /* ScriptList table */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-jstf-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -218,7 +218,7 @@ } protected: - FixedVersion version; /* Version of the JSTF table--initially set + FixedVersion<>version; /* Version of the JSTF table--initially set * to 0x00010000u */ RecordArrayOf<JstfScript> scriptList; /* Array of JstfScripts--listed
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -49,7 +49,7 @@ * GDEF */ -typedef enum +enum hb_ot_layout_glyph_props_flags_t { /* The following three match LookupFlags::Ignore* numbers. */ HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH = 0x02u, @@ -64,7 +64,8 @@ HB_OT_LAYOUT_GLYPH_PROPS_PRESERVE = HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED | HB_OT_LAYOUT_GLYPH_PROPS_LIGATED | HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED -} hb_ot_layout_glyph_class_mask_t; +}; +HB_MARK_AS_FLAG_T (hb_ot_layout_glyph_props_flags_t); /* @@ -98,21 +99,20 @@ const hb_ot_layout_lookup_accelerator_t &accel); -/* Should be called after all the substitute_lookup's are done */ -HB_INTERNAL void -hb_ot_layout_substitute_finish (hb_font_t *font, - hb_buffer_t *buffer); - - -/* Should be called before all the position_lookup's are done. Resets positions to zero. */ +/* Should be called before all the position_lookup's are done. */ HB_INTERNAL void hb_ot_layout_position_start (hb_font_t *font, hb_buffer_t *buffer); -/* Should be called after all the position_lookup's are done */ +/* Should be called after all the position_lookup's are done, to finish advances. */ HB_INTERNAL void -hb_ot_layout_position_finish (hb_font_t *font, - hb_buffer_t *buffer); +hb_ot_layout_position_finish_advances (hb_font_t *font, + hb_buffer_t *buffer); + +/* Should be called after hb_ot_layout_position_finish_advances, to finish offsets. */ +HB_INTERNAL void +hb_ot_layout_position_finish_offsets (hb_font_t *font, + hb_buffer_t *buffer); @@ -180,8 +180,7 @@ */ /* buffer var allocations, used during the entire shaping process */ -#define unicode_props0() var2.u8[0] -#define unicode_props1() var2.u8[1] +#define unicode_props() var2.u16[0] /* buffer var allocations, used during the GSUB/GPOS processing */ #define glyph_props() var1.u16[0] /* GDEF glyph properties */ @@ -214,48 +213,146 @@ /* unicode_props */ -enum { - MASK0_ZWJ = 0x20u, - MASK0_ZWNJ = 0x40u, - MASK0_IGNORABLE = 0x80u, - MASK0_GEN_CAT = 0x1Fu +/* Design: + * unicode_props() is a two-byte number. The low byte includes: + * - General_Category: 5 bits. + * - A bit each for: + * * Is it Default_Ignorable(); we have a modified Default_Ignorable(). + * * Whether it's one of the three Mongolian Free Variation Selectors. + * * One free bit right now. + * + * The high-byte has different meanings, switched by the Gen-Cat: + * - For Mn,Mc,Me: the modified Combining_Class. + * - For Cf: whether it's ZWJ, ZWNJ, or something else. + * - For Ws: index of which space character this is, if space fallback + * is needed, ie. we don't set this by default, only if asked to. + */ + +enum hb_unicode_props_flags_t { + UPROPS_MASK_GEN_CAT = 0x001Fu, + UPROPS_MASK_IGNORABLE = 0x0020u, + UPROPS_MASK_FVS = 0x0040u, /* MONGOLIAN FREE VARIATION SELECTOR 1..3 */ + + /* If GEN_CAT=FORMAT, top byte masks: */ + UPROPS_MASK_Cf_ZWJ = 0x0100u, + UPROPS_MASK_Cf_ZWNJ = 0x0200u }; +HB_MARK_AS_FLAG_T (hb_unicode_props_flags_t); static inline void -_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_unicode_funcs_t *unicode) +_hb_glyph_info_set_unicode_props (hb_glyph_info_t *info, hb_buffer_t *buffer) { - /* XXX This shouldn't be inlined, or at least not while is_default_ignorable() is inline. */ - info->unicode_props0() = ((unsigned int) unicode->general_category (info->codepoint)) | - (unicode->is_default_ignorable (info->codepoint) ? MASK0_IGNORABLE : 0) | - (info->codepoint == 0x200Cu ? MASK0_ZWNJ : 0) | - (info->codepoint == 0x200Du ? MASK0_ZWJ : 0); - info->unicode_props1() = unicode->modified_combining_class (info->codepoint); + hb_unicode_funcs_t *unicode = buffer->unicode; + unsigned int u = info->codepoint; + unsigned int gen_cat = (unsigned int) unicode->general_category (u); + unsigned int props = gen_cat; + + if (u >= 0x80) + { + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII; + if (unlikely (unicode->is_default_ignorable (u))) + { + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES; + props |= UPROPS_MASK_IGNORABLE; + if (u == 0x200Cu) props |= UPROPS_MASK_Cf_ZWNJ; + if (u == 0x200Du) props |= UPROPS_MASK_Cf_ZWJ; + /* Mongolian Free Variation Selectors need to be remembered + * because although we need to hide them like default-ignorables, + * they need to non-ignorable during shaping. This is similar to + * what we do for joiners in Indic-like shapers, but since the + * FVSes are GC=Mn, we have use a separate bit to remember them. + * Fixes: + * https://github.com/behdad/harfbuzz/issues/234 + */ + if (unlikely (hb_in_range (u, 0x180Bu, 0x180Du))) props |= UPROPS_MASK_FVS; + } + else if (unlikely (HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL (gen_cat))) + { + /* The above check is just an optimization to let in only things we need further + * processing on. */ + + /* Only Mn and Mc can have non-zero ccc: + * http://www.unicode.org/policies/stability_policy.html#Property_Value + * """ + * Canonical_Combining_Class, General_Category + * All characters other than those with General_Category property values + * Spacing_Mark (Mc) and Nonspacing_Mark (Mn) have the Canonical_Combining_Class + * property value 0. + * 1.1.5+ + * """ + * + * Also, all Mn's that are Default_Ignorable, have ccc=0, hence + * the "else if". + */ + props |= unicode->modified_combining_class (info->codepoint)<<8; + + /* Recategorize emoji skin-tone modifiers as Unicode mark, so they + * behave correctly in non-native directionality. They originally + * are MODIFIER_SYMBOL. Fixes: + * https://github.com/behdad/harfbuzz/issues/169 + */ + if (unlikely (hb_in_range (u, 0x1F3FBu, 0x1F3FFu))) + { + props = gen_cat = HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK; + } + } + } + + info->unicode_props() = props; } static inline void _hb_glyph_info_set_general_category (hb_glyph_info_t *info, hb_unicode_general_category_t gen_cat) { - info->unicode_props0() = (unsigned int) gen_cat | ((info->unicode_props0()) & ~MASK0_GEN_CAT); + /* Clears top-byte. */ + info->unicode_props() = (unsigned int) gen_cat | (info->unicode_props() & (0xFF & ~UPROPS_MASK_GEN_CAT)); } static inline hb_unicode_general_category_t _hb_glyph_info_get_general_category (const hb_glyph_info_t *info) { - return (hb_unicode_general_category_t) (info->unicode_props0() & MASK0_GEN_CAT); + return (hb_unicode_general_category_t) (info->unicode_props() & UPROPS_MASK_GEN_CAT); } +static inline bool +_hb_glyph_info_is_unicode_mark (const hb_glyph_info_t *info) +{ + return HB_UNICODE_GENERAL_CATEGORY_IS_MARK (info->unicode_props() & UPROPS_MASK_GEN_CAT); +} static inline void _hb_glyph_info_set_modified_combining_class (hb_glyph_info_t *info, unsigned int modified_class) { - info->unicode_props1() = modified_class; + if (unlikely (!_hb_glyph_info_is_unicode_mark (info))) + return; + info->unicode_props() = (modified_class<<8) | (info->unicode_props() & 0xFF); } - static inline unsigned int _hb_glyph_info_get_modified_combining_class (const hb_glyph_info_t *info) { - return info->unicode_props1(); + return _hb_glyph_info_is_unicode_mark (info) ? info->unicode_props()>>8 : 0; +} + +static inline bool +_hb_glyph_info_is_unicode_space (const hb_glyph_info_t *info) +{ + return _hb_glyph_info_get_general_category (info) == + HB_UNICODE_GENERAL_CATEGORY_SPACE_SEPARATOR; +} +static inline void +_hb_glyph_info_set_unicode_space_fallback_type (hb_glyph_info_t *info, hb_unicode_funcs_t::space_t s) +{ + if (unlikely (!_hb_glyph_info_is_unicode_space (info))) + return; + info->unicode_props() = (((unsigned int) s)<<8) | (info->unicode_props() & 0xFF); +} +static inline hb_unicode_funcs_t::space_t +_hb_glyph_info_get_unicode_space_fallback_type (const hb_glyph_info_t *info) +{ + return _hb_glyph_info_is_unicode_space (info) ? + (hb_unicode_funcs_t::space_t) (info->unicode_props()>>8) : + hb_unicode_funcs_t::NOT_SPACE; } static inline bool _hb_glyph_info_ligated (const hb_glyph_info_t *info); @@ -263,25 +360,44 @@ static inline hb_bool_t _hb_glyph_info_is_default_ignorable (const hb_glyph_info_t *info) { - return (info->unicode_props0() & MASK0_IGNORABLE) && !_hb_glyph_info_ligated (info); + return (info->unicode_props() & UPROPS_MASK_IGNORABLE) && + !_hb_glyph_info_ligated (info); +} +static inline hb_bool_t +_hb_glyph_info_is_default_ignorable_and_not_fvs (const hb_glyph_info_t *info) +{ + return ((info->unicode_props() & (UPROPS_MASK_IGNORABLE|UPROPS_MASK_FVS)) + == UPROPS_MASK_IGNORABLE) && + !_hb_glyph_info_ligated (info); } +static inline bool +_hb_glyph_info_is_unicode_format (const hb_glyph_info_t *info) +{ + return _hb_glyph_info_get_general_category (info) == + HB_UNICODE_GENERAL_CATEGORY_FORMAT; +} static inline hb_bool_t _hb_glyph_info_is_zwnj (const hb_glyph_info_t *info) { - return !!(info->unicode_props0() & MASK0_ZWNJ); + return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWNJ); } - static inline hb_bool_t _hb_glyph_info_is_zwj (const hb_glyph_info_t *info) { - return !!(info->unicode_props0() & MASK0_ZWJ); + return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & UPROPS_MASK_Cf_ZWJ); } - +static inline hb_bool_t +_hb_glyph_info_is_joiner (const hb_glyph_info_t *info) +{ + return _hb_glyph_info_is_unicode_format (info) && (info->unicode_props() & (UPROPS_MASK_Cf_ZWNJ|UPROPS_MASK_Cf_ZWJ)); +} static inline void _hb_glyph_info_flip_joiners (hb_glyph_info_t *info) { - info->unicode_props0() ^= MASK0_ZWNJ | MASK0_ZWJ; + if (!_hb_glyph_info_is_unicode_format (info)) + return; + info->unicode_props() ^= UPROPS_MASK_Cf_ZWNJ | UPROPS_MASK_Cf_ZWJ; } /* lig_props: aka lig_id / lig_comp @@ -442,11 +558,9 @@ } static inline void -_hb_glyph_info_clear_substituted_and_ligated_and_multiplied (hb_glyph_info_t *info) +_hb_glyph_info_clear_substituted (hb_glyph_info_t *info) { - info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED | - HB_OT_LAYOUT_GLYPH_PROPS_LIGATED | - HB_OT_LAYOUT_GLYPH_PROPS_MULTIPLIED); + info->glyph_props() &= ~(HB_OT_LAYOUT_GLYPH_PROPS_SUBSTITUTED); } @@ -455,22 +569,19 @@ static inline void _hb_buffer_allocate_unicode_vars (hb_buffer_t *buffer) { - HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props0); - HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props1); + HB_BUFFER_ALLOCATE_VAR (buffer, unicode_props); } static inline void _hb_buffer_deallocate_unicode_vars (hb_buffer_t *buffer) { - HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props0); - HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props1); + HB_BUFFER_DEALLOCATE_VAR (buffer, unicode_props); } static inline void _hb_buffer_assert_unicode_vars (hb_buffer_t *buffer) { - HB_BUFFER_ASSERT_VAR (buffer, unicode_props0); - HB_BUFFER_ASSERT_VAR (buffer, unicode_props1); + HB_BUFFER_ASSERT_VAR (buffer, unicode_props); } static inline void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.cc Tue Aug 09 16:20:02 2016 -0700 @@ -60,6 +60,80 @@ layout->gpos_blob = OT::Sanitizer<OT::GPOS>::sanitize (face->reference_table (HB_OT_TAG_GPOS)); layout->gpos = OT::Sanitizer<OT::GPOS>::lock_instance (layout->gpos_blob); + { + /* + * The ugly business of blacklisting individual fonts' tables happen here! + * See this thread for why we finally had to bend in and do this: + * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html + */ + unsigned int gdef_len = hb_blob_get_length (layout->gdef_blob); + unsigned int gsub_len = hb_blob_get_length (layout->gsub_blob); + unsigned int gpos_len = hb_blob_get_length (layout->gpos_blob); + if (0 + /* sha1sum:c5ee92f0bca4bfb7d06c4d03e8cf9f9cf75d2e8a Windows 7? timesi.ttf */ + || (442 == gdef_len && 42038 == gpos_len && 2874 == gsub_len) + /* sha1sum:37fc8c16a0894ab7b749e35579856c73c840867b Windows 7? timesbi.ttf */ + || (430 == gdef_len && 40662 == gpos_len && 2874 == gsub_len) + /* sha1sum:19fc45110ea6cd3cdd0a5faca256a3797a069a80 Windows 7 timesi.ttf */ + || (442 == gdef_len && 39116 == gpos_len && 2874 == gsub_len) + /* sha1sum:6d2d3c9ed5b7de87bc84eae0df95ee5232ecde26 Windows 7 timesbi.ttf */ + || (430 == gdef_len && 39374 == gpos_len && 2874 == gsub_len) + /* sha1sum:8583225a8b49667c077b3525333f84af08c6bcd8 OS X 10.11.3 Times New Roman Italic.ttf */ + || (490 == gdef_len && 41638 == gpos_len && 3046 == gsub_len) + /* sha1sum:ec0f5a8751845355b7c3271d11f9918a966cb8c9 OS X 10.11.3 Times New Roman Bold Italic.ttf */ + || (478 == gdef_len && 41902 == gpos_len && 3046 == gsub_len) + ) + { + /* In certain versions of Times New Roman Italic and Bold Italic, + * ASCII double quotation mark U+0022, mapped to glyph 5, has wrong + * glyph class 3 (mark) in GDEF. Nuke the GDEF to avoid zero-width + * double-quote. See: + * https://lists.freedesktop.org/archives/harfbuzz/2016-February/005489.html + */ + if (3 == layout->gdef->get_glyph_class (5)) + layout->gdef = &OT::Null(OT::GDEF); + } + else if (0 + /* sha1sum:96eda93f7d33e79962451c6c39a6b51ee893ce8c tahoma.ttf from Windows 8 */ + || (898 == gdef_len && 46470 == gpos_len && 12554 == gsub_len) + /* sha1sum:20928dc06014e0cd120b6fc942d0c3b1a46ac2bc tahomabd.ttf from Windows 8 */ + || (910 == gdef_len && 47732 == gpos_len && 12566 == gsub_len) + /* sha1sum:4f95b7e4878f60fa3a39ca269618dfde9721a79e tahoma.ttf from Windows 8.1 */ + || (928 == gdef_len && 59332 == gpos_len && 23298 == gsub_len) + /* sha1sum:6d400781948517c3c0441ba42acb309584b73033 tahomabd.ttf from Windows 8.1 */ + || (940 == gdef_len && 60732 == gpos_len && 23310 == gsub_len) + /* sha1sum:e55fa2dfe957a9f7ec26be516a0e30b0c925f846 tahoma.ttf from Windows 10 */ + || (994 == gdef_len && 60336 == gpos_len && 24474 == gsub_len) + /* sha1sum:7199385abb4c2cc81c83a151a7599b6368e92343 tahomabd.ttf from Windows 10 */ + || (1006 == gdef_len && 61740 == gpos_len && 24470 == gsub_len) + /* sha1sum:b0d36cf5a2fbe746a3dd277bffc6756a820807a7 Tahoma.ttf from Mac OS X 10.9 */ + || (832 == gdef_len && 47162 == gpos_len && 7324 == gsub_len) + /* sha1sum:12fc4538e84d461771b30c18b5eb6bd434e30fba Tahoma Bold.ttf from Mac OS X 10.9 */ + || (844 == gdef_len && 45474 == gpos_len && 7302 == gsub_len) + /* sha1sum:73da7f025b238a3f737aa1fde22577a6370f77b0 himalaya.ttf from Windows 8 */ + || (192 == gdef_len && 7254 == gpos_len && 12638 == gsub_len) + /* sha1sum:6e80fd1c0b059bbee49272401583160dc1e6a427 himalaya.ttf from Windows 8.1 */ + || (192 == gdef_len && 7254 == gpos_len && 12690 == gsub_len) + /* 8d9267aea9cd2c852ecfb9f12a6e834bfaeafe44 cantarell-fonts-0.0.21/otf/Cantarell-Regular.otf */ + /* 983988ff7b47439ab79aeaf9a45bd4a2c5b9d371 cantarell-fonts-0.0.21/otf/Cantarell-Oblique.otf */ + || (188 == gdef_len && 3852 == gpos_len && 248 == gsub_len) + /* 2c0c90c6f6087ffbfea76589c93113a9cbb0e75f cantarell-fonts-0.0.21/otf/Cantarell-Bold.otf */ + /* 55461f5b853c6da88069ffcdf7f4dd3f8d7e3e6b cantarell-fonts-0.0.21/otf/Cantarell-Bold-Oblique.otf */ + || (188 == gdef_len && 3426 == gpos_len && 264 == gsub_len) + ) + { + /* Many versions of Tahoma have bad GDEF tables that incorrectly classify some spacing marks + * such as certain IPA symbols as glyph class 3. So do older versions of Microsoft Himalaya, + * and the version of Cantarell shipped by Ubuntu 16.04. + * Nuke the GDEF tables of these fonts to avoid unwanted width-zeroing. + * See https://bugzilla.mozilla.org/show_bug.cgi?id=1279925 + * https://bugzilla.mozilla.org/show_bug.cgi?id=1279693 + * https://bugzilla.mozilla.org/show_bug.cgi?id=1279875 + */ + layout->gdef = &OT::Null(OT::GDEF); + } + } + layout->gsub_lookup_count = layout->gsub->get_lookup_count (); layout->gpos_lookup_count = layout->gpos->get_lookup_count (); @@ -130,6 +204,8 @@ } /** + * hb_ot_layout_get_glyph_class: + * * Since: 0.9.7 **/ hb_ot_layout_glyph_class_t @@ -140,6 +216,8 @@ } /** + * hb_ot_layout_get_glyphs_in_class: + * * Since: 0.9.7 **/ void @@ -365,6 +443,8 @@ } /** + * hb_ot_layout_language_get_required_feature: + * * Since: 0.9.30 **/ hb_bool_t @@ -452,6 +532,8 @@ } /** + * hb_ot_layout_feature_get_lookups: + * * Since: 0.9.7 **/ unsigned int @@ -469,6 +551,8 @@ } /** + * hb_ot_layout_table_get_lookup_count: + * * Since: 0.9.22 **/ unsigned int @@ -629,6 +713,8 @@ } /** + * hb_ot_layout_collect_lookups: + * * Since: 0.9.8 **/ void @@ -673,6 +759,8 @@ } /** + * hb_ot_layout_lookup_collect_glyphs: + * * Since: 0.9.7 **/ void @@ -721,6 +809,8 @@ } /** + * hb_ot_layout_lookup_would_substitute: + * * Since: 0.9.7 **/ hb_bool_t @@ -742,7 +832,7 @@ hb_bool_t zero_context) { if (unlikely (lookup_index >= hb_ot_layout_from_face (face)->gsub_lookup_count)) return false; - OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, zero_context); + OT::hb_would_apply_context_t c (face, glyphs, glyphs_length, (bool) zero_context); const OT::SubstLookup& l = hb_ot_layout_from_face (face)->gsub->get_lookup (lookup_index); @@ -755,13 +845,9 @@ OT::GSUB::substitute_start (font, buffer); } -void -hb_ot_layout_substitute_finish (hb_font_t *font, hb_buffer_t *buffer) -{ - OT::GSUB::substitute_finish (font, buffer); -} - /** + * hb_ot_layout_lookup_substitute_closure: + * * Since: 0.9.7 **/ void @@ -793,12 +879,20 @@ } void -hb_ot_layout_position_finish (hb_font_t *font, hb_buffer_t *buffer) +hb_ot_layout_position_finish_advances (hb_font_t *font, hb_buffer_t *buffer) { - OT::GPOS::position_finish (font, buffer); + OT::GPOS::position_finish_advances (font, buffer); +} + +void +hb_ot_layout_position_finish_offsets (hb_font_t *font, hb_buffer_t *buffer) +{ + OT::GPOS::position_finish_offsets (font, buffer); } /** + * hb_ot_layout_get_size_params: + * * Since: 0.9.10 **/ hb_bool_t @@ -882,20 +976,79 @@ }; -template <typename Obj> +struct hb_get_subtables_context_t : + OT::hb_dispatch_context_t<hb_get_subtables_context_t, hb_void_t, HB_DEBUG_APPLY> +{ + template <typename Type> + static inline bool apply_to (const void *obj, OT::hb_apply_context_t *c) + { + const Type *typed_obj = (const Type *) obj; + return typed_obj->apply (c); + } + + typedef bool (*hb_apply_func_t) (const void *obj, OT::hb_apply_context_t *c); + + struct hb_applicable_t + { + inline void init (const void *obj_, hb_apply_func_t apply_func_) + { + obj = obj_; + apply_func = apply_func_; + } + + inline bool apply (OT::hb_apply_context_t *c) const { return apply_func (obj, c); } + + private: + const void *obj; + hb_apply_func_t apply_func; + }; + + typedef hb_auto_array_t<hb_applicable_t> array_t; + + /* Dispatch interface. */ + inline const char *get_name (void) { return "GET_SUBTABLES"; } + template <typename T> + inline return_t dispatch (const T &obj) + { + hb_applicable_t *entry = array.push(); + if (likely (entry)) + entry->init (&obj, apply_to<T>); + return HB_VOID; + } + static return_t default_return_value (void) { return HB_VOID; } + bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return false; } + + hb_get_subtables_context_t (array_t &array_) : + array (array_), + debug_depth (0) {} + + array_t &array; + unsigned int debug_depth; +}; + static inline bool apply_forward (OT::hb_apply_context_t *c, - const Obj &obj, - const hb_ot_layout_lookup_accelerator_t &accel) + const hb_ot_layout_lookup_accelerator_t &accel, + const hb_get_subtables_context_t::array_t &subtables) { bool ret = false; hb_buffer_t *buffer = c->buffer; - while (buffer->idx < buffer->len) + while (buffer->idx < buffer->len && !buffer->in_error) { + bool applied = false; if (accel.may_have (buffer->cur().codepoint) && (buffer->cur().mask & c->lookup_mask) && - c->check_glyph_property (&buffer->cur(), c->lookup_props) && - obj.apply (c)) + c->check_glyph_property (&buffer->cur(), c->lookup_props)) + { + for (unsigned int i = 0; i < subtables.len; i++) + if (subtables[i].apply (c)) + { + applied = true; + break; + } + } + + if (applied) ret = true; else buffer->next_glyph (); @@ -903,11 +1056,10 @@ return ret; } -template <typename Obj> static inline bool apply_backward (OT::hb_apply_context_t *c, - const Obj &obj, - const hb_ot_layout_lookup_accelerator_t &accel) + const hb_ot_layout_lookup_accelerator_t &accel, + const hb_get_subtables_context_t::array_t &subtables) { bool ret = false; hb_buffer_t *buffer = c->buffer; @@ -915,9 +1067,15 @@ { if (accel.may_have (buffer->cur().codepoint) && (buffer->cur().mask & c->lookup_mask) && - c->check_glyph_property (&buffer->cur(), c->lookup_props) && - obj.apply (c)) - ret = true; + c->check_glyph_property (&buffer->cur(), c->lookup_props)) + { + for (unsigned int i = 0; i < subtables.len; i++) + if (subtables[i].apply (c)) + { + ret = true; + break; + } + } /* The reverse lookup doesn't "advance" cursor (for good reason). */ buffer->idx--; @@ -926,26 +1084,6 @@ return ret; } -struct hb_apply_forward_context_t : - OT::hb_dispatch_context_t<hb_apply_forward_context_t, bool, HB_DEBUG_APPLY> -{ - inline const char *get_name (void) { return "APPLY_FWD"; } - template <typename T> - inline return_t dispatch (const T &obj) { return apply_forward (c, obj, accel); } - static return_t default_return_value (void) { return false; } - bool stop_sublookup_iteration (return_t r HB_UNUSED) const { return true; } - - hb_apply_forward_context_t (OT::hb_apply_context_t *c_, - const hb_ot_layout_lookup_accelerator_t &accel_) : - c (c_), - accel (accel_), - debug_depth (0) {} - - OT::hb_apply_context_t *c; - const hb_ot_layout_lookup_accelerator_t &accel; - unsigned int debug_depth; -}; - template <typename Proxy> static inline void apply_string (OT::hb_apply_context_t *c, @@ -959,6 +1097,10 @@ c->set_lookup_props (lookup.get_props ()); + hb_get_subtables_context_t::array_t subtables; + hb_get_subtables_context_t c_get_subtables (subtables); + lookup.dispatch (&c_get_subtables); + if (likely (!lookup.is_reverse ())) { /* in/out forward substitution/positioning */ @@ -967,13 +1109,7 @@ buffer->idx = 0; bool ret; - if (lookup.get_subtable_count () == 1) - { - hb_apply_forward_context_t c_forward (c, accel); - ret = lookup.dispatch (&c_forward); - } - else - ret = apply_forward (c, lookup, accel); + ret = apply_forward (c, accel, subtables); if (ret) { if (!Proxy::inplace) @@ -989,7 +1125,7 @@ buffer->remove_output (); buffer->idx = buffer->len - 1; - apply_backward (c, lookup, accel); + apply_backward (c, accel, subtables); } } @@ -1008,25 +1144,15 @@ const stage_map_t *stage = &stages[table_index][stage_index]; for (; i < stage->last_lookup; i++) { -#if 0 - char buf[4096]; - hb_buffer_serialize_glyphs (buffer, 0, buffer->len, - buf, sizeof (buf), NULL, - font, - HB_BUFFER_SERIALIZE_FORMAT_TEXT, - Proxy::table_index == 0 ? - HB_BUFFER_SERIALIZE_FLAG_NO_POSITIONS : - HB_BUFFER_SERIALIZE_FLAG_DEFAULT); - printf ("buf: [%s]\n", buf); -#endif - unsigned int lookup_index = lookups[table_index][i].index; + if (!buffer->message (font, "start lookup %d", lookup_index)) continue; c.set_lookup_index (lookup_index); c.set_lookup_mask (lookups[table_index][i].mask); c.set_auto_zwj (lookups[table_index][i].auto_zwj); apply_string<Proxy> (&c, proxy.table.get_lookup (lookup_index), proxy.accels[lookup_index]); + (void) buffer->message (font, "end lookup %d", lookup_index); } if (stage->pause_func)
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-layout.h Tue Aug 09 16:20:02 2016 -0700 @@ -48,7 +48,7 @@ * GDEF */ -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_has_glyph_classes (hb_face_t *face); typedef enum { @@ -59,11 +59,11 @@ HB_OT_LAYOUT_GLYPH_CLASS_COMPONENT = 4 } hb_ot_layout_glyph_class_t; -hb_ot_layout_glyph_class_t +HB_EXTERN hb_ot_layout_glyph_class_t hb_ot_layout_get_glyph_class (hb_face_t *face, hb_codepoint_t glyph); -void +HB_EXTERN void hb_ot_layout_get_glyphs_in_class (hb_face_t *face, hb_ot_layout_glyph_class_t klass, hb_set_t *glyphs /* OUT */); @@ -71,7 +71,7 @@ /* Not that useful. Provides list of attach points for a glyph that a * client may want to cache */ -unsigned int +HB_EXTERN unsigned int hb_ot_layout_get_attach_points (hb_face_t *face, hb_codepoint_t glyph, unsigned int start_offset, @@ -79,7 +79,7 @@ unsigned int *point_array /* OUT */); /* Ligature caret positions */ -unsigned int +HB_EXTERN unsigned int hb_ot_layout_get_ligature_carets (hb_font_t *font, hb_direction_t direction, hb_codepoint_t glyph, @@ -96,35 +96,35 @@ #define HB_OT_LAYOUT_NO_FEATURE_INDEX 0xFFFFu #define HB_OT_LAYOUT_DEFAULT_LANGUAGE_INDEX 0xFFFFu -unsigned int +HB_EXTERN unsigned int hb_ot_layout_table_get_script_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int start_offset, unsigned int *script_count /* IN/OUT */, hb_tag_t *script_tags /* OUT */); -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_table_find_script (hb_face_t *face, hb_tag_t table_tag, hb_tag_t script_tag, unsigned int *script_index); /* Like find_script, but takes zero-terminated array of scripts to test */ -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_table_choose_script (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *script_tags, unsigned int *script_index, hb_tag_t *chosen_script); -unsigned int +HB_EXTERN unsigned int hb_ot_layout_table_get_feature_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int start_offset, unsigned int *feature_count /* IN/OUT */, hb_tag_t *feature_tags /* OUT */); -unsigned int +HB_EXTERN unsigned int hb_ot_layout_script_get_language_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, @@ -132,21 +132,21 @@ unsigned int *language_count /* IN/OUT */, hb_tag_t *language_tags /* OUT */); -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_script_find_language (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, hb_tag_t language_tag, unsigned int *language_index); -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_language_get_required_feature_index (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, unsigned int language_index, unsigned int *feature_index); -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_language_get_required_feature (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, @@ -154,7 +154,7 @@ unsigned int *feature_index, hb_tag_t *feature_tag); -unsigned int +HB_EXTERN unsigned int hb_ot_layout_language_get_feature_indexes (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, @@ -163,7 +163,7 @@ unsigned int *feature_count /* IN/OUT */, unsigned int *feature_indexes /* OUT */); -unsigned int +HB_EXTERN unsigned int hb_ot_layout_language_get_feature_tags (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, @@ -172,7 +172,7 @@ unsigned int *feature_count /* IN/OUT */, hb_tag_t *feature_tags /* OUT */); -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_language_find_feature (hb_face_t *face, hb_tag_t table_tag, unsigned int script_index, @@ -180,7 +180,7 @@ hb_tag_t feature_tag, unsigned int *feature_index); -unsigned int +HB_EXTERN unsigned int hb_ot_layout_feature_get_lookups (hb_face_t *face, hb_tag_t table_tag, unsigned int feature_index, @@ -188,12 +188,12 @@ unsigned int *lookup_count /* IN/OUT */, unsigned int *lookup_indexes /* OUT */); -unsigned int +HB_EXTERN unsigned int hb_ot_layout_table_get_lookup_count (hb_face_t *face, hb_tag_t table_tag); -void +HB_EXTERN void hb_ot_layout_collect_lookups (hb_face_t *face, hb_tag_t table_tag, const hb_tag_t *scripts, @@ -201,7 +201,7 @@ const hb_tag_t *features, hb_set_t *lookup_indexes /* OUT */); -void +HB_EXTERN void hb_ot_layout_lookup_collect_glyphs (hb_face_t *face, hb_tag_t table_tag, unsigned int lookup_index, @@ -228,7 +228,7 @@ const hb_ot_layout_glyph_sequence_t *sequence, void *user_data); -void +HB_EXTERN void Xhb_ot_layout_lookup_enumerate_sequences (hb_face_t *face, hb_tag_t table_tag, unsigned int lookup_index, @@ -241,17 +241,17 @@ * GSUB */ -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_has_substitution (hb_face_t *face); -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_lookup_would_substitute (hb_face_t *face, unsigned int lookup_index, const hb_codepoint_t *glyphs, unsigned int glyphs_length, hb_bool_t zero_context); -void +HB_EXTERN void hb_ot_layout_lookup_substitute_closure (hb_face_t *face, unsigned int lookup_index, hb_set_t *glyphs @@ -259,7 +259,7 @@ #ifdef HB_NOT_IMPLEMENTED /* Note: You better have GDEF when using this API, or marks won't do much. */ -hb_bool_t +HB_EXTERN hb_bool_t Xhb_ot_layout_lookup_substitute (hb_font_t *font, unsigned int lookup_index, const hb_ot_layout_glyph_sequence_t *sequence, @@ -274,12 +274,12 @@ * GPOS */ -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_has_positioning (hb_face_t *face); #ifdef HB_NOT_IMPLEMENTED /* Note: You better have GDEF when using this API, or marks won't do much. */ -hb_bool_t +HB_EXTERN hb_bool_t Xhb_ot_layout_lookup_position (hb_font_t *font, unsigned int lookup_index, const hb_ot_layout_glyph_sequence_t *sequence, @@ -288,7 +288,7 @@ /* Optical 'size' feature info. Returns true if found. * http://www.microsoft.com/typography/otspec/features_pt.htm#size */ -hb_bool_t +HB_EXTERN hb_bool_t hb_ot_layout_get_size_params (hb_face_t *face, unsigned int *design_size, /* OUT. May be NULL */ unsigned int *subfamily_id, /* OUT. May be NULL */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -159,23 +159,9 @@ F_MANUAL_ZWJ = 0x0004u, /* Don't skip over ZWJ when matching. */ F_GLOBAL_SEARCH = 0x0008u /* If feature not found in LangSys, look for it in global feature list and pick one. */ }; +HB_MARK_AS_FLAG_T (hb_ot_map_feature_flags_t); /* Macro version for where const is desired. */ #define F_COMBINE(l,r) (hb_ot_map_feature_flags_t ((unsigned int) (l) | (unsigned int) (r))) -static inline hb_ot_map_feature_flags_t -operator | (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r) -{ return hb_ot_map_feature_flags_t ((unsigned int) l | (unsigned int) r); } -static inline hb_ot_map_feature_flags_t -operator & (hb_ot_map_feature_flags_t l, hb_ot_map_feature_flags_t r) -{ return hb_ot_map_feature_flags_t ((unsigned int) l & (unsigned int) r); } -static inline hb_ot_map_feature_flags_t -operator ~ (hb_ot_map_feature_flags_t r) -{ return hb_ot_map_feature_flags_t (~(unsigned int) r); } -static inline hb_ot_map_feature_flags_t& -operator |= (hb_ot_map_feature_flags_t &l, hb_ot_map_feature_flags_t r) -{ l = l | r; return l; } -static inline hb_ot_map_feature_flags_t& -operator &= (hb_ot_map_feature_flags_t& l, hb_ot_map_feature_flags_t r) -{ l = l & r; return l; } struct hb_ot_map_builder_t @@ -217,7 +203,8 @@ unsigned int stage[2]; /* GSUB/GPOS */ static int cmp (const feature_info_t *a, const feature_info_t *b) - { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) : (a->seq < b->seq ? -1 : 1); } + { return (a->tag != b->tag) ? (a->tag < b->tag ? -1 : 1) : + (a->seq < b->seq ? -1 : a->seq > b->seq ? 1 : 0); } }; struct stage_info_t {
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-map.cc Tue Aug 09 16:20:02 2016 -0700 @@ -89,7 +89,7 @@ for (unsigned int table_index = 0; table_index < 2; table_index++) { hb_tag_t table_tag = table_tags[table_index]; - found_script[table_index] = hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]); + found_script[table_index] = (bool) hb_ot_layout_table_choose_script (face, table_tag, script_tags, &script_index[table_index], &chosen_script[table_index]); hb_ot_layout_script_find_language (face, table_tag, script_index[table_index], language_tag, &language_index[table_index]); } } @@ -204,11 +204,8 @@ for (unsigned int table_index = 0; table_index < 2; table_index++) { if (required_feature_tag[table_index] == info->tag) - { required_feature_stage[table_index] = info->stage[table_index]; - found = true; - continue; - } + found |= hb_ot_layout_language_find_feature (face, table_tags[table_index], script_index[table_index],
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-maxp-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -58,7 +58,7 @@ /* We only implement version 0.5 as none of the extra fields in version 1.0 are useful. */ protected: - FixedVersion version; /* Version of the maxp table (0.5 or 1.0), + FixedVersion<>version; /* Version of the maxp table (0.5 or 1.0), * 0x00005000u or 0x00010000u. */ USHORT numGlyphs; /* The number of glyphs in the font. */ public:
--- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-os2-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -0,0 +1,105 @@ +/* + * Copyright © 2011,2012 Google, Inc. + * + * This is part of HarfBuzz, a text shaping library. + * + * Permission is hereby granted, without written agreement and without + * license or royalty fees, to use, copy, modify, and distribute this + * software and its documentation for any purpose, provided that the + * above copyright notice and the following two paragraphs appear in + * all copies of this software. + * + * IN NO EVENT SHALL THE COPYRIGHT HOLDER BE LIABLE TO ANY PARTY FOR + * DIRECT, INDIRECT, SPECIAL, INCIDENTAL, OR CONSEQUENTIAL DAMAGES + * ARISING OUT OF THE USE OF THIS SOFTWARE AND ITS DOCUMENTATION, EVEN + * IF THE COPYRIGHT HOLDER HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH + * DAMAGE. + * + * THE COPYRIGHT HOLDER SPECIFICALLY DISCLAIMS ANY WARRANTIES, INCLUDING, + * BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND + * FITNESS FOR A PARTICULAR PURPOSE. THE SOFTWARE PROVIDED HEREUNDER IS + * ON AN "AS IS" BASIS, AND THE COPYRIGHT HOLDER HAS NO OBLIGATION TO + * PROVIDE MAINTENANCE, SUPPORT, UPDATES, ENHANCEMENTS, OR MODIFICATIONS. + * + * Google Author(s): Behdad Esfahbod + */ + +#ifndef HB_OT_OS2_TABLE_HH +#define HB_OT_OS2_TABLE_HH + +#include "hb-open-type-private.hh" + + +namespace OT { + +/* + * OS/2 and Windows Metrics + * http://www.microsoft.com/typography/otspec/os2.htm + */ + +#define HB_OT_TAG_os2 HB_TAG('O','S','/','2') + +struct os2 +{ + static const hb_tag_t tableTag = HB_OT_TAG_os2; + + inline bool sanitize (hb_sanitize_context_t *c) const + { + TRACE_SANITIZE (this); + return_trace (c->check_struct (this)); + } + + public: + USHORT version; + + /* Version 0 */ + SHORT xAvgCharWidth; + USHORT usWeightClass; + USHORT usWidthClass; + USHORT fsType; + SHORT ySubscriptXSize; + SHORT ySubscriptYSize; + SHORT ySubscriptXOffset; + SHORT ySubscriptYOffset; + SHORT ySuperscriptXSize; + SHORT ySuperscriptYSize; + SHORT ySuperscriptXOffset; + SHORT ySuperscriptYOffset; + SHORT yStrikeoutSize; + SHORT yStrikeoutPosition; + SHORT sFamilyClass; + BYTE panose[10]; + ULONG ulUnicodeRange[4]; + Tag achVendID; + USHORT fsSelection; + USHORT usFirstCharIndex; + USHORT usLastCharIndex; + SHORT sTypoAscender; + SHORT sTypoDescender; + SHORT sTypoLineGap; + USHORT usWinAscent; + USHORT usWinDescent; + + /* Version 1 */ + //ULONG ulCodePageRange1; + //ULONG ulCodePageRange2; + + /* Version 2 */ + //SHORT sxHeight; + //SHORT sCapHeight; + //USHORT usDefaultChar; + //USHORT usBreakChar; + //USHORT usMaxContext; + + /* Version 5 */ + //USHORT usLowerOpticalPointSize; + //USHORT usUpperOpticalPointSize; + + public: + DEFINE_SIZE_STATIC (78); +}; + +} /* namespace OT */ + + +#endif /* HB_OT_OS2_TABLE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic-table.hh Tue Aug 09 16:20:02 2016 -0700 @@ -6,10 +6,10 @@ * * on files with these headers: * - * # ArabicShaping-8.0.0.txt - * # Date: 2015-02-17, 23:33:00 GMT [RP] - * # Blocks-8.0.0.txt - * # Date: 2014-11-10, 23:04:00 GMT [KW] + * # ArabicShaping-9.0.0.txt + * # Date: 2016-02-24, 22:25:00 GMT [RP] + * # Blocks-9.0.0.txt + * # Date: 2016-02-05, 23:48:00 GMT [KW] * UnicodeData.txt does not have a header. */ @@ -19,6 +19,7 @@ #define X JOINING_TYPE_X #define R JOINING_TYPE_R +#define T JOINING_TYPE_T #define U JOINING_TYPE_U #define A JOINING_GROUP_ALAPH #define DR JOINING_GROUP_DALATH_RISH @@ -76,9 +77,11 @@ /* Arabic Extended-A */ - /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D, + /* 08A0 */ D,D,D,D,D,D,D,D,D,D,R,R,R,U,R,D,D,R,R,D,D,X,D,D,D,R,D,D,D,D,X,X, + /* 08C0 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, + /* 08E0 */ X,X,U, -#define joining_offset_0x1806u 693 +#define joining_offset_0x1806u 739 /* Mongolian */ @@ -86,43 +89,48 @@ /* 1820 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, /* 1840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, /* 1860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,X,X,X,X,X,X,X,X, - /* 1880 */ U,U,U,U,U,U,U,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, + /* 1880 */ U,U,U,U,U,T,T,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, /* 18A0 */ D,D,D,D,D,D,D,D,D,X,D, -#define joining_offset_0x200cu 858 +#define joining_offset_0x200cu 904 /* General Punctuation */ - /* 2000 */ U,C, - -#define joining_offset_0x2066u 860 + /* 2000 */ U,C,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, + /* 2020 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,U,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, + /* 2040 */ X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X,X, + /* 2060 */ X,X,X,X,X,X,U,U,U,U, - /* General Punctuation */ - - /* 2060 */ U,U,U,U, - -#define joining_offset_0xa840u 864 +#define joining_offset_0xa840u 998 /* Phags-pa */ /* A840 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, /* A860 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,L,U, -#define joining_offset_0x10ac0u 916 +#define joining_offset_0x10ac0u 1050 /* Manichaean */ /* 10AC0 */ D,D,D,D,D,R,U,R,U,R,R,U,U,L,R,R,R,R,R,D,D,D,D,L,D,D,D,D,D,R,D,D, /* 10AE0 */ D,R,U,U,R,X,X,X,X,X,X,D,D,D,D,R, -#define joining_offset_0x10b80u 964 +#define joining_offset_0x10b80u 1098 /* Psalter Pahlavi */ /* 10B80 */ D,R,D,R,R,R,D,D,D,R,D,D,R,D,R,R,D,R,X,X,X,X,X,X,X,X,X,X,X,X,X,X, /* 10BA0 */ X,X,X,X,X,X,X,X,X,R,R,R,R,D,D,U, -}; /* Table items: 1012; occupancy: 57% */ +#define joining_offset_0x1e900u 1146 + + /* Adlam */ + + /* 1E900 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, + /* 1E920 */ D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D,D, + /* 1E940 */ D,D,D,D, + +}; /* Table items: 1214; occupancy: 54% */ static unsigned int @@ -131,7 +139,7 @@ switch (u >> 12) { case 0x0u: - if (hb_in_range (u, 0x0600u, 0x08B4u)) return joining_table[u - 0x0600u + joining_offset_0x0600u]; + if (hb_in_range (u, 0x0600u, 0x08E2u)) return joining_table[u - 0x0600u + joining_offset_0x0600u]; break; case 0x1u: @@ -139,8 +147,7 @@ break; case 0x2u: - if (hb_in_range (u, 0x200Cu, 0x200Du)) return joining_table[u - 0x200Cu + joining_offset_0x200cu]; - if (hb_in_range (u, 0x2066u, 0x2069u)) return joining_table[u - 0x2066u + joining_offset_0x2066u]; + if (hb_in_range (u, 0x200Cu, 0x2069u)) return joining_table[u - 0x200Cu + joining_offset_0x200cu]; break; case 0xAu: @@ -152,6 +159,10 @@ if (hb_in_range (u, 0x10B80u, 0x10BAFu)) return joining_table[u - 0x10B80u + joining_offset_0x10b80u]; break; + case 0x1Eu: + if (hb_in_range (u, 0x1E900u, 0x1E943u)) return joining_table[u - 0x1E900u + joining_offset_0x1e900u]; + break; + default: break; } @@ -160,6 +171,7 @@ #undef X #undef R +#undef T #undef U #undef A #undef DR
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-arabic.cc Tue Aug 09 16:20:02 2016 -0700 @@ -28,9 +28,38 @@ #include "hb-ot-shape-private.hh" +#ifndef HB_DEBUG_ARABIC +#define HB_DEBUG_ARABIC (HB_DEBUG+0) +#endif + + /* buffer var allocations */ #define arabic_shaping_action() complex_var_u8_0() /* arabic shaping action */ +#define HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH HB_BUFFER_SCRATCH_FLAG_COMPLEX0 + +/* See: + * https://github.com/behdad/harfbuzz/commit/6e6f82b6f3dde0fc6c3c7d991d9ec6cfff57823d#commitcomment-14248516 */ +#define HB_ARABIC_GENERAL_CATEGORY_IS_WORD(gen_cat) \ + (FLAG_SAFE (gen_cat) & \ + (FLAG (HB_UNICODE_GENERAL_CATEGORY_UNASSIGNED) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_PRIVATE_USE) | \ + /*FLAG (HB_UNICODE_GENERAL_CATEGORY_LOWERCASE_LETTER) |*/ \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_LETTER) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_LETTER) | \ + /*FLAG (HB_UNICODE_GENERAL_CATEGORY_TITLECASE_LETTER) |*/ \ + /*FLAG (HB_UNICODE_GENERAL_CATEGORY_UPPERCASE_LETTER) |*/ \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_DECIMAL_NUMBER) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_LETTER_NUMBER) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_NUMBER) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_CURRENCY_SYMBOL) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_MATH_SYMBOL) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_OTHER_SYMBOL))) + /* * Joining types: @@ -84,7 +113,7 @@ /* Same order as the feature array */ -enum { +enum arabic_action_t { ISOL, FINA, FIN2, @@ -95,7 +124,11 @@ NONE, - ARABIC_NUM_FEATURES = NONE + ARABIC_NUM_FEATURES = NONE, + + /* We abuse the same byte for other things... */ + STCH_FIXED, + STCH_REPEATING, }; static const struct arabic_state_table_entry { @@ -140,6 +173,11 @@ hb_buffer_t *buffer); static void +record_stch (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); + +static void collect_features_arabic (hb_ot_shape_planner_t *plan) { hb_ot_map_builder_t *map = &plan->map; @@ -165,6 +203,9 @@ map->add_gsub_pause (nuke_joiners); + map->add_global_bool_feature (HB_TAG('s','t','c','h')); + map->add_gsub_pause (record_stch); + map->add_global_bool_feature (HB_TAG('c','c','m','p')); map->add_global_bool_feature (HB_TAG('l','o','c','l')); @@ -182,7 +223,6 @@ map->add_gsub_pause (arabic_fallback_shape); map->add_global_bool_feature (HB_TAG('c','a','l','t')); - map->add_gsub_pause (NULL); /* The spec includes 'cswh'. Earlier versions of Windows * used to enable this by default, but testing suggests @@ -192,6 +232,7 @@ * Note that IranNastaliq uses this feature extensively * to fixup broken glyph sequences. Oh well... * Test case: U+0643,U+0640,U+0631. */ + //map->add_gsub_pause (NULL); //map->add_global_bool_feature (HB_TAG('c','s','w','h')); map->add_global_bool_feature (HB_TAG('m','s','e','t')); } @@ -208,8 +249,10 @@ * mask_array[NONE] == 0. */ hb_mask_t mask_array[ARABIC_NUM_FEATURES + 1]; - bool do_fallback; arabic_fallback_plan_t *fallback_plan; + + unsigned int do_fallback : 1; + unsigned int has_stch : 1; }; void * @@ -220,6 +263,7 @@ return NULL; arabic_plan->do_fallback = plan->props.script == HB_SCRIPT_ARABIC; + arabic_plan->has_stch = !!plan->map.get_1_mask (HB_TAG ('s','t','c','h')); for (unsigned int i = 0; i < ARABIC_NUM_FEATURES; i++) { arabic_plan->mask_array[i] = plan->map.get_1_mask (arabic_features[i]); arabic_plan->do_fallback = arabic_plan->do_fallback && @@ -320,8 +364,6 @@ hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) info[i].mask |= arabic_plan->mask_array[info[i].arabic_shaping_action()]; - - HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action); } static void @@ -371,6 +413,197 @@ arabic_fallback_plan_shape (fallback_plan, font, buffer); } +/* + * Stretch feature: "stch". + * See example here: + * https://www.microsoft.com/typography/OpenTypeDev/syriac/intro.htm + * We implement this in a generic way, such that the Arabic subtending + * marks can use it as well. + */ + +static void +record_stch (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) +{ + const arabic_shape_plan_t *arabic_plan = (const arabic_shape_plan_t *) plan->data; + if (!arabic_plan->has_stch) + return; + + /* 'stch' feature was just applied. Look for anything that multiplied, + * and record it for stch treatment later. Note that rtlm, frac, etc + * are applied before stch, but we assume that they didn't result in + * anything multiplying into 5 pieces, so it's safe-ish... */ + + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + for (unsigned int i = 0; i < count; i++) + if (unlikely (_hb_glyph_info_multiplied (&info[i]))) + { + unsigned int comp = _hb_glyph_info_get_lig_comp (&info[i]); + info[i].arabic_shaping_action() = comp % 2 ? STCH_REPEATING : STCH_FIXED; + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH; + } +} + +static void +apply_stch (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + hb_font_t *font) +{ + if (likely (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_ARABIC_HAS_STCH))) + return; + + /* The Arabic shaper currently always processes in RTL mode, so we should + * stretch / position the stretched pieces to the left / preceding glyphs. */ + + /* We do a two pass implementation: + * First pass calculates the exact number of extra glyphs we need, + * We then enlarge buffer to have that much room, + * Second pass applies the stretch, copying things to the end of buffer. + */ + + int sign = font->x_scale < 0 ? -1 : +1; + unsigned int extra_glyphs_needed = 0; // Set during MEASURE, used during CUT + typedef enum { MEASURE, CUT } step_t; + + for (step_t step = MEASURE; step <= CUT; step = (step_t) (step + 1)) + { + unsigned int count = buffer->len; + hb_glyph_info_t *info = buffer->info; + hb_glyph_position_t *pos = buffer->pos; + unsigned int new_len = count + extra_glyphs_needed; // write head during CUT + unsigned int j = new_len; + for (unsigned int i = count; i; i--) + { + if (!hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING)) + { + if (step == CUT) + { + --j; + info[j] = info[i - 1]; + pos[j] = pos[i - 1]; + } + continue; + } + + /* Yay, justification! */ + + hb_position_t w_total = 0; // Total to be filled + hb_position_t w_fixed = 0; // Sum of fixed tiles + hb_position_t w_repeating = 0; // Sum of repeating tiles + int n_fixed = 0; + int n_repeating = 0; + + unsigned int end = i; + while (i && + hb_in_range<unsigned> (info[i - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING)) + { + i--; + hb_position_t width = font->get_glyph_h_advance (info[i].codepoint); + if (info[i].arabic_shaping_action() == STCH_FIXED) + { + w_fixed += width; + n_fixed++; + } + else + { + w_repeating += width; + n_repeating++; + } + } + unsigned int start = i; + unsigned int context = i; + while (context && + !hb_in_range<unsigned> (info[context - 1].arabic_shaping_action(), STCH_FIXED, STCH_REPEATING) && + (_hb_glyph_info_is_default_ignorable (&info[context - 1]) || + HB_ARABIC_GENERAL_CATEGORY_IS_WORD (_hb_glyph_info_get_general_category (&info[context - 1])))) + { + context--; + w_total += pos[context].x_advance; + } + i++; // Don't touch i again. + + DEBUG_MSG (ARABIC, NULL, "%s stretch at (%d,%d,%d)", + step == MEASURE ? "measuring" : "cutting", context, start, end); + DEBUG_MSG (ARABIC, NULL, "rest of word: count=%d width %d", start - context, w_total); + DEBUG_MSG (ARABIC, NULL, "fixed tiles: count=%d width=%d", n_fixed, w_fixed); + DEBUG_MSG (ARABIC, NULL, "repeating tiles: count=%d width=%d", n_repeating, w_repeating); + + /* Number of additional times to repeat each repeating tile. */ + int n_copies = 0; + + hb_position_t w_remaining = w_total - w_fixed; + if (sign * w_remaining > sign * w_repeating && sign * w_repeating > 0) + n_copies = (sign * w_remaining) / (sign * w_repeating) - 1; + + /* See if we can improve the fit by adding an extra repeat and squeezing them together a bit. */ + hb_position_t extra_repeat_overlap = 0; + hb_position_t shortfall = sign * w_remaining - sign * w_repeating * (n_copies + 1); + if (shortfall > 0) + { + ++n_copies; + hb_position_t excess = (n_copies + 1) * sign * w_repeating - sign * w_remaining; + if (excess > 0) + extra_repeat_overlap = excess / (n_copies * n_repeating); + } + + if (step == MEASURE) + { + extra_glyphs_needed += n_copies * n_repeating; + DEBUG_MSG (ARABIC, NULL, "will add extra %d copies of repeating tiles", n_copies); + } + else + { + hb_position_t x_offset = 0; + for (unsigned int k = end; k > start; k--) + { + hb_position_t width = font->get_glyph_h_advance (info[k - 1].codepoint); + + unsigned int repeat = 1; + if (info[k - 1].arabic_shaping_action() == STCH_REPEATING) + repeat += n_copies; + + DEBUG_MSG (ARABIC, NULL, "appending %d copies of glyph %d; j=%d", + repeat, info[k - 1].codepoint, j); + for (unsigned int n = 0; n < repeat; n++) + { + x_offset -= width; + if (n > 0) + x_offset += extra_repeat_overlap; + pos[k - 1].x_offset = x_offset; + /* Append copy. */ + --j; + info[j] = info[k - 1]; + pos[j] = pos[k - 1]; + } + } + } + } + + if (step == MEASURE) + { + if (unlikely (!buffer->ensure (count + extra_glyphs_needed))) + break; + } + else + { + assert (j == 0); + buffer->len = new_len; + } + } +} + + +static void +postprocess_glyphs_arabic (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + hb_font_t *font) +{ + apply_stch (plan, buffer, font); + + HB_BUFFER_DEALLOCATE_VAR (buffer, arabic_shaping_action); +} const hb_ot_complex_shaper_t _hb_ot_complex_shaper_arabic = { @@ -379,7 +612,8 @@ NULL, /* override_features */ data_create_arabic, data_destroy_arabic, - NULL, /* preprocess_text_arabic */ + NULL, /* preprocess_text */ + postprocess_glyphs_arabic, HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ NULL, /* compose */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-default.cc Tue Aug 09 16:20:02 2016 -0700 @@ -35,10 +35,11 @@ NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ NULL, /* compose */ NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ };
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hangul.cc Tue Aug 09 16:20:02 2016 -0700 @@ -188,7 +188,7 @@ */ unsigned int count = buffer->len; - for (buffer->idx = 0; buffer->idx < count;) + for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;) { hb_codepoint_t u = buffer->cur().codepoint; @@ -411,13 +411,14 @@ "hangul", collect_features_hangul, override_features_hangul, - data_create_hangul, /* data_create */ - data_destroy_hangul, /* data_destroy */ + data_create_hangul, + data_destroy_hangul, preprocess_text_hangul, + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_NONE, NULL, /* decompose */ NULL, /* compose */ - setup_masks_hangul, /* setup_masks */ + setup_masks_hangul, HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, false, /* fallback_position */ };
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-hebrew.cc Tue Aug 09 16:20:02 2016 -0700 @@ -68,7 +68,7 @@ 0xFB4Au /* TAV */ }; - bool found = c->unicode->compose (a, b, ab); + bool found = (bool) c->unicode->compose (a, b, ab); if (!found && !c->plan->has_mark) { @@ -163,6 +163,7 @@ NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ compose_hebrew,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-machine.hh Tue Aug 09 16:20:02 2016 -0700 @@ -56,52 +56,52 @@ 5u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 5u, 8u, 5u, 7u, 7u, 7u, 8u, 8u, 1u, 16u, 8u, 13u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, 16u, 16u, 4u, 8u, 6u, 6u, - 16u, 16u, 8u, 8u, 1u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, - 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, - 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 31u, 3u, 31u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, + 16u, 16u, 8u, 8u, 1u, 18u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, + 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 4u, 14u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, - 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, - 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, 5u, 10u, + 5u, 14u, 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, + 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, + 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 3u, 17u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, + 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, + 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 4u, 14u, 3u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, - 3u, 31u, 4u, 31u, 1u, 16u, 3u, 31u, 3u, 31u, 4u, 31u, 5u, 14u, 5u, 14u, - 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, - 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, + 3u, 14u, 1u, 16u, 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, + 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, + 1u, 16u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 1u, 16u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, + 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, + 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, + 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, + 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, + 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, + 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 4u, 14u, 3u, 17u, 4u, 14u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 1u, 16u, + 3u, 17u, 3u, 17u, 4u, 17u, 5u, 14u, 5u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, + 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, + 3u, 13u, 3u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, + 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 1u, 16u, + 4u, 14u, 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, + 3u, 17u, 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, + 3u, 17u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 3u, 17u, + 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 17u, 1u, 17u, 3u, 17u, + 1u, 17u, 4u, 14u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, + 5u, 10u, 1u, 16u, 3u, 17u, 3u, 17u, 4u, 17u, 3u, 17u, 3u, 17u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, - 5u, 14u, 3u, 14u, 1u, 16u, 4u, 31u, 4u, 14u, 3u, 31u, 3u, 31u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 1u, 16u, 3u, 31u, 3u, 31u, 1u, 16u, 1u, 16u, 1u, 16u, 1u, 16u, - 1u, 16u, 3u, 31u, 1u, 31u, 3u, 31u, 1u, 31u, 4u, 14u, 5u, 10u, 9u, 10u, - 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 1u, 16u, 3u, 31u, 3u, 31u, - 4u, 31u, 3u, 31u, 3u, 31u, 1u, 16u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, - 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, - 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, - 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, 9u, 10u, 9u, 9u, 5u, 10u, 0 + 5u, 14u, 3u, 14u, 4u, 14u, 5u, 14u, 3u, 13u, 3u, 10u, 5u, 10u, 3u, 10u, + 3u, 13u, 1u, 16u, 3u, 10u, 5u, 10u, 5u, 10u, 9u, 10u, 9u, 9u, 9u, 10u, + 9u, 10u, 9u, 9u, 5u, 10u, 0 }; static const char _indic_syllable_machine_key_spans[] = { @@ -127,52 +127,52 @@ 3, 4, 3, 1, 4, 3, 1, 4, 3, 1, 1, 16, 6, 5, 1, 1, 5, 1, 1, 5, 1, 1, 5, 1, - 1, 1, 31, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 10, 10, - 6, 2, 1, 2, 2, 1, 6, 11, - 8, 6, 8, 11, 12, 12, 11, 10, - 12, 11, 10, 12, 11, 10, 12, 11, - 10, 12, 16, 28, 11, 29, 29, 16, - 16, 16, 16, 16, 29, 29, 16, 16, - 16, 16, 16, 29, 29, 16, 16, 16, - 16, 16, 29, 29, 16, 16, 16, 16, - 16, 29, 29, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 10, 10, + 1, 1, 18, 15, 15, 14, 16, 15, + 15, 14, 16, 15, 15, 14, 16, 15, + 15, 14, 16, 15, 15, 14, 10, 10, 6, 2, 1, 2, 2, 1, 6, 11, 8, 6, 8, 11, 12, 12, 11, 10, 12, 11, 10, 12, 11, 10, 12, 11, - 10, 12, 16, 28, 11, 29, 29, 16, - 16, 16, 16, 16, 29, 29, 16, 16, - 16, 16, 16, 29, 29, 16, 16, 16, - 16, 16, 29, 29, 16, 16, 16, 16, - 11, 16, 29, 29, 28, 16, 29, 29, - 28, 16, 29, 29, 28, 16, 29, 29, - 28, 16, 29, 29, 28, 10, 10, 6, + 10, 12, 16, 11, 15, 15, 16, 16, + 16, 16, 16, 15, 15, 16, 16, 16, + 16, 16, 15, 15, 16, 16, 16, 16, + 16, 15, 15, 16, 16, 16, 16, 16, + 15, 15, 15, 15, 14, 16, 15, 15, + 14, 16, 15, 15, 14, 16, 15, 15, + 14, 16, 15, 15, 14, 10, 10, 6, 2, 1, 2, 2, 1, 6, 11, 8, 6, 8, 11, 12, 12, 11, 10, 12, 11, 10, 12, 11, 10, 12, 11, 10, - 12, 16, 28, 11, 29, 29, 16, 16, - 16, 16, 16, 29, 29, 16, 16, 16, - 16, 16, 29, 29, 16, 16, 16, 16, - 16, 29, 29, 16, 16, 16, 16, 16, - 11, 29, 11, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 16, 29, - 29, 28, 16, 29, 29, 28, 10, 10, - 6, 2, 1, 2, 2, 1, 6, 11, - 8, 6, 8, 11, 12, 12, 11, 10, + 12, 16, 11, 15, 15, 16, 16, 16, + 16, 16, 15, 15, 16, 16, 16, 16, + 16, 15, 15, 16, 16, 16, 16, 16, + 15, 15, 16, 16, 16, 16, 11, 16, + 15, 15, 14, 16, 15, 15, 14, 16, + 15, 15, 14, 16, 15, 15, 14, 16, + 15, 15, 14, 10, 10, 6, 2, 1, + 2, 2, 1, 6, 11, 8, 6, 8, + 11, 12, 12, 11, 10, 12, 11, 10, + 12, 11, 10, 12, 11, 10, 12, 16, + 11, 15, 15, 16, 16, 16, 16, 16, + 15, 15, 16, 16, 16, 16, 16, 15, + 15, 16, 16, 16, 16, 16, 15, 15, + 16, 16, 16, 16, 16, 11, 15, 11, + 15, 15, 14, 16, 15, 15, 14, 16, + 15, 15, 14, 16, 15, 15, 14, 16, + 15, 15, 14, 10, 10, 6, 2, 1, + 2, 2, 1, 6, 11, 8, 6, 8, + 11, 12, 12, 11, 10, 12, 11, 10, + 12, 11, 10, 12, 11, 10, 12, 16, + 11, 15, 15, 16, 16, 16, 16, 16, + 15, 15, 16, 16, 16, 16, 16, 15, + 15, 16, 16, 16, 16, 16, 15, 15, + 16, 16, 16, 16, 16, 15, 17, 15, + 17, 11, 6, 2, 1, 2, 2, 1, + 6, 16, 15, 15, 14, 15, 15, 16, 12, 11, 10, 12, 11, 10, 12, 11, - 10, 12, 16, 28, 11, 29, 29, 16, - 16, 16, 16, 16, 29, 29, 16, 16, - 16, 16, 16, 29, 29, 16, 16, 16, - 16, 16, 29, 29, 16, 16, 16, 16, - 16, 29, 31, 29, 31, 11, 6, 2, - 1, 2, 2, 1, 6, 16, 29, 29, - 28, 29, 29, 16, 12, 11, 10, 12, - 11, 10, 12, 11, 10, 12, 11, 10, - 11, 8, 6, 8, 11, 16, 8, 6, - 6, 2, 1, 2, 2, 1, 6 + 10, 12, 11, 10, 11, 8, 6, 8, + 11, 16, 8, 6, 6, 2, 1, 2, + 2, 1, 6 }; static const short _indic_syllable_machine_index_offsets[] = { @@ -198,52 +198,52 @@ 954, 958, 963, 967, 969, 974, 978, 980, 985, 989, 991, 993, 1010, 1017, 1023, 1025, 1027, 1033, 1035, 1037, 1043, 1045, 1047, 1053, - 1055, 1057, 1059, 1091, 1121, 1151, 1180, 1197, - 1227, 1257, 1286, 1303, 1333, 1363, 1392, 1409, - 1439, 1469, 1498, 1515, 1545, 1575, 1604, 1615, - 1626, 1633, 1636, 1638, 1641, 1644, 1646, 1653, - 1665, 1674, 1681, 1690, 1702, 1715, 1728, 1740, - 1751, 1764, 1776, 1787, 1800, 1812, 1823, 1836, - 1848, 1859, 1872, 1889, 1918, 1930, 1960, 1990, - 2007, 2024, 2041, 2058, 2075, 2105, 2135, 2152, - 2169, 2186, 2203, 2220, 2250, 2280, 2297, 2314, - 2331, 2348, 2365, 2395, 2425, 2442, 2459, 2476, - 2493, 2510, 2540, 2570, 2600, 2630, 2659, 2676, - 2706, 2736, 2765, 2782, 2812, 2842, 2871, 2888, - 2918, 2948, 2977, 2994, 3024, 3054, 3083, 3094, - 3105, 3112, 3115, 3117, 3120, 3123, 3125, 3132, - 3144, 3153, 3160, 3169, 3181, 3194, 3207, 3219, - 3230, 3243, 3255, 3266, 3279, 3291, 3302, 3315, - 3327, 3338, 3351, 3368, 3397, 3409, 3439, 3469, - 3486, 3503, 3520, 3537, 3554, 3584, 3614, 3631, - 3648, 3665, 3682, 3699, 3729, 3759, 3776, 3793, - 3810, 3827, 3844, 3874, 3904, 3921, 3938, 3955, - 3972, 3984, 4001, 4031, 4061, 4090, 4107, 4137, - 4167, 4196, 4213, 4243, 4273, 4302, 4319, 4349, - 4379, 4408, 4425, 4455, 4485, 4514, 4525, 4536, - 4543, 4546, 4548, 4551, 4554, 4556, 4563, 4575, - 4584, 4591, 4600, 4612, 4625, 4638, 4650, 4661, - 4674, 4686, 4697, 4710, 4722, 4733, 4746, 4758, - 4769, 4782, 4799, 4828, 4840, 4870, 4900, 4917, - 4934, 4951, 4968, 4985, 5015, 5045, 5062, 5079, - 5096, 5113, 5130, 5160, 5190, 5207, 5224, 5241, - 5258, 5275, 5305, 5335, 5352, 5369, 5386, 5403, - 5420, 5432, 5462, 5474, 5504, 5534, 5563, 5580, - 5610, 5640, 5669, 5686, 5716, 5746, 5775, 5792, - 5822, 5852, 5881, 5898, 5928, 5958, 5987, 5998, - 6009, 6016, 6019, 6021, 6024, 6027, 6029, 6036, - 6048, 6057, 6064, 6073, 6085, 6098, 6111, 6123, - 6134, 6147, 6159, 6170, 6183, 6195, 6206, 6219, - 6231, 6242, 6255, 6272, 6301, 6313, 6343, 6373, - 6390, 6407, 6424, 6441, 6458, 6488, 6518, 6535, - 6552, 6569, 6586, 6603, 6633, 6663, 6680, 6697, - 6714, 6731, 6748, 6778, 6808, 6825, 6842, 6859, - 6876, 6893, 6923, 6955, 6985, 7017, 7029, 7036, - 7039, 7041, 7044, 7047, 7049, 7056, 7073, 7103, - 7133, 7162, 7192, 7222, 7239, 7252, 7264, 7275, - 7288, 7300, 7311, 7324, 7336, 7347, 7360, 7372, - 7383, 7395, 7404, 7411, 7420, 7432, 7449, 7458, - 7465, 7472, 7475, 7477, 7480, 7483, 7485 + 1055, 1057, 1059, 1078, 1094, 1110, 1125, 1142, + 1158, 1174, 1189, 1206, 1222, 1238, 1253, 1270, + 1286, 1302, 1317, 1334, 1350, 1366, 1381, 1392, + 1403, 1410, 1413, 1415, 1418, 1421, 1423, 1430, + 1442, 1451, 1458, 1467, 1479, 1492, 1505, 1517, + 1528, 1541, 1553, 1564, 1577, 1589, 1600, 1613, + 1625, 1636, 1649, 1666, 1678, 1694, 1710, 1727, + 1744, 1761, 1778, 1795, 1811, 1827, 1844, 1861, + 1878, 1895, 1912, 1928, 1944, 1961, 1978, 1995, + 2012, 2029, 2045, 2061, 2078, 2095, 2112, 2129, + 2146, 2162, 2178, 2194, 2210, 2225, 2242, 2258, + 2274, 2289, 2306, 2322, 2338, 2353, 2370, 2386, + 2402, 2417, 2434, 2450, 2466, 2481, 2492, 2503, + 2510, 2513, 2515, 2518, 2521, 2523, 2530, 2542, + 2551, 2558, 2567, 2579, 2592, 2605, 2617, 2628, + 2641, 2653, 2664, 2677, 2689, 2700, 2713, 2725, + 2736, 2749, 2766, 2778, 2794, 2810, 2827, 2844, + 2861, 2878, 2895, 2911, 2927, 2944, 2961, 2978, + 2995, 3012, 3028, 3044, 3061, 3078, 3095, 3112, + 3129, 3145, 3161, 3178, 3195, 3212, 3229, 3241, + 3258, 3274, 3290, 3305, 3322, 3338, 3354, 3369, + 3386, 3402, 3418, 3433, 3450, 3466, 3482, 3497, + 3514, 3530, 3546, 3561, 3572, 3583, 3590, 3593, + 3595, 3598, 3601, 3603, 3610, 3622, 3631, 3638, + 3647, 3659, 3672, 3685, 3697, 3708, 3721, 3733, + 3744, 3757, 3769, 3780, 3793, 3805, 3816, 3829, + 3846, 3858, 3874, 3890, 3907, 3924, 3941, 3958, + 3975, 3991, 4007, 4024, 4041, 4058, 4075, 4092, + 4108, 4124, 4141, 4158, 4175, 4192, 4209, 4225, + 4241, 4258, 4275, 4292, 4309, 4326, 4338, 4354, + 4366, 4382, 4398, 4413, 4430, 4446, 4462, 4477, + 4494, 4510, 4526, 4541, 4558, 4574, 4590, 4605, + 4622, 4638, 4654, 4669, 4680, 4691, 4698, 4701, + 4703, 4706, 4709, 4711, 4718, 4730, 4739, 4746, + 4755, 4767, 4780, 4793, 4805, 4816, 4829, 4841, + 4852, 4865, 4877, 4888, 4901, 4913, 4924, 4937, + 4954, 4966, 4982, 4998, 5015, 5032, 5049, 5066, + 5083, 5099, 5115, 5132, 5149, 5166, 5183, 5200, + 5216, 5232, 5249, 5266, 5283, 5300, 5317, 5333, + 5349, 5366, 5383, 5400, 5417, 5434, 5450, 5468, + 5484, 5502, 5514, 5521, 5524, 5526, 5529, 5532, + 5534, 5541, 5558, 5574, 5590, 5605, 5621, 5637, + 5654, 5667, 5679, 5690, 5703, 5715, 5726, 5739, + 5751, 5762, 5775, 5787, 5798, 5810, 5819, 5826, + 5835, 5847, 5864, 5873, 5880, 5887, 5890, 5892, + 5895, 5898, 5900 }; static const short _indic_syllable_machine_indicies[] = { @@ -381,882 +381,684 @@ 161, 161, 162, 157, 0, 183, 0, 184, 0, 186, 185, 188, 189, 190, 191, 192, 193, 84, 79, 194, 195, 196, 196, 156, - 197, 198, 199, 200, 201, 187, 187, 187, - 187, 187, 187, 187, 187, 187, 187, 187, - 187, 202, 187, 204, 205, 206, 207, 6, - 1, 208, 209, 203, 203, 38, 210, 203, - 203, 211, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 212, - 203, 213, 205, 214, 214, 6, 1, 208, - 209, 203, 203, 203, 210, 203, 203, 211, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 212, 203, 205, - 214, 214, 6, 1, 208, 209, 203, 203, - 203, 210, 203, 203, 211, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 212, 203, 215, 203, 203, 203, - 19, 216, 203, 1, 208, 209, 203, 203, - 203, 217, 203, 215, 203, 218, 219, 220, - 221, 6, 1, 208, 209, 203, 203, 36, - 222, 203, 203, 211, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 212, 203, 223, 219, 224, 224, 6, - 1, 208, 209, 203, 203, 203, 222, 203, - 203, 211, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 212, - 203, 219, 224, 224, 6, 1, 208, 209, - 203, 203, 203, 222, 203, 203, 211, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 212, 203, 225, 203, - 203, 203, 19, 226, 203, 1, 208, 209, - 203, 203, 203, 217, 203, 225, 203, 227, - 228, 229, 230, 6, 1, 208, 209, 203, - 203, 34, 231, 203, 203, 211, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 212, 203, 232, 228, 233, - 233, 6, 1, 208, 209, 203, 203, 203, - 231, 203, 203, 211, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 212, 203, 228, 233, 233, 6, 1, - 208, 209, 203, 203, 203, 231, 203, 203, - 211, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 212, 203, - 234, 203, 203, 203, 19, 235, 203, 1, - 208, 209, 203, 203, 203, 217, 203, 234, - 203, 236, 237, 238, 239, 6, 1, 208, - 209, 203, 203, 32, 240, 203, 203, 211, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 212, 203, 241, - 237, 242, 242, 6, 1, 208, 209, 203, - 203, 203, 240, 203, 203, 211, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 212, 203, 237, 242, 242, - 6, 1, 208, 209, 203, 203, 203, 240, - 203, 203, 211, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 212, 203, 243, 203, 203, 203, 19, 244, - 203, 1, 208, 209, 203, 203, 203, 217, - 203, 243, 203, 245, 246, 247, 248, 6, - 1, 208, 209, 203, 203, 30, 249, 203, - 203, 211, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 212, - 203, 250, 246, 251, 251, 6, 1, 208, - 209, 203, 203, 203, 249, 203, 203, 211, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 212, 203, 246, - 251, 251, 6, 1, 208, 209, 203, 203, - 203, 249, 203, 203, 211, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 212, 203, 19, 252, 203, 1, - 208, 209, 203, 203, 203, 217, 203, 253, - 253, 203, 1, 208, 209, 203, 203, 203, - 217, 203, 254, 203, 203, 255, 208, 209, - 203, 208, 209, 203, 256, 203, 208, 257, - 203, 208, 258, 203, 208, 203, 254, 203, - 203, 203, 208, 209, 203, 259, 203, 260, - 261, 203, 1, 208, 209, 203, 203, 4, - 203, 3, 203, 253, 253, 203, 1, 208, - 209, 203, 253, 253, 203, 1, 208, 209, - 203, 259, 203, 253, 253, 203, 1, 208, - 209, 203, 259, 203, 260, 253, 203, 1, - 208, 209, 203, 203, 4, 203, 19, 203, - 262, 262, 6, 1, 208, 209, 203, 203, - 203, 217, 203, 263, 28, 264, 265, 9, - 1, 208, 209, 203, 203, 203, 217, 203, - 28, 264, 265, 9, 1, 208, 209, 203, - 203, 203, 217, 203, 264, 264, 9, 1, - 208, 209, 203, 203, 203, 217, 203, 266, - 25, 267, 268, 12, 1, 208, 209, 203, - 203, 203, 217, 203, 25, 267, 268, 12, - 1, 208, 209, 203, 203, 203, 217, 203, - 267, 267, 12, 1, 208, 209, 203, 203, - 203, 217, 203, 269, 22, 270, 271, 15, - 1, 208, 209, 203, 203, 203, 217, 203, - 22, 270, 271, 15, 1, 208, 209, 203, - 203, 203, 217, 203, 270, 270, 15, 1, - 208, 209, 203, 203, 203, 217, 203, 272, - 19, 253, 273, 203, 1, 208, 209, 203, - 203, 203, 217, 203, 19, 253, 273, 203, - 1, 208, 209, 203, 203, 203, 217, 203, - 253, 274, 203, 1, 208, 209, 203, 203, - 203, 217, 203, 19, 203, 253, 253, 203, - 1, 208, 209, 203, 203, 203, 217, 203, - 2, 3, 203, 203, 19, 252, 203, 1, - 208, 209, 203, 203, 203, 217, 203, 2, - 203, 246, 251, 251, 6, 1, 208, 209, - 203, 203, 203, 249, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 212, 203, 246, 251, - 251, 6, 1, 208, 209, 203, 203, 203, - 249, 203, 245, 246, 251, 251, 6, 1, - 208, 209, 203, 203, 203, 249, 203, 203, - 211, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 212, 203, - 245, 246, 247, 251, 6, 1, 208, 209, - 203, 203, 30, 249, 203, 203, 211, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 212, 203, 243, 203, - 275, 203, 262, 262, 6, 1, 208, 209, - 203, 203, 203, 217, 203, 243, 203, 243, - 203, 203, 203, 253, 253, 203, 1, 208, - 209, 203, 203, 203, 217, 203, 243, 203, - 243, 203, 203, 203, 253, 276, 203, 1, - 208, 209, 203, 203, 203, 217, 203, 243, - 203, 243, 203, 275, 203, 253, 253, 203, - 1, 208, 209, 203, 203, 203, 217, 203, - 243, 203, 243, 3, 203, 203, 19, 244, - 203, 1, 208, 209, 203, 203, 203, 217, - 203, 243, 203, 236, 237, 242, 242, 6, - 1, 208, 209, 203, 203, 203, 240, 203, - 203, 211, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 212, - 203, 236, 237, 238, 242, 6, 1, 208, - 209, 203, 203, 32, 240, 203, 203, 211, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 212, 203, 234, - 203, 277, 203, 262, 262, 6, 1, 208, - 209, 203, 203, 203, 217, 203, 234, 203, - 234, 203, 203, 203, 253, 253, 203, 1, - 208, 209, 203, 203, 203, 217, 203, 234, - 203, 234, 203, 203, 203, 253, 278, 203, - 1, 208, 209, 203, 203, 203, 217, 203, - 234, 203, 234, 203, 277, 203, 253, 253, - 203, 1, 208, 209, 203, 203, 203, 217, - 203, 234, 203, 234, 3, 203, 203, 19, - 235, 203, 1, 208, 209, 203, 203, 203, - 217, 203, 234, 203, 227, 228, 233, 233, - 6, 1, 208, 209, 203, 203, 203, 231, - 203, 203, 211, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 212, 203, 227, 228, 229, 233, 6, 1, - 208, 209, 203, 203, 34, 231, 203, 203, - 211, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 212, 203, - 225, 203, 279, 203, 262, 262, 6, 1, - 208, 209, 203, 203, 203, 217, 203, 225, - 203, 225, 203, 203, 203, 253, 253, 203, - 1, 208, 209, 203, 203, 203, 217, 203, - 225, 203, 225, 203, 203, 203, 253, 280, - 203, 1, 208, 209, 203, 203, 203, 217, - 203, 225, 203, 225, 203, 279, 203, 253, - 253, 203, 1, 208, 209, 203, 203, 203, - 217, 203, 225, 203, 225, 3, 203, 203, - 19, 226, 203, 1, 208, 209, 203, 203, - 203, 217, 203, 225, 203, 218, 219, 224, - 224, 6, 1, 208, 209, 203, 203, 203, - 222, 203, 203, 211, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 212, 203, 218, 219, 220, 224, 6, - 1, 208, 209, 203, 203, 36, 222, 203, - 203, 211, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 212, - 203, 215, 203, 281, 203, 262, 262, 6, - 1, 208, 209, 203, 203, 203, 217, 203, - 215, 203, 215, 203, 203, 203, 253, 253, - 203, 1, 208, 209, 203, 203, 203, 217, - 203, 215, 203, 215, 203, 203, 203, 253, - 282, 203, 1, 208, 209, 203, 203, 203, - 217, 203, 215, 203, 215, 203, 281, 203, - 253, 253, 203, 1, 208, 209, 203, 203, - 203, 217, 203, 215, 203, 215, 3, 203, - 203, 19, 216, 203, 1, 208, 209, 203, - 203, 203, 217, 203, 215, 203, 204, 205, - 214, 214, 6, 1, 208, 209, 203, 203, - 203, 210, 203, 203, 211, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 212, 203, 204, 205, 206, 214, - 6, 1, 208, 209, 203, 203, 38, 210, - 203, 203, 211, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 212, 203, 284, 285, 286, 287, 45, 40, - 288, 289, 283, 283, 77, 290, 283, 283, - 291, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 292, 283, - 293, 285, 294, 287, 45, 40, 288, 289, - 283, 283, 283, 290, 283, 283, 291, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 292, 283, 285, 294, - 287, 45, 40, 288, 289, 283, 283, 283, - 290, 283, 283, 291, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 292, 283, 295, 283, 283, 283, 58, - 296, 283, 40, 288, 289, 283, 283, 283, - 297, 283, 295, 283, 298, 299, 300, 301, - 45, 40, 288, 289, 283, 283, 75, 302, - 283, 283, 291, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 292, 283, 303, 299, 304, 304, 45, 40, - 288, 289, 283, 283, 283, 302, 283, 283, - 291, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 292, 283, - 299, 304, 304, 45, 40, 288, 289, 283, - 283, 283, 302, 283, 283, 291, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 292, 283, 305, 283, 283, - 283, 58, 306, 283, 40, 288, 289, 283, - 283, 283, 297, 283, 305, 283, 307, 308, - 309, 310, 45, 40, 288, 289, 283, 283, - 73, 311, 283, 283, 291, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 292, 283, 312, 308, 313, 313, - 45, 40, 288, 289, 283, 283, 283, 311, - 283, 283, 291, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 292, 283, 308, 313, 313, 45, 40, 288, - 289, 283, 283, 283, 311, 283, 283, 291, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 292, 283, 314, - 283, 283, 283, 58, 315, 283, 40, 288, - 289, 283, 283, 283, 297, 283, 314, 283, - 316, 317, 318, 319, 45, 40, 288, 289, - 283, 283, 71, 320, 283, 283, 291, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 292, 283, 321, 317, - 322, 322, 45, 40, 288, 289, 283, 283, - 283, 320, 283, 283, 291, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 292, 283, 317, 322, 322, 45, - 40, 288, 289, 283, 283, 283, 320, 283, - 283, 291, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 292, - 283, 323, 283, 283, 283, 58, 324, 283, - 40, 288, 289, 283, 283, 283, 297, 283, - 323, 283, 325, 326, 327, 328, 45, 40, - 288, 289, 283, 283, 69, 329, 283, 283, - 291, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 292, 283, - 330, 326, 331, 331, 45, 40, 288, 289, - 283, 283, 283, 329, 283, 283, 291, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 292, 283, 326, 331, - 331, 45, 40, 288, 289, 283, 283, 283, - 329, 283, 283, 291, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 292, 283, 58, 332, 283, 40, 288, - 289, 283, 283, 283, 297, 283, 333, 333, - 283, 40, 288, 289, 283, 283, 283, 297, - 283, 334, 283, 283, 335, 288, 289, 283, - 288, 289, 283, 336, 283, 288, 337, 283, - 288, 338, 283, 288, 283, 334, 283, 283, - 283, 288, 289, 283, 339, 283, 340, 341, - 283, 40, 288, 289, 283, 283, 43, 283, - 42, 283, 333, 333, 283, 40, 288, 289, - 283, 333, 333, 283, 40, 288, 289, 283, - 339, 283, 333, 333, 283, 40, 288, 289, - 283, 339, 283, 340, 333, 283, 40, 288, - 289, 283, 283, 43, 283, 58, 283, 342, - 342, 45, 40, 288, 289, 283, 283, 283, - 297, 283, 343, 67, 344, 345, 48, 40, - 288, 289, 283, 283, 283, 297, 283, 67, - 344, 345, 48, 40, 288, 289, 283, 283, - 283, 297, 283, 344, 344, 48, 40, 288, - 289, 283, 283, 283, 297, 283, 346, 64, - 347, 348, 51, 40, 288, 289, 283, 283, - 283, 297, 283, 64, 347, 348, 51, 40, - 288, 289, 283, 283, 283, 297, 283, 347, - 347, 51, 40, 288, 289, 283, 283, 283, - 297, 283, 349, 61, 350, 351, 54, 40, - 288, 289, 283, 283, 283, 297, 283, 61, - 350, 351, 54, 40, 288, 289, 283, 283, - 283, 297, 283, 350, 350, 54, 40, 288, - 289, 283, 283, 283, 297, 283, 352, 58, - 333, 353, 283, 40, 288, 289, 283, 283, - 283, 297, 283, 58, 333, 353, 283, 40, - 288, 289, 283, 283, 283, 297, 283, 333, - 354, 283, 40, 288, 289, 283, 283, 283, - 297, 283, 58, 283, 333, 333, 283, 40, - 288, 289, 283, 283, 283, 297, 283, 41, - 42, 283, 283, 58, 332, 283, 40, 288, - 289, 283, 283, 283, 297, 283, 41, 283, - 326, 331, 331, 45, 40, 288, 289, 283, - 283, 283, 329, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 292, 283, 326, 331, 331, - 45, 40, 288, 289, 283, 283, 283, 329, - 283, 325, 326, 331, 331, 45, 40, 288, - 289, 283, 283, 283, 329, 283, 283, 291, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 292, 283, 325, - 326, 327, 331, 45, 40, 288, 289, 283, - 283, 69, 329, 283, 283, 291, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 292, 283, 323, 283, 355, - 283, 342, 342, 45, 40, 288, 289, 283, - 283, 283, 297, 283, 323, 283, 323, 283, - 283, 283, 333, 333, 283, 40, 288, 289, - 283, 283, 283, 297, 283, 323, 283, 323, - 283, 283, 283, 333, 356, 283, 40, 288, - 289, 283, 283, 283, 297, 283, 323, 283, - 323, 283, 355, 283, 333, 333, 283, 40, - 288, 289, 283, 283, 283, 297, 283, 323, - 283, 323, 42, 283, 283, 58, 324, 283, - 40, 288, 289, 283, 283, 283, 297, 283, - 323, 283, 316, 317, 322, 322, 45, 40, - 288, 289, 283, 283, 283, 320, 283, 283, - 291, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 292, 283, - 316, 317, 318, 322, 45, 40, 288, 289, - 283, 283, 71, 320, 283, 283, 291, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 292, 283, 314, 283, - 357, 283, 342, 342, 45, 40, 288, 289, - 283, 283, 283, 297, 283, 314, 283, 314, - 283, 283, 283, 333, 333, 283, 40, 288, - 289, 283, 283, 283, 297, 283, 314, 283, - 314, 283, 283, 283, 333, 358, 283, 40, - 288, 289, 283, 283, 283, 297, 283, 314, - 283, 314, 283, 357, 283, 333, 333, 283, - 40, 288, 289, 283, 283, 283, 297, 283, - 314, 283, 314, 42, 283, 283, 58, 315, - 283, 40, 288, 289, 283, 283, 283, 297, - 283, 314, 283, 307, 308, 313, 313, 45, - 40, 288, 289, 283, 283, 283, 311, 283, - 283, 291, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 292, - 283, 307, 308, 309, 313, 45, 40, 288, - 289, 283, 283, 73, 311, 283, 283, 291, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 292, 283, 305, - 283, 359, 283, 342, 342, 45, 40, 288, - 289, 283, 283, 283, 297, 283, 305, 283, - 305, 283, 283, 283, 333, 333, 283, 40, - 288, 289, 283, 283, 283, 297, 283, 305, - 283, 305, 283, 283, 283, 333, 360, 283, - 40, 288, 289, 283, 283, 283, 297, 283, - 305, 283, 305, 283, 359, 283, 333, 333, - 283, 40, 288, 289, 283, 283, 283, 297, - 283, 305, 283, 305, 42, 283, 283, 58, - 306, 283, 40, 288, 289, 283, 283, 283, - 297, 283, 305, 283, 298, 299, 304, 304, - 45, 40, 288, 289, 283, 283, 283, 302, - 283, 283, 291, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 283, 283, - 292, 283, 298, 299, 300, 304, 45, 40, - 288, 289, 283, 283, 75, 302, 283, 283, - 291, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 283, 292, 283, - 295, 283, 361, 283, 342, 342, 45, 40, - 288, 289, 283, 283, 283, 297, 283, 295, - 283, 295, 283, 283, 283, 333, 333, 283, - 40, 288, 289, 283, 283, 283, 297, 283, - 295, 283, 295, 283, 283, 283, 333, 362, - 283, 40, 288, 289, 283, 283, 283, 297, - 283, 295, 283, 295, 283, 361, 283, 333, - 333, 283, 40, 288, 289, 283, 283, 283, - 297, 283, 295, 283, 76, 44, 44, 45, - 40, 283, 283, 283, 283, 283, 76, 283, - 295, 42, 283, 283, 58, 296, 283, 40, - 288, 289, 283, 283, 283, 297, 283, 295, - 283, 284, 285, 294, 287, 45, 40, 288, - 289, 283, 283, 283, 290, 283, 283, 291, - 283, 283, 283, 283, 283, 283, 283, 283, - 283, 283, 283, 283, 283, 292, 283, 364, - 191, 365, 365, 84, 79, 194, 195, 363, - 363, 363, 197, 363, 363, 200, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 202, 363, 191, 365, 365, - 84, 79, 194, 195, 363, 363, 363, 197, - 363, 363, 200, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 202, 363, 366, 363, 363, 363, 98, 367, - 363, 79, 194, 195, 363, 363, 363, 368, - 363, 366, 363, 369, 370, 371, 372, 84, - 79, 194, 195, 363, 363, 115, 373, 363, - 363, 200, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 202, - 363, 374, 370, 375, 375, 84, 79, 194, - 195, 363, 363, 363, 373, 363, 363, 200, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 202, 363, 370, - 375, 375, 84, 79, 194, 195, 363, 363, - 363, 373, 363, 363, 200, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 202, 363, 376, 363, 363, 363, - 98, 377, 363, 79, 194, 195, 363, 363, - 363, 368, 363, 376, 363, 378, 379, 380, - 381, 84, 79, 194, 195, 363, 363, 113, - 382, 363, 363, 200, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 202, 363, 383, 379, 384, 384, 84, - 79, 194, 195, 363, 363, 363, 382, 363, - 363, 200, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 202, - 363, 379, 384, 384, 84, 79, 194, 195, - 363, 363, 363, 382, 363, 363, 200, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 202, 363, 385, 363, - 363, 363, 98, 386, 363, 79, 194, 195, - 363, 363, 363, 368, 363, 385, 363, 387, - 388, 389, 390, 84, 79, 194, 195, 363, - 363, 111, 391, 363, 363, 200, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 202, 363, 392, 388, 393, - 393, 84, 79, 194, 195, 363, 363, 363, - 391, 363, 363, 200, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 202, 363, 388, 393, 393, 84, 79, - 194, 195, 363, 363, 363, 391, 363, 363, - 200, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 202, 363, - 394, 363, 363, 363, 98, 395, 363, 79, - 194, 195, 363, 363, 363, 368, 363, 394, - 363, 396, 397, 398, 399, 84, 79, 194, - 195, 363, 363, 109, 400, 363, 363, 200, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 202, 363, 401, - 397, 402, 402, 84, 79, 194, 195, 363, - 363, 363, 400, 363, 363, 200, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 202, 363, 397, 402, 402, - 84, 79, 194, 195, 363, 363, 363, 400, - 363, 363, 200, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 202, 363, 98, 403, 363, 79, 194, 195, - 363, 363, 363, 368, 363, 404, 404, 363, - 79, 194, 195, 363, 363, 363, 368, 363, - 405, 363, 363, 406, 194, 195, 363, 194, - 195, 363, 407, 363, 194, 408, 363, 194, - 409, 363, 194, 363, 405, 363, 363, 363, - 194, 195, 363, 410, 363, 411, 412, 363, - 79, 194, 195, 363, 363, 82, 363, 81, - 363, 404, 404, 363, 79, 194, 195, 363, - 404, 404, 363, 79, 194, 195, 363, 410, - 363, 404, 404, 363, 79, 194, 195, 363, - 410, 363, 411, 404, 363, 79, 194, 195, - 363, 363, 82, 363, 98, 363, 413, 413, - 84, 79, 194, 195, 363, 363, 363, 368, - 363, 414, 107, 415, 416, 88, 79, 194, - 195, 363, 363, 363, 368, 363, 107, 415, - 416, 88, 79, 194, 195, 363, 363, 363, - 368, 363, 415, 415, 88, 79, 194, 195, - 363, 363, 363, 368, 363, 417, 104, 418, - 419, 91, 79, 194, 195, 363, 363, 363, - 368, 363, 104, 418, 419, 91, 79, 194, - 195, 363, 363, 363, 368, 363, 418, 418, - 91, 79, 194, 195, 363, 363, 363, 368, - 363, 420, 101, 421, 422, 94, 79, 194, - 195, 363, 363, 363, 368, 363, 101, 421, - 422, 94, 79, 194, 195, 363, 363, 363, - 368, 363, 421, 421, 94, 79, 194, 195, - 363, 363, 363, 368, 363, 423, 98, 404, - 424, 363, 79, 194, 195, 363, 363, 363, - 368, 363, 98, 404, 424, 363, 79, 194, - 195, 363, 363, 363, 368, 363, 404, 425, - 363, 79, 194, 195, 363, 363, 363, 368, - 363, 98, 363, 404, 404, 363, 79, 194, - 195, 363, 363, 363, 368, 363, 80, 81, - 363, 363, 98, 403, 363, 79, 194, 195, - 363, 363, 363, 368, 363, 80, 363, 397, - 402, 402, 84, 79, 194, 195, 363, 363, - 363, 400, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 202, 363, 397, 402, 402, 84, - 79, 194, 195, 363, 363, 363, 400, 363, - 396, 397, 402, 402, 84, 79, 194, 195, - 363, 363, 363, 400, 363, 363, 200, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 202, 363, 396, 397, - 398, 402, 84, 79, 194, 195, 363, 363, - 109, 400, 363, 363, 200, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 202, 363, 394, 363, 426, 363, - 413, 413, 84, 79, 194, 195, 363, 363, - 363, 368, 363, 394, 363, 394, 363, 363, - 363, 404, 404, 363, 79, 194, 195, 363, - 363, 363, 368, 363, 394, 363, 394, 363, - 363, 363, 404, 427, 363, 79, 194, 195, - 363, 363, 363, 368, 363, 394, 363, 394, - 363, 426, 363, 404, 404, 363, 79, 194, - 195, 363, 363, 363, 368, 363, 394, 363, - 394, 81, 363, 363, 98, 395, 363, 79, - 194, 195, 363, 363, 363, 368, 363, 394, - 363, 387, 388, 393, 393, 84, 79, 194, - 195, 363, 363, 363, 391, 363, 363, 200, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 202, 363, 387, - 388, 389, 393, 84, 79, 194, 195, 363, - 363, 111, 391, 363, 363, 200, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 202, 363, 385, 363, 428, - 363, 413, 413, 84, 79, 194, 195, 363, - 363, 363, 368, 363, 385, 363, 385, 363, - 363, 363, 404, 404, 363, 79, 194, 195, - 363, 363, 363, 368, 363, 385, 363, 385, - 363, 363, 363, 404, 429, 363, 79, 194, - 195, 363, 363, 363, 368, 363, 385, 363, - 385, 363, 428, 363, 404, 404, 363, 79, - 194, 195, 363, 363, 363, 368, 363, 385, - 363, 385, 81, 363, 363, 98, 386, 363, - 79, 194, 195, 363, 363, 363, 368, 363, - 385, 363, 378, 379, 384, 384, 84, 79, - 194, 195, 363, 363, 363, 382, 363, 363, - 200, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 202, 363, - 378, 379, 380, 384, 84, 79, 194, 195, - 363, 363, 113, 382, 363, 363, 200, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 202, 363, 376, 363, - 430, 363, 413, 413, 84, 79, 194, 195, - 363, 363, 363, 368, 363, 376, 363, 376, - 363, 363, 363, 404, 404, 363, 79, 194, - 195, 363, 363, 363, 368, 363, 376, 363, - 376, 363, 363, 363, 404, 431, 363, 79, - 194, 195, 363, 363, 363, 368, 363, 376, - 363, 376, 363, 430, 363, 404, 404, 363, - 79, 194, 195, 363, 363, 363, 368, 363, - 376, 363, 376, 81, 363, 363, 98, 377, - 363, 79, 194, 195, 363, 363, 363, 368, - 363, 376, 363, 369, 370, 375, 375, 84, - 79, 194, 195, 363, 363, 363, 373, 363, - 363, 200, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 202, - 363, 369, 370, 371, 375, 84, 79, 194, - 195, 363, 363, 115, 373, 363, 363, 200, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 202, 363, 366, - 363, 432, 363, 413, 413, 84, 79, 194, - 195, 363, 363, 363, 368, 363, 366, 363, - 366, 363, 363, 363, 404, 404, 363, 79, - 194, 195, 363, 363, 363, 368, 363, 366, - 363, 366, 363, 363, 363, 404, 433, 363, - 79, 194, 195, 363, 363, 363, 368, 363, - 366, 363, 366, 363, 432, 363, 404, 404, - 363, 79, 194, 195, 363, 363, 363, 368, - 363, 366, 363, 366, 81, 363, 363, 98, - 367, 363, 79, 194, 195, 363, 363, 363, - 368, 363, 366, 363, 116, 83, 83, 84, - 79, 434, 434, 434, 434, 156, 116, 434, - 190, 191, 365, 365, 84, 79, 194, 195, - 363, 363, 363, 197, 363, 363, 200, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 363, 363, 363, 202, 363, 116, 83, - 83, 84, 79, 434, 434, 434, 434, 434, - 116, 434, 436, 437, 438, 439, 123, 118, - 440, 441, 435, 435, 155, 442, 435, 435, - 443, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 444, 435, - 445, 437, 439, 439, 123, 118, 440, 441, - 435, 435, 435, 442, 435, 435, 443, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 444, 435, 437, 439, - 439, 123, 118, 440, 441, 435, 435, 435, - 442, 435, 435, 443, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 444, 435, 446, 435, 435, 435, 136, - 447, 435, 118, 440, 441, 435, 435, 435, - 448, 435, 446, 435, 449, 450, 451, 452, - 123, 118, 440, 441, 435, 435, 153, 453, - 435, 435, 443, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 444, 435, 454, 450, 455, 455, 123, 118, - 440, 441, 435, 435, 435, 453, 435, 435, - 443, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 444, 435, - 450, 455, 455, 123, 118, 440, 441, 435, - 435, 435, 453, 435, 435, 443, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 444, 435, 456, 435, 435, - 435, 136, 457, 435, 118, 440, 441, 435, - 435, 435, 448, 435, 456, 435, 458, 459, - 460, 461, 123, 118, 440, 441, 435, 435, - 151, 462, 435, 435, 443, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 444, 435, 463, 459, 464, 464, - 123, 118, 440, 441, 435, 435, 435, 462, - 435, 435, 443, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 444, 435, 459, 464, 464, 123, 118, 440, - 441, 435, 435, 435, 462, 435, 435, 443, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 444, 435, 465, - 435, 435, 435, 136, 466, 435, 118, 440, - 441, 435, 435, 435, 448, 435, 465, 435, - 467, 468, 469, 470, 123, 118, 440, 441, - 435, 435, 149, 471, 435, 435, 443, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 444, 435, 472, 468, - 473, 473, 123, 118, 440, 441, 435, 435, - 435, 471, 435, 435, 443, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 444, 435, 468, 473, 473, 123, - 118, 440, 441, 435, 435, 435, 471, 435, - 435, 443, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 444, - 435, 474, 435, 435, 435, 136, 475, 435, - 118, 440, 441, 435, 435, 435, 448, 435, - 474, 435, 476, 477, 478, 479, 123, 118, - 440, 441, 435, 435, 147, 480, 435, 435, - 443, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 444, 435, - 481, 477, 482, 482, 123, 118, 440, 441, - 435, 435, 435, 480, 435, 435, 443, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 444, 435, 477, 482, - 482, 123, 118, 440, 441, 435, 435, 435, - 480, 435, 435, 443, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 444, 435, 136, 483, 435, 118, 440, - 441, 435, 435, 435, 448, 435, 484, 484, - 435, 118, 440, 441, 435, 435, 435, 448, - 435, 485, 435, 435, 486, 440, 441, 435, - 440, 441, 435, 487, 435, 440, 488, 435, - 440, 489, 435, 440, 435, 485, 435, 435, - 435, 440, 441, 435, 490, 435, 491, 492, - 435, 118, 440, 441, 435, 435, 121, 435, - 120, 435, 484, 484, 435, 118, 440, 441, - 435, 484, 484, 435, 118, 440, 441, 435, - 490, 435, 484, 484, 435, 118, 440, 441, - 435, 490, 435, 491, 484, 435, 118, 440, - 441, 435, 435, 121, 435, 136, 435, 493, - 493, 123, 118, 440, 441, 435, 435, 435, - 448, 435, 494, 145, 495, 496, 126, 118, - 440, 441, 435, 435, 435, 448, 435, 145, - 495, 496, 126, 118, 440, 441, 435, 435, - 435, 448, 435, 495, 495, 126, 118, 440, - 441, 435, 435, 435, 448, 435, 497, 142, - 498, 499, 129, 118, 440, 441, 435, 435, - 435, 448, 435, 142, 498, 499, 129, 118, - 440, 441, 435, 435, 435, 448, 435, 498, - 498, 129, 118, 440, 441, 435, 435, 435, - 448, 435, 500, 139, 501, 502, 132, 118, - 440, 441, 435, 435, 435, 448, 435, 139, - 501, 502, 132, 118, 440, 441, 435, 435, - 435, 448, 435, 501, 501, 132, 118, 440, - 441, 435, 435, 435, 448, 435, 503, 136, - 484, 504, 435, 118, 440, 441, 435, 435, - 435, 448, 435, 136, 484, 504, 435, 118, - 440, 441, 435, 435, 435, 448, 435, 484, - 505, 435, 118, 440, 441, 435, 435, 435, - 448, 435, 136, 435, 484, 484, 435, 118, - 440, 441, 435, 435, 435, 448, 435, 119, - 120, 435, 435, 136, 483, 435, 118, 440, - 441, 435, 435, 435, 448, 435, 119, 435, - 477, 482, 482, 123, 118, 440, 441, 435, - 435, 435, 480, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 444, 435, 477, 482, 482, - 123, 118, 440, 441, 435, 435, 435, 480, - 435, 476, 477, 482, 482, 123, 118, 440, - 441, 435, 435, 435, 480, 435, 435, 443, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 444, 435, 476, - 477, 478, 482, 123, 118, 440, 441, 435, - 435, 147, 480, 435, 435, 443, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 444, 435, 474, 435, 506, - 435, 493, 493, 123, 118, 440, 441, 435, - 435, 435, 448, 435, 474, 435, 474, 435, - 435, 435, 484, 484, 435, 118, 440, 441, - 435, 435, 435, 448, 435, 474, 435, 474, - 435, 435, 435, 484, 507, 435, 118, 440, - 441, 435, 435, 435, 448, 435, 474, 435, - 474, 435, 506, 435, 484, 484, 435, 118, - 440, 441, 435, 435, 435, 448, 435, 474, - 435, 474, 120, 435, 435, 136, 475, 435, - 118, 440, 441, 435, 435, 435, 448, 435, - 474, 435, 467, 468, 473, 473, 123, 118, - 440, 441, 435, 435, 435, 471, 435, 435, - 443, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 444, 435, - 467, 468, 469, 473, 123, 118, 440, 441, - 435, 435, 149, 471, 435, 435, 443, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 444, 435, 465, 435, - 508, 435, 493, 493, 123, 118, 440, 441, - 435, 435, 435, 448, 435, 465, 435, 465, - 435, 435, 435, 484, 484, 435, 118, 440, - 441, 435, 435, 435, 448, 435, 465, 435, - 465, 435, 435, 435, 484, 509, 435, 118, - 440, 441, 435, 435, 435, 448, 435, 465, - 435, 465, 435, 508, 435, 484, 484, 435, - 118, 440, 441, 435, 435, 435, 448, 435, - 465, 435, 465, 120, 435, 435, 136, 466, - 435, 118, 440, 441, 435, 435, 435, 448, - 435, 465, 435, 458, 459, 464, 464, 123, - 118, 440, 441, 435, 435, 435, 462, 435, - 435, 443, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 444, - 435, 458, 459, 460, 464, 123, 118, 440, - 441, 435, 435, 151, 462, 435, 435, 443, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 444, 435, 456, - 435, 510, 435, 493, 493, 123, 118, 440, - 441, 435, 435, 435, 448, 435, 456, 435, - 456, 435, 435, 435, 484, 484, 435, 118, - 440, 441, 435, 435, 435, 448, 435, 456, - 435, 456, 435, 435, 435, 484, 511, 435, - 118, 440, 441, 435, 435, 435, 448, 435, - 456, 435, 456, 435, 510, 435, 484, 484, - 435, 118, 440, 441, 435, 435, 435, 448, - 435, 456, 435, 456, 120, 435, 435, 136, - 457, 435, 118, 440, 441, 435, 435, 435, - 448, 435, 456, 435, 449, 450, 455, 455, - 123, 118, 440, 441, 435, 435, 435, 453, - 435, 435, 443, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 444, 435, 449, 450, 451, 455, 123, 118, - 440, 441, 435, 435, 153, 453, 435, 435, - 443, 435, 435, 435, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 444, 435, - 446, 435, 512, 435, 493, 493, 123, 118, - 440, 441, 435, 435, 435, 448, 435, 446, - 435, 446, 435, 435, 435, 484, 484, 435, - 118, 440, 441, 435, 435, 435, 448, 435, - 446, 435, 446, 435, 435, 435, 484, 513, - 435, 118, 440, 441, 435, 435, 435, 448, - 435, 446, 435, 446, 435, 512, 435, 484, - 484, 435, 118, 440, 441, 435, 435, 435, - 448, 435, 446, 435, 446, 120, 435, 435, - 136, 447, 435, 118, 440, 441, 435, 435, - 435, 448, 435, 446, 435, 436, 437, 439, - 439, 123, 118, 440, 441, 435, 435, 435, - 442, 435, 435, 443, 435, 435, 435, 435, - 435, 435, 435, 435, 435, 435, 435, 435, - 435, 444, 435, 188, 189, 190, 191, 514, - 365, 84, 79, 194, 195, 196, 196, 156, - 197, 363, 188, 200, 363, 363, 363, 363, - 363, 363, 363, 363, 363, 363, 363, 363, - 363, 202, 363, 204, 515, 206, 207, 6, - 1, 208, 209, 203, 203, 38, 210, 203, - 203, 211, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 212, - 203, 215, 189, 190, 191, 516, 517, 84, - 157, 518, 519, 203, 196, 156, 520, 203, - 215, 200, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 202, - 203, 116, 521, 521, 84, 157, 208, 209, - 203, 203, 156, 522, 203, 523, 203, 203, - 524, 518, 519, 203, 518, 519, 203, 256, - 203, 518, 525, 203, 518, 526, 203, 518, - 203, 523, 203, 203, 203, 518, 519, 203, - 527, 3, 363, 363, 404, 433, 363, 79, - 194, 195, 363, 363, 363, 368, 363, 527, - 363, 528, 370, 529, 530, 84, 157, 518, - 519, 203, 203, 158, 373, 203, 203, 200, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 202, 203, 531, - 370, 532, 532, 84, 157, 518, 519, 203, - 203, 203, 373, 203, 203, 200, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 202, 203, 370, 532, 532, - 84, 157, 518, 519, 203, 203, 203, 373, - 203, 203, 200, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 202, 203, 528, 370, 532, 532, 84, 157, - 518, 519, 203, 203, 203, 373, 203, 203, - 200, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 202, 203, - 528, 370, 529, 532, 84, 157, 518, 519, - 203, 203, 158, 373, 203, 203, 200, 203, - 203, 203, 203, 203, 203, 203, 203, 203, - 203, 203, 203, 203, 202, 203, 215, 203, - 281, 116, 533, 533, 160, 157, 208, 209, - 203, 203, 203, 522, 203, 215, 203, 534, - 184, 535, 536, 162, 157, 518, 519, 203, - 203, 203, 537, 203, 184, 535, 536, 162, - 157, 518, 519, 203, 203, 203, 537, 203, - 535, 535, 162, 157, 518, 519, 203, 203, - 203, 537, 203, 538, 181, 539, 540, 165, - 157, 518, 519, 203, 203, 203, 537, 203, - 181, 539, 540, 165, 157, 518, 519, 203, - 203, 203, 537, 203, 539, 539, 165, 157, - 518, 519, 203, 203, 203, 537, 203, 541, - 178, 542, 543, 168, 157, 518, 519, 203, - 203, 203, 537, 203, 178, 542, 543, 168, - 157, 518, 519, 203, 203, 203, 537, 203, - 542, 542, 168, 157, 518, 519, 203, 203, - 203, 537, 203, 544, 175, 545, 546, 203, - 157, 518, 519, 203, 203, 203, 537, 203, - 175, 545, 546, 203, 157, 518, 519, 203, - 203, 203, 537, 203, 545, 545, 203, 157, - 518, 519, 203, 203, 203, 537, 203, 547, - 203, 548, 549, 203, 157, 518, 519, 203, - 203, 172, 203, 171, 203, 545, 545, 203, - 157, 518, 519, 203, 545, 545, 203, 157, - 518, 519, 203, 547, 203, 545, 545, 203, - 157, 518, 519, 203, 547, 203, 548, 545, - 203, 157, 518, 519, 203, 203, 172, 203, - 527, 171, 363, 363, 98, 367, 363, 79, - 194, 195, 363, 363, 363, 368, 363, 527, - 363, 551, 550, 552, 552, 550, 186, 553, - 554, 550, 552, 552, 550, 186, 553, 554, - 550, 555, 550, 550, 556, 553, 554, 550, - 553, 554, 550, 557, 550, 553, 558, 550, - 553, 559, 550, 553, 550, 555, 550, 550, - 550, 553, 554, 550, 0 + 197, 198, 199, 200, 201, 187, 203, 204, + 205, 206, 6, 1, 207, 208, 202, 202, + 38, 209, 202, 202, 210, 202, 211, 204, + 212, 212, 6, 1, 207, 208, 202, 202, + 202, 209, 202, 202, 210, 202, 204, 212, + 212, 6, 1, 207, 208, 202, 202, 202, + 209, 202, 202, 210, 202, 213, 202, 202, + 202, 19, 214, 202, 1, 207, 208, 202, + 202, 202, 215, 202, 213, 202, 216, 217, + 218, 219, 6, 1, 207, 208, 202, 202, + 36, 220, 202, 202, 210, 202, 221, 217, + 222, 222, 6, 1, 207, 208, 202, 202, + 202, 220, 202, 202, 210, 202, 217, 222, + 222, 6, 1, 207, 208, 202, 202, 202, + 220, 202, 202, 210, 202, 223, 202, 202, + 202, 19, 224, 202, 1, 207, 208, 202, + 202, 202, 215, 202, 223, 202, 225, 226, + 227, 228, 6, 1, 207, 208, 202, 202, + 34, 229, 202, 202, 210, 202, 230, 226, + 231, 231, 6, 1, 207, 208, 202, 202, + 202, 229, 202, 202, 210, 202, 226, 231, + 231, 6, 1, 207, 208, 202, 202, 202, + 229, 202, 202, 210, 202, 232, 202, 202, + 202, 19, 233, 202, 1, 207, 208, 202, + 202, 202, 215, 202, 232, 202, 234, 235, + 236, 237, 6, 1, 207, 208, 202, 202, + 32, 238, 202, 202, 210, 202, 239, 235, + 240, 240, 6, 1, 207, 208, 202, 202, + 202, 238, 202, 202, 210, 202, 235, 240, + 240, 6, 1, 207, 208, 202, 202, 202, + 238, 202, 202, 210, 202, 241, 202, 202, + 202, 19, 242, 202, 1, 207, 208, 202, + 202, 202, 215, 202, 241, 202, 243, 244, + 245, 246, 6, 1, 207, 208, 202, 202, + 30, 247, 202, 202, 210, 202, 248, 244, + 249, 249, 6, 1, 207, 208, 202, 202, + 202, 247, 202, 202, 210, 202, 244, 249, + 249, 6, 1, 207, 208, 202, 202, 202, + 247, 202, 202, 210, 202, 19, 250, 202, + 1, 207, 208, 202, 202, 202, 215, 202, + 251, 251, 202, 1, 207, 208, 202, 202, + 202, 215, 202, 252, 202, 202, 253, 207, + 208, 202, 207, 208, 202, 254, 202, 207, + 255, 202, 207, 256, 202, 207, 202, 252, + 202, 202, 202, 207, 208, 202, 257, 202, + 258, 259, 202, 1, 207, 208, 202, 202, + 4, 202, 3, 202, 251, 251, 202, 1, + 207, 208, 202, 251, 251, 202, 1, 207, + 208, 202, 257, 202, 251, 251, 202, 1, + 207, 208, 202, 257, 202, 258, 251, 202, + 1, 207, 208, 202, 202, 4, 202, 19, + 202, 260, 260, 6, 1, 207, 208, 202, + 202, 202, 215, 202, 261, 28, 262, 263, + 9, 1, 207, 208, 202, 202, 202, 215, + 202, 28, 262, 263, 9, 1, 207, 208, + 202, 202, 202, 215, 202, 262, 262, 9, + 1, 207, 208, 202, 202, 202, 215, 202, + 264, 25, 265, 266, 12, 1, 207, 208, + 202, 202, 202, 215, 202, 25, 265, 266, + 12, 1, 207, 208, 202, 202, 202, 215, + 202, 265, 265, 12, 1, 207, 208, 202, + 202, 202, 215, 202, 267, 22, 268, 269, + 15, 1, 207, 208, 202, 202, 202, 215, + 202, 22, 268, 269, 15, 1, 207, 208, + 202, 202, 202, 215, 202, 268, 268, 15, + 1, 207, 208, 202, 202, 202, 215, 202, + 270, 19, 251, 271, 202, 1, 207, 208, + 202, 202, 202, 215, 202, 19, 251, 271, + 202, 1, 207, 208, 202, 202, 202, 215, + 202, 251, 272, 202, 1, 207, 208, 202, + 202, 202, 215, 202, 19, 202, 251, 251, + 202, 1, 207, 208, 202, 202, 202, 215, + 202, 2, 3, 202, 202, 19, 250, 202, + 1, 207, 208, 202, 202, 202, 215, 202, + 2, 202, 244, 249, 249, 6, 1, 207, + 208, 202, 202, 202, 247, 202, 243, 244, + 249, 249, 6, 1, 207, 208, 202, 202, + 202, 247, 202, 202, 210, 202, 243, 244, + 245, 249, 6, 1, 207, 208, 202, 202, + 30, 247, 202, 202, 210, 202, 241, 202, + 273, 202, 260, 260, 6, 1, 207, 208, + 202, 202, 202, 215, 202, 241, 202, 241, + 202, 202, 202, 251, 251, 202, 1, 207, + 208, 202, 202, 202, 215, 202, 241, 202, + 241, 202, 202, 202, 251, 274, 202, 1, + 207, 208, 202, 202, 202, 215, 202, 241, + 202, 241, 202, 273, 202, 251, 251, 202, + 1, 207, 208, 202, 202, 202, 215, 202, + 241, 202, 241, 3, 202, 202, 19, 242, + 202, 1, 207, 208, 202, 202, 202, 215, + 202, 241, 202, 234, 235, 240, 240, 6, + 1, 207, 208, 202, 202, 202, 238, 202, + 202, 210, 202, 234, 235, 236, 240, 6, + 1, 207, 208, 202, 202, 32, 238, 202, + 202, 210, 202, 232, 202, 275, 202, 260, + 260, 6, 1, 207, 208, 202, 202, 202, + 215, 202, 232, 202, 232, 202, 202, 202, + 251, 251, 202, 1, 207, 208, 202, 202, + 202, 215, 202, 232, 202, 232, 202, 202, + 202, 251, 276, 202, 1, 207, 208, 202, + 202, 202, 215, 202, 232, 202, 232, 202, + 275, 202, 251, 251, 202, 1, 207, 208, + 202, 202, 202, 215, 202, 232, 202, 232, + 3, 202, 202, 19, 233, 202, 1, 207, + 208, 202, 202, 202, 215, 202, 232, 202, + 225, 226, 231, 231, 6, 1, 207, 208, + 202, 202, 202, 229, 202, 202, 210, 202, + 225, 226, 227, 231, 6, 1, 207, 208, + 202, 202, 34, 229, 202, 202, 210, 202, + 223, 202, 277, 202, 260, 260, 6, 1, + 207, 208, 202, 202, 202, 215, 202, 223, + 202, 223, 202, 202, 202, 251, 251, 202, + 1, 207, 208, 202, 202, 202, 215, 202, + 223, 202, 223, 202, 202, 202, 251, 278, + 202, 1, 207, 208, 202, 202, 202, 215, + 202, 223, 202, 223, 202, 277, 202, 251, + 251, 202, 1, 207, 208, 202, 202, 202, + 215, 202, 223, 202, 223, 3, 202, 202, + 19, 224, 202, 1, 207, 208, 202, 202, + 202, 215, 202, 223, 202, 216, 217, 222, + 222, 6, 1, 207, 208, 202, 202, 202, + 220, 202, 202, 210, 202, 216, 217, 218, + 222, 6, 1, 207, 208, 202, 202, 36, + 220, 202, 202, 210, 202, 213, 202, 279, + 202, 260, 260, 6, 1, 207, 208, 202, + 202, 202, 215, 202, 213, 202, 213, 202, + 202, 202, 251, 251, 202, 1, 207, 208, + 202, 202, 202, 215, 202, 213, 202, 213, + 202, 202, 202, 251, 280, 202, 1, 207, + 208, 202, 202, 202, 215, 202, 213, 202, + 213, 202, 279, 202, 251, 251, 202, 1, + 207, 208, 202, 202, 202, 215, 202, 213, + 202, 213, 3, 202, 202, 19, 214, 202, + 1, 207, 208, 202, 202, 202, 215, 202, + 213, 202, 203, 204, 212, 212, 6, 1, + 207, 208, 202, 202, 202, 209, 202, 202, + 210, 202, 203, 204, 205, 212, 6, 1, + 207, 208, 202, 202, 38, 209, 202, 202, + 210, 202, 282, 283, 284, 285, 45, 40, + 286, 287, 281, 281, 77, 288, 281, 281, + 289, 281, 290, 283, 291, 285, 45, 40, + 286, 287, 281, 281, 281, 288, 281, 281, + 289, 281, 283, 291, 285, 45, 40, 286, + 287, 281, 281, 281, 288, 281, 281, 289, + 281, 292, 281, 281, 281, 58, 293, 281, + 40, 286, 287, 281, 281, 281, 294, 281, + 292, 281, 295, 296, 297, 298, 45, 40, + 286, 287, 281, 281, 75, 299, 281, 281, + 289, 281, 300, 296, 301, 301, 45, 40, + 286, 287, 281, 281, 281, 299, 281, 281, + 289, 281, 296, 301, 301, 45, 40, 286, + 287, 281, 281, 281, 299, 281, 281, 289, + 281, 302, 281, 281, 281, 58, 303, 281, + 40, 286, 287, 281, 281, 281, 294, 281, + 302, 281, 304, 305, 306, 307, 45, 40, + 286, 287, 281, 281, 73, 308, 281, 281, + 289, 281, 309, 305, 310, 310, 45, 40, + 286, 287, 281, 281, 281, 308, 281, 281, + 289, 281, 305, 310, 310, 45, 40, 286, + 287, 281, 281, 281, 308, 281, 281, 289, + 281, 311, 281, 281, 281, 58, 312, 281, + 40, 286, 287, 281, 281, 281, 294, 281, + 311, 281, 313, 314, 315, 316, 45, 40, + 286, 287, 281, 281, 71, 317, 281, 281, + 289, 281, 318, 314, 319, 319, 45, 40, + 286, 287, 281, 281, 281, 317, 281, 281, + 289, 281, 314, 319, 319, 45, 40, 286, + 287, 281, 281, 281, 317, 281, 281, 289, + 281, 320, 281, 281, 281, 58, 321, 281, + 40, 286, 287, 281, 281, 281, 294, 281, + 320, 281, 322, 323, 324, 325, 45, 40, + 286, 287, 281, 281, 69, 326, 281, 281, + 289, 281, 327, 323, 328, 328, 45, 40, + 286, 287, 281, 281, 281, 326, 281, 281, + 289, 281, 323, 328, 328, 45, 40, 286, + 287, 281, 281, 281, 326, 281, 281, 289, + 281, 58, 329, 281, 40, 286, 287, 281, + 281, 281, 294, 281, 330, 330, 281, 40, + 286, 287, 281, 281, 281, 294, 281, 331, + 281, 281, 332, 286, 287, 281, 286, 287, + 281, 333, 281, 286, 334, 281, 286, 335, + 281, 286, 281, 331, 281, 281, 281, 286, + 287, 281, 336, 281, 337, 338, 281, 40, + 286, 287, 281, 281, 43, 281, 42, 281, + 330, 330, 281, 40, 286, 287, 281, 330, + 330, 281, 40, 286, 287, 281, 336, 281, + 330, 330, 281, 40, 286, 287, 281, 336, + 281, 337, 330, 281, 40, 286, 287, 281, + 281, 43, 281, 58, 281, 339, 339, 45, + 40, 286, 287, 281, 281, 281, 294, 281, + 340, 67, 341, 342, 48, 40, 286, 287, + 281, 281, 281, 294, 281, 67, 341, 342, + 48, 40, 286, 287, 281, 281, 281, 294, + 281, 341, 341, 48, 40, 286, 287, 281, + 281, 281, 294, 281, 343, 64, 344, 345, + 51, 40, 286, 287, 281, 281, 281, 294, + 281, 64, 344, 345, 51, 40, 286, 287, + 281, 281, 281, 294, 281, 344, 344, 51, + 40, 286, 287, 281, 281, 281, 294, 281, + 346, 61, 347, 348, 54, 40, 286, 287, + 281, 281, 281, 294, 281, 61, 347, 348, + 54, 40, 286, 287, 281, 281, 281, 294, + 281, 347, 347, 54, 40, 286, 287, 281, + 281, 281, 294, 281, 349, 58, 330, 350, + 281, 40, 286, 287, 281, 281, 281, 294, + 281, 58, 330, 350, 281, 40, 286, 287, + 281, 281, 281, 294, 281, 330, 351, 281, + 40, 286, 287, 281, 281, 281, 294, 281, + 58, 281, 330, 330, 281, 40, 286, 287, + 281, 281, 281, 294, 281, 41, 42, 281, + 281, 58, 329, 281, 40, 286, 287, 281, + 281, 281, 294, 281, 41, 281, 323, 328, + 328, 45, 40, 286, 287, 281, 281, 281, + 326, 281, 322, 323, 328, 328, 45, 40, + 286, 287, 281, 281, 281, 326, 281, 281, + 289, 281, 322, 323, 324, 328, 45, 40, + 286, 287, 281, 281, 69, 326, 281, 281, + 289, 281, 320, 281, 352, 281, 339, 339, + 45, 40, 286, 287, 281, 281, 281, 294, + 281, 320, 281, 320, 281, 281, 281, 330, + 330, 281, 40, 286, 287, 281, 281, 281, + 294, 281, 320, 281, 320, 281, 281, 281, + 330, 353, 281, 40, 286, 287, 281, 281, + 281, 294, 281, 320, 281, 320, 281, 352, + 281, 330, 330, 281, 40, 286, 287, 281, + 281, 281, 294, 281, 320, 281, 320, 42, + 281, 281, 58, 321, 281, 40, 286, 287, + 281, 281, 281, 294, 281, 320, 281, 313, + 314, 319, 319, 45, 40, 286, 287, 281, + 281, 281, 317, 281, 281, 289, 281, 313, + 314, 315, 319, 45, 40, 286, 287, 281, + 281, 71, 317, 281, 281, 289, 281, 311, + 281, 354, 281, 339, 339, 45, 40, 286, + 287, 281, 281, 281, 294, 281, 311, 281, + 311, 281, 281, 281, 330, 330, 281, 40, + 286, 287, 281, 281, 281, 294, 281, 311, + 281, 311, 281, 281, 281, 330, 355, 281, + 40, 286, 287, 281, 281, 281, 294, 281, + 311, 281, 311, 281, 354, 281, 330, 330, + 281, 40, 286, 287, 281, 281, 281, 294, + 281, 311, 281, 311, 42, 281, 281, 58, + 312, 281, 40, 286, 287, 281, 281, 281, + 294, 281, 311, 281, 304, 305, 310, 310, + 45, 40, 286, 287, 281, 281, 281, 308, + 281, 281, 289, 281, 304, 305, 306, 310, + 45, 40, 286, 287, 281, 281, 73, 308, + 281, 281, 289, 281, 302, 281, 356, 281, + 339, 339, 45, 40, 286, 287, 281, 281, + 281, 294, 281, 302, 281, 302, 281, 281, + 281, 330, 330, 281, 40, 286, 287, 281, + 281, 281, 294, 281, 302, 281, 302, 281, + 281, 281, 330, 357, 281, 40, 286, 287, + 281, 281, 281, 294, 281, 302, 281, 302, + 281, 356, 281, 330, 330, 281, 40, 286, + 287, 281, 281, 281, 294, 281, 302, 281, + 302, 42, 281, 281, 58, 303, 281, 40, + 286, 287, 281, 281, 281, 294, 281, 302, + 281, 295, 296, 301, 301, 45, 40, 286, + 287, 281, 281, 281, 299, 281, 281, 289, + 281, 295, 296, 297, 301, 45, 40, 286, + 287, 281, 281, 75, 299, 281, 281, 289, + 281, 292, 281, 358, 281, 339, 339, 45, + 40, 286, 287, 281, 281, 281, 294, 281, + 292, 281, 292, 281, 281, 281, 330, 330, + 281, 40, 286, 287, 281, 281, 281, 294, + 281, 292, 281, 292, 281, 281, 281, 330, + 359, 281, 40, 286, 287, 281, 281, 281, + 294, 281, 292, 281, 292, 281, 358, 281, + 330, 330, 281, 40, 286, 287, 281, 281, + 281, 294, 281, 292, 281, 76, 44, 44, + 45, 40, 281, 281, 281, 281, 281, 76, + 281, 292, 42, 281, 281, 58, 293, 281, + 40, 286, 287, 281, 281, 281, 294, 281, + 292, 281, 282, 283, 291, 285, 45, 40, + 286, 287, 281, 281, 281, 288, 281, 281, + 289, 281, 361, 191, 362, 362, 84, 79, + 194, 195, 360, 360, 360, 197, 360, 360, + 200, 360, 191, 362, 362, 84, 79, 194, + 195, 360, 360, 360, 197, 360, 360, 200, + 360, 363, 360, 360, 360, 98, 364, 360, + 79, 194, 195, 360, 360, 360, 365, 360, + 363, 360, 366, 367, 368, 369, 84, 79, + 194, 195, 360, 360, 115, 370, 360, 360, + 200, 360, 371, 367, 372, 372, 84, 79, + 194, 195, 360, 360, 360, 370, 360, 360, + 200, 360, 367, 372, 372, 84, 79, 194, + 195, 360, 360, 360, 370, 360, 360, 200, + 360, 373, 360, 360, 360, 98, 374, 360, + 79, 194, 195, 360, 360, 360, 365, 360, + 373, 360, 375, 376, 377, 378, 84, 79, + 194, 195, 360, 360, 113, 379, 360, 360, + 200, 360, 380, 376, 381, 381, 84, 79, + 194, 195, 360, 360, 360, 379, 360, 360, + 200, 360, 376, 381, 381, 84, 79, 194, + 195, 360, 360, 360, 379, 360, 360, 200, + 360, 382, 360, 360, 360, 98, 383, 360, + 79, 194, 195, 360, 360, 360, 365, 360, + 382, 360, 384, 385, 386, 387, 84, 79, + 194, 195, 360, 360, 111, 388, 360, 360, + 200, 360, 389, 385, 390, 390, 84, 79, + 194, 195, 360, 360, 360, 388, 360, 360, + 200, 360, 385, 390, 390, 84, 79, 194, + 195, 360, 360, 360, 388, 360, 360, 200, + 360, 391, 360, 360, 360, 98, 392, 360, + 79, 194, 195, 360, 360, 360, 365, 360, + 391, 360, 393, 394, 395, 396, 84, 79, + 194, 195, 360, 360, 109, 397, 360, 360, + 200, 360, 398, 394, 399, 399, 84, 79, + 194, 195, 360, 360, 360, 397, 360, 360, + 200, 360, 394, 399, 399, 84, 79, 194, + 195, 360, 360, 360, 397, 360, 360, 200, + 360, 98, 400, 360, 79, 194, 195, 360, + 360, 360, 365, 360, 401, 401, 360, 79, + 194, 195, 360, 360, 360, 365, 360, 402, + 360, 360, 403, 194, 195, 360, 194, 195, + 360, 404, 360, 194, 405, 360, 194, 406, + 360, 194, 360, 402, 360, 360, 360, 194, + 195, 360, 407, 360, 408, 409, 360, 79, + 194, 195, 360, 360, 82, 360, 81, 360, + 401, 401, 360, 79, 194, 195, 360, 401, + 401, 360, 79, 194, 195, 360, 407, 360, + 401, 401, 360, 79, 194, 195, 360, 407, + 360, 408, 401, 360, 79, 194, 195, 360, + 360, 82, 360, 98, 360, 410, 410, 84, + 79, 194, 195, 360, 360, 360, 365, 360, + 411, 107, 412, 413, 88, 79, 194, 195, + 360, 360, 360, 365, 360, 107, 412, 413, + 88, 79, 194, 195, 360, 360, 360, 365, + 360, 412, 412, 88, 79, 194, 195, 360, + 360, 360, 365, 360, 414, 104, 415, 416, + 91, 79, 194, 195, 360, 360, 360, 365, + 360, 104, 415, 416, 91, 79, 194, 195, + 360, 360, 360, 365, 360, 415, 415, 91, + 79, 194, 195, 360, 360, 360, 365, 360, + 417, 101, 418, 419, 94, 79, 194, 195, + 360, 360, 360, 365, 360, 101, 418, 419, + 94, 79, 194, 195, 360, 360, 360, 365, + 360, 418, 418, 94, 79, 194, 195, 360, + 360, 360, 365, 360, 420, 98, 401, 421, + 360, 79, 194, 195, 360, 360, 360, 365, + 360, 98, 401, 421, 360, 79, 194, 195, + 360, 360, 360, 365, 360, 401, 422, 360, + 79, 194, 195, 360, 360, 360, 365, 360, + 98, 360, 401, 401, 360, 79, 194, 195, + 360, 360, 360, 365, 360, 80, 81, 360, + 360, 98, 400, 360, 79, 194, 195, 360, + 360, 360, 365, 360, 80, 360, 394, 399, + 399, 84, 79, 194, 195, 360, 360, 360, + 397, 360, 393, 394, 399, 399, 84, 79, + 194, 195, 360, 360, 360, 397, 360, 360, + 200, 360, 393, 394, 395, 399, 84, 79, + 194, 195, 360, 360, 109, 397, 360, 360, + 200, 360, 391, 360, 423, 360, 410, 410, + 84, 79, 194, 195, 360, 360, 360, 365, + 360, 391, 360, 391, 360, 360, 360, 401, + 401, 360, 79, 194, 195, 360, 360, 360, + 365, 360, 391, 360, 391, 360, 360, 360, + 401, 424, 360, 79, 194, 195, 360, 360, + 360, 365, 360, 391, 360, 391, 360, 423, + 360, 401, 401, 360, 79, 194, 195, 360, + 360, 360, 365, 360, 391, 360, 391, 81, + 360, 360, 98, 392, 360, 79, 194, 195, + 360, 360, 360, 365, 360, 391, 360, 384, + 385, 390, 390, 84, 79, 194, 195, 360, + 360, 360, 388, 360, 360, 200, 360, 384, + 385, 386, 390, 84, 79, 194, 195, 360, + 360, 111, 388, 360, 360, 200, 360, 382, + 360, 425, 360, 410, 410, 84, 79, 194, + 195, 360, 360, 360, 365, 360, 382, 360, + 382, 360, 360, 360, 401, 401, 360, 79, + 194, 195, 360, 360, 360, 365, 360, 382, + 360, 382, 360, 360, 360, 401, 426, 360, + 79, 194, 195, 360, 360, 360, 365, 360, + 382, 360, 382, 360, 425, 360, 401, 401, + 360, 79, 194, 195, 360, 360, 360, 365, + 360, 382, 360, 382, 81, 360, 360, 98, + 383, 360, 79, 194, 195, 360, 360, 360, + 365, 360, 382, 360, 375, 376, 381, 381, + 84, 79, 194, 195, 360, 360, 360, 379, + 360, 360, 200, 360, 375, 376, 377, 381, + 84, 79, 194, 195, 360, 360, 113, 379, + 360, 360, 200, 360, 373, 360, 427, 360, + 410, 410, 84, 79, 194, 195, 360, 360, + 360, 365, 360, 373, 360, 373, 360, 360, + 360, 401, 401, 360, 79, 194, 195, 360, + 360, 360, 365, 360, 373, 360, 373, 360, + 360, 360, 401, 428, 360, 79, 194, 195, + 360, 360, 360, 365, 360, 373, 360, 373, + 360, 427, 360, 401, 401, 360, 79, 194, + 195, 360, 360, 360, 365, 360, 373, 360, + 373, 81, 360, 360, 98, 374, 360, 79, + 194, 195, 360, 360, 360, 365, 360, 373, + 360, 366, 367, 372, 372, 84, 79, 194, + 195, 360, 360, 360, 370, 360, 360, 200, + 360, 366, 367, 368, 372, 84, 79, 194, + 195, 360, 360, 115, 370, 360, 360, 200, + 360, 363, 360, 429, 360, 410, 410, 84, + 79, 194, 195, 360, 360, 360, 365, 360, + 363, 360, 363, 360, 360, 360, 401, 401, + 360, 79, 194, 195, 360, 360, 360, 365, + 360, 363, 360, 363, 360, 360, 360, 401, + 430, 360, 79, 194, 195, 360, 360, 360, + 365, 360, 363, 360, 363, 360, 429, 360, + 401, 401, 360, 79, 194, 195, 360, 360, + 360, 365, 360, 363, 360, 363, 81, 360, + 360, 98, 364, 360, 79, 194, 195, 360, + 360, 360, 365, 360, 363, 360, 116, 83, + 83, 84, 79, 431, 431, 431, 431, 156, + 116, 431, 190, 191, 362, 362, 84, 79, + 194, 195, 360, 360, 360, 197, 360, 360, + 200, 360, 116, 83, 83, 84, 79, 431, + 431, 431, 431, 431, 116, 431, 433, 434, + 435, 436, 123, 118, 437, 438, 432, 432, + 155, 439, 432, 432, 440, 432, 441, 434, + 436, 436, 123, 118, 437, 438, 432, 432, + 432, 439, 432, 432, 440, 432, 434, 436, + 436, 123, 118, 437, 438, 432, 432, 432, + 439, 432, 432, 440, 432, 442, 432, 432, + 432, 136, 443, 432, 118, 437, 438, 432, + 432, 432, 444, 432, 442, 432, 445, 446, + 447, 448, 123, 118, 437, 438, 432, 432, + 153, 449, 432, 432, 440, 432, 450, 446, + 451, 451, 123, 118, 437, 438, 432, 432, + 432, 449, 432, 432, 440, 432, 446, 451, + 451, 123, 118, 437, 438, 432, 432, 432, + 449, 432, 432, 440, 432, 452, 432, 432, + 432, 136, 453, 432, 118, 437, 438, 432, + 432, 432, 444, 432, 452, 432, 454, 455, + 456, 457, 123, 118, 437, 438, 432, 432, + 151, 458, 432, 432, 440, 432, 459, 455, + 460, 460, 123, 118, 437, 438, 432, 432, + 432, 458, 432, 432, 440, 432, 455, 460, + 460, 123, 118, 437, 438, 432, 432, 432, + 458, 432, 432, 440, 432, 461, 432, 432, + 432, 136, 462, 432, 118, 437, 438, 432, + 432, 432, 444, 432, 461, 432, 463, 464, + 465, 466, 123, 118, 437, 438, 432, 432, + 149, 467, 432, 432, 440, 432, 468, 464, + 469, 469, 123, 118, 437, 438, 432, 432, + 432, 467, 432, 432, 440, 432, 464, 469, + 469, 123, 118, 437, 438, 432, 432, 432, + 467, 432, 432, 440, 432, 470, 432, 432, + 432, 136, 471, 432, 118, 437, 438, 432, + 432, 432, 444, 432, 470, 432, 472, 473, + 474, 475, 123, 118, 437, 438, 432, 432, + 147, 476, 432, 432, 440, 432, 477, 473, + 478, 478, 123, 118, 437, 438, 432, 432, + 432, 476, 432, 432, 440, 432, 473, 478, + 478, 123, 118, 437, 438, 432, 432, 432, + 476, 432, 432, 440, 432, 136, 479, 432, + 118, 437, 438, 432, 432, 432, 444, 432, + 480, 480, 432, 118, 437, 438, 432, 432, + 432, 444, 432, 481, 432, 432, 482, 437, + 438, 432, 437, 438, 432, 483, 432, 437, + 484, 432, 437, 485, 432, 437, 432, 481, + 432, 432, 432, 437, 438, 432, 486, 432, + 487, 488, 432, 118, 437, 438, 432, 432, + 121, 432, 120, 432, 480, 480, 432, 118, + 437, 438, 432, 480, 480, 432, 118, 437, + 438, 432, 486, 432, 480, 480, 432, 118, + 437, 438, 432, 486, 432, 487, 480, 432, + 118, 437, 438, 432, 432, 121, 432, 136, + 432, 489, 489, 123, 118, 437, 438, 432, + 432, 432, 444, 432, 490, 145, 491, 492, + 126, 118, 437, 438, 432, 432, 432, 444, + 432, 145, 491, 492, 126, 118, 437, 438, + 432, 432, 432, 444, 432, 491, 491, 126, + 118, 437, 438, 432, 432, 432, 444, 432, + 493, 142, 494, 495, 129, 118, 437, 438, + 432, 432, 432, 444, 432, 142, 494, 495, + 129, 118, 437, 438, 432, 432, 432, 444, + 432, 494, 494, 129, 118, 437, 438, 432, + 432, 432, 444, 432, 496, 139, 497, 498, + 132, 118, 437, 438, 432, 432, 432, 444, + 432, 139, 497, 498, 132, 118, 437, 438, + 432, 432, 432, 444, 432, 497, 497, 132, + 118, 437, 438, 432, 432, 432, 444, 432, + 499, 136, 480, 500, 432, 118, 437, 438, + 432, 432, 432, 444, 432, 136, 480, 500, + 432, 118, 437, 438, 432, 432, 432, 444, + 432, 480, 501, 432, 118, 437, 438, 432, + 432, 432, 444, 432, 136, 432, 480, 480, + 432, 118, 437, 438, 432, 432, 432, 444, + 432, 119, 120, 432, 432, 136, 479, 432, + 118, 437, 438, 432, 432, 432, 444, 432, + 119, 432, 473, 478, 478, 123, 118, 437, + 438, 432, 432, 432, 476, 432, 472, 473, + 478, 478, 123, 118, 437, 438, 432, 432, + 432, 476, 432, 432, 440, 432, 472, 473, + 474, 478, 123, 118, 437, 438, 432, 432, + 147, 476, 432, 432, 440, 432, 470, 432, + 502, 432, 489, 489, 123, 118, 437, 438, + 432, 432, 432, 444, 432, 470, 432, 470, + 432, 432, 432, 480, 480, 432, 118, 437, + 438, 432, 432, 432, 444, 432, 470, 432, + 470, 432, 432, 432, 480, 503, 432, 118, + 437, 438, 432, 432, 432, 444, 432, 470, + 432, 470, 432, 502, 432, 480, 480, 432, + 118, 437, 438, 432, 432, 432, 444, 432, + 470, 432, 470, 120, 432, 432, 136, 471, + 432, 118, 437, 438, 432, 432, 432, 444, + 432, 470, 432, 463, 464, 469, 469, 123, + 118, 437, 438, 432, 432, 432, 467, 432, + 432, 440, 432, 463, 464, 465, 469, 123, + 118, 437, 438, 432, 432, 149, 467, 432, + 432, 440, 432, 461, 432, 504, 432, 489, + 489, 123, 118, 437, 438, 432, 432, 432, + 444, 432, 461, 432, 461, 432, 432, 432, + 480, 480, 432, 118, 437, 438, 432, 432, + 432, 444, 432, 461, 432, 461, 432, 432, + 432, 480, 505, 432, 118, 437, 438, 432, + 432, 432, 444, 432, 461, 432, 461, 432, + 504, 432, 480, 480, 432, 118, 437, 438, + 432, 432, 432, 444, 432, 461, 432, 461, + 120, 432, 432, 136, 462, 432, 118, 437, + 438, 432, 432, 432, 444, 432, 461, 432, + 454, 455, 460, 460, 123, 118, 437, 438, + 432, 432, 432, 458, 432, 432, 440, 432, + 454, 455, 456, 460, 123, 118, 437, 438, + 432, 432, 151, 458, 432, 432, 440, 432, + 452, 432, 506, 432, 489, 489, 123, 118, + 437, 438, 432, 432, 432, 444, 432, 452, + 432, 452, 432, 432, 432, 480, 480, 432, + 118, 437, 438, 432, 432, 432, 444, 432, + 452, 432, 452, 432, 432, 432, 480, 507, + 432, 118, 437, 438, 432, 432, 432, 444, + 432, 452, 432, 452, 432, 506, 432, 480, + 480, 432, 118, 437, 438, 432, 432, 432, + 444, 432, 452, 432, 452, 120, 432, 432, + 136, 453, 432, 118, 437, 438, 432, 432, + 432, 444, 432, 452, 432, 445, 446, 451, + 451, 123, 118, 437, 438, 432, 432, 432, + 449, 432, 432, 440, 432, 445, 446, 447, + 451, 123, 118, 437, 438, 432, 432, 153, + 449, 432, 432, 440, 432, 442, 432, 508, + 432, 489, 489, 123, 118, 437, 438, 432, + 432, 432, 444, 432, 442, 432, 442, 432, + 432, 432, 480, 480, 432, 118, 437, 438, + 432, 432, 432, 444, 432, 442, 432, 442, + 432, 432, 432, 480, 509, 432, 118, 437, + 438, 432, 432, 432, 444, 432, 442, 432, + 442, 432, 508, 432, 480, 480, 432, 118, + 437, 438, 432, 432, 432, 444, 432, 442, + 432, 442, 120, 432, 432, 136, 443, 432, + 118, 437, 438, 432, 432, 432, 444, 432, + 442, 432, 433, 434, 436, 436, 123, 118, + 437, 438, 432, 432, 432, 439, 432, 432, + 440, 432, 188, 189, 190, 191, 510, 362, + 84, 79, 194, 195, 196, 196, 156, 197, + 360, 188, 200, 360, 203, 511, 205, 206, + 6, 1, 207, 208, 202, 202, 38, 209, + 202, 202, 210, 202, 213, 189, 190, 191, + 512, 513, 84, 157, 514, 515, 202, 196, + 156, 516, 202, 213, 200, 202, 116, 517, + 517, 84, 157, 207, 208, 202, 202, 156, + 518, 202, 519, 202, 202, 520, 514, 515, + 202, 514, 515, 202, 254, 202, 514, 521, + 202, 514, 522, 202, 514, 202, 519, 202, + 202, 202, 514, 515, 202, 523, 3, 360, + 360, 401, 430, 360, 79, 194, 195, 360, + 360, 360, 365, 360, 523, 360, 524, 367, + 525, 526, 84, 157, 514, 515, 202, 202, + 158, 370, 202, 202, 200, 202, 527, 367, + 528, 528, 84, 157, 514, 515, 202, 202, + 202, 370, 202, 202, 200, 202, 367, 528, + 528, 84, 157, 514, 515, 202, 202, 202, + 370, 202, 202, 200, 202, 524, 367, 528, + 528, 84, 157, 514, 515, 202, 202, 202, + 370, 202, 202, 200, 202, 524, 367, 525, + 528, 84, 157, 514, 515, 202, 202, 158, + 370, 202, 202, 200, 202, 213, 202, 279, + 116, 529, 529, 160, 157, 207, 208, 202, + 202, 202, 518, 202, 213, 202, 530, 184, + 531, 532, 162, 157, 514, 515, 202, 202, + 202, 533, 202, 184, 531, 532, 162, 157, + 514, 515, 202, 202, 202, 533, 202, 531, + 531, 162, 157, 514, 515, 202, 202, 202, + 533, 202, 534, 181, 535, 536, 165, 157, + 514, 515, 202, 202, 202, 533, 202, 181, + 535, 536, 165, 157, 514, 515, 202, 202, + 202, 533, 202, 535, 535, 165, 157, 514, + 515, 202, 202, 202, 533, 202, 537, 178, + 538, 539, 168, 157, 514, 515, 202, 202, + 202, 533, 202, 178, 538, 539, 168, 157, + 514, 515, 202, 202, 202, 533, 202, 538, + 538, 168, 157, 514, 515, 202, 202, 202, + 533, 202, 540, 175, 541, 542, 202, 157, + 514, 515, 202, 202, 202, 533, 202, 175, + 541, 542, 202, 157, 514, 515, 202, 202, + 202, 533, 202, 541, 541, 202, 157, 514, + 515, 202, 202, 202, 533, 202, 543, 202, + 544, 545, 202, 157, 514, 515, 202, 202, + 172, 202, 171, 202, 541, 541, 202, 157, + 514, 515, 202, 541, 541, 202, 157, 514, + 515, 202, 543, 202, 541, 541, 202, 157, + 514, 515, 202, 543, 202, 544, 541, 202, + 157, 514, 515, 202, 202, 172, 202, 523, + 171, 360, 360, 98, 364, 360, 79, 194, + 195, 360, 360, 360, 365, 360, 523, 360, + 547, 546, 548, 548, 546, 186, 549, 550, + 546, 548, 548, 546, 186, 549, 550, 546, + 551, 546, 546, 552, 549, 550, 546, 549, + 550, 546, 553, 546, 549, 554, 546, 549, + 555, 546, 549, 546, 551, 546, 546, 546, + 549, 550, 546, 0 }; static const short _indic_syllable_machine_trans_targs[] = { 178, 200, 207, 209, 210, 4, 213, 5, 7, 216, 8, 10, 219, 11, 13, 222, 14, 16, 17, 199, 19, 20, 221, 22, - 23, 218, 25, 26, 215, 224, 229, 233, - 236, 240, 243, 247, 250, 254, 257, 178, - 280, 287, 289, 290, 41, 293, 42, 44, - 296, 45, 47, 299, 48, 50, 302, 51, - 53, 54, 279, 56, 57, 301, 59, 60, - 298, 62, 63, 295, 304, 309, 313, 316, - 320, 323, 327, 330, 334, 338, 178, 359, - 366, 368, 369, 78, 372, 178, 79, 81, - 375, 82, 84, 378, 85, 87, 381, 88, - 90, 91, 358, 93, 94, 380, 96, 97, - 377, 99, 100, 374, 383, 388, 392, 395, - 399, 402, 406, 409, 413, 178, 440, 447, - 449, 450, 114, 453, 115, 117, 456, 118, - 120, 459, 121, 123, 462, 124, 126, 127, - 439, 129, 130, 461, 132, 133, 458, 135, - 136, 455, 464, 469, 473, 476, 480, 483, - 487, 490, 494, 497, 417, 502, 513, 152, - 516, 154, 519, 155, 157, 522, 158, 160, - 525, 161, 528, 530, 531, 166, 167, 527, - 169, 170, 524, 172, 173, 521, 175, 176, - 518, 178, 536, 178, 179, 259, 339, 341, - 416, 418, 361, 362, 419, 415, 498, 499, - 386, 534, 387, 178, 180, 182, 36, 258, - 202, 203, 256, 227, 228, 181, 35, 183, - 252, 1, 184, 186, 34, 251, 249, 185, - 33, 187, 245, 188, 190, 32, 244, 242, - 189, 31, 191, 238, 192, 194, 30, 237, - 235, 193, 29, 195, 231, 196, 198, 28, - 230, 226, 197, 27, 212, 0, 201, 206, - 178, 204, 205, 208, 2, 211, 3, 214, - 6, 24, 217, 9, 21, 220, 12, 18, - 223, 15, 225, 232, 234, 239, 241, 246, - 248, 253, 255, 178, 260, 262, 73, 336, - 282, 283, 337, 307, 308, 261, 72, 263, - 332, 38, 264, 266, 71, 331, 329, 265, - 70, 267, 325, 268, 270, 69, 324, 322, - 269, 68, 271, 318, 272, 274, 67, 317, - 315, 273, 66, 275, 311, 276, 278, 65, - 310, 306, 277, 64, 292, 37, 281, 286, - 178, 284, 285, 288, 39, 291, 40, 294, - 43, 61, 297, 46, 58, 300, 49, 55, - 303, 52, 305, 312, 314, 319, 321, 326, - 328, 333, 335, 178, 340, 109, 342, 411, - 75, 343, 345, 108, 410, 408, 344, 107, - 346, 404, 347, 349, 106, 403, 401, 348, - 105, 350, 397, 351, 353, 104, 396, 394, - 352, 103, 354, 390, 355, 357, 102, 389, - 385, 356, 101, 371, 74, 360, 365, 178, - 363, 364, 367, 76, 370, 77, 373, 80, - 98, 376, 83, 95, 379, 86, 92, 382, - 89, 384, 391, 393, 398, 400, 405, 407, - 412, 414, 178, 178, 420, 422, 146, 145, - 442, 443, 496, 467, 468, 421, 423, 492, - 111, 424, 426, 144, 491, 489, 425, 143, - 427, 485, 428, 430, 142, 484, 482, 429, - 141, 431, 478, 432, 434, 140, 477, 475, - 433, 139, 435, 471, 436, 438, 138, 470, - 466, 437, 137, 452, 110, 441, 446, 178, - 444, 445, 448, 112, 451, 113, 454, 116, - 134, 457, 119, 131, 460, 122, 128, 463, - 125, 465, 472, 474, 479, 481, 486, 488, - 493, 495, 147, 500, 501, 515, 504, 505, - 533, 148, 509, 503, 508, 506, 507, 510, - 511, 150, 514, 512, 149, 151, 517, 153, - 174, 163, 520, 156, 171, 523, 159, 168, - 526, 162, 165, 529, 164, 532, 178, 535, - 177, 538, 539, 537, 542, 178, 540, 541 + 23, 218, 25, 26, 215, 224, 228, 232, + 235, 239, 242, 246, 249, 253, 256, 178, + 279, 286, 288, 289, 41, 292, 42, 44, + 295, 45, 47, 298, 48, 50, 301, 51, + 53, 54, 278, 56, 57, 300, 59, 60, + 297, 62, 63, 294, 303, 307, 311, 314, + 318, 321, 325, 328, 332, 336, 178, 357, + 364, 366, 367, 78, 370, 178, 79, 81, + 373, 82, 84, 376, 85, 87, 379, 88, + 90, 91, 356, 93, 94, 378, 96, 97, + 375, 99, 100, 372, 381, 385, 389, 392, + 396, 399, 403, 406, 410, 178, 437, 444, + 446, 447, 114, 450, 115, 117, 453, 118, + 120, 456, 121, 123, 459, 124, 126, 127, + 436, 129, 130, 458, 132, 133, 455, 135, + 136, 452, 461, 465, 469, 472, 476, 479, + 483, 486, 490, 493, 414, 498, 509, 152, + 512, 154, 515, 155, 157, 518, 158, 160, + 521, 161, 524, 526, 527, 166, 167, 523, + 169, 170, 520, 172, 173, 517, 175, 176, + 514, 178, 532, 178, 179, 258, 337, 339, + 413, 415, 359, 360, 416, 412, 494, 495, + 384, 530, 178, 180, 182, 36, 257, 202, + 203, 255, 227, 181, 35, 183, 251, 1, + 184, 186, 34, 250, 248, 185, 33, 187, + 244, 188, 190, 32, 243, 241, 189, 31, + 191, 237, 192, 194, 30, 236, 234, 193, + 29, 195, 230, 196, 198, 28, 229, 226, + 197, 27, 212, 0, 201, 206, 178, 204, + 205, 208, 2, 211, 3, 214, 6, 24, + 217, 9, 21, 220, 12, 18, 223, 15, + 225, 231, 233, 238, 240, 245, 247, 252, + 254, 178, 259, 261, 73, 334, 281, 282, + 335, 306, 260, 72, 262, 330, 38, 263, + 265, 71, 329, 327, 264, 70, 266, 323, + 267, 269, 69, 322, 320, 268, 68, 270, + 316, 271, 273, 67, 315, 313, 272, 66, + 274, 309, 275, 277, 65, 308, 305, 276, + 64, 291, 37, 280, 285, 178, 283, 284, + 287, 39, 290, 40, 293, 43, 61, 296, + 46, 58, 299, 49, 55, 302, 52, 304, + 310, 312, 317, 319, 324, 326, 331, 333, + 178, 338, 109, 340, 408, 75, 341, 343, + 108, 407, 405, 342, 107, 344, 401, 345, + 347, 106, 400, 398, 346, 105, 348, 394, + 349, 351, 104, 393, 391, 350, 103, 352, + 387, 353, 355, 102, 386, 383, 354, 101, + 369, 74, 358, 363, 178, 361, 362, 365, + 76, 368, 77, 371, 80, 98, 374, 83, + 95, 377, 86, 92, 380, 89, 382, 388, + 390, 395, 397, 402, 404, 409, 411, 178, + 178, 417, 419, 146, 145, 439, 440, 492, + 464, 418, 420, 488, 111, 421, 423, 144, + 487, 485, 422, 143, 424, 481, 425, 427, + 142, 480, 478, 426, 141, 428, 474, 429, + 431, 140, 473, 471, 430, 139, 432, 467, + 433, 435, 138, 466, 463, 434, 137, 449, + 110, 438, 443, 178, 441, 442, 445, 112, + 448, 113, 451, 116, 134, 454, 119, 131, + 457, 122, 128, 460, 125, 462, 468, 470, + 475, 477, 482, 484, 489, 491, 147, 496, + 497, 511, 500, 501, 529, 148, 505, 499, + 504, 502, 503, 506, 507, 150, 510, 508, + 149, 151, 513, 153, 174, 163, 516, 156, + 171, 519, 159, 168, 522, 162, 165, 525, + 164, 528, 178, 531, 177, 534, 535, 533, + 538, 178, 536, 537 }; static const char _indic_syllable_machine_trans_actions[] = { @@ -1285,51 +1087,51 @@ 0, 0, 2, 0, 0, 2, 0, 0, 2, 9, 0, 12, 2, 2, 6, 2, 13, 13, 0, 0, 2, 2, 6, 2, - 6, 2, 6, 14, 2, 2, 0, 2, - 0, 0, 2, 2, 2, 2, 0, 2, - 2, 0, 2, 2, 0, 2, 2, 2, - 0, 2, 2, 2, 2, 0, 2, 2, - 2, 0, 2, 2, 2, 2, 0, 2, - 2, 2, 0, 2, 2, 2, 2, 0, - 2, 2, 2, 0, 2, 0, 0, 0, - 15, 0, 0, 2, 0, 2, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 16, 2, 2, 0, 2, - 0, 0, 2, 2, 2, 2, 0, 2, - 2, 0, 2, 2, 0, 2, 2, 2, - 0, 2, 2, 2, 2, 0, 2, 2, - 2, 0, 2, 2, 2, 2, 0, 2, - 2, 2, 0, 2, 2, 2, 2, 0, - 2, 2, 2, 0, 2, 0, 0, 0, - 17, 0, 0, 2, 0, 2, 0, 2, - 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 2, 2, 2, 2, 2, 2, - 2, 2, 2, 18, 6, 0, 6, 6, - 0, 6, 2, 0, 6, 2, 6, 0, - 6, 6, 6, 2, 0, 6, 2, 6, - 0, 6, 6, 6, 2, 0, 6, 2, - 6, 0, 6, 6, 6, 2, 0, 6, - 2, 6, 0, 6, 0, 0, 0, 19, - 0, 0, 2, 0, 2, 0, 2, 0, - 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 20, 21, 2, 2, 0, 0, - 0, 0, 2, 2, 2, 2, 2, 2, - 0, 2, 2, 0, 2, 2, 2, 0, + 6, 2, 14, 2, 2, 0, 2, 0, + 0, 2, 2, 2, 0, 2, 2, 0, + 2, 2, 0, 2, 2, 2, 0, 2, + 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, 2, 0, 2, 2, 2, 2, 0, 2, 2, - 2, 0, 2, 2, 2, 2, 0, 2, - 2, 2, 0, 2, 0, 0, 0, 22, - 0, 0, 2, 0, 2, 0, 2, 0, + 2, 0, 2, 0, 0, 0, 15, 0, + 0, 2, 0, 2, 0, 2, 0, 0, + 2, 0, 0, 2, 0, 0, 2, 0, + 2, 2, 2, 2, 2, 2, 2, 2, + 2, 16, 2, 2, 0, 2, 0, 0, + 2, 2, 2, 0, 2, 2, 0, 2, + 2, 0, 2, 2, 2, 0, 2, 2, + 2, 2, 0, 2, 2, 2, 0, 2, + 2, 2, 2, 0, 2, 2, 2, 0, + 2, 2, 2, 2, 0, 2, 2, 2, + 0, 2, 0, 0, 0, 17, 0, 0, + 2, 0, 2, 0, 2, 0, 0, 2, + 0, 0, 2, 0, 0, 2, 0, 2, + 2, 2, 2, 2, 2, 2, 2, 2, + 18, 6, 0, 6, 6, 0, 6, 2, + 0, 6, 2, 6, 0, 6, 6, 6, + 2, 0, 6, 2, 6, 0, 6, 6, + 6, 2, 0, 6, 2, 6, 0, 6, + 6, 6, 2, 0, 6, 2, 6, 0, + 6, 0, 0, 0, 19, 0, 0, 2, + 0, 2, 0, 2, 0, 0, 2, 0, + 0, 2, 0, 0, 2, 0, 2, 2, + 2, 2, 2, 2, 2, 2, 2, 20, + 21, 2, 2, 0, 0, 0, 0, 2, + 2, 2, 2, 2, 0, 2, 2, 0, + 2, 2, 2, 0, 2, 2, 2, 2, + 0, 2, 2, 2, 0, 2, 2, 2, + 2, 0, 2, 2, 2, 0, 2, 2, + 2, 2, 0, 2, 2, 2, 0, 2, + 0, 0, 0, 22, 0, 0, 2, 0, + 2, 0, 2, 0, 0, 2, 0, 0, + 2, 0, 0, 2, 0, 2, 2, 2, + 2, 2, 2, 2, 2, 2, 0, 0, + 8, 2, 0, 0, 2, 0, 2, 0, + 0, 0, 0, 8, 8, 0, 8, 8, + 0, 0, 2, 0, 0, 0, 2, 0, 0, 2, 0, 0, 2, 0, 0, 2, - 0, 2, 2, 2, 2, 2, 2, 2, - 2, 2, 0, 0, 8, 2, 0, 0, - 2, 0, 2, 0, 0, 0, 0, 8, - 8, 0, 8, 8, 0, 0, 2, 0, - 0, 0, 2, 0, 0, 2, 0, 0, - 2, 0, 0, 2, 0, 2, 23, 2, - 0, 0, 0, 0, 0, 24, 0, 0 + 0, 2, 23, 2, 0, 0, 0, 0, + 0, 24, 0, 0 }; static const char _indic_syllable_machine_to_state_actions[] = { @@ -1400,7 +1202,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0 }; static const char _indic_syllable_machine_from_state_actions[] = { @@ -1471,7 +1273,7 @@ 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0 + 0, 0, 0 }; static const short _indic_syllable_machine_eof_trans[] = { @@ -1497,52 +1299,52 @@ 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, 1, - 1, 186, 0, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 284, 284, 284, 284, 284, - 284, 284, 284, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 364, 364, 364, 364, 364, 364, 364, 364, - 435, 364, 435, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 436, 436, 436, 436, 436, 436, - 436, 436, 364, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 364, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 204, 204, 204, - 204, 204, 204, 204, 204, 364, 551, 551, - 551, 551, 551, 551, 551, 551, 551 + 1, 186, 0, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 282, 282, 282, 282, 282, 282, 282, + 282, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 361, 361, 361, + 361, 361, 361, 361, 361, 432, 361, 432, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 433, 433, + 433, 433, 433, 433, 433, 433, 361, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 361, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 203, 203, 203, 203, 203, 203, 203, + 203, 361, 547, 547, 547, 547, 547, 547, + 547, 547, 547 }; static const int indic_syllable_machine_start = 178; @@ -1556,7 +1358,7 @@ -#line 97 "hb-ot-shape-complex-indic-machine.rl" +#line 96 "hb-ot-shape-complex-indic-machine.rl" #define found_syllable(syllable_type) \ @@ -1576,7 +1378,7 @@ int cs; hb_glyph_info_t *info = buffer->info; -#line 1580 "hb-ot-shape-complex-indic-machine.hh" +#line 1382 "hb-ot-shape-complex-indic-machine.hh" { cs = indic_syllable_machine_start; ts = 0; @@ -1584,7 +1386,7 @@ act = 0; } -#line 118 "hb-ot-shape-complex-indic-machine.rl" +#line 117 "hb-ot-shape-complex-indic-machine.rl" p = 0; @@ -1593,7 +1395,7 @@ unsigned int last = 0; unsigned int syllable_serial = 1; -#line 1597 "hb-ot-shape-complex-indic-machine.hh" +#line 1399 "hb-ot-shape-complex-indic-machine.hh" { int _slen; int _trans; @@ -1607,7 +1409,7 @@ #line 1 "NONE" {ts = p;} break; -#line 1611 "hb-ot-shape-complex-indic-machine.hh" +#line 1413 "hb-ot-shape-complex-indic-machine.hh" } _keys = _indic_syllable_machine_trans_keys + (cs<<1); @@ -1630,71 +1432,71 @@ {te = p+1;} break; case 15: -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 87 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; case 17: -#line 89 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (vowel_syllable); }} break; case 22: -#line 90 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (standalone_cluster); }} break; case 24: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (symbol_cluster); }} break; case 19: -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 12: -#line 93 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" {te = p+1;{ found_syllable (non_indic_cluster); }} break; case 14: -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 87 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; case 16: -#line 89 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (vowel_syllable); }} break; case 21: -#line 90 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (standalone_cluster); }} break; case 23: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 90 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; case 18: -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 20: -#line 93 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" {te = p;p--;{ found_syllable (non_indic_cluster); }} break; case 1: -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 87 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (consonant_syllable); }} break; case 3: -#line 89 "hb-ot-shape-complex-indic-machine.rl" +#line 88 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (vowel_syllable); }} break; case 7: -#line 90 "hb-ot-shape-complex-indic-machine.rl" +#line 89 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (standalone_cluster); }} break; case 9: -#line 91 "hb-ot-shape-complex-indic-machine.rl" +#line 90 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (symbol_cluster); }} break; case 4: -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; case 5: @@ -1715,22 +1517,22 @@ case 8: #line 1 "NONE" {te = p+1;} -#line 88 "hb-ot-shape-complex-indic-machine.rl" +#line 87 "hb-ot-shape-complex-indic-machine.rl" {act = 1;} break; case 6: #line 1 "NONE" {te = p+1;} -#line 92 "hb-ot-shape-complex-indic-machine.rl" +#line 91 "hb-ot-shape-complex-indic-machine.rl" {act = 5;} break; case 13: #line 1 "NONE" {te = p+1;} -#line 93 "hb-ot-shape-complex-indic-machine.rl" +#line 92 "hb-ot-shape-complex-indic-machine.rl" {act = 6;} break; -#line 1734 "hb-ot-shape-complex-indic-machine.hh" +#line 1536 "hb-ot-shape-complex-indic-machine.hh" } _again: @@ -1739,7 +1541,7 @@ #line 1 "NONE" {ts = 0;} break; -#line 1743 "hb-ot-shape-complex-indic-machine.hh" +#line 1545 "hb-ot-shape-complex-indic-machine.hh" } if ( ++p != pe ) @@ -1755,7 +1557,7 @@ } -#line 127 "hb-ot-shape-complex-indic-machine.rl" +#line 126 "hb-ot-shape-complex-indic-machine.rl" }
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -60,11 +60,10 @@ OT_Repha = 15, /* Atomically-encoded logical or visual repha. */ OT_Ra = 16, OT_CM = 17, /* Consonant-Medial. */ - OT_Symbol = 18, /* Avagraha, etc that take marks (SM,A,VD). */ - OT_CM2 = 31 /* Consonant-Medial, second slot. */ + OT_Symbol = 18 /* Avagraha, etc that take marks (SM,A,VD). */ }; -#define MEDIAL_FLAGS (FLAG (OT_CM) | FLAG (OT_CM2)) +#define MEDIAL_FLAGS (FLAG (OT_CM)) /* Note: * @@ -109,27 +108,31 @@ INDIC_SYLLABIC_CATEGORY_AVAGRAHA = OT_Symbol, INDIC_SYLLABIC_CATEGORY_BINDU = OT_SM, - INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* TODO */ + INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER = OT_PLACEHOLDER, /* Don't care. */ INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK = OT_A, INDIC_SYLLABIC_CATEGORY_CONSONANT = OT_C, INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD = OT_C, INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL = OT_CM, INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER = OT_C, + INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER = OT_M, /* U+17CD only. */ INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL = OT_CM, INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER = OT_PLACEHOLDER, INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA = OT_Repha, + INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED = OT_X, /* Don't care. */ INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED = OT_CM, INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA = OT_N, + INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER = OT_Repha, /* TODO */ INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK = OT_SM, - INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_H, /* TODO */ + INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER = OT_Coeng, INDIC_SYLLABIC_CATEGORY_JOINER = OT_ZWJ, INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER = OT_X, INDIC_SYLLABIC_CATEGORY_NON_JOINER = OT_ZWNJ, INDIC_SYLLABIC_CATEGORY_NUKTA = OT_N, INDIC_SYLLABIC_CATEGORY_NUMBER = OT_PLACEHOLDER, - INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* TODO */ - INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_H, /* TODO */ + INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER = OT_PLACEHOLDER, /* Don't care. */ + INDIC_SYLLABIC_CATEGORY_PURE_KILLER = OT_M, /* Is like a vowel matra. */ INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER = OT_RS, + INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER = OT_M, /* Misc Khmer signs. */ INDIC_SYLLABIC_CATEGORY_TONE_LETTER = OT_X, INDIC_SYLLABIC_CATEGORY_TONE_MARK = OT_N, INDIC_SYLLABIC_CATEGORY_VIRAMA = OT_H, @@ -162,17 +165,23 @@ }; #define INDIC_COMBINE_CATEGORIES(S,M) \ - (ASSERT_STATIC_EXPR_ZERO (M == INDIC_MATRA_CATEGORY_NOT_APPLICABLE || \ - ( \ - S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \ - S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \ - S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \ - S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \ - S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \ - S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \ - false)) + \ - ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \ - ((M << 8) | S)) + ( \ + ASSERT_STATIC_EXPR_ZERO (S < 255 && M < 255) + \ + ( S | \ + ( \ + ( \ + S == INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL || \ + S == INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK || \ + S == INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER || \ + S == INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA || \ + S == INDIC_SYLLABIC_CATEGORY_VIRAMA || \ + S == INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT || \ + false \ + ? M : INDIC_MATRA_CATEGORY_NOT_APPLICABLE \ + ) << 8 \ + ) \ + ) \ + ) HB_INTERNAL INDIC_TABLE_ELEMENT_TYPE hb_indic_get_categories (hb_codepoint_t u);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic-table.cc Tue Aug 09 16:20:02 2016 -0700 @@ -2,67 +2,71 @@ /* * The following table is generated by running: * - * ./gen-indic-table.py IndicSyllabicCategory.txt IndicMatraCategory.txt Blocks.txt + * ./gen-indic-table.py IndicSyllabicCategory.txt IndicPositionalCategory.txt Blocks.txt * * on files with these headers: * - * # IndicSyllabicCategory-7.0.0.txt - * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP] - * # IndicMatraCategory-7.0.0.txt - * # Date: 2014-06-03, 07:00:00 GMT [KW, LI, AG, RP] - * # Blocks-7.0.0.txt - * # Date: 2014-04-03, 23:23:00 GMT [RP, KW] + * # IndicSyllabicCategory-9.0.0.txt + * # Date: 2016-05-21, 02:46:00 GMT [RP] + * # IndicPositionalCategory-9.0.0.txt + * # Date: 2016-02-25, 00:48:00 GMT [RP] + * # Blocks-9.0.0.txt + * # Date: 2016-02-05, 23:48:00 GMT [KW] */ #include "hb-ot-shape-complex-indic-private.hh" -#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 13 chars; Avagraha */ -#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 59 chars; Bindu */ +#define ISC_A INDIC_SYLLABIC_CATEGORY_AVAGRAHA /* 15 chars; Avagraha */ +#define ISC_Bi INDIC_SYLLABIC_CATEGORY_BINDU /* 67 chars; Bindu */ #define ISC_BJN INDIC_SYLLABIC_CATEGORY_BRAHMI_JOINING_NUMBER /* 20 chars; Brahmi_Joining_Number */ -#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 30 chars; Cantillation_Mark */ -#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 1744 chars; Consonant */ -#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 7 chars; Consonant_Dead */ -#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 61 chars; Consonant_Final */ +#define ISC_Ca INDIC_SYLLABIC_CATEGORY_CANTILLATION_MARK /* 53 chars; Cantillation_Mark */ +#define ISC_C INDIC_SYLLABIC_CATEGORY_CONSONANT /* 1907 chars; Consonant */ +#define ISC_CD INDIC_SYLLABIC_CATEGORY_CONSONANT_DEAD /* 10 chars; Consonant_Dead */ +#define ISC_CF INDIC_SYLLABIC_CATEGORY_CONSONANT_FINAL /* 62 chars; Consonant_Final */ #define ISC_CHL INDIC_SYLLABIC_CATEGORY_CONSONANT_HEAD_LETTER /* 5 chars; Consonant_Head_Letter */ -#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 19 chars; Consonant_Medial */ -#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 11 chars; Consonant_Placeholder */ +#define ISC_CK INDIC_SYLLABIC_CATEGORY_CONSONANT_KILLER /* 2 chars; Consonant_Killer */ +#define ISC_CM INDIC_SYLLABIC_CATEGORY_CONSONANT_MEDIAL /* 22 chars; Consonant_Medial */ +#define ISC_CP INDIC_SYLLABIC_CATEGORY_CONSONANT_PLACEHOLDER /* 16 chars; Consonant_Placeholder */ #define ISC_CPR INDIC_SYLLABIC_CATEGORY_CONSONANT_PRECEDING_REPHA /* 1 chars; Consonant_Preceding_Repha */ -#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 61 chars; Consonant_Subjoined */ +#define ISC_CPrf INDIC_SYLLABIC_CATEGORY_CONSONANT_PREFIXED /* 2 chars; Consonant_Prefixed */ +#define ISC_CS INDIC_SYLLABIC_CATEGORY_CONSONANT_SUBJOINED /* 90 chars; Consonant_Subjoined */ #define ISC_CSR INDIC_SYLLABIC_CATEGORY_CONSONANT_SUCCEEDING_REPHA /* 4 chars; Consonant_Succeeding_Repha */ +#define ISC_CWS INDIC_SYLLABIC_CATEGORY_CONSONANT_WITH_STACKER /* 4 chars; Consonant_With_Stacker */ #define ISC_GM INDIC_SYLLABIC_CATEGORY_GEMINATION_MARK /* 2 chars; Gemination_Mark */ #define ISC_IS INDIC_SYLLABIC_CATEGORY_INVISIBLE_STACKER /* 7 chars; Invisible_Stacker */ #define ISC_ZWJ INDIC_SYLLABIC_CATEGORY_JOINER /* 1 chars; Joiner */ #define ISC_ML INDIC_SYLLABIC_CATEGORY_MODIFYING_LETTER /* 1 chars; Modifying_Letter */ #define ISC_ZWNJ INDIC_SYLLABIC_CATEGORY_NON_JOINER /* 1 chars; Non_Joiner */ -#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 18 chars; Nukta */ -#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 408 chars; Number */ +#define ISC_N INDIC_SYLLABIC_CATEGORY_NUKTA /* 24 chars; Nukta */ +#define ISC_Nd INDIC_SYLLABIC_CATEGORY_NUMBER /* 459 chars; Number */ #define ISC_NJ INDIC_SYLLABIC_CATEGORY_NUMBER_JOINER /* 1 chars; Number_Joiner */ #define ISC_x INDIC_SYLLABIC_CATEGORY_OTHER /* 1 chars; Other */ -#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 15 chars; Pure_Killer */ -#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 3 chars; Register_Shifter */ +#define ISC_PK INDIC_SYLLABIC_CATEGORY_PURE_KILLER /* 16 chars; Pure_Killer */ +#define ISC_RS INDIC_SYLLABIC_CATEGORY_REGISTER_SHIFTER /* 2 chars; Register_Shifter */ +#define ISC_SM INDIC_SYLLABIC_CATEGORY_SYLLABLE_MODIFIER /* 22 chars; Syllable_Modifier */ #define ISC_TL INDIC_SYLLABIC_CATEGORY_TONE_LETTER /* 7 chars; Tone_Letter */ -#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 62 chars; Tone_Mark */ -#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 22 chars; Virama */ -#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 29 chars; Visarga */ +#define ISC_TM INDIC_SYLLABIC_CATEGORY_TONE_MARK /* 42 chars; Tone_Mark */ +#define ISC_V INDIC_SYLLABIC_CATEGORY_VIRAMA /* 24 chars; Virama */ +#define ISC_Vs INDIC_SYLLABIC_CATEGORY_VISARGA /* 31 chars; Visarga */ #define ISC_Vo INDIC_SYLLABIC_CATEGORY_VOWEL /* 30 chars; Vowel */ -#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 553 chars; Vowel_Dependent */ -#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 395 chars; Vowel_Independent */ +#define ISC_M INDIC_SYLLABIC_CATEGORY_VOWEL_DEPENDENT /* 602 chars; Vowel_Dependent */ +#define ISC_VI INDIC_SYLLABIC_CATEGORY_VOWEL_INDEPENDENT /* 431 chars; Vowel_Independent */ -#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 142 chars; Bottom */ +#define IMC_B INDIC_MATRA_CATEGORY_BOTTOM /* 300 chars; Bottom */ #define IMC_BR INDIC_MATRA_CATEGORY_BOTTOM_AND_RIGHT /* 2 chars; Bottom_And_Right */ #define IMC_L INDIC_MATRA_CATEGORY_LEFT /* 57 chars; Left */ #define IMC_LR INDIC_MATRA_CATEGORY_LEFT_AND_RIGHT /* 21 chars; Left_And_Right */ #define IMC_x INDIC_MATRA_CATEGORY_NOT_APPLICABLE /* 1 chars; Not_Applicable */ -#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 2 chars; Overstruck */ -#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 163 chars; Right */ -#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 169 chars; Top */ +#define IMC_O INDIC_MATRA_CATEGORY_OVERSTRUCK /* 10 chars; Overstruck */ +#define IMC_R INDIC_MATRA_CATEGORY_RIGHT /* 258 chars; Right */ +#define IMC_T INDIC_MATRA_CATEGORY_TOP /* 342 chars; Top */ #define IMC_TB INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM /* 10 chars; Top_And_Bottom */ #define IMC_TBR INDIC_MATRA_CATEGORY_TOP_AND_BOTTOM_AND_RIGHT /* 1 chars; Top_And_Bottom_And_Right */ #define IMC_TL INDIC_MATRA_CATEGORY_TOP_AND_LEFT /* 6 chars; Top_And_Left */ #define IMC_TLR INDIC_MATRA_CATEGORY_TOP_AND_LEFT_AND_RIGHT /* 4 chars; Top_And_Left_And_Right */ #define IMC_TR INDIC_MATRA_CATEGORY_TOP_AND_RIGHT /* 13 chars; Top_And_Right */ -#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 15 chars; Visual_Order_Left */ +#define IMC_VOL INDIC_MATRA_CATEGORY_VISUAL_ORDER_LEFT /* 19 chars; Visual_Order_Left */ #define _(S,M) INDIC_COMBINE_CATEGORIES (ISC_##S, IMC_##M) @@ -79,29 +83,33 @@ /* 0030 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 0038 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), -#define indic_offset_0x00d0u 24 +#define indic_offset_0x00b0u 24 /* Latin-1 Supplement */ + /* 00B0 */ _(x,x), _(x,x), _(SM,x), _(SM,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 00B8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 00C0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 00C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* 00D0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(CP,x), -#define indic_offset_0x0900u 32 +#define indic_offset_0x0900u 64 /* Devanagari */ - /* 0900 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), + /* 0900 */ _(Bi,T), _(Bi,T), _(Bi,T), _(Vs,R), _(VI,x), _(VI,x), _(VI,x), _(VI,x), /* 0908 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), /* 0910 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0920 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0928 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0930 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 0938 */ _(C,x), _(C,x), _(M,T), _(M,R), _(N,x), _(A,x), _(M,R), _(M,L), + /* 0938 */ _(C,x), _(C,x), _(M,T), _(M,R), _(N,B), _(A,x), _(M,R), _(M,L), /* 0940 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), /* 0948 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(V,B), _(M,L), _(M,R), - /* 0950 */ _(x,x), _(TM,x), _(TM,x), _(x,x), _(x,x), _(M,T), _(M,B), _(M,B), + /* 0950 */ _(x,x), _(Ca,T), _(Ca,B), _(x,T), _(x,T), _(M,T), _(M,B), _(M,B), /* 0958 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0960 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0968 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), @@ -110,14 +118,14 @@ /* Bengali */ - /* 0980 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0980 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0988 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x), /* 0990 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 09A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 09A8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 09B0 */ _(C,x), _(x,x), _(C,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x), - /* 09B8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,L), + /* 09B8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,L), /* 09C0 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x), _(M,L), /* 09C8 */ _(M,L), _(x,x), _(x,x), _(M,LR), _(M,LR), _(V,B), _(CD,x), _(x,x), /* 09D0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), @@ -129,33 +137,33 @@ /* Gurmukhi */ - /* 0A00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0A00 */ _(x,x), _(Bi,T), _(Bi,T), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0A08 */ _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(x,x), _(x,x), _(VI,x), /* 0A10 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0A18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0A28 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0A30 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), - /* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(x,x), _(M,R), _(M,L), + /* 0A38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(x,x), _(M,R), _(M,L), /* 0A40 */ _(M,R), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), /* 0A48 */ _(M,T), _(x,x), _(x,x), _(M,T), _(M,T), _(V,B), _(x,x), _(x,x), /* 0A50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* 0A58 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x), /* 0A60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0A68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 0A70 */ _(Bi,x), _(GM,T), _(CP,x), _(CP,x), _(x,x), _(CM,x), _(x,x), _(x,x), + /* 0A70 */ _(Bi,T), _(GM,T), _(CP,x), _(CP,x), _(x,x), _(CM,B), _(x,x), _(x,x), /* 0A78 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* Gujarati */ - /* 0A80 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0A80 */ _(x,x), _(Bi,T), _(Bi,T), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0A88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), /* 0A90 */ _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0A98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0AA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0AA8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0AB0 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), - /* 0AB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,L), + /* 0AB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,L), /* 0AC0 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(x,x), _(M,T), /* 0AC8 */ _(M,T), _(M,TR), _(x,x), _(M,R), _(M,R), _(V,B), _(x,x), _(x,x), /* 0AD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), @@ -163,18 +171,18 @@ /* 0AE0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0AE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 0AF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 0AF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 0AF8 */ _(x,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* Oriya */ - /* 0B00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0B00 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x), /* 0B10 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0B18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0B20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0B28 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0B30 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), - /* 0B38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,T), + /* 0B38 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,T), /* 0B40 */ _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x), _(M,L), /* 0B48 */ _(M,TL), _(x,x), _(x,x), _(M,LR),_(M,TLR), _(V,B), _(x,x), _(x,x), /* 0B50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), _(M,TR), @@ -186,7 +194,7 @@ /* Tamil */ - /* 0B80 */ _(x,x), _(x,x), _(Bi,x), _(ML,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0B80 */ _(x,x), _(x,x), _(Bi,T), _(ML,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0B88 */ _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(x,x), _(VI,x), _(VI,x), /* 0B90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(x,x), _(x,x), /* 0B98 */ _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(x,x), _(C,x), _(C,x), @@ -194,7 +202,7 @@ /* 0BA8 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x), /* 0BB0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0BB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), _(M,R), - /* 0BC0 */ _(M,T), _(M,B), _(M,B), _(x,x), _(x,x), _(x,x), _(M,L), _(M,L), + /* 0BC0 */ _(M,T), _(M,R), _(M,R), _(x,x), _(x,x), _(x,x), _(M,L), _(M,L), /* 0BC8 */ _(M,L), _(x,x), _(M,LR), _(M,LR), _(M,LR), _(V,T), _(x,x), _(x,x), /* 0BD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), /* 0BD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), @@ -205,7 +213,7 @@ /* Telugu */ - /* 0C00 */ _(Bi,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0C00 */ _(Bi,T), _(Bi,R), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0C08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), /* 0C10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0C18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), @@ -216,7 +224,7 @@ /* 0C40 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(M,T), _(M,T), /* 0C48 */ _(M,TB), _(x,x), _(M,T), _(M,T), _(M,T), _(V,T), _(x,x), _(x,x), /* 0C50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,T), _(M,B), _(x,x), - /* 0C58 */ _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 0C58 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* 0C60 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0C68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 0C70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), @@ -224,26 +232,26 @@ /* Kannada */ - /* 0C80 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0C80 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0C88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), /* 0C90 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0C98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0CA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0CA8 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 0CB0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), - /* 0CB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,T), + /* 0CB8 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,B), _(A,x), _(M,R), _(M,T), /* 0CC0 */ _(M,TR), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(M,T), _(M,TR), /* 0CC8 */ _(M,TR), _(x,x), _(M,TR), _(M,TR), _(M,T), _(V,T), _(x,x), _(x,x), /* 0CD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), _(M,R), _(x,x), /* 0CD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(C,x), _(x,x), /* 0CE0 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0CE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 0CF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 0CF0 */ _(x,x),_(CWS,x),_(CWS,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* 0CF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* Malayalam */ - /* 0D00 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0D00 */ _(x,x), _(Bi,T), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0D08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), /* 0D10 */ _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), /* 0D18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), @@ -253,8 +261,8 @@ /* 0D38 */ _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(A,x), _(M,R), _(M,R), /* 0D40 */ _(M,R), _(M,R), _(M,R), _(M,B), _(M,B), _(x,x), _(M,L), _(M,L), /* 0D48 */ _(M,L), _(x,x), _(M,LR), _(M,LR), _(M,LR), _(V,T),_(CPR,x), _(x,x), - /* 0D50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), - /* 0D58 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 0D50 */ _(x,x), _(x,x), _(x,x), _(x,x), _(CD,x), _(CD,x), _(CD,x), _(M,R), + /* 0D58 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(VI,x), /* 0D60 */ _(VI,x), _(VI,x), _(M,B), _(M,B), _(x,x), _(x,x), _(Nd,x), _(Nd,x), /* 0D68 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 0D70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), @@ -262,7 +270,7 @@ /* Sinhala */ - /* 0D80 */ _(x,x), _(x,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), + /* 0D80 */ _(x,x), _(x,x), _(Bi,R), _(Vs,R), _(x,x), _(VI,x), _(VI,x), _(VI,x), /* 0D88 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), /* 0D90 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), /* 0D98 */ _(x,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), @@ -278,7 +286,7 @@ /* 0DE8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 0DF0 */ _(x,x), _(x,x), _(M,R), _(M,R), _(x,x), _(x,x), _(x,x), _(x,x), -#define indic_offset_0x1000u 1304 +#define indic_offset_0x1000u 1336 /* Myanmar */ @@ -289,51 +297,23 @@ /* 1018 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* 1020 */ _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), /* 1028 */ _(VI,x), _(VI,x), _(VI,x), _(M,R), _(M,R), _(M,T), _(M,T), _(M,B), - /* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T), _(Bi,x), _(TM,x), - /* 1038 */ _(Vs,x), _(IS,x), _(PK,T), _(CM,x), _(CM,x), _(CM,x), _(CM,x), _(C,x), + /* 1030 */ _(M,B), _(M,L), _(M,T), _(M,T), _(M,T), _(M,T), _(Bi,T), _(TM,B), + /* 1038 */ _(Vs,R), _(IS,x), _(PK,T), _(CM,R), _(CM,x), _(CM,B), _(CM,B), _(C,x), /* 1040 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 1048 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(CP,x), _(x,x), /* 1050 */ _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(M,R), _(M,R), - /* 1058 */ _(M,B), _(M,B), _(C,x), _(C,x), _(C,x), _(C,x), _(CM,x), _(CM,x), - /* 1060 */ _(CM,x), _(C,x), _(M,R), _(TM,x), _(TM,x), _(C,x), _(C,x), _(M,R), - /* 1068 */ _(M,R), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(C,x), + /* 1058 */ _(M,B), _(M,B), _(C,x), _(C,x), _(C,x), _(C,x), _(CM,B), _(CM,B), + /* 1060 */ _(CM,B), _(C,x), _(M,R), _(TM,R), _(TM,R), _(C,x), _(C,x), _(M,R), + /* 1068 */ _(M,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(C,x), _(C,x), /* 1070 */ _(C,x), _(M,T), _(M,T), _(M,T), _(M,T), _(C,x), _(C,x), _(C,x), /* 1078 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1080 */ _(C,x), _(C,x), _(CM,x), _(M,R), _(M,L), _(M,T), _(M,T), _(TM,x), - /* 1088 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(TM,x), + /* 1080 */ _(C,x), _(C,x), _(CM,B), _(M,R), _(M,L), _(M,T), _(M,T), _(TM,R), + /* 1088 */ _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,R), _(TM,B), _(C,x), _(TM,R), /* 1090 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 1098 */ _(Nd,x), _(Nd,x), _(TM,x), _(TM,x), _(M,R), _(M,T), _(x,x), _(x,x), - -#define indic_offset_0x1700u 1464 - - - /* Tagalog */ - - /* 1700 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1708 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), - /* 1710 */ _(C,x), _(C,x), _(M,T), _(M,B), _(PK,B), _(x,x), _(x,x), _(x,x), - /* 1718 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Hanunoo */ + /* 1098 */ _(Nd,x), _(Nd,x), _(TM,R), _(TM,R), _(M,R), _(M,T), _(x,x), _(x,x), - /* 1720 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1728 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1730 */ _(C,x), _(C,x), _(M,T), _(M,B), _(PK,B), _(x,x), _(x,x), _(x,x), - /* 1738 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Buhid */ +#define indic_offset_0x1780u 1496 - /* 1740 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1748 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1750 */ _(C,x), _(C,x), _(M,T), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1758 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Tagbanwa */ - - /* 1760 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1768 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), - /* 1770 */ _(C,x), _(x,x), _(M,T), _(M,B), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1778 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* Khmer */ @@ -345,515 +325,72 @@ /* 17A8 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), /* 17B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(M,R), _(M,T), /* 17B8 */ _(M,T), _(M,T), _(M,T), _(M,B), _(M,B), _(M,B), _(M,TL),_(M,TLR), - /* 17C0 */ _(M,LR), _(M,L), _(M,L), _(M,L), _(M,LR), _(M,LR), _(Bi,x), _(Vs,x), - /* 17C8 */ _(M,R), _(RS,T), _(RS,T), _(RS,T),_(CSR,T), _(M,T), _(M,T), _(M,T), - /* 17D0 */ _(M,T), _(PK,T), _(IS,x), _(M,T), _(x,x), _(x,x), _(x,x), _(x,x), - /* 17D8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(A,x), _(x,x), _(x,x), _(x,x), + /* 17C0 */ _(M,LR), _(M,L), _(M,L), _(M,L), _(M,LR), _(M,LR), _(Bi,T), _(Vs,R), + /* 17C8 */ _(M,R), _(RS,T), _(RS,T), _(SM,T),_(CSR,T), _(CK,T), _(SM,T), _(SM,T), + /* 17D0 */ _(SM,T), _(PK,T), _(IS,x), _(SM,T), _(x,x), _(x,x), _(x,x), _(x,x), + /* 17D8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(A,x), _(SM,T), _(x,x), _(x,x), /* 17E0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* 17E8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), -#define indic_offset_0x1900u 1704 - - - /* Limbu */ - - /* 1900 */ _(CP,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1908 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1910 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), - /* 1920 */ _(M,T), _(M,T), _(M,B), _(M,R), _(M,R), _(M,TR), _(M,TR), _(M,T), - /* 1928 */ _(M,T), _(CS,x), _(CS,x), _(CS,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1930 */ _(CF,x), _(CF,x), _(Bi,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), - /* 1938 */ _(CF,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1940 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Nd,x), _(Nd,x), - /* 1948 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - - /* Tai Le */ - - /* 1950 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1958 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1960 */ _(C,x), _(C,x), _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), - /* 1968 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(x,x), _(x,x), - /* 1970 */ _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(TL,x), _(x,x), _(x,x), _(x,x), - /* 1978 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* New Tai Lue */ - - /* 1980 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1988 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1990 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 19A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 19A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 19B0 */ _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,L), _(M,L), _(M,L), - /* 19B8 */ _(M,R), _(M,R), _(M,L), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), - /* 19C0 */ _(M,R), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), - /* 19C8 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 19D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 19D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 19E0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 19E8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 19F0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 19F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Buginese */ - - /* 1A00 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1A08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1A10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T), - /* 1A18 */ _(M,B), _(M,L), _(M,R), _(M,T), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Tai Tham */ - - /* 1A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1A28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1A30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1A38 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1A40 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1A48 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), - /* 1A50 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(CM,L), _(CM,x), _(CF,x), - /* 1A58 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(x,x), - /* 1A60 */ _(IS,x), _(M,R), _(M,T), _(M,R), _(M,R), _(M,T), _(M,T), _(M,T), - /* 1A68 */ _(M,T), _(M,B), _(M,B), _(M,T), _(M,B), _(M,R), _(M,L), _(M,L), - /* 1A70 */ _(M,L), _(M,L), _(M,L), _(M,T), _(M,T), _(TM,x), _(TM,x), _(TM,x), - /* 1A78 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1A80 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 1A88 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1A90 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 1A98 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - -#define indic_offset_0x1b00u 2120 - - - /* Balinese */ - - /* 1B00 */ _(Bi,x), _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), - /* 1B08 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 1B10 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1B18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1B20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1B28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1B30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(N,x), _(M,R), _(M,T), _(M,T), - /* 1B38 */ _(M,B), _(M,B), _(M,B), _(M,BR), _(M,TB),_(M,TBR), _(M,L), _(M,L), - /* 1B40 */ _(M,LR), _(M,LR), _(M,T), _(M,TR), _(V,R), _(C,x), _(C,x), _(C,x), - /* 1B48 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1B50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 1B58 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1B60 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1B68 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1B70 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1B78 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Sundanese */ - - /* 1B80 */ _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 1B88 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1B90 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1B98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1BA0 */ _(C,x), _(CS,x), _(CS,x), _(CS,x), _(M,T), _(M,B), _(M,L), _(M,R), - /* 1BA8 */ _(M,T), _(M,T), _(PK,R), _(IS,x), _(CS,x), _(CS,x), _(C,x), _(C,x), - /* 1BB0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 1BB8 */ _(Nd,x), _(Nd,x), _(A,x), _(C,x), _(C,x), _(C,x), _(CF,x), _(CF,x), - - /* Batak */ - - /* 1BC0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1BC8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1BD0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1BD8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1BE0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(N,x), _(M,R), - /* 1BE8 */ _(M,T), _(M,T), _(M,R), _(M,R), _(M,R), _(M,T), _(M,R), _(M,T), - /* 1BF0 */ _(CF,x), _(CF,x), _(PK,R), _(PK,R), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1BF8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Lepcha */ - - /* 1C00 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1C08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1C10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1C18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 1C20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(CS,x), _(CS,x), _(M,R), _(M,L), - /* 1C28 */ _(M,L), _(M,TL), _(M,R), _(M,R), _(M,B), _(CF,x), _(CF,x), _(CF,x), - /* 1C30 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(Bi,L), _(Bi,L), _(x,x), _(N,x), - /* 1C38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1C40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 1C48 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(C,x), _(C,x), _(C,x), - -#define indic_offset_0x1cd0u 2456 +#define indic_offset_0x1cd0u 1608 /* Vedic Extensions */ - /* 1CD0 */ _(TM,x), _(TM,x), _(TM,x), _(x,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), - /* 1CD8 */ _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), _(TM,x), - /* 1CE0 */ _(TM,x), _(TM,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1CE8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(TM,x), _(x,x), _(x,x), _(x,x), + /* 1CD0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(x,x), _(Ca,O), _(Ca,B), _(Ca,B), _(Ca,B), + /* 1CD8 */ _(Ca,B), _(Ca,B), _(Ca,T), _(Ca,T), _(Ca,B), _(Ca,B), _(Ca,B), _(Ca,B), + /* 1CE0 */ _(Ca,T), _(Ca,R), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), _(x,O), + /* 1CE8 */ _(x,O), _(x,x), _(x,x), _(x,x), _(x,x), _(x,B), _(x,x), _(x,x), + /* 1CF0 */ _(x,x), _(x,x), _(Vs,x), _(Vs,x), _(Ca,T), _(x,x), _(x,x), _(x,x), + /* 1CF8 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), -#define indic_offset_0x2008u 2496 +#define indic_offset_0x2008u 1656 /* General Punctuation */ /* 2008 */ _(x,x), _(x,x), _(x,x), _(x,x),_(ZWNJ,x),_(ZWJ,x), _(x,x), _(x,x), - /* 2010 */ _(x,x), _(x,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), _(x,x), _(x,x), + /* 2010 */ _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), _(x,x), _(x,x), -#define indic_offset_0xa800u 2512 +#define indic_offset_0x2070u 1672 - /* Syloti Nagri */ - - /* A800 */ _(VI,x), _(VI,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), _(PK,T), _(C,x), - /* A808 */ _(C,x), _(C,x), _(C,x), _(Bi,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A810 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A818 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A820 */ _(C,x), _(C,x), _(C,x), _(M,R), _(M,R), _(M,B), _(M,T), _(M,R), - /* A828 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A830 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A838 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Phags-pa */ + /* Superscripts and Subscripts */ - /* A840 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A848 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A850 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A858 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Vo,x), _(Vo,x), - /* A860 */ _(Vo,x), _(Vo,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Vo,x), _(CS,x), - /* A868 */ _(CS,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A870 */ _(C,x), _(CS,x), _(C,x), _(Bi,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A878 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Saurashtra */ + /* 2070 */ _(x,x), _(x,x), _(x,x), _(x,x), _(SM,x), _(x,x), _(x,x), _(x,x), + /* 2078 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), + /* 2080 */ _(x,x), _(x,x), _(SM,x), _(SM,x), _(SM,x), _(x,x), _(x,x), _(x,x), - /* A880 */ _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* A888 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* A890 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A898 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A8A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A8A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A8B0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(CF,x), _(M,R), _(M,R), _(M,R), - /* A8B8 */ _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), _(M,R), - /* A8C0 */ _(M,R), _(M,R), _(M,R), _(M,R), _(V,B), _(x,x), _(x,x), _(x,x), - /* A8C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A8D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* A8D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), +#define indic_offset_0xa8e0u 1696 + /* Devanagari Extended */ - /* A8E0 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), - /* A8E8 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), - /* A8F0 */ _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A8F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Kayah Li */ - - /* A900 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* A908 */ _(Nd,x), _(Nd,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A910 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A918 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A920 */ _(C,x), _(C,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), - /* A928 */ _(Vo,x), _(Vo,x), _(Vo,x), _(TM,x), _(TM,x), _(TM,x), _(x,x), _(x,x), - - /* Rejang */ + /* A8E0 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), + /* A8E8 */ _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), _(Ca,T), + /* A8F0 */ _(Ca,T), _(Ca,T), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A930 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A938 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A940 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,B), - /* A948 */ _(M,B), _(M,B), _(M,T), _(M,B), _(M,B), _(M,B), _(M,B), _(CF,x), - /* A950 */ _(CF,x), _(CF,x), _(CF,x), _(PK,R), _(x,x), _(x,x), _(x,x), _(x,x), - /* A958 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A960 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A968 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A970 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A978 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Javanese */ +#define indic_offset_0xa9e0u 1720 - /* A980 */ _(Bi,x), _(Bi,x),_(CSR,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* A988 */ _(VI,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), - /* A990 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A998 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A9A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A9A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* A9B0 */ _(C,x), _(C,x), _(C,x), _(N,x), _(M,R), _(M,R), _(M,T), _(M,T), - /* A9B8 */ _(M,B), _(M,B), _(M,L), _(M,L), _(M,T), _(CS,x), _(CM,x), _(CM,x), - /* A9C0 */ _(V,BR), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A9C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* A9D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* A9D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* Myanmar Extended-B */ - /* A9E0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(C,x), + /* A9E0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T), _(x,x), _(C,x), /* A9E8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* A9F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), /* A9F8 */ _(Nd,x), _(Nd,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), - /* Cham */ +#define indic_offset_0xaa60u 1752 - /* AA00 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), - /* AA08 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA18 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA28 */ _(C,x), _(M,T), _(M,T), _(M,T), _(M,T), _(M,B), _(M,T), _(M,L), - /* AA30 */ _(M,L), _(M,T), _(M,B), _(CM,x), _(CM,L), _(CM,x), _(CM,x), _(x,x), - /* AA38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* AA40 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), - /* AA48 */ _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(x,x), _(x,x), - /* AA50 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* AA58 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), /* Myanmar Extended-A */ /* AA60 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), /* AA68 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,x), _(TM,x), _(TM,x), _(C,x), _(C,x), - - /* Tai Viet */ - - /* AA80 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA88 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA90 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AA98 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AAA0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AAA8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AAB0 */ _(M,T), _(M,R), _(M,T), _(M,T), _(M,B),_(M,VOL),_(M,VOL), _(M,T), - /* AAB8 */ _(M,T),_(M,VOL), _(M,R),_(M,VOL),_(M,VOL), _(M,R), _(M,T), _(TM,x), - /* AAC0 */ _(TL,x), _(TM,x), _(TL,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* AAC8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* AAD0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* AAD8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Meetei Mayek Extensions */ - - /* AAE0 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* AAE8 */ _(C,x), _(C,x), _(C,x), _(M,L), _(M,B), _(M,T), _(M,L), _(M,R), - /* AAF0 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(Vs,x), _(IS,x), _(x,x), - -#define indic_offset_0xabc0u 3272 - - - /* Meetei Mayek */ - - /* ABC0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* ABC8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(VI,x), _(VI,x), - /* ABD0 */ _(C,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* ABD8 */ _(C,x), _(C,x), _(C,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), _(CF,x), - /* ABE0 */ _(CF,x), _(CF,x), _(CF,x), _(M,R), _(M,R), _(M,T), _(M,R), _(M,R), - /* ABE8 */ _(M,B), _(M,R), _(M,R), _(x,x), _(TM,x), _(PK,B), _(x,x), _(x,x), - /* ABF0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* ABF8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - -#define indic_offset_0x10a00u 3336 - - - /* Kharoshthi */ - - /* 10A00 */ _(C,x), _(M,O), _(M,B), _(M,B), _(x,x), _(M,T), _(M,O), _(x,x), - /* 10A08 */ _(x,x), _(x,x), _(x,x), _(x,x), _(M,B), _(x,x), _(Bi,x), _(Vs,x), - /* 10A10 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), - /* 10A18 */ _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 10A20 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 10A28 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 10A30 */ _(C,x), _(C,x), _(C,x), _(C,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 10A38 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(IS,x), - /* 10A40 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - -#define indic_offset_0x11000u 3408 - - - /* Brahmi */ - - /* 11000 */ _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), - /* 11008 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11010 */ _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11018 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11020 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11028 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11030 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11038 */ _(M,T), _(M,T), _(M,T), _(M,T), _(M,B), _(M,B), _(M,B), _(M,B), - /* 11040 */ _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,T), _(V,T), _(x,x), - /* 11048 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11050 */ _(x,x), _(x,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x), - /* 11058 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x), - /* 11060 */_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x),_(BJN,x), _(Nd,x), _(Nd,x), - /* 11068 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 11070 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11078 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(NJ,x), - - /* Kaithi */ - - /* 11080 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11088 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), - /* 11090 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11098 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 110A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 110A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 110B0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,T), _(M,T), _(M,R), - /* 110B8 */ _(M,R), _(V,B), _(N,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - -#define indic_offset_0x11100u 3600 - - - /* Chakma */ - - /* 11100 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), - /* 11108 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11110 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11118 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11120 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,T), - /* 11128 */ _(M,T), _(M,T), _(M,B), _(M,B), _(M,L), _(M,T), _(M,TB), _(M,TB), - /* 11130 */ _(M,T), _(M,B), _(M,B), _(IS,x), _(PK,T), _(x,x), _(Nd,x), _(Nd,x), - /* 11138 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 11140 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11148 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Mahajani */ - - /* 11150 */ _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(Vo,x), _(C,x), _(C,x), _(C,x), - /* 11158 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11160 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11168 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11170 */ _(C,x), _(C,x), _(C,x), _(N,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11178 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Sharada */ + /* AA70 */ _(x,x), _(C,x), _(C,x), _(C,x), _(CP,x), _(CP,x), _(CP,x), _(x,x), + /* AA78 */ _(x,x), _(x,x), _(C,x), _(TM,R), _(TM,T), _(TM,R), _(C,x), _(C,x), - /* 11180 */ _(Bi,x), _(Bi,x), _(Vs,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11188 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11190 */ _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11198 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 111A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 111A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 111B0 */ _(C,x), _(C,x), _(C,x), _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), - /* 111B8 */ _(M,B), _(M,B), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,TR), - /* 111C0 */ _(V,R), _(A,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 111C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 111D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 111D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Sinhala Archaic Numbers */ - - /* 111E0 */ _(x,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 111E8 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 111F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), - /* 111F8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Khojki */ - - /* 11200 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11208 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11210 */ _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11218 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11220 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11228 */ _(C,x), _(C,x), _(C,x), _(C,x), _(M,R), _(M,R), _(M,R), _(M,B), - /* 11230 */ _(M,T), _(M,T), _(M,TR), _(M,TR), _(Bi,x), _(V,R), _(N,x), _(GM,T), - -#define indic_offset_0x112b0u 3912 - - - /* Khudawadi */ - - /* 112B0 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 112B8 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 112C0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 112C8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 112D0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 112D8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(Bi,x), - /* 112E0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), - /* 112E8 */ _(M,T), _(N,x), _(PK,B), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 112F0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 112F8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Grantha */ - - /* 11300 */ _(x,x), _(Bi,x), _(Bi,x), _(Vs,x), _(x,x), _(VI,x), _(VI,x), _(VI,x), - /* 11308 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(x,x), _(x,x), _(VI,x), - /* 11310 */ _(VI,x), _(x,x), _(x,x), _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), - /* 11318 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11320 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11328 */ _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11330 */ _(C,x), _(x,x), _(C,x), _(C,x), _(x,x), _(C,x), _(C,x), _(C,x), - /* 11338 */ _(C,x), _(C,x), _(x,x), _(x,x), _(N,x), _(A,x), _(M,R), _(M,R), - /* 11340 */ _(M,T), _(M,R), _(M,R), _(M,R), _(M,R), _(x,x), _(x,x), _(M,L), - /* 11348 */ _(M,L), _(x,x), _(x,x), _(M,LR), _(M,LR), _(V,R), _(x,x), _(x,x), - /* 11350 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(M,R), - /* 11358 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11360 */ _(VI,x), _(VI,x), _(M,R), _(M,R), _(x,x), _(x,x), _(Ca,x), _(Ca,x), - /* 11368 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), - /* 11370 */ _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(Ca,x), _(x,x), _(x,x), _(x,x), - -#define indic_offset_0x11480u 4112 - - - /* Tirhuta */ - - /* 11480 */ _(x,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11488 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), - /* 11490 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11498 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 114A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 114A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 114B0 */ _(M,R), _(M,L), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,B), - /* 114B8 */ _(M,B), _(M,L), _(M,T), _(M,TL), _(M,LR), _(M,R), _(M,LR), _(Bi,x), - /* 114C0 */ _(Bi,x), _(Vs,x), _(V,B), _(N,x), _(A,x), _(x,x), _(x,x), _(x,x), - /* 114C8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 114D0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 114D8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - -#define indic_offset_0x11580u 4208 - - - /* Siddham */ - - /* 11580 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11588 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), - /* 11590 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11598 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 115A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 115A8 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(M,R), - /* 115B0 */ _(M,L), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(x,x), _(x,x), - /* 115B8 */ _(M,L), _(M,TL), _(M,LR),_(M,TLR), _(Bi,x), _(Bi,x), _(Vs,x), _(V,B), - /* 115C0 */ _(N,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - -#define indic_offset_0x11600u 4280 - - - /* Modi */ - - /* 11600 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11608 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(C,x), _(C,x), - /* 11610 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11618 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11620 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11628 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11630 */ _(M,R), _(M,R), _(M,R), _(M,B), _(M,B), _(M,B), _(M,B), _(M,B), - /* 11638 */ _(M,B), _(M,T), _(M,T), _(M,R), _(M,R), _(Bi,x), _(Vs,x), _(V,B), - /* 11640 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11648 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11650 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 11658 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11660 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11668 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11670 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 11678 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - - /* Takri */ - - /* 11680 */ _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), _(VI,x), - /* 11688 */ _(VI,x), _(VI,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11690 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 11698 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 116A0 */ _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), _(C,x), - /* 116A8 */ _(C,x), _(C,x), _(C,x), _(Bi,x), _(Vs,x), _(M,T), _(M,L), _(M,R), - /* 116B0 */ _(M,B), _(M,B), _(M,T), _(M,T), _(M,T), _(M,T), _(V,T), _(N,x), - /* 116B8 */ _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - /* 116C0 */ _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), _(Nd,x), - /* 116C8 */ _(Nd,x), _(Nd,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), _(x,x), - -}; /* Table items: 4488; occupancy: 73% */ +}; /* Table items: 1784; occupancy: 69% */ INDIC_TABLE_ELEMENT_TYPE hb_indic_get_categories (hb_codepoint_t u) @@ -862,40 +399,27 @@ { case 0x0u: if (hb_in_range (u, 0x0028u, 0x003Fu)) return indic_table[u - 0x0028u + indic_offset_0x0028u]; - if (hb_in_range (u, 0x00D0u, 0x00D7u)) return indic_table[u - 0x00D0u + indic_offset_0x00d0u]; + if (hb_in_range (u, 0x00B0u, 0x00D7u)) return indic_table[u - 0x00B0u + indic_offset_0x00b0u]; if (hb_in_range (u, 0x0900u, 0x0DF7u)) return indic_table[u - 0x0900u + indic_offset_0x0900u]; if (unlikely (u == 0x00A0u)) return _(CP,x); break; case 0x1u: if (hb_in_range (u, 0x1000u, 0x109Fu)) return indic_table[u - 0x1000u + indic_offset_0x1000u]; - if (hb_in_range (u, 0x1700u, 0x17EFu)) return indic_table[u - 0x1700u + indic_offset_0x1700u]; - if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return indic_table[u - 0x1900u + indic_offset_0x1900u]; - if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return indic_table[u - 0x1B00u + indic_offset_0x1b00u]; - if (hb_in_range (u, 0x1CD0u, 0x1CF7u)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u]; + if (hb_in_range (u, 0x1780u, 0x17EFu)) return indic_table[u - 0x1780u + indic_offset_0x1780u]; + if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return indic_table[u - 0x1CD0u + indic_offset_0x1cd0u]; break; case 0x2u: if (hb_in_range (u, 0x2008u, 0x2017u)) return indic_table[u - 0x2008u + indic_offset_0x2008u]; + if (hb_in_range (u, 0x2070u, 0x2087u)) return indic_table[u - 0x2070u + indic_offset_0x2070u]; if (unlikely (u == 0x25CCu)) return _(CP,x); break; case 0xAu: - if (hb_in_range (u, 0xA800u, 0xAAF7u)) return indic_table[u - 0xA800u + indic_offset_0xa800u]; - if (hb_in_range (u, 0xABC0u, 0xABFFu)) return indic_table[u - 0xABC0u + indic_offset_0xabc0u]; - break; - - case 0x10u: - if (hb_in_range (u, 0x10A00u, 0x10A47u)) return indic_table[u - 0x10A00u + indic_offset_0x10a00u]; - break; - - case 0x11u: - if (hb_in_range (u, 0x11000u, 0x110BFu)) return indic_table[u - 0x11000u + indic_offset_0x11000u]; - if (hb_in_range (u, 0x11100u, 0x11237u)) return indic_table[u - 0x11100u + indic_offset_0x11100u]; - if (hb_in_range (u, 0x112B0u, 0x11377u)) return indic_table[u - 0x112B0u + indic_offset_0x112b0u]; - if (hb_in_range (u, 0x11480u, 0x114DFu)) return indic_table[u - 0x11480u + indic_offset_0x11480u]; - if (hb_in_range (u, 0x11580u, 0x115C7u)) return indic_table[u - 0x11580u + indic_offset_0x11580u]; - if (hb_in_range (u, 0x11600u, 0x116CFu)) return indic_table[u - 0x11600u + indic_offset_0x11600u]; + if (hb_in_range (u, 0xA8E0u, 0xA8F7u)) return indic_table[u - 0xA8E0u + indic_offset_0xa8e0u]; + if (hb_in_range (u, 0xA9E0u, 0xA9FFu)) return indic_table[u - 0xA9E0u + indic_offset_0xa9e0u]; + if (hb_in_range (u, 0xAA60u, 0xAA7Fu)) return indic_table[u - 0xAA60u + indic_offset_0xaa60u]; break; default: @@ -914,11 +438,14 @@ #undef ISC_CD #undef ISC_CF #undef ISC_CHL +#undef ISC_CK #undef ISC_CM #undef ISC_CP #undef ISC_CPR +#undef ISC_CPrf #undef ISC_CS #undef ISC_CSR +#undef ISC_CWS #undef ISC_GM #undef ISC_IS #undef ISC_ZWJ @@ -930,6 +457,7 @@ #undef ISC_x #undef ISC_PK #undef ISC_RS +#undef ISC_SM #undef ISC_TL #undef ISC_TM #undef ISC_V
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-indic.cc Tue Aug 09 16:20:02 2016 -0700 @@ -176,24 +176,8 @@ * Re-assign category */ - - /* The spec says U+0952 is OT_A. However, testing shows that Uniscribe - * treats a whole bunch of characters similarly. - * TESTS: For example, for U+0951: - * U+092E,U+0947,U+0952 - * U+092E,U+0952,U+0947 - * U+092E,U+0947,U+0951 - * U+092E,U+0951,U+0947 - * U+092E,U+0951,U+0952 - * U+092E,U+0952,U+0951 - */ - if (unlikely (hb_in_ranges (u, 0x0951u, 0x0952u, - 0x1CD0u, 0x1CD2u, - 0x1CD4u, 0x1CE1u) || - u == 0x1CF4u)) - cat = OT_A; /* The following act more like the Bindus. */ - else if (unlikely (hb_in_range (u, 0x0953u, 0x0954u))) + if (unlikely (hb_in_range (u, 0x0953u, 0x0954u))) cat = OT_SM; /* The following act like consonants. */ else if (unlikely (hb_in_ranges (u, 0x0A72u, 0x0A73u, @@ -216,21 +200,10 @@ cat = OT_Symbol; ASSERT_STATIC ((int) INDIC_SYLLABIC_CATEGORY_AVAGRAHA == OT_Symbol); } - else if (unlikely (hb_in_range (u, 0x17CDu, 0x17D1u) || - u == 0x17CBu || u == 0x17D3u || u == 0x17DDu)) /* Khmer Various signs */ - { - /* These are like Top Matras. */ - cat = OT_M; - pos = POS_ABOVE_C; - } else if (unlikely (u == 0x17C6u)) cat = OT_N; /* Khmer Bindu doesn't like to be repositioned. */ - else if (unlikely (u == 0x17D2u)) cat = OT_Coeng; /* Khmer coeng */ else if (unlikely (hb_in_range (u, 0x2010u, 0x2011u))) cat = OT_PLACEHOLDER; else if (unlikely (u == 0x25CCu)) cat = OT_DOTTEDCIRCLE; - else if (unlikely (u == 0xA982u)) cat = OT_SM; /* Javanese repha. */ - else if (unlikely (u == 0xA9BEu)) cat = OT_CM2; /* Javanese medial ya. */ - else if (unlikely (u == 0xA9BDu)) { cat = OT_M; pos = POS_POST_C; } /* Javanese vocalic r. */ /* @@ -296,11 +269,6 @@ BLWF_MODE_PRE_AND_POST, /* Below-forms feature applied to pre-base and post-base. */ BLWF_MODE_POST_ONLY /* Below-forms feature applied to post-base only. */ }; -enum pref_len_t { - PREF_LEN_1 = 1, - PREF_LEN_2 = 2, - PREF_LEN_DONT_CARE = PREF_LEN_2 -}; struct indic_config_t { hb_script_t script; @@ -310,26 +278,24 @@ reph_position_t reph_pos; reph_mode_t reph_mode; blwf_mode_t blwf_mode; - pref_len_t pref_len; }; static const indic_config_t indic_configs[] = { /* Default. Should be first. */ - {HB_SCRIPT_INVALID, false, 0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_1}, - {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE}, - {HB_SCRIPT_BENGALI, true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE}, - {HB_SCRIPT_GURMUKHI, true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE}, - {HB_SCRIPT_GUJARATI, true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE}, - {HB_SCRIPT_ORIYA, true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE}, - {HB_SCRIPT_TAMIL, true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_2}, - {HB_SCRIPT_TELUGU, true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY, PREF_LEN_2}, - {HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY, PREF_LEN_2}, - {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2}, + {HB_SCRIPT_INVALID, false, 0,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_DEVANAGARI,true, 0x094Du,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_BENGALI, true, 0x09CDu,BASE_POS_LAST, REPH_POS_AFTER_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_GURMUKHI, true, 0x0A4Du,BASE_POS_LAST, REPH_POS_BEFORE_SUB, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_GUJARATI, true, 0x0ACDu,BASE_POS_LAST, REPH_POS_BEFORE_POST,REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_ORIYA, true, 0x0B4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_TAMIL, true, 0x0BCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_TELUGU, true, 0x0C4Du,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_EXPLICIT, BLWF_MODE_POST_ONLY}, + {HB_SCRIPT_KANNADA, true, 0x0CCDu,BASE_POS_LAST, REPH_POS_AFTER_POST, REPH_MODE_IMPLICIT, BLWF_MODE_POST_ONLY}, + {HB_SCRIPT_MALAYALAM, true, 0x0D4Du,BASE_POS_LAST, REPH_POS_AFTER_MAIN, REPH_MODE_LOG_REPHA,BLWF_MODE_PRE_AND_POST}, {HB_SCRIPT_SINHALA, false,0x0DCAu,BASE_POS_LAST_SINHALA, - REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST, PREF_LEN_DONT_CARE}, - {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_2}, - {HB_SCRIPT_JAVANESE, false,0xA9C0u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST, PREF_LEN_1}, + REPH_POS_AFTER_MAIN, REPH_MODE_EXPLICIT, BLWF_MODE_PRE_AND_POST}, + {HB_SCRIPT_KHMER, false,0x17D2u,BASE_POS_FIRST,REPH_POS_DONT_CARE, REPH_MODE_VIS_REPHA,BLWF_MODE_PRE_AND_POST}, }; @@ -512,12 +478,12 @@ hb_codepoint_t glyph = virama_glyph; if (unlikely (virama_glyph == (hb_codepoint_t) -1)) { - if (!config->virama || !font->get_glyph (config->virama, 0, &glyph)) + if (!config->virama || !font->get_nominal_glyph (config->virama, &glyph)) glyph = 0; /* Technically speaking, the spec says we should apply 'locl' to virama too. * Maybe one day... */ - /* Our get_glyph() function needs a font, so we can't get the virama glyph + /* Our get_nominal_glyph() function needs a font, so we can't get the virama glyph * during shape planning... Instead, overwrite it here. It's safe. Don't worry! */ (const_cast<indic_shape_plan_t *> (this))->virama_glyph = glyph; } @@ -557,8 +523,15 @@ indic_plan->virama_glyph = (hb_codepoint_t) -1; /* Use zero-context would_substitute() matching for new-spec of the main - * Indic scripts, and scripts with one spec only, but not for old-specs. */ - bool zero_context = !indic_plan->is_old_spec; + * Indic scripts, and scripts with one spec only, but not for old-specs. + * The new-spec for all dual-spec scripts says zero-context matching happens. + * + * However, testing with Malayalam shows that old and new spec both allow + * context. Testing with Bengali new-spec however shows that it doesn't. + * So, the heuristic here is the way it is. It should *only* be changed, + * as we discover more cases of what Windows does. DON'T TOUCH OTHERWISE. + */ + bool zero_context = !indic_plan->is_old_spec && plan->props.script != HB_SCRIPT_MALAYALAM; indic_plan->rphf.init (&plan->map, HB_TAG('r','p','h','f'), zero_context); indic_plan->pref.init (&plan->map, HB_TAG('p','r','e','f'), zero_context); indic_plan->blwf.init (&plan->map, HB_TAG('b','l','w','f'), zero_context); @@ -600,12 +573,8 @@ if (indic_plan->pstf.would_substitute (glyphs , 2, face) || indic_plan->pstf.would_substitute (glyphs+1, 2, face)) return POS_POST_C; - unsigned int pref_len = indic_plan->config->pref_len; - if ((pref_len == PREF_LEN_2 && - (indic_plan->pref.would_substitute (glyphs , 2, face) || - indic_plan->pref.would_substitute (glyphs+1, 2, face))) - || (pref_len == PREF_LEN_1 && - indic_plan->pref.would_substitute (glyphs+1, 1, face))) + if (indic_plan->pref.would_substitute (glyphs , 2, face) || + indic_plan->pref.would_substitute (glyphs+1, 2, face)) return POS_POST_C; return POS_BASE_C; } @@ -754,10 +723,6 @@ switch (indic_plan->config->base_pos) { - default: - assert (false); - /* fallthrough */ - case BASE_POS_LAST: { /* -> starting from the end of the syllable, move backwards */ @@ -1115,10 +1080,9 @@ } } - unsigned int pref_len = indic_plan->config->pref_len; + unsigned int pref_len = 2; if (indic_plan->mask_array[PREF] && base + pref_len < end) { - assert (1 <= pref_len && pref_len <= 2); /* Find a Halant,Ra sequence and mark it for pre-base reordering processing. */ for (unsigned int i = base + 1; i + pref_len - 1 < end; i++) { hb_codepoint_t glyphs[2]; @@ -1231,7 +1195,7 @@ hb_codepoint_t dottedcircle_glyph; - if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph)) + if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph)) return; hb_glyph_info_t dottedcircle = {0}; @@ -1243,7 +1207,7 @@ buffer->idx = 0; unsigned int last_syllable = 0; - while (buffer->idx < buffer->len) + while (buffer->idx < buffer->len && !buffer->in_error) { unsigned int syllable = buffer->cur().syllable(); syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); @@ -1251,19 +1215,19 @@ { last_syllable = syllable; - hb_glyph_info_t info = dottedcircle; - info.cluster = buffer->cur().cluster; - info.mask = buffer->cur().mask; - info.syllable() = buffer->cur().syllable(); + hb_glyph_info_t ginfo = dottedcircle; + ginfo.cluster = buffer->cur().cluster; + ginfo.mask = buffer->cur().mask; + ginfo.syllable() = buffer->cur().syllable(); /* TODO Set glyph_props? */ /* Insert dottedcircle after possible Repha. */ - while (buffer->idx < buffer->len && + while (buffer->idx < buffer->len && !buffer->in_error && last_syllable == buffer->cur().syllable() && buffer->cur().indic_category() == OT_Repha) buffer->next_glyph (); - buffer->output_info (info); + buffer->output_info (ginfo); } else buffer->next_glyph (); @@ -1328,7 +1292,7 @@ for (base = start; base < end; base++) if (info[base].indic_position() >= POS_BASE_C) { - if (try_pref && base + 1 < end && indic_plan->config->pref_len == 2) + if (try_pref && base + 1 < end) { for (unsigned int i = base + 1; i < end; i++) if ((info[i].mask & indic_plan->mask_array[PREF]) != 0) @@ -1348,6 +1312,25 @@ break; } } + /* For Malayalam, skip over unformed below- (but NOT post-) forms. */ + if (buffer->props.script == HB_SCRIPT_MALAYALAM) + { + for (unsigned int i = base + 1; i < end; i++) + { + while (i < end && is_joiner (info[i])) + i++; + if (i == end || !is_halant_or_coeng (info[i])) + break; + i++; /* Skip halant. */ + while (i < end && is_joiner (info[i])) + i++; + if (i < end && is_consonant (info[i]) && info[i].indic_position() == POS_BELOW_C) + { + base = i; + info[base].indic_position() = POS_BASE_C; + } + } + } if (start < base && info[base].indic_position() > POS_BASE_C) base--; @@ -1591,7 +1574,6 @@ if (try_pref && base + 1 < end) /* Otherwise there can't be any pre-base reordering Ra. */ { - unsigned int pref_len = indic_plan->config->pref_len; for (unsigned int i = base + 1; i < end; i++) if ((info[i].mask & indic_plan->mask_array[PREF]) != 0) { @@ -1602,10 +1584,8 @@ /* Note: We just check that something got substituted. We don't check that * the <pref> feature actually did it... * - * If pref len is longer than one, then only reorder if it ligated. If - * pref len is one, only reorder if it didn't ligate with other things. */ - if (_hb_glyph_info_substituted (&info[i]) && - ((pref_len == 1) ^ _hb_glyph_info_ligated_and_didnt_multiply (&info[i]))) + * Reorder pref only if it ligated. */ + if (_hb_glyph_info_ligated_and_didnt_multiply (&info[i])) { /* * 2. Try to find a target position the same way as for pre-base matra. @@ -1631,8 +1611,8 @@ if (new_pos > start && info[new_pos - 1].indic_category() == OT_M) { unsigned int old_pos = i; - for (unsigned int i = base + 1; i < old_pos; i++) - if (info[i].indic_category() == OT_M) + for (unsigned int j = base + 1; j < old_pos; j++) + if (info[j].indic_category() == OT_M) { new_pos--; break; @@ -1796,7 +1776,7 @@ hb_codepoint_t glyph; if (hb_options ().uniscribe_bug_compatible || - (c->font->get_glyph (ab, 0, &glyph) && + (c->font->get_nominal_glyph (ab, &glyph) && indic_plan->pstf.would_substitute (&glyph, 1, c->font->face))) { /* Ok, safe to use Uniscribe-style decomposition. */ @@ -1806,7 +1786,7 @@ } } - return c->unicode->decompose (ab, a, b); + return (bool) c->unicode->decompose (ab, a, b); } static bool @@ -1822,7 +1802,7 @@ /* Composition-exclusion exceptions that we want to recompose. */ if (a == 0x09AFu && b == 0x09BCu) { *ab = 0x09DFu; return true; } - return c->unicode->compose (a, b, ab); + return (bool) c->unicode->compose (a, b, ab); } @@ -1834,6 +1814,7 @@ data_create_indic, data_destroy_indic, NULL, /* preprocess_text */ + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, decompose_indic, compose_indic,
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar-machine.hh Tue Aug 09 16:20:02 2016 -0700 @@ -1,5 +1,5 @@ -#line 1 "hb-ot-shape-complex-myanmar-machine.rl" +#line 1 "../../src/hb-ot-shape-complex-myanmar-machine.rl" /* * Copyright © 2011,2012 Google, Inc. * @@ -32,7 +32,7 @@ #include "hb-private.hh" -#line 36 "hb-ot-shape-complex-myanmar-machine.hh" +#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" static const unsigned char _myanmar_syllable_machine_trans_keys[] = { 1u, 31u, 3u, 30u, 5u, 29u, 5u, 8u, 5u, 29u, 3u, 25u, 5u, 25u, 5u, 25u, 3u, 29u, 3u, 29u, 3u, 29u, 3u, 29u, 1u, 16u, 3u, 29u, 3u, 29u, 3u, 29u, @@ -261,11 +261,11 @@ static const int myanmar_syllable_machine_en_main = 0; -#line 36 "hb-ot-shape-complex-myanmar-machine.rl" +#line 36 "../../src/hb-ot-shape-complex-myanmar-machine.rl" -#line 93 "hb-ot-shape-complex-myanmar-machine.rl" +#line 93 "../../src/hb-ot-shape-complex-myanmar-machine.rl" #define found_syllable(syllable_type) \ @@ -285,7 +285,7 @@ int cs; hb_glyph_info_t *info = buffer->info; -#line 289 "hb-ot-shape-complex-myanmar-machine.hh" +#line 289 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" { cs = myanmar_syllable_machine_start; ts = 0; @@ -293,7 +293,7 @@ act = 0; } -#line 114 "hb-ot-shape-complex-myanmar-machine.rl" +#line 114 "../../src/hb-ot-shape-complex-myanmar-machine.rl" p = 0; @@ -302,7 +302,7 @@ unsigned int last = 0; unsigned int syllable_serial = 1; -#line 306 "hb-ot-shape-complex-myanmar-machine.hh" +#line 306 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" { int _slen; int _trans; @@ -316,7 +316,7 @@ #line 1 "NONE" {ts = p;} break; -#line 320 "hb-ot-shape-complex-myanmar-machine.hh" +#line 320 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" } _keys = _myanmar_syllable_machine_trans_keys + (cs<<1); @@ -335,38 +335,38 @@ switch ( _myanmar_syllable_machine_trans_actions[_trans] ) { case 7: -#line 85 "hb-ot-shape-complex-myanmar-machine.rl" +#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (consonant_syllable); }} break; case 5: -#line 86 "hb-ot-shape-complex-myanmar-machine.rl" +#line 86 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; case 10: -#line 87 "hb-ot-shape-complex-myanmar-machine.rl" +#line 87 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (punctuation_cluster); }} break; case 4: -#line 88 "hb-ot-shape-complex-myanmar-machine.rl" +#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (broken_cluster); }} break; case 3: -#line 89 "hb-ot-shape-complex-myanmar-machine.rl" +#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p+1;{ found_syllable (non_myanmar_cluster); }} break; case 6: -#line 85 "hb-ot-shape-complex-myanmar-machine.rl" +#line 85 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (consonant_syllable); }} break; case 8: -#line 88 "hb-ot-shape-complex-myanmar-machine.rl" +#line 88 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; case 9: -#line 89 "hb-ot-shape-complex-myanmar-machine.rl" +#line 89 "../../src/hb-ot-shape-complex-myanmar-machine.rl" {te = p;p--;{ found_syllable (non_myanmar_cluster); }} break; -#line 370 "hb-ot-shape-complex-myanmar-machine.hh" +#line 370 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" } _again: @@ -375,7 +375,7 @@ #line 1 "NONE" {ts = 0;} break; -#line 379 "hb-ot-shape-complex-myanmar-machine.hh" +#line 379 "../../src/hb-ot-shape-complex-myanmar-machine.hh.tmp" } if ( ++p != pe ) @@ -391,7 +391,7 @@ } -#line 123 "hb-ot-shape-complex-myanmar-machine.rl" +#line 123 "../../src/hb-ot-shape-complex-myanmar-machine.rl" }
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-myanmar.cc Tue Aug 09 16:20:02 2016 -0700 @@ -199,6 +199,10 @@ cat = (indic_category_t) OT_A; break; + case 0x1039u: + cat = (indic_category_t) OT_H; + break; + case 0x103Au: cat = (indic_category_t) OT_As; break; @@ -245,6 +249,11 @@ case 0x104Au: case 0x104Bu: cat = (indic_category_t) OT_P; break; + + case 0xAA74u: case 0xAA75u: case 0xAA76u: + /* https://github.com/roozbehp/unicode-data/issues/3 */ + cat = (indic_category_t) OT_C; + break; } if (cat == OT_M) @@ -435,7 +444,7 @@ hb_codepoint_t dottedcircle_glyph; - if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph)) + if (!font->get_nominal_glyph (0x25CCu, &dottedcircle_glyph)) return; hb_glyph_info_t dottedcircle = {0}; @@ -447,7 +456,7 @@ buffer->idx = 0; unsigned int last_syllable = 0; - while (buffer->idx < buffer->len) + while (buffer->idx < buffer->len && !buffer->in_error) { unsigned int syllable = buffer->cur().syllable(); syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); @@ -455,12 +464,12 @@ { last_syllable = syllable; - hb_glyph_info_t info = dottedcircle; - info.cluster = buffer->cur().cluster; - info.mask = buffer->cur().mask; - info.syllable() = buffer->cur().syllable(); + hb_glyph_info_t ginfo = dottedcircle; + ginfo.cluster = buffer->cur().cluster; + ginfo.mask = buffer->cur().mask; + ginfo.syllable() = buffer->cur().syllable(); - buffer->output_info (info); + buffer->output_info (ginfo); } else buffer->next_glyph (); @@ -507,6 +516,7 @@ NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ NULL, /* compose */ @@ -523,6 +533,7 @@ NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, NULL, /* decompose */ NULL, /* compose */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -41,12 +41,8 @@ enum hb_ot_shape_zero_width_marks_type_t { HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, -// HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE, HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, - - HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT = HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE }; @@ -110,6 +106,15 @@ hb_buffer_t *buffer, hb_font_t *font); + /* postprocess_glyphs() + * Called during shape(). + * Shapers can use to modify glyphs after shaping ends. + * May be NULL. + */ + void (*postprocess_glyphs) (const hb_ot_shape_plan_t *plan, + hb_buffer_t *buffer, + hb_font_t *font); + hb_ot_shape_normalization_mode_t normalization_preference; @@ -236,9 +241,6 @@ /* Unicode-3.0 additions */ case HB_SCRIPT_SINHALA: - /* Unicode-5.2 additions */ - case HB_SCRIPT_JAVANESE: - /* If the designer designed the font for the 'DFLT' script, * use the default shaper. Otherwise, use the specific shaper. * Note that for some simple scripts, there may not be *any* @@ -311,7 +313,7 @@ /* Unicode-5.2 additions */ case HB_SCRIPT_EGYPTIAN_HIEROGLYPHS: - //case HB_SCRIPT_JAVANESE: + case HB_SCRIPT_JAVANESE: case HB_SCRIPT_KAITHI: case HB_SCRIPT_MEETEI_MAYEK: case HB_SCRIPT_TAI_THAM: @@ -340,6 +342,15 @@ case HB_SCRIPT_SIDDHAM: case HB_SCRIPT_TIRHUTA: + /* Unicode-8.0 additions */ + case HB_SCRIPT_AHOM: + //case HB_SCRIPT_MULTANI: + + /* Unicode-9.0 additions */ + case HB_SCRIPT_BHAIKSUKI: + case HB_SCRIPT_MARCHEN: + case HB_SCRIPT_NEWA: + /* If the designer designed the font for the 'DFLT' script, * use the default shaper. Otherwise, use the specific shaper. * Note that for some simple scripts, there may not be *any*
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-thai.cc Tue Aug 09 16:20:02 2016 -0700 @@ -139,7 +139,6 @@ }; switch (action) { - default: assert (false); /* Fallthrough */ case NOP: return u; case SD: pua_mappings = SD_mappings; break; case SDL: pua_mappings = SDL_mappings; break; @@ -315,7 +314,7 @@ buffer->clear_output (); unsigned int count = buffer->len; - for (buffer->idx = 0; buffer->idx < count;) + for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;) { hb_codepoint_t u = buffer->cur().codepoint; if (likely (!IS_SARA_AM (u))) { @@ -330,7 +329,7 @@ if (unlikely (buffer->in_error)) return; - /* Make Nikhahit be recognized as a mark when zeroing widths. */ + /* Make Nikhahit be recognized as a ccc=0 mark when zeroing widths. */ unsigned int end = buffer->out_len; _hb_glyph_info_set_general_category (&buffer->out_info[end - 2], HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK); @@ -372,10 +371,11 @@ NULL, /* data_create */ NULL, /* data_destroy */ preprocess_text_thai, + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ NULL, /* compose */ NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, false,/* fallback_position */ };
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-tibetan.cc Tue Aug 09 16:20:02 2016 -0700 @@ -52,10 +52,11 @@ NULL, /* data_create */ NULL, /* data_destroy */ NULL, /* preprocess_text */ + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_DEFAULT, NULL, /* decompose */ NULL, /* compose */ NULL, /* setup_masks */ - HB_OT_SHAPE_ZERO_WIDTH_MARKS_DEFAULT, + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE, true, /* fallback_position */ };
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-machine.hh Tue Aug 09 16:20:02 2016 -0700 @@ -36,291 +36,222 @@ #line 38 "hb-ot-shape-complex-use-machine.hh" static const unsigned char _use_syllable_machine_trans_keys[] = { - 0u, 0u, 4u, 4u, 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, + 1u, 1u, 0u, 39u, 21u, 21u, 8u, 39u, 8u, 39u, 1u, 1u, 8u, 39u, 8u, 39u, + 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, + 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 13u, 21u, + 4u, 4u, 13u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 12u, 21u, 12u, 13u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 26u, - 8u, 26u, 8u, 26u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, - 8u, 39u, 8u, 39u, 8u, 39u, 8u, 39u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, + 8u, 39u, 8u, 39u, 8u, 39u, 1u, 1u, 1u, 39u, 8u, 39u, 21u, 42u, 41u, 42u, 42u, 42u, 0 }; static const char _use_syllable_machine_key_spans[] = { - 0, 1, 1, 40, 1, 32, 32, 1, - 32, 32, 32, 19, 19, 19, 32, 32, - 32, 32, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 1, 32, 32, 19, 19, + 1, 40, 1, 32, 32, 1, 32, 32, + 32, 19, 19, 19, 32, 32, 32, 32, + 32, 32, 32, 32, 32, 32, 32, 9, + 1, 1, 32, 32, 32, 32, 19, 19, 19, 32, 32, 32, 32, 32, 32, 32, - 32, 10, 2, 32, 32, 32, 32, 19, - 19, 19, 32, 32, 32, 32, 32, 32, - 32, 32, 32, 32, 39, 32, 22, 2, + 32, 32, 32, 1, 39, 32, 22, 2, 1 }; static const short _use_syllable_machine_index_offsets[] = { - 0, 0, 2, 4, 45, 47, 80, 113, - 115, 148, 181, 214, 234, 254, 274, 307, - 340, 373, 406, 439, 472, 505, 538, 571, - 604, 637, 670, 703, 705, 738, 771, 791, - 811, 831, 864, 897, 930, 963, 996, 1029, - 1062, 1095, 1106, 1109, 1142, 1175, 1208, 1241, - 1261, 1281, 1301, 1334, 1367, 1400, 1433, 1466, - 1499, 1532, 1565, 1598, 1631, 1671, 1704, 1727, - 1730 + 0, 2, 43, 45, 78, 111, 113, 146, + 179, 212, 232, 252, 272, 305, 338, 371, + 404, 437, 470, 503, 536, 569, 602, 635, + 645, 647, 649, 682, 715, 748, 781, 801, + 821, 841, 874, 907, 940, 973, 1006, 1039, + 1072, 1105, 1138, 1171, 1173, 1213, 1246, 1269, + 1272 }; static const char _use_syllable_machine_indicies[] = { - 1, 0, 3, 2, 4, 5, 6, - 4, 1, 5, 8, 8, 7, 8, 8, - 3, 9, 8, 8, 8, 4, 4, 10, - 11, 8, 8, 12, 13, 14, 15, 16, - 17, 18, 12, 19, 20, 21, 22, 23, - 24, 8, 25, 26, 27, 8, 29, 28, - 31, 30, 30, 32, 33, 30, 30, 30, - 30, 30, 30, 30, 30, 34, 35, 36, - 37, 38, 39, 40, 41, 35, 42, 34, - 43, 44, 45, 46, 30, 47, 48, 49, - 30, 31, 30, 30, 32, 33, 30, 30, - 30, 30, 30, 30, 30, 30, 50, 35, - 36, 37, 38, 39, 40, 41, 35, 42, - 43, 43, 44, 45, 46, 30, 47, 48, - 49, 30, 32, 51, 31, 30, 30, 32, - 33, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 35, 36, 37, 38, 39, 40, - 41, 35, 42, 43, 43, 44, 45, 46, - 30, 47, 48, 49, 30, 31, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 35, 36, 37, 38, 39, - 30, 30, 30, 30, 30, 30, 44, 45, - 46, 30, 47, 48, 49, 30, 31, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 36, 37, 38, - 39, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 47, 48, 49, 30, 31, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 37, - 38, 39, 30, 31, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 38, 39, 30, 31, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 39, 30, 31, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 37, 38, 39, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 47, 48, 49, 30, 31, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 37, 38, 39, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 48, 49, 30, 31, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 37, 38, 39, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 49, 30, 31, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 36, 37, 38, - 39, 30, 30, 30, 30, 30, 30, 44, - 45, 46, 30, 47, 48, 49, 30, 31, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 36, 37, - 38, 39, 30, 30, 30, 30, 30, 30, - 30, 45, 46, 30, 47, 48, 49, 30, - 31, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 36, - 37, 38, 39, 30, 30, 30, 30, 30, - 30, 30, 30, 46, 30, 47, 48, 49, - 30, 31, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 35, - 36, 37, 38, 39, 30, 41, 35, 30, - 30, 30, 44, 45, 46, 30, 47, 48, - 49, 30, 31, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 35, 36, 37, 38, 39, 30, 30, 35, - 30, 30, 30, 44, 45, 46, 30, 47, - 48, 49, 30, 31, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 30, 30, 30, - 30, 35, 36, 37, 38, 39, 40, 41, - 35, 30, 30, 30, 44, 45, 46, 30, - 47, 48, 49, 30, 31, 30, 30, 32, - 33, 30, 30, 30, 30, 30, 30, 30, - 30, 30, 35, 36, 37, 38, 39, 40, - 41, 35, 42, 30, 43, 44, 45, 46, - 30, 47, 48, 49, 30, 31, 30, 30, - 32, 33, 30, 30, 30, 30, 30, 30, - 30, 30, 30, 35, 36, 37, 38, 39, - 40, 41, 35, 42, 34, 43, 44, 45, - 46, 30, 47, 48, 49, 30, 53, 52, - 52, 54, 55, 52, 52, 52, 52, 52, - 52, 52, 52, 56, 52, 57, 58, 59, - 60, 61, 62, 57, 63, 56, 64, 52, - 52, 52, 52, 65, 66, 67, 52, 53, - 52, 52, 54, 55, 52, 52, 52, 52, - 52, 52, 52, 52, 68, 52, 57, 58, - 59, 60, 61, 62, 57, 63, 64, 64, - 52, 52, 52, 52, 65, 66, 67, 52, - 54, 51, 53, 52, 52, 54, 55, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 57, 58, 59, 60, 61, 62, 57, - 63, 64, 64, 52, 52, 52, 52, 65, - 66, 67, 52, 53, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 57, 58, 59, 60, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 65, 66, 67, 52, 53, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 58, 59, 60, 52, - 53, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 59, 60, 52, 53, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 60, 52, - 53, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 58, 59, 60, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 65, 66, 67, - 52, 53, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 58, 59, 60, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 66, - 67, 52, 53, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 58, 59, 60, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 67, 52, 53, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 57, 58, 59, 60, 52, 62, - 57, 52, 52, 52, 52, 52, 52, 52, - 65, 66, 67, 52, 53, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 57, 58, 59, 60, 52, - 52, 57, 52, 52, 52, 52, 52, 52, - 52, 65, 66, 67, 52, 53, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 57, 58, 59, 60, - 61, 62, 57, 52, 52, 52, 52, 52, - 52, 52, 65, 66, 67, 52, 53, 52, - 52, 54, 55, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 57, 58, 59, - 60, 61, 62, 57, 63, 52, 64, 52, - 52, 52, 52, 65, 66, 67, 52, 53, - 52, 52, 54, 55, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 57, 58, - 59, 60, 61, 62, 57, 63, 56, 64, - 52, 52, 52, 52, 65, 66, 67, 52, - 70, 71, 69, 69, 69, 69, 69, 69, - 69, 72, 69, 70, 71, 69, 7, 73, - 73, 3, 9, 73, 73, 73, 73, 73, - 73, 73, 73, 74, 12, 13, 14, 15, - 16, 17, 18, 12, 19, 21, 21, 22, - 23, 24, 73, 25, 26, 27, 73, 7, - 73, 73, 3, 9, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 12, 13, 14, - 15, 16, 17, 18, 12, 19, 21, 21, - 22, 23, 24, 73, 25, 26, 27, 73, - 7, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 12, 13, - 14, 15, 16, 73, 73, 73, 73, 73, - 73, 22, 23, 24, 73, 25, 26, 27, - 73, 7, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 13, 14, 15, 16, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 25, 26, - 27, 73, 7, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 14, 15, 16, 73, 7, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 15, - 16, 73, 7, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 16, 73, 7, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 14, 15, - 16, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 25, 26, 27, 73, 7, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 14, - 15, 16, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 26, 27, 73, - 7, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 14, 15, 16, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 27, - 73, 7, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 13, 14, 15, 16, 73, 73, 73, 73, - 73, 73, 22, 23, 24, 73, 25, 26, - 27, 73, 7, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 13, 14, 15, 16, 73, 73, 73, - 73, 73, 73, 73, 23, 24, 73, 25, - 26, 27, 73, 7, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 13, 14, 15, 16, 73, 73, - 73, 73, 73, 73, 73, 73, 24, 73, - 25, 26, 27, 73, 7, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 12, 13, 14, 15, 16, 73, - 18, 12, 73, 73, 73, 22, 23, 24, - 73, 25, 26, 27, 73, 7, 73, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 12, 13, 14, 15, 16, - 73, 73, 12, 73, 73, 73, 22, 23, - 24, 73, 25, 26, 27, 73, 7, 73, - 73, 73, 73, 73, 73, 73, 73, 73, - 73, 73, 73, 73, 12, 13, 14, 15, - 16, 17, 18, 12, 73, 73, 73, 22, - 23, 24, 73, 25, 26, 27, 73, 7, - 73, 73, 3, 9, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 12, 13, 14, - 15, 16, 17, 18, 12, 19, 73, 21, - 22, 23, 24, 73, 25, 26, 27, 73, - 5, 6, 73, 73, 5, 73, 73, 7, - 73, 73, 3, 9, 73, 73, 73, 73, - 73, 73, 73, 73, 73, 12, 13, 14, - 15, 16, 17, 18, 12, 19, 20, 21, - 22, 23, 24, 73, 25, 26, 27, 73, - 7, 73, 73, 3, 9, 73, 73, 73, - 73, 73, 73, 73, 73, 73, 12, 13, - 14, 15, 16, 17, 18, 12, 19, 20, - 21, 22, 23, 24, 73, 25, 26, 27, - 73, 76, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 75, 75, 75, 76, 77, 75, - 76, 77, 75, 77, 75, 0 + 1, 0, 2, 3, 4, 2, 5, 3, + 4, 4, 6, 4, 4, 1, 7, 4, + 4, 4, 2, 2, 8, 9, 4, 4, + 10, 11, 12, 13, 14, 15, 16, 10, + 17, 18, 19, 20, 21, 22, 4, 23, + 24, 25, 4, 27, 26, 29, 28, 28, + 30, 31, 28, 28, 28, 28, 28, 28, + 28, 28, 32, 33, 34, 35, 36, 37, + 38, 39, 33, 40, 32, 41, 42, 43, + 44, 28, 45, 46, 47, 28, 29, 28, + 28, 30, 31, 28, 28, 28, 28, 28, + 28, 28, 28, 48, 33, 34, 35, 36, + 37, 38, 39, 33, 40, 41, 41, 42, + 43, 44, 28, 45, 46, 47, 28, 30, + 49, 29, 28, 28, 30, 31, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 33, + 34, 35, 36, 37, 38, 39, 33, 40, + 41, 41, 42, 43, 44, 28, 45, 46, + 47, 28, 29, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 33, 34, 35, 36, 37, 28, 28, 28, + 28, 28, 28, 42, 43, 44, 28, 45, + 46, 47, 28, 29, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 34, 35, 36, 37, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 45, 46, 47, 28, 29, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 35, 36, 37, 28, + 29, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 36, 37, 28, 29, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 37, 28, + 29, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 35, 36, 37, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 45, 46, 47, + 28, 29, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 35, 36, 37, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 46, + 47, 28, 29, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 35, 36, 37, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 47, 28, 29, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 34, 35, 36, 37, 28, 28, + 28, 28, 28, 28, 42, 43, 44, 28, + 45, 46, 47, 28, 29, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 34, 35, 36, 37, 28, + 28, 28, 28, 28, 28, 28, 43, 44, + 28, 45, 46, 47, 28, 29, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 34, 35, 36, 37, + 28, 28, 28, 28, 28, 28, 28, 28, + 44, 28, 45, 46, 47, 28, 29, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 33, 34, 35, 36, + 37, 28, 39, 33, 28, 28, 28, 42, + 43, 44, 28, 45, 46, 47, 28, 29, + 28, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 33, 34, 35, + 36, 37, 28, 28, 33, 28, 28, 28, + 42, 43, 44, 28, 45, 46, 47, 28, + 29, 28, 28, 28, 28, 28, 28, 28, + 28, 28, 28, 28, 28, 28, 33, 34, + 35, 36, 37, 38, 39, 33, 28, 28, + 28, 42, 43, 44, 28, 45, 46, 47, + 28, 29, 28, 28, 30, 31, 28, 28, + 28, 28, 28, 28, 28, 28, 28, 33, + 34, 35, 36, 37, 38, 39, 33, 40, + 28, 41, 42, 43, 44, 28, 45, 46, + 47, 28, 29, 28, 28, 30, 31, 28, + 28, 28, 28, 28, 28, 28, 28, 28, + 33, 34, 35, 36, 37, 38, 39, 33, + 40, 32, 41, 42, 43, 44, 28, 45, + 46, 47, 28, 51, 50, 50, 50, 50, + 50, 50, 50, 52, 50, 5, 53, 51, + 50, 6, 54, 54, 1, 55, 54, 54, + 54, 54, 54, 54, 54, 54, 56, 10, + 11, 12, 13, 14, 15, 16, 10, 17, + 19, 19, 20, 21, 22, 54, 23, 24, + 25, 54, 6, 54, 54, 1, 55, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 10, 11, 12, 13, 14, 15, 16, 10, + 17, 19, 19, 20, 21, 22, 54, 23, + 24, 25, 54, 6, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 10, 11, 12, 13, 14, 54, 54, + 54, 54, 54, 54, 20, 21, 22, 54, + 23, 24, 25, 54, 6, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 11, 12, 13, 14, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 23, 24, 25, 54, 6, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 12, 13, 14, + 54, 6, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 13, 14, 54, 6, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 14, + 54, 6, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 12, 13, 14, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 23, 24, + 25, 54, 6, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 12, 13, 14, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 24, 25, 54, 6, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 12, 13, 14, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 25, 54, 6, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 11, 12, 13, 14, 54, + 54, 54, 54, 54, 54, 20, 21, 22, + 54, 23, 24, 25, 54, 6, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 11, 12, 13, 14, + 54, 54, 54, 54, 54, 54, 54, 21, + 22, 54, 23, 24, 25, 54, 6, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 11, 12, 13, + 14, 54, 54, 54, 54, 54, 54, 54, + 54, 22, 54, 23, 24, 25, 54, 6, + 54, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 10, 11, 12, + 13, 14, 54, 16, 10, 54, 54, 54, + 20, 21, 22, 54, 23, 24, 25, 54, + 6, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 10, 11, + 12, 13, 14, 54, 54, 10, 54, 54, + 54, 20, 21, 22, 54, 23, 24, 25, + 54, 6, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 54, 54, 54, 54, 10, + 11, 12, 13, 14, 15, 16, 10, 54, + 54, 54, 20, 21, 22, 54, 23, 24, + 25, 54, 6, 54, 54, 1, 55, 54, + 54, 54, 54, 54, 54, 54, 54, 54, + 10, 11, 12, 13, 14, 15, 16, 10, + 17, 54, 19, 20, 21, 22, 54, 23, + 24, 25, 54, 1, 57, 3, 54, 54, + 54, 3, 54, 54, 6, 54, 54, 1, + 55, 54, 54, 54, 54, 54, 54, 54, + 54, 54, 10, 11, 12, 13, 14, 15, + 16, 10, 17, 18, 19, 20, 21, 22, + 54, 23, 24, 25, 54, 6, 54, 54, + 1, 55, 54, 54, 54, 54, 54, 54, + 54, 54, 54, 10, 11, 12, 13, 14, + 15, 16, 10, 17, 18, 19, 20, 21, + 22, 54, 23, 24, 25, 54, 59, 58, + 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 58, 58, 58, 58, 58, 58, + 58, 58, 59, 60, 58, 59, 60, 58, + 60, 58, 0 }; static const char _use_syllable_machine_trans_targs[] = { - 3, 41, 3, 43, 4, 5, 25, 3, - 0, 2, 60, 62, 45, 46, 47, 48, - 49, 56, 57, 58, 61, 59, 53, 54, - 55, 50, 51, 52, 3, 3, 3, 3, - 6, 7, 24, 9, 10, 11, 12, 13, - 20, 21, 22, 23, 17, 18, 19, 14, - 15, 16, 8, 3, 3, 3, 26, 27, - 40, 29, 30, 31, 32, 36, 37, 38, - 39, 33, 34, 35, 28, 3, 3, 1, - 42, 3, 44, 3, 63, 64 + 1, 26, 2, 3, 1, 23, 1, 43, + 44, 46, 28, 29, 30, 31, 32, 39, + 40, 41, 45, 42, 36, 37, 38, 33, + 34, 35, 1, 1, 1, 1, 4, 5, + 22, 7, 8, 9, 10, 11, 18, 19, + 20, 21, 15, 16, 17, 12, 13, 14, + 6, 1, 1, 24, 25, 1, 1, 0, + 27, 1, 1, 47, 48 }; static const char _use_syllable_machine_trans_actions[] = { - 1, 2, 3, 4, 0, 0, 0, 7, - 0, 0, 4, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 4, 4, 0, 0, - 0, 0, 0, 0, 8, 9, 10, 11, + 1, 2, 0, 0, 5, 0, 6, 0, + 2, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 2, 2, 0, 0, 0, 0, + 0, 0, 7, 8, 9, 10, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 12, 13, 14, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 15, 16, 0, - 2, 17, 4, 18, 0, 0 + 0, 11, 12, 0, 0, 13, 14, 0, + 2, 15, 16, 0, 0 }; static const char _use_syllable_machine_to_state_actions[] = { - 0, 0, 0, 5, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 3, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -330,9 +261,7 @@ }; static const char _use_syllable_machine_from_state_actions[] = { - 0, 0, 0, 6, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, + 0, 4, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, @@ -342,29 +271,27 @@ }; static const short _use_syllable_machine_eof_trans[] = { - 0, 1, 3, 0, 29, 31, 31, 52, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 31, 31, 31, 31, 31, 31, 31, - 31, 53, 53, 52, 53, 53, 53, 53, - 53, 53, 53, 53, 53, 53, 53, 53, - 53, 70, 70, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 74, 74, - 74, 74, 74, 74, 74, 74, 76, 76, - 76 + 1, 0, 27, 29, 29, 50, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 29, + 29, 29, 29, 29, 29, 29, 29, 51, + 54, 51, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 55, 55, 55, 55, 55, + 55, 55, 55, 58, 55, 55, 59, 59, + 59 }; -static const int use_syllable_machine_start = 3; -static const int use_syllable_machine_first_final = 3; -static const int use_syllable_machine_error = 0; +static const int use_syllable_machine_start = 1; +static const int use_syllable_machine_first_final = 1; +static const int use_syllable_machine_error = -1; -static const int use_syllable_machine_en_main = 3; +static const int use_syllable_machine_en_main = 1; #line 38 "hb-ot-shape-complex-use-machine.rl" -#line 145 "hb-ot-shape-complex-use-machine.rl" +#line 138 "hb-ot-shape-complex-use-machine.rl" #define found_syllable(syllable_type) \ @@ -384,7 +311,7 @@ int cs; hb_glyph_info_t *info = buffer->info; -#line 388 "hb-ot-shape-complex-use-machine.hh" +#line 315 "hb-ot-shape-complex-use-machine.hh" { cs = use_syllable_machine_start; ts = 0; @@ -392,7 +319,7 @@ act = 0; } -#line 166 "hb-ot-shape-complex-use-machine.rl" +#line 159 "hb-ot-shape-complex-use-machine.rl" p = 0; @@ -401,7 +328,7 @@ unsigned int last = 0; unsigned int syllable_serial = 1; -#line 405 "hb-ot-shape-complex-use-machine.hh" +#line 332 "hb-ot-shape-complex-use-machine.hh" { int _slen; int _trans; @@ -409,15 +336,13 @@ const char *_inds; if ( p == pe ) goto _test_eof; - if ( cs == 0 ) - goto _out; _resume: switch ( _use_syllable_machine_from_state_actions[cs] ) { - case 6: + case 4: #line 1 "NONE" {ts = p;} break; -#line 421 "hb-ot-shape-complex-use-machine.hh" +#line 346 "hb-ot-shape-complex-use-machine.hh" } _keys = _use_syllable_machine_trans_keys + (cs<<1); @@ -439,92 +364,70 @@ #line 1 "NONE" {te = p+1;} break; - case 9: + case 8: +#line 127 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ found_syllable (independent_cluster); }} + break; + case 10: +#line 129 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ found_syllable (standard_cluster); }} + break; + case 6: +#line 133 "hb-ot-shape-complex-use-machine.rl" + {te = p+1;{ found_syllable (broken_cluster); }} + break; + case 5: #line 134 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (independent_cluster); }} + {te = p+1;{ found_syllable (non_cluster); }} + break; + case 7: +#line 127 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (independent_cluster); }} break; case 11: -#line 136 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (consonant_cluster); }} - break; - case 14: -#line 137 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (vowel_cluster); }} - break; - case 16: -#line 138 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (number_joiner_terminated_cluster); }} - break; - case 7: -#line 141 "hb-ot-shape-complex-use-machine.rl" - {te = p+1;{ found_syllable (broken_cluster); }} - break; - case 8: -#line 134 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (independent_cluster); }} - break; - case 12: -#line 135 "hb-ot-shape-complex-use-machine.rl" +#line 128 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (virama_terminated_cluster); }} break; - case 10: -#line 136 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (consonant_cluster); }} + case 9: +#line 129 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (standard_cluster); }} break; case 13: -#line 137 "hb-ot-shape-complex-use-machine.rl" - {te = p;p--;{ found_syllable (vowel_cluster); }} +#line 130 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (number_joiner_terminated_cluster); }} break; - case 15: -#line 139 "hb-ot-shape-complex-use-machine.rl" + case 12: +#line 131 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (numeral_cluster); }} break; - case 18: -#line 140 "hb-ot-shape-complex-use-machine.rl" + case 16: +#line 132 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (symbol_cluster); }} break; - case 17: -#line 141 "hb-ot-shape-complex-use-machine.rl" + case 14: +#line 133 "hb-ot-shape-complex-use-machine.rl" {te = p;p--;{ found_syllable (broken_cluster); }} break; + case 15: +#line 134 "hb-ot-shape-complex-use-machine.rl" + {te = p;p--;{ found_syllable (non_cluster); }} + break; case 1: -#line 139 "hb-ot-shape-complex-use-machine.rl" - {{p = ((te))-1;}{ found_syllable (numeral_cluster); }} - break; - case 3: -#line 1 "NONE" - { switch( act ) { - case 0: - {{cs = 0; goto _again;}} +#line 133 "hb-ot-shape-complex-use-machine.rl" + {{p = ((te))-1;}{ found_syllable (broken_cluster); }} break; - case 8: - {{p = ((te))-1;} found_syllable (broken_cluster); } - break; - } - } - break; - case 4: -#line 1 "NONE" - {te = p+1;} -#line 141 "hb-ot-shape-complex-use-machine.rl" - {act = 8;} - break; -#line 513 "hb-ot-shape-complex-use-machine.hh" +#line 420 "hb-ot-shape-complex-use-machine.hh" } _again: switch ( _use_syllable_machine_to_state_actions[cs] ) { - case 5: + case 3: #line 1 "NONE" {ts = 0;} -#line 1 "NONE" - {act = 0;} break; -#line 524 "hb-ot-shape-complex-use-machine.hh" +#line 429 "hb-ot-shape-complex-use-machine.hh" } - if ( cs == 0 ) - goto _out; if ( ++p != pe ) goto _resume; _test_eof: {} @@ -536,10 +439,9 @@ } } - _out: {} } -#line 175 "hb-ot-shape-complex-use-machine.rl" +#line 168 "hb-ot-shape-complex-use-machine.rl" }
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -46,7 +46,6 @@ USE_O = 0, /* OTHER */ USE_B = 1, /* BASE */ - USE_IV = 2, /* BASE_VOWEL */ USE_IND = 3, /* BASE_IND */ USE_N = 4, /* BASE_NUM */ USE_GB = 5, /* BASE_OTHER */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use-table.cc Tue Aug 09 16:20:02 2016 -0700 @@ -6,12 +6,12 @@ * * on files with these headers: * - * # IndicSyllabicCategory-8.0.0.txt - * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI] - * # IndicPositionalCategory-8.0.0.txt - * # Date: 2015-05-12, 10:00:00 GMT [RP, KW, LI] - * # Blocks-8.0.0.txt - * # Date: 2014-11-10, 23:04:00 GMT [KW] + * # IndicSyllabicCategory-9.0.0.txt + * # Date: 2016-05-21, 02:46:00 GMT [RP] + * # IndicPositionalCategory-9.0.0.txt + * # Date: 2016-02-25, 00:48:00 GMT [RP] + * # Blocks-9.0.0.txt + * # Date: 2016-02-05, 23:48:00 GMT [KW] * UnicodeData.txt does not have a header. */ @@ -24,7 +24,6 @@ #define H USE_H /* HALANT */ #define HN USE_HN /* HALANT_NUM */ #define IND USE_IND /* BASE_IND */ -#define IV USE_IV /* BASE_VOWEL */ #define N USE_N /* BASE_NUM */ #define O USE_O /* OTHER */ #define R USE_R /* REPHA */ @@ -80,30 +79,30 @@ /* Devanagari */ - /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, - /* 0910 */ IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0900 */ VMAbv, VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, + /* 0910 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0920 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0930 */ B, B, B, B, B, B, B, B, B, B, VAbv, VPst, CMBlw, B, VPst, VPre, /* 0940 */ VPst, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, VPst, VPst, VPst, VPst, H, VPre, VPst, /* 0950 */ O, VMAbv, VMBlw, O, O, VAbv, VBlw, VBlw, B, B, B, B, B, B, B, B, - /* 0960 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, - /* 0970 */ O, O, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, + /* 0960 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, + /* 0970 */ O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* Bengali */ - /* 0980 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV, - /* 0990 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0980 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B, + /* 0990 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 09A0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 09B0 */ B, O, B, O, O, O, B, B, B, B, O, O, CMBlw, B, VPst, VPre, /* 09C0 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, IND, O, /* 09D0 */ O, O, O, O, O, O, O, VPst, O, O, O, O, B, B, O, B, - /* 09E0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, + /* 09E0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, /* 09F0 */ B, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* Gurmukhi */ - /* 0A00 */ O, VMAbv, VMAbv, VMPst, O, IV, IV, IV, IV, IV, IV, O, O, O, O, IV, - /* 0A10 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0A00 */ O, VMAbv, VMAbv, VMPst, O, B, B, B, B, B, B, O, O, O, O, B, + /* 0A10 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0A20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 0A30 */ B, O, B, B, O, B, B, O, B, B, O, O, CMBlw, O, VPst, VPre, /* 0A40 */ VPst, VBlw, VBlw, O, O, O, O, VAbv, VAbv, O, O, VAbv, VAbv, H, O, O, @@ -113,30 +112,30 @@ /* Gujarati */ - /* 0A80 */ O, VMAbv, VMAbv, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, - /* 0A90 */ IV, IV, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0A80 */ O, VMAbv, VMAbv, VMPst, O, B, B, B, B, B, B, B, B, B, O, B, + /* 0A90 */ B, B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0AA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 0AB0 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPre, /* 0AC0 */ VPst, VBlw, VBlw, VBlw, VBlw, VAbv, O, VAbv, VAbv, VAbv, O, VPst, VPst, H, O, O, /* 0AD0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, - /* 0AE0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, + /* 0AE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, /* 0AF0 */ O, O, O, O, O, O, O, O, O, B, O, O, O, O, O, O, /* Oriya */ - /* 0B00 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV, - /* 0B10 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0B00 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B, + /* 0B10 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0B20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 0B30 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv, /* 0B40 */ VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O, /* 0B50 */ O, O, O, O, O, O, VAbv, VAbv, O, O, O, O, B, B, O, B, - /* 0B60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, + /* 0B60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, /* 0B70 */ O, B, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* Tamil */ - /* 0B80 */ O, O, VMAbv, IND, O, IV, IV, IV, IV, IV, IV, O, O, O, IV, IV, - /* 0B90 */ IV, O, IV, IV, IV, B, O, O, O, B, B, O, B, O, B, B, + /* 0B80 */ O, O, VMAbv, IND, O, B, B, B, B, B, B, O, O, O, B, B, + /* 0B90 */ B, O, B, B, B, B, O, O, O, B, B, O, B, O, B, B, /* 0BA0 */ O, O, O, B, B, O, O, O, B, B, B, O, O, O, B, B, /* 0BB0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, VPst, VPst, /* 0BC0 */ VAbv, VPst, VPst, O, O, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, O, O, @@ -146,41 +145,41 @@ /* Telugu */ - /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV, - /* 0C10 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0C00 */ VMAbv, VMPst, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B, + /* 0C10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0C20 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 0C30 */ B, B, B, B, B, B, B, B, B, B, O, O, O, B, VAbv, VAbv, /* 0C40 */ VAbv, VPst, VPst, VPst, VPst, O, VAbv, VAbv, VAbv, O, VAbv, VAbv, VAbv, H, O, O, /* 0C50 */ O, O, O, O, O, VAbv, VBlw, O, B, B, B, O, O, O, O, O, - /* 0C60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, + /* 0C60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, /* 0C70 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* Kannada */ - /* 0C80 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV, - /* 0C90 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0C80 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B, + /* 0C90 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0CA0 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 0CB0 */ B, B, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VAbv, /* 0CC0 */ VAbv, VPst, VPst, VPst, VPst, O, VAbv, VAbv, VAbv, O, VAbv, VAbv, VAbv, H, O, O, /* 0CD0 */ O, O, O, O, O, VPst, VPst, O, O, O, O, O, O, O, B, O, - /* 0CE0 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, + /* 0CE0 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, /* 0CF0 */ O, R, R, O, O, O, O, O, O, O, O, O, O, O, O, O, /* Malayalam */ - /* 0D00 */ O, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, IV, IV, - /* 0D10 */ IV, O, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 0D00 */ O, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, B, B, + /* 0D10 */ B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0D20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0D30 */ B, B, B, B, B, B, B, B, B, B, B, O, O, B, VPst, VPst, /* 0D40 */ VPst, VPst, VPst, VBlw, VBlw, O, VPre, VPre, VPre, O, VPre, VPre, VPre, H, R, O, - /* 0D50 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, IV, - /* 0D60 */ IV, IV, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, + /* 0D50 */ O, O, O, O, IND, IND, IND, VPst, O, O, O, O, O, O, O, B, + /* 0D60 */ B, B, VBlw, VBlw, O, O, B, B, B, B, B, B, B, B, B, B, /* 0D70 */ O, O, O, O, O, O, O, O, O, O, IND, IND, IND, IND, IND, IND, /* Sinhala */ - /* 0D80 */ O, O, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, - /* 0D90 */ IV, IV, IV, IV, IV, IV, IV, O, O, O, B, B, B, B, B, B, + /* 0D80 */ O, O, VMPst, VMPst, O, B, B, B, B, B, B, B, B, B, B, B, + /* 0D90 */ B, B, B, B, B, B, B, O, O, O, B, B, B, B, B, B, /* 0DA0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 0DB0 */ B, B, O, B, B, B, B, B, B, B, B, B, O, B, O, O, /* 0DC0 */ B, B, B, B, B, B, B, O, O, O, H, O, O, O, O, VPst, @@ -195,10 +194,10 @@ /* 1000 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 1020 */ B, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, VPst, VPst, VAbv, VAbv, VBlw, + /* 1020 */ B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VAbv, VAbv, VBlw, /* 1030 */ VBlw, VPre, VAbv, VAbv, VAbv, VAbv, VMAbv, VMBlw, VMPst, H, VAbv, MPst, MPre, MBlw, MBlw, B, /* 1040 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, GB, O, - /* 1050 */ B, B, IV, IV, IV, IV, VPst, VPst, VBlw, VBlw, B, B, B, B, MBlw, MBlw, + /* 1050 */ B, B, B, B, B, B, VPst, VPst, VBlw, VBlw, B, B, B, B, MBlw, MBlw, /* 1060 */ MBlw, B, VPst, VMPst, VMPst, B, B, VPst, VPst, VMPst, VMPst, VMPst, VMPst, VMPst, B, B, /* 1070 */ B, VAbv, VAbv, VAbv, VAbv, B, B, B, B, B, B, B, B, B, B, B, /* 1080 */ B, B, MBlw, VPst, VPre, VAbv, VAbv, VMPst, VMPst, VMPst, VMPst, VMPst, VMPst, VMBlw, B, VMPst, @@ -209,30 +208,30 @@ /* Tagalog */ - /* 1700 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, O, B, B, + /* 1700 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, B, B, /* 1710 */ B, B, VAbv, VBlw, VBlw, O, O, O, O, O, O, O, O, O, O, O, /* Hanunoo */ - /* 1720 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 1720 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1730 */ B, B, VAbv, VBlw, VBlw, O, O, O, O, O, O, O, O, O, O, O, /* Buhid */ - /* 1740 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 1740 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1750 */ B, B, VAbv, VBlw, O, O, O, O, O, O, O, O, O, O, O, O, /* Tagbanwa */ - /* 1760 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, O, B, B, + /* 1760 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, B, B, /* 1770 */ B, O, VAbv, VBlw, O, O, O, O, O, O, O, O, O, O, O, O, /* Khmer */ /* 1780 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1790 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 17A0 */ B, B, B, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, - /* 17B0 */ IV, IV, IV, IV, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPre, VPre, + /* 17A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 17B0 */ B, B, B, B, O, O, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VPre, VPre, /* 17C0 */ VPre, VPre, VPre, VPre, VPre, VPre, VMAbv, VMPst, VPst, VMAbv, VMAbv, FM, FAbv, CMAbv, FM, FM, /* 17D0 */ FM, VAbv, H, FM, O, O, O, O, O, O, O, O, B, VAbv, O, O, /* 17E0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, @@ -274,8 +273,8 @@ /* 1A20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1A30 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, IV, IV, IV, - /* 1A50 */ IV, IV, IV, B, B, MPre, MBlw, FPst, FAbv, FAbv, FAbv, FBlw, FBlw, FBlw, FBlw, O, + /* 1A40 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 1A50 */ B, B, B, B, B, MPre, MBlw, FPst, FAbv, FAbv, FAbv, FBlw, FBlw, FBlw, FBlw, O, /* 1A60 */ H, VPst, VAbv, VPst, VPst, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VAbv, VBlw, VPst, VPre, VPre, /* 1A70 */ VPre, VPre, VPre, VAbv, VAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, FM, FM, FM, O, O, FM, /* 1A80 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, @@ -286,8 +285,8 @@ /* Balinese */ - /* 1B00 */ VMAbv, VMAbv, VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, - /* 1B10 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 1B00 */ VMAbv, VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, + /* 1B10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1B20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1B30 */ B, B, B, B, CMAbv, VPst, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPre, VPre, /* 1B40 */ VPre, VPre, VAbv, VAbv, H, B, B, B, B, B, B, B, O, O, O, O, @@ -297,7 +296,7 @@ /* Sundanese */ - /* 1B80 */ VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, + /* 1B80 */ VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1B90 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1BA0 */ B, SUB, SUB, SUB, VAbv, VBlw, VPre, VPst, VAbv, VAbv, VPst, H, SUB, SUB, B, B, /* 1BB0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, @@ -306,7 +305,7 @@ /* 1BC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 1BD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* 1BE0 */ B, B, B, B, IV, IV, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv, + /* 1BE0 */ B, B, B, B, B, B, CMAbv, VPst, VAbv, VAbv, VPst, VPst, VPst, VAbv, VPst, VAbv, /* 1BF0 */ FAbv, FAbv, VPst, VPst, O, O, O, O, O, O, O, O, O, O, O, O, /* Lepcha */ @@ -326,14 +325,20 @@ /* 1CE0 */ VMAbv, VMPst, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, VMBlw, O, O, O, O, VMBlw, O, O, /* 1CF0 */ O, O, VMPst, VMPst, VMAbv, O, O, O, VMAbv, VMAbv, O, O, O, O, O, O, -#define use_offset_0x2008u 2552 +#define use_offset_0x1df8u 2552 + + + /* Combining Diacritical Marks Supplement */ + O, O, O, FM, O, O, O, O, + +#define use_offset_0x2008u 2560 /* General Punctuation */ O, O, O, O, ZWNJ, ZWJ, O, O, /* 2010 */ GB, GB, GB, GB, GB, O, O, O, -#define use_offset_0x2060u 2568 +#define use_offset_0x2060u 2576 /* 2060 */ WJ, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, @@ -342,12 +347,12 @@ /* 2070 */ O, O, O, O, FM, O, O, O, O, O, O, O, O, O, O, O, /* 2080 */ O, O, FM, FM, FM, O, O, O, -#define use_offset_0xa800u 2608 +#define use_offset_0xa800u 2616 /* Syloti Nagri */ - /* A800 */ IV, IV, O, IV, IV, IV, VAbv, B, B, B, B, VMAbv, B, B, B, B, + /* A800 */ B, B, O, B, B, B, VAbv, B, B, B, B, VMAbv, B, B, B, B, /* A810 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A820 */ B, B, B, VPst, VPst, VBlw, VAbv, VPst, O, O, O, O, O, O, O, O, /* A830 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, @@ -361,11 +366,11 @@ /* Saurashtra */ - /* A880 */ VMPst, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, - /* A890 */ IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* A880 */ VMPst, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* A890 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A8A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A8B0 */ B, B, B, B, FPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, VPst, - /* A8C0 */ VPst, VPst, VPst, VPst, H, O, O, O, O, O, O, O, O, O, O, O, + /* A8C0 */ VPst, VPst, VPst, VPst, H, VMAbv, O, O, O, O, O, O, O, O, O, O, /* A8D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, /* Devanagari Extended */ @@ -389,7 +394,7 @@ /* Javanese */ - /* A980 */ VMAbv, VMAbv, FAbv, VMPst, IV, IV, IV, IV, IV, B, B, B, IV, IV, IV, B, + /* A980 */ VMAbv, VMAbv, FAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, /* A990 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A9A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* A9B0 */ B, B, B, CMAbv, VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VPre, VAbv, SUB, MPst, MPst, @@ -403,7 +408,7 @@ /* Cham */ - /* AA00 */ IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B, B, + /* AA00 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* AA10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* AA20 */ B, B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VAbv, VPre, /* AA30 */ VPre, VAbv, VBlw, MPst, MPre, MBlw, MBlw, O, O, O, O, O, O, O, O, O, @@ -413,7 +418,7 @@ /* Myanmar Extended-A */ /* AA60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, - /* AA70 */ O, B, B, B, O, O, O, O, O, O, B, VMPst, VMAbv, VMPst, B, B, + /* AA70 */ O, B, B, B, GB, GB, GB, O, O, O, B, VMPst, VMAbv, VMPst, B, B, /* Tai Viet */ @@ -426,27 +431,27 @@ /* Meetei Mayek Extensions */ - /* AAE0 */ IV, IV, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst, + /* AAE0 */ B, B, B, B, B, B, B, B, B, B, B, VPre, VBlw, VAbv, VPre, VPst, /* AAF0 */ O, O, O, O, O, VMPst, H, O, -#define use_offset_0xabc0u 3368 +#define use_offset_0xabc0u 3376 /* Meetei Mayek */ - /* ABC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, IV, IV, - /* ABD0 */ B, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* ABC0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* ABD0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* ABE0 */ B, B, B, VPst, VPst, VAbv, VPst, VPst, VBlw, VPst, VPst, O, VMPst, VBlw, O, O, /* ABF0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, -#define use_offset_0xfe00u 3432 +#define use_offset_0xfe00u 3440 /* Variation Selectors */ /* FE00 */ VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, VS, -#define use_offset_0x10a00u 3448 +#define use_offset_0x10a00u 3456 /* Kharoshthi */ @@ -457,13 +462,13 @@ /* 10A30 */ B, B, B, B, O, O, O, O, CMAbv, CMBlw, CMBlw, O, O, O, O, H, /* 10A40 */ B, B, B, B, B, B, B, B, -#define use_offset_0x11000u 3520 +#define use_offset_0x11000u 3528 /* Brahmi */ - /* 11000 */ VMPst, VMAbv, VMPst, R, R, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, - /* 11010 */ IV, IV, IV, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11000 */ VMPst, VMAbv, VMPst, R, R, B, B, B, B, B, B, B, B, B, B, B, + /* 11010 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11020 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11030 */ B, B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, /* 11040 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, O, O, O, O, O, O, O, O, O, @@ -473,17 +478,17 @@ /* Kaithi */ - /* 11080 */ VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, + /* 11080 */ VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11090 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 110A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 110B0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VPst, VPst, H, CMBlw, O, O, O, O, O, -#define use_offset_0x11100u 3712 +#define use_offset_0x11100u 3720 /* Chakma */ - /* 11100 */ VMAbv, VMAbv, VMAbv, IV, IV, IV, IV, B, B, B, B, B, B, B, B, B, + /* 11100 */ VMAbv, VMAbv, VMAbv, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11110 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11120 */ B, B, B, B, B, B, B, VAbv, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VAbv, VAbv, /* 11130 */ VAbv, VBlw, VBlw, H, VAbv, O, B, B, B, B, B, B, B, B, B, B, @@ -497,8 +502,8 @@ /* Sharada */ - /* 11180 */ VMAbv, VMAbv, VMPst, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, - /* 11190 */ IV, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11180 */ VMAbv, VMAbv, VMPst, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11190 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 111A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 111B0 */ B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, /* 111C0 */ H, B, R, R, O, O, O, O, O, O, CMBlw, VAbv, VBlw, O, O, O, @@ -511,23 +516,23 @@ /* Khojki */ - /* 11200 */ IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, B, B, + /* 11200 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11210 */ B, B, O, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11220 */ B, B, B, B, B, B, B, B, B, B, B, B, VPst, VPst, VPst, VBlw, - /* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv, + /* 11230 */ VAbv, VAbv, VAbv, VAbv, VMAbv, H, CMAbv, CMAbv, O, O, O, O, O, O, VMAbv, O, -#define use_offset_0x11280u 4024 +#define use_offset_0x11280u 4040 /* Multani */ - /* 11280 */ IV, IV, IV, IV, B, B, B, O, B, O, B, B, B, B, O, B, + /* 11280 */ B, B, B, B, B, B, B, O, B, O, B, B, B, B, O, B, /* 11290 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, O, B, /* 112A0 */ B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, O, /* Khudawadi */ - /* 112B0 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, + /* 112B0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 112C0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 112D0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VMAbv, /* 112E0 */ VPst, VPre, VPst, VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, CMBlw, VBlw, O, O, O, O, O, @@ -535,44 +540,55 @@ /* Grantha */ - /* 11300 */ VMAbv, VMAbv, VMPst, VMPst, O, IV, IV, IV, IV, IV, IV, IV, IV, O, O, IV, - /* 11310 */ IV, O, O, IV, IV, B, B, B, B, B, B, B, B, B, B, B, + /* 11300 */ VMAbv, VMAbv, VMPst, VMPst, O, B, B, B, B, B, B, B, B, O, O, B, + /* 11310 */ B, O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11320 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, /* 11330 */ B, O, B, B, O, B, B, B, B, B, O, O, CMBlw, B, VPst, VPst, /* 11340 */ VAbv, VPst, VPst, VPst, VPst, O, O, VPre, VPre, O, O, VPre, VPre, H, O, O, /* 11350 */ O, O, O, O, O, O, O, VPst, O, O, O, O, O, O, O, O, - /* 11360 */ IV, IV, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O, + /* 11360 */ B, B, VPst, VPst, O, O, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O, /* 11370 */ VMAbv, VMAbv, VMAbv, VMAbv, VMAbv, O, O, O, -#define use_offset_0x11480u 4272 +#define use_offset_0x11400u 4288 + + + /* Newa */ + /* 11400 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11410 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11420 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11430 */ B, B, B, B, B, VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, + /* 11440 */ VPst, VPst, H, VMAbv, VMAbv, VMPst, CMBlw, B, O, O, O, O, O, O, O, O, + /* 11450 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, + /* 11460 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, + /* 11470 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* Tirhuta */ - /* 11480 */ O, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, + /* 11480 */ O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11490 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 114A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 114B0 */ VPst, VPre, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VPre, VAbv, VPre, VPre, VPst, VPre, VMAbv, /* 114C0 */ VMAbv, VMPst, H, CMBlw, B, O, O, O, O, O, O, O, O, O, O, O, /* 114D0 */ B, B, B, B, B, B, B, B, B, B, O, O, O, O, O, O, -#define use_offset_0x11580u 4368 +#define use_offset_0x11580u 4512 /* Siddham */ - /* 11580 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, + /* 11580 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11590 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 115A0 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst, /* 115B0 */ VPre, VPst, VBlw, VBlw, VBlw, VBlw, O, O, VPre, VPre, VPre, VPre, VMAbv, VMAbv, VMPst, H, /* 115C0 */ CMBlw, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, - /* 115D0 */ O, O, O, O, O, O, O, O, IV, IV, IV, IV, VBlw, VBlw, O, O, + /* 115D0 */ O, O, O, O, O, O, O, O, B, B, B, B, VBlw, VBlw, O, O, /* 115E0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* 115F0 */ O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, /* Modi */ - /* 11600 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, + /* 11600 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11610 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11620 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11630 */ VPst, VPst, VPst, VBlw, VBlw, VBlw, VBlw, VBlw, VBlw, VAbv, VAbv, VPst, VPst, VMAbv, VMPst, H, @@ -583,7 +599,7 @@ /* Takri */ - /* 11680 */ IV, IV, IV, IV, IV, IV, IV, IV, IV, IV, B, B, B, B, B, B, + /* 11680 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 11690 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, /* 116A0 */ B, B, B, B, B, B, B, B, B, B, B, VMAbv, VMPst, VAbv, VPre, VPst, /* 116B0 */ VBlw, VBlw, VAbv, VAbv, VAbv, VAbv, H, CMBlw, O, O, O, O, O, O, O, O, @@ -599,7 +615,28 @@ /* 11720 */ VPst, VPst, VAbv, VAbv, VBlw, VBlw, VPre, VAbv, VBlw, VAbv, VAbv, VAbv, O, O, O, O, /* 11730 */ B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, O, -}; /* Table items: 4816; occupancy: 72% */ +#define use_offset_0x11c00u 4960 + + + /* Bhaiksuki */ + + /* 11C00 */ B, B, B, B, B, B, B, B, B, O, B, B, B, B, B, B, + /* 11C10 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11C20 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, VPst, + /* 11C30 */ VAbv, VAbv, VBlw, VBlw, VBlw, VBlw, VBlw, O, VAbv, VAbv, VAbv, VAbv, VMAbv, VMAbv, VMPst, H, + /* 11C40 */ B, O, O, O, O, O, O, O, O, O, O, O, O, O, O, O, + /* 11C50 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11C60 */ B, B, B, B, B, B, B, B, B, B, B, B, B, O, O, O, + + /* Marchen */ + + /* 11C70 */ O, O, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11C80 */ B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, B, + /* 11C90 */ O, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, + /* 11CA0 */ SUB, SUB, SUB, SUB, SUB, SUB, SUB, SUB, O, SUB, SUB, SUB, SUB, SUB, SUB, SUB, + /* 11CB0 */ VBlw, VPre, VBlw, VAbv, VPst, VMAbv, VMAbv, O, + +}; /* Table items: 5144; occupancy: 72% */ USE_TABLE_ELEMENT_TYPE hb_use_get_categories (hb_codepoint_t u) @@ -619,6 +656,7 @@ if (hb_in_range (u, 0x1900u, 0x1A9Fu)) return use_table[u - 0x1900u + use_offset_0x1900u]; if (hb_in_range (u, 0x1B00u, 0x1C4Fu)) return use_table[u - 0x1B00u + use_offset_0x1b00u]; if (hb_in_range (u, 0x1CD0u, 0x1CFFu)) return use_table[u - 0x1CD0u + use_offset_0x1cd0u]; + if (hb_in_range (u, 0x1DF8u, 0x1DFFu)) return use_table[u - 0x1DF8u + use_offset_0x1df8u]; break; case 0x2u: @@ -642,10 +680,11 @@ case 0x11u: if (hb_in_range (u, 0x11000u, 0x110BFu)) return use_table[u - 0x11000u + use_offset_0x11000u]; - if (hb_in_range (u, 0x11100u, 0x11237u)) return use_table[u - 0x11100u + use_offset_0x11100u]; + if (hb_in_range (u, 0x11100u, 0x1123Fu)) return use_table[u - 0x11100u + use_offset_0x11100u]; if (hb_in_range (u, 0x11280u, 0x11377u)) return use_table[u - 0x11280u + use_offset_0x11280u]; - if (hb_in_range (u, 0x11480u, 0x114DFu)) return use_table[u - 0x11480u + use_offset_0x11480u]; + if (hb_in_range (u, 0x11400u, 0x114DFu)) return use_table[u - 0x11400u + use_offset_0x11400u]; if (hb_in_range (u, 0x11580u, 0x1173Fu)) return use_table[u - 0x11580u + use_offset_0x11580u]; + if (hb_in_range (u, 0x11C00u, 0x11CB7u)) return use_table[u - 0x11C00u + use_offset_0x11c00u]; if (unlikely (u == 0x1107Fu)) return HN; break; @@ -662,7 +701,6 @@ #undef H #undef HN #undef IND -#undef IV #undef N #undef O #undef R
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-complex-use.cc Tue Aug 09 16:20:02 2016 -0700 @@ -184,6 +184,9 @@ case HB_SCRIPT_MANICHAEAN: case HB_SCRIPT_PSALTER_PAHLAVI: + /* Unicode-9.0 additions */ + case HB_SCRIPT_ADLAM: + return true; default: @@ -227,12 +230,12 @@ enum syllable_type_t { independent_cluster, virama_terminated_cluster, - consonant_cluster, - vowel_cluster, + standard_cluster, number_joiner_terminated_cluster, numeral_cluster, symbol_cluster, broken_cluster, + non_cluster, }; #include "hb-ot-shape-complex-use-machine.hh" @@ -285,6 +288,9 @@ setup_topographical_masks (const hb_ot_shape_plan_t *plan, hb_buffer_t *buffer) { + const use_shape_plan_t *use_plan = (const use_shape_plan_t *) plan->data; + if (use_plan->arabic_plan) + return; ASSERT_STATIC (INIT < 4 && ISOL < 4 && MEDI < 4 && FINA < 4); hb_mask_t masks[4], all_masks = 0; @@ -309,13 +315,13 @@ { case independent_cluster: case symbol_cluster: + case non_cluster: /* These don't join. Nothing to do. */ last_form = _NONE; break; case virama_terminated_cluster: - case consonant_cluster: - case vowel_cluster: + case standard_cluster: case number_joiner_terminated_cluster: case numeral_cluster: case broken_cluster: @@ -360,7 +366,7 @@ hb_glyph_info_t *info = buffer->info; unsigned int count = buffer->len; for (unsigned int i = 0; i < count; i++) - _hb_glyph_info_clear_substituted_and_ligated_and_multiplied (&info[i]); + _hb_glyph_info_clear_substituted (&info[i]); } static void @@ -405,6 +411,12 @@ } } +static inline bool +is_halant (const hb_glyph_info_t &info) +{ + return info.use_category() == USE_H && !_hb_glyph_info_ligated (&info); +} + static void reorder_syllable (hb_buffer_t *buffer, unsigned int start, unsigned int end) { @@ -412,28 +424,26 @@ /* Only a few syllable types need reordering. */ if (unlikely (!(FLAG_SAFE (syllable_type) & (FLAG (virama_terminated_cluster) | - FLAG (consonant_cluster) | - FLAG (vowel_cluster) | + FLAG (standard_cluster) | FLAG (broken_cluster) | 0)))) return; hb_glyph_info_t *info = buffer->info; -#define HALANT_FLAGS FLAG(USE_H) -#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB) | FLAG (USE_IV)) +#define BASE_FLAGS (FLAG (USE_B) | FLAG (USE_GB)) /* Move things forward. */ if (info[start].use_category() == USE_R && end - start > 1) { /* Got a repha. Reorder it to after first base, before first halant. */ for (unsigned int i = start + 1; i < end; i++) - if (FLAG_UNSAFE (info[i].use_category()) & (HALANT_FLAGS | BASE_FLAGS)) + if ((FLAG_UNSAFE (info[i].use_category()) & (BASE_FLAGS)) || is_halant (info[i])) { /* If we hit a halant, move before it; otherwise it's a base: move to it's * place, and shift things in between backward. */ - if (info[i].use_category() == USE_H) + if (is_halant (info[i])) i--; buffer->merge_clusters (start, i + 1); @@ -450,11 +460,11 @@ for (unsigned int i = start; i < end; i++) { uint32_t flag = FLAG_UNSAFE (info[i].use_category()); - if (flag & (HALANT_FLAGS | BASE_FLAGS)) + if ((flag & (BASE_FLAGS)) || is_halant (info[i])) { - /* If we hit a halant, move before it; otherwise it's a base: move to it's + /* If we hit a halant, move after it; otherwise it's a base: move to it's * place, and shift things in between backward. */ - if (info[i].use_category() == USE_H) + if (is_halant (info[i])) j = i + 1; else j = i; @@ -490,22 +500,16 @@ if (likely (!has_broken_syllables)) return; - - hb_codepoint_t dottedcircle_glyph; - if (!font->get_glyph (0x25CCu, 0, &dottedcircle_glyph)) - return; - hb_glyph_info_t dottedcircle = {0}; - if (!font->get_glyph (0x25CCu, 0, &dottedcircle.codepoint)) + if (!font->get_nominal_glyph (0x25CCu, &dottedcircle.codepoint)) return; dottedcircle.use_category() = hb_use_get_categories (0x25CC); buffer->clear_output (); buffer->idx = 0; - unsigned int last_syllable = 0; - while (buffer->idx < buffer->len) + while (buffer->idx < buffer->len && !buffer->in_error) { unsigned int syllable = buffer->cur().syllable(); syllable_type_t syllable_type = (syllable_type_t) (syllable & 0x0F); @@ -513,19 +517,19 @@ { last_syllable = syllable; - hb_glyph_info_t info = dottedcircle; - info.cluster = buffer->cur().cluster; - info.mask = buffer->cur().mask; - info.syllable() = buffer->cur().syllable(); + hb_glyph_info_t ginfo = dottedcircle; + ginfo.cluster = buffer->cur().cluster; + ginfo.mask = buffer->cur().mask; + ginfo.syllable() = buffer->cur().syllable(); /* TODO Set glyph_props? */ /* Insert dottedcircle after possible Repha. */ - while (buffer->idx < buffer->len && + while (buffer->idx < buffer->len && !buffer->in_error && last_syllable == buffer->cur().syllable() && buffer->cur().use_category() == USE_R) buffer->next_glyph (); - buffer->output_info (info); + buffer->output_info (ginfo); } else buffer->next_glyph (); @@ -564,7 +568,7 @@ if (HB_UNICODE_GENERAL_CATEGORY_IS_MARK (c->unicode->general_category (a))) return false; - return c->unicode->compose (a, b, ab); + return (bool)c->unicode->compose (a, b, ab); } @@ -576,10 +580,11 @@ data_create_use, data_destroy_use, NULL, /* preprocess_text */ + NULL, /* postprocess_glyphs */ HB_OT_SHAPE_NORMALIZATION_MODE_COMPOSED_DIACRITICS_NO_SHORT_CIRCUIT, NULL, /* decompose */ compose_use, setup_masks_use, - HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE, + HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY, false, /* fallback_position */ };
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -45,5 +45,9 @@ hb_font_t *font, hb_buffer_t *buffer); +HB_INTERNAL void _hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer); + #endif /* HB_OT_SHAPE_FALLBACK_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-fallback.cc Tue Aug 09 16:20:02 2016 -0700 @@ -224,7 +224,7 @@ pos.x_offset += base_extents.x_bearing + base_extents.width - mark_extents.width / 2 - mark_extents.x_bearing; break; } - /* Fall through */ + HB_FALLTHROUGH; default: case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: @@ -259,6 +259,7 @@ case HB_UNICODE_COMBINING_CLASS_BELOW_RIGHT: /* Add gap, fall-through. */ base_extents.height -= y_gap; + HB_FALLTHROUGH; case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW_LEFT: case HB_UNICODE_COMBINING_CLASS_ATTACHED_BELOW: @@ -279,6 +280,7 @@ /* Add gap, fall-through. */ base_extents.y_bearing += y_gap; base_extents.height -= y_gap; + HB_FALLTHROUGH; case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE: case HB_UNICODE_COMBINING_CLASS_ATTACHED_ABOVE_RIGHT: @@ -482,3 +484,70 @@ idx = skippy_iter.idx; } } + + +/* Adjusts width of various spaces. */ +void +_hb_ot_shape_fallback_spaces (const hb_ot_shape_plan_t *plan, + hb_font_t *font, + hb_buffer_t *buffer) +{ + if (!HB_DIRECTION_IS_HORIZONTAL (buffer->props.direction)) + return; + + hb_glyph_info_t *info = buffer->info; + hb_glyph_position_t *pos = buffer->pos; + unsigned int count = buffer->len; + for (unsigned int i = 0; i < count; i++) + if (_hb_glyph_info_is_unicode_space (&info[i]) && !_hb_glyph_info_ligated (&info[i])) + { + hb_unicode_funcs_t::space_t space_type = _hb_glyph_info_get_unicode_space_fallback_type (&info[i]); + hb_codepoint_t glyph; + typedef hb_unicode_funcs_t t; + switch (space_type) + { + case t::NOT_SPACE: /* Shouldn't happen. */ + case t::SPACE: + break; + + case t::SPACE_EM: + case t::SPACE_EM_2: + case t::SPACE_EM_3: + case t::SPACE_EM_4: + case t::SPACE_EM_5: + case t::SPACE_EM_6: + case t::SPACE_EM_16: + pos[i].x_advance = (font->x_scale + ((int) space_type)/2) / (int) space_type; + break; + + case t::SPACE_4_EM_18: + pos[i].x_advance = font->x_scale * 4 / 18; + break; + + case t::SPACE_FIGURE: + for (char u = '0'; u <= '9'; u++) + if (font->get_nominal_glyph (u, &glyph)) + { + pos[i].x_advance = font->get_glyph_h_advance (glyph); + break; + } + break; + + case t::SPACE_PUNCTUATION: + if (font->get_nominal_glyph ('.', &glyph)) + pos[i].x_advance = font->get_glyph_h_advance (glyph); + else if (font->get_nominal_glyph (',', &glyph)) + pos[i].x_advance = font->get_glyph_h_advance (glyph); + break; + + case t::SPACE_NARROW: + /* Half-space? + * Unicode doc http://www.unicode.org/charts/PDF/U2000.pdf says ~1/4 or 1/5 of EM. + * However, in my testing, many fonts have their regular space being about that + * size. To me, a percentage of the space width makes more sense. Half is as + * good as any. */ + pos[i].x_advance /= 2; + break; + } + } +}
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape-normalize.cc Tue Aug 09 16:20:02 2016 -0700 @@ -62,24 +62,12 @@ * with previous base, use that. This needs the itemizer to have this * knowledge too. We need to provide assistance to the itemizer. * - * - When a font does not support a character but supports its decomposition, - * well, use the decomposition (preferring the canonical decomposition, but - * falling back to the compatibility decomposition if necessary). The - * compatibility decomposition is really nice to have, for characters like - * ellipsis, or various-sized space characters. + * - When a font does not support a character but supports its canonical + * decomposition, well, use the decomposition. * * - The complex shapers can customize the compose and decompose functions to * offload some of their requirements to the normalizer. For example, the * Indic shaper may want to disallow recomposing of two matras. - * - * - We try compatibility decomposition if decomposing through canonical - * decomposition alone failed to find a sequence that the font supports. - * We don't try compatibility decomposition recursively during the canonical - * decomposition phase. This has minimal impact. There are only a handful - * of Greek letter that have canonical decompositions that include characters - * with compatibility decomposition. Those can be found using this command: - * - * egrep "`echo -n ';('; grep ';<' UnicodeData.txt | cut -d';' -f1 | tr '\n' '|'; echo ') '`" UnicodeData.txt */ static bool @@ -88,7 +76,7 @@ hb_codepoint_t *a, hb_codepoint_t *b) { - return c->unicode->decompose (ab, a, b); + return (bool) c->unicode->decompose (ab, a, b); } static bool @@ -97,21 +85,21 @@ hb_codepoint_t b, hb_codepoint_t *ab) { - return c->unicode->compose (a, b, ab); + return (bool) c->unicode->compose (a, b, ab); } static inline void set_glyph (hb_glyph_info_t &info, hb_font_t *font) { - font->get_glyph (info.codepoint, 0, &info.glyph_index()); + font->get_nominal_glyph (info.codepoint, &info.glyph_index()); } static inline void output_char (hb_buffer_t *buffer, hb_codepoint_t unichar, hb_codepoint_t glyph) { buffer->cur().glyph_index() = glyph; - buffer->output_glyph (unichar); - _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer->unicode); + buffer->output_glyph (unichar); /* This is very confusing indeed. */ + _hb_glyph_info_set_unicode_props (&buffer->prev(), buffer); } static inline void @@ -136,10 +124,10 @@ hb_font_t * const font = c->font; if (!c->decompose (c, ab, &a, &b) || - (b && !font->get_glyph (b, 0, &b_glyph))) + (b && !font->get_nominal_glyph (b, &b_glyph))) return 0; - bool has_a = font->get_glyph (a, 0, &a_glyph); + bool has_a = (bool) font->get_nominal_glyph (a, &a_glyph); if (shortest && has_a) { /* Output a and b */ output_char (buffer, a, a_glyph); @@ -171,28 +159,6 @@ return 0; } -/* Returns 0 if didn't decompose, number of resulting characters otherwise. */ -static inline unsigned int -decompose_compatibility (const hb_ot_shape_normalize_context_t *c, hb_codepoint_t u) -{ - unsigned int len, i; - hb_codepoint_t decomposed[HB_UNICODE_MAX_DECOMPOSITION_LEN]; - hb_codepoint_t glyphs[HB_UNICODE_MAX_DECOMPOSITION_LEN]; - - len = c->buffer->unicode->decompose_compatibility (u, decomposed); - if (!len) - return 0; - - for (i = 0; i < len; i++) - if (!c->font->get_glyph (decomposed[i], 0, &glyphs[i])) - return 0; - - for (i = 0; i < len; i++) - output_char (c->buffer, decomposed[i], glyphs[i]); - - return len; -} - static inline void decompose_current_character (const hb_ot_shape_normalize_context_t *c, bool shortest) { @@ -200,17 +166,50 @@ hb_codepoint_t u = buffer->cur().codepoint; hb_codepoint_t glyph; - /* Kind of a cute waterfall here... */ - if (shortest && c->font->get_glyph (u, 0, &glyph)) + if (shortest && c->font->get_nominal_glyph (u, &glyph)) + { next_char (buffer, glyph); - else if (decompose (c, shortest, u)) + return; + } + + if (decompose (c, shortest, u)) + { skip_char (buffer); - else if (!shortest && c->font->get_glyph (u, 0, &glyph)) + return; + } + + if (!shortest && c->font->get_nominal_glyph (u, &glyph)) + { next_char (buffer, glyph); - else if (decompose_compatibility (c, u)) - skip_char (buffer); - else - next_char (buffer, glyph); /* glyph is initialized in earlier branches. */ + return; + } + + if (_hb_glyph_info_is_unicode_space (&buffer->cur())) + { + hb_codepoint_t space_glyph; + hb_unicode_funcs_t::space_t space_type = buffer->unicode->space_fallback_type (u); + if (space_type != hb_unicode_funcs_t::NOT_SPACE && c->font->get_nominal_glyph (0x0020u, &space_glyph)) + { + _hb_glyph_info_set_unicode_space_fallback_type (&buffer->cur(), space_type); + next_char (buffer, space_glyph); + buffer->scratch_flags |= HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK; + return; + } + } + + if (u == 0x2011u) + { + /* U+2011 is the only sensible character that is a no-break version of another character + * and not a space. The space ones are handled already. Handle this lone one. */ + hb_codepoint_t other_glyph; + if (c->font->get_nominal_glyph (0x2010u, &other_glyph)) + { + next_char (buffer, other_glyph); + return; + } + } + + next_char (buffer, glyph); /* glyph is initialized in earlier branches. */ } static inline void @@ -219,10 +218,10 @@ /* TODO Currently if there's a variation-selector we give-up, it's just too hard. */ hb_buffer_t * const buffer = c->buffer; hb_font_t * const font = c->font; - for (; buffer->idx < end - 1;) { + for (; buffer->idx < end - 1 && !buffer->in_error;) { if (unlikely (buffer->unicode->is_variation_selector (buffer->cur(+1).codepoint))) { /* The next two lines are some ugly lines... But work. */ - if (font->get_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index())) + if (font->get_variation_glyph (buffer->cur().codepoint, buffer->cur(+1).codepoint, &buffer->cur().glyph_index())) { buffer->replace_glyphs (2, 1, &buffer->cur().codepoint); } @@ -255,13 +254,13 @@ decompose_multi_char_cluster (const hb_ot_shape_normalize_context_t *c, unsigned int end, bool short_circuit) { hb_buffer_t * const buffer = c->buffer; - for (unsigned int i = buffer->idx; i < end; i++) + for (unsigned int i = buffer->idx; i < end && !buffer->in_error; i++) if (unlikely (buffer->unicode->is_variation_selector (buffer->info[i].codepoint))) { handle_variation_selector_cluster (c, end, short_circuit); return; } - while (buffer->idx < end) + while (buffer->idx < end && !buffer->in_error) decompose_current_character (c, short_circuit); } @@ -321,7 +320,7 @@ buffer->clear_output (); count = buffer->len; - for (buffer->idx = 0; buffer->idx < count;) + for (buffer->idx = 0; buffer->idx < count && !buffer->in_error;) { unsigned int end; for (end = buffer->idx + 1; end < count; end++) @@ -371,7 +370,7 @@ count = buffer->len; unsigned int starter = 0; buffer->next_glyph (); - while (buffer->idx < count) + while (buffer->idx < count && !buffer->in_error) { hb_codepoint_t composed, glyph; if (/* We don't try to compose a non-mark character with it's preceding starter. @@ -389,7 +388,7 @@ buffer->cur().codepoint, &composed) && /* And the font has glyph for the composite. */ - font->get_glyph (composed, 0, &glyph)) + font->get_nominal_glyph (composed, &glyph)) { /* Composes. */ buffer->next_glyph (); /* Copy to out-buffer. */ @@ -400,7 +399,7 @@ /* Modify starter and carry on. */ buffer->out_info[starter].codepoint = composed; buffer->out_info[starter].glyph_index() = glyph; - _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer->unicode); + _hb_glyph_info_set_unicode_props (&buffer->out_info[starter], buffer); continue; }
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.cc Tue Aug 09 16:20:02 2016 -0700 @@ -145,7 +145,7 @@ struct hb_ot_shaper_font_data_t {}; hb_ot_shaper_font_data_t * -_hb_ot_shaper_font_data_create (hb_font_t *font) +_hb_ot_shaper_font_data_create (hb_font_t *font HB_UNUSED) { return (hb_ot_shaper_font_data_t *) HB_SHAPER_DATA_SUCCEEDED; } @@ -228,7 +228,7 @@ unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 0; i < count; i++) - _hb_glyph_info_set_unicode_props (&info[i], buffer->unicode); + _hb_glyph_info_set_unicode_props (&info[i], buffer); } static void @@ -245,7 +245,7 @@ hb_glyph_info_t dottedcircle = {0}; dottedcircle.codepoint = 0x25CCu; - _hb_glyph_info_set_unicode_props (&dottedcircle, buffer->unicode); + _hb_glyph_info_set_unicode_props (&dottedcircle, buffer); buffer->clear_output (); @@ -254,7 +254,7 @@ info.cluster = buffer->cur().cluster; info.mask = buffer->cur().mask; buffer->output_info (info); - while (buffer->idx < buffer->len) + while (buffer->idx < buffer->len && !buffer->in_error) buffer->next_glyph (); buffer->swap_buffers (); @@ -263,16 +263,18 @@ static void hb_form_clusters (hb_buffer_t *buffer) { - if (buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES) + if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) || + buffer->cluster_level != HB_BUFFER_CLUSTER_LEVEL_MONOTONE_GRAPHEMES) return; - /* Loop duplicated in hb_ensure_native_direction(). */ + /* Loop duplicated in hb_ensure_native_direction(), and in _hb-coretext.cc */ unsigned int base = 0; unsigned int count = buffer->len; hb_glyph_info_t *info = buffer->info; for (unsigned int i = 1; i < count; i++) { - if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])))) + if (likely (!HB_UNICODE_GENERAL_CATEGORY_IS_MARK (_hb_glyph_info_get_general_category (&info[i])) && + !_hb_glyph_info_is_joiner (&info[i]))) { buffer->merge_clusters (base, i); base = i; @@ -346,7 +348,8 @@ static inline void hb_ot_shape_setup_masks_fraction (hb_ot_shape_context_t *c) { - if (!c->plan->has_frac) + if (!(c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_NON_ASCII) || + !c->plan->has_frac) return; hb_buffer_t *buffer = c->buffer; @@ -416,7 +419,8 @@ { hb_buffer_t *buffer = c->buffer; - if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) + if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) || + (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)) return; unsigned int count = buffer->len; @@ -433,7 +437,8 @@ { hb_buffer_t *buffer = c->buffer; - if (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES) + if (!(buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_DEFAULT_IGNORABLES) || + (buffer->flags & HB_BUFFER_FLAG_PRESERVE_DEFAULT_IGNORABLES)) return; unsigned int count = buffer->len; @@ -451,7 +456,7 @@ return; hb_codepoint_t space; - if (c->font->get_glyph (' ', 0, &space)) + if (c->font->get_nominal_glyph (' ', &space)) { /* Replace default-ignorables with a zero-advance space glyph. */ for (/*continue*/; i < count; i++) @@ -519,39 +524,10 @@ } static inline void -hb_synthesize_glyph_classes (hb_ot_shape_context_t *c) -{ - unsigned int count = c->buffer->len; - hb_glyph_info_t *info = c->buffer->info; - for (unsigned int i = 0; i < count; i++) - { - hb_ot_layout_glyph_class_mask_t klass; - - /* Never mark default-ignorables as marks. - * They won't get in the way of lookups anyway, - * but having them as mark will cause them to be skipped - * over if the lookup-flag says so, but at least for the - * Mongolian variation selectors, looks like Uniscribe - * marks them as non-mark. Some Mongolian fonts without - * GDEF rely on this. Another notable character that - * this applies to is COMBINING GRAPHEME JOINER. */ - klass = (_hb_glyph_info_get_general_category (&info[i]) != - HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK || - _hb_glyph_info_is_default_ignorable (&info[i])) ? - HB_OT_LAYOUT_GLYPH_PROPS_BASE_GLYPH : - HB_OT_LAYOUT_GLYPH_PROPS_MARK; - _hb_glyph_info_set_glyph_props (&info[i], klass); - } -} - -static inline void hb_ot_substitute_default (hb_ot_shape_context_t *c) { hb_buffer_t *buffer = c->buffer; - if (c->plan->shaper->preprocess_text) - c->plan->shaper->preprocess_text (c->plan, buffer, c->font); - hb_ot_shape_initialize_masks (c); hb_ot_mirror_chars (c); @@ -576,16 +552,10 @@ { hb_buffer_t *buffer = c->buffer; - _hb_buffer_allocate_gsubgpos_vars (buffer); hb_ot_layout_substitute_start (c->font, buffer); - if (!hb_ot_layout_has_glyph_classes (c->face)) - hb_synthesize_glyph_classes (c); - c->plan->substitute (c->font, buffer); - hb_ot_layout_substitute_finish (c->font, buffer); - return; } @@ -593,6 +563,9 @@ hb_ot_substitute (hb_ot_shape_context_t *c) { hb_ot_substitute_default (c); + + _hb_buffer_allocate_gsubgpos_vars (c->buffer); + hb_ot_substitute_complex (c); } @@ -613,20 +586,6 @@ } static inline void -zero_mark_widths_by_unicode (hb_buffer_t *buffer, bool adjust_offsets) -{ - unsigned int count = buffer->len; - hb_glyph_info_t *info = buffer->info; - for (unsigned int i = 0; i < count; i++) - if (_hb_glyph_info_get_general_category (&info[i]) == HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) - { - if (adjust_offsets) - adjust_mark_offsets (&buffer->pos[i]); - zero_mark_width (&buffer->pos[i]); - } -} - -static inline void zero_mark_widths_by_gdef (hb_buffer_t *buffer, bool adjust_offsets) { unsigned int count = buffer->len; @@ -647,26 +606,41 @@ unsigned int count = c->buffer->len; hb_glyph_info_t *info = c->buffer->info; hb_glyph_position_t *pos = c->buffer->pos; - for (unsigned int i = 0; i < count; i++) + + if (HB_DIRECTION_IS_HORIZONTAL (direction)) { - c->font->get_glyph_advance_for_direction (info[i].codepoint, - direction, - &pos[i].x_advance, - &pos[i].y_advance); - c->font->subtract_glyph_origin_for_direction (info[i].codepoint, - direction, - &pos[i].x_offset, - &pos[i].y_offset); - + for (unsigned int i = 0; i < count; i++) + pos[i].x_advance = c->font->get_glyph_h_advance (info[i].codepoint); + /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ + if (c->font->has_glyph_h_origin_func ()) + for (unsigned int i = 0; i < count; i++) + c->font->subtract_glyph_h_origin (info[i].codepoint, + &pos[i].x_offset, + &pos[i].y_offset); } + else + { + for (unsigned int i = 0; i < count; i++) + { + pos[i].y_advance = c->font->get_glyph_v_advance (info[i].codepoint); + c->font->subtract_glyph_v_origin (info[i].codepoint, + &pos[i].x_offset, + &pos[i].y_offset); + } + } + if (c->buffer->scratch_flags & HB_BUFFER_SCRATCH_FLAG_HAS_SPACE_FALLBACK) + _hb_ot_shape_fallback_spaces (c->plan, c->font, c->buffer); } static inline bool hb_ot_position_complex (hb_ot_shape_context_t *c) { + hb_ot_layout_position_start (c->font, c->buffer); + bool ret = false; unsigned int count = c->buffer->len; - bool has_positioning = hb_ot_layout_has_positioning (c->face); + bool has_positioning = (bool) hb_ot_layout_has_positioning (c->face); + /* If the font has no GPOS, AND, no fallback positioning will * happen, AND, direction is forward, then when zeroing mark * widths, we shift the mark with it, such that the mark @@ -685,15 +659,8 @@ zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing); break; - /* Not currently used for any shaper: - case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY: - zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing); - break; - */ - default: case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE: - case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE: case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE: break; } @@ -703,60 +670,56 @@ hb_glyph_info_t *info = c->buffer->info; hb_glyph_position_t *pos = c->buffer->pos; - /* Change glyph origin to what GPOS expects, apply GPOS, change it back. */ + /* Change glyph origin to what GPOS expects (horizontal), apply GPOS, change it back. */ - for (unsigned int i = 0; i < count; i++) { - c->font->add_glyph_origin_for_direction (info[i].codepoint, - HB_DIRECTION_LTR, - &pos[i].x_offset, - &pos[i].y_offset); - } + /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ + if (c->font->has_glyph_h_origin_func ()) + for (unsigned int i = 0; i < count; i++) + c->font->add_glyph_h_origin (info[i].codepoint, + &pos[i].x_offset, + &pos[i].y_offset); c->plan->position (c->font, c->buffer); - for (unsigned int i = 0; i < count; i++) { - c->font->subtract_glyph_origin_for_direction (info[i].codepoint, - HB_DIRECTION_LTR, - &pos[i].x_offset, - &pos[i].y_offset); - } + /* The nil glyph_h_origin() func returns 0, so no need to apply it. */ + if (c->font->has_glyph_h_origin_func ()) + for (unsigned int i = 0; i < count; i++) + c->font->subtract_glyph_h_origin (info[i].codepoint, + &pos[i].x_offset, + &pos[i].y_offset); ret = true; } switch (c->plan->shaper->zero_width_marks) { - case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_LATE: - zero_mark_widths_by_unicode (c->buffer, adjust_offsets_when_zeroing); - break; - case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_LATE: zero_mark_widths_by_gdef (c->buffer, adjust_offsets_when_zeroing); break; default: case HB_OT_SHAPE_ZERO_WIDTH_MARKS_NONE: - //case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_UNICODE_EARLY: case HB_OT_SHAPE_ZERO_WIDTH_MARKS_BY_GDEF_EARLY: break; } + /* Finishing off GPOS has to follow a certain order. */ + hb_ot_layout_position_finish_advances (c->font, c->buffer); + hb_ot_zero_width_default_ignorables (c); + hb_ot_layout_position_finish_offsets (c->font, c->buffer); + return ret; } static inline void hb_ot_position (hb_ot_shape_context_t *c) { - hb_ot_layout_position_start (c->font, c->buffer); + c->buffer->clear_positions (); hb_ot_position_default (c); hb_bool_t fallback = !hb_ot_position_complex (c); - hb_ot_zero_width_default_ignorables (c); - - hb_ot_layout_position_finish (c->font, c->buffer); - if (fallback && c->plan->shaper->fallback_position) _hb_ot_shape_fallback_position (c->plan, c->font, c->buffer); @@ -778,6 +741,12 @@ hb_ot_shape_internal (hb_ot_shape_context_t *c) { c->buffer->deallocate_var_all (); + c->buffer->scratch_flags = HB_BUFFER_SCRATCH_FLAG_DEFAULT; + if (likely (!_hb_unsigned_int_mul_overflows (c->buffer->len, HB_BUFFER_MAX_EXPANSION_FACTOR))) + { + c->buffer->max_len = MAX (c->buffer->len * HB_BUFFER_MAX_EXPANSION_FACTOR, + (unsigned) HB_BUFFER_MAX_LEN_MIN); + } /* Save the original direction, we use it later. */ c->target_direction = c->buffer->props.direction; @@ -792,15 +761,22 @@ hb_ensure_native_direction (c->buffer); + if (c->plan->shaper->preprocess_text) + c->plan->shaper->preprocess_text (c->plan, c->buffer, c->font); + hb_ot_substitute (c); hb_ot_position (c); hb_ot_hide_default_ignorables (c); + if (c->plan->shaper->postprocess_glyphs) + c->plan->shaper->postprocess_glyphs (c->plan, c->buffer, c->font); + _hb_buffer_deallocate_unicode_vars (c->buffer); c->buffer->props.direction = c->target_direction; + c->buffer->max_len = HB_BUFFER_MAX_LEN_DEFAULT; c->buffer->deallocate_var_all (); } @@ -820,6 +796,8 @@ /** + * hb_ot_shape_plan_collect_lookups: + * * Since: 0.9.7 **/ void @@ -841,18 +819,20 @@ hb_set_t *glyphs) { hb_codepoint_t glyph; - if (font->get_glyph (u, 0, &glyph)) + if (font->get_nominal_glyph (u, &glyph)) glyphs->add (glyph); if (mirror) { hb_codepoint_t m = unicode->mirroring (u); - if (m != u && font->get_glyph (m, 0, &glyph)) + if (m != u && font->get_nominal_glyph (m, &glyph)) glyphs->add (glyph); } } /** + * hb_ot_shape_glyphs_closure: + * * Since: 0.9.2 **/ void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-shape.h Tue Aug 09 16:20:02 2016 -0700 @@ -36,14 +36,14 @@ HB_BEGIN_DECLS /* TODO port to shape-plan / set. */ -void +HB_EXTERN void hb_ot_shape_glyphs_closure (hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features, hb_set_t *glyphs); -void +HB_EXTERN void hb_ot_shape_plan_collect_lookups (hb_shape_plan_t *shape_plan, hb_tag_t table_tag, hb_set_t *lookup_indexes /* OUT */);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.cc Tue Aug 09 16:20:02 2016 -0700 @@ -186,14 +186,18 @@ {"aa", HB_TAG('A','F','R',' ')}, /* Afar */ {"ab", HB_TAG('A','B','K',' ')}, /* Abkhazian */ {"abq", HB_TAG('A','B','A',' ')}, /* Abaza */ + {"acf", HB_TAG('F','A','N',' ')}, /* French Antillean */ {"ach", HB_TAG('A','C','H',' ')}, /* Acoli */ + {"acr", HB_TAG('A','C','R',' ')}, /* Achi */ {"ada", HB_TAG('D','N','G',' ')}, /* Dangme */ {"ady", HB_TAG('A','D','Y',' ')}, /* Adyghe */ {"af", HB_TAG('A','F','K',' ')}, /* Afrikaans */ + {"ahg", HB_TAG('A','G','W',' ')}, /* Agaw */ {"aii", HB_TAG('S','W','A',' ')}, /* Swadaya Aramaic */ {"aio", HB_TAG('A','I','O',' ')}, /* Aiton */ {"aiw", HB_TAG('A','R','I',' ')}, /* Aari */ {"ak", HB_TAG('T','W','I',' ')}, /* Akan [macrolanguage] */ + {"aka", HB_TAG('A','K','A',' ')}, /* Akan */ {"alt", HB_TAG('A','L','T',' ')}, /* [Southern] Altai */ {"am", HB_TAG('A','M','H',' ')}, /* Amharic */ {"amf", HB_TAG('H','B','N',' ')}, /* Hammer-Banna */ @@ -206,6 +210,7 @@ {"as", HB_TAG('A','S','M',' ')}, /* Assamese */ {"ast", HB_TAG('A','S','T',' ')}, /* Asturian/Asturleonese/Bable/Leonese */ {"ath", HB_TAG('A','T','H',' ')}, /* Athapaskan [family] */ + {"atj", HB_TAG('R','C','R',' ')}, /* R-Cree */ {"atv", HB_TAG('A','L','T',' ')}, /* [Northern] Altai */ {"av", HB_TAG('A','V','R',' ')}, /* Avaric */ {"awa", HB_TAG('A','W','A',' ')}, /* Awadhi */ @@ -214,6 +219,7 @@ {"azb", HB_TAG('A','Z','B',' ')}, /* South Azerbaijani */ {"azj", HB_TAG('A','Z','E',' ')}, /* North Azerbaijani */ {"ba", HB_TAG('B','S','H',' ')}, /* Bashkir */ + {"bad", HB_TAG('B','A','D','0')}, /* Banda */ {"bai", HB_TAG('B','M','L',' ')}, /* Bamileke [family] */ {"bal", HB_TAG('B','L','I',' ')}, /* Baluchi [macrolangauge] */ {"ban", HB_TAG('B','A','N',' ')}, /* Balinese */ @@ -222,11 +228,13 @@ {"bci", HB_TAG('B','A','U',' ')}, /* Baoulé */ {"bcl", HB_TAG('B','I','K',' ')}, /* Central Bikol */ {"bcq", HB_TAG('B','C','H',' ')}, /* Bench */ + {"bdy", HB_TAG('B','D','Y',' ')}, /* Bandjalang */ {"be", HB_TAG('B','E','L',' ')}, /* Belarusian */ {"bem", HB_TAG('B','E','M',' ')}, /* Bemba (Zambia) */ {"ber", HB_TAG('B','E','R',' ')}, /* Berber [family] */ {"bfq", HB_TAG('B','A','D',' ')}, /* Badaga */ {"bft", HB_TAG('B','L','T',' ')}, /* Balti */ + {"bfu", HB_TAG('L','A','H',' ')}, /* Lahuli */ {"bfy", HB_TAG('B','A','G',' ')}, /* Baghelkhandi */ {"bg", HB_TAG('B','G','R',' ')}, /* Bulgarian */ {"bgc", HB_TAG('B','G','C',' ')}, /* Haryanvi */ @@ -260,11 +268,13 @@ {"bxr", HB_TAG('R','B','U',' ')}, /* Russian Buriat */ {"byn", HB_TAG('B','I','L',' ')}, /* Bilen */ {"ca", HB_TAG('C','A','T',' ')}, /* Catalan */ + {"cak", HB_TAG('C','A','K',' ')}, /* Kaqchikel */ {"cbk", HB_TAG('C','B','K',' ')}, /* Chavacano */ {"ce", HB_TAG('C','H','E',' ')}, /* Chechen */ {"ceb", HB_TAG('C','E','B',' ')}, /* Cebuano */ {"cgg", HB_TAG('C','G','G',' ')}, /* Chiga */ {"ch", HB_TAG('C','H','A',' ')}, /* Chamorro */ + {"chk", HB_TAG('C','H','K','0')}, /* Chuukese */ {"cho", HB_TAG('C','H','O',' ')}, /* Choctaw */ {"chp", HB_TAG('C','H','P',' ')}, /* Chipewyan */ {"chr", HB_TAG('C','H','R',' ')}, /* Cherokee */ @@ -272,9 +282,12 @@ {"ckb", HB_TAG('K','U','R',' ')}, /* Central Kurdish (Sorani) */ {"ckt", HB_TAG('C','H','K',' ')}, /* Chukchi */ {"cop", HB_TAG('C','O','P',' ')}, /* Coptic */ + {"cpp", HB_TAG('C','P','P',' ')}, /* Creoles */ {"cr", HB_TAG('C','R','E',' ')}, /* Cree */ + {"cre", HB_TAG('Y','C','R',' ')}, /* Y-Cree */ {"crh", HB_TAG('C','R','T',' ')}, /* Crimean Tatar */ {"crj", HB_TAG('E','C','R',' ')}, /* [Southern] East Cree */ + {"crk", HB_TAG('W','C','R',' ')}, /* West-Cree */ {"crl", HB_TAG('E','C','R',' ')}, /* [Northern] East Cree */ {"crm", HB_TAG('M','C','R',' ')}, /* Moose Cree */ {"crx", HB_TAG('C','R','R',' ')}, /* Carrier */ @@ -283,21 +296,27 @@ {"ctg", HB_TAG('C','T','G',' ')}, /* Chittagonian */ {"cts", HB_TAG('B','I','K',' ')}, /* Northern Catanduanes Bikol */ {"cu", HB_TAG('C','S','L',' ')}, /* Church Slavic */ + {"cuk", HB_TAG('C','U','K',' ')}, /* San Blas Kuna */ {"cv", HB_TAG('C','H','U',' ')}, /* Chuvash */ {"cwd", HB_TAG('D','C','R',' ')}, /* Woods Cree */ {"cy", HB_TAG('W','E','L',' ')}, /* Welsh */ {"da", HB_TAG('D','A','N',' ')}, /* Danish */ {"dap", HB_TAG('N','I','S',' ')}, /* Nisi (India) */ {"dar", HB_TAG('D','A','R',' ')}, /* Dargwa */ + {"dax", HB_TAG('D','A','X',' ')}, /* Dayi */ {"de", HB_TAG('D','E','U',' ')}, /* German */ {"dgo", HB_TAG('D','G','O',' ')}, /* Dogri */ {"dhd", HB_TAG('M','A','W',' ')}, /* Dhundari */ + {"dhg", HB_TAG('D','H','G',' ')}, /* Dhangu */ {"din", HB_TAG('D','N','K',' ')}, /* Dinka [macrolanguage] */ {"diq", HB_TAG('D','I','Q',' ')}, /* Dimli */ {"dje", HB_TAG('D','J','R',' ')}, /* Zarma */ + {"djr", HB_TAG('D','J','R','0')}, /* Djambarrpuyngu */ {"dng", HB_TAG('D','U','N',' ')}, /* Dungan */ + {"dnj", HB_TAG('D','N','J',' ')}, /* Dan */ {"doi", HB_TAG('D','G','R',' ')}, /* Dogri [macrolanguage] */ {"dsb", HB_TAG('L','S','B',' ')}, /* Lower Sorbian */ + {"duj", HB_TAG('D','U','J',' ')}, /* Dhuwal */ {"dv", HB_TAG('D','I','V',' ')}, /* Dhivehi/Divehi/Maldivian */ {"dyu", HB_TAG('J','U','L',' ')}, /* Jula */ {"dz", HB_TAG('D','Z','N',' ')}, /* Dzongkha */ @@ -307,23 +326,30 @@ {"el", HB_TAG('E','L','L',' ')}, /* Modern Greek (1453-) */ {"emk", HB_TAG('M','N','K',' ')}, /* Eastern Maninkakan */ {"en", HB_TAG('E','N','G',' ')}, /* English */ + {"enf", HB_TAG('F','N','E',' ')}, /* Forest Nenets */ + {"enh", HB_TAG('T','N','E',' ')}, /* Tundra Nenets */ {"eo", HB_TAG('N','T','O',' ')}, /* Esperanto */ {"eot", HB_TAG('B','T','I',' ')}, /* Beti (Côte d'Ivoire) */ {"es", HB_TAG('E','S','P',' ')}, /* Spanish */ + {"esu", HB_TAG('E','S','U',' ')}, /* Central Yupik */ {"et", HB_TAG('E','T','I',' ')}, /* Estonian [macrolanguage] */ {"eu", HB_TAG('E','U','Q',' ')}, /* Basque */ {"eve", HB_TAG('E','V','N',' ')}, /* Even */ {"evn", HB_TAG('E','V','K',' ')}, /* Evenki */ {"fa", HB_TAG('F','A','R',' ')}, /* Persian [macrolanguage] */ + {"fan", HB_TAG('F','A','N','0')}, /* Fang */ + {"fat", HB_TAG('F','A','T',' ')}, /* Fanti */ {"ff", HB_TAG('F','U','L',' ')}, /* Fulah [macrolanguage] */ {"fi", HB_TAG('F','I','N',' ')}, /* Finnish */ {"fil", HB_TAG('P','I','L',' ')}, /* Filipino */ {"fj", HB_TAG('F','J','I',' ')}, /* Fijian */ + {"flm", HB_TAG('H','A','L',' ')}, /* Halam */ {"fo", HB_TAG('F','O','S',' ')}, /* Faroese */ {"fon", HB_TAG('F','O','N',' ')}, /* Fon */ {"fr", HB_TAG('F','R','A',' ')}, /* French */ {"frc", HB_TAG('F','R','C',' ')}, /* Cajun French */ {"frp", HB_TAG('F','R','P',' ')}, /* Arpitan/Francoprovençal */ + {"fuf", HB_TAG('F','T','A',' ')}, /* Futa */ {"fur", HB_TAG('F','R','L',' ')}, /* Friulian */ {"fuv", HB_TAG('F','U','V',' ')}, /* Nigerian Fulfulde */ {"fy", HB_TAG('F','R','I',' ')}, /* Western Frisian */ @@ -334,17 +360,24 @@ {"gd", HB_TAG('G','A','E',' ')}, /* Scottish Gaelic */ {"gez", HB_TAG('G','E','Z',' ')}, /* Ge'ez */ {"ggo", HB_TAG('G','O','N',' ')}, /* Southern Gondi */ + {"gih", HB_TAG('G','I','H',' ')}, /* Githabul */ + {"gil", HB_TAG('G','I','L','0')}, /* Kiribati (Gilbertese) */ + {"gkp", HB_TAG('G','K','P',' ')}, /* Kpelle (Guinea) */ {"gl", HB_TAG('G','A','L',' ')}, /* Galician */ {"gld", HB_TAG('N','A','N',' ')}, /* Nanai */ + {"gle", HB_TAG('I','R','T',' ')}, /* Irish Traditional */ {"glk", HB_TAG('G','L','K',' ')}, /* Gilaki */ {"gn", HB_TAG('G','U','A',' ')}, /* Guarani [macrolanguage] */ + {"gnn", HB_TAG('G','N','N',' ')}, /* Gumatj */ {"gno", HB_TAG('G','O','N',' ')}, /* Northern Gondi */ {"gog", HB_TAG('G','O','G',' ')}, /* Gogo */ {"gon", HB_TAG('G','O','N',' ')}, /* Gondi [macrolanguage] */ {"grt", HB_TAG('G','R','O',' ')}, /* Garo */ {"gru", HB_TAG('S','O','G',' ')}, /* Sodo Gurage */ + {"gsw", HB_TAG('A','L','S',' ')}, /* Alsatian */ {"gu", HB_TAG('G','U','J',' ')}, /* Gujarati */ {"guc", HB_TAG('G','U','C',' ')}, /* Wayuu */ + {"guf", HB_TAG('G','U','F',' ')}, /* Gupapuyngu */ {"guk", HB_TAG('G','M','Z',' ')}, /* Gumuz */ /*{"guk", HB_TAG('G','U','K',' ')},*/ /* Gumuz (in SIL fonts) */ {"guz", HB_TAG('G','U','Z',' ')}, /* Ekegusii/Gusii */ @@ -355,9 +388,9 @@ {"hay", HB_TAG('H','A','Y',' ')}, /* Haya */ {"haz", HB_TAG('H','A','Z',' ')}, /* Hazaragi */ {"he", HB_TAG('I','W','R',' ')}, /* Hebrew */ - {"hz", HB_TAG('H','E','R',' ')}, /* Herero */ {"hi", HB_TAG('H','I','N',' ')}, /* Hindi */ {"hil", HB_TAG('H','I','L',' ')}, /* Hiligaynon */ + {"hmn", HB_TAG('H','M','N',' ')}, /* Hmong */ {"hnd", HB_TAG('H','N','D',' ')}, /* [Southern] Hindko */ {"hne", HB_TAG('C','H','H',' ')}, /* Chattisgarhi */ {"hno", HB_TAG('H','N','D',' ')}, /* [Northern] Hindko */ @@ -371,11 +404,13 @@ {"hy", HB_TAG('H','Y','E',' ')}, /* Armenian */ {"hz", HB_TAG('H','E','R',' ')}, /* Herero */ {"ia", HB_TAG('I','N','A',' ')}, /* Interlingua (International Auxiliary Language Association) */ + {"iba", HB_TAG('I','B','A',' ')}, /* Iban */ {"ibb", HB_TAG('I','B','B',' ')}, /* Ibibio */ {"id", HB_TAG('I','N','D',' ')}, /* Indonesian */ {"ie", HB_TAG('I','L','E',' ')}, /* Interlingue/Occidental */ {"ig", HB_TAG('I','B','O',' ')}, /* Igbo */ {"igb", HB_TAG('E','B','I',' ')}, /* Ebira */ + {"ii", HB_TAG('Y','I','M',' ')}, /* Yi Modern */ {"ijc", HB_TAG('I','J','O',' ')}, /* Izon */ {"ijo", HB_TAG('I','J','O',' ')}, /* Ijo [family] */ {"ik", HB_TAG('I','P','K',' ')}, /* Inupiaq [macrolanguage] */ @@ -391,15 +426,20 @@ {"jv", HB_TAG('J','A','V',' ')}, /* Javanese */ {"ka", HB_TAG('K','A','T',' ')}, /* Georgian */ {"kaa", HB_TAG('K','R','K',' ')}, /* Karakalpak */ - {"kab", HB_TAG('K','A','B',' ')}, /* Kabyle */ + {"kab", HB_TAG('K','A','B','0')}, /* Kabyle */ {"kam", HB_TAG('K','M','B',' ')}, /* Kamba (Kenya) */ {"kar", HB_TAG('K','R','N',' ')}, /* Karen [family] */ + {"kat", HB_TAG('K','G','E',' ')}, /* Khutsuri Georgian */ {"kbd", HB_TAG('K','A','B',' ')}, /* Kabardian */ {"kde", HB_TAG('K','D','E',' ')}, /* Makonde */ {"kdr", HB_TAG('K','R','M',' ')}, /* Karaim */ {"kdt", HB_TAG('K','U','Y',' ')}, /* Kuy */ + {"kea", HB_TAG('K','E','A',' ')}, /* Kabuverdianu (Crioulo) */ + {"kek", HB_TAG('K','E','K',' ')}, /* Kekchi */ {"kex", HB_TAG('K','K','N',' ')}, /* Kokni */ + {"kfa", HB_TAG('K','O','D',' ')}, /* Kodagu */ {"kfr", HB_TAG('K','A','C',' ')}, /* Kachchi */ + {"kfx", HB_TAG('K','U','L',' ')}, /* Kulvi */ {"kfy", HB_TAG('K','M','N',' ')}, /* Kumaoni */ {"kg", HB_TAG('K','O','N',' ')}, /* Kongo [macrolanguage] */ {"kha", HB_TAG('K','S','I',' ')}, /* Khasi */ @@ -408,7 +448,9 @@ /*{"kht", HB_TAG('K','H','T',' ')},*/ /* Khamti (OpenType spec and SIL fonts) */ {"khw", HB_TAG('K','H','W',' ')}, /* Khowar */ {"ki", HB_TAG('K','I','K',' ')}, /* Gikuyu/Kikuyu */ + {"kiu", HB_TAG('K','I','U',' ')}, /* Kirmanjki */ {"kj", HB_TAG('K','U','A',' ')}, /* Kuanyama/Kwanyama */ + {"kjd", HB_TAG('K','J','D',' ')}, /* Southern Kiwai */ {"kjh", HB_TAG('K','H','A',' ')}, /* Khakass */ {"kjp", HB_TAG('K','J','P',' ')}, /* Pwo Eastern Karen */ {"kk", HB_TAG('K','A','Z',' ')}, /* Kazakh */ @@ -422,6 +464,8 @@ {"ko", HB_TAG('K','O','R',' ')}, /* Korean */ {"koi", HB_TAG('K','O','P',' ')}, /* Komi-Permyak */ {"kok", HB_TAG('K','O','K',' ')}, /* Konkani [macrolanguage] */ + {"kon", HB_TAG('K','O','N','0')}, /* Kongo */ + {"kos", HB_TAG('K','O','S',' ')}, /* Kosraean */ {"kpe", HB_TAG('K','P','L',' ')}, /* Kpelle [macrolanguage] */ {"kpv", HB_TAG('K','O','Z',' ')}, /* Komi-Zyrian */ {"kpy", HB_TAG('K','Y','K',' ')}, /* Koryak */ @@ -431,9 +475,11 @@ {"krl", HB_TAG('K','R','L',' ')}, /* Karelian */ {"kru", HB_TAG('K','U','U',' ')}, /* Kurukh */ {"ks", HB_TAG('K','S','H',' ')}, /* Kashmiri */ - {"ksh", HB_TAG('K','S','H',' ')}, /* Kölsch */ + {"ksh", HB_TAG('K','S','H','0')}, /* Ripuarian, Kölsch */ /*{"ksw", HB_TAG('K','R','N',' ')},*/ /* S'gaw Karen (Microsoft fonts?) */ {"ksw", HB_TAG('K','S','W',' ')}, /* S'gaw Karen (OpenType spec and SIL fonts) */ + {"ktb", HB_TAG('K','E','B',' ')}, /* Kebena */ + {"ktu", HB_TAG('K','O','N',' ')}, /* Kikongo */ {"ku", HB_TAG('K','U','R',' ')}, /* Kurdish [macrolanguage] */ {"kum", HB_TAG('K','U','M',' ')}, /* Kumyk */ {"kv", HB_TAG('K','O','M',' ')}, /* Komi [macrolanguage] */ @@ -461,6 +507,7 @@ {"lmo", HB_TAG('L','M','O',' ')}, /* Lombard */ {"ln", HB_TAG('L','I','N',' ')}, /* Lingala */ {"lo", HB_TAG('L','A','O',' ')}, /* Lao */ + {"lom", HB_TAG('L','O','M',' ')}, /* Loma */ {"lrc", HB_TAG('L','R','C',' ')}, /* Northern Luri */ {"lt", HB_TAG('L','T','H',' ')}, /* Lithuanian */ {"lu", HB_TAG('L','U','B',' ')}, /* Luba-Katanga */ @@ -475,6 +522,8 @@ {"mag", HB_TAG('M','A','G',' ')}, /* Magahi */ {"mai", HB_TAG('M','T','H',' ')}, /* Maithili */ {"mak", HB_TAG('M','K','R',' ')}, /* Makasar */ + {"mal", HB_TAG('M','A','L',' ')}, /* Malayalam */ + {"mam", HB_TAG('M','A','M',' ')}, /* Mam */ {"man", HB_TAG('M','N','K',' ')}, /* Manding/Mandingo [macrolanguage] */ {"mdc", HB_TAG('M','L','E',' ')}, /* Male (Papua New Guinea) */ {"mdf", HB_TAG('M','O','K',' ')}, /* Moksha */ @@ -517,6 +566,7 @@ {"mww", HB_TAG('M','W','W',' ')}, /* Hmong Daw */ {"my", HB_TAG('B','R','M',' ')}, /* Burmese */ {"mym", HB_TAG('M','E','N',' ')}, /* Me'en */ + {"myn", HB_TAG('M','Y','N',' ')}, /* Mayan */ {"myq", HB_TAG('M','N','K',' ')}, /* Forest Maninka (retired code) */ {"myv", HB_TAG('E','R','Z',' ')}, /* Erzya */ {"mzn", HB_TAG('M','Z','N',' ')}, /* Mazanderani */ @@ -534,6 +584,7 @@ {"ng", HB_TAG('N','D','G',' ')}, /* Ndonga */ {"nga", HB_TAG('N','G','A',' ')}, /* Ngabaka */ {"ngl", HB_TAG('L','M','W',' ')}, /* Lomwe */ + {"ngo", HB_TAG('S','X','T',' ')}, /* Sutu */ {"niu", HB_TAG('N','I','U',' ')}, /* Niuean */ {"niv", HB_TAG('G','I','L',' ')}, /* Gilyak */ {"nl", HB_TAG('N','L','D',' ')}, /* Dutch */ @@ -554,13 +605,15 @@ {"oc", HB_TAG('O','C','I',' ')}, /* Occitan (post 1500) */ {"oj", HB_TAG('O','J','B',' ')}, /* Ojibwa [macrolanguage] */ {"ojs", HB_TAG('O','C','R',' ')}, /* Oji-Cree */ + {"okm", HB_TAG('K','O','H',' ')}, /* Korean Old Hangul */ {"om", HB_TAG('O','R','O',' ')}, /* Oromo [macrolanguage] */ {"or", HB_TAG('O','R','I',' ')}, /* Oriya */ {"os", HB_TAG('O','S','S',' ')}, /* Ossetian */ {"pa", HB_TAG('P','A','N',' ')}, /* Panjabi */ {"pag", HB_TAG('P','A','G',' ')}, /* Pangasinan */ {"pam", HB_TAG('P','A','M',' ')}, /* Kapampangan/Pampanga */ - {"pap", HB_TAG('P','A','P',' ')}, /* Papiamento */ + {"pap", HB_TAG('P','A','P','0')}, /* Papiamento */ + {"pau", HB_TAG('P','A','U',' ')}, /* Palauan */ {"pcc", HB_TAG('P','C','C',' ')}, /* Bouyei */ {"pcd", HB_TAG('P','C','D',' ')}, /* Picard */ {"pce", HB_TAG('P','L','G',' ')}, /* [Ruching] Palaung */ @@ -574,24 +627,34 @@ {"plp", HB_TAG('P','A','P',' ')}, /* Palpa */ {"pms", HB_TAG('P','M','S',' ')}, /* Piemontese */ {"pnb", HB_TAG('P','N','B',' ')}, /* Western Panjabi */ + {"poh", HB_TAG('P','O','H',' ')}, /* Pocomchi */ + {"pon", HB_TAG('P','O','N',' ')}, /* Pohnpeian */ {"prs", HB_TAG('D','R','I',' ')}, /* Afghan Persian/Dari */ {"ps", HB_TAG('P','A','S',' ')}, /* Pashto/Pushto [macrolanguage] */ {"pt", HB_TAG('P','T','G',' ')}, /* Portuguese */ {"pwo", HB_TAG('P','W','O',' ')}, /* Pwo Western Karen */ {"qu", HB_TAG('Q','U','Z',' ')}, /* Quechua [macrolanguage] */ {"quc", HB_TAG('Q','U','C',' ')}, /* K'iche'/Quiché */ + {"quh", HB_TAG('Q','U','H',' ')}, /* Quechua (Bolivia) */ {"quz", HB_TAG('Q','U','Z',' ')}, /* Cusco Quechua */ + {"qvi", HB_TAG('Q','V','I',' ')}, /* Quechua (Ecuador) */ + {"qwh", HB_TAG('Q','W','H',' ')}, /* Quechua (Peru) */ {"raj", HB_TAG('R','A','J',' ')}, /* Rajasthani [macrolanguage] */ + {"rar", HB_TAG('R','A','R',' ')}, /* Rarotongan */ {"rbb", HB_TAG('P','L','G',' ')}, /* Rumai Palaung */ {"rej", HB_TAG('R','E','J',' ')}, /* Rejang */ {"ria", HB_TAG('R','I','A',' ')}, /* Riang (India) */ + {"rif", HB_TAG('R','I','F',' ')}, /* Tarifit */ {"ril", HB_TAG('R','I','A',' ')}, /* Riang (Myanmar) */ + {"rit", HB_TAG('R','I','T',' ')}, /* Ritarungo */ {"rki", HB_TAG('A','R','K',' ')}, /* Rakhine */ + {"rkw", HB_TAG('R','K','W',' ')}, /* Arakwal */ {"rm", HB_TAG('R','M','S',' ')}, /* Romansh */ {"rmy", HB_TAG('R','M','Y',' ')}, /* Vlax Romani */ {"rn", HB_TAG('R','U','N',' ')}, /* Rundi */ {"ro", HB_TAG('R','O','M',' ')}, /* Romanian */ {"rom", HB_TAG('R','O','Y',' ')}, /* Romany [macrolanguage] */ + {"rtm", HB_TAG('R','T','M',' ')}, /* Rotuman */ {"ru", HB_TAG('R','U','S',' ')}, /* Russian */ {"rue", HB_TAG('R','S','Y',' ')}, /* Rusyn */ {"rup", HB_TAG('R','U','P',' ')}, /* Aromanian/Arumanian/Macedo-Romanian */ @@ -599,10 +662,11 @@ {"rwr", HB_TAG('M','A','W',' ')}, /* Marwari (India) */ {"sa", HB_TAG('S','A','N',' ')}, /* Sanskrit */ {"sah", HB_TAG('Y','A','K',' ')}, /* Yakut */ + {"sam", HB_TAG('P','A','A',' ')}, /* Palestinian Aramaic */ {"sas", HB_TAG('S','A','S',' ')}, /* Sasak */ {"sat", HB_TAG('S','A','T',' ')}, /* Santali */ + {"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */ {"sck", HB_TAG('S','A','D',' ')}, /* Sadri */ - {"sc", HB_TAG('S','R','D',' ')}, /* Sardinian [macrolanguage] */ {"scn", HB_TAG('S','C','N',' ')}, /* Sicilian */ {"sco", HB_TAG('S','C','O',' ')}, /* Scots */ {"scs", HB_TAG('S','L','A',' ')}, /* [North] Slavey */ @@ -615,6 +679,7 @@ {"sgs", HB_TAG('S','G','S',' ')}, /* Samogitian */ {"sgw", HB_TAG('C','H','G',' ')}, /* Sebat Bet Gurage */ /*{"sgw", HB_TAG('S','G','W',' ')},*/ /* Sebat Bet Gurage (in SIL fonts) */ + {"shi", HB_TAG('S','H','I',' ')}, /* Tachelhit */ {"shn", HB_TAG('S','H','N',' ')}, /* Shan */ {"si", HB_TAG('S','N','H',' ')}, /* Sinhala */ {"sid", HB_TAG('S','I','D',' ')}, /* Sidamo */ @@ -627,7 +692,7 @@ {"smj", HB_TAG('L','S','M',' ')}, /* Lule Sami */ {"smn", HB_TAG('I','S','M',' ')}, /* Inari Sami */ {"sms", HB_TAG('S','K','S',' ')}, /* Skolt Sami */ - {"sn", HB_TAG('S','N','A',' ')}, /* Shona */ + {"sn", HB_TAG('S','N','A','0')}, /* Shona */ {"snk", HB_TAG('S','N','K',' ')}, /* Soninke */ {"so", HB_TAG('S','M','L',' ')}, /* Somali */ {"sop", HB_TAG('S','O','P',' ')}, /* Songe */ @@ -665,20 +730,24 @@ {"tiv", HB_TAG('T','I','V',' ')}, /* Tiv */ {"tk", HB_TAG('T','K','M',' ')}, /* Turkmen */ {"tl", HB_TAG('T','G','L',' ')}, /* Tagalog */ - {"tmh", HB_TAG('t','m','h',' ')}, /* Tamashek [macrolanguage] */ + {"tmh", HB_TAG('T','M','H',' ')}, /* Tamashek */ {"tn", HB_TAG('T','N','A',' ')}, /* Tswana */ {"to", HB_TAG('T','G','N',' ')}, /* Tonga (Tonga Islands) */ + {"tod", HB_TAG('T','O','D','0')}, /* Toma */ + {"toi", HB_TAG('T','N','G',' ')}, /* Tonga */ {"tpi", HB_TAG('T','P','I',' ')}, /* Tok Pisin */ {"tr", HB_TAG('T','R','K',' ')}, /* Turkish */ {"tru", HB_TAG('T','U','A',' ')}, /* Turoyo Aramaic */ {"ts", HB_TAG('T','S','G',' ')}, /* Tsonga */ {"tt", HB_TAG('T','A','T',' ')}, /* Tatar */ {"tum", HB_TAG('T','U','M',' ')}, /* Tumbuka */ + {"tvl", HB_TAG('T','V','L',' ')}, /* Tuvalu */ {"tw", HB_TAG('T','W','I',' ')}, /* Twi */ {"ty", HB_TAG('T','H','T',' ')}, /* Tahitian */ {"tyv", HB_TAG('T','U','V',' ')}, /* Tuvin */ {"tyz", HB_TAG('T','Y','Z',' ')}, /* Tà y */ {"tzm", HB_TAG('T','Z','M',' ')}, /* Central Atlas Tamazight */ + {"tzo", HB_TAG('T','Z','O',' ')}, /* Tzotzil */ {"udm", HB_TAG('U','D','M',' ')}, /* Udmurt */ {"ug", HB_TAG('U','Y','G',' ')}, /* Uighur */ {"uk", HB_TAG('U','K','R',' ')}, /* Ukrainian */ @@ -690,8 +759,8 @@ {"uzs", HB_TAG('U','Z','B',' ')}, /* Southern Uzbek */ {"ve", HB_TAG('V','E','N',' ')}, /* Venda */ {"vec", HB_TAG('V','E','C',' ')}, /* Venetian */ + {"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */ {"vls", HB_TAG('F','L','E',' ')}, /* Vlaams */ - {"vi", HB_TAG('V','I','T',' ')}, /* Vietnamese */ {"vmw", HB_TAG('M','A','K',' ')}, /* Makhuwa */ {"vo", HB_TAG('V','O','L',' ')}, /* Volapük */ {"vro", HB_TAG('V','R','O',' ')}, /* Võro */ @@ -700,72 +769,60 @@ {"wbm", HB_TAG('W','A',' ',' ')}, /* Wa */ {"wbr", HB_TAG('W','A','G',' ')}, /* Wagdi */ {"wle", HB_TAG('S','I','G',' ')}, /* Wolane */ + {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */ {"wry", HB_TAG('M','A','W',' ')}, /* Merwari */ {"wtm", HB_TAG('W','T','M',' ')}, /* Mewati */ - {"wo", HB_TAG('W','L','F',' ')}, /* Wolof */ {"xal", HB_TAG('K','L','M',' ')}, /* Kalmyk */ + {"xan", HB_TAG('S','E','K',' ')}, /* Sekota */ {"xh", HB_TAG('X','H','S',' ')}, /* Xhosa */ + {"xjb", HB_TAG('X','J','B',' ')}, /* Minjangbal */ {"xog", HB_TAG('X','O','G',' ')}, /* Soga */ {"xom", HB_TAG('K','M','O',' ')}, /* Komo (Sudan) */ + {"xpe", HB_TAG('X','P','E',' ')}, /* Kpelle (Liberia) */ {"xsl", HB_TAG('S','S','L',' ')}, /* South Slavey */ {"xst", HB_TAG('S','I','G',' ')}, /* Silt'e (retired code) */ {"xwo", HB_TAG('T','O','D',' ')}, /* Written Oirat (Todo) */ {"yao", HB_TAG('Y','A','O',' ')}, /* Yao */ + {"yap", HB_TAG('Y','A','P',' ')}, /* Yapese */ {"yi", HB_TAG('J','I','I',' ')}, /* Yiddish [macrolanguage] */ {"yo", HB_TAG('Y','B','A',' ')}, /* Yoruba */ {"yso", HB_TAG('N','I','S',' ')}, /* Nisi (China) */ {"za", HB_TAG('Z','H','A',' ')}, /* Chuang/Zhuang [macrolanguage] */ {"zea", HB_TAG('Z','E','A',' ')}, /* Zeeuws */ + {"zgh", HB_TAG('Z','G','H',' ')}, /* Standard Morrocan Tamazigh */ {"zne", HB_TAG('Z','N','D',' ')}, /* Zande */ {"zu", HB_TAG('Z','U','L',' ')}, /* Zulu */ - {"zum", HB_TAG('L','R','C',' ')} /* Kumzari */ + {"zum", HB_TAG('L','R','C',' ')}, /* Kumzari */ + {"zza", HB_TAG('Z','Z','A',' ')}, /* Zazaki */ /* The corresponding languages IDs for the following IDs are unclear, * overlap, or are architecturally weird. Needs more research. */ -/*{"ahg/awn/xan?", HB_TAG('A','G','W',' ')},*/ /* Agaw */ -/*{"gsw?/gsw-FR?", HB_TAG('A','L','S',' ')},*/ /* Alsatian */ +/*{"chp", HB_TAG('S','A','Y',' ')},*/ /* Sayisi */ +/*{"cwd", HB_TAG('T','C','R',' ')},*/ /* TH-Cree */ +/*{"emk", HB_TAG('E','M','K',' ')},*/ /* Eastern Maninkakan */ /*{"krc", HB_TAG('B','A','L',' ')},*/ /* Balkar */ /*{"??", HB_TAG('B','C','R',' ')},*/ /* Bible Cree */ /*{"zh?", HB_TAG('C','H','N',' ')},*/ /* Chinese (seen in Microsoft fonts) */ -/*{"acf/gcf?", HB_TAG('F','A','N',' ')},*/ /* French Antillean */ -/*{"enf?/yrk?", HB_TAG('F','N','E',' ')},*/ /* Forest Nenets */ -/*{"fuf?", HB_TAG('F','T','A',' ')},*/ /* Futa */ /*{"ar-Syrc?", HB_TAG('G','A','R',' ')},*/ /* Garshuni */ -/*{"cfm/rnl?", HB_TAG('H','A','L',' ')},*/ /* Halam */ -/*{"ga-Latg?/Latg?", HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */ +/*{"hy?", HB_TAG('H','Y','E','0')},*/ /* Armenian East (ISO 639-3 hye according to Microsoft, but that’s equivalent to ISO 639-1 hy) */ +/*{"ga-Latg?/" HB_TAG('I','R','T',' ')},*/ /* Irish Traditional */ /*{"krc", HB_TAG('K','A','R',' ')},*/ /* Karachay */ -/*{"alw?/ktb?", HB_TAG('K','E','B',' ')},*/ /* Kebena */ -/*{"Geok", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */ +/*{"ka-Geok?", HB_TAG('K','G','E',' ')},*/ /* Khutsuri Georgian */ /*{"kca", HB_TAG('K','H','K',' ')},*/ /* Khanty-Kazim */ /*{"kca", HB_TAG('K','H','S',' ')},*/ /* Khanty-Shurishkar */ /*{"kca", HB_TAG('K','H','V',' ')},*/ /* Khanty-Vakhi */ -/*{"guz?/kqs?/kss?", HB_TAG('K','I','S',' ')},*/ /* Kisii */ -/*{"kfa/kfi?/kpb?/xua?/xuj?", HB_TAG('K','O','D',' ')},*/ /* Kodagu */ -/*{"okm?/oko?", HB_TAG('K','O','H',' ')},*/ /* Korean Old Hangul */ -/*{"kon?/ktu?/...", HB_TAG('K','O','N',' ')},*/ /* Kikongo */ -/*{"kfx?", HB_TAG('K','U','L',' ')},*/ /* Kulvi */ -/*{"??", HB_TAG('L','A','H',' ')},*/ /* Lahuli */ -/*{"??", HB_TAG('L','C','R',' ')},*/ /* L-Cree */ +/*{"kqs, kss", HB_TAG('K','I','S',' ')},*/ /* Kisii */ +/*{"lua", HB_TAG('L','U','A',' ')},*/ /* Luba-Lulua */ +/*{"mlq", HB_TAG('M','L','N',' ')},*/ /* Malinke */ +/*{"nso", HB_TAG('N','S','O',' ')},*/ /* Sotho, Northern */ /*{"??", HB_TAG('M','A','L',' ')},*/ /* Malayalam Traditional */ -/*{"mnk?/mlq?/...", HB_TAG('M','L','N',' ')},*/ /* Malinke */ -/*{"??", HB_TAG('N','C','R',' ')},*/ /* N-Cree */ -/*{"??", HB_TAG('N','H','C',' ')},*/ /* Norway House Cree */ -/*{"jpa?/sam?", HB_TAG('P','A','A',' ')},*/ /* Palestinian Aramaic */ -/*{"polyton", HB_TAG('P','G','R',' ')},*/ /* Polytonic Greek */ -/*{"??", HB_TAG('Q','I','N',' ')},*/ /* Asho Chin */ -/*{"??", HB_TAG('R','C','R',' ')},*/ /* R-Cree */ -/*{"chp?", HB_TAG('S','A','Y',' ')},*/ /* Sayisi */ -/*{"xan?", HB_TAG('S','E','K',' ')},*/ /* Sekota */ -/*{"ngo?", HB_TAG('S','X','T',' ')},*/ /* Sutu */ -/*{"??", HB_TAG('T','C','R',' ')},*/ /* TH-Cree */ -/*{"tnz?/tog?/toi?", HB_TAG('T','N','G',' ')},*/ /* Tonga */ -/*{"enh?/yrk?", HB_TAG('T','N','E',' ')},*/ /* Tundra Nenets */ -/*{"??", HB_TAG('W','C','R',' ')},*/ /* West-Cree */ -/*{"cre?", HB_TAG('Y','C','R',' ')},*/ /* Y-Cree */ +/*{"csw", HB_TAG('N','C','R',' ')},*/ /* N-Cree */ +/*{"csw", HB_TAG('N','H','C',' ')},*/ /* Norway House Cree */ +/*{"el-polyton", HB_TAG('P','G','R',' ')},*/ /* Polytonic Greek */ +/*{"bgr, cnh, cnw, czt, sez, tcp, csy, ctd, flm, pck, tcz, zom, cmr, dao, hlt, cka, cnk, mrh, mwg, cbl, cnb, csh", HB_TAG('Q','I','N',' ')},*/ /* Chin */ /*{"??", HB_TAG('Y','I','C',' ')},*/ /* Yi Classic */ -/*{"ii?/Yiii?", HB_TAG('Y','I','M',' ')},*/ /* Yi Modern */ -/*{"??", HB_TAG('Z','H','P',' ')},*/ /* Chinese Phonetic */ +/*{"zh-Latn-pinyin", HB_TAG('Z','H','P',' ')},*/ /* Chinese Phonetic */ }; typedef struct { @@ -928,4 +985,27 @@ } } +#ifdef MAIN +static inline void +test_langs_sorted (void) +{ + for (unsigned int i = 1; i < ARRAY_LENGTH (ot_languages); i++) + { + int c = lang_compare_first_component (ot_languages[i-1].language, ot_languages[i].language); + if (c >= 0) + { + fprintf (stderr, "ot_languages not sorted at index %d: %s %d %s\n", + i, ot_languages[i-1].language, c, ot_languages[i].language); + abort(); + } + } +} +int +main (void) +{ + test_langs_sorted (); + return 0; +} + +#endif
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ot-tag.h Tue Aug 09 16:20:02 2016 -0700 @@ -39,18 +39,18 @@ #define HB_OT_TAG_DEFAULT_SCRIPT HB_TAG ('D', 'F', 'L', 'T') #define HB_OT_TAG_DEFAULT_LANGUAGE HB_TAG ('d', 'f', 'l', 't') -void +HB_EXTERN void hb_ot_tags_from_script (hb_script_t script, hb_tag_t *script_tag_1, hb_tag_t *script_tag_2); -hb_script_t +HB_EXTERN hb_script_t hb_ot_tag_to_script (hb_tag_t tag); -hb_tag_t +HB_EXTERN hb_tag_t hb_ot_tag_from_language (hb_language_t language); -hb_language_t +HB_EXTERN hb_language_t hb_ot_tag_to_language (hb_tag_t tag);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -83,7 +83,7 @@ #define unlikely(expr) (expr) #endif -#ifndef __GNUC__ +#if !defined(__GNUC__) && !defined(__clang__) #undef __attribute__ #define __attribute__(x) #endif @@ -119,6 +119,36 @@ #define HB_FUNC __func__ #endif +/* + * Borrowed from https://bugzilla.mozilla.org/show_bug.cgi?id=1215411 + * HB_FALLTHROUGH is an annotation to suppress compiler warnings about switch + * cases that fall through without a break or return statement. HB_FALLTHROUGH + * is only needed on cases that have code: + * + * switch (foo) { + * case 1: // These cases have no code. No fallthrough annotations are needed. + * case 2: + * case 3: + * foo = 4; // This case has code, so a fallthrough annotation is needed: + * HB_FALLTHROUGH; + * default: + * return foo; + * } + */ +#if defined(__clang__) && __cplusplus >= 201103L + /* clang's fallthrough annotations are only available starting in C++11. */ +# define HB_FALLTHROUGH [[clang::fallthrough]] +#elif defined(_MSC_VER) + /* + * MSVC's __fallthrough annotations are checked by /analyze (Code Analysis): + * https://msdn.microsoft.com/en-us/library/ms235402%28VS.80%29.aspx + */ +# include <sal.h> +# define HB_FALLTHROUGH __fallthrough +#else +# define HB_FALLTHROUGH /* FALLTHROUGH */ +#endif + #if defined(_WIN32) || defined(__CYGWIN__) /* We need Windows Vista for both Uniscribe backend and for * MemoryBarrier. We don't support compiling on Windows XP, @@ -139,6 +169,7 @@ # if defined(_WIN32_WCE) /* Some things not defined on Windows CE. */ # define strdup _strdup +# define vsnprintf _vsnprintf # define getenv(Name) NULL # if _WIN32_WCE < 0x800 # define setlocale(Category, Locale) "C" @@ -149,6 +180,9 @@ # endif # if defined(_MSC_VER) && _MSC_VER < 1900 # define snprintf _snprintf +# elif defined(_MSC_VER) && _MSC_VER >= 1900 +# /* Covers VC++ Error for strdup being a deprecated POSIX name and to instead use _strdup instead */ +# define strdup _strdup # endif #endif @@ -210,9 +244,9 @@ #define _ASSERT_STATIC0(_line, _cond) _ASSERT_STATIC1 (_line, (_cond)) #define ASSERT_STATIC(_cond) _ASSERT_STATIC0 (__LINE__, (_cond)) -/* Note: C++ allows sizeof() of variable-lengh arrays. So, if _cond is not - * constant, it still compiles (ouch!), but at least we'll get a -Wvla warning. */ -#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * sizeof (char[(_cond) ? 1 : -1])) +template <unsigned int cond> class hb_assert_constant_t {}; + +#define ASSERT_STATIC_EXPR_ZERO(_cond) (0 * (unsigned int) sizeof (hb_assert_constant_t<_cond>)) #define _PASTE1(a,b) a##b #define PASTE(a,b) _PASTE1(a,b) @@ -578,6 +612,15 @@ /* Debug */ +/* HB_NDEBUG disables some sanity checks that are very safe to disable and + * should be disabled in production systems. If NDEBUG is defined, enable + * HB_NDEBUG; but if it's desirable that normal assert()s (which are very + * light-weight) to be enabled, then HB_DEBUG can be defined to disable + * the costlier checks. */ +#ifdef NDEBUG +#define HB_NDEBUG +#endif + #ifndef HB_DEBUG #define HB_DEBUG 0 #endif @@ -861,6 +904,29 @@ } +/* Enable bitwise ops on enums marked as flags_t */ +/* To my surprise, looks like the function resolver is happy to silently cast + * one enum to another... So this doesn't provide the type-checking that I + * originally had in mind... :(. + * + * For MSVC warnings, see: https://github.com/behdad/harfbuzz/pull/163 + */ +#ifdef _MSC_VER +# pragma warning(disable:4200) +# pragma warning(disable:4800) +#endif +#define HB_MARK_AS_FLAG_T(T) \ + extern "C++" { \ + static inline T operator | (T l, T r) { return T ((unsigned) l | (unsigned) r); } \ + static inline T operator & (T l, T r) { return T ((unsigned) l & (unsigned) r); } \ + static inline T operator ^ (T l, T r) { return T ((unsigned) l ^ (unsigned) r); } \ + static inline T operator ~ (T r) { return T (~(unsigned int) r); } \ + static inline T& operator |= (T &l, T r) { l = l | r; return l; } \ + static inline T& operator &= (T& l, T r) { l = l & r; return l; } \ + static inline T& operator ^= (T& l, T r) { l = l ^ r; return l; } \ + } + + /* Useful for set-operations on small enums. * For example, for testing "x ∈ {x1, x2, x3}" use: * (FLAG_SAFE(x) & (FLAG(x1) | FLAG(x2) | FLAG(x3))) @@ -949,5 +1015,7 @@ return _hb_options.opts; } +/* Size signifying variable-sized array */ +#define VAR 1 #endif /* HB_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-set.h Tue Aug 09 16:20:02 2016 -0700 @@ -44,109 +44,109 @@ typedef struct hb_set_t hb_set_t; -hb_set_t * +HB_EXTERN hb_set_t * hb_set_create (void); -hb_set_t * +HB_EXTERN hb_set_t * hb_set_get_empty (void); -hb_set_t * +HB_EXTERN hb_set_t * hb_set_reference (hb_set_t *set); -void +HB_EXTERN void hb_set_destroy (hb_set_t *set); -hb_bool_t +HB_EXTERN hb_bool_t hb_set_set_user_data (hb_set_t *set, hb_user_data_key_t *key, void * data, hb_destroy_func_t destroy, hb_bool_t replace); -void * +HB_EXTERN void * hb_set_get_user_data (hb_set_t *set, hb_user_data_key_t *key); /* Returns false if allocation has failed before */ -hb_bool_t +HB_EXTERN hb_bool_t hb_set_allocation_successful (const hb_set_t *set); -void +HB_EXTERN void hb_set_clear (hb_set_t *set); -hb_bool_t +HB_EXTERN hb_bool_t hb_set_is_empty (const hb_set_t *set); -hb_bool_t +HB_EXTERN hb_bool_t hb_set_has (const hb_set_t *set, hb_codepoint_t codepoint); /* Right now limited to 16-bit integers. Eventually will do full codepoint range, sans -1 * which we will use as a sentinel. */ -void +HB_EXTERN void hb_set_add (hb_set_t *set, hb_codepoint_t codepoint); -void +HB_EXTERN void hb_set_add_range (hb_set_t *set, hb_codepoint_t first, hb_codepoint_t last); -void +HB_EXTERN void hb_set_del (hb_set_t *set, hb_codepoint_t codepoint); -void +HB_EXTERN void hb_set_del_range (hb_set_t *set, hb_codepoint_t first, hb_codepoint_t last); -hb_bool_t +HB_EXTERN hb_bool_t hb_set_is_equal (const hb_set_t *set, const hb_set_t *other); -void +HB_EXTERN void hb_set_set (hb_set_t *set, const hb_set_t *other); -void +HB_EXTERN void hb_set_union (hb_set_t *set, const hb_set_t *other); -void +HB_EXTERN void hb_set_intersect (hb_set_t *set, const hb_set_t *other); -void +HB_EXTERN void hb_set_subtract (hb_set_t *set, const hb_set_t *other); -void +HB_EXTERN void hb_set_symmetric_difference (hb_set_t *set, const hb_set_t *other); -void +HB_EXTERN void hb_set_invert (hb_set_t *set); -unsigned int +HB_EXTERN unsigned int hb_set_get_population (const hb_set_t *set); /* Returns -1 if set empty. */ -hb_codepoint_t +HB_EXTERN hb_codepoint_t hb_set_get_min (const hb_set_t *set); /* Returns -1 if set empty. */ -hb_codepoint_t +HB_EXTERN hb_codepoint_t hb_set_get_max (const hb_set_t *set); /* Pass -1 in to get started. */ -hb_bool_t +HB_EXTERN hb_bool_t hb_set_next (const hb_set_t *set, hb_codepoint_t *codepoint); /* Pass -1 for first and last to get started. */ -hb_bool_t +HB_EXTERN hb_bool_t hb_set_next_range (const hb_set_t *set, hb_codepoint_t *first, hb_codepoint_t *last);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape-plan.h Tue Aug 09 16:20:02 2016 -0700 @@ -38,49 +38,49 @@ typedef struct hb_shape_plan_t hb_shape_plan_t; -hb_shape_plan_t * +HB_EXTERN hb_shape_plan_t * hb_shape_plan_create (hb_face_t *face, const hb_segment_properties_t *props, const hb_feature_t *user_features, unsigned int num_user_features, const char * const *shaper_list); -hb_shape_plan_t * +HB_EXTERN hb_shape_plan_t * hb_shape_plan_create_cached (hb_face_t *face, const hb_segment_properties_t *props, const hb_feature_t *user_features, unsigned int num_user_features, const char * const *shaper_list); -hb_shape_plan_t * +HB_EXTERN hb_shape_plan_t * hb_shape_plan_get_empty (void); -hb_shape_plan_t * +HB_EXTERN hb_shape_plan_t * hb_shape_plan_reference (hb_shape_plan_t *shape_plan); -void +HB_EXTERN void hb_shape_plan_destroy (hb_shape_plan_t *shape_plan); -hb_bool_t +HB_EXTERN hb_bool_t hb_shape_plan_set_user_data (hb_shape_plan_t *shape_plan, hb_user_data_key_t *key, void * data, hb_destroy_func_t destroy, hb_bool_t replace); -void * +HB_EXTERN void * hb_shape_plan_get_user_data (hb_shape_plan_t *shape_plan, hb_user_data_key_t *key); -hb_bool_t +HB_EXTERN hb_bool_t hb_shape_plan_execute (hb_shape_plan_t *shape_plan, hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features); -const char * +HB_EXTERN const char * hb_shape_plan_get_shaper (hb_shape_plan_t *shape_plan);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.cc Tue Aug 09 16:20:02 2016 -0700 @@ -210,13 +210,15 @@ /** * hb_feature_from_string: * @str: (array length=len) (element-type uint8_t): a string to parse - * @len: length of @str, or -1 if string is nul-terminated + * @len: length of @str, or -1 if string is %NULL terminated * @feature: (out): the #hb_feature_t to initialize with the parsed values * - * Parses a string into a #hb_feature_t. If @len is -1 then @str is - * %NULL-terminated. + * Parses a string into a #hb_feature_t. * - * Return value: %TRUE if @str is successfully parsed, %FALSE otherwise + * TODO: document the syntax here. + * + * Return value: + * %true if @str is successfully parsed, %false otherwise. * * Since: 0.9.5 **/ @@ -392,8 +394,6 @@ * positioned glyphs. If @features is not %NULL, it will be used to control the * features applied during shaping. * - * Return value: %FALSE if all shapers failed, %TRUE otherwise - * * Since: 0.9.2 **/ void
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shape.h Tue Aug 09 16:20:02 2016 -0700 @@ -47,29 +47,29 @@ unsigned int end; } hb_feature_t; -hb_bool_t +HB_EXTERN hb_bool_t hb_feature_from_string (const char *str, int len, hb_feature_t *feature); -void +HB_EXTERN void hb_feature_to_string (hb_feature_t *feature, char *buf, unsigned int size); -void +HB_EXTERN void hb_shape (hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features); -hb_bool_t +HB_EXTERN hb_bool_t hb_shape_full (hb_font_t *font, hb_buffer_t *buffer, const hb_feature_t *features, unsigned int num_features, const char * const *shaper_list); -const char ** +HB_EXTERN const char ** hb_shape_list_shapers (void);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-shaper-list.hh Tue Aug 09 16:20:02 2016 -0700 @@ -46,6 +46,9 @@ #ifdef HAVE_UNISCRIBE HB_SHAPER_IMPLEMENT (uniscribe) #endif +#ifdef HAVE_DIRECTWRITE +HB_SHAPER_IMPLEMENT (directwrite) +#endif #ifdef HAVE_CORETEXT HB_SHAPER_IMPLEMENT (coretext) #endif
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn.cc Tue Aug 09 16:20:02 2016 -0700 @@ -154,6 +154,12 @@ HB_SCRIPT_MULTANI, HB_SCRIPT_OLD_HUNGARIAN, HB_SCRIPT_SIGNWRITING, + HB_SCRIPT_ADLAM, + HB_SCRIPT_BHAIKSUKI, + HB_SCRIPT_MARCHEN, + HB_SCRIPT_NEWA, + HB_SCRIPT_OSAGE, + HB_SCRIPT_TANGUT, }; static hb_unicode_combining_class_t
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.c Tue Aug 09 16:20:02 2016 -0700 @@ -16,6 +16,7 @@ #include <stdio.h> #include <stdlib.h> +#include <stdint.h> #include "ucdn.h" typedef struct { @@ -24,8 +25,8 @@ unsigned char bidi_class; unsigned char mirrored; unsigned char east_asian_width; - unsigned char normalization_check; unsigned char script; + unsigned char linebreak_class; } UCDRecord; typedef struct { @@ -33,6 +34,11 @@ } MirrorPair; typedef struct { + unsigned short from, to; + unsigned char type; +} BracketPair; + +typedef struct { unsigned int start; short count, index; } Reindex; @@ -108,6 +114,24 @@ return mpa->from - mpb->from; } +static int compare_bp(const void *a, const void *b) +{ + BracketPair *bpa = (BracketPair *)a; + BracketPair *bpb = (BracketPair *)b; + return bpa->from - bpb->from; +} + +static BracketPair *search_bp(uint32_t code) +{ + BracketPair bp = {0,0,2}; + BracketPair *res; + + bp.from = code; + res = bsearch(&bp, bracket_pairs, BIDI_BRACKET_LEN, sizeof(BracketPair), + compare_bp); + return res; +} + static int hangul_pair_decompose(uint32_t code, uint32_t *a, uint32_t *b) { int si = code - SBASE; @@ -199,6 +223,42 @@ return get_ucd_record(code)->script; } +int ucdn_get_linebreak_class(uint32_t code) +{ + return get_ucd_record(code)->linebreak_class; +} + +int ucdn_get_resolved_linebreak_class(uint32_t code) +{ + const UCDRecord *record = get_ucd_record(code); + + switch (record->linebreak_class) + { + case UCDN_LINEBREAK_CLASS_AI: + case UCDN_LINEBREAK_CLASS_SG: + case UCDN_LINEBREAK_CLASS_XX: + return UCDN_LINEBREAK_CLASS_AL; + + case UCDN_LINEBREAK_CLASS_SA: + if (record->category == UCDN_GENERAL_CATEGORY_MC || + record->category == UCDN_GENERAL_CATEGORY_MN) + return UCDN_LINEBREAK_CLASS_CM; + return UCDN_LINEBREAK_CLASS_AL; + + case UCDN_LINEBREAK_CLASS_CJ: + return UCDN_LINEBREAK_CLASS_NS; + + case UCDN_LINEBREAK_CLASS_CB: + return UCDN_LINEBREAK_CLASS_B2; + + case UCDN_LINEBREAK_CLASS_NL: + return UCDN_LINEBREAK_CLASS_BK; + + default: + return record->linebreak_class; + } +} + uint32_t ucdn_mirror(uint32_t code) { MirrorPair mp = {0}; @@ -217,6 +277,24 @@ return res->to; } +uint32_t ucdn_paired_bracket(uint32_t code) +{ + BracketPair *res = search_bp(code); + if (res == NULL) + return code; + else + return res->to; +} + +int ucdn_paired_bracket_type(uint32_t code) +{ + BracketPair *res = search_bp(code); + if (res == NULL) + return UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE; + else + return res->type; +} + int ucdn_decompose(uint32_t code, uint32_t *a, uint32_t *b) { const unsigned short *rec;
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/ucdn.h Tue Aug 09 16:20:02 2016 -0700 @@ -17,6 +17,8 @@ #ifndef UCDN_H #define UCDN_H + + #if defined(__GNUC__) && (__GNUC__ >= 4) && !defined(__MINGW32__) # define HB_BEGIN_VISIBILITY _Pragma ("GCC visibility push(hidden)") # define HB_END_VISIBILITY _Pragma ("GCC visibility pop") @@ -58,6 +60,7 @@ #endif + #define UCDN_EAST_ASIAN_F 0 #define UCDN_EAST_ASIAN_H 1 #define UCDN_EAST_ASIAN_W 2 @@ -197,6 +200,53 @@ #define UCDN_SCRIPT_MULTANI 129 #define UCDN_SCRIPT_OLD_HUNGARIAN 130 #define UCDN_SCRIPT_SIGNWRITING 131 +#define UCDN_SCRIPT_ADLAM 132 +#define UCDN_SCRIPT_BHAIKSUKI 133 +#define UCDN_SCRIPT_MARCHEN 134 +#define UCDN_SCRIPT_NEWA 135 +#define UCDN_SCRIPT_OSAGE 136 +#define UCDN_SCRIPT_TANGUT 137 + +#define UCDN_LINEBREAK_CLASS_OP 0 +#define UCDN_LINEBREAK_CLASS_CL 1 +#define UCDN_LINEBREAK_CLASS_CP 2 +#define UCDN_LINEBREAK_CLASS_QU 3 +#define UCDN_LINEBREAK_CLASS_GL 4 +#define UCDN_LINEBREAK_CLASS_NS 5 +#define UCDN_LINEBREAK_CLASS_EX 6 +#define UCDN_LINEBREAK_CLASS_SY 7 +#define UCDN_LINEBREAK_CLASS_IS 8 +#define UCDN_LINEBREAK_CLASS_PR 9 +#define UCDN_LINEBREAK_CLASS_PO 10 +#define UCDN_LINEBREAK_CLASS_NU 11 +#define UCDN_LINEBREAK_CLASS_AL 12 +#define UCDN_LINEBREAK_CLASS_HL 13 +#define UCDN_LINEBREAK_CLASS_ID 14 +#define UCDN_LINEBREAK_CLASS_IN 15 +#define UCDN_LINEBREAK_CLASS_HY 16 +#define UCDN_LINEBREAK_CLASS_BA 17 +#define UCDN_LINEBREAK_CLASS_BB 18 +#define UCDN_LINEBREAK_CLASS_B2 19 +#define UCDN_LINEBREAK_CLASS_ZW 20 +#define UCDN_LINEBREAK_CLASS_CM 21 +#define UCDN_LINEBREAK_CLASS_WJ 22 +#define UCDN_LINEBREAK_CLASS_H2 23 +#define UCDN_LINEBREAK_CLASS_H3 24 +#define UCDN_LINEBREAK_CLASS_JL 25 +#define UCDN_LINEBREAK_CLASS_JV 26 +#define UCDN_LINEBREAK_CLASS_JT 27 +#define UCDN_LINEBREAK_CLASS_RI 28 +#define UCDN_LINEBREAK_CLASS_AI 29 +#define UCDN_LINEBREAK_CLASS_BK 30 +#define UCDN_LINEBREAK_CLASS_CB 31 +#define UCDN_LINEBREAK_CLASS_CJ 32 +#define UCDN_LINEBREAK_CLASS_CR 33 +#define UCDN_LINEBREAK_CLASS_LF 34 +#define UCDN_LINEBREAK_CLASS_NL 35 +#define UCDN_LINEBREAK_CLASS_SA 36 +#define UCDN_LINEBREAK_CLASS_SG 37 +#define UCDN_LINEBREAK_CLASS_SP 38 +#define UCDN_LINEBREAK_CLASS_XX 39 #define UCDN_GENERAL_CATEGORY_CC 0 #define UCDN_GENERAL_CATEGORY_CF 1 @@ -253,6 +303,10 @@ #define UCDN_BIDI_CLASS_FSI 21 #define UCDN_BIDI_CLASS_PDI 22 +#define UCDN_BIDI_PAIRED_BRACKET_TYPE_OPEN 0 +#define UCDN_BIDI_PAIRED_BRACKET_TYPE_CLOSE 1 +#define UCDN_BIDI_PAIRED_BRACKET_TYPE_NONE 2 + /** * Return version of the Unicode database. * @@ -302,6 +356,27 @@ int ucdn_get_script(uint32_t code); /** + * Get unresolved linebreak class of a codepoint. This does not take + * rule LB1 of UAX#14 into account. See ucdn_get_resolved_linebreak_class() + * for resolved linebreak classes. + * + * @param code Unicode codepoint + * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14. + */ +int ucdn_get_linebreak_class(uint32_t code); + +/** + * Get resolved linebreak class of a codepoint. This resolves characters + * in the AI, SG, XX, SA and CJ classes according to rule LB1 of UAX#14. + * In addition the CB class is resolved as the equivalent B2 class and + * the NL class is resolved as the equivalent BK class. + * + * @param code Unicode codepoint + * @return value according to UCDN_LINEBREAK_* and as defined in UAX#14. + */ +int ucdn_get_resolved_linebreak_class(uint32_t code); + +/** * Check if codepoint can be mirrored. * * @param code Unicode codepoint @@ -319,6 +394,25 @@ uint32_t ucdn_mirror(uint32_t code); /** + * Get paired bracket for a codepoint. + * + * @param code Unicode codepoint + * @return paired bracket codepoint or the original codepoint if no + * paired bracket character exists + */ +uint32_t ucdn_paired_bracket(uint32_t code); + +/** + * Get paired bracket type for a codepoint. + * + * @param code Unicode codepoint + * @return value according to UCDN_BIDI_PAIRED_BRACKET_TYPE_* and as defined + * in UAX#9. + * + */ +int ucdn_paired_bracket_type(uint32_t code); + +/** * Pairwise canonical decomposition of a codepoint. This includes * Hangul Jamo decomposition (see chapter 3.12 of the Unicode core * specification). @@ -359,6 +453,8 @@ */ int ucdn_compose(uint32_t *code, uint32_t a, uint32_t b); -HB_END_HEADER +#ifdef __cplusplus +} +#endif #endif
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-ucdn/unicodedata_db.h Tue Aug 09 16:20:02 2016 -0700 @@ -1,821 +1,999 @@ /* this file was generated by makeunicodedata.py 3.2 */ -#define UNIDATA_VERSION "8.0.0" +#define UNIDATA_VERSION "9.0.0" /* a list of unique database records */ static const UCDRecord ucd_records[] = { - {2, 0, 18, 0, 5, 0, 102}, - {0, 0, 14, 0, 5, 0, 0}, - {0, 0, 16, 0, 5, 0, 0}, - {0, 0, 15, 0, 5, 0, 0}, - {0, 0, 17, 0, 5, 0, 0}, - {29, 0, 17, 0, 3, 0, 0}, - {21, 0, 18, 0, 3, 0, 0}, - {21, 0, 10, 0, 3, 0, 0}, - {23, 0, 10, 0, 3, 0, 0}, + {2, 0, 18, 0, 5, 102, 41}, + {0, 0, 14, 0, 5, 0, 21}, + {0, 0, 16, 0, 5, 0, 17}, + {0, 0, 15, 0, 5, 0, 35}, + {0, 0, 16, 0, 5, 0, 30}, + {0, 0, 17, 0, 5, 0, 30}, + {0, 0, 15, 0, 5, 0, 33}, + {0, 0, 15, 0, 5, 0, 21}, + {0, 0, 16, 0, 5, 0, 21}, + {29, 0, 17, 0, 3, 0, 40}, + {21, 0, 18, 0, 3, 0, 6}, + {21, 0, 18, 0, 3, 0, 3}, + {21, 0, 10, 0, 3, 0, 12}, + {23, 0, 10, 0, 3, 0, 9}, + {21, 0, 10, 0, 3, 0, 10}, + {21, 0, 18, 0, 3, 0, 12}, {22, 0, 18, 1, 3, 0, 0}, - {18, 0, 18, 1, 3, 0, 0}, - {25, 0, 9, 0, 3, 0, 0}, - {21, 0, 12, 0, 3, 0, 0}, - {17, 0, 9, 0, 3, 0, 0}, - {13, 0, 8, 0, 3, 0, 0}, - {25, 0, 18, 1, 3, 0, 0}, - {25, 0, 18, 0, 3, 0, 0}, - {9, 0, 0, 0, 3, 0, 1}, - {24, 0, 18, 0, 3, 0, 0}, - {16, 0, 18, 0, 3, 0, 0}, - {5, 0, 0, 0, 3, 0, 1}, - {29, 0, 12, 0, 5, 0, 0}, + {18, 0, 18, 1, 3, 0, 2}, + {25, 0, 9, 0, 3, 0, 9}, + {21, 0, 12, 0, 3, 0, 8}, + {17, 0, 9, 0, 3, 0, 16}, + {21, 0, 12, 0, 3, 0, 7}, + {13, 0, 8, 0, 3, 0, 11}, + {21, 0, 18, 0, 3, 0, 8}, + {25, 0, 18, 1, 3, 0, 12}, + {25, 0, 18, 0, 3, 0, 12}, + {9, 0, 0, 0, 3, 1, 12}, + {21, 0, 18, 0, 3, 0, 9}, + {24, 0, 18, 0, 3, 0, 12}, + {16, 0, 18, 0, 3, 0, 12}, + {5, 0, 0, 0, 3, 1, 12}, + {25, 0, 18, 0, 3, 0, 17}, + {18, 0, 18, 1, 3, 0, 1}, + {0, 0, 15, 0, 5, 0, 36}, + {29, 0, 12, 0, 5, 0, 4}, {21, 0, 18, 0, 4, 0, 0}, - {23, 0, 10, 0, 4, 0, 0}, - {26, 0, 18, 0, 3, 0, 0}, - {24, 0, 18, 0, 4, 0, 0}, - {26, 0, 18, 0, 5, 0, 0}, - {7, 0, 0, 0, 4, 0, 1}, - {20, 0, 18, 1, 5, 0, 0}, - {1, 0, 14, 0, 4, 0, 0}, - {26, 0, 18, 0, 4, 0, 0}, - {26, 0, 10, 0, 4, 0, 0}, - {25, 0, 10, 0, 4, 0, 0}, - {15, 0, 8, 0, 4, 0, 0}, - {5, 0, 0, 0, 5, 0, 0}, - {19, 0, 18, 1, 5, 0, 0}, - {15, 0, 18, 0, 4, 0, 0}, - {9, 0, 0, 0, 5, 0, 1}, - {9, 0, 0, 0, 4, 0, 1}, - {25, 0, 18, 0, 4, 0, 0}, - {5, 0, 0, 0, 4, 0, 1}, - {5, 0, 0, 0, 5, 0, 1}, - {7, 0, 0, 0, 5, 0, 1}, - {8, 0, 0, 0, 5, 0, 1}, - {6, 0, 0, 0, 5, 0, 1}, - {6, 0, 18, 0, 5, 0, 0}, - {6, 0, 0, 0, 5, 0, 0}, - {24, 0, 18, 0, 5, 0, 0}, - {6, 0, 18, 0, 4, 0, 0}, - {6, 0, 0, 0, 4, 0, 0}, - {24, 0, 18, 0, 5, 0, 34}, - {12, 230, 13, 0, 4, 0, 40}, - {12, 232, 13, 0, 4, 0, 40}, - {12, 220, 13, 0, 4, 0, 40}, - {12, 216, 13, 0, 4, 0, 40}, - {12, 202, 13, 0, 4, 0, 40}, - {12, 1, 13, 0, 4, 0, 40}, - {12, 240, 13, 0, 4, 0, 40}, - {12, 0, 13, 0, 4, 0, 40}, - {12, 233, 13, 0, 4, 0, 40}, - {12, 234, 13, 0, 4, 0, 40}, - {9, 0, 0, 0, 5, 0, 2}, - {5, 0, 0, 0, 5, 0, 2}, - {24, 0, 18, 0, 5, 0, 2}, - {2, 0, 18, 0, 5, 0, 102}, - {6, 0, 0, 0, 5, 0, 2}, - {21, 0, 18, 0, 5, 0, 0}, - {9, 0, 0, 0, 4, 0, 2}, - {5, 0, 0, 0, 4, 0, 2}, - {9, 0, 0, 0, 5, 0, 54}, - {5, 0, 0, 0, 5, 0, 54}, - {25, 0, 18, 0, 5, 0, 2}, - {9, 0, 0, 0, 5, 0, 3}, - {9, 0, 0, 0, 4, 0, 3}, - {5, 0, 0, 0, 4, 0, 3}, - {5, 0, 0, 0, 5, 0, 3}, - {26, 0, 0, 0, 5, 0, 3}, - {12, 230, 13, 0, 5, 0, 3}, - {12, 230, 13, 0, 5, 0, 40}, - {11, 0, 13, 0, 5, 0, 3}, - {9, 0, 0, 0, 5, 0, 4}, - {6, 0, 0, 0, 5, 0, 4}, - {21, 0, 0, 0, 5, 0, 4}, - {5, 0, 0, 0, 5, 0, 4}, - {21, 0, 0, 0, 5, 0, 0}, - {17, 0, 18, 0, 5, 0, 4}, - {26, 0, 18, 0, 5, 0, 4}, - {23, 0, 10, 0, 5, 0, 4}, - {12, 220, 13, 0, 5, 0, 5}, - {12, 230, 13, 0, 5, 0, 5}, - {12, 222, 13, 0, 5, 0, 5}, - {12, 228, 13, 0, 5, 0, 5}, - {12, 10, 13, 0, 5, 0, 5}, - {12, 11, 13, 0, 5, 0, 5}, - {12, 12, 13, 0, 5, 0, 5}, - {12, 13, 13, 0, 5, 0, 5}, - {12, 14, 13, 0, 5, 0, 5}, - {12, 15, 13, 0, 5, 0, 5}, - {12, 16, 13, 0, 5, 0, 5}, - {12, 17, 13, 0, 5, 0, 5}, - {12, 18, 13, 0, 5, 0, 5}, - {12, 19, 13, 0, 5, 0, 5}, - {12, 20, 13, 0, 5, 0, 5}, - {12, 21, 13, 0, 5, 0, 5}, - {12, 22, 13, 0, 5, 0, 5}, - {17, 0, 3, 0, 5, 0, 5}, - {12, 23, 13, 0, 5, 0, 5}, - {21, 0, 3, 0, 5, 0, 5}, - {12, 24, 13, 0, 5, 0, 5}, - {12, 25, 13, 0, 5, 0, 5}, - {7, 0, 3, 0, 5, 0, 5}, - {1, 0, 11, 0, 5, 0, 6}, - {1, 0, 11, 0, 5, 0, 0}, - {25, 0, 18, 0, 5, 0, 6}, - {25, 0, 4, 0, 5, 0, 6}, - {21, 0, 10, 0, 5, 0, 6}, - {23, 0, 4, 0, 5, 0, 6}, - {21, 0, 12, 0, 5, 0, 0}, + {23, 0, 10, 0, 3, 0, 10}, + {23, 0, 10, 0, 4, 0, 9}, + {26, 0, 18, 0, 3, 0, 12}, + {21, 0, 18, 0, 4, 0, 29}, + {24, 0, 18, 0, 4, 0, 29}, + {26, 0, 18, 0, 5, 0, 12}, + {7, 0, 0, 0, 4, 1, 29}, + {20, 0, 18, 1, 5, 0, 3}, + {1, 0, 14, 0, 4, 0, 17}, + {26, 0, 18, 0, 4, 0, 12}, + {26, 0, 10, 0, 4, 0, 10}, + {25, 0, 10, 0, 4, 0, 9}, + {15, 0, 8, 0, 4, 0, 29}, + {24, 0, 18, 0, 4, 0, 18}, + {5, 0, 0, 0, 5, 0, 12}, + {19, 0, 18, 1, 5, 0, 3}, + {15, 0, 18, 0, 4, 0, 29}, + {9, 0, 0, 0, 5, 1, 12}, + {9, 0, 0, 0, 4, 1, 12}, + {25, 0, 18, 0, 4, 0, 29}, + {5, 0, 0, 0, 4, 1, 12}, + {5, 0, 0, 0, 5, 1, 12}, + {7, 0, 0, 0, 5, 1, 12}, + {8, 0, 0, 0, 5, 1, 12}, + {6, 0, 0, 0, 5, 1, 12}, + {6, 0, 18, 0, 5, 0, 12}, + {6, 0, 0, 0, 5, 0, 12}, + {24, 0, 18, 0, 5, 0, 12}, + {24, 0, 18, 0, 4, 0, 12}, + {6, 0, 18, 0, 4, 0, 29}, + {6, 0, 18, 0, 5, 0, 18}, + {6, 0, 0, 0, 4, 0, 29}, + {24, 0, 18, 0, 5, 34, 12}, + {12, 230, 13, 0, 4, 40, 21}, + {12, 232, 13, 0, 4, 40, 21}, + {12, 220, 13, 0, 4, 40, 21}, + {12, 216, 13, 0, 4, 40, 21}, + {12, 202, 13, 0, 4, 40, 21}, + {12, 1, 13, 0, 4, 40, 21}, + {12, 240, 13, 0, 4, 40, 21}, + {12, 0, 13, 0, 4, 40, 4}, + {12, 233, 13, 0, 4, 40, 4}, + {12, 234, 13, 0, 4, 40, 4}, + {9, 0, 0, 0, 5, 2, 12}, + {5, 0, 0, 0, 5, 2, 12}, + {24, 0, 18, 0, 5, 2, 12}, + {2, 0, 18, 0, 5, 102, 41}, + {6, 0, 0, 0, 5, 2, 12}, + {21, 0, 18, 0, 5, 0, 8}, + {21, 0, 18, 0, 5, 0, 12}, + {9, 0, 0, 0, 4, 2, 12}, + {5, 0, 0, 0, 4, 2, 12}, + {9, 0, 0, 0, 5, 54, 12}, + {5, 0, 0, 0, 5, 54, 12}, + {25, 0, 18, 0, 5, 2, 12}, + {9, 0, 0, 0, 5, 3, 12}, + {9, 0, 0, 0, 4, 3, 12}, + {5, 0, 0, 0, 4, 3, 12}, + {5, 0, 0, 0, 5, 3, 12}, + {26, 0, 0, 0, 5, 3, 12}, + {12, 230, 13, 0, 5, 3, 21}, + {12, 230, 13, 0, 5, 40, 21}, + {11, 0, 13, 0, 5, 3, 21}, + {9, 0, 0, 0, 5, 4, 12}, + {6, 0, 0, 0, 5, 4, 12}, + {21, 0, 0, 0, 5, 4, 12}, + {5, 0, 0, 0, 5, 4, 12}, + {21, 0, 0, 0, 5, 0, 8}, + {17, 0, 18, 0, 5, 4, 17}, + {26, 0, 18, 0, 5, 4, 12}, + {23, 0, 10, 0, 5, 4, 9}, + {12, 220, 13, 0, 5, 5, 21}, + {12, 230, 13, 0, 5, 5, 21}, + {12, 222, 13, 0, 5, 5, 21}, + {12, 228, 13, 0, 5, 5, 21}, + {12, 10, 13, 0, 5, 5, 21}, + {12, 11, 13, 0, 5, 5, 21}, + {12, 12, 13, 0, 5, 5, 21}, + {12, 13, 13, 0, 5, 5, 21}, + {12, 14, 13, 0, 5, 5, 21}, + {12, 15, 13, 0, 5, 5, 21}, + {12, 16, 13, 0, 5, 5, 21}, + {12, 17, 13, 0, 5, 5, 21}, + {12, 18, 13, 0, 5, 5, 21}, + {12, 19, 13, 0, 5, 5, 21}, + {12, 20, 13, 0, 5, 5, 21}, + {12, 21, 13, 0, 5, 5, 21}, + {12, 22, 13, 0, 5, 5, 21}, + {17, 0, 3, 0, 5, 5, 17}, + {12, 23, 13, 0, 5, 5, 21}, + {21, 0, 3, 0, 5, 5, 12}, + {12, 24, 13, 0, 5, 5, 21}, + {12, 25, 13, 0, 5, 5, 21}, + {21, 0, 3, 0, 5, 5, 6}, + {7, 0, 3, 0, 5, 5, 13}, + {1, 0, 11, 0, 5, 6, 12}, + {1, 0, 11, 0, 5, 0, 12}, + {25, 0, 18, 0, 5, 6, 12}, + {25, 0, 4, 0, 5, 6, 12}, + {21, 0, 10, 0, 5, 6, 10}, + {23, 0, 4, 0, 5, 6, 10}, + {21, 0, 12, 0, 5, 0, 8}, + {21, 0, 4, 0, 5, 6, 8}, + {26, 0, 18, 0, 5, 6, 12}, + {12, 230, 13, 0, 5, 6, 21}, + {12, 30, 13, 0, 5, 6, 21}, + {12, 31, 13, 0, 5, 6, 21}, + {12, 32, 13, 0, 5, 6, 21}, {21, 0, 4, 0, 5, 0, 6}, - {26, 0, 18, 0, 5, 0, 6}, - {12, 230, 13, 0, 5, 0, 6}, - {12, 30, 13, 0, 5, 0, 6}, - {12, 31, 13, 0, 5, 0, 6}, - {12, 32, 13, 0, 5, 0, 6}, - {21, 0, 4, 0, 5, 0, 0}, - {1, 0, 4, 0, 5, 0, 0}, - {7, 0, 4, 0, 5, 0, 6}, - {6, 0, 4, 0, 5, 0, 0}, - {12, 27, 13, 0, 5, 0, 40}, - {12, 28, 13, 0, 5, 0, 40}, - {12, 29, 13, 0, 5, 0, 40}, - {12, 30, 13, 0, 5, 0, 40}, - {12, 31, 13, 0, 5, 0, 40}, - {12, 32, 13, 0, 5, 0, 40}, - {12, 33, 13, 0, 5, 0, 40}, - {12, 34, 13, 0, 5, 0, 40}, - {12, 220, 13, 0, 5, 0, 40}, - {12, 220, 13, 0, 5, 0, 6}, - {13, 0, 11, 0, 5, 0, 6}, - {21, 0, 11, 0, 5, 0, 6}, - {12, 35, 13, 0, 5, 0, 40}, - {6, 0, 4, 0, 5, 0, 6}, - {13, 0, 8, 0, 5, 0, 6}, - {26, 0, 4, 0, 5, 0, 6}, - {21, 0, 4, 0, 5, 0, 7}, - {1, 0, 4, 0, 5, 0, 7}, - {7, 0, 4, 0, 5, 0, 7}, - {12, 36, 13, 0, 5, 0, 7}, - {12, 230, 13, 0, 5, 0, 7}, - {12, 220, 13, 0, 5, 0, 7}, - {7, 0, 4, 0, 5, 0, 8}, - {12, 0, 13, 0, 5, 0, 8}, - {13, 0, 3, 0, 5, 0, 65}, - {7, 0, 3, 0, 5, 0, 65}, - {12, 230, 13, 0, 5, 0, 65}, - {12, 220, 13, 0, 5, 0, 65}, - {6, 0, 3, 0, 5, 0, 65}, - {26, 0, 18, 0, 5, 0, 65}, - {21, 0, 18, 0, 5, 0, 65}, - {7, 0, 3, 0, 5, 0, 81}, - {12, 230, 13, 0, 5, 0, 81}, - {6, 0, 3, 0, 5, 0, 81}, - {21, 0, 3, 0, 5, 0, 81}, - {7, 0, 3, 0, 5, 0, 94}, - {12, 220, 13, 0, 5, 0, 94}, - {21, 0, 3, 0, 5, 0, 94}, - {12, 27, 13, 0, 5, 0, 6}, - {12, 28, 13, 0, 5, 0, 6}, - {12, 29, 13, 0, 5, 0, 6}, - {12, 0, 13, 0, 5, 0, 9}, - {10, 0, 0, 0, 5, 0, 9}, - {7, 0, 0, 0, 5, 0, 9}, - {12, 7, 13, 0, 5, 0, 9}, - {12, 9, 13, 0, 5, 0, 9}, - {12, 230, 13, 0, 5, 0, 9}, - {13, 0, 0, 0, 5, 0, 9}, - {21, 0, 0, 0, 5, 0, 9}, - {6, 0, 0, 0, 5, 0, 9}, - {7, 0, 0, 0, 5, 0, 10}, - {12, 0, 13, 0, 5, 0, 10}, - {10, 0, 0, 0, 5, 0, 10}, - {12, 7, 13, 0, 5, 0, 10}, - {12, 9, 13, 0, 5, 0, 10}, - {13, 0, 0, 0, 5, 0, 10}, - {23, 0, 10, 0, 5, 0, 10}, - {15, 0, 0, 0, 5, 0, 10}, - {26, 0, 0, 0, 5, 0, 10}, - {12, 0, 13, 0, 5, 0, 11}, - {10, 0, 0, 0, 5, 0, 11}, - {7, 0, 0, 0, 5, 0, 11}, - {12, 7, 13, 0, 5, 0, 11}, - {12, 9, 13, 0, 5, 0, 11}, - {13, 0, 0, 0, 5, 0, 11}, - {12, 0, 13, 0, 5, 0, 12}, - {10, 0, 0, 0, 5, 0, 12}, - {7, 0, 0, 0, 5, 0, 12}, - {12, 7, 13, 0, 5, 0, 12}, - {12, 9, 13, 0, 5, 0, 12}, - {13, 0, 0, 0, 5, 0, 12}, + {1, 0, 4, 0, 5, 0, 21}, + {21, 0, 4, 0, 5, 6, 6}, + {7, 0, 4, 0, 5, 6, 12}, + {6, 0, 4, 0, 5, 0, 12}, + {12, 27, 13, 0, 5, 40, 21}, + {12, 28, 13, 0, 5, 40, 21}, + {12, 29, 13, 0, 5, 40, 21}, + {12, 30, 13, 0, 5, 40, 21}, + {12, 31, 13, 0, 5, 40, 21}, + {12, 32, 13, 0, 5, 40, 21}, + {12, 33, 13, 0, 5, 40, 21}, + {12, 34, 13, 0, 5, 40, 21}, + {12, 220, 13, 0, 5, 40, 21}, + {12, 220, 13, 0, 5, 6, 21}, + {13, 0, 11, 0, 5, 6, 11}, + {21, 0, 11, 0, 5, 6, 11}, + {21, 0, 4, 0, 5, 6, 12}, + {12, 35, 13, 0, 5, 40, 21}, + {6, 0, 4, 0, 5, 6, 12}, + {13, 0, 8, 0, 5, 6, 11}, + {26, 0, 4, 0, 5, 6, 12}, + {21, 0, 4, 0, 5, 7, 12}, + {1, 0, 4, 0, 5, 7, 12}, + {7, 0, 4, 0, 5, 7, 12}, + {12, 36, 13, 0, 5, 7, 21}, + {12, 230, 13, 0, 5, 7, 21}, + {12, 220, 13, 0, 5, 7, 21}, + {7, 0, 4, 0, 5, 8, 12}, + {12, 0, 13, 0, 5, 8, 21}, + {13, 0, 3, 0, 5, 65, 11}, + {7, 0, 3, 0, 5, 65, 12}, + {12, 230, 13, 0, 5, 65, 21}, + {12, 220, 13, 0, 5, 65, 21}, + {6, 0, 3, 0, 5, 65, 12}, + {26, 0, 18, 0, 5, 65, 12}, + {21, 0, 18, 0, 5, 65, 12}, + {21, 0, 18, 0, 5, 65, 8}, + {21, 0, 18, 0, 5, 65, 6}, + {7, 0, 3, 0, 5, 81, 12}, + {12, 230, 13, 0, 5, 81, 21}, + {6, 0, 3, 0, 5, 81, 12}, + {21, 0, 3, 0, 5, 81, 12}, + {7, 0, 3, 0, 5, 94, 12}, + {12, 220, 13, 0, 5, 94, 21}, + {21, 0, 3, 0, 5, 94, 12}, + {12, 27, 13, 0, 5, 6, 21}, + {12, 28, 13, 0, 5, 6, 21}, + {12, 29, 13, 0, 5, 6, 21}, + {12, 0, 13, 0, 5, 9, 21}, + {10, 0, 0, 0, 5, 9, 21}, + {7, 0, 0, 0, 5, 9, 12}, + {12, 7, 13, 0, 5, 9, 21}, + {12, 9, 13, 0, 5, 9, 21}, + {12, 230, 13, 0, 5, 9, 21}, + {21, 0, 0, 0, 5, 0, 17}, + {13, 0, 0, 0, 5, 9, 11}, + {21, 0, 0, 0, 5, 9, 12}, + {6, 0, 0, 0, 5, 9, 12}, + {7, 0, 0, 0, 5, 10, 12}, + {12, 0, 13, 0, 5, 10, 21}, + {10, 0, 0, 0, 5, 10, 21}, + {12, 7, 13, 0, 5, 10, 21}, + {12, 9, 13, 0, 5, 10, 21}, + {13, 0, 0, 0, 5, 10, 11}, + {23, 0, 10, 0, 5, 10, 10}, + {15, 0, 0, 0, 5, 10, 12}, + {15, 0, 0, 0, 5, 10, 10}, + {26, 0, 0, 0, 5, 10, 12}, + {23, 0, 10, 0, 5, 10, 9}, + {12, 0, 13, 0, 5, 11, 21}, + {10, 0, 0, 0, 5, 11, 21}, + {7, 0, 0, 0, 5, 11, 12}, + {12, 7, 13, 0, 5, 11, 21}, + {12, 9, 13, 0, 5, 11, 21}, + {13, 0, 0, 0, 5, 11, 11}, + {12, 0, 13, 0, 5, 12, 21}, + {10, 0, 0, 0, 5, 12, 21}, + {7, 0, 0, 0, 5, 12, 12}, + {12, 7, 13, 0, 5, 12, 21}, + {12, 9, 13, 0, 5, 12, 21}, + {13, 0, 0, 0, 5, 12, 11}, + {21, 0, 0, 0, 5, 12, 12}, + {23, 0, 10, 0, 5, 12, 9}, + {12, 0, 13, 0, 5, 13, 21}, + {10, 0, 0, 0, 5, 13, 21}, + {7, 0, 0, 0, 5, 13, 12}, + {12, 7, 13, 0, 5, 13, 21}, + {12, 9, 13, 0, 5, 13, 21}, + {13, 0, 0, 0, 5, 13, 11}, + {26, 0, 0, 0, 5, 13, 12}, + {15, 0, 0, 0, 5, 13, 12}, + {12, 0, 13, 0, 5, 14, 21}, + {7, 0, 0, 0, 5, 14, 12}, + {10, 0, 0, 0, 5, 14, 21}, + {12, 9, 13, 0, 5, 14, 21}, + {13, 0, 0, 0, 5, 14, 11}, + {15, 0, 0, 0, 5, 14, 12}, + {26, 0, 18, 0, 5, 14, 12}, + {23, 0, 10, 0, 5, 14, 9}, + {12, 0, 13, 0, 5, 15, 21}, + {10, 0, 0, 0, 5, 15, 21}, + {7, 0, 0, 0, 5, 15, 12}, + {12, 9, 13, 0, 5, 15, 21}, + {12, 84, 13, 0, 5, 15, 21}, + {12, 91, 13, 0, 5, 15, 21}, + {13, 0, 0, 0, 5, 15, 11}, + {15, 0, 18, 0, 5, 15, 12}, + {26, 0, 0, 0, 5, 15, 12}, + {7, 0, 0, 0, 5, 16, 12}, + {12, 0, 13, 0, 5, 16, 21}, + {10, 0, 0, 0, 5, 16, 21}, + {12, 7, 13, 0, 5, 16, 21}, + {12, 0, 0, 0, 5, 16, 21}, + {12, 9, 13, 0, 5, 16, 21}, + {13, 0, 0, 0, 5, 16, 11}, + {12, 0, 13, 0, 5, 17, 21}, + {10, 0, 0, 0, 5, 17, 21}, + {7, 0, 0, 0, 5, 17, 12}, + {12, 9, 13, 0, 5, 17, 21}, + {26, 0, 0, 0, 5, 17, 12}, + {15, 0, 0, 0, 5, 17, 12}, + {13, 0, 0, 0, 5, 17, 11}, + {26, 0, 0, 0, 5, 17, 10}, + {10, 0, 0, 0, 5, 18, 21}, + {7, 0, 0, 0, 5, 18, 12}, + {12, 9, 13, 0, 5, 18, 21}, + {12, 0, 13, 0, 5, 18, 21}, + {13, 0, 0, 0, 5, 18, 11}, + {21, 0, 0, 0, 5, 18, 12}, + {7, 0, 0, 0, 5, 19, 38}, + {12, 0, 13, 0, 5, 19, 38}, + {12, 103, 13, 0, 5, 19, 38}, + {12, 9, 13, 0, 5, 19, 38}, + {23, 0, 10, 0, 5, 0, 9}, + {6, 0, 0, 0, 5, 19, 38}, + {12, 107, 13, 0, 5, 19, 38}, + {21, 0, 0, 0, 5, 19, 12}, + {13, 0, 0, 0, 5, 19, 11}, + {21, 0, 0, 0, 5, 19, 17}, + {7, 0, 0, 0, 5, 20, 38}, + {12, 0, 13, 0, 5, 20, 38}, + {12, 118, 13, 0, 5, 20, 38}, + {6, 0, 0, 0, 5, 20, 38}, + {12, 122, 13, 0, 5, 20, 38}, + {13, 0, 0, 0, 5, 20, 11}, + {7, 0, 0, 0, 5, 21, 12}, + {26, 0, 0, 0, 5, 21, 18}, + {21, 0, 0, 0, 5, 21, 18}, + {21, 0, 0, 0, 5, 21, 12}, + {21, 0, 0, 0, 5, 21, 4}, + {21, 0, 0, 0, 5, 21, 17}, + {21, 0, 0, 0, 5, 21, 6}, + {26, 0, 0, 0, 5, 21, 12}, + {12, 220, 13, 0, 5, 21, 21}, + {13, 0, 0, 0, 5, 21, 11}, + {15, 0, 0, 0, 5, 21, 12}, + {26, 0, 0, 0, 5, 21, 17}, + {12, 216, 13, 0, 5, 21, 21}, + {22, 0, 18, 1, 5, 21, 0}, + {18, 0, 18, 1, 5, 21, 1}, + {10, 0, 0, 0, 5, 21, 21}, + {12, 129, 13, 0, 5, 21, 21}, + {12, 130, 13, 0, 5, 21, 21}, + {12, 0, 13, 0, 5, 21, 21}, + {12, 132, 13, 0, 5, 21, 21}, + {10, 0, 0, 0, 5, 21, 17}, + {12, 230, 13, 0, 5, 21, 21}, + {12, 9, 13, 0, 5, 21, 21}, + {26, 0, 0, 0, 5, 0, 12}, + {7, 0, 0, 0, 5, 22, 38}, + {10, 0, 0, 0, 5, 22, 38}, + {12, 0, 13, 0, 5, 22, 38}, + {12, 7, 13, 0, 5, 22, 38}, + {12, 9, 13, 0, 5, 22, 38}, + {13, 0, 0, 0, 5, 22, 11}, + {21, 0, 0, 0, 5, 22, 17}, + {21, 0, 0, 0, 5, 22, 12}, + {12, 220, 13, 0, 5, 22, 38}, + {26, 0, 0, 0, 5, 22, 38}, + {9, 0, 0, 0, 5, 23, 12}, + {7, 0, 0, 0, 5, 23, 12}, {21, 0, 0, 0, 5, 0, 12}, - {23, 0, 10, 0, 5, 0, 12}, - {12, 0, 13, 0, 5, 0, 13}, - {10, 0, 0, 0, 5, 0, 13}, - {7, 0, 0, 0, 5, 0, 13}, - {12, 7, 13, 0, 5, 0, 13}, - {12, 9, 13, 0, 5, 0, 13}, - {13, 0, 0, 0, 5, 0, 13}, - {26, 0, 0, 0, 5, 0, 13}, - {15, 0, 0, 0, 5, 0, 13}, - {12, 0, 13, 0, 5, 0, 14}, - {7, 0, 0, 0, 5, 0, 14}, - {10, 0, 0, 0, 5, 0, 14}, - {12, 9, 13, 0, 5, 0, 14}, - {13, 0, 0, 0, 5, 0, 14}, - {15, 0, 0, 0, 5, 0, 14}, - {26, 0, 18, 0, 5, 0, 14}, - {23, 0, 10, 0, 5, 0, 14}, - {12, 0, 13, 0, 5, 0, 15}, - {10, 0, 0, 0, 5, 0, 15}, - {7, 0, 0, 0, 5, 0, 15}, - {12, 9, 13, 0, 5, 0, 15}, - {12, 84, 13, 0, 5, 0, 15}, - {12, 91, 13, 0, 5, 0, 15}, - {13, 0, 0, 0, 5, 0, 15}, - {15, 0, 18, 0, 5, 0, 15}, - {26, 0, 0, 0, 5, 0, 15}, - {12, 0, 13, 0, 5, 0, 16}, - {10, 0, 0, 0, 5, 0, 16}, - {7, 0, 0, 0, 5, 0, 16}, - {12, 7, 13, 0, 5, 0, 16}, - {12, 0, 0, 0, 5, 0, 16}, - {12, 9, 13, 0, 5, 0, 16}, - {13, 0, 0, 0, 5, 0, 16}, - {12, 0, 13, 0, 5, 0, 17}, - {10, 0, 0, 0, 5, 0, 17}, - {7, 0, 0, 0, 5, 0, 17}, - {12, 9, 13, 0, 5, 0, 17}, - {13, 0, 0, 0, 5, 0, 17}, - {15, 0, 0, 0, 5, 0, 17}, - {26, 0, 0, 0, 5, 0, 17}, - {10, 0, 0, 0, 5, 0, 18}, - {7, 0, 0, 0, 5, 0, 18}, - {12, 9, 13, 0, 5, 0, 18}, - {12, 0, 13, 0, 5, 0, 18}, - {13, 0, 0, 0, 5, 0, 18}, - {21, 0, 0, 0, 5, 0, 18}, - {7, 0, 0, 0, 5, 0, 19}, - {12, 0, 13, 0, 5, 0, 19}, - {12, 103, 13, 0, 5, 0, 19}, - {12, 9, 13, 0, 5, 0, 19}, - {23, 0, 10, 0, 5, 0, 0}, - {6, 0, 0, 0, 5, 0, 19}, - {12, 107, 13, 0, 5, 0, 19}, - {21, 0, 0, 0, 5, 0, 19}, - {13, 0, 0, 0, 5, 0, 19}, - {7, 0, 0, 0, 5, 0, 20}, - {12, 0, 13, 0, 5, 0, 20}, - {12, 118, 13, 0, 5, 0, 20}, - {6, 0, 0, 0, 5, 0, 20}, - {12, 122, 13, 0, 5, 0, 20}, - {13, 0, 0, 0, 5, 0, 20}, - {7, 0, 0, 0, 5, 0, 21}, - {26, 0, 0, 0, 5, 0, 21}, - {21, 0, 0, 0, 5, 0, 21}, - {12, 220, 13, 0, 5, 0, 21}, - {13, 0, 0, 0, 5, 0, 21}, - {15, 0, 0, 0, 5, 0, 21}, - {12, 216, 13, 0, 5, 0, 21}, - {22, 0, 18, 1, 5, 0, 21}, - {18, 0, 18, 1, 5, 0, 21}, + {6, 0, 0, 0, 5, 23, 12}, + {7, 0, 0, 0, 2, 24, 25}, + {7, 0, 0, 0, 5, 24, 26}, + {7, 0, 0, 0, 5, 24, 27}, + {7, 0, 0, 0, 5, 25, 12}, + {12, 230, 13, 0, 5, 25, 21}, + {21, 0, 0, 0, 5, 25, 12}, + {21, 0, 0, 0, 5, 25, 17}, + {15, 0, 0, 0, 5, 25, 12}, + {26, 0, 18, 0, 5, 25, 12}, + {9, 0, 0, 0, 5, 26, 12}, + {5, 0, 0, 0, 5, 26, 12}, + {17, 0, 18, 0, 5, 27, 17}, + {7, 0, 0, 0, 5, 27, 12}, + {21, 0, 0, 0, 5, 27, 12}, + {29, 0, 17, 0, 5, 28, 17}, + {7, 0, 0, 0, 5, 28, 12}, + {22, 0, 18, 1, 5, 28, 0}, + {18, 0, 18, 1, 5, 28, 1}, + {7, 0, 0, 0, 5, 29, 12}, + {14, 0, 0, 0, 5, 29, 12}, + {7, 0, 0, 0, 5, 41, 12}, + {12, 0, 13, 0, 5, 41, 21}, + {12, 9, 13, 0, 5, 41, 21}, + {7, 0, 0, 0, 5, 42, 12}, + {12, 0, 13, 0, 5, 42, 21}, + {12, 9, 13, 0, 5, 42, 21}, + {7, 0, 0, 0, 5, 43, 12}, + {12, 0, 13, 0, 5, 43, 21}, + {7, 0, 0, 0, 5, 44, 12}, + {12, 0, 13, 0, 5, 44, 21}, + {7, 0, 0, 0, 5, 30, 38}, + {12, 0, 13, 0, 5, 30, 38}, + {10, 0, 0, 0, 5, 30, 38}, + {12, 9, 13, 0, 5, 30, 38}, + {21, 0, 0, 0, 5, 30, 17}, + {21, 0, 0, 0, 5, 30, 5}, + {6, 0, 0, 0, 5, 30, 38}, + {21, 0, 0, 0, 5, 30, 12}, + {23, 0, 10, 0, 5, 30, 9}, + {12, 230, 13, 0, 5, 30, 38}, + {13, 0, 0, 0, 5, 30, 11}, + {15, 0, 18, 0, 5, 30, 12}, + {21, 0, 18, 0, 5, 31, 12}, + {21, 0, 18, 0, 5, 0, 6}, + {21, 0, 18, 0, 5, 31, 17}, + {21, 0, 18, 0, 5, 0, 17}, + {17, 0, 18, 0, 5, 31, 18}, + {21, 0, 18, 0, 5, 31, 6}, + {12, 0, 13, 0, 5, 31, 21}, + {1, 0, 14, 0, 5, 31, 4}, + {13, 0, 0, 0, 5, 31, 11}, + {7, 0, 0, 0, 5, 31, 12}, + {6, 0, 0, 0, 5, 31, 12}, + {12, 228, 13, 0, 5, 31, 21}, + {7, 0, 0, 0, 5, 45, 12}, + {12, 0, 13, 0, 5, 45, 21}, + {10, 0, 0, 0, 5, 45, 21}, + {12, 222, 13, 0, 5, 45, 21}, + {12, 230, 13, 0, 5, 45, 21}, + {12, 220, 13, 0, 5, 45, 21}, + {26, 0, 18, 0, 5, 45, 12}, + {21, 0, 18, 0, 5, 45, 6}, + {13, 0, 0, 0, 5, 45, 11}, + {7, 0, 0, 0, 5, 46, 38}, + {7, 0, 0, 0, 5, 55, 38}, + {13, 0, 0, 0, 5, 55, 11}, + {15, 0, 0, 0, 5, 55, 38}, + {26, 0, 18, 0, 5, 55, 38}, + {26, 0, 18, 0, 5, 30, 12}, + {7, 0, 0, 0, 5, 53, 12}, + {12, 230, 13, 0, 5, 53, 21}, + {12, 220, 13, 0, 5, 53, 21}, + {10, 0, 0, 0, 5, 53, 21}, + {12, 0, 13, 0, 5, 53, 21}, + {21, 0, 0, 0, 5, 53, 12}, + {7, 0, 0, 0, 5, 77, 38}, + {10, 0, 0, 0, 5, 77, 38}, + {12, 0, 13, 0, 5, 77, 38}, + {12, 9, 13, 0, 5, 77, 38}, + {12, 230, 13, 0, 5, 77, 38}, + {12, 220, 13, 0, 5, 77, 21}, + {13, 0, 0, 0, 5, 77, 11}, + {21, 0, 0, 0, 5, 77, 38}, + {6, 0, 0, 0, 5, 77, 38}, + {11, 0, 13, 0, 5, 40, 21}, + {12, 0, 13, 0, 5, 61, 21}, + {10, 0, 0, 0, 5, 61, 21}, + {7, 0, 0, 0, 5, 61, 12}, + {12, 7, 13, 0, 5, 61, 21}, + {10, 9, 0, 0, 5, 61, 21}, + {13, 0, 0, 0, 5, 61, 11}, + {21, 0, 0, 0, 5, 61, 17}, + {21, 0, 0, 0, 5, 61, 12}, + {26, 0, 0, 0, 5, 61, 12}, + {12, 230, 13, 0, 5, 61, 21}, + {12, 220, 13, 0, 5, 61, 21}, + {12, 0, 13, 0, 5, 66, 21}, + {10, 0, 0, 0, 5, 66, 21}, + {7, 0, 0, 0, 5, 66, 12}, + {10, 9, 0, 0, 5, 66, 21}, + {12, 9, 13, 0, 5, 66, 21}, + {13, 0, 0, 0, 5, 66, 11}, + {7, 0, 0, 0, 5, 92, 12}, + {12, 7, 13, 0, 5, 92, 21}, + {10, 0, 0, 0, 5, 92, 21}, + {12, 0, 13, 0, 5, 92, 21}, + {10, 9, 0, 0, 5, 92, 21}, + {21, 0, 0, 0, 5, 92, 12}, + {7, 0, 0, 0, 5, 67, 12}, + {10, 0, 0, 0, 5, 67, 21}, + {12, 0, 13, 0, 5, 67, 21}, + {12, 7, 13, 0, 5, 67, 21}, + {21, 0, 0, 0, 5, 67, 17}, + {13, 0, 0, 0, 5, 67, 11}, + {13, 0, 0, 0, 5, 68, 11}, + {7, 0, 0, 0, 5, 68, 12}, + {6, 0, 0, 0, 5, 68, 12}, + {21, 0, 0, 0, 5, 68, 17}, + {21, 0, 0, 0, 5, 66, 12}, + {12, 1, 13, 0, 5, 40, 21}, {10, 0, 0, 0, 5, 0, 21}, - {12, 129, 13, 0, 5, 0, 21}, - {12, 130, 13, 0, 5, 0, 21}, - {12, 0, 13, 0, 5, 0, 21}, - {12, 132, 13, 0, 5, 0, 21}, - {12, 230, 13, 0, 5, 0, 21}, - {12, 9, 13, 0, 5, 0, 21}, - {26, 0, 0, 0, 5, 0, 0}, - {7, 0, 0, 0, 5, 0, 22}, - {10, 0, 0, 0, 5, 0, 22}, - {12, 0, 13, 0, 5, 0, 22}, - {12, 7, 13, 0, 5, 0, 22}, - {12, 9, 13, 0, 5, 0, 22}, - {13, 0, 0, 0, 5, 0, 22}, - {21, 0, 0, 0, 5, 0, 22}, - {12, 220, 13, 0, 5, 0, 22}, - {26, 0, 0, 0, 5, 0, 22}, - {9, 0, 0, 0, 5, 0, 23}, - {7, 0, 0, 0, 5, 0, 23}, - {6, 0, 0, 0, 5, 0, 23}, - {7, 0, 0, 0, 2, 0, 24}, - {7, 0, 0, 0, 5, 0, 24}, - {7, 0, 0, 0, 5, 0, 25}, - {12, 230, 13, 0, 5, 0, 25}, - {21, 0, 0, 0, 5, 0, 25}, - {15, 0, 0, 0, 5, 0, 25}, - {26, 0, 18, 0, 5, 0, 25}, - {9, 0, 0, 0, 5, 0, 26}, - {5, 0, 0, 0, 5, 0, 26}, - {17, 0, 18, 0, 5, 0, 27}, - {7, 0, 0, 0, 5, 0, 27}, - {21, 0, 0, 0, 5, 0, 27}, - {29, 0, 17, 0, 5, 0, 28}, - {7, 0, 0, 0, 5, 0, 28}, - {22, 0, 18, 1, 5, 0, 28}, - {18, 0, 18, 1, 5, 0, 28}, - {7, 0, 0, 0, 5, 0, 29}, - {14, 0, 0, 0, 5, 0, 29}, - {7, 0, 0, 0, 5, 0, 41}, - {12, 0, 13, 0, 5, 0, 41}, - {12, 9, 13, 0, 5, 0, 41}, - {7, 0, 0, 0, 5, 0, 42}, - {12, 0, 13, 0, 5, 0, 42}, - {12, 9, 13, 0, 5, 0, 42}, - {7, 0, 0, 0, 5, 0, 43}, - {12, 0, 13, 0, 5, 0, 43}, - {7, 0, 0, 0, 5, 0, 44}, - {12, 0, 13, 0, 5, 0, 44}, - {7, 0, 0, 0, 5, 0, 30}, - {12, 0, 13, 0, 5, 0, 30}, - {10, 0, 0, 0, 5, 0, 30}, - {12, 9, 13, 0, 5, 0, 30}, - {21, 0, 0, 0, 5, 0, 30}, - {6, 0, 0, 0, 5, 0, 30}, - {23, 0, 10, 0, 5, 0, 30}, - {12, 230, 13, 0, 5, 0, 30}, - {13, 0, 0, 0, 5, 0, 30}, - {15, 0, 18, 0, 5, 0, 30}, - {21, 0, 18, 0, 5, 0, 31}, - {17, 0, 18, 0, 5, 0, 31}, - {12, 0, 13, 0, 5, 0, 31}, - {1, 0, 14, 0, 5, 0, 31}, - {13, 0, 0, 0, 5, 0, 31}, - {7, 0, 0, 0, 5, 0, 31}, - {6, 0, 0, 0, 5, 0, 31}, - {12, 228, 13, 0, 5, 0, 31}, - {7, 0, 0, 0, 5, 0, 45}, - {12, 0, 13, 0, 5, 0, 45}, - {10, 0, 0, 0, 5, 0, 45}, - {12, 222, 13, 0, 5, 0, 45}, - {12, 230, 13, 0, 5, 0, 45}, - {12, 220, 13, 0, 5, 0, 45}, - {26, 0, 18, 0, 5, 0, 45}, - {21, 0, 18, 0, 5, 0, 45}, - {13, 0, 0, 0, 5, 0, 45}, - {7, 0, 0, 0, 5, 0, 46}, - {7, 0, 0, 0, 5, 0, 55}, - {13, 0, 0, 0, 5, 0, 55}, - {15, 0, 0, 0, 5, 0, 55}, - {26, 0, 18, 0, 5, 0, 55}, - {26, 0, 18, 0, 5, 0, 30}, - {7, 0, 0, 0, 5, 0, 53}, - {12, 230, 13, 0, 5, 0, 53}, - {12, 220, 13, 0, 5, 0, 53}, - {10, 0, 0, 0, 5, 0, 53}, - {12, 0, 13, 0, 5, 0, 53}, - {21, 0, 0, 0, 5, 0, 53}, - {7, 0, 0, 0, 5, 0, 77}, - {10, 0, 0, 0, 5, 0, 77}, - {12, 0, 13, 0, 5, 0, 77}, - {12, 9, 13, 0, 5, 0, 77}, - {12, 230, 13, 0, 5, 0, 77}, - {12, 220, 13, 0, 5, 0, 77}, - {13, 0, 0, 0, 5, 0, 77}, - {21, 0, 0, 0, 5, 0, 77}, - {6, 0, 0, 0, 5, 0, 77}, - {11, 0, 13, 0, 5, 0, 40}, - {12, 0, 13, 0, 5, 0, 61}, - {10, 0, 0, 0, 5, 0, 61}, - {7, 0, 0, 0, 5, 0, 61}, - {12, 7, 13, 0, 5, 0, 61}, - {10, 9, 0, 0, 5, 0, 61}, - {13, 0, 0, 0, 5, 0, 61}, - {21, 0, 0, 0, 5, 0, 61}, - {26, 0, 0, 0, 5, 0, 61}, - {12, 230, 13, 0, 5, 0, 61}, - {12, 220, 13, 0, 5, 0, 61}, - {12, 0, 13, 0, 5, 0, 66}, - {10, 0, 0, 0, 5, 0, 66}, - {7, 0, 0, 0, 5, 0, 66}, - {10, 9, 0, 0, 5, 0, 66}, - {12, 9, 13, 0, 5, 0, 66}, - {13, 0, 0, 0, 5, 0, 66}, - {7, 0, 0, 0, 5, 0, 92}, - {12, 7, 13, 0, 5, 0, 92}, - {10, 0, 0, 0, 5, 0, 92}, - {12, 0, 13, 0, 5, 0, 92}, - {10, 9, 0, 0, 5, 0, 92}, - {21, 0, 0, 0, 5, 0, 92}, - {7, 0, 0, 0, 5, 0, 67}, - {10, 0, 0, 0, 5, 0, 67}, - {12, 0, 13, 0, 5, 0, 67}, - {12, 7, 13, 0, 5, 0, 67}, - {21, 0, 0, 0, 5, 0, 67}, - {13, 0, 0, 0, 5, 0, 67}, - {13, 0, 0, 0, 5, 0, 68}, - {7, 0, 0, 0, 5, 0, 68}, - {6, 0, 0, 0, 5, 0, 68}, - {21, 0, 0, 0, 5, 0, 68}, - {21, 0, 0, 0, 5, 0, 66}, - {12, 1, 13, 0, 5, 0, 40}, - {10, 0, 0, 0, 5, 0, 0}, - {7, 0, 0, 0, 5, 0, 0}, - {6, 0, 0, 0, 5, 0, 3}, - {12, 234, 13, 0, 5, 0, 40}, - {12, 214, 13, 0, 5, 0, 40}, - {12, 202, 13, 0, 5, 0, 40}, - {12, 233, 13, 0, 5, 0, 40}, - {8, 0, 0, 0, 5, 0, 2}, - {29, 0, 17, 0, 5, 0, 0}, - {1, 0, 14, 0, 5, 0, 0}, - {1, 0, 14, 0, 5, 0, 40}, - {1, 0, 0, 0, 5, 0, 0}, - {1, 0, 3, 0, 5, 0, 0}, - {17, 0, 18, 0, 4, 0, 0}, - {17, 0, 18, 0, 5, 0, 0}, - {20, 0, 18, 0, 4, 0, 0}, - {19, 0, 18, 0, 4, 0, 0}, + {7, 0, 0, 0, 5, 0, 12}, + {6, 0, 0, 0, 5, 3, 12}, + {12, 234, 13, 0, 5, 40, 21}, + {12, 214, 13, 0, 5, 40, 21}, + {12, 202, 13, 0, 5, 40, 21}, + {12, 233, 13, 0, 5, 40, 21}, + {8, 0, 0, 0, 5, 2, 12}, + {24, 0, 18, 0, 5, 2, 18}, + {29, 0, 17, 0, 5, 0, 17}, + {29, 0, 17, 0, 5, 0, 4}, + {1, 0, 14, 0, 5, 0, 20}, + {1, 0, 14, 0, 5, 40, 21}, + {1, 0, 14, 0, 5, 40, 41}, + {1, 0, 0, 0, 5, 0, 21}, + {1, 0, 3, 0, 5, 0, 21}, + {17, 0, 18, 0, 4, 0, 17}, + {17, 0, 18, 0, 5, 0, 4}, + {17, 0, 18, 0, 5, 0, 17}, + {17, 0, 18, 0, 4, 0, 19}, + {17, 0, 18, 0, 4, 0, 29}, + {20, 0, 18, 0, 4, 0, 3}, + {19, 0, 18, 0, 4, 0, 3}, {22, 0, 18, 0, 5, 0, 0}, - {20, 0, 18, 0, 5, 0, 0}, - {27, 0, 17, 0, 5, 0, 0}, - {28, 0, 15, 0, 5, 0, 0}, - {1, 0, 1, 0, 5, 0, 0}, - {1, 0, 5, 0, 5, 0, 0}, - {1, 0, 7, 0, 5, 0, 0}, - {1, 0, 2, 0, 5, 0, 0}, - {1, 0, 6, 0, 5, 0, 0}, - {21, 0, 10, 0, 4, 0, 0}, - {21, 0, 10, 0, 5, 0, 0}, - {16, 0, 18, 0, 5, 0, 0}, - {25, 0, 12, 0, 5, 0, 0}, + {20, 0, 18, 0, 5, 0, 3}, + {21, 0, 18, 0, 4, 0, 12}, + {21, 0, 18, 0, 4, 0, 15}, + {21, 0, 18, 0, 4, 0, 17}, + {27, 0, 17, 0, 5, 0, 30}, + {28, 0, 15, 0, 5, 0, 30}, + {1, 0, 1, 0, 5, 0, 21}, + {1, 0, 5, 0, 5, 0, 21}, + {1, 0, 7, 0, 5, 0, 21}, + {1, 0, 2, 0, 5, 0, 21}, + {1, 0, 6, 0, 5, 0, 21}, + {21, 0, 10, 0, 4, 0, 10}, + {21, 0, 10, 0, 5, 0, 10}, + {21, 0, 18, 0, 4, 0, 10}, + {21, 0, 18, 0, 5, 0, 10}, + {21, 0, 18, 0, 5, 0, 5}, + {16, 0, 18, 0, 5, 0, 12}, + {25, 0, 12, 0, 5, 0, 8}, {22, 0, 18, 1, 5, 0, 0}, - {18, 0, 18, 1, 5, 0, 0}, - {25, 0, 18, 0, 5, 0, 0}, - {1, 0, 19, 0, 5, 0, 0}, - {1, 0, 20, 0, 5, 0, 0}, - {1, 0, 21, 0, 5, 0, 0}, - {1, 0, 22, 0, 5, 0, 0}, - {15, 0, 8, 0, 5, 0, 0}, - {25, 0, 9, 0, 5, 0, 0}, - {6, 0, 0, 0, 4, 0, 1}, - {23, 0, 10, 0, 1, 0, 0}, - {9, 0, 0, 0, 5, 0, 0}, - {5, 0, 0, 0, 4, 0, 0}, - {26, 0, 10, 0, 5, 0, 0}, - {25, 0, 18, 1, 5, 0, 0}, - {15, 0, 18, 0, 5, 0, 0}, - {14, 0, 0, 0, 4, 0, 1}, - {14, 0, 0, 0, 5, 0, 1}, - {25, 0, 18, 1, 4, 0, 0}, - {25, 0, 10, 0, 5, 0, 0}, + {18, 0, 18, 1, 5, 0, 1}, + {25, 0, 18, 0, 5, 0, 12}, + {1, 0, 14, 0, 5, 0, 22}, + {1, 0, 14, 0, 5, 0, 12}, + {1, 0, 19, 0, 5, 0, 21}, + {1, 0, 20, 0, 5, 0, 21}, + {1, 0, 21, 0, 5, 0, 21}, + {1, 0, 22, 0, 5, 0, 21}, + {1, 0, 14, 0, 5, 0, 21}, + {15, 0, 8, 0, 5, 0, 12}, + {25, 0, 9, 0, 5, 0, 12}, + {6, 0, 0, 0, 4, 1, 29}, + {23, 0, 10, 0, 5, 0, 10}, + {23, 0, 10, 0, 1, 0, 9}, + {2, 0, 18, 0, 5, 102, 9}, + {9, 0, 0, 0, 5, 0, 12}, + {26, 0, 18, 0, 4, 0, 10}, + {26, 0, 18, 0, 4, 0, 29}, + {5, 0, 0, 0, 4, 0, 29}, + {26, 0, 18, 0, 4, 0, 9}, + {9, 0, 0, 0, 4, 1, 29}, + {26, 0, 10, 0, 5, 0, 12}, + {25, 0, 18, 1, 5, 0, 12}, + {15, 0, 18, 0, 5, 0, 12}, + {15, 0, 18, 0, 4, 0, 12}, + {15, 0, 18, 0, 5, 0, 29}, + {14, 0, 0, 0, 4, 1, 29}, + {14, 0, 0, 0, 5, 1, 12}, + {25, 0, 18, 1, 4, 0, 29}, + {25, 0, 9, 0, 5, 0, 9}, + {25, 0, 10, 0, 5, 0, 9}, + {25, 0, 18, 0, 5, 0, 15}, + {26, 0, 18, 0, 2, 0, 14}, {22, 0, 18, 1, 2, 0, 0}, - {18, 0, 18, 1, 2, 0, 0}, - {26, 0, 0, 0, 4, 0, 0}, - {26, 0, 0, 0, 5, 0, 52}, - {9, 0, 0, 0, 5, 0, 56}, - {5, 0, 0, 0, 5, 0, 56}, - {26, 0, 18, 0, 5, 0, 54}, - {12, 230, 13, 0, 5, 0, 54}, - {21, 0, 18, 0, 5, 0, 54}, - {15, 0, 18, 0, 5, 0, 54}, - {5, 0, 0, 0, 5, 0, 23}, - {7, 0, 0, 0, 5, 0, 57}, - {6, 0, 0, 0, 5, 0, 57}, - {21, 0, 0, 0, 5, 0, 57}, - {12, 9, 13, 0, 5, 0, 57}, - {26, 0, 18, 0, 2, 0, 35}, - {26, 0, 18, 0, 2, 0, 0}, - {29, 0, 17, 0, 0, 0, 0}, - {21, 0, 18, 0, 2, 0, 0}, - {6, 0, 0, 0, 2, 0, 35}, - {7, 0, 0, 0, 2, 0, 0}, - {14, 0, 0, 0, 2, 0, 35}, - {17, 0, 18, 0, 2, 0, 0}, - {22, 0, 18, 0, 2, 0, 0}, - {18, 0, 18, 0, 2, 0, 0}, - {12, 218, 13, 0, 2, 0, 40}, - {12, 228, 13, 0, 2, 0, 40}, - {12, 232, 13, 0, 2, 0, 40}, - {12, 222, 13, 0, 2, 0, 40}, - {10, 224, 0, 0, 2, 0, 24}, - {6, 0, 0, 0, 2, 0, 0}, - {7, 0, 0, 0, 2, 0, 32}, - {12, 8, 13, 0, 2, 0, 40}, - {24, 0, 18, 0, 2, 0, 0}, - {6, 0, 0, 0, 2, 0, 32}, - {7, 0, 0, 0, 2, 0, 33}, - {6, 0, 0, 0, 2, 0, 33}, - {7, 0, 0, 0, 2, 0, 34}, - {26, 0, 0, 0, 2, 0, 0}, - {15, 0, 0, 0, 2, 0, 0}, - {26, 0, 0, 0, 2, 0, 24}, - {26, 0, 18, 0, 2, 0, 24}, - {15, 0, 0, 0, 4, 0, 0}, - {15, 0, 18, 0, 2, 0, 0}, - {26, 0, 0, 0, 2, 0, 33}, - {7, 0, 0, 0, 2, 0, 35}, - {2, 0, 18, 0, 2, 0, 102}, - {7, 0, 0, 0, 2, 0, 36}, - {6, 0, 0, 0, 2, 0, 36}, - {26, 0, 18, 0, 2, 0, 36}, - {7, 0, 0, 0, 5, 0, 82}, - {6, 0, 0, 0, 5, 0, 82}, - {21, 0, 0, 0, 5, 0, 82}, - {7, 0, 0, 0, 5, 0, 69}, - {6, 0, 0, 0, 5, 0, 69}, - {21, 0, 18, 0, 5, 0, 69}, - {13, 0, 0, 0, 5, 0, 69}, - {7, 0, 0, 0, 5, 0, 3}, + {18, 0, 18, 1, 2, 0, 1}, + {26, 0, 18, 0, 2, 0, 12}, + {26, 0, 18, 0, 5, 0, 14}, + {26, 0, 0, 0, 4, 0, 29}, + {26, 0, 18, 0, 5, 0, 29}, + {25, 0, 18, 0, 2, 0, 12}, + {26, 0, 18, 0, 4, 0, 14}, + {26, 0, 18, 0, 5, 0, 41}, + {26, 0, 18, 0, 4, 0, 41}, + {26, 0, 18, 0, 2, 0, 41}, + {26, 0, 18, 0, 2, 0, 29}, + {26, 0, 18, 0, 5, 0, 3}, + {26, 0, 18, 0, 5, 0, 6}, + {26, 0, 0, 0, 5, 52, 12}, + {9, 0, 0, 0, 5, 56, 12}, + {5, 0, 0, 0, 5, 56, 12}, + {26, 0, 18, 0, 5, 54, 12}, + {12, 230, 13, 0, 5, 54, 21}, + {21, 0, 18, 0, 5, 54, 6}, + {21, 0, 18, 0, 5, 54, 17}, + {15, 0, 18, 0, 5, 54, 12}, + {5, 0, 0, 0, 5, 23, 12}, + {7, 0, 0, 0, 5, 57, 12}, + {6, 0, 0, 0, 5, 57, 12}, + {21, 0, 0, 0, 5, 57, 17}, + {12, 9, 13, 0, 5, 57, 21}, {21, 0, 18, 0, 5, 0, 3}, - {6, 0, 18, 0, 5, 0, 3}, - {7, 0, 0, 0, 5, 0, 83}, - {14, 0, 0, 0, 5, 0, 83}, - {12, 230, 13, 0, 5, 0, 83}, - {21, 0, 0, 0, 5, 0, 83}, - {24, 0, 0, 0, 5, 0, 0}, - {7, 0, 0, 0, 5, 0, 58}, - {12, 0, 13, 0, 5, 0, 58}, - {12, 9, 13, 0, 5, 0, 58}, - {10, 0, 0, 0, 5, 0, 58}, - {26, 0, 18, 0, 5, 0, 58}, - {15, 0, 0, 0, 5, 0, 0}, - {7, 0, 0, 0, 5, 0, 64}, - {21, 0, 18, 0, 5, 0, 64}, - {10, 0, 0, 0, 5, 0, 70}, - {7, 0, 0, 0, 5, 0, 70}, - {12, 9, 13, 0, 5, 0, 70}, - {21, 0, 0, 0, 5, 0, 70}, - {13, 0, 0, 0, 5, 0, 70}, - {13, 0, 0, 0, 5, 0, 71}, - {7, 0, 0, 0, 5, 0, 71}, - {12, 0, 13, 0, 5, 0, 71}, - {12, 220, 13, 0, 5, 0, 71}, - {21, 0, 0, 0, 5, 0, 71}, - {7, 0, 0, 0, 5, 0, 72}, - {12, 0, 13, 0, 5, 0, 72}, - {10, 0, 0, 0, 5, 0, 72}, - {10, 9, 0, 0, 5, 0, 72}, - {21, 0, 0, 0, 5, 0, 72}, - {12, 0, 13, 0, 5, 0, 84}, - {10, 0, 0, 0, 5, 0, 84}, - {7, 0, 0, 0, 5, 0, 84}, - {12, 7, 13, 0, 5, 0, 84}, - {10, 9, 0, 0, 5, 0, 84}, - {21, 0, 0, 0, 5, 0, 84}, - {13, 0, 0, 0, 5, 0, 84}, - {6, 0, 0, 0, 5, 0, 22}, - {7, 0, 0, 0, 5, 0, 76}, - {12, 0, 13, 0, 5, 0, 76}, - {10, 0, 0, 0, 5, 0, 76}, - {13, 0, 0, 0, 5, 0, 76}, - {21, 0, 0, 0, 5, 0, 76}, - {7, 0, 0, 0, 5, 0, 78}, - {12, 230, 13, 0, 5, 0, 78}, - {12, 220, 13, 0, 5, 0, 78}, - {6, 0, 0, 0, 5, 0, 78}, - {21, 0, 0, 0, 5, 0, 78}, - {7, 0, 0, 0, 5, 0, 85}, - {10, 0, 0, 0, 5, 0, 85}, - {12, 0, 13, 0, 5, 0, 85}, - {21, 0, 0, 0, 5, 0, 85}, - {6, 0, 0, 0, 5, 0, 85}, - {12, 9, 13, 0, 5, 0, 85}, - {13, 0, 0, 0, 5, 0, 85}, - {4, 0, 0, 0, 5, 0, 102}, - {3, 0, 0, 0, 4, 0, 102}, - {12, 26, 13, 0, 5, 0, 5}, - {25, 0, 9, 0, 5, 0, 5}, - {24, 0, 4, 0, 5, 0, 6}, - {18, 0, 18, 0, 5, 0, 0}, - {16, 0, 18, 0, 2, 0, 0}, - {21, 0, 12, 0, 2, 0, 0}, - {21, 0, 10, 0, 2, 0, 0}, - {25, 0, 9, 0, 2, 0, 0}, - {17, 0, 9, 0, 2, 0, 0}, - {25, 0, 18, 1, 2, 0, 0}, - {25, 0, 18, 0, 2, 0, 0}, - {23, 0, 10, 0, 2, 0, 0}, - {21, 0, 18, 0, 0, 0, 0}, - {21, 0, 10, 0, 0, 0, 0}, - {23, 0, 10, 0, 0, 0, 0}, + {21, 0, 18, 0, 5, 0, 0}, + {17, 0, 18, 0, 5, 0, 12}, + {17, 0, 18, 0, 5, 0, 19}, + {26, 0, 18, 0, 2, 35, 14}, + {29, 0, 17, 0, 0, 0, 17}, + {21, 0, 18, 0, 2, 0, 1}, + {21, 0, 18, 0, 2, 0, 14}, + {6, 0, 0, 0, 2, 35, 5}, + {7, 0, 0, 0, 2, 0, 14}, + {14, 0, 0, 0, 2, 35, 14}, + {17, 0, 18, 0, 2, 0, 5}, + {22, 0, 18, 0, 2, 0, 0}, + {18, 0, 18, 0, 2, 0, 1}, + {12, 218, 13, 0, 2, 40, 21}, + {12, 228, 13, 0, 2, 40, 21}, + {12, 232, 13, 0, 2, 40, 21}, + {12, 222, 13, 0, 2, 40, 21}, + {10, 224, 0, 0, 2, 24, 21}, + {17, 0, 18, 0, 2, 0, 14}, + {6, 0, 0, 0, 2, 0, 14}, + {6, 0, 0, 0, 2, 0, 21}, + {7, 0, 0, 0, 2, 0, 5}, + {7, 0, 0, 0, 2, 32, 32}, + {7, 0, 0, 0, 2, 32, 14}, + {12, 8, 13, 0, 2, 40, 21}, + {24, 0, 18, 0, 2, 0, 5}, + {6, 0, 0, 0, 2, 32, 5}, + {7, 0, 0, 0, 2, 33, 32}, + {7, 0, 0, 0, 2, 33, 14}, + {21, 0, 18, 0, 2, 0, 5}, + {6, 0, 0, 0, 2, 0, 32}, + {6, 0, 0, 0, 2, 33, 5}, + {7, 0, 0, 0, 2, 34, 14}, + {7, 0, 0, 0, 2, 24, 14}, + {26, 0, 0, 0, 2, 0, 14}, + {15, 0, 0, 0, 2, 0, 14}, + {26, 0, 0, 0, 2, 24, 14}, + {26, 0, 18, 0, 2, 24, 14}, + {15, 0, 0, 0, 4, 0, 29}, + {15, 0, 18, 0, 2, 0, 14}, + {26, 0, 0, 0, 2, 33, 14}, + {7, 0, 0, 0, 2, 35, 14}, + {2, 0, 18, 0, 2, 102, 14}, + {7, 0, 0, 0, 2, 36, 14}, + {6, 0, 0, 0, 2, 36, 5}, + {26, 0, 18, 0, 2, 36, 14}, + {7, 0, 0, 0, 5, 82, 12}, + {6, 0, 0, 0, 5, 82, 12}, + {21, 0, 0, 0, 5, 82, 17}, + {7, 0, 0, 0, 5, 69, 12}, + {6, 0, 0, 0, 5, 69, 12}, + {21, 0, 18, 0, 5, 69, 17}, + {21, 0, 18, 0, 5, 69, 6}, + {13, 0, 0, 0, 5, 69, 11}, + {7, 0, 0, 0, 5, 3, 12}, + {21, 0, 18, 0, 5, 3, 12}, + {6, 0, 18, 0, 5, 3, 12}, + {7, 0, 0, 0, 5, 83, 12}, + {14, 0, 0, 0, 5, 83, 12}, + {12, 230, 13, 0, 5, 83, 21}, + {21, 0, 0, 0, 5, 83, 12}, + {21, 0, 0, 0, 5, 83, 17}, + {24, 0, 0, 0, 5, 0, 12}, + {7, 0, 0, 0, 5, 58, 12}, + {12, 0, 13, 0, 5, 58, 21}, + {12, 9, 13, 0, 5, 58, 21}, + {10, 0, 0, 0, 5, 58, 21}, + {26, 0, 18, 0, 5, 58, 12}, + {15, 0, 0, 0, 5, 0, 12}, + {7, 0, 0, 0, 5, 64, 12}, + {21, 0, 18, 0, 5, 64, 18}, + {21, 0, 18, 0, 5, 64, 6}, + {10, 0, 0, 0, 5, 70, 21}, + {7, 0, 0, 0, 5, 70, 12}, + {12, 9, 13, 0, 5, 70, 21}, + {12, 0, 13, 0, 5, 70, 21}, + {21, 0, 0, 0, 5, 70, 17}, + {13, 0, 0, 0, 5, 70, 11}, + {21, 0, 0, 0, 5, 9, 18}, + {13, 0, 0, 0, 5, 71, 11}, + {7, 0, 0, 0, 5, 71, 12}, + {12, 0, 13, 0, 5, 71, 21}, + {12, 220, 13, 0, 5, 71, 21}, + {21, 0, 0, 0, 5, 71, 17}, + {7, 0, 0, 0, 5, 72, 12}, + {12, 0, 13, 0, 5, 72, 21}, + {10, 0, 0, 0, 5, 72, 21}, + {10, 9, 0, 0, 5, 72, 21}, + {21, 0, 0, 0, 5, 72, 12}, + {12, 0, 13, 0, 5, 84, 21}, + {10, 0, 0, 0, 5, 84, 21}, + {7, 0, 0, 0, 5, 84, 12}, + {12, 7, 13, 0, 5, 84, 21}, + {10, 9, 0, 0, 5, 84, 21}, + {21, 0, 0, 0, 5, 84, 12}, + {21, 0, 0, 0, 5, 84, 17}, + {13, 0, 0, 0, 5, 84, 11}, + {6, 0, 0, 0, 5, 22, 38}, + {7, 0, 0, 0, 5, 76, 12}, + {12, 0, 13, 0, 5, 76, 21}, + {10, 0, 0, 0, 5, 76, 21}, + {13, 0, 0, 0, 5, 76, 11}, + {21, 0, 0, 0, 5, 76, 12}, + {21, 0, 0, 0, 5, 76, 17}, + {7, 0, 0, 0, 5, 78, 38}, + {12, 230, 13, 0, 5, 78, 38}, + {12, 220, 13, 0, 5, 78, 38}, + {6, 0, 0, 0, 5, 78, 38}, + {21, 0, 0, 0, 5, 78, 38}, + {7, 0, 0, 0, 5, 85, 12}, + {10, 0, 0, 0, 5, 85, 21}, + {12, 0, 13, 0, 5, 85, 21}, + {21, 0, 0, 0, 5, 85, 17}, + {6, 0, 0, 0, 5, 85, 12}, + {12, 9, 13, 0, 5, 85, 21}, + {13, 0, 0, 0, 5, 85, 11}, + {7, 0, 0, 0, 2, 24, 23}, + {7, 0, 0, 0, 2, 24, 24}, + {4, 0, 0, 0, 5, 102, 39}, + {3, 0, 0, 0, 4, 102, 41}, + {12, 26, 13, 0, 5, 5, 21}, + {25, 0, 9, 0, 5, 5, 12}, + {24, 0, 4, 0, 5, 6, 12}, + {18, 0, 18, 0, 5, 0, 1}, + {12, 0, 13, 0, 4, 40, 21}, + {21, 0, 18, 0, 2, 0, 8}, + {21, 0, 18, 0, 2, 0, 6}, + {21, 0, 18, 0, 2, 0, 15}, + {16, 0, 18, 0, 2, 0, 14}, + {21, 0, 12, 0, 2, 0, 1}, + {21, 0, 12, 0, 2, 0, 5}, + {21, 0, 10, 0, 2, 0, 14}, + {25, 0, 9, 0, 2, 0, 14}, + {17, 0, 9, 0, 2, 0, 14}, + {25, 0, 18, 1, 2, 0, 14}, + {25, 0, 18, 0, 2, 0, 14}, + {23, 0, 10, 0, 2, 0, 9}, + {21, 0, 10, 0, 2, 0, 10}, + {21, 0, 18, 0, 0, 0, 6}, + {21, 0, 18, 0, 0, 0, 14}, + {21, 0, 10, 0, 0, 0, 14}, + {23, 0, 10, 0, 0, 0, 9}, + {21, 0, 10, 0, 0, 0, 10}, {22, 0, 18, 1, 0, 0, 0}, - {18, 0, 18, 1, 0, 0, 0}, - {25, 0, 9, 0, 0, 0, 0}, - {21, 0, 12, 0, 0, 0, 0}, - {17, 0, 9, 0, 0, 0, 0}, - {13, 0, 8, 0, 0, 0, 0}, - {25, 0, 18, 1, 0, 0, 0}, - {25, 0, 18, 0, 0, 0, 0}, - {9, 0, 0, 0, 0, 0, 1}, - {24, 0, 18, 0, 0, 0, 0}, - {16, 0, 18, 0, 0, 0, 0}, - {5, 0, 0, 0, 0, 0, 1}, - {21, 0, 18, 0, 1, 0, 0}, + {18, 0, 18, 1, 0, 0, 1}, + {25, 0, 9, 0, 0, 0, 14}, + {21, 0, 12, 0, 0, 0, 1}, + {17, 0, 9, 0, 0, 0, 14}, + {21, 0, 12, 0, 0, 0, 14}, + {13, 0, 8, 0, 0, 0, 14}, + {21, 0, 12, 0, 0, 0, 5}, + {21, 0, 18, 0, 0, 0, 5}, + {25, 0, 18, 1, 0, 0, 14}, + {25, 0, 18, 0, 0, 0, 14}, + {9, 0, 0, 0, 0, 1, 14}, + {24, 0, 18, 0, 0, 0, 14}, + {16, 0, 18, 0, 0, 0, 14}, + {5, 0, 0, 0, 0, 1, 14}, + {21, 0, 18, 0, 1, 0, 1}, {22, 0, 18, 1, 1, 0, 0}, - {18, 0, 18, 1, 1, 0, 0}, - {7, 0, 0, 0, 1, 0, 33}, - {6, 0, 0, 0, 1, 0, 0}, - {7, 0, 0, 0, 1, 0, 24}, - {26, 0, 18, 0, 0, 0, 0}, - {26, 0, 18, 0, 1, 0, 0}, - {25, 0, 18, 0, 1, 0, 0}, - {1, 0, 18, 0, 5, 0, 0}, - {7, 0, 0, 0, 5, 0, 47}, - {14, 0, 18, 0, 5, 0, 2}, - {15, 0, 18, 0, 5, 0, 2}, - {26, 0, 18, 0, 5, 0, 2}, - {7, 0, 0, 0, 5, 0, 73}, - {7, 0, 0, 0, 5, 0, 74}, - {7, 0, 0, 0, 5, 0, 37}, - {15, 0, 0, 0, 5, 0, 37}, - {7, 0, 0, 0, 5, 0, 38}, - {14, 0, 0, 0, 5, 0, 38}, - {7, 0, 0, 0, 5, 0, 118}, - {12, 230, 13, 0, 5, 0, 118}, - {7, 0, 0, 0, 5, 0, 48}, - {21, 0, 0, 0, 5, 0, 48}, - {7, 0, 0, 0, 5, 0, 59}, - {21, 0, 0, 0, 5, 0, 59}, - {14, 0, 0, 0, 5, 0, 59}, - {9, 0, 0, 0, 5, 0, 39}, - {5, 0, 0, 0, 5, 0, 39}, - {7, 0, 0, 0, 5, 0, 49}, - {7, 0, 0, 0, 5, 0, 50}, - {13, 0, 0, 0, 5, 0, 50}, - {7, 0, 0, 0, 5, 0, 106}, - {7, 0, 0, 0, 5, 0, 104}, - {21, 0, 0, 0, 5, 0, 104}, - {7, 0, 0, 0, 5, 0, 110}, - {7, 0, 3, 0, 5, 0, 51}, - {7, 0, 3, 0, 5, 0, 86}, - {21, 0, 3, 0, 5, 0, 86}, - {15, 0, 3, 0, 5, 0, 86}, - {7, 0, 3, 0, 5, 0, 120}, - {26, 0, 3, 0, 5, 0, 120}, - {15, 0, 3, 0, 5, 0, 120}, - {7, 0, 3, 0, 5, 0, 116}, - {15, 0, 3, 0, 5, 0, 116}, - {7, 0, 3, 0, 5, 0, 128}, - {15, 0, 3, 0, 5, 0, 128}, - {7, 0, 3, 0, 5, 0, 63}, - {15, 0, 3, 0, 5, 0, 63}, - {21, 0, 18, 0, 5, 0, 63}, - {7, 0, 3, 0, 5, 0, 75}, - {21, 0, 3, 0, 5, 0, 75}, - {7, 0, 3, 0, 5, 0, 97}, - {7, 0, 3, 0, 5, 0, 96}, - {15, 0, 3, 0, 5, 0, 96}, - {7, 0, 3, 0, 5, 0, 60}, - {12, 0, 13, 0, 5, 0, 60}, - {12, 220, 13, 0, 5, 0, 60}, - {12, 230, 13, 0, 5, 0, 60}, - {12, 1, 13, 0, 5, 0, 60}, - {12, 9, 13, 0, 5, 0, 60}, - {15, 0, 3, 0, 5, 0, 60}, - {21, 0, 3, 0, 5, 0, 60}, - {7, 0, 3, 0, 5, 0, 87}, - {15, 0, 3, 0, 5, 0, 87}, - {21, 0, 3, 0, 5, 0, 87}, - {7, 0, 3, 0, 5, 0, 117}, - {15, 0, 3, 0, 5, 0, 117}, - {7, 0, 3, 0, 5, 0, 112}, - {26, 0, 3, 0, 5, 0, 112}, - {12, 230, 13, 0, 5, 0, 112}, - {12, 220, 13, 0, 5, 0, 112}, - {15, 0, 3, 0, 5, 0, 112}, - {21, 0, 3, 0, 5, 0, 112}, - {7, 0, 3, 0, 5, 0, 79}, - {21, 0, 18, 0, 5, 0, 79}, - {7, 0, 3, 0, 5, 0, 88}, - {15, 0, 3, 0, 5, 0, 88}, - {7, 0, 3, 0, 5, 0, 89}, - {15, 0, 3, 0, 5, 0, 89}, - {7, 0, 3, 0, 5, 0, 122}, - {21, 0, 3, 0, 5, 0, 122}, - {15, 0, 3, 0, 5, 0, 122}, - {7, 0, 3, 0, 5, 0, 90}, - {9, 0, 3, 0, 5, 0, 130}, - {5, 0, 3, 0, 5, 0, 130}, - {15, 0, 3, 0, 5, 0, 130}, - {15, 0, 11, 0, 5, 0, 6}, - {10, 0, 0, 0, 5, 0, 93}, - {12, 0, 13, 0, 5, 0, 93}, - {7, 0, 0, 0, 5, 0, 93}, - {12, 9, 13, 0, 5, 0, 93}, - {21, 0, 0, 0, 5, 0, 93}, - {15, 0, 18, 0, 5, 0, 93}, - {13, 0, 0, 0, 5, 0, 93}, - {12, 0, 13, 0, 5, 0, 91}, - {10, 0, 0, 0, 5, 0, 91}, - {7, 0, 0, 0, 5, 0, 91}, - {12, 9, 13, 0, 5, 0, 91}, - {12, 7, 13, 0, 5, 0, 91}, - {21, 0, 0, 0, 5, 0, 91}, - {1, 0, 0, 0, 5, 0, 91}, - {7, 0, 0, 0, 5, 0, 100}, - {13, 0, 0, 0, 5, 0, 100}, - {12, 230, 13, 0, 5, 0, 95}, - {7, 0, 0, 0, 5, 0, 95}, - {12, 0, 13, 0, 5, 0, 95}, - {10, 0, 0, 0, 5, 0, 95}, - {12, 9, 13, 0, 5, 0, 95}, - {13, 0, 0, 0, 5, 0, 95}, - {21, 0, 0, 0, 5, 0, 95}, - {7, 0, 0, 0, 5, 0, 111}, - {12, 7, 13, 0, 5, 0, 111}, - {21, 0, 0, 0, 5, 0, 111}, - {12, 0, 13, 0, 5, 0, 99}, - {10, 0, 0, 0, 5, 0, 99}, - {7, 0, 0, 0, 5, 0, 99}, - {10, 9, 0, 0, 5, 0, 99}, - {21, 0, 0, 0, 5, 0, 99}, - {12, 7, 13, 0, 5, 0, 99}, - {13, 0, 0, 0, 5, 0, 99}, - {15, 0, 0, 0, 5, 0, 18}, - {7, 0, 0, 0, 5, 0, 108}, - {10, 0, 0, 0, 5, 0, 108}, - {12, 0, 13, 0, 5, 0, 108}, - {10, 9, 0, 0, 5, 0, 108}, - {12, 7, 13, 0, 5, 0, 108}, - {21, 0, 0, 0, 5, 0, 108}, - {7, 0, 0, 0, 5, 0, 129}, - {21, 0, 0, 0, 5, 0, 129}, - {7, 0, 0, 0, 5, 0, 109}, - {12, 0, 13, 0, 5, 0, 109}, - {10, 0, 0, 0, 5, 0, 109}, - {12, 7, 13, 0, 5, 0, 109}, - {12, 9, 13, 0, 5, 0, 109}, - {13, 0, 0, 0, 5, 0, 109}, - {12, 0, 13, 0, 5, 0, 107}, - {10, 0, 0, 0, 5, 0, 107}, - {7, 0, 0, 0, 5, 0, 107}, - {12, 7, 13, 0, 5, 0, 107}, - {10, 9, 0, 0, 5, 0, 107}, - {12, 230, 13, 0, 5, 0, 107}, - {7, 0, 0, 0, 5, 0, 124}, - {10, 0, 0, 0, 5, 0, 124}, - {12, 0, 13, 0, 5, 0, 124}, - {12, 9, 13, 0, 5, 0, 124}, - {12, 7, 13, 0, 5, 0, 124}, - {21, 0, 0, 0, 5, 0, 124}, - {13, 0, 0, 0, 5, 0, 124}, - {7, 0, 0, 0, 5, 0, 123}, - {10, 0, 0, 0, 5, 0, 123}, - {12, 0, 13, 0, 5, 0, 123}, - {12, 9, 13, 0, 5, 0, 123}, - {12, 7, 13, 0, 5, 0, 123}, - {21, 0, 0, 0, 5, 0, 123}, - {7, 0, 0, 0, 5, 0, 114}, - {10, 0, 0, 0, 5, 0, 114}, - {12, 0, 13, 0, 5, 0, 114}, - {12, 9, 13, 0, 5, 0, 114}, - {21, 0, 0, 0, 5, 0, 114}, - {13, 0, 0, 0, 5, 0, 114}, - {7, 0, 0, 0, 5, 0, 101}, - {12, 0, 13, 0, 5, 0, 101}, - {10, 0, 0, 0, 5, 0, 101}, - {10, 9, 0, 0, 5, 0, 101}, - {12, 7, 13, 0, 5, 0, 101}, - {13, 0, 0, 0, 5, 0, 101}, - {7, 0, 0, 0, 5, 0, 126}, - {12, 0, 13, 0, 5, 0, 126}, - {10, 0, 0, 0, 5, 0, 126}, - {12, 9, 13, 0, 5, 0, 126}, - {13, 0, 0, 0, 5, 0, 126}, - {15, 0, 0, 0, 5, 0, 126}, - {21, 0, 0, 0, 5, 0, 126}, - {26, 0, 0, 0, 5, 0, 126}, - {9, 0, 0, 0, 5, 0, 125}, - {5, 0, 0, 0, 5, 0, 125}, - {13, 0, 0, 0, 5, 0, 125}, - {15, 0, 0, 0, 5, 0, 125}, - {7, 0, 0, 0, 5, 0, 125}, - {7, 0, 0, 0, 5, 0, 121}, - {7, 0, 0, 0, 5, 0, 62}, - {14, 0, 0, 0, 5, 0, 62}, - {21, 0, 0, 0, 5, 0, 62}, - {7, 0, 0, 0, 5, 0, 80}, - {7, 0, 0, 0, 5, 0, 127}, - {7, 0, 0, 0, 5, 0, 115}, - {13, 0, 0, 0, 5, 0, 115}, - {21, 0, 0, 0, 5, 0, 115}, - {7, 0, 0, 0, 5, 0, 103}, - {12, 1, 13, 0, 5, 0, 103}, - {21, 0, 0, 0, 5, 0, 103}, - {7, 0, 0, 0, 5, 0, 119}, - {12, 230, 13, 0, 5, 0, 119}, - {21, 0, 0, 0, 5, 0, 119}, - {26, 0, 0, 0, 5, 0, 119}, - {6, 0, 0, 0, 5, 0, 119}, - {13, 0, 0, 0, 5, 0, 119}, - {15, 0, 0, 0, 5, 0, 119}, - {7, 0, 0, 0, 5, 0, 98}, - {10, 0, 0, 0, 5, 0, 98}, - {12, 0, 13, 0, 5, 0, 98}, - {6, 0, 0, 0, 5, 0, 98}, - {7, 0, 0, 0, 5, 0, 105}, - {26, 0, 0, 0, 5, 0, 105}, - {12, 0, 13, 0, 5, 0, 105}, - {12, 1, 13, 0, 5, 0, 105}, - {21, 0, 0, 0, 5, 0, 105}, - {10, 216, 0, 0, 5, 0, 0}, - {10, 226, 0, 0, 5, 0, 0}, - {12, 230, 13, 0, 5, 0, 2}, - {25, 0, 0, 0, 5, 0, 0}, - {13, 0, 8, 0, 5, 0, 0}, - {26, 0, 0, 0, 5, 0, 131}, - {12, 0, 13, 0, 5, 0, 131}, - {21, 0, 0, 0, 5, 0, 131}, - {7, 0, 3, 0, 5, 0, 113}, - {15, 0, 3, 0, 5, 0, 113}, - {12, 220, 13, 0, 5, 0, 113}, - {26, 0, 0, 0, 2, 0, 32}, + {18, 0, 18, 1, 1, 0, 1}, + {21, 0, 18, 0, 1, 0, 5}, + {7, 0, 0, 0, 1, 33, 14}, + {7, 0, 0, 0, 1, 33, 32}, + {6, 0, 0, 0, 1, 0, 32}, + {6, 0, 0, 0, 1, 0, 5}, + {7, 0, 0, 0, 1, 24, 14}, + {23, 0, 10, 0, 0, 0, 10}, + {26, 0, 18, 0, 0, 0, 14}, + {26, 0, 18, 0, 1, 0, 12}, + {25, 0, 18, 0, 1, 0, 12}, + {1, 0, 18, 0, 5, 0, 21}, + {26, 0, 18, 0, 5, 0, 31}, + {7, 0, 0, 0, 5, 47, 12}, + {14, 0, 18, 0, 5, 2, 12}, + {15, 0, 18, 0, 5, 2, 12}, + {26, 0, 18, 0, 5, 2, 12}, + {26, 0, 0, 0, 5, 2, 12}, + {7, 0, 0, 0, 5, 73, 12}, + {7, 0, 0, 0, 5, 74, 12}, + {7, 0, 0, 0, 5, 37, 12}, + {15, 0, 0, 0, 5, 37, 12}, + {7, 0, 0, 0, 5, 38, 12}, + {14, 0, 0, 0, 5, 38, 12}, + {7, 0, 0, 0, 5, 118, 12}, + {12, 230, 13, 0, 5, 118, 21}, + {7, 0, 0, 0, 5, 48, 12}, + {21, 0, 0, 0, 5, 48, 17}, + {7, 0, 0, 0, 5, 59, 12}, + {21, 0, 0, 0, 5, 59, 17}, + {14, 0, 0, 0, 5, 59, 12}, + {9, 0, 0, 0, 5, 39, 12}, + {5, 0, 0, 0, 5, 39, 12}, + {7, 0, 0, 0, 5, 49, 12}, + {7, 0, 0, 0, 5, 50, 12}, + {13, 0, 0, 0, 5, 50, 11}, + {9, 0, 0, 0, 5, 136, 12}, + {5, 0, 0, 0, 5, 136, 12}, + {7, 0, 0, 0, 5, 106, 12}, + {7, 0, 0, 0, 5, 104, 12}, + {21, 0, 0, 0, 5, 104, 12}, + {7, 0, 0, 0, 5, 110, 12}, + {7, 0, 3, 0, 5, 51, 12}, + {7, 0, 3, 0, 5, 86, 12}, + {21, 0, 3, 0, 5, 86, 17}, + {15, 0, 3, 0, 5, 86, 12}, + {7, 0, 3, 0, 5, 120, 12}, + {26, 0, 3, 0, 5, 120, 12}, + {15, 0, 3, 0, 5, 120, 12}, + {7, 0, 3, 0, 5, 116, 12}, + {15, 0, 3, 0, 5, 116, 12}, + {7, 0, 3, 0, 5, 128, 12}, + {15, 0, 3, 0, 5, 128, 12}, + {7, 0, 3, 0, 5, 63, 12}, + {15, 0, 3, 0, 5, 63, 12}, + {21, 0, 18, 0, 5, 63, 17}, + {7, 0, 3, 0, 5, 75, 12}, + {21, 0, 3, 0, 5, 75, 12}, + {7, 0, 3, 0, 5, 97, 12}, + {7, 0, 3, 0, 5, 96, 12}, + {15, 0, 3, 0, 5, 96, 12}, + {7, 0, 3, 0, 5, 60, 12}, + {12, 0, 13, 0, 5, 60, 21}, + {12, 220, 13, 0, 5, 60, 21}, + {12, 230, 13, 0, 5, 60, 21}, + {12, 1, 13, 0, 5, 60, 21}, + {12, 9, 13, 0, 5, 60, 21}, + {15, 0, 3, 0, 5, 60, 12}, + {21, 0, 3, 0, 5, 60, 17}, + {21, 0, 3, 0, 5, 60, 12}, + {7, 0, 3, 0, 5, 87, 12}, + {15, 0, 3, 0, 5, 87, 12}, + {21, 0, 3, 0, 5, 87, 12}, + {7, 0, 3, 0, 5, 117, 12}, + {15, 0, 3, 0, 5, 117, 12}, + {7, 0, 3, 0, 5, 112, 12}, + {26, 0, 3, 0, 5, 112, 12}, + {12, 230, 13, 0, 5, 112, 21}, + {12, 220, 13, 0, 5, 112, 21}, + {15, 0, 3, 0, 5, 112, 12}, + {21, 0, 3, 0, 5, 112, 17}, + {21, 0, 3, 0, 5, 112, 15}, + {7, 0, 3, 0, 5, 79, 12}, + {21, 0, 18, 0, 5, 79, 17}, + {7, 0, 3, 0, 5, 88, 12}, + {15, 0, 3, 0, 5, 88, 12}, + {7, 0, 3, 0, 5, 89, 12}, + {15, 0, 3, 0, 5, 89, 12}, + {7, 0, 3, 0, 5, 122, 12}, + {21, 0, 3, 0, 5, 122, 12}, + {15, 0, 3, 0, 5, 122, 12}, + {7, 0, 3, 0, 5, 90, 12}, + {9, 0, 3, 0, 5, 130, 12}, + {5, 0, 3, 0, 5, 130, 12}, + {15, 0, 3, 0, 5, 130, 12}, + {15, 0, 11, 0, 5, 6, 12}, + {10, 0, 0, 0, 5, 93, 21}, + {12, 0, 13, 0, 5, 93, 21}, + {7, 0, 0, 0, 5, 93, 12}, + {12, 9, 13, 0, 5, 93, 21}, + {21, 0, 0, 0, 5, 93, 17}, + {21, 0, 0, 0, 5, 93, 12}, + {15, 0, 18, 0, 5, 93, 12}, + {13, 0, 0, 0, 5, 93, 11}, + {12, 0, 13, 0, 5, 91, 21}, + {10, 0, 0, 0, 5, 91, 21}, + {7, 0, 0, 0, 5, 91, 12}, + {12, 9, 13, 0, 5, 91, 21}, + {12, 7, 13, 0, 5, 91, 21}, + {21, 0, 0, 0, 5, 91, 12}, + {1, 0, 0, 0, 5, 91, 12}, + {21, 0, 0, 0, 5, 91, 17}, + {7, 0, 0, 0, 5, 100, 12}, + {13, 0, 0, 0, 5, 100, 11}, + {12, 230, 13, 0, 5, 95, 21}, + {7, 0, 0, 0, 5, 95, 12}, + {12, 0, 13, 0, 5, 95, 21}, + {10, 0, 0, 0, 5, 95, 21}, + {12, 9, 13, 0, 5, 95, 21}, + {13, 0, 0, 0, 5, 95, 11}, + {21, 0, 0, 0, 5, 95, 17}, + {7, 0, 0, 0, 5, 111, 12}, + {12, 7, 13, 0, 5, 111, 21}, + {21, 0, 0, 0, 5, 111, 12}, + {21, 0, 0, 0, 5, 111, 18}, + {12, 0, 13, 0, 5, 99, 21}, + {10, 0, 0, 0, 5, 99, 21}, + {7, 0, 0, 0, 5, 99, 12}, + {10, 9, 0, 0, 5, 99, 21}, + {21, 0, 0, 0, 5, 99, 17}, + {21, 0, 0, 0, 5, 99, 12}, + {12, 7, 13, 0, 5, 99, 21}, + {13, 0, 0, 0, 5, 99, 11}, + {21, 0, 0, 0, 5, 99, 18}, + {15, 0, 0, 0, 5, 18, 12}, + {7, 0, 0, 0, 5, 108, 12}, + {10, 0, 0, 0, 5, 108, 21}, + {12, 0, 13, 0, 5, 108, 21}, + {10, 9, 0, 0, 5, 108, 21}, + {12, 7, 13, 0, 5, 108, 21}, + {21, 0, 0, 0, 5, 108, 17}, + {21, 0, 0, 0, 5, 108, 12}, + {7, 0, 0, 0, 5, 129, 12}, + {21, 0, 0, 0, 5, 129, 17}, + {7, 0, 0, 0, 5, 109, 12}, + {12, 0, 13, 0, 5, 109, 21}, + {10, 0, 0, 0, 5, 109, 21}, + {12, 7, 13, 0, 5, 109, 21}, + {12, 9, 13, 0, 5, 109, 21}, + {13, 0, 0, 0, 5, 109, 11}, + {12, 0, 13, 0, 5, 107, 21}, + {10, 0, 0, 0, 5, 107, 21}, + {7, 0, 0, 0, 5, 107, 12}, + {12, 7, 13, 0, 5, 107, 21}, + {10, 9, 0, 0, 5, 107, 21}, + {12, 230, 13, 0, 5, 107, 21}, + {7, 0, 0, 0, 5, 135, 12}, + {10, 0, 0, 0, 5, 135, 21}, + {12, 0, 13, 0, 5, 135, 21}, + {12, 9, 13, 0, 5, 135, 21}, + {12, 7, 13, 0, 5, 135, 21}, + {21, 0, 0, 0, 5, 135, 17}, + {21, 0, 0, 0, 5, 135, 12}, + {13, 0, 0, 0, 5, 135, 11}, + {7, 0, 0, 0, 5, 124, 12}, + {10, 0, 0, 0, 5, 124, 21}, + {12, 0, 13, 0, 5, 124, 21}, + {12, 9, 13, 0, 5, 124, 21}, + {12, 7, 13, 0, 5, 124, 21}, + {21, 0, 0, 0, 5, 124, 12}, + {13, 0, 0, 0, 5, 124, 11}, + {7, 0, 0, 0, 5, 123, 12}, + {10, 0, 0, 0, 5, 123, 21}, + {12, 0, 13, 0, 5, 123, 21}, + {12, 9, 13, 0, 5, 123, 21}, + {12, 7, 13, 0, 5, 123, 21}, + {21, 0, 0, 0, 5, 123, 18}, + {21, 0, 0, 0, 5, 123, 17}, + {21, 0, 0, 0, 5, 123, 6}, + {21, 0, 0, 0, 5, 123, 12}, + {7, 0, 0, 0, 5, 114, 12}, + {10, 0, 0, 0, 5, 114, 21}, + {12, 0, 13, 0, 5, 114, 21}, + {12, 9, 13, 0, 5, 114, 21}, + {21, 0, 0, 0, 5, 114, 17}, + {21, 0, 0, 0, 5, 114, 12}, + {13, 0, 0, 0, 5, 114, 11}, + {21, 0, 18, 0, 5, 31, 18}, + {7, 0, 0, 0, 5, 101, 12}, + {12, 0, 13, 0, 5, 101, 21}, + {10, 0, 0, 0, 5, 101, 21}, + {10, 9, 0, 0, 5, 101, 21}, + {12, 7, 13, 0, 5, 101, 21}, + {13, 0, 0, 0, 5, 101, 11}, + {7, 0, 0, 0, 5, 126, 38}, + {12, 0, 13, 0, 5, 126, 38}, + {10, 0, 0, 0, 5, 126, 38}, + {12, 9, 13, 0, 5, 126, 38}, + {13, 0, 0, 0, 5, 126, 11}, + {15, 0, 0, 0, 5, 126, 38}, + {21, 0, 0, 0, 5, 126, 17}, + {26, 0, 0, 0, 5, 126, 38}, + {9, 0, 0, 0, 5, 125, 12}, + {5, 0, 0, 0, 5, 125, 12}, + {13, 0, 0, 0, 5, 125, 11}, + {15, 0, 0, 0, 5, 125, 12}, + {7, 0, 0, 0, 5, 125, 12}, + {7, 0, 0, 0, 5, 121, 12}, + {7, 0, 0, 0, 5, 133, 12}, + {10, 0, 0, 0, 5, 133, 21}, + {12, 0, 13, 0, 5, 133, 21}, + {12, 9, 0, 0, 5, 133, 21}, + {21, 0, 0, 0, 5, 133, 17}, + {13, 0, 0, 0, 5, 133, 11}, + {15, 0, 0, 0, 5, 133, 12}, + {21, 0, 0, 0, 5, 134, 18}, + {21, 0, 0, 0, 5, 134, 6}, + {7, 0, 0, 0, 5, 134, 12}, + {12, 0, 13, 0, 5, 134, 21}, + {10, 0, 0, 0, 5, 134, 21}, + {7, 0, 0, 0, 5, 62, 12}, + {14, 0, 0, 0, 5, 62, 12}, + {21, 0, 0, 0, 5, 62, 17}, + {7, 0, 0, 0, 5, 80, 12}, + {7, 0, 0, 0, 5, 80, 0}, + {7, 0, 0, 0, 5, 80, 1}, + {7, 0, 0, 0, 5, 127, 12}, + {7, 0, 0, 0, 5, 127, 0}, + {7, 0, 0, 0, 5, 127, 1}, + {7, 0, 0, 0, 5, 115, 12}, + {13, 0, 0, 0, 5, 115, 11}, + {21, 0, 0, 0, 5, 115, 17}, + {7, 0, 0, 0, 5, 103, 12}, + {12, 1, 13, 0, 5, 103, 21}, + {21, 0, 0, 0, 5, 103, 17}, + {7, 0, 0, 0, 5, 119, 12}, + {12, 230, 13, 0, 5, 119, 21}, + {21, 0, 0, 0, 5, 119, 17}, + {21, 0, 0, 0, 5, 119, 12}, + {26, 0, 0, 0, 5, 119, 12}, + {6, 0, 0, 0, 5, 119, 12}, + {13, 0, 0, 0, 5, 119, 11}, + {15, 0, 0, 0, 5, 119, 12}, + {7, 0, 0, 0, 5, 98, 12}, + {10, 0, 0, 0, 5, 98, 21}, + {12, 0, 13, 0, 5, 98, 21}, + {6, 0, 0, 0, 5, 98, 12}, + {6, 0, 0, 0, 2, 137, 5}, + {7, 0, 0, 0, 2, 137, 14}, + {7, 0, 0, 0, 5, 105, 12}, + {26, 0, 0, 0, 5, 105, 12}, + {12, 0, 13, 0, 5, 105, 21}, + {12, 1, 13, 0, 5, 105, 21}, + {21, 0, 0, 0, 5, 105, 17}, + {10, 216, 0, 0, 5, 0, 21}, + {10, 226, 0, 0, 5, 0, 21}, + {12, 230, 13, 0, 5, 2, 21}, + {25, 0, 0, 0, 5, 0, 12}, + {13, 0, 8, 0, 5, 0, 11}, + {26, 0, 0, 0, 5, 131, 12}, + {12, 0, 13, 0, 5, 131, 21}, + {21, 0, 0, 0, 5, 131, 17}, + {21, 0, 0, 0, 5, 131, 12}, + {12, 230, 13, 0, 5, 56, 21}, + {7, 0, 3, 0, 5, 113, 12}, + {15, 0, 3, 0, 5, 113, 12}, + {12, 220, 13, 0, 5, 113, 21}, + {9, 0, 3, 0, 5, 132, 12}, + {5, 0, 3, 0, 5, 132, 12}, + {12, 230, 13, 0, 5, 132, 21}, + {12, 7, 13, 0, 5, 132, 21}, + {13, 0, 3, 0, 5, 132, 11}, + {21, 0, 3, 0, 5, 132, 0}, + {2, 0, 18, 0, 5, 102, 14}, + {26, 0, 0, 0, 2, 0, 29}, + {26, 0, 0, 0, 5, 0, 28}, + {26, 0, 0, 0, 2, 32, 14}, + {24, 0, 18, 0, 2, 0, 41}, + {26, 0, 18, 0, 5, 0, 5}, }; #define BIDI_MIRROR_LEN 364 @@ -1186,6 +1364,130 @@ {65379, 65378}, }; +#define BIDI_BRACKET_LEN 120 +static const BracketPair bracket_pairs[] = { + {40, 41, 0}, + {41, 40, 1}, + {91, 93, 0}, + {93, 91, 1}, + {123, 125, 0}, + {125, 123, 1}, + {3898, 3899, 0}, + {3899, 3898, 1}, + {3900, 3901, 0}, + {3901, 3900, 1}, + {5787, 5788, 0}, + {5788, 5787, 1}, + {8261, 8262, 0}, + {8262, 8261, 1}, + {8317, 8318, 0}, + {8318, 8317, 1}, + {8333, 8334, 0}, + {8334, 8333, 1}, + {8968, 8969, 0}, + {8969, 8968, 1}, + {8970, 8971, 0}, + {8971, 8970, 1}, + {9001, 9002, 0}, + {9002, 9001, 1}, + {10088, 10089, 0}, + {10089, 10088, 1}, + {10090, 10091, 0}, + {10091, 10090, 1}, + {10092, 10093, 0}, + {10093, 10092, 1}, + {10094, 10095, 0}, + {10095, 10094, 1}, + {10096, 10097, 0}, + {10097, 10096, 1}, + {10098, 10099, 0}, + {10099, 10098, 1}, + {10100, 10101, 0}, + {10101, 10100, 1}, + {10181, 10182, 0}, + {10182, 10181, 1}, + {10214, 10215, 0}, + {10215, 10214, 1}, + {10216, 10217, 0}, + {10217, 10216, 1}, + {10218, 10219, 0}, + {10219, 10218, 1}, + {10220, 10221, 0}, + {10221, 10220, 1}, + {10222, 10223, 0}, + {10223, 10222, 1}, + {10627, 10628, 0}, + {10628, 10627, 1}, + {10629, 10630, 0}, + {10630, 10629, 1}, + {10631, 10632, 0}, + {10632, 10631, 1}, + {10633, 10634, 0}, + {10634, 10633, 1}, + {10635, 10636, 0}, + {10636, 10635, 1}, + {10637, 10640, 0}, + {10638, 10639, 1}, + {10639, 10638, 0}, + {10640, 10637, 1}, + {10641, 10642, 0}, + {10642, 10641, 1}, + {10643, 10644, 0}, + {10644, 10643, 1}, + {10645, 10646, 0}, + {10646, 10645, 1}, + {10647, 10648, 0}, + {10648, 10647, 1}, + {10712, 10713, 0}, + {10713, 10712, 1}, + {10714, 10715, 0}, + {10715, 10714, 1}, + {10748, 10749, 0}, + {10749, 10748, 1}, + {11810, 11811, 0}, + {11811, 11810, 1}, + {11812, 11813, 0}, + {11813, 11812, 1}, + {11814, 11815, 0}, + {11815, 11814, 1}, + {11816, 11817, 0}, + {11817, 11816, 1}, + {12296, 12297, 0}, + {12297, 12296, 1}, + {12298, 12299, 0}, + {12299, 12298, 1}, + {12300, 12301, 0}, + {12301, 12300, 1}, + {12302, 12303, 0}, + {12303, 12302, 1}, + {12304, 12305, 0}, + {12305, 12304, 1}, + {12308, 12309, 0}, + {12309, 12308, 1}, + {12310, 12311, 0}, + {12311, 12310, 1}, + {12312, 12313, 0}, + {12313, 12312, 1}, + {12314, 12315, 0}, + {12315, 12314, 1}, + {65113, 65114, 0}, + {65114, 65113, 1}, + {65115, 65116, 0}, + {65116, 65115, 1}, + {65117, 65118, 0}, + {65118, 65117, 1}, + {65288, 65289, 0}, + {65289, 65288, 1}, + {65339, 65341, 0}, + {65341, 65339, 1}, + {65371, 65373, 0}, + {65373, 65371, 1}, + {65375, 65376, 0}, + {65376, 65375, 1}, + {65378, 65379, 0}, + {65379, 65378, 1}, +}; + /* Reindexing of NFC first characters. */ #define TOTAL_FIRST 376 #define TOTAL_LAST 62 @@ -1585,6 +1887,12 @@ #define UCDN_SCRIPT_MULTANI 129 #define UCDN_SCRIPT_OLD_HUNGARIAN 130 #define UCDN_SCRIPT_SIGNWRITING 131 +#define UCDN_SCRIPT_ADLAM 132 +#define UCDN_SCRIPT_BHAIKSUKI 133 +#define UCDN_SCRIPT_MARCHEN 134 +#define UCDN_SCRIPT_NEWA 135 +#define UCDN_SCRIPT_OSAGE 136 +#define UCDN_SCRIPT_TANGUT 137 #define UCDN_GENERAL_CATEGORY_CC 0 #define UCDN_GENERAL_CATEGORY_CF 1 @@ -1654,27 +1962,27 @@ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 54, 55, 56, 56, 56, 57, - 58, 59, 60, 61, 62, 63, 64, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, - 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 65, 66, 67, 67, 67, - 67, 67, 67, 67, 67, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 52, 69, 70, 71, 72, 73, - 74, 75, 76, 77, 78, 79, 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 88, 90, - 91, 92, 93, 94, 95, 96, 97, 98, 88, 99, 88, 88, 88, 88, 88, 100, 100, - 100, 101, 102, 103, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 104, 104, - 104, 104, 105, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 106, 106, 107, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 108, 108, 109, 110, 88, 88, 88, 111, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 112, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 113, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 114, - 115, 116, 117, 118, 119, 120, 121, 122, 122, 123, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 124, 88, 88, 88, 88, 88, 125, 88, 126, 127, - 128, 129, 130, 131, 132, 133, 134, 135, 88, 88, 88, 88, 88, 88, 52, 52, - 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, + 58, 59, 60, 61, 62, 63, 64, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, + 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, + 66, 67, 68, 69, 70, 71, 65, 66, 67, 68, 69, 70, 71, 65, 72, 73, 73, 73, + 73, 73, 73, 73, 73, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 52, 75, 76, 77, 78, 79, + 80, 81, 82, 83, 84, 85, 86, 87, 88, 89, 90, 91, 92, 93, 94, 95, 94, 96, + 97, 98, 99, 100, 101, 102, 103, 104, 94, 105, 94, 106, 94, 94, 94, 107, + 107, 107, 108, 109, 110, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 111, + 111, 112, 113, 114, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 115, 116, 117, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 118, 118, 119, 120, 94, 94, 94, 121, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, 122, + 122, 122, 122, 122, 123, 122, 122, 124, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 125, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 126, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 127, 128, 129, 130, 131, 132, 133, 134, 135, + 135, 136, 94, 94, 94, 94, 94, 137, 94, 94, 94, 94, 94, 94, 94, 138, 139, + 94, 94, 94, 94, 140, 94, 141, 142, 143, 144, 145, 146, 147, 148, 149, + 150, 151, 151, 151, 151, 151, 152, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, @@ -1683,215 +1991,216 @@ 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 136, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 137, 138, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, - 52, 52, 52, 52, 52, 52, 139, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 52, 52, 141, 140, 140, 140, 140, 142, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, 140, - 142, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 143, 144, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, 88, - 88, 88, 88, 88, 88, 88, 88, 88, 88, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 145, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 153, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 154, 155, 52, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 52, 156, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 52, 52, + 158, 157, 157, 157, 157, 159, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, 157, + 157, 157, 157, 157, 157, 157, 157, 157, 157, 159, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 160, 161, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, 94, + 94, 94, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 162, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, 74, + 74, 74, 74, 74, 74, 74, 74, 74, 74, 162, }; static const unsigned short index1[] = { @@ -1912,992 +2221,1135 @@ 146, 147, 148, 149, 128, 128, 128, 128, 128, 128, 150, 150, 150, 150, 151, 152, 153, 120, 154, 155, 156, 156, 156, 157, 158, 159, 160, 160, 161, 162, 163, 164, 165, 166, 167, 167, 167, 168, 120, 120, 120, 120, - 120, 120, 120, 120, 128, 128, 169, 120, 120, 120, 120, 120, 170, 171, - 172, 173, 174, 175, 175, 175, 175, 175, 175, 176, 177, 178, 179, 175, - 180, 181, 182, 175, 183, 184, 185, 186, 186, 187, 188, 189, 190, 191, - 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 201, 202, 203, 204, - 205, 206, 207, 208, 209, 210, 211, 120, 212, 213, 214, 215, 215, 216, - 217, 218, 219, 220, 221, 120, 222, 223, 224, 225, 226, 227, 228, 229, - 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 120, 240, 241, - 242, 243, 244, 241, 245, 246, 247, 248, 249, 120, 250, 251, 252, 253, - 254, 255, 256, 257, 257, 256, 257, 258, 259, 260, 261, 262, 263, 264, - 120, 265, 266, 267, 268, 269, 269, 268, 270, 271, 272, 273, 274, 275, - 276, 277, 278, 120, 279, 280, 281, 282, 282, 282, 282, 283, 284, 285, - 286, 287, 288, 289, 290, 291, 292, 293, 294, 295, 293, 293, 296, 297, - 294, 298, 299, 300, 301, 302, 303, 120, 304, 305, 305, 305, 305, 305, - 306, 307, 308, 309, 310, 311, 120, 120, 120, 120, 312, 313, 314, 315, - 316, 317, 318, 319, 320, 321, 322, 323, 120, 120, 120, 120, 324, 325, - 326, 327, 328, 329, 330, 331, 332, 333, 332, 332, 332, 334, 335, 336, - 337, 338, 339, 340, 339, 339, 339, 341, 342, 343, 344, 345, 120, 120, - 120, 120, 346, 346, 346, 346, 346, 347, 348, 349, 350, 351, 352, 353, - 354, 355, 356, 346, 357, 358, 350, 359, 360, 360, 360, 360, 361, 362, - 363, 363, 363, 363, 363, 364, 365, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, - 366, 366, 366, 366, 366, 366, 366, 366, 366, 366, 367, 367, 367, 367, - 367, 367, 367, 367, 367, 368, 369, 368, 367, 367, 367, 367, 367, 368, - 367, 367, 367, 367, 368, 369, 368, 367, 369, 367, 367, 367, 367, 367, - 367, 367, 368, 367, 367, 367, 367, 367, 367, 367, 367, 370, 371, 372, - 373, 374, 367, 367, 375, 376, 377, 377, 377, 377, 377, 377, 377, 377, - 377, 377, 378, 379, 380, 381, 381, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, - 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 381, 382, 381, 381, - 383, 384, 384, 385, 386, 386, 386, 386, 386, 386, 386, 386, 386, 387, - 388, 389, 390, 391, 392, 120, 393, 393, 394, 120, 395, 395, 396, 120, - 397, 398, 399, 120, 400, 400, 400, 400, 400, 400, 401, 402, 403, 404, - 405, 406, 407, 408, 409, 410, 411, 412, 413, 414, 415, 415, 415, 415, - 416, 415, 415, 415, 415, 415, 415, 120, 415, 415, 415, 415, 415, 417, - 381, 381, 381, 381, 381, 381, 381, 381, 418, 120, 419, 419, 419, 420, - 421, 422, 423, 424, 425, 426, 427, 427, 427, 428, 429, 120, 430, 430, - 430, 430, 430, 431, 430, 430, 430, 432, 433, 434, 435, 435, 435, 435, - 436, 436, 437, 438, 439, 439, 439, 439, 439, 439, 440, 441, 442, 443, - 444, 445, 446, 447, 446, 447, 448, 449, 450, 451, 120, 120, 120, 120, - 120, 120, 120, 120, 452, 453, 453, 453, 453, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 465, 465, 465, 466, 467, 468, 469, - 470, 470, 470, 470, 471, 472, 473, 474, 475, 475, 475, 475, 476, 477, - 478, 479, 480, 481, 482, 483, 484, 484, 484, 485, 120, 120, 120, 120, - 120, 120, 120, 120, 486, 120, 487, 488, 489, 490, 491, 492, 54, 54, 54, - 54, 493, 494, 56, 56, 56, 56, 56, 495, 496, 497, 54, 498, 54, 54, 54, - 499, 56, 56, 56, 500, 501, 502, 503, 504, 504, 504, 505, 506, 27, 27, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 507, 508, 27, - 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 509, 510, 511, 512, 509, 510, - 509, 510, 511, 512, 509, 513, 509, 510, 509, 511, 509, 514, 509, 514, - 509, 514, 515, 516, 517, 518, 519, 520, 509, 521, 522, 523, 524, 525, - 526, 527, 528, 529, 530, 531, 532, 533, 534, 535, 536, 537, 538, 539, - 540, 541, 56, 542, 543, 544, 543, 545, 120, 120, 546, 547, 548, 549, 550, - 120, 551, 552, 553, 554, 555, 556, 557, 558, 559, 560, 561, 562, 563, - 564, 563, 565, 566, 567, 568, 569, 570, 571, 572, 573, 572, 574, 575, - 572, 576, 572, 577, 578, 579, 580, 581, 582, 583, 584, 585, 586, 587, - 588, 589, 590, 591, 592, 587, 587, 593, 594, 595, 596, 597, 587, 587, - 598, 578, 599, 600, 587, 587, 601, 587, 587, 572, 602, 603, 572, 604, - 605, 606, 607, 607, 607, 607, 607, 607, 607, 607, 608, 572, 572, 609, - 610, 578, 578, 611, 572, 572, 572, 572, 577, 612, 572, 572, 613, 572, - 572, 572, 572, 614, 120, 120, 120, 572, 613, 120, 120, 615, 615, 615, - 615, 615, 616, 616, 617, 618, 618, 618, 618, 618, 618, 618, 618, 618, - 619, 615, 615, 620, 620, 620, 620, 620, 620, 620, 620, 620, 621, 620, - 620, 620, 620, 621, 572, 620, 620, 622, 572, 623, 573, 624, 625, 626, - 627, 573, 572, 622, 576, 572, 578, 628, 629, 625, 630, 572, 572, 572, - 572, 631, 572, 572, 572, 632, 633, 572, 572, 572, 572, 572, 634, 572, - 635, 572, 634, 636, 637, 620, 620, 638, 620, 620, 620, 572, 572, 572, - 572, 572, 572, 572, 639, 572, 572, 576, 572, 572, 640, 641, 615, 642, - 642, 643, 572, 572, 572, 572, 572, 644, 645, 646, 647, 648, 649, 578, - 578, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, - 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, 650, - 650, 650, 650, 650, 650, 578, 578, 578, 578, 578, 578, 578, 578, 578, - 578, 578, 578, 578, 578, 578, 578, 651, 652, 652, 653, 587, 587, 578, - 654, 601, 655, 656, 657, 658, 659, 660, 661, 578, 662, 587, 663, 664, - 665, 666, 647, 578, 578, 590, 654, 666, 667, 668, 669, 587, 587, 587, - 587, 670, 671, 587, 587, 587, 587, 672, 673, 674, 647, 675, 676, 572, - 572, 572, 572, 572, 572, 578, 578, 677, 678, 679, 573, 572, 572, 680, - 572, 572, 572, 681, 572, 572, 572, 572, 682, 572, 683, 684, 120, 120, - 685, 120, 120, 686, 686, 686, 686, 686, 687, 688, 688, 688, 688, 688, - 689, 690, 691, 692, 693, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, - 694, 695, 696, 697, 698, 698, 698, 698, 699, 700, 701, 701, 701, 701, - 701, 701, 701, 702, 703, 704, 367, 367, 369, 120, 369, 369, 369, 369, - 369, 369, 369, 369, 705, 705, 705, 705, 706, 707, 708, 709, 710, 711, - 533, 712, 713, 120, 120, 120, 120, 120, 120, 120, 714, 714, 714, 715, - 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 716, 120, 714, 714, - 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, - 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 717, 120, 120, 120, - 718, 719, 720, 721, 722, 723, 724, 725, 726, 727, 728, 729, 729, 729, - 729, 729, 729, 729, 729, 729, 730, 731, 732, 733, 733, 733, 733, 733, - 733, 733, 733, 733, 733, 734, 735, 736, 736, 736, 736, 737, 738, 365, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 739, 740, 741, 736, 736, - 736, 742, 718, 718, 718, 718, 719, 120, 733, 733, 743, 743, 743, 744, - 745, 746, 741, 741, 741, 747, 748, 749, 743, 743, 743, 750, 745, 746, - 741, 741, 741, 741, 751, 749, 741, 752, 753, 753, 753, 753, 753, 754, - 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 741, 741, 741, - 755, 756, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 757, - 741, 741, 741, 755, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 759, 760, 572, 572, 572, 572, 572, 572, 572, 572, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 760, 760, 760, - 760, 760, 761, 761, 762, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, - 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 761, 763, - 764, 764, 764, 764, 764, 764, 765, 120, 766, 766, 766, 766, 766, 767, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, 768, - 768, 768, 768, 768, 768, 769, 768, 768, 770, 771, 120, 120, 101, 101, - 101, 101, 101, 772, 773, 774, 101, 101, 101, 775, 776, 776, 776, 776, - 776, 776, 776, 776, 777, 778, 779, 120, 64, 64, 780, 781, 782, 27, 783, - 27, 27, 27, 27, 27, 27, 27, 784, 785, 27, 786, 787, 27, 27, 788, 789, - 120, 120, 120, 120, 120, 120, 120, 790, 791, 792, 793, 794, 794, 795, - 796, 797, 798, 799, 799, 799, 799, 799, 799, 800, 120, 801, 802, 802, - 802, 802, 802, 803, 804, 805, 806, 807, 808, 809, 809, 810, 811, 812, - 813, 814, 814, 815, 816, 817, 817, 818, 819, 820, 821, 365, 365, 365, - 822, 823, 824, 824, 824, 824, 824, 825, 826, 827, 828, 829, 830, 831, - 346, 350, 832, 833, 833, 833, 833, 833, 834, 835, 120, 836, 837, 838, - 839, 346, 346, 840, 841, 842, 842, 842, 842, 842, 842, 843, 844, 845, - 120, 120, 846, 847, 848, 849, 120, 850, 850, 850, 120, 369, 369, 54, 54, - 54, 54, 54, 851, 852, 120, 853, 853, 853, 853, 853, 853, 853, 853, 853, - 853, 847, 847, 847, 847, 854, 855, 856, 857, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, 365, - 365, 365, 365, 365, 365, 858, 120, 366, 366, 859, 860, 366, 366, 366, - 366, 366, 861, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, 862, - 862, 862, 862, 862, 862, 862, 862, 863, 863, 863, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 864, 760, 760, 760, - 760, 865, 120, 866, 867, 121, 868, 869, 870, 871, 121, 128, 128, 128, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 872, 873, 874, 120, 875, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, + 120, 120, 120, 120, 128, 128, 169, 170, 120, 120, 171, 126, 172, 173, + 174, 175, 176, 177, 177, 177, 177, 177, 177, 178, 179, 180, 181, 177, + 182, 183, 184, 177, 185, 186, 187, 188, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 203, 204, 205, 206, + 207, 208, 209, 210, 211, 212, 213, 120, 214, 215, 216, 217, 217, 218, + 219, 220, 221, 222, 223, 120, 224, 225, 226, 227, 228, 229, 230, 231, + 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 120, 242, 243, + 244, 245, 246, 243, 247, 248, 249, 250, 251, 120, 252, 253, 254, 255, + 256, 257, 258, 259, 259, 258, 259, 260, 261, 262, 263, 264, 265, 266, + 120, 267, 268, 269, 270, 271, 271, 270, 272, 273, 274, 275, 276, 277, + 278, 279, 280, 120, 281, 282, 283, 284, 284, 284, 284, 285, 286, 287, + 288, 289, 290, 291, 292, 293, 294, 295, 296, 297, 295, 295, 298, 299, + 296, 300, 301, 302, 303, 304, 305, 120, 306, 307, 307, 307, 307, 307, + 308, 309, 310, 311, 312, 313, 120, 120, 120, 120, 314, 315, 316, 317, + 318, 319, 320, 321, 322, 323, 324, 325, 120, 120, 120, 120, 326, 327, + 328, 329, 330, 331, 332, 333, 334, 335, 334, 334, 334, 336, 337, 338, + 339, 340, 341, 342, 341, 341, 341, 343, 344, 345, 346, 347, 120, 120, + 120, 120, 348, 348, 348, 348, 348, 349, 350, 351, 352, 353, 354, 355, + 356, 357, 358, 348, 359, 360, 352, 361, 362, 362, 362, 362, 363, 364, + 365, 365, 365, 365, 365, 366, 367, 367, 367, 367, 367, 367, 367, 367, + 367, 367, 367, 367, 368, 368, 368, 368, 368, 368, 368, 368, 368, 369, + 369, 369, 369, 369, 369, 369, 369, 369, 369, 369, 370, 370, 370, 370, + 370, 370, 370, 370, 370, 371, 372, 371, 370, 370, 370, 370, 370, 371, + 370, 370, 370, 370, 371, 372, 371, 370, 372, 370, 370, 370, 370, 370, + 370, 370, 371, 370, 370, 370, 370, 370, 370, 370, 370, 373, 374, 375, + 376, 377, 370, 370, 378, 379, 380, 380, 380, 380, 380, 380, 380, 380, + 380, 380, 381, 382, 383, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, + 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 384, 385, 384, 384, + 386, 387, 387, 388, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, + 391, 392, 393, 394, 395, 120, 396, 396, 397, 120, 398, 398, 399, 120, + 400, 401, 402, 120, 403, 403, 403, 403, 403, 403, 404, 405, 406, 407, + 408, 409, 410, 411, 412, 413, 414, 415, 416, 417, 418, 418, 418, 418, + 419, 418, 418, 418, 418, 418, 418, 120, 420, 418, 418, 418, 418, 421, + 384, 384, 384, 384, 384, 384, 384, 384, 422, 120, 423, 423, 423, 424, + 425, 426, 427, 428, 429, 430, 431, 431, 431, 432, 433, 120, 434, 434, + 434, 434, 434, 435, 434, 434, 434, 436, 437, 438, 439, 439, 439, 439, + 440, 440, 441, 442, 443, 443, 443, 443, 443, 443, 444, 445, 446, 447, + 448, 449, 450, 451, 450, 451, 452, 453, 454, 455, 120, 120, 120, 120, + 120, 120, 120, 120, 456, 457, 457, 457, 457, 457, 458, 459, 460, 461, + 462, 463, 464, 465, 466, 467, 468, 469, 469, 469, 470, 471, 472, 473, + 474, 474, 474, 474, 475, 476, 477, 478, 479, 479, 479, 479, 480, 481, + 482, 483, 484, 485, 486, 487, 488, 488, 488, 489, 100, 490, 120, 120, + 120, 120, 120, 120, 491, 120, 492, 493, 494, 495, 496, 497, 54, 54, 54, + 54, 498, 499, 56, 56, 56, 56, 56, 500, 501, 502, 54, 503, 54, 54, 54, + 504, 56, 56, 56, 505, 506, 507, 508, 509, 509, 509, 510, 511, 27, 27, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 512, 513, 27, + 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 27, 514, 515, 516, 517, 514, 515, + 514, 515, 516, 517, 514, 518, 514, 515, 514, 516, 514, 519, 514, 519, + 514, 519, 520, 521, 522, 523, 524, 525, 514, 526, 527, 528, 529, 530, + 531, 532, 533, 534, 535, 536, 537, 538, 539, 540, 541, 542, 543, 544, + 545, 546, 56, 547, 548, 549, 550, 551, 552, 552, 553, 554, 555, 556, 557, + 120, 558, 559, 560, 561, 562, 563, 564, 565, 566, 567, 568, 569, 570, + 571, 570, 572, 573, 574, 575, 576, 577, 578, 579, 580, 579, 581, 582, + 579, 583, 579, 584, 585, 586, 587, 588, 589, 590, 591, 592, 593, 594, + 595, 596, 597, 598, 599, 594, 594, 600, 601, 602, 603, 604, 594, 594, + 605, 585, 606, 607, 594, 594, 608, 594, 594, 579, 609, 610, 611, 612, + 613, 614, 615, 615, 615, 615, 615, 615, 615, 615, 616, 579, 579, 617, + 618, 585, 585, 619, 579, 579, 579, 579, 584, 620, 621, 622, 623, 579, + 579, 579, 579, 623, 120, 120, 120, 579, 624, 120, 120, 625, 625, 625, + 625, 625, 626, 626, 627, 628, 628, 628, 628, 628, 628, 628, 628, 628, + 629, 625, 630, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 631, + 631, 631, 631, 633, 579, 631, 631, 634, 579, 635, 636, 637, 638, 639, + 640, 636, 579, 634, 641, 579, 642, 643, 644, 645, 646, 579, 579, 579, + 647, 648, 649, 650, 579, 651, 652, 579, 653, 579, 579, 654, 655, 656, + 657, 579, 658, 659, 660, 661, 662, 663, 664, 665, 666, 667, 668, 579, + 579, 579, 669, 579, 670, 579, 671, 672, 673, 674, 675, 676, 625, 677, + 677, 678, 579, 579, 579, 669, 679, 680, 681, 682, 683, 684, 685, 585, + 585, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, + 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, + 686, 686, 686, 686, 686, 585, 585, 585, 585, 585, 585, 585, 585, 585, + 585, 585, 585, 585, 585, 585, 585, 687, 688, 688, 689, 594, 594, 585, + 690, 691, 692, 693, 694, 695, 696, 697, 698, 585, 699, 594, 700, 701, + 702, 703, 683, 585, 585, 597, 690, 703, 704, 705, 706, 594, 594, 594, + 594, 707, 708, 594, 594, 594, 594, 709, 710, 711, 683, 712, 713, 579, + 579, 579, 714, 579, 579, 585, 585, 715, 716, 717, 636, 579, 579, 718, + 579, 579, 579, 719, 579, 579, 579, 579, 720, 579, 721, 722, 120, 120, + 723, 120, 120, 724, 724, 724, 724, 724, 725, 726, 726, 726, 726, 726, + 727, 728, 729, 730, 731, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, 92, + 732, 733, 734, 735, 736, 736, 736, 736, 737, 738, 739, 739, 739, 739, + 739, 739, 739, 740, 741, 742, 370, 370, 372, 120, 372, 372, 372, 372, + 372, 372, 372, 372, 743, 743, 743, 743, 744, 745, 746, 747, 748, 749, + 750, 751, 752, 120, 120, 120, 120, 120, 120, 120, 753, 753, 753, 754, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 755, 120, 753, 753, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 756, 120, 120, 120, + 757, 758, 759, 760, 761, 762, 763, 764, 765, 766, 767, 768, 769, 769, + 770, 769, 769, 769, 771, 772, 773, 774, 775, 776, 777, 777, 778, 777, + 777, 777, 779, 780, 781, 782, 783, 784, 784, 784, 784, 785, 786, 787, + 787, 787, 787, 787, 787, 787, 787, 787, 787, 788, 789, 790, 784, 784, + 784, 791, 757, 757, 757, 757, 758, 120, 792, 792, 793, 793, 793, 794, + 795, 796, 790, 790, 790, 797, 798, 799, 793, 793, 793, 800, 795, 796, + 790, 790, 790, 790, 801, 799, 790, 802, 803, 803, 803, 803, 803, 804, + 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 803, 790, 790, 790, + 805, 806, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 807, + 790, 790, 790, 805, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 809, 810, 579, 579, 579, 579, 579, 579, 579, 579, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 809, 810, 810, 810, + 810, 810, 811, 811, 812, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, + 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 811, 813, + 814, 814, 814, 814, 814, 814, 815, 120, 816, 816, 816, 816, 816, 817, + 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, + 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, + 818, 818, 818, 818, 818, 819, 818, 818, 820, 821, 120, 120, 101, 101, + 101, 101, 101, 822, 823, 824, 101, 101, 101, 825, 826, 826, 826, 826, + 826, 826, 826, 826, 827, 828, 829, 120, 64, 64, 830, 831, 832, 27, 833, + 27, 27, 27, 27, 27, 27, 27, 834, 835, 27, 836, 837, 27, 27, 838, 839, + 120, 120, 120, 120, 120, 120, 120, 840, 841, 842, 843, 844, 844, 845, + 846, 847, 848, 849, 849, 849, 849, 849, 849, 850, 120, 851, 852, 852, + 852, 852, 852, 853, 854, 855, 856, 857, 858, 859, 859, 860, 861, 862, + 863, 864, 864, 865, 866, 867, 867, 868, 869, 870, 871, 367, 367, 367, + 872, 873, 874, 874, 874, 874, 874, 875, 876, 877, 878, 879, 880, 881, + 348, 352, 882, 883, 883, 883, 883, 883, 884, 885, 120, 886, 887, 888, + 889, 348, 348, 890, 891, 892, 892, 892, 892, 892, 892, 893, 894, 895, + 120, 120, 896, 897, 898, 899, 120, 900, 900, 900, 120, 372, 372, 54, 54, + 54, 54, 54, 901, 902, 120, 903, 903, 903, 903, 903, 903, 903, 903, 903, + 903, 897, 897, 897, 897, 904, 905, 906, 907, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, + 909, 909, 908, 909, 909, 910, 909, 909, 909, 909, 909, 909, 908, 909, + 909, 910, 909, 909, 909, 908, 909, 909, 910, 909, 909, 909, 908, 909, + 909, 911, 120, 368, 368, 912, 913, 369, 369, 369, 369, 369, 914, 915, + 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, + 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, + 915, 915, 915, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 917, 810, 810, 810, 810, 918, 120, 919, + 920, 121, 921, 922, 923, 924, 121, 128, 128, 128, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 925, 926, 927, 120, 928, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 876, 120, 120, 128, 128, 128, 128, 128, 128, 128, 128, 877, - 128, 128, 128, 128, 128, 128, 120, 120, 120, 120, 120, 128, 878, 879, - 879, 880, 881, 882, 883, 884, 885, 886, 887, 888, 889, 890, 891, 892, - 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, - 128, 128, 893, 894, 895, 896, 897, 898, 899, 899, 900, 901, 902, 902, - 903, 904, 905, 906, 905, 905, 905, 905, 907, 908, 908, 908, 909, 910, - 910, 910, 911, 912, 913, 120, 914, 915, 916, 915, 915, 917, 915, 915, - 918, 915, 919, 915, 919, 120, 120, 120, 120, 915, 915, 915, 915, 915, - 915, 915, 915, 915, 915, 915, 915, 915, 915, 915, 920, 921, 922, 922, - 922, 922, 922, 923, 607, 924, 924, 924, 924, 924, 924, 925, 926, 927, - 928, 572, 929, 930, 120, 120, 120, 120, 120, 607, 607, 607, 607, 607, - 931, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 932, 932, 932, 933, 934, 934, 934, 934, 934, 934, 935, - 120, 936, 937, 937, 938, 939, 939, 939, 939, 940, 120, 941, 941, 942, - 943, 944, 944, 944, 944, 945, 946, 947, 947, 947, 948, 949, 949, 949, - 949, 950, 949, 951, 120, 120, 120, 120, 120, 952, 952, 952, 952, 952, - 953, 953, 953, 953, 953, 954, 954, 954, 954, 954, 954, 955, 955, 955, - 956, 957, 958, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 959, - 959, 959, 959, 959, 120, 960, 960, 960, 960, 960, 960, 961, 962, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, - 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, - 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 963, 964, - 120, 963, 963, 965, 120, 963, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 966, 967, 968, - 968, 968, 968, 969, 970, 971, 971, 972, 973, 974, 974, 975, 976, 977, - 977, 977, 978, 979, 980, 120, 120, 120, 120, 120, 120, 981, 981, 982, - 983, 984, 984, 985, 986, 987, 987, 987, 988, 120, 120, 120, 120, 120, - 120, 120, 120, 989, 989, 989, 989, 990, 990, 990, 991, 992, 992, 993, - 992, 992, 992, 992, 992, 994, 995, 996, 997, 998, 998, 999, 1000, 1001, - 120, 1002, 1003, 1004, 1004, 1004, 1005, 1006, 1006, 1006, 1007, 120, - 120, 120, 120, 1008, 1009, 1008, 1008, 1010, 1011, 1012, 120, 1013, 1013, - 1013, 1013, 1013, 1013, 1014, 1015, 1016, 1016, 1017, 1018, 1019, 1019, - 1020, 1021, 1022, 1022, 1023, 1024, 120, 1025, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 1026, 1026, 1026, 1026, 1026, 1026, 1026, 1026, - 1026, 1027, 120, 120, 120, 120, 120, 120, 1028, 1028, 1028, 1028, 1028, - 1028, 1029, 120, 1030, 1030, 1030, 1030, 1030, 1030, 1031, 1032, 120, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 929, 120, + 120, 128, 128, 128, 128, 128, 128, 128, 128, 930, 128, 128, 128, 128, + 128, 128, 120, 120, 120, 120, 120, 128, 931, 932, 932, 933, 934, 935, + 936, 937, 938, 939, 940, 941, 942, 943, 944, 169, 128, 128, 128, 128, + 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 128, 945, 946, + 947, 948, 949, 950, 951, 951, 952, 953, 954, 954, 955, 956, 957, 958, + 959, 959, 959, 959, 960, 961, 961, 961, 962, 963, 963, 963, 964, 965, + 966, 120, 967, 968, 969, 968, 968, 970, 968, 968, 971, 968, 972, 968, + 972, 120, 120, 120, 120, 968, 968, 968, 968, 968, 968, 968, 968, 968, + 968, 968, 968, 968, 968, 968, 973, 974, 975, 975, 975, 975, 975, 976, + 615, 977, 977, 977, 977, 977, 977, 978, 979, 980, 981, 579, 982, 983, + 120, 120, 120, 120, 120, 615, 615, 615, 615, 615, 984, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 985, + 985, 985, 986, 987, 987, 987, 987, 987, 987, 988, 120, 989, 990, 990, + 991, 992, 992, 992, 992, 993, 120, 994, 994, 995, 996, 997, 997, 997, + 997, 998, 999, 1000, 1000, 1000, 1001, 1002, 1002, 1002, 1002, 1003, + 1002, 1004, 120, 120, 120, 120, 120, 1005, 1005, 1005, 1005, 1005, 1006, + 1006, 1006, 1006, 1006, 1007, 1007, 1007, 1007, 1007, 1007, 1008, 1008, + 1008, 1009, 1010, 1011, 1012, 1012, 1012, 1012, 1013, 1014, 1014, 1014, + 1014, 1015, 1016, 1016, 1016, 1016, 1016, 120, 1017, 1017, 1017, 1017, + 1017, 1017, 1018, 1019, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 1020, 1020, 1020, 1020, 1020, + 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, + 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, + 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1020, 1021, 120, 1020, + 1020, 1022, 120, 1020, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 1023, 1024, 1025, 1025, + 1025, 1025, 1026, 1027, 1028, 1028, 1029, 1030, 1031, 1031, 1032, 1033, + 1034, 1034, 1034, 1035, 1036, 1037, 120, 120, 120, 120, 120, 120, 1038, + 1038, 1039, 1040, 1041, 1041, 1042, 1043, 1044, 1044, 1044, 1045, 120, + 120, 120, 120, 120, 120, 120, 120, 1046, 1046, 1046, 1046, 1047, 1047, + 1047, 1048, 1049, 1049, 1050, 1049, 1049, 1049, 1049, 1049, 1051, 1052, + 1053, 1054, 1055, 1055, 1056, 1057, 1058, 120, 1059, 1060, 1061, 1061, + 1061, 1062, 1063, 1063, 1063, 1064, 120, 120, 120, 120, 1065, 1066, 1065, + 1065, 1067, 1068, 1069, 120, 1070, 1070, 1070, 1070, 1070, 1070, 1071, + 1072, 1073, 1073, 1074, 1075, 1076, 1076, 1077, 1078, 1079, 1079, 1080, + 1081, 120, 1082, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1083, + 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1083, 1084, 120, 120, 120, 120, + 120, 120, 1085, 1085, 1085, 1085, 1085, 1085, 1086, 120, 1087, 1087, + 1087, 1087, 1087, 1087, 1088, 1089, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 1090, 1090, 1090, 1091, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 1033, 1033, 1033, 1034, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 1035, 1036, 1036, 1036, 1036, 1036, - 1036, 1037, 1038, 1039, 1040, 1041, 1042, 1043, 120, 1044, 1045, 1046, - 1046, 1046, 1046, 1046, 1047, 1048, 1049, 120, 1050, 1050, 1050, 1051, - 1052, 1053, 1054, 1055, 1055, 1055, 1056, 1057, 1058, 1059, 1060, 120, - 1061, 1061, 1061, 1061, 1062, 120, 1063, 1064, 1064, 1064, 1064, 1064, - 1065, 1066, 1067, 1068, 1069, 1070, 1071, 1072, 1073, 120, 1074, 1074, - 1075, 1074, 1074, 1076, 1077, 1078, 120, 120, 120, 120, 120, 120, 120, - 120, 1079, 1080, 1081, 1082, 1081, 1083, 1084, 1084, 1084, 1084, 1084, - 1085, 1086, 1087, 1088, 1089, 1090, 1091, 1092, 1093, 1093, 1094, 1095, - 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1102, 120, 120, 120, 120, 120, + 120, 1092, 1093, 1093, 1093, 1093, 1093, 1093, 1094, 1095, 1096, 1097, + 1098, 1099, 1100, 120, 1101, 1102, 1103, 1103, 1103, 1103, 1103, 1104, + 1105, 1106, 120, 1107, 1107, 1107, 1108, 1109, 1110, 1111, 1112, 1112, + 1112, 1113, 1114, 1115, 1116, 1117, 120, 1118, 1118, 1118, 1118, 1119, + 120, 1120, 1121, 1121, 1121, 1121, 1121, 1122, 1123, 1124, 1125, 1126, + 1127, 1128, 1129, 1130, 120, 1131, 1131, 1132, 1131, 1131, 1133, 1134, + 1135, 120, 120, 120, 120, 120, 120, 120, 120, 1136, 1137, 1138, 1139, + 1138, 1140, 1141, 1141, 1141, 1141, 1141, 1142, 1143, 1144, 1145, 1146, + 1147, 1148, 1149, 1150, 1150, 1151, 1152, 1153, 1154, 1155, 1156, 1157, + 1158, 1159, 1159, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 1160, 1160, 1160, 1160, 1160, 1160, 1161, + 1162, 1163, 1164, 1165, 1166, 120, 120, 120, 120, 1167, 1167, 1167, 1167, + 1167, 1167, 1168, 1169, 1170, 120, 1171, 1172, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 1103, 1103, 1103, 1103, 1103, 1103, 1104, 1105, 1106, 120, 1107, 1108, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 1109, 1109, 1109, 1109, 1109, 1110, 1111, - 1112, 1113, 1114, 1114, 1115, 120, 120, 120, 120, 1116, 1116, 1116, 1116, - 1116, 1116, 1117, 1118, 1119, 120, 1120, 1121, 120, 120, 120, 120, 1122, - 1122, 1122, 1122, 1122, 1123, 1124, 120, 1125, 1126, 120, 120, 120, 120, - 120, 120, 1127, 1127, 1127, 1128, 1129, 1130, 1131, 1132, 120, 120, 120, + 120, 1173, 1173, 1173, 1173, 1173, 1174, 1175, 1176, 1177, 1178, 1179, + 1180, 120, 120, 120, 120, 1181, 1181, 1181, 1181, 1181, 1181, 1182, 1183, + 1184, 120, 1185, 1186, 1187, 1188, 120, 120, 1189, 1189, 1189, 1189, + 1189, 1190, 1191, 120, 1192, 1193, 120, 120, 120, 120, 120, 120, 1194, + 1194, 1194, 1195, 1196, 1197, 1198, 1199, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1133, - 1133, 1133, 1133, 1134, 1134, 1134, 1134, 1135, 1136, 1137, 1138, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1200, 1200, 1200, 1200, + 1201, 1201, 1201, 1201, 1202, 1203, 1204, 1205, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 1139, 1139, 1139, 1139, - 1139, 1139, 1139, 1140, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, - 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, - 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, - 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, - 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1142, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 1143, 1143, 1143, 1143, 1143, 1143, - 1143, 1143, 1143, 1143, 1143, 1143, 1143, 1144, 1145, 120, 1141, 1141, - 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, - 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1141, 1146, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 1147, 1147, 1147, 1147, 1147, - 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, - 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, - 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1147, 1148, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 1149, 1149, 1149, 1149, 1149, - 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, - 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, - 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1149, 1150, + 120, 120, 120, 120, 120, 1206, 1206, 1206, 1206, 1206, 1206, 1206, 1207, + 1208, 1209, 1208, 1208, 1208, 1210, 1211, 1212, 1213, 120, 1214, 1215, + 1216, 1217, 1218, 1219, 1219, 1219, 1220, 1221, 1221, 1222, 1223, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1225, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1226, 1226, 1226, + 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1226, 1227, 1228, + 120, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, 1224, + 1224, 1229, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1231, 1230, 1230, 1230, 1230, 1232, 1233, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1234, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, 1230, + 1230, 1230, 1235, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 776, 776, 776, 776, 776, - 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, - 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, 776, - 776, 776, 776, 776, 776, 776, 1151, 1152, 1152, 1152, 1153, 1154, 1155, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1156, 1156, - 1156, 1157, 1158, 120, 1159, 1159, 1159, 1159, 1159, 1159, 1160, 1161, - 1162, 120, 1163, 1164, 1165, 1159, 1159, 1166, 1159, 1159, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1167, 1167, 1167, - 1167, 1167, 1167, 1167, 1167, 1168, 120, 1169, 1170, 1170, 1170, 1170, - 1171, 120, 1172, 1173, 1174, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 1175, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, + 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, + 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, + 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, + 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1237, 1236, + 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, 1236, + 1236, 1238, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 826, 826, 826, + 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, + 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, 826, + 826, 826, 826, 826, 826, 826, 826, 826, 1239, 1240, 1240, 1240, 1241, + 1242, 1243, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 1244, 1244, 1244, 1245, 1246, 120, 1247, 1247, 1247, 1247, 1247, 1247, + 1248, 1249, 1250, 120, 1251, 1252, 1253, 1247, 1247, 1254, 1247, 1247, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 1176, 1176, 1176, 1176, 1176, 1176, - 1176, 1176, 1176, 1176, 1176, 1176, 1176, 1177, 1176, 1178, 1176, 1179, - 1176, 1180, 1181, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, - 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, 607, - 607, 607, 1182, 120, 607, 607, 607, 607, 1183, 1184, 607, 607, 607, 607, - 607, 607, 1185, 1186, 1187, 1188, 1189, 1190, 607, 607, 607, 1191, 607, - 607, 607, 607, 607, 607, 607, 1192, 120, 120, 927, 927, 927, 927, 927, - 927, 927, 927, 1193, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 614, 120, 922, 922, 1194, + 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1255, 1256, 120, 1257, 1258, + 1258, 1258, 1258, 1259, 120, 1260, 1261, 1262, 120, 120, 120, 120, 120, + 120, 120, 120, 1263, 120, 120, 120, 1264, 1264, 1264, 1264, 1264, 1264, + 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, + 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, + 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, + 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, + 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1265, 120, 120, 1264, 1264, + 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, + 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, 1264, + 1264, 1264, 1264, 1264, 1266, 120, 1267, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268, 1268, 1268, + 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1268, 1269, 1268, + 1270, 1268, 1271, 1268, 1272, 1273, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 615, 1274, 120, 615, 615, 615, 615, 1275, 1276, + 615, 615, 615, 615, 615, 615, 1277, 1278, 1279, 1280, 1281, 1282, 615, + 615, 615, 1283, 615, 615, 615, 615, 615, 615, 615, 1284, 120, 120, 980, + 980, 980, 980, 980, 980, 980, 980, 1285, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 1195, 1195, 1195, 1196, 1197, 1197, 1198, 1195, 1195, - 1199, 1200, 1197, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1201, 1202, - 1203, 1199, 1204, 1205, 1197, 1195, 1195, 1195, 1196, 1197, 1197, 1206, - 1207, 1208, 1209, 1197, 1197, 1197, 1210, 1211, 1212, 1213, 1197, 1197, - 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196, 1197, - 1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, 1196, - 1197, 1197, 1198, 1195, 1195, 1199, 1197, 1197, 1197, 1195, 1195, 1195, - 1196, 1197, 1197, 1214, 1195, 1195, 1195, 1215, 1197, 1197, 1216, 1217, - 1195, 1195, 1218, 1197, 1197, 1219, 1198, 1195, 1195, 1220, 1197, 1197, - 1221, 1222, 1195, 1195, 1223, 1197, 1197, 1197, 1224, 1195, 1195, 1195, - 1215, 1197, 1197, 1216, 1225, 1226, 1226, 1226, 1226, 1226, 1226, 1227, - 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, - 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1227, - 1227, 1227, 1227, 1227, 1227, 1227, 1227, 1228, 1228, 1228, 1228, 1228, - 1228, 1229, 1230, 1228, 1228, 1228, 1228, 1228, 1231, 1232, 1227, 1233, - 1234, 120, 1235, 1236, 1228, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, - 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, 1237, - 1237, 1238, 1239, 1240, 120, 120, 120, 120, 120, 1241, 128, 128, 128, - 1242, 1243, 1244, 1245, 1246, 1247, 1242, 1248, 1242, 1244, 1244, 1249, - 128, 1250, 128, 1251, 1252, 1250, 128, 1251, 120, 120, 120, 120, 120, - 120, 1253, 120, 572, 572, 572, 572, 572, 929, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 929, 120, 572, 614, 1254, 572, 1254, - 572, 1254, 572, 572, 572, 681, 120, 616, 1255, 618, 618, 618, 1256, 618, - 618, 618, 618, 618, 618, 618, 1257, 618, 618, 618, 618, 618, 1258, 120, - 120, 120, 120, 120, 120, 120, 120, 1259, 607, 607, 607, 1260, 120, 741, - 741, 741, 741, 741, 1261, 741, 1262, 1263, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 623, + 120, 975, 975, 1286, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 1287, 1287, 1287, 1288, 1289, 1289, + 1290, 1287, 1287, 1291, 1292, 1289, 1289, 1287, 1287, 1287, 1288, 1289, + 1289, 1293, 1294, 1295, 1291, 1296, 1297, 1289, 1287, 1287, 1287, 1288, + 1289, 1289, 1298, 1299, 1300, 1301, 1289, 1289, 1289, 1302, 1303, 1304, + 1305, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287, 1287, + 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, 1287, + 1287, 1287, 1288, 1289, 1289, 1290, 1287, 1287, 1291, 1289, 1289, 1289, + 1287, 1287, 1287, 1288, 1289, 1289, 1306, 1287, 1287, 1287, 1307, 1289, + 1289, 1308, 1309, 1287, 1287, 1310, 1289, 1289, 1311, 1290, 1287, 1287, + 1312, 1289, 1289, 1313, 1314, 1287, 1287, 1315, 1289, 1289, 1289, 1316, + 1287, 1287, 1287, 1307, 1289, 1289, 1308, 1317, 1318, 1318, 1318, 1318, + 1318, 1318, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, + 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, + 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1319, 1320, 1320, + 1320, 1320, 1320, 1320, 1321, 1322, 1320, 1320, 1320, 1320, 1320, 1323, + 1324, 1319, 1325, 1326, 120, 1327, 1328, 1320, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 1329, 1330, 1330, 1331, 1332, 1333, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 1264, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1265, 572, 572, 572, - 572, 1266, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 1267, 120, 572, - 1268, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 572, 572, 929, 120, 572, 572, 572, 572, 572, 572, 572, 572, 572, - 572, 1268, 120, 120, 120, 120, 120, 572, 929, 572, 572, 572, 572, 572, - 572, 572, 120, 572, 684, 572, 572, 572, 572, 572, 120, 572, 572, 572, - 681, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 572, - 1267, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1268, - 120, 120, 120, 120, 120, 120, 120, 1267, 120, 120, 120, 120, 120, 120, - 120, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 1269, - 760, 760, 760, 760, 760, 758, 758, 758, 758, 758, 758, 1270, 760, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, - 758, 758, 758, 758, 758, 864, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 760, 760, 760, 760, 758, 758, 758, 759, 760, 760, 760, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, - 1271, 1272, 120, 120, 120, 1273, 1273, 1273, 1273, 1273, 1273, 1273, - 1273, 1273, 1273, 1273, 1273, 120, 120, 120, 120, 120, 120, 120, 120, - 120, 120, 120, 120, 120, 120, 120, 120, 879, 879, 879, 879, 879, 879, - 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, - 879, 879, 879, 879, 879, 879, 879, 879, 879, 879, 120, 120, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, - 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, 863, - 863, 1274, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 1334, 1334, 1334, 1334, + 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, + 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1334, 1335, 1336, 1337, 120, + 120, 120, 120, 120, 1338, 1338, 1338, 1338, 1339, 1340, 1340, 1340, 1341, + 1342, 1343, 1344, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 1345, 128, 128, 128, 1346, + 1347, 1348, 1349, 1350, 1351, 1346, 1352, 1346, 1348, 1348, 1353, 128, + 1354, 128, 1355, 1356, 1354, 128, 1355, 120, 120, 120, 120, 120, 120, + 1357, 120, 1358, 1359, 1359, 1359, 1359, 1360, 1359, 1359, 1359, 1359, + 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1359, 1360, 1361, 1359, 1362, + 1363, 1359, 1363, 1364, 1363, 1359, 1359, 1359, 1365, 1361, 626, 1366, + 628, 628, 628, 1367, 628, 628, 628, 628, 628, 628, 628, 1368, 628, 628, + 628, 1369, 1370, 1371, 628, 1372, 1361, 1361, 1361, 1361, 1361, 1361, + 1373, 1374, 1374, 1374, 1375, 1361, 790, 790, 790, 790, 790, 1376, 790, + 1377, 1378, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757, + 757, 757, 757, 1379, 1380, 1381, 757, 757, 757, 757, 757, 757, 757, 757, + 1382, 1383, 757, 1384, 1385, 757, 757, 1386, 1387, 1388, 1389, 1384, + 1359, 757, 757, 1390, 1391, 757, 757, 757, 757, 757, 757, 757, 1392, + 1393, 1394, 1395, 757, 1396, 1397, 1394, 1398, 1399, 757, 757, 757, 1400, + 1401, 1402, 757, 757, 757, 757, 757, 757, 757, 757, 1403, 1404, 757, + 1405, 649, 1406, 757, 1407, 1408, 579, 1409, 757, 757, 757, 1359, 1410, + 1411, 1359, 1359, 1412, 1359, 1358, 1359, 1359, 1359, 1359, 1359, 1413, + 1414, 1359, 1359, 1413, 1415, 757, 757, 757, 757, 757, 757, 757, 757, + 1416, 1417, 579, 579, 579, 579, 1418, 1419, 757, 757, 757, 757, 1420, + 757, 1421, 757, 1422, 1358, 1423, 1361, 1359, 1424, 1425, 1361, 579, 579, + 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1426, 1361, + 579, 579, 579, 579, 579, 579, 579, 579, 579, 579, 1427, 1361, 1361, 1361, + 1361, 1361, 579, 1426, 579, 579, 579, 579, 579, 579, 579, 1361, 579, + 1428, 579, 579, 579, 579, 579, 1361, 579, 579, 579, 1429, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 757, 1430, + 1431, 1361, 1432, 1433, 757, 1434, 757, 1435, 1361, 1361, 1361, 1361, + 757, 757, 1436, 1361, 1361, 1361, 1361, 1361, 1437, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1361, + 1361, 1361, 1361, 1361, 1361, 1361, 1361, 1438, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 1439, 810, 810, 810, 810, 810, 808, + 808, 808, 808, 808, 808, 1440, 810, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 809, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, + 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 808, 917, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 808, 808, 808, 809, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 810, 1441, 1442, 120, 120, 120, 1443, + 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 1443, 120, + 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, 120, + 120, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, + 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, 932, + 932, 932, 932, 120, 120, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, + 916, 916, 916, 916, 916, 916, 916, 916, 1444, }; static const unsigned short index2[] = { - 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 2, 4, 3, 1, 1, 1, 1, 1, 1, 3, 3, 3, 2, - 5, 6, 6, 7, 8, 7, 6, 6, 9, 10, 6, 11, 12, 13, 12, 12, 14, 14, 14, 14, 14, - 14, 14, 14, 14, 14, 12, 6, 15, 16, 15, 6, 6, 17, 17, 17, 17, 17, 17, 17, - 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 17, 9, 6, 10, 18, 19, 18, 20, 20, - 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 20, 9, 16, - 10, 16, 1, 1, 1, 1, 1, 1, 3, 1, 1, 21, 22, 8, 8, 23, 8, 24, 22, 25, 26, - 27, 28, 16, 29, 30, 18, 31, 32, 33, 33, 25, 34, 22, 22, 25, 33, 27, 35, - 36, 36, 36, 22, 37, 37, 37, 37, 37, 37, 38, 37, 37, 37, 37, 37, 37, 37, - 37, 37, 38, 37, 37, 37, 37, 37, 37, 39, 38, 37, 37, 37, 37, 37, 38, 40, - 40, 40, 41, 41, 41, 41, 40, 41, 40, 40, 40, 41, 40, 40, 41, 41, 40, 41, - 40, 40, 41, 41, 41, 39, 40, 40, 40, 41, 40, 41, 40, 41, 37, 40, 37, 41, - 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 37, 40, 37, 40, 37, 41, - 37, 41, 37, 41, 37, 40, 37, 41, 37, 41, 37, 41, 37, 41, 37, 41, 38, 40, - 37, 40, 38, 40, 37, 41, 37, 41, 40, 37, 41, 37, 41, 37, 41, 38, 40, 38, - 40, 37, 40, 37, 41, 37, 40, 40, 38, 40, 37, 40, 37, 41, 37, 41, 38, 40, - 37, 41, 37, 41, 37, 37, 41, 37, 41, 37, 41, 41, 41, 37, 37, 41, 37, 41, - 37, 37, 41, 37, 37, 37, 41, 41, 37, 37, 37, 37, 41, 37, 37, 41, 37, 37, - 37, 41, 41, 41, 37, 37, 41, 37, 37, 41, 37, 41, 37, 41, 37, 37, 41, 37, - 41, 41, 37, 41, 37, 37, 41, 37, 37, 37, 41, 37, 41, 37, 37, 41, 41, 42, - 37, 41, 41, 41, 42, 42, 42, 42, 37, 43, 41, 37, 43, 41, 37, 43, 41, 37, - 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 37, 40, 41, 37, 41, - 41, 37, 43, 41, 37, 41, 37, 37, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, - 37, 37, 41, 37, 37, 41, 41, 37, 41, 37, 37, 37, 37, 41, 41, 40, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 42, 41, - 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 45, 45, 46, 46, 46, 46, 46, - 46, 46, 47, 47, 25, 47, 45, 48, 45, 48, 48, 48, 45, 48, 45, 45, 49, 46, - 47, 47, 47, 47, 47, 47, 25, 25, 25, 25, 47, 25, 47, 25, 44, 44, 44, 44, - 44, 47, 47, 47, 47, 47, 50, 50, 45, 47, 46, 47, 47, 47, 47, 47, 47, 47, - 47, 47, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 51, 52, 53, 53, - 53, 53, 52, 54, 53, 53, 53, 53, 53, 55, 55, 53, 53, 53, 53, 55, 55, 53, - 53, 53, 53, 53, 53, 53, 53, 53, 53, 53, 56, 56, 56, 56, 56, 53, 53, 53, - 53, 51, 51, 51, 51, 51, 51, 51, 51, 57, 51, 53, 53, 53, 51, 51, 51, 53, - 53, 58, 51, 51, 51, 53, 53, 53, 53, 51, 52, 53, 53, 51, 59, 60, 60, 59, - 60, 60, 59, 51, 51, 51, 51, 51, 61, 62, 61, 62, 45, 63, 61, 62, 64, 64, - 65, 62, 62, 62, 66, 61, 64, 64, 64, 64, 63, 47, 61, 66, 61, 61, 61, 64, - 61, 64, 61, 61, 62, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, 67, - 67, 67, 67, 67, 64, 67, 67, 67, 67, 67, 67, 67, 61, 61, 62, 62, 62, 62, - 62, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, 68, - 62, 68, 68, 68, 68, 68, 68, 68, 62, 62, 62, 62, 62, 61, 62, 62, 61, 61, - 61, 62, 62, 62, 61, 62, 61, 62, 61, 62, 61, 62, 61, 62, 69, 70, 69, 70, - 69, 70, 69, 70, 69, 70, 69, 70, 69, 70, 62, 62, 62, 62, 61, 62, 71, 61, - 62, 61, 61, 62, 62, 61, 61, 61, 72, 73, 72, 72, 72, 72, 72, 72, 72, 72, - 72, 72, 72, 72, 72, 72, 73, 73, 73, 73, 73, 73, 73, 73, 74, 74, 74, 74, - 74, 74, 74, 74, 75, 74, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, 75, - 75, 75, 72, 75, 72, 75, 72, 75, 72, 75, 72, 75, 76, 77, 77, 78, 78, 77, - 79, 79, 72, 75, 72, 75, 72, 75, 72, 72, 75, 72, 75, 72, 75, 72, 75, 72, - 75, 72, 75, 72, 75, 75, 64, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, - 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 80, 64, 64, 81, 82, 82, 82, 82, - 82, 82, 64, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, 83, - 64, 84, 85, 64, 64, 86, 86, 87, 64, 88, 89, 89, 89, 89, 88, 89, 89, 89, - 90, 88, 89, 89, 89, 89, 89, 89, 88, 88, 88, 88, 88, 88, 89, 89, 88, 89, - 89, 90, 91, 89, 92, 93, 94, 95, 96, 97, 98, 99, 100, 101, 101, 102, 103, - 104, 105, 106, 107, 108, 109, 107, 89, 88, 107, 100, 64, 64, 64, 64, 64, - 64, 64, 64, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 64, - 64, 64, 64, 64, 110, 110, 110, 107, 107, 64, 64, 64, 111, 111, 111, 111, - 111, 112, 113, 113, 114, 115, 115, 116, 117, 118, 119, 119, 120, 120, - 120, 120, 120, 120, 120, 120, 121, 122, 123, 124, 125, 64, 118, 124, 126, - 126, 126, 126, 126, 126, 126, 126, 127, 126, 126, 126, 126, 126, 126, - 126, 126, 126, 126, 128, 129, 130, 131, 132, 133, 134, 135, 78, 78, 136, - 137, 120, 120, 120, 120, 120, 137, 120, 120, 137, 138, 138, 138, 138, - 138, 138, 138, 138, 138, 138, 115, 139, 139, 118, 126, 126, 140, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 118, 126, 120, 120, - 120, 120, 120, 120, 120, 112, 119, 120, 120, 120, 120, 137, 120, 141, - 141, 120, 120, 119, 137, 120, 120, 137, 126, 126, 142, 142, 142, 142, - 142, 142, 142, 142, 142, 142, 126, 126, 126, 143, 143, 126, 144, 144, - 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 144, 64, 145, 146, - 147, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, 146, - 146, 148, 149, 148, 148, 149, 148, 148, 149, 149, 149, 148, 149, 149, - 148, 149, 148, 148, 148, 149, 148, 149, 148, 149, 148, 149, 148, 148, 64, - 64, 146, 146, 146, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, 150, - 150, 150, 150, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, 151, - 150, 64, 64, 64, 64, 64, 64, 152, 152, 152, 152, 152, 152, 152, 152, 152, - 152, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, 153, - 153, 153, 153, 153, 154, 154, 154, 154, 154, 154, 154, 155, 154, 156, - 156, 157, 158, 158, 158, 156, 64, 64, 64, 64, 64, 159, 159, 159, 159, - 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 160, 160, 160, 160, - 161, 160, 160, 160, 160, 160, 160, 160, 160, 160, 161, 160, 160, 160, - 161, 160, 160, 160, 160, 160, 64, 64, 162, 162, 162, 162, 162, 162, 162, - 162, 162, 162, 162, 162, 162, 162, 162, 64, 163, 163, 163, 163, 163, 163, - 163, 163, 163, 164, 164, 164, 64, 64, 165, 64, 126, 126, 126, 126, 126, - 64, 64, 64, 64, 64, 64, 137, 120, 120, 137, 120, 120, 137, 120, 120, 120, - 137, 137, 137, 166, 167, 168, 120, 120, 120, 137, 120, 120, 137, 137, - 120, 120, 120, 120, 120, 169, 169, 169, 170, 171, 171, 171, 171, 171, - 171, 171, 171, 171, 171, 171, 171, 171, 171, 169, 170, 172, 171, 170, - 170, 170, 169, 169, 169, 169, 169, 169, 169, 169, 170, 170, 170, 170, - 173, 170, 170, 171, 78, 136, 174, 174, 169, 169, 169, 171, 171, 169, 169, - 84, 84, 175, 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 177, 171, - 171, 171, 171, 171, 171, 178, 179, 180, 180, 64, 178, 178, 178, 178, 178, - 178, 178, 178, 64, 64, 178, 178, 64, 64, 178, 178, 178, 178, 178, 178, - 178, 178, 178, 178, 178, 178, 178, 178, 64, 178, 178, 178, 178, 178, 178, - 178, 64, 178, 64, 64, 64, 178, 178, 178, 178, 64, 64, 181, 178, 180, 180, - 180, 179, 179, 179, 179, 64, 64, 180, 180, 64, 64, 180, 180, 182, 178, - 64, 64, 64, 64, 64, 64, 64, 64, 180, 64, 64, 64, 64, 178, 178, 64, 178, - 178, 178, 179, 179, 64, 64, 183, 183, 183, 183, 183, 183, 183, 183, 183, - 183, 178, 178, 184, 184, 185, 185, 185, 185, 185, 185, 186, 184, 64, 64, - 64, 64, 64, 187, 187, 188, 64, 189, 189, 189, 189, 189, 189, 64, 64, 64, - 64, 189, 189, 64, 64, 189, 189, 189, 189, 189, 189, 189, 189, 189, 189, - 189, 189, 189, 189, 64, 189, 189, 189, 189, 189, 189, 189, 64, 189, 189, - 64, 189, 189, 64, 189, 189, 64, 64, 190, 64, 188, 188, 188, 187, 187, 64, - 64, 64, 64, 187, 187, 64, 64, 187, 187, 191, 64, 64, 64, 187, 64, 64, 64, - 64, 64, 64, 64, 189, 189, 189, 189, 64, 189, 64, 64, 64, 64, 64, 64, 64, - 192, 192, 192, 192, 192, 192, 192, 192, 192, 192, 187, 187, 189, 189, - 189, 187, 64, 64, 64, 193, 193, 194, 64, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 64, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195, - 195, 195, 195, 195, 195, 195, 195, 64, 195, 195, 195, 195, 195, 195, 195, - 64, 195, 195, 64, 195, 195, 195, 195, 195, 64, 64, 196, 195, 194, 194, - 194, 193, 193, 193, 193, 193, 64, 193, 193, 194, 64, 194, 194, 197, 64, - 64, 195, 64, 64, 64, 64, 64, 64, 64, 195, 195, 193, 193, 64, 64, 198, - 198, 198, 198, 198, 198, 198, 198, 198, 198, 199, 200, 64, 64, 64, 64, - 64, 64, 64, 195, 64, 64, 64, 64, 64, 64, 64, 201, 202, 202, 64, 203, 203, - 203, 203, 203, 203, 203, 203, 64, 64, 203, 203, 64, 64, 203, 203, 203, - 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 64, 203, 203, 203, - 203, 203, 203, 203, 64, 203, 203, 64, 203, 203, 203, 203, 203, 64, 64, - 204, 203, 202, 201, 202, 201, 201, 201, 201, 64, 64, 202, 202, 64, 64, - 202, 202, 205, 64, 64, 64, 64, 64, 64, 64, 64, 201, 202, 64, 64, 64, 64, - 203, 203, 64, 203, 203, 203, 201, 201, 64, 64, 206, 206, 206, 206, 206, - 206, 206, 206, 206, 206, 207, 203, 208, 208, 208, 208, 208, 208, 64, 64, - 209, 210, 64, 210, 210, 210, 210, 210, 210, 64, 64, 64, 210, 210, 210, - 64, 210, 210, 210, 210, 64, 64, 64, 210, 210, 64, 210, 64, 210, 210, 64, - 64, 64, 210, 210, 64, 64, 64, 210, 210, 210, 210, 210, 210, 210, 210, - 210, 210, 64, 64, 64, 64, 211, 211, 209, 211, 211, 64, 64, 64, 211, 211, - 211, 64, 211, 211, 211, 212, 64, 64, 210, 64, 64, 64, 64, 64, 64, 211, - 64, 64, 64, 64, 64, 64, 213, 213, 213, 213, 213, 213, 213, 213, 213, 213, - 214, 214, 214, 215, 215, 215, 215, 215, 215, 216, 215, 64, 64, 64, 64, - 64, 217, 218, 218, 218, 64, 219, 219, 219, 219, 219, 219, 219, 219, 64, - 219, 219, 219, 64, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, 219, - 219, 219, 219, 219, 219, 64, 64, 64, 219, 217, 217, 217, 218, 218, 218, - 218, 64, 217, 217, 217, 64, 217, 217, 217, 220, 64, 64, 64, 64, 64, 64, - 64, 221, 222, 64, 219, 219, 219, 64, 64, 64, 64, 64, 219, 219, 217, 217, - 64, 64, 223, 223, 223, 223, 223, 223, 223, 223, 223, 223, 224, 224, 224, - 224, 224, 224, 224, 225, 64, 226, 227, 227, 64, 228, 228, 228, 228, 228, - 228, 228, 228, 64, 228, 228, 228, 64, 228, 228, 228, 228, 228, 228, 228, - 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 228, 64, 228, 228, 228, - 228, 228, 64, 64, 229, 228, 227, 230, 227, 227, 227, 227, 227, 64, 230, - 227, 227, 64, 227, 227, 226, 231, 64, 64, 64, 64, 64, 64, 64, 227, 227, - 64, 64, 64, 64, 64, 64, 64, 228, 64, 228, 228, 226, 226, 64, 64, 232, - 232, 232, 232, 232, 232, 232, 232, 232, 232, 64, 228, 228, 64, 64, 64, - 64, 64, 64, 233, 234, 234, 64, 235, 235, 235, 235, 235, 235, 235, 235, - 64, 235, 235, 235, 64, 235, 235, 235, 235, 235, 235, 235, 235, 235, 235, - 235, 235, 235, 235, 235, 235, 235, 64, 64, 235, 234, 234, 234, 233, 233, - 233, 233, 64, 234, 234, 234, 64, 234, 234, 234, 236, 235, 64, 64, 64, 64, - 64, 64, 64, 64, 234, 64, 64, 64, 64, 64, 64, 64, 235, 235, 235, 233, 233, - 64, 64, 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 238, 238, 238, - 238, 238, 238, 64, 64, 64, 239, 235, 235, 235, 235, 235, 235, 64, 64, - 240, 240, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, 241, - 241, 241, 241, 241, 241, 241, 64, 64, 64, 241, 241, 241, 241, 241, 241, - 241, 241, 64, 241, 241, 241, 241, 241, 241, 241, 241, 241, 64, 241, 64, - 64, 64, 64, 242, 64, 64, 64, 64, 240, 240, 240, 243, 243, 243, 64, 243, - 64, 240, 240, 240, 240, 240, 240, 240, 240, 64, 64, 64, 64, 64, 64, 244, - 244, 244, 244, 244, 244, 244, 244, 244, 244, 64, 64, 240, 240, 245, 64, - 64, 64, 64, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, - 246, 246, 246, 246, 247, 246, 246, 247, 247, 247, 247, 248, 248, 249, 64, - 64, 64, 64, 250, 246, 246, 246, 246, 246, 246, 251, 247, 252, 252, 252, - 252, 247, 247, 247, 253, 254, 254, 254, 254, 254, 254, 254, 254, 254, - 254, 253, 253, 64, 64, 64, 64, 64, 255, 255, 64, 255, 64, 64, 255, 255, - 64, 255, 64, 64, 255, 64, 64, 64, 64, 64, 64, 255, 255, 255, 255, 64, - 255, 255, 255, 255, 255, 255, 255, 64, 255, 255, 255, 64, 255, 64, 255, - 64, 64, 255, 255, 64, 255, 255, 255, 255, 256, 255, 255, 256, 256, 256, - 256, 257, 257, 64, 256, 256, 255, 64, 64, 255, 255, 255, 255, 255, 64, - 258, 64, 259, 259, 259, 259, 256, 256, 64, 64, 260, 260, 260, 260, 260, - 260, 260, 260, 260, 260, 64, 64, 255, 255, 255, 255, 261, 262, 262, 262, - 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, 263, - 263, 262, 263, 262, 262, 262, 264, 264, 262, 262, 262, 262, 262, 262, - 265, 265, 265, 265, 265, 265, 265, 265, 265, 265, 266, 266, 266, 266, - 266, 266, 266, 266, 266, 266, 262, 264, 262, 264, 262, 267, 268, 269, - 268, 269, 270, 270, 261, 261, 261, 261, 261, 261, 261, 261, 64, 261, 261, - 261, 261, 261, 261, 261, 261, 261, 261, 261, 261, 64, 64, 64, 64, 271, - 272, 273, 274, 273, 273, 273, 273, 273, 272, 272, 272, 272, 273, 270, - 272, 273, 275, 275, 276, 263, 275, 275, 261, 261, 261, 261, 261, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 273, 273, 64, 273, 273, 273, 273, - 273, 273, 273, 273, 273, 273, 273, 273, 64, 262, 262, 262, 262, 262, 262, - 262, 262, 264, 262, 262, 262, 262, 262, 262, 64, 262, 262, 263, 263, 263, - 263, 263, 277, 277, 277, 277, 263, 263, 64, 64, 64, 64, 64, 278, 278, - 278, 278, 278, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280, 280, - 280, 279, 280, 280, 280, 280, 280, 281, 279, 282, 282, 279, 279, 280, - 280, 278, 283, 283, 283, 283, 283, 283, 283, 283, 283, 283, 284, 284, - 284, 284, 284, 284, 278, 278, 278, 278, 278, 278, 279, 279, 280, 280, - 278, 278, 278, 278, 280, 280, 280, 278, 279, 279, 279, 278, 278, 279, - 279, 279, 279, 279, 279, 279, 278, 278, 278, 280, 280, 280, 280, 278, - 278, 278, 278, 278, 280, 279, 279, 280, 280, 279, 279, 279, 279, 279, - 279, 285, 278, 279, 283, 283, 279, 279, 279, 280, 286, 286, 287, 287, - 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 287, 64, 287, 64, - 64, 64, 64, 64, 287, 64, 64, 288, 288, 288, 288, 288, 288, 288, 288, 288, - 288, 288, 84, 289, 288, 288, 288, 290, 290, 290, 290, 290, 290, 290, 290, - 291, 291, 291, 291, 291, 291, 291, 291, 292, 292, 292, 292, 292, 292, - 292, 292, 292, 64, 292, 292, 292, 292, 64, 64, 292, 292, 292, 292, 292, - 292, 292, 64, 292, 292, 292, 64, 64, 293, 293, 293, 294, 294, 294, 294, - 294, 294, 294, 294, 294, 295, 295, 295, 295, 295, 295, 295, 295, 295, - 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 295, 64, 64, 64, 296, - 296, 296, 296, 296, 296, 296, 296, 296, 296, 64, 64, 64, 64, 64, 64, 297, - 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 297, 64, 64, - 298, 298, 298, 298, 298, 298, 64, 64, 299, 300, 300, 300, 300, 300, 300, - 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, 300, - 301, 301, 300, 302, 303, 303, 303, 303, 303, 303, 303, 303, 303, 303, - 303, 303, 303, 303, 303, 303, 303, 303, 304, 305, 64, 64, 64, 306, 306, - 306, 306, 306, 306, 306, 306, 306, 306, 306, 84, 84, 84, 307, 307, 307, - 306, 306, 306, 306, 306, 306, 306, 306, 64, 64, 64, 64, 64, 64, 64, 308, - 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 308, 64, 308, 308, - 308, 308, 309, 309, 310, 64, 64, 64, 311, 311, 311, 311, 311, 311, 311, - 311, 311, 311, 312, 312, 313, 84, 84, 64, 314, 314, 314, 314, 314, 314, - 314, 314, 314, 314, 315, 315, 64, 64, 64, 64, 316, 316, 316, 316, 316, - 316, 316, 316, 316, 316, 316, 316, 316, 64, 316, 316, 316, 64, 317, 317, - 64, 64, 64, 64, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, 318, - 318, 319, 319, 320, 319, 319, 319, 319, 319, 319, 319, 320, 320, 320, - 320, 320, 320, 320, 320, 319, 320, 320, 319, 319, 319, 319, 319, 319, - 319, 319, 319, 321, 319, 322, 322, 322, 323, 322, 322, 322, 324, 318, - 325, 64, 64, 326, 326, 326, 326, 326, 326, 326, 326, 326, 326, 64, 64, - 64, 64, 64, 64, 327, 327, 327, 327, 327, 327, 327, 327, 327, 327, 64, 64, - 64, 64, 64, 64, 328, 328, 66, 66, 328, 66, 329, 328, 328, 328, 328, 330, - 330, 330, 331, 64, 332, 332, 332, 332, 332, 332, 332, 332, 332, 332, 64, - 64, 64, 64, 64, 64, 333, 333, 333, 333, 333, 333, 333, 333, 333, 333, - 333, 334, 333, 333, 333, 333, 333, 335, 333, 64, 64, 64, 64, 64, 300, - 300, 300, 300, 300, 300, 64, 64, 336, 336, 336, 336, 336, 336, 336, 336, - 336, 336, 336, 336, 336, 336, 336, 64, 337, 337, 337, 338, 338, 338, 338, - 337, 337, 338, 338, 338, 64, 64, 64, 64, 338, 338, 337, 338, 338, 338, - 338, 338, 338, 339, 340, 341, 64, 64, 64, 64, 342, 64, 64, 64, 343, 343, - 344, 344, 344, 344, 344, 344, 344, 344, 344, 344, 345, 345, 345, 345, - 345, 345, 345, 345, 345, 345, 345, 345, 345, 345, 64, 64, 345, 345, 345, - 345, 345, 64, 64, 64, 346, 346, 346, 346, 346, 346, 346, 346, 346, 346, - 346, 346, 64, 64, 64, 64, 346, 346, 64, 64, 64, 64, 64, 64, 347, 347, - 347, 347, 347, 347, 347, 347, 347, 347, 348, 64, 64, 64, 349, 349, 350, - 350, 350, 350, 350, 350, 350, 350, 351, 351, 351, 351, 351, 351, 351, - 351, 351, 351, 351, 351, 351, 351, 351, 352, 353, 354, 354, 355, 64, 64, - 356, 356, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, 357, - 357, 358, 359, 358, 359, 359, 359, 359, 359, 359, 359, 64, 360, 358, 359, - 358, 358, 359, 359, 359, 359, 359, 359, 359, 359, 358, 358, 358, 358, - 358, 358, 359, 359, 361, 361, 361, 361, 361, 361, 361, 361, 64, 64, 362, - 363, 363, 363, 363, 363, 363, 363, 363, 363, 363, 64, 64, 64, 64, 64, 64, - 364, 364, 364, 364, 364, 364, 364, 365, 364, 364, 364, 364, 364, 364, 64, - 64, 78, 78, 78, 78, 78, 136, 136, 136, 136, 136, 136, 78, 78, 136, 366, - 64, 367, 367, 367, 367, 368, 369, 369, 369, 369, 369, 369, 369, 369, 369, - 369, 369, 369, 369, 369, 369, 370, 368, 367, 367, 367, 367, 367, 368, - 367, 368, 368, 368, 368, 368, 367, 368, 371, 369, 369, 369, 369, 369, - 369, 369, 64, 64, 64, 64, 372, 372, 372, 372, 372, 372, 372, 372, 372, - 372, 373, 373, 373, 373, 373, 373, 373, 374, 374, 374, 374, 374, 374, - 374, 374, 374, 374, 375, 376, 375, 375, 375, 375, 375, 375, 375, 374, - 374, 374, 374, 374, 374, 374, 374, 374, 64, 64, 64, 377, 377, 378, 379, - 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 379, 378, - 377, 377, 377, 377, 378, 378, 377, 377, 380, 381, 377, 377, 379, 379, - 382, 382, 382, 382, 382, 382, 382, 382, 382, 382, 379, 379, 379, 379, - 379, 379, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, 383, - 383, 383, 384, 385, 386, 386, 385, 385, 385, 386, 385, 386, 386, 386, - 387, 387, 64, 64, 64, 64, 64, 64, 64, 64, 388, 388, 388, 388, 389, 389, - 389, 389, 389, 389, 389, 389, 389, 389, 389, 389, 390, 390, 390, 390, - 390, 390, 390, 390, 391, 391, 391, 391, 391, 391, 391, 391, 390, 390, - 391, 392, 64, 64, 64, 393, 393, 393, 393, 393, 394, 394, 394, 394, 394, - 394, 394, 394, 394, 394, 64, 64, 64, 389, 389, 389, 395, 395, 395, 395, - 395, 395, 395, 395, 395, 395, 396, 396, 396, 396, 396, 396, 396, 396, - 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, 397, 398, 398, - 399, 399, 399, 399, 399, 399, 399, 399, 78, 78, 78, 84, 400, 136, 136, - 136, 136, 136, 78, 78, 136, 136, 136, 136, 78, 401, 400, 400, 400, 400, - 400, 400, 400, 402, 402, 402, 402, 136, 402, 402, 402, 402, 401, 401, 78, - 402, 402, 64, 78, 78, 64, 64, 64, 64, 64, 64, 41, 41, 41, 41, 41, 41, 62, - 62, 62, 62, 62, 75, 44, 44, 44, 44, 44, 44, 44, 44, 44, 65, 65, 65, 65, - 65, 44, 44, 44, 44, 65, 65, 65, 65, 65, 41, 41, 41, 41, 41, 403, 41, 41, - 41, 41, 41, 41, 41, 41, 41, 41, 44, 44, 44, 44, 44, 44, 44, 44, 44, 44, - 44, 44, 65, 78, 78, 136, 78, 78, 78, 78, 78, 78, 78, 136, 78, 78, 404, - 405, 136, 406, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, 78, - 78, 78, 78, 78, 78, 78, 78, 64, 64, 64, 64, 64, 64, 407, 136, 78, 136, - 37, 41, 37, 41, 37, 41, 41, 41, 41, 41, 41, 41, 41, 41, 37, 41, 62, 62, - 62, 62, 62, 62, 62, 62, 61, 61, 61, 61, 61, 61, 61, 61, 62, 62, 62, 62, - 62, 62, 64, 64, 61, 61, 61, 61, 61, 61, 64, 64, 64, 61, 64, 61, 64, 61, - 64, 61, 408, 408, 408, 408, 408, 408, 408, 408, 62, 62, 62, 62, 62, 64, - 62, 62, 61, 61, 61, 61, 408, 63, 62, 63, 63, 63, 62, 62, 62, 64, 62, 62, - 61, 61, 61, 61, 408, 63, 63, 63, 62, 62, 62, 62, 64, 64, 62, 62, 61, 61, - 61, 61, 64, 63, 63, 63, 61, 61, 61, 61, 61, 63, 63, 63, 64, 64, 62, 62, - 62, 64, 62, 62, 61, 61, 61, 61, 408, 63, 63, 64, 409, 409, 409, 409, 409, - 409, 409, 409, 409, 409, 409, 410, 411, 411, 412, 413, 414, 415, 415, - 414, 414, 414, 22, 66, 416, 417, 418, 419, 416, 417, 418, 419, 22, 22, - 22, 66, 22, 22, 22, 22, 420, 421, 422, 423, 424, 425, 426, 21, 427, 428, - 427, 427, 428, 22, 66, 66, 66, 28, 35, 22, 66, 66, 22, 429, 429, 66, 66, - 66, 430, 431, 432, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 433, 66, - 429, 66, 66, 66, 66, 66, 66, 66, 66, 66, 66, 409, 410, 410, 410, 410, - 410, 64, 434, 435, 436, 437, 410, 410, 410, 410, 410, 410, 438, 44, 64, - 64, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 440, 438, 33, - 33, 33, 33, 438, 438, 438, 438, 438, 439, 439, 433, 431, 432, 64, 44, 44, - 44, 44, 44, 64, 64, 64, 250, 250, 250, 250, 250, 250, 250, 250, 250, 441, - 250, 250, 23, 250, 250, 250, 250, 250, 250, 250, 250, 250, 250, 64, 78, - 78, 400, 400, 78, 78, 78, 78, 400, 400, 400, 78, 78, 366, 366, 366, 366, - 78, 366, 366, 366, 400, 400, 78, 136, 78, 400, 400, 136, 136, 136, 136, - 78, 64, 64, 64, 64, 64, 64, 64, 26, 26, 442, 30, 26, 30, 26, 442, 26, 30, - 34, 442, 442, 442, 34, 34, 442, 442, 442, 443, 26, 442, 30, 26, 433, 442, - 442, 442, 442, 442, 26, 26, 26, 30, 30, 26, 442, 26, 67, 26, 442, 26, 37, - 38, 442, 442, 444, 34, 442, 442, 37, 442, 34, 402, 402, 402, 402, 34, 26, - 26, 34, 34, 442, 442, 445, 433, 433, 433, 433, 442, 34, 34, 34, 34, 26, - 433, 26, 26, 41, 277, 446, 446, 446, 36, 36, 446, 446, 446, 446, 446, - 446, 36, 36, 36, 36, 446, 447, 447, 447, 447, 447, 447, 447, 447, 447, - 447, 447, 447, 448, 448, 448, 448, 447, 447, 448, 448, 448, 448, 448, - 448, 448, 448, 448, 37, 41, 448, 448, 448, 448, 36, 26, 26, 64, 64, 64, - 64, 39, 39, 39, 39, 39, 30, 30, 30, 30, 30, 433, 433, 26, 26, 26, 26, - 433, 26, 26, 433, 26, 26, 433, 26, 26, 26, 26, 26, 26, 26, 433, 26, 26, - 26, 26, 26, 26, 26, 26, 26, 30, 30, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 26, 433, 433, 26, 26, 39, 26, 39, 26, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 30, 26, 26, 26, 26, 433, 433, 433, 433, 433, 433, 433, 433, 433, - 433, 433, 433, 39, 445, 449, 449, 445, 433, 433, 39, 449, 445, 445, 449, - 445, 445, 433, 39, 433, 449, 439, 450, 433, 449, 445, 433, 433, 433, 449, - 445, 445, 449, 39, 449, 449, 445, 445, 39, 445, 39, 445, 39, 39, 39, 39, - 449, 449, 445, 449, 445, 445, 445, 445, 445, 39, 39, 39, 39, 433, 445, - 433, 445, 449, 449, 445, 445, 445, 445, 445, 445, 445, 445, 445, 445, - 449, 445, 445, 445, 449, 433, 433, 433, 433, 433, 449, 445, 445, 445, - 433, 433, 433, 433, 433, 433, 433, 433, 433, 445, 449, 39, 445, 433, 449, - 449, 449, 449, 445, 445, 449, 449, 433, 433, 449, 449, 445, 445, 449, - 449, 445, 445, 449, 449, 445, 445, 445, 445, 445, 433, 433, 445, 445, - 445, 445, 433, 433, 39, 433, 433, 445, 39, 433, 433, 433, 433, 433, 433, - 433, 433, 445, 445, 433, 39, 445, 445, 445, 433, 433, 433, 433, 433, 445, - 449, 433, 445, 445, 445, 445, 445, 433, 433, 445, 445, 433, 433, 433, - 433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 431, 432, 431, - 432, 26, 26, 26, 26, 26, 26, 30, 26, 26, 26, 26, 26, 445, 445, 26, 26, - 26, 26, 26, 26, 26, 451, 452, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, - 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 26, 433, - 26, 26, 26, 26, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 433, 433, 433, - 433, 433, 433, 433, 433, 433, 26, 26, 26, 26, 433, 433, 26, 26, 26, 26, - 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 26, 26, 64, - 36, 36, 36, 36, 36, 36, 36, 36, 33, 33, 33, 33, 33, 33, 33, 33, 33, 33, - 33, 33, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, 453, - 453, 446, 36, 36, 36, 36, 36, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, - 30, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 26, 26, 30, 30, 26, 30, 30, - 30, 30, 30, 26, 26, 30, 30, 26, 26, 30, 39, 26, 26, 26, 26, 30, 30, 26, - 26, 30, 39, 26, 26, 26, 26, 30, 30, 30, 26, 26, 30, 26, 26, 30, 30, 26, - 26, 26, 26, 26, 30, 30, 26, 26, 30, 26, 26, 26, 26, 30, 30, 26, 26, 26, - 26, 30, 26, 30, 26, 30, 26, 30, 26, 26, 26, 26, 26, 30, 30, 26, 30, 30, - 30, 26, 30, 30, 30, 30, 26, 30, 30, 26, 39, 26, 26, 26, 26, 26, 26, 30, - 30, 26, 26, 26, 26, 277, 26, 26, 26, 26, 26, 26, 26, 30, 30, 30, 30, 30, - 30, 30, 30, 30, 30, 26, 30, 30, 30, 26, 30, 26, 26, 26, 26, 26, 26, 26, - 26, 26, 30, 26, 26, 431, 432, 431, 432, 431, 432, 431, 432, 431, 432, - 431, 432, 431, 432, 36, 36, 446, 446, 446, 446, 446, 446, 446, 446, 446, - 446, 446, 446, 26, 26, 26, 26, 445, 433, 433, 445, 445, 431, 432, 433, - 445, 445, 433, 445, 445, 445, 433, 433, 433, 433, 433, 445, 445, 445, - 445, 433, 433, 433, 433, 433, 445, 445, 445, 433, 433, 433, 445, 445, - 445, 445, 9, 10, 9, 10, 9, 10, 9, 10, 431, 432, 454, 454, 454, 454, 454, - 454, 454, 454, 433, 433, 433, 431, 432, 9, 10, 431, 432, 431, 432, 431, - 432, 431, 432, 431, 432, 433, 433, 445, 445, 445, 445, 445, 445, 433, - 433, 433, 433, 433, 433, 433, 433, 445, 433, 433, 433, 433, 445, 445, - 445, 445, 445, 433, 445, 445, 433, 433, 431, 432, 431, 432, 445, 433, - 433, 433, 433, 445, 433, 445, 445, 445, 433, 433, 445, 445, 433, 433, - 433, 433, 433, 433, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445, - 433, 433, 431, 432, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445, - 445, 445, 445, 445, 445, 433, 445, 445, 445, 445, 433, 433, 445, 433, - 445, 433, 433, 445, 433, 445, 445, 445, 445, 433, 433, 433, 433, 433, - 445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 433, 445, 445, 433, - 433, 445, 445, 433, 433, 433, 433, 445, 445, 445, 445, 445, 445, 445, - 445, 445, 445, 445, 433, 433, 445, 445, 445, 445, 445, 445, 445, 445, - 433, 445, 445, 445, 445, 445, 445, 445, 445, 433, 433, 433, 433, 433, - 445, 433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 433, 433, - 433, 445, 433, 433, 433, 445, 445, 445, 445, 445, 433, 445, 433, 433, - 433, 433, 433, 433, 433, 26, 26, 433, 433, 433, 433, 433, 433, 26, 26, - 26, 26, 26, 26, 26, 26, 30, 30, 30, 26, 26, 26, 26, 64, 64, 26, 26, 26, - 26, 26, 26, 26, 26, 64, 64, 26, 26, 64, 64, 64, 26, 26, 26, 26, 64, 26, - 26, 26, 26, 26, 26, 26, 26, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 26, - 26, 26, 26, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, 455, - 455, 455, 455, 64, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, 456, - 456, 456, 456, 456, 64, 37, 41, 37, 37, 37, 41, 41, 37, 41, 37, 41, 37, - 41, 37, 37, 37, 37, 41, 37, 41, 41, 37, 41, 41, 41, 41, 41, 41, 44, 44, - 37, 37, 69, 70, 69, 70, 70, 457, 457, 457, 457, 457, 457, 69, 70, 69, 70, - 458, 458, 458, 69, 70, 64, 64, 64, 64, 64, 459, 459, 459, 459, 460, 459, - 459, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, 461, - 461, 64, 461, 64, 64, 64, 64, 64, 461, 64, 64, 462, 462, 462, 462, 462, - 462, 462, 462, 64, 64, 64, 64, 64, 64, 64, 463, 464, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 64, 64, 465, 77, 77, 77, 77, 77, 77, 77, 77, - 66, 66, 28, 35, 28, 35, 66, 66, 66, 28, 35, 66, 28, 35, 66, 66, 66, 66, - 66, 66, 66, 66, 66, 415, 66, 66, 415, 66, 28, 35, 66, 66, 28, 35, 431, - 432, 431, 432, 431, 432, 431, 432, 66, 66, 66, 66, 66, 45, 66, 66, 415, - 415, 66, 66, 66, 66, 415, 66, 418, 64, 64, 64, 64, 64, 466, 466, 466, - 466, 466, 466, 466, 466, 466, 466, 64, 466, 466, 466, 466, 466, 466, 466, - 466, 466, 64, 64, 64, 64, 466, 466, 466, 466, 466, 466, 64, 64, 467, 467, - 467, 467, 467, 467, 467, 467, 467, 467, 467, 467, 64, 64, 64, 64, 468, - 469, 469, 469, 467, 470, 471, 472, 451, 452, 451, 452, 451, 452, 451, - 452, 451, 452, 467, 467, 451, 452, 451, 452, 451, 452, 451, 452, 473, - 474, 475, 475, 467, 472, 472, 472, 472, 472, 472, 472, 472, 472, 476, - 477, 478, 479, 480, 480, 473, 481, 481, 481, 481, 481, 467, 467, 472, - 472, 472, 470, 471, 469, 467, 26, 64, 482, 482, 482, 482, 482, 482, 482, - 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, 482, - 482, 64, 64, 483, 483, 484, 484, 485, 485, 482, 473, 486, 486, 486, 486, - 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, 486, - 469, 481, 487, 487, 486, 64, 64, 64, 64, 64, 488, 488, 488, 488, 488, - 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 488, 64, 64, 64, - 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 290, 64, - 489, 489, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 489, 489, - 489, 489, 488, 488, 488, 64, 64, 64, 64, 64, 491, 491, 491, 491, 491, - 491, 491, 491, 491, 491, 491, 491, 491, 492, 492, 64, 490, 490, 490, 490, - 490, 490, 490, 490, 490, 490, 489, 489, 489, 489, 489, 489, 493, 493, - 493, 493, 493, 493, 493, 493, 467, 494, 494, 494, 494, 494, 494, 494, - 494, 494, 494, 494, 494, 494, 494, 494, 491, 491, 491, 491, 492, 492, - 492, 489, 489, 494, 494, 494, 494, 494, 494, 494, 489, 489, 489, 489, - 467, 467, 467, 467, 495, 495, 495, 495, 495, 495, 495, 495, 495, 495, - 495, 495, 495, 495, 495, 64, 489, 489, 489, 489, 489, 489, 489, 467, 467, - 467, 467, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 489, 467, - 467, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, 496, - 496, 497, 497, 497, 497, 497, 497, 497, 497, 497, 497, 498, 498, 498, - 498, 498, 498, 498, 498, 498, 498, 498, 498, 498, 499, 498, 498, 498, - 498, 498, 498, 498, 64, 64, 64, 500, 500, 500, 500, 500, 500, 500, 500, - 500, 500, 500, 500, 500, 500, 500, 64, 501, 501, 501, 501, 501, 501, 501, - 501, 502, 502, 502, 502, 502, 502, 503, 503, 504, 504, 504, 504, 504, - 504, 504, 504, 504, 504, 504, 504, 505, 506, 506, 506, 507, 507, 507, - 507, 507, 507, 507, 507, 507, 507, 504, 504, 64, 64, 64, 64, 72, 75, 72, - 75, 72, 75, 508, 77, 79, 79, 79, 509, 77, 77, 77, 77, 77, 77, 77, 77, 77, - 77, 509, 510, 72, 75, 72, 75, 403, 403, 77, 77, 511, 511, 511, 511, 511, - 511, 511, 511, 511, 511, 511, 511, 511, 511, 512, 512, 512, 512, 512, - 512, 512, 512, 512, 512, 513, 513, 514, 514, 514, 514, 514, 514, 47, 47, - 47, 47, 47, 47, 47, 45, 45, 45, 45, 45, 45, 45, 45, 45, 47, 47, 37, 41, - 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 41, 44, 41, 41, 41, 41, 41, - 41, 41, 41, 37, 41, 37, 41, 37, 37, 41, 45, 515, 515, 37, 41, 37, 41, 42, - 37, 41, 37, 41, 41, 41, 37, 41, 37, 41, 37, 37, 37, 37, 64, 64, 37, 37, - 37, 37, 37, 41, 37, 41, 64, 64, 64, 64, 64, 64, 64, 42, 44, 44, 41, 42, - 42, 42, 42, 42, 516, 516, 517, 516, 516, 516, 518, 516, 516, 516, 516, - 517, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, - 516, 516, 519, 519, 517, 517, 519, 520, 520, 520, 520, 64, 64, 64, 64, - 521, 521, 521, 521, 521, 521, 277, 277, 250, 444, 64, 64, 64, 64, 64, 64, - 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 522, 523, 523, - 523, 523, 524, 524, 525, 525, 525, 525, 525, 525, 525, 525, 525, 525, - 525, 525, 525, 525, 525, 525, 525, 525, 524, 524, 524, 524, 524, 524, - 524, 524, 524, 524, 524, 524, 524, 524, 524, 524, 526, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 527, 527, 528, 528, 528, 528, 528, 528, 528, 528, - 528, 528, 64, 64, 64, 64, 64, 64, 174, 174, 174, 174, 174, 174, 174, 174, - 174, 174, 171, 171, 171, 171, 171, 171, 176, 176, 176, 171, 176, 171, 64, - 64, 529, 529, 529, 529, 529, 529, 529, 529, 529, 529, 530, 530, 530, 530, - 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, 530, - 530, 530, 531, 531, 531, 531, 531, 532, 532, 532, 84, 533, 534, 534, 534, - 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 534, 535, 535, - 535, 535, 535, 535, 535, 535, 535, 535, 535, 536, 537, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 64, 538, 290, 290, 290, 290, 290, 64, 64, 64, - 539, 539, 539, 540, 541, 541, 541, 541, 541, 541, 541, 541, 541, 541, - 541, 541, 541, 541, 541, 542, 540, 540, 539, 539, 539, 539, 540, 540, - 539, 540, 540, 540, 543, 544, 544, 544, 544, 544, 544, 544, 544, 544, - 544, 544, 544, 544, 64, 46, 545, 545, 545, 545, 545, 545, 545, 545, 545, - 545, 64, 64, 64, 64, 544, 544, 278, 278, 278, 278, 278, 280, 546, 278, - 283, 283, 278, 278, 278, 278, 278, 64, 547, 547, 547, 547, 547, 547, 547, - 547, 547, 548, 548, 548, 548, 548, 548, 549, 549, 548, 548, 549, 549, - 548, 548, 64, 547, 547, 547, 548, 547, 547, 547, 547, 547, 547, 547, 547, - 548, 549, 64, 64, 550, 550, 550, 550, 550, 550, 550, 550, 550, 550, 64, - 64, 551, 551, 551, 551, 546, 278, 278, 278, 278, 278, 278, 286, 286, 286, - 278, 279, 280, 279, 278, 278, 552, 552, 552, 552, 552, 552, 552, 552, - 553, 552, 553, 553, 554, 552, 552, 553, 553, 552, 552, 552, 552, 552, - 553, 553, 552, 553, 552, 64, 64, 64, 64, 64, 64, 64, 64, 552, 552, 555, - 556, 556, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 557, 558, - 559, 559, 558, 558, 560, 560, 557, 561, 561, 558, 562, 64, 64, 292, 292, - 292, 292, 292, 292, 64, 41, 41, 41, 515, 44, 44, 44, 44, 41, 41, 41, 41, - 41, 62, 64, 64, 298, 298, 298, 298, 298, 298, 298, 298, 557, 557, 557, - 558, 558, 559, 558, 558, 559, 558, 558, 560, 558, 562, 64, 64, 563, 563, - 563, 563, 563, 563, 563, 563, 563, 563, 64, 64, 64, 64, 64, 64, 290, 290, - 290, 290, 64, 64, 64, 64, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64, - 64, 291, 291, 291, 291, 291, 291, 291, 291, 291, 64, 64, 64, 64, 564, - 564, 564, 564, 564, 564, 564, 564, 565, 565, 565, 565, 565, 565, 565, - 565, 496, 496, 497, 497, 497, 497, 497, 497, 41, 41, 41, 41, 41, 41, 41, - 64, 64, 64, 64, 83, 83, 83, 83, 83, 64, 64, 64, 64, 64, 110, 566, 110, - 110, 567, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, 110, - 110, 64, 110, 110, 110, 110, 110, 64, 110, 64, 110, 110, 64, 110, 110, - 64, 110, 110, 126, 126, 568, 568, 568, 568, 568, 568, 568, 568, 568, 568, - 568, 568, 568, 568, 568, 568, 64, 64, 64, 64, 64, 64, 64, 64, 64, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 126, 569, 418, 64, 64, 126, - 126, 126, 126, 126, 126, 126, 126, 126, 126, 116, 119, 64, 64, 58, 58, - 58, 58, 58, 58, 58, 58, 469, 469, 469, 469, 469, 469, 469, 474, 475, 469, - 64, 64, 64, 64, 64, 64, 78, 78, 78, 78, 78, 78, 78, 136, 136, 136, 136, - 136, 136, 136, 77, 77, 469, 473, 473, 570, 570, 474, 475, 474, 475, 474, - 475, 474, 475, 474, 475, 474, 475, 474, 475, 474, 475, 469, 469, 474, - 475, 469, 469, 469, 469, 570, 570, 570, 571, 469, 571, 64, 469, 571, 469, - 469, 473, 451, 452, 451, 452, 451, 452, 572, 469, 469, 573, 574, 575, - 575, 576, 64, 469, 577, 572, 469, 64, 64, 64, 64, 126, 126, 126, 126, - 126, 64, 126, 126, 126, 126, 126, 126, 126, 64, 64, 410, 64, 578, 578, - 579, 580, 579, 578, 578, 581, 582, 578, 583, 584, 585, 584, 584, 586, - 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 578, 587, 588, 587, - 578, 578, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, 589, - 589, 589, 589, 589, 589, 589, 581, 578, 582, 590, 591, 590, 592, 592, - 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, 592, - 592, 592, 581, 588, 582, 588, 581, 582, 593, 594, 595, 593, 593, 596, - 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 596, 596, 596, 596, - 596, 596, 596, 596, 596, 596, 596, 596, 596, 597, 597, 598, 598, 598, - 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 598, 64, 64, 64, - 598, 598, 598, 598, 598, 598, 64, 64, 598, 598, 598, 64, 64, 64, 580, - 580, 588, 590, 599, 580, 580, 64, 600, 601, 601, 601, 601, 600, 600, 64, - 64, 602, 602, 602, 26, 30, 64, 64, 603, 603, 603, 603, 603, 603, 603, - 603, 603, 603, 603, 603, 64, 603, 603, 603, 603, 603, 603, 603, 603, 603, - 603, 64, 603, 603, 603, 64, 603, 603, 64, 603, 603, 603, 603, 603, 603, - 603, 64, 64, 603, 603, 603, 64, 64, 64, 64, 64, 84, 66, 84, 64, 64, 64, - 64, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 521, 64, - 64, 64, 277, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, 604, - 604, 605, 605, 605, 605, 606, 606, 606, 606, 606, 606, 606, 606, 606, - 606, 606, 606, 606, 606, 606, 606, 606, 605, 605, 606, 64, 64, 64, 26, - 26, 26, 26, 64, 64, 64, 64, 606, 64, 64, 64, 64, 64, 64, 64, 277, 277, - 277, 277, 277, 136, 64, 64, 607, 607, 607, 607, 607, 607, 607, 607, 607, - 607, 607, 607, 607, 64, 64, 64, 608, 608, 608, 608, 608, 608, 608, 608, - 608, 64, 64, 64, 64, 64, 64, 64, 136, 438, 438, 438, 438, 438, 438, 438, - 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 438, 64, 64, 64, - 64, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610, 610, 610, 64, 64, - 64, 64, 611, 611, 611, 611, 611, 611, 611, 611, 611, 612, 611, 611, 611, - 611, 611, 611, 611, 611, 612, 64, 64, 64, 64, 64, 613, 613, 613, 613, - 613, 613, 613, 613, 613, 613, 613, 613, 613, 613, 614, 614, 614, 614, - 614, 64, 64, 64, 64, 64, 615, 615, 615, 615, 615, 615, 615, 615, 615, - 615, 615, 615, 615, 615, 64, 616, 617, 617, 617, 617, 617, 617, 617, 617, - 617, 617, 617, 617, 64, 64, 64, 64, 618, 619, 619, 619, 619, 619, 64, 64, - 620, 620, 620, 620, 620, 620, 620, 620, 621, 621, 621, 621, 621, 621, - 621, 621, 622, 622, 622, 622, 622, 622, 622, 622, 623, 623, 623, 623, - 623, 623, 623, 623, 623, 623, 623, 623, 623, 623, 64, 64, 624, 624, 624, - 624, 624, 624, 624, 624, 624, 624, 64, 64, 64, 64, 64, 64, 625, 625, 625, - 625, 625, 625, 625, 625, 626, 626, 626, 626, 626, 626, 626, 626, 626, - 626, 626, 626, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 627, 628, 628, - 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 628, 64, 628, - 628, 628, 628, 628, 628, 64, 64, 629, 629, 629, 629, 629, 629, 64, 64, - 629, 64, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, 629, - 629, 629, 629, 629, 629, 629, 629, 64, 629, 629, 64, 64, 64, 629, 64, 64, - 629, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, 630, - 630, 64, 631, 632, 632, 632, 632, 632, 632, 632, 632, 633, 633, 633, 633, - 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 633, 634, 634, 635, - 635, 635, 635, 635, 635, 635, 636, 636, 636, 636, 636, 636, 636, 636, - 636, 636, 636, 636, 636, 636, 636, 64, 64, 64, 64, 64, 64, 64, 64, 637, - 637, 637, 637, 637, 637, 637, 637, 637, 638, 638, 638, 638, 638, 638, - 638, 638, 638, 638, 638, 64, 638, 638, 64, 64, 64, 64, 64, 639, 639, 639, - 639, 639, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, 640, - 640, 640, 641, 641, 641, 641, 641, 641, 64, 64, 64, 642, 643, 643, 643, - 643, 643, 643, 643, 643, 643, 643, 64, 64, 64, 64, 64, 644, 645, 645, - 645, 645, 645, 645, 645, 645, 646, 646, 646, 646, 646, 646, 646, 646, 64, - 64, 64, 64, 647, 647, 646, 646, 647, 647, 647, 647, 647, 647, 647, 647, - 64, 64, 647, 647, 647, 647, 647, 647, 648, 649, 649, 649, 64, 649, 649, - 64, 64, 64, 64, 64, 649, 650, 649, 651, 648, 648, 648, 648, 64, 648, 648, - 648, 64, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, 648, - 648, 648, 648, 648, 648, 648, 64, 64, 64, 64, 651, 652, 650, 64, 64, 64, - 64, 653, 654, 654, 654, 654, 654, 654, 654, 654, 655, 655, 655, 655, 655, - 655, 655, 655, 655, 64, 64, 64, 64, 64, 64, 64, 656, 656, 656, 656, 656, - 656, 656, 656, 656, 656, 656, 656, 656, 657, 657, 658, 659, 659, 659, - 659, 659, 659, 659, 659, 659, 659, 659, 659, 659, 660, 660, 660, 661, - 661, 661, 661, 661, 661, 661, 661, 662, 661, 661, 661, 661, 661, 661, - 661, 661, 661, 661, 661, 661, 663, 664, 64, 64, 64, 64, 665, 665, 665, - 665, 665, 666, 666, 666, 666, 666, 666, 666, 64, 667, 667, 667, 667, 667, - 667, 667, 667, 667, 667, 667, 667, 667, 667, 64, 64, 64, 668, 668, 668, - 668, 668, 668, 668, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, - 669, 669, 669, 669, 64, 64, 670, 670, 670, 670, 670, 670, 670, 670, 671, - 671, 671, 671, 671, 671, 671, 671, 671, 671, 671, 64, 64, 64, 64, 64, - 672, 672, 672, 672, 672, 672, 672, 672, 673, 673, 673, 673, 673, 673, - 673, 673, 673, 673, 64, 64, 64, 64, 64, 64, 64, 674, 674, 674, 674, 64, - 64, 64, 64, 675, 675, 675, 675, 675, 675, 675, 676, 676, 676, 676, 676, - 676, 676, 676, 676, 64, 64, 64, 64, 64, 64, 64, 677, 677, 677, 677, 677, - 677, 677, 677, 677, 677, 677, 64, 64, 64, 64, 64, 678, 678, 678, 678, - 678, 678, 678, 678, 678, 678, 678, 64, 64, 64, 64, 64, 64, 64, 679, 679, - 679, 679, 679, 679, 680, 680, 680, 680, 680, 680, 680, 680, 680, 680, - 680, 680, 680, 680, 680, 64, 681, 682, 681, 683, 683, 683, 683, 683, 683, - 683, 683, 683, 683, 683, 683, 683, 682, 682, 682, 682, 682, 682, 682, - 682, 682, 682, 682, 682, 682, 682, 684, 685, 685, 685, 685, 685, 685, - 685, 64, 64, 64, 64, 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, - 686, 686, 686, 686, 686, 686, 686, 686, 686, 686, 687, 687, 687, 687, - 687, 687, 687, 687, 687, 687, 64, 64, 64, 64, 64, 64, 64, 684, 688, 688, - 689, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, 690, - 689, 689, 689, 688, 688, 688, 688, 689, 689, 691, 692, 693, 693, 694, - 693, 693, 693, 693, 64, 64, 64, 64, 64, 64, 695, 695, 695, 695, 695, 695, - 695, 695, 695, 64, 64, 64, 64, 64, 64, 64, 696, 696, 696, 696, 696, 696, - 696, 696, 696, 696, 64, 64, 64, 64, 64, 64, 697, 697, 697, 698, 698, 698, - 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, 698, - 698, 698, 698, 699, 699, 699, 699, 699, 700, 699, 699, 699, 699, 699, - 699, 701, 701, 64, 702, 702, 702, 702, 702, 702, 702, 702, 702, 702, 703, - 703, 703, 703, 64, 64, 64, 64, 704, 704, 704, 704, 704, 704, 704, 704, - 704, 704, 704, 705, 706, 706, 704, 64, 707, 707, 708, 709, 709, 709, 709, - 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 708, 708, - 708, 707, 707, 707, 707, 707, 707, 707, 707, 707, 708, 710, 709, 709, - 709, 709, 711, 711, 711, 711, 711, 712, 707, 707, 711, 64, 64, 713, 713, - 713, 713, 713, 713, 713, 713, 713, 713, 709, 711, 709, 711, 711, 711, 64, + 1, 1, 1, 1, 1, 1, 1, 1, 1, 2, 3, 4, 5, 6, 1, 1, 1, 1, 1, 1, 7, 7, 7, 8, + 9, 10, 11, 12, 13, 14, 15, 11, 16, 17, 15, 18, 19, 20, 19, 21, 22, 22, + 22, 22, 22, 22, 22, 22, 22, 22, 19, 23, 24, 25, 24, 10, 15, 26, 26, 26, + 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 26, 16, 27, 17, + 28, 29, 28, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, 30, + 30, 30, 30, 16, 31, 32, 25, 1, 1, 1, 1, 1, 1, 33, 1, 1, 34, 35, 36, 13, + 37, 13, 38, 39, 40, 41, 42, 43, 25, 44, 45, 28, 46, 47, 48, 48, 49, 50, + 39, 39, 40, 48, 42, 51, 52, 52, 52, 35, 53, 53, 53, 53, 53, 53, 54, 53, + 53, 53, 53, 53, 53, 53, 53, 53, 54, 53, 53, 53, 53, 53, 53, 55, 54, 53, + 53, 53, 53, 53, 54, 56, 56, 56, 57, 57, 57, 57, 56, 57, 56, 56, 56, 57, + 56, 56, 57, 57, 56, 57, 56, 56, 57, 57, 57, 55, 56, 56, 56, 57, 56, 57, + 56, 57, 53, 56, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, 53, 57, + 53, 56, 53, 56, 53, 57, 53, 57, 53, 57, 53, 56, 53, 57, 53, 57, 53, 57, + 53, 57, 53, 57, 54, 56, 53, 56, 54, 56, 53, 57, 53, 57, 56, 53, 57, 53, + 57, 53, 57, 54, 56, 54, 56, 53, 56, 53, 57, 53, 56, 56, 54, 56, 53, 56, + 53, 57, 53, 57, 54, 56, 53, 57, 53, 57, 53, 53, 57, 53, 57, 53, 57, 57, + 57, 53, 53, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 57, 53, 53, 53, 53, + 57, 53, 53, 57, 53, 53, 53, 57, 57, 57, 53, 53, 57, 53, 53, 57, 53, 57, + 53, 57, 53, 53, 57, 53, 57, 57, 53, 57, 53, 53, 57, 53, 53, 53, 57, 53, + 57, 53, 53, 57, 57, 58, 53, 57, 57, 57, 58, 58, 58, 58, 53, 59, 57, 53, + 59, 57, 53, 59, 57, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53, 56, 53, + 56, 53, 56, 57, 53, 57, 57, 53, 59, 57, 53, 57, 53, 53, 53, 57, 53, 57, + 57, 57, 57, 57, 57, 57, 53, 53, 57, 53, 53, 57, 57, 53, 57, 53, 53, 53, + 53, 57, 57, 56, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 57, 58, 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 61, + 61, 62, 62, 62, 62, 62, 62, 62, 63, 63, 64, 63, 61, 65, 66, 65, 65, 65, + 66, 65, 61, 61, 67, 62, 63, 63, 63, 63, 63, 63, 40, 40, 40, 40, 63, 40, + 63, 49, 60, 60, 60, 60, 60, 63, 63, 63, 63, 63, 68, 68, 61, 63, 62, 63, + 63, 63, 63, 63, 63, 63, 63, 63, 69, 69, 69, 69, 69, 69, 69, 69, 69, 69, + 69, 69, 69, 70, 71, 71, 71, 71, 70, 72, 71, 71, 71, 71, 71, 73, 73, 71, + 71, 71, 71, 73, 73, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 71, 74, 74, + 74, 74, 74, 71, 71, 71, 71, 69, 69, 69, 69, 69, 69, 69, 69, 75, 69, 71, + 71, 71, 69, 69, 69, 71, 71, 76, 69, 69, 69, 71, 71, 71, 71, 69, 70, 71, + 71, 69, 77, 78, 78, 77, 78, 78, 77, 69, 69, 69, 69, 69, 79, 80, 79, 80, + 61, 81, 79, 80, 82, 82, 83, 80, 80, 80, 84, 79, 82, 82, 82, 82, 81, 63, + 79, 85, 79, 79, 79, 82, 79, 82, 79, 79, 80, 86, 86, 86, 86, 86, 86, 86, + 86, 86, 86, 86, 86, 86, 86, 86, 86, 86, 82, 86, 86, 86, 86, 86, 86, 86, + 79, 79, 80, 80, 80, 80, 80, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, 87, + 87, 87, 87, 87, 87, 87, 80, 87, 87, 87, 87, 87, 87, 87, 80, 80, 80, 80, + 80, 79, 80, 80, 79, 79, 79, 80, 80, 80, 79, 80, 79, 80, 79, 80, 79, 80, + 79, 80, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 88, 89, 80, 80, + 80, 80, 79, 80, 90, 79, 80, 79, 79, 80, 80, 79, 79, 79, 91, 92, 91, 91, + 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 91, 92, 92, 92, 92, 92, 92, + 92, 92, 93, 93, 93, 93, 93, 93, 93, 93, 94, 93, 94, 94, 94, 94, 94, 94, + 94, 94, 94, 94, 94, 94, 94, 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94, + 95, 96, 96, 97, 97, 96, 98, 98, 91, 94, 91, 94, 91, 94, 91, 91, 94, 91, + 94, 91, 94, 91, 94, 91, 94, 91, 94, 91, 94, 94, 82, 99, 99, 99, 99, 99, + 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 99, 82, + 82, 100, 101, 101, 101, 101, 101, 101, 82, 102, 102, 102, 102, 102, 102, + 102, 102, 102, 102, 102, 102, 102, 102, 102, 82, 103, 104, 82, 82, 105, + 105, 106, 82, 107, 108, 108, 108, 108, 107, 108, 108, 108, 109, 107, 108, + 108, 108, 108, 108, 108, 107, 107, 107, 107, 107, 107, 108, 108, 107, + 108, 108, 109, 110, 108, 111, 112, 113, 114, 115, 116, 117, 118, 119, + 120, 120, 121, 122, 123, 124, 125, 126, 127, 128, 126, 108, 107, 129, + 119, 82, 82, 82, 82, 82, 82, 82, 82, 130, 130, 130, 130, 130, 130, 130, + 130, 130, 130, 130, 82, 82, 82, 82, 82, 130, 130, 130, 126, 126, 82, 82, + 82, 131, 131, 131, 131, 131, 132, 133, 133, 134, 135, 135, 136, 137, 138, + 139, 139, 140, 140, 140, 140, 140, 140, 140, 140, 141, 142, 143, 144, + 145, 82, 146, 144, 147, 147, 147, 147, 147, 147, 147, 147, 148, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 147, 149, 150, 151, 152, 153, 154, + 155, 156, 97, 97, 157, 158, 140, 140, 140, 140, 140, 158, 140, 140, 158, + 159, 159, 159, 159, 159, 159, 159, 159, 159, 159, 135, 160, 160, 161, + 147, 147, 162, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, + 146, 147, 140, 140, 140, 140, 140, 140, 140, 132, 139, 140, 140, 140, + 140, 158, 140, 163, 163, 140, 140, 139, 158, 140, 140, 158, 147, 147, + 164, 164, 164, 164, 164, 164, 164, 164, 164, 164, 147, 147, 147, 165, + 165, 147, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, 166, + 166, 166, 82, 167, 168, 169, 168, 168, 168, 168, 168, 168, 168, 168, 168, + 168, 168, 168, 168, 168, 170, 171, 170, 170, 171, 170, 170, 171, 171, + 171, 170, 171, 171, 170, 171, 170, 170, 170, 171, 170, 171, 170, 171, + 170, 171, 170, 170, 82, 82, 168, 168, 168, 172, 172, 172, 172, 172, 172, + 172, 172, 172, 172, 172, 172, 172, 172, 173, 173, 173, 173, 173, 173, + 173, 173, 173, 173, 173, 172, 82, 82, 82, 82, 82, 82, 174, 174, 174, 174, + 174, 174, 174, 174, 174, 174, 175, 175, 175, 175, 175, 175, 175, 175, + 175, 175, 175, 175, 175, 175, 175, 175, 175, 176, 176, 176, 176, 176, + 176, 176, 177, 176, 178, 178, 179, 180, 181, 182, 178, 82, 82, 82, 82, + 82, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, 183, + 184, 184, 184, 184, 185, 184, 184, 184, 184, 184, 184, 184, 184, 184, + 185, 184, 184, 184, 185, 184, 184, 184, 184, 184, 82, 82, 186, 186, 186, + 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 186, 82, 187, 187, + 187, 187, 187, 187, 187, 187, 187, 188, 188, 188, 82, 82, 189, 82, 147, + 147, 147, 147, 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 82, 82, + 82, 82, 82, 82, 140, 140, 140, 140, 140, 140, 132, 158, 140, 140, 158, + 140, 140, 158, 140, 140, 140, 158, 158, 158, 190, 191, 192, 140, 140, + 140, 158, 140, 140, 158, 158, 140, 140, 140, 140, 140, 193, 193, 193, + 194, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, 195, + 195, 193, 194, 196, 195, 194, 194, 194, 193, 193, 193, 193, 193, 193, + 193, 193, 194, 194, 194, 194, 197, 194, 194, 195, 97, 157, 198, 198, 193, + 193, 193, 195, 195, 193, 193, 199, 199, 200, 200, 200, 200, 200, 200, + 200, 200, 200, 200, 201, 202, 195, 195, 195, 195, 195, 195, 203, 204, + 205, 205, 82, 203, 203, 203, 203, 203, 203, 203, 203, 82, 82, 203, 203, + 82, 82, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, 203, + 203, 82, 203, 203, 203, 203, 203, 203, 203, 82, 203, 82, 82, 82, 203, + 203, 203, 203, 82, 82, 206, 203, 205, 205, 205, 204, 204, 204, 204, 82, + 82, 205, 205, 82, 82, 205, 205, 207, 203, 82, 82, 82, 82, 82, 82, 82, 82, + 205, 82, 82, 82, 82, 203, 203, 82, 203, 203, 203, 204, 204, 82, 82, 208, + 208, 208, 208, 208, 208, 208, 208, 208, 208, 203, 203, 209, 209, 210, + 210, 210, 210, 210, 211, 212, 213, 82, 82, 82, 82, 82, 214, 214, 215, 82, + 216, 216, 216, 216, 216, 216, 82, 82, 82, 82, 216, 216, 82, 82, 216, 216, + 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 216, 82, 216, 216, + 216, 216, 216, 216, 216, 82, 216, 216, 82, 216, 216, 82, 216, 216, 82, + 82, 217, 82, 215, 215, 215, 214, 214, 82, 82, 82, 82, 214, 214, 82, 82, + 214, 214, 218, 82, 82, 82, 214, 82, 82, 82, 82, 82, 82, 82, 216, 216, + 216, 216, 82, 216, 82, 82, 82, 82, 82, 82, 82, 219, 219, 219, 219, 219, + 219, 219, 219, 219, 219, 214, 214, 216, 216, 216, 214, 82, 82, 82, 220, + 220, 221, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222, + 222, 82, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, 222, + 222, 82, 222, 222, 222, 222, 222, 222, 222, 82, 222, 222, 82, 222, 222, + 222, 222, 222, 82, 82, 223, 222, 221, 221, 221, 220, 220, 220, 220, 220, + 82, 220, 220, 221, 82, 221, 221, 224, 82, 82, 222, 82, 82, 82, 82, 82, + 82, 82, 222, 222, 220, 220, 82, 82, 225, 225, 225, 225, 225, 225, 225, + 225, 225, 225, 226, 227, 82, 82, 82, 82, 82, 82, 82, 222, 82, 82, 82, 82, + 82, 82, 82, 228, 229, 229, 82, 230, 230, 230, 230, 230, 230, 230, 230, + 82, 82, 230, 230, 82, 82, 230, 230, 230, 230, 230, 230, 230, 230, 230, + 230, 230, 230, 230, 230, 82, 230, 230, 230, 230, 230, 230, 230, 82, 230, + 230, 82, 230, 230, 230, 230, 230, 82, 82, 231, 230, 229, 228, 229, 228, + 228, 228, 228, 82, 82, 229, 229, 82, 82, 229, 229, 232, 82, 82, 82, 82, + 82, 82, 82, 82, 228, 229, 82, 82, 82, 82, 230, 230, 82, 230, 230, 230, + 228, 228, 82, 82, 233, 233, 233, 233, 233, 233, 233, 233, 233, 233, 234, + 230, 235, 235, 235, 235, 235, 235, 82, 82, 236, 237, 82, 237, 237, 237, + 237, 237, 237, 82, 82, 82, 237, 237, 237, 82, 237, 237, 237, 237, 82, 82, + 82, 237, 237, 82, 237, 82, 237, 237, 82, 82, 82, 237, 237, 82, 82, 82, + 237, 237, 237, 237, 237, 237, 237, 237, 237, 237, 82, 82, 82, 82, 238, + 238, 236, 238, 238, 82, 82, 82, 238, 238, 238, 82, 238, 238, 238, 239, + 82, 82, 237, 82, 82, 82, 82, 82, 82, 238, 82, 82, 82, 82, 82, 82, 240, + 240, 240, 240, 240, 240, 240, 240, 240, 240, 241, 241, 241, 242, 242, + 242, 242, 242, 242, 243, 242, 82, 82, 82, 82, 82, 244, 245, 245, 245, 82, + 246, 246, 246, 246, 246, 246, 246, 246, 82, 246, 246, 246, 82, 246, 246, + 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 246, 82, + 82, 82, 246, 244, 244, 244, 245, 245, 245, 245, 82, 244, 244, 244, 82, + 244, 244, 244, 247, 82, 82, 82, 82, 82, 82, 82, 248, 249, 82, 246, 246, + 246, 82, 82, 82, 82, 82, 246, 246, 244, 244, 82, 82, 250, 250, 250, 250, + 250, 250, 250, 250, 250, 250, 251, 251, 251, 251, 251, 251, 251, 252, + 253, 254, 255, 255, 82, 253, 253, 253, 253, 253, 253, 253, 253, 82, 253, + 253, 253, 82, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, 253, + 253, 253, 253, 253, 253, 253, 82, 253, 253, 253, 253, 253, 82, 82, 256, + 253, 255, 257, 255, 255, 255, 255, 255, 82, 257, 255, 255, 82, 255, 255, + 254, 258, 82, 82, 82, 82, 82, 82, 82, 255, 255, 82, 82, 82, 82, 82, 82, + 82, 253, 82, 253, 253, 254, 254, 82, 82, 259, 259, 259, 259, 259, 259, + 259, 259, 259, 259, 82, 253, 253, 82, 82, 82, 82, 82, 82, 260, 261, 261, + 82, 262, 262, 262, 262, 262, 262, 262, 262, 82, 262, 262, 262, 82, 262, + 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, 262, + 262, 262, 82, 82, 262, 261, 261, 261, 260, 260, 260, 260, 82, 261, 261, + 261, 82, 261, 261, 261, 263, 262, 264, 82, 82, 82, 82, 262, 262, 262, + 261, 265, 265, 265, 265, 265, 265, 265, 262, 262, 262, 260, 260, 82, 82, + 266, 266, 266, 266, 266, 266, 266, 266, 266, 266, 265, 265, 265, 265, + 265, 265, 265, 265, 265, 267, 262, 262, 262, 262, 262, 262, 82, 82, 268, + 268, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, 269, + 269, 269, 269, 269, 269, 82, 82, 82, 269, 269, 269, 269, 269, 269, 269, + 269, 82, 269, 269, 269, 269, 269, 269, 269, 269, 269, 82, 269, 82, 82, + 82, 82, 270, 82, 82, 82, 82, 268, 268, 268, 271, 271, 271, 82, 271, 82, + 268, 268, 268, 268, 268, 268, 268, 268, 82, 82, 82, 82, 82, 82, 272, 272, + 272, 272, 272, 272, 272, 272, 272, 272, 82, 82, 268, 268, 273, 82, 82, + 82, 82, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, 274, + 274, 274, 274, 275, 274, 274, 275, 275, 275, 275, 276, 276, 277, 82, 82, + 82, 82, 278, 274, 274, 274, 274, 274, 274, 279, 275, 280, 280, 280, 280, + 275, 275, 275, 281, 282, 282, 282, 282, 282, 282, 282, 282, 282, 282, + 283, 283, 82, 82, 82, 82, 82, 284, 284, 82, 284, 82, 82, 284, 284, 82, + 284, 82, 82, 284, 82, 82, 82, 82, 82, 82, 284, 284, 284, 284, 82, 284, + 284, 284, 284, 284, 284, 284, 82, 284, 284, 284, 82, 284, 82, 284, 82, + 82, 284, 284, 82, 284, 284, 284, 284, 285, 284, 284, 285, 285, 285, 285, + 286, 286, 82, 285, 285, 284, 82, 82, 284, 284, 284, 284, 284, 82, 287, + 82, 288, 288, 288, 288, 285, 285, 82, 82, 289, 289, 289, 289, 289, 289, + 289, 289, 289, 289, 82, 82, 284, 284, 284, 284, 290, 291, 291, 291, 292, + 293, 292, 292, 294, 292, 292, 295, 294, 296, 296, 296, 296, 296, 294, + 297, 296, 297, 297, 297, 298, 298, 297, 297, 297, 297, 297, 297, 299, + 299, 299, 299, 299, 299, 299, 299, 299, 299, 300, 300, 300, 300, 300, + 300, 300, 300, 300, 300, 301, 298, 297, 298, 297, 302, 303, 304, 303, + 304, 305, 305, 290, 290, 290, 290, 290, 290, 290, 290, 82, 290, 290, 290, + 290, 290, 290, 290, 290, 290, 290, 290, 290, 82, 82, 82, 82, 306, 307, + 308, 309, 308, 308, 308, 308, 308, 307, 307, 307, 307, 308, 310, 307, + 308, 311, 311, 312, 295, 311, 311, 290, 290, 290, 290, 290, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 308, 308, 82, 308, 308, 308, 308, 308, + 308, 308, 308, 308, 308, 308, 308, 82, 301, 301, 297, 297, 297, 297, 297, + 297, 298, 297, 297, 297, 297, 297, 297, 82, 297, 297, 292, 292, 295, 292, + 293, 313, 313, 313, 313, 294, 294, 82, 82, 82, 82, 82, 314, 314, 314, + 314, 314, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 316, 316, + 315, 316, 316, 316, 316, 316, 317, 315, 318, 318, 315, 315, 316, 316, + 314, 319, 319, 319, 319, 319, 319, 319, 319, 319, 319, 320, 320, 321, + 321, 321, 321, 314, 314, 314, 314, 314, 314, 315, 315, 316, 316, 314, + 314, 314, 314, 316, 316, 316, 314, 315, 315, 315, 314, 314, 315, 315, + 315, 315, 315, 315, 315, 314, 314, 314, 316, 316, 316, 316, 314, 314, + 314, 314, 314, 316, 315, 315, 316, 316, 315, 315, 315, 315, 315, 315, + 322, 314, 315, 319, 319, 315, 315, 315, 316, 323, 323, 324, 324, 324, + 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 324, 82, 324, 82, 82, + 82, 82, 82, 324, 82, 82, 325, 325, 325, 325, 325, 325, 325, 325, 325, + 325, 325, 326, 327, 325, 325, 325, 328, 328, 328, 328, 328, 328, 328, + 328, 329, 329, 329, 329, 329, 329, 329, 329, 330, 330, 330, 330, 330, + 330, 330, 330, 331, 331, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331, + 331, 331, 82, 82, 331, 331, 331, 331, 331, 331, 331, 82, 331, 331, 331, + 82, 82, 332, 332, 332, 333, 334, 333, 333, 333, 333, 333, 333, 333, 335, + 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, 335, + 335, 335, 335, 335, 335, 82, 82, 82, 336, 336, 336, 336, 336, 336, 336, + 336, 336, 336, 82, 82, 82, 82, 82, 82, 337, 337, 337, 337, 337, 337, 337, + 337, 337, 337, 337, 337, 337, 337, 82, 82, 338, 338, 338, 338, 338, 338, + 82, 82, 339, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, 340, + 340, 340, 340, 340, 340, 340, 340, 340, 341, 341, 340, 342, 343, 343, + 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, 343, + 343, 343, 344, 345, 82, 82, 82, 346, 346, 346, 346, 346, 346, 346, 346, + 346, 346, 346, 199, 199, 199, 347, 347, 347, 346, 346, 346, 346, 346, + 346, 346, 346, 82, 82, 82, 82, 82, 82, 82, 348, 348, 348, 348, 348, 348, + 348, 348, 348, 348, 348, 348, 348, 82, 348, 348, 348, 348, 349, 349, 350, + 82, 82, 82, 351, 351, 351, 351, 351, 351, 351, 351, 351, 351, 352, 352, + 353, 199, 199, 82, 354, 354, 354, 354, 354, 354, 354, 354, 354, 354, 355, + 355, 82, 82, 82, 82, 356, 356, 356, 356, 356, 356, 356, 356, 356, 356, + 356, 356, 356, 82, 356, 356, 356, 82, 357, 357, 82, 82, 82, 82, 358, 358, + 358, 358, 358, 358, 358, 358, 358, 358, 358, 358, 359, 359, 360, 359, + 359, 359, 359, 359, 359, 359, 360, 360, 360, 360, 360, 360, 360, 360, + 359, 360, 360, 359, 359, 359, 359, 359, 359, 359, 359, 359, 361, 359, + 362, 362, 363, 364, 362, 365, 362, 366, 358, 367, 82, 82, 368, 368, 368, + 368, 368, 368, 368, 368, 368, 368, 82, 82, 82, 82, 82, 82, 369, 369, 369, + 369, 369, 369, 369, 369, 369, 369, 82, 82, 82, 82, 82, 82, 370, 370, 371, + 371, 372, 373, 374, 370, 375, 375, 370, 376, 376, 376, 377, 82, 378, 378, + 378, 378, 378, 378, 378, 378, 378, 378, 82, 82, 82, 82, 82, 82, 379, 379, + 379, 379, 379, 379, 379, 379, 379, 379, 379, 380, 379, 379, 379, 379, + 379, 379, 379, 379, 379, 376, 376, 379, 379, 381, 379, 82, 82, 82, 82, + 82, 340, 340, 340, 340, 340, 340, 82, 82, 382, 382, 382, 382, 382, 382, + 382, 382, 382, 382, 382, 382, 382, 382, 382, 82, 383, 383, 383, 384, 384, + 384, 384, 383, 383, 384, 384, 384, 82, 82, 82, 82, 384, 384, 383, 384, + 384, 384, 384, 384, 384, 385, 386, 387, 82, 82, 82, 82, 388, 82, 82, 82, + 389, 389, 390, 390, 390, 390, 390, 390, 390, 390, 390, 390, 391, 391, + 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 391, 82, 82, 391, + 391, 391, 391, 391, 82, 82, 82, 392, 392, 392, 392, 392, 392, 392, 392, + 392, 392, 392, 392, 82, 82, 82, 82, 392, 392, 82, 82, 82, 82, 82, 82, + 393, 393, 393, 393, 393, 393, 393, 393, 393, 393, 394, 82, 82, 82, 395, + 395, 396, 396, 396, 396, 396, 396, 396, 396, 397, 397, 397, 397, 397, + 397, 397, 397, 397, 397, 397, 397, 397, 397, 397, 398, 399, 400, 400, + 401, 82, 82, 402, 402, 403, 403, 403, 403, 403, 403, 403, 403, 403, 403, + 403, 403, 403, 404, 405, 404, 405, 405, 405, 405, 405, 405, 405, 82, 406, + 404, 405, 404, 404, 405, 405, 405, 405, 405, 405, 405, 405, 404, 404, + 404, 404, 404, 404, 405, 405, 407, 407, 407, 407, 407, 407, 407, 407, 82, + 82, 408, 409, 409, 409, 409, 409, 409, 409, 409, 409, 409, 82, 82, 82, + 82, 82, 82, 410, 410, 410, 410, 410, 410, 410, 411, 410, 410, 410, 410, + 410, 410, 82, 82, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157, 97, + 97, 157, 412, 82, 413, 413, 413, 413, 414, 415, 415, 415, 415, 415, 415, + 415, 415, 415, 415, 415, 415, 415, 415, 415, 416, 414, 413, 413, 413, + 413, 413, 414, 413, 414, 414, 414, 414, 414, 413, 414, 417, 415, 415, + 415, 415, 415, 415, 415, 82, 82, 82, 82, 418, 418, 418, 418, 418, 418, + 418, 418, 418, 418, 419, 419, 420, 419, 419, 419, 419, 421, 421, 421, + 421, 421, 421, 421, 421, 421, 421, 422, 423, 422, 422, 422, 422, 422, + 422, 422, 421, 421, 421, 421, 421, 421, 421, 421, 421, 82, 82, 82, 424, + 424, 425, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, 426, + 426, 426, 425, 424, 424, 424, 424, 425, 425, 424, 424, 427, 428, 424, + 424, 426, 426, 429, 429, 429, 429, 429, 429, 429, 429, 429, 429, 426, + 426, 426, 426, 426, 426, 430, 430, 430, 430, 430, 430, 430, 430, 430, + 430, 430, 430, 430, 430, 431, 432, 433, 433, 432, 432, 432, 433, 432, + 433, 433, 433, 434, 434, 82, 82, 82, 82, 82, 82, 82, 82, 435, 435, 435, + 435, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 436, 437, + 437, 437, 437, 437, 437, 437, 437, 438, 438, 438, 438, 438, 438, 438, + 438, 437, 437, 438, 439, 82, 82, 82, 440, 440, 440, 440, 440, 441, 441, + 441, 441, 441, 441, 441, 441, 441, 441, 82, 82, 82, 436, 436, 436, 442, + 442, 442, 442, 442, 442, 442, 442, 442, 442, 443, 443, 443, 443, 443, + 443, 443, 443, 443, 443, 443, 443, 443, 443, 444, 444, 444, 444, 444, + 444, 445, 445, 94, 82, 82, 82, 82, 82, 82, 82, 446, 446, 446, 446, 446, + 446, 446, 446, 97, 97, 97, 326, 447, 157, 157, 157, 157, 157, 97, 97, + 157, 157, 157, 157, 97, 448, 447, 447, 447, 447, 447, 447, 447, 449, 449, + 449, 449, 157, 449, 449, 449, 449, 448, 448, 97, 449, 449, 82, 97, 97, + 82, 82, 82, 82, 82, 82, 57, 57, 57, 57, 57, 57, 80, 80, 80, 80, 80, 94, + 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 83, 83, 83, 83, 60, 60, 60, 60, + 83, 83, 83, 83, 83, 57, 57, 57, 57, 57, 450, 57, 57, 57, 57, 57, 57, 57, + 57, 57, 57, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 60, 83, 97, 97, + 157, 97, 97, 97, 97, 97, 97, 97, 157, 97, 97, 451, 452, 157, 453, 97, 97, + 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, 97, + 97, 82, 82, 82, 82, 82, 97, 454, 157, 97, 157, 53, 57, 53, 57, 53, 57, + 57, 57, 57, 57, 57, 57, 57, 57, 53, 57, 80, 80, 80, 80, 80, 80, 80, 80, + 79, 79, 79, 79, 79, 79, 79, 79, 80, 80, 80, 80, 80, 80, 82, 82, 79, 79, + 79, 79, 79, 79, 82, 82, 82, 79, 82, 79, 82, 79, 82, 79, 455, 455, 455, + 455, 455, 455, 455, 455, 80, 80, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79, + 455, 81, 80, 81, 81, 81, 80, 80, 80, 82, 80, 80, 79, 79, 79, 79, 455, 81, + 81, 81, 80, 80, 80, 80, 82, 82, 80, 80, 79, 79, 79, 79, 82, 81, 81, 81, + 79, 79, 79, 79, 79, 81, 81, 81, 82, 82, 80, 80, 80, 82, 80, 80, 79, 79, + 79, 79, 455, 456, 81, 82, 457, 457, 457, 457, 457, 457, 457, 458, 457, + 457, 457, 459, 460, 461, 462, 463, 464, 465, 466, 464, 467, 468, 39, 85, + 469, 470, 471, 472, 469, 470, 471, 472, 39, 39, 473, 85, 474, 474, 474, + 475, 476, 477, 478, 479, 480, 481, 482, 34, 483, 484, 483, 483, 484, 485, + 486, 486, 85, 43, 51, 39, 487, 487, 473, 488, 488, 85, 85, 85, 489, 490, + 491, 487, 487, 487, 85, 85, 85, 85, 85, 85, 85, 85, 492, 85, 488, 85, + 373, 85, 373, 373, 373, 373, 85, 373, 373, 457, 493, 494, 494, 494, 494, + 82, 495, 496, 497, 498, 499, 499, 499, 499, 499, 499, 500, 60, 82, 82, + 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 502, 500, 48, 48, + 48, 48, 500, 500, 500, 500, 500, 501, 501, 492, 490, 491, 82, 60, 60, 60, + 60, 60, 82, 82, 82, 278, 278, 278, 278, 278, 278, 278, 503, 278, 504, + 278, 278, 37, 278, 278, 278, 278, 278, 278, 278, 278, 278, 503, 278, 278, + 278, 278, 503, 278, 278, 503, 505, 505, 505, 505, 505, 505, 505, 505, + 505, 97, 97, 447, 447, 97, 97, 97, 97, 447, 447, 447, 97, 97, 412, 412, + 412, 412, 97, 412, 412, 412, 447, 447, 97, 157, 97, 447, 447, 157, 157, + 157, 157, 97, 82, 82, 82, 82, 82, 82, 82, 41, 41, 506, 507, 41, 508, 41, + 506, 41, 507, 50, 506, 506, 506, 50, 50, 506, 506, 506, 509, 41, 506, + 510, 41, 492, 506, 506, 506, 506, 506, 41, 41, 41, 508, 508, 41, 506, 41, + 86, 41, 506, 41, 53, 511, 506, 506, 512, 50, 506, 506, 53, 506, 50, 449, + 449, 449, 449, 50, 41, 41, 50, 50, 506, 506, 513, 492, 492, 492, 492, + 506, 50, 50, 50, 50, 41, 492, 41, 41, 57, 313, 514, 514, 514, 515, 52, + 516, 514, 514, 514, 514, 514, 52, 515, 515, 52, 514, 517, 517, 517, 517, + 517, 517, 517, 517, 517, 517, 517, 517, 518, 518, 518, 518, 517, 517, + 518, 518, 518, 518, 518, 518, 518, 518, 518, 53, 57, 518, 518, 518, 518, + 52, 41, 41, 82, 82, 82, 82, 55, 55, 55, 55, 55, 508, 508, 508, 508, 508, + 492, 492, 41, 41, 41, 41, 492, 41, 41, 492, 41, 41, 492, 41, 41, 41, 41, + 41, 41, 41, 492, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 45, 41, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 41, 492, 492, 41, 41, 55, 41, 55, 41, 41, + 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41, 492, 492, 492, 492, + 492, 492, 492, 492, 492, 492, 492, 492, 55, 513, 519, 519, 513, 492, 492, + 55, 519, 513, 513, 519, 513, 513, 492, 55, 492, 519, 520, 521, 492, 519, + 513, 492, 492, 492, 519, 513, 513, 519, 55, 519, 519, 513, 513, 55, 513, + 55, 513, 55, 55, 55, 55, 519, 519, 513, 519, 513, 513, 513, 513, 513, 55, + 55, 55, 55, 492, 513, 492, 513, 519, 519, 513, 513, 513, 513, 513, 513, + 513, 513, 513, 513, 519, 513, 513, 513, 519, 492, 492, 492, 492, 492, + 519, 513, 513, 513, 492, 492, 492, 492, 492, 492, 492, 492, 492, 513, + 519, 55, 513, 492, 519, 519, 519, 519, 513, 513, 519, 519, 492, 492, 519, + 519, 513, 513, 519, 519, 513, 513, 519, 519, 513, 513, 513, 513, 513, + 492, 492, 513, 513, 513, 513, 492, 492, 55, 492, 492, 513, 55, 492, 492, + 492, 492, 492, 492, 492, 492, 513, 513, 492, 55, 513, 513, 513, 492, 492, + 492, 492, 492, 513, 519, 492, 513, 513, 513, 513, 513, 492, 492, 513, + 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 492, + 522, 490, 491, 490, 491, 41, 41, 41, 41, 41, 41, 508, 41, 41, 41, 41, 41, + 41, 41, 523, 523, 41, 41, 41, 41, 513, 513, 41, 41, 41, 41, 41, 41, 41, + 524, 525, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 313, 313, 313, 313, + 313, 313, 313, 313, 313, 313, 313, 313, 313, 41, 492, 41, 41, 41, 41, 41, + 41, 41, 41, 313, 41, 41, 41, 41, 41, 492, 492, 492, 492, 492, 492, 492, + 492, 492, 41, 41, 41, 41, 492, 492, 41, 41, 41, 41, 41, 41, 41, 526, 526, + 526, 526, 41, 41, 41, 523, 527, 527, 523, 41, 41, 41, 41, 41, 41, 41, 41, + 41, 41, 41, 82, 41, 41, 41, 82, 82, 82, 82, 82, 52, 52, 52, 52, 52, 52, + 52, 52, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 48, 528, 528, 528, + 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 516, 52, 52, 52, + 52, 52, 52, 52, 52, 52, 52, 52, 52, 515, 508, 508, 508, 508, 508, 508, + 508, 508, 508, 508, 508, 508, 41, 41, 41, 41, 508, 508, 508, 508, 529, + 41, 41, 41, 41, 41, 508, 508, 508, 508, 41, 41, 508, 508, 41, 508, 508, + 508, 508, 508, 508, 508, 41, 41, 41, 41, 41, 41, 41, 41, 508, 508, 41, + 41, 508, 55, 41, 41, 41, 41, 508, 508, 41, 41, 508, 55, 41, 41, 41, 41, + 508, 508, 508, 41, 41, 508, 41, 41, 508, 508, 41, 41, 41, 41, 41, 41, 41, + 508, 492, 492, 492, 492, 492, 530, 530, 492, 527, 527, 527, 527, 41, 508, + 508, 41, 41, 508, 41, 41, 41, 41, 508, 508, 41, 41, 41, 41, 523, 523, + 529, 529, 527, 41, 527, 527, 531, 532, 531, 527, 41, 527, 527, 527, 41, + 41, 41, 41, 508, 41, 508, 41, 41, 41, 41, 41, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 526, 526, 41, 41, 41, 41, 508, 508, 41, 508, + 508, 508, 41, 508, 531, 508, 508, 41, 508, 508, 41, 55, 41, 41, 41, 41, + 41, 41, 41, 523, 41, 41, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, + 508, 508, 41, 526, 41, 41, 41, 41, 41, 41, 41, 41, 526, 526, 313, 41, 41, + 41, 41, 41, 41, 41, 41, 523, 523, 531, 527, 527, 527, 527, 523, 523, 531, + 531, 531, 508, 508, 508, 508, 531, 526, 531, 531, 531, 508, 531, 523, + 508, 508, 508, 531, 531, 508, 508, 531, 508, 508, 531, 531, 531, 41, 508, + 41, 41, 41, 41, 508, 508, 523, 508, 508, 508, 508, 508, 508, 531, 523, + 523, 531, 523, 508, 531, 531, 533, 523, 508, 508, 523, 531, 531, 527, + 527, 527, 527, 527, 526, 41, 41, 527, 527, 534, 534, 532, 532, 41, 41, + 526, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 41, 45, 41, 41, 41, 41, + 41, 41, 526, 41, 526, 41, 41, 41, 41, 526, 526, 526, 41, 535, 41, 41, 41, + 536, 536, 536, 536, 536, 536, 41, 537, 537, 527, 41, 41, 41, 490, 491, + 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 490, 491, 52, 52, 516, + 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 516, 41, 526, 526, 526, + 41, 41, 41, 41, 41, 41, 41, 526, 513, 492, 492, 513, 513, 490, 491, 492, + 513, 513, 492, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 513, + 513, 492, 492, 492, 492, 492, 513, 513, 513, 492, 492, 492, 513, 513, + 513, 513, 16, 32, 16, 32, 16, 32, 16, 32, 490, 491, 538, 538, 538, 538, + 538, 538, 538, 538, 492, 492, 492, 490, 491, 16, 32, 490, 491, 490, 491, + 490, 491, 490, 491, 490, 491, 492, 492, 513, 513, 513, 513, 513, 513, + 492, 492, 492, 492, 492, 492, 492, 513, 513, 513, 513, 513, 513, 492, + 492, 492, 513, 492, 492, 492, 492, 513, 513, 513, 513, 513, 492, 513, + 513, 492, 492, 490, 491, 490, 491, 513, 492, 492, 492, 492, 513, 492, + 513, 513, 513, 492, 492, 513, 513, 492, 492, 492, 492, 492, 492, 492, + 492, 492, 492, 513, 513, 513, 513, 513, 513, 492, 492, 490, 491, 492, + 492, 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, + 492, 513, 513, 513, 513, 492, 492, 513, 492, 513, 492, 492, 513, 492, + 513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 513, 492, 492, 492, + 492, 513, 513, 513, 513, 492, 513, 513, 492, 492, 513, 513, 492, 492, + 492, 492, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 513, 492, + 492, 513, 513, 513, 513, 513, 513, 513, 513, 492, 513, 513, 513, 513, + 513, 513, 513, 513, 492, 492, 492, 492, 492, 513, 492, 513, 492, 492, + 492, 513, 513, 513, 513, 513, 492, 492, 492, 492, 513, 492, 492, 492, + 513, 513, 513, 513, 513, 492, 513, 492, 492, 41, 41, 41, 526, 526, 41, + 41, 41, 492, 492, 492, 492, 492, 41, 41, 492, 492, 492, 492, 492, 492, + 41, 41, 41, 526, 41, 41, 41, 41, 535, 508, 508, 41, 41, 41, 41, 82, 82, + 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 41, 41, 82, 82, 82, 41, 41, 41, + 41, 82, 41, 41, 41, 41, 41, 41, 41, 41, 82, 82, 82, 82, 82, 82, 82, 82, + 82, 82, 41, 41, 41, 41, 539, 539, 539, 539, 539, 539, 539, 539, 539, 539, + 539, 539, 539, 539, 539, 82, 540, 540, 540, 540, 540, 540, 540, 540, 540, + 540, 540, 540, 540, 540, 540, 82, 53, 57, 53, 53, 53, 57, 57, 53, 57, 53, + 57, 53, 57, 53, 53, 53, 53, 57, 53, 57, 57, 53, 57, 57, 57, 57, 57, 57, + 60, 60, 53, 53, 88, 89, 88, 89, 89, 541, 541, 541, 541, 541, 541, 88, 89, + 88, 89, 542, 542, 542, 88, 89, 82, 82, 82, 82, 82, 543, 544, 544, 544, + 545, 543, 544, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, 546, + 546, 546, 546, 82, 546, 82, 82, 82, 82, 82, 546, 82, 82, 547, 547, 547, + 547, 547, 547, 547, 547, 82, 82, 82, 82, 82, 82, 82, 548, 549, 82, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 550, 96, 96, 96, 96, 96, + 96, 96, 96, 551, 551, 43, 51, 43, 51, 551, 551, 551, 43, 51, 551, 43, 51, + 373, 373, 373, 373, 373, 373, 373, 373, 85, 466, 552, 373, 553, 85, 43, + 51, 85, 85, 43, 51, 490, 491, 490, 491, 490, 491, 490, 491, 373, 373, + 373, 373, 371, 61, 373, 373, 85, 373, 373, 85, 85, 85, 85, 85, 554, 554, + 373, 373, 373, 85, 466, 373, 471, 373, 373, 82, 82, 82, 555, 555, 555, + 555, 555, 555, 555, 555, 555, 555, 82, 555, 555, 555, 555, 555, 555, 555, + 555, 555, 82, 82, 82, 82, 555, 555, 555, 555, 555, 555, 82, 82, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, 523, 523, 82, 82, 82, 82, 556, + 557, 557, 558, 523, 559, 560, 561, 524, 525, 524, 525, 524, 525, 524, + 525, 524, 525, 523, 523, 524, 525, 524, 525, 524, 525, 524, 525, 562, + 563, 564, 564, 523, 561, 561, 561, 561, 561, 561, 561, 561, 561, 565, + 566, 567, 568, 569, 569, 570, 571, 571, 571, 571, 572, 523, 523, 561, + 561, 561, 559, 573, 558, 523, 527, 82, 574, 575, 574, 575, 574, 575, 574, + 575, 574, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, 575, + 575, 575, 575, 575, 575, 574, 575, 575, 575, 575, 575, 575, 575, 574, + 575, 574, 575, 574, 575, 575, 575, 575, 575, 575, 574, 575, 575, 575, + 575, 575, 575, 574, 574, 82, 82, 576, 576, 577, 577, 578, 578, 575, 562, + 579, 580, 579, 580, 579, 580, 579, 580, 579, 580, 580, 580, 580, 580, + 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 580, 579, 580, + 580, 580, 580, 580, 580, 580, 579, 580, 579, 580, 579, 580, 580, 580, + 580, 580, 580, 579, 580, 580, 580, 580, 580, 580, 579, 579, 580, 580, + 580, 580, 581, 582, 583, 583, 580, 82, 82, 82, 82, 82, 584, 584, 584, + 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 584, 82, + 82, 82, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, 585, + 585, 585, 585, 585, 585, 585, 585, 585, 585, 82, 586, 586, 587, 587, 587, + 587, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, 584, 584, 584, 82, + 82, 82, 82, 82, 579, 579, 579, 579, 579, 579, 579, 579, 588, 588, 588, + 588, 588, 588, 588, 588, 588, 588, 588, 588, 588, 589, 589, 82, 587, 587, + 587, 587, 587, 587, 587, 587, 587, 587, 586, 586, 586, 586, 586, 586, + 590, 590, 590, 590, 590, 590, 590, 590, 523, 591, 591, 591, 591, 591, + 591, 591, 591, 591, 591, 591, 591, 591, 591, 591, 588, 588, 588, 588, + 589, 589, 589, 586, 586, 591, 591, 591, 591, 591, 591, 591, 586, 586, + 586, 586, 523, 523, 523, 523, 592, 592, 592, 592, 592, 592, 592, 592, + 592, 592, 592, 592, 592, 592, 592, 82, 586, 586, 586, 586, 586, 586, 586, + 523, 523, 523, 523, 586, 586, 586, 586, 586, 586, 586, 586, 586, 586, + 586, 523, 523, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, 593, + 593, 593, 593, 594, 594, 594, 594, 594, 594, 594, 594, 594, 594, 595, + 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 595, 596, 595, + 595, 595, 595, 595, 595, 595, 82, 82, 82, 597, 597, 597, 597, 597, 597, + 597, 597, 597, 597, 597, 597, 597, 597, 597, 82, 598, 598, 598, 598, 598, + 598, 598, 598, 599, 599, 599, 599, 599, 599, 600, 600, 601, 601, 601, + 601, 601, 601, 601, 601, 601, 601, 601, 601, 602, 603, 604, 603, 605, + 605, 605, 605, 605, 605, 605, 605, 605, 605, 601, 601, 82, 82, 82, 82, + 91, 94, 91, 94, 91, 94, 606, 96, 98, 98, 98, 607, 96, 96, 96, 96, 96, 96, + 96, 96, 96, 96, 607, 608, 91, 94, 91, 94, 450, 450, 96, 96, 609, 609, + 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 609, 610, 610, + 610, 610, 610, 610, 610, 610, 610, 610, 611, 611, 612, 613, 613, 613, + 613, 613, 63, 63, 63, 63, 63, 63, 63, 61, 61, 61, 61, 61, 61, 61, 61, 61, + 63, 63, 53, 57, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 57, 60, 57, + 57, 57, 57, 57, 57, 57, 57, 53, 57, 53, 57, 53, 53, 57, 61, 614, 614, 53, + 57, 53, 57, 58, 53, 57, 53, 57, 57, 57, 53, 57, 53, 57, 53, 53, 53, 53, + 53, 82, 53, 53, 53, 53, 53, 57, 53, 57, 82, 82, 82, 82, 82, 82, 82, 58, + 60, 60, 57, 58, 58, 58, 58, 58, 615, 615, 616, 615, 615, 615, 617, 615, + 615, 615, 615, 616, 615, 615, 615, 615, 615, 615, 615, 615, 615, 615, + 615, 615, 615, 615, 615, 618, 618, 616, 616, 618, 619, 619, 619, 619, 82, + 82, 82, 82, 620, 620, 620, 620, 620, 620, 313, 313, 503, 512, 82, 82, 82, + 82, 82, 82, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, 621, + 622, 622, 623, 623, 624, 624, 625, 625, 625, 625, 625, 625, 625, 625, + 625, 625, 625, 625, 625, 625, 625, 625, 625, 625, 624, 624, 624, 624, + 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 624, 626, 627, 82, + 82, 82, 82, 82, 82, 82, 82, 628, 628, 629, 629, 629, 629, 629, 629, 629, + 629, 629, 629, 82, 82, 82, 82, 82, 82, 198, 198, 198, 198, 198, 198, 198, + 198, 198, 198, 195, 195, 195, 195, 195, 195, 201, 201, 201, 195, 630, + 195, 82, 82, 631, 631, 631, 631, 631, 631, 631, 631, 631, 631, 632, 632, + 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, 632, + 632, 632, 632, 632, 633, 633, 633, 633, 633, 634, 634, 634, 199, 635, + 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, 636, + 636, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 637, 638, 639, 82, + 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 640, 328, 328, 328, 328, 328, 82, + 82, 82, 641, 641, 641, 642, 643, 643, 643, 643, 643, 643, 643, 643, 643, + 643, 643, 643, 643, 643, 643, 644, 642, 642, 641, 641, 641, 641, 642, + 642, 641, 642, 642, 642, 645, 646, 646, 646, 646, 646, 646, 647, 647, + 647, 646, 646, 646, 646, 82, 62, 648, 648, 648, 648, 648, 648, 648, 648, + 648, 648, 82, 82, 82, 82, 646, 646, 314, 314, 314, 314, 314, 316, 649, + 314, 319, 319, 314, 314, 314, 314, 314, 82, 650, 650, 650, 650, 650, 650, + 650, 650, 650, 651, 651, 651, 651, 651, 651, 652, 652, 651, 651, 652, + 652, 651, 651, 82, 650, 650, 650, 651, 650, 650, 650, 650, 650, 650, 650, + 650, 651, 652, 82, 82, 653, 653, 653, 653, 653, 653, 653, 653, 653, 653, + 82, 82, 654, 655, 655, 655, 649, 314, 314, 314, 314, 314, 314, 323, 323, + 323, 314, 315, 316, 315, 314, 314, 656, 656, 656, 656, 656, 656, 656, + 656, 657, 656, 657, 657, 658, 656, 656, 657, 657, 656, 656, 656, 656, + 656, 657, 657, 656, 657, 656, 82, 82, 82, 82, 82, 82, 82, 82, 656, 656, + 659, 660, 660, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, 661, + 662, 663, 663, 662, 662, 664, 664, 661, 665, 665, 662, 666, 82, 82, 331, + 331, 331, 331, 331, 331, 82, 57, 57, 57, 614, 60, 60, 60, 60, 57, 57, 57, + 57, 57, 80, 82, 82, 338, 338, 338, 338, 338, 338, 338, 338, 661, 661, + 661, 662, 662, 663, 662, 662, 663, 662, 662, 664, 662, 666, 82, 82, 667, + 667, 667, 667, 667, 667, 667, 667, 667, 667, 82, 82, 82, 82, 82, 82, 668, + 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, 669, + 669, 669, 669, 669, 669, 668, 669, 669, 669, 669, 669, 669, 669, 82, 82, + 82, 82, 329, 329, 329, 329, 329, 329, 329, 82, 82, 82, 82, 330, 330, 330, + 330, 330, 330, 330, 330, 330, 82, 82, 82, 82, 670, 670, 670, 670, 670, + 670, 670, 670, 671, 671, 671, 671, 671, 671, 671, 671, 593, 593, 594, + 594, 594, 594, 594, 594, 57, 57, 57, 57, 57, 57, 57, 82, 82, 82, 82, 102, + 102, 102, 102, 102, 82, 82, 82, 82, 82, 130, 672, 130, 130, 673, 130, + 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 130, 82, 130, 130, + 130, 130, 130, 82, 130, 82, 130, 130, 82, 130, 130, 82, 130, 130, 147, + 147, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, 674, + 674, 674, 674, 82, 82, 82, 82, 82, 82, 82, 82, 82, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 147, 675, 471, 82, 82, 147, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 136, 139, 82, 82, 676, 676, 676, 676, 676, + 676, 676, 676, 677, 557, 557, 677, 677, 678, 678, 563, 564, 679, 82, 82, + 82, 82, 82, 82, 97, 97, 97, 97, 97, 97, 97, 157, 157, 157, 157, 157, 157, + 157, 96, 96, 558, 570, 570, 680, 680, 563, 564, 563, 564, 563, 564, 563, + 564, 563, 564, 563, 564, 563, 564, 563, 564, 558, 558, 563, 564, 558, + 558, 558, 558, 680, 680, 680, 681, 558, 681, 82, 581, 682, 678, 678, 570, + 524, 525, 524, 525, 524, 525, 683, 558, 558, 684, 685, 686, 686, 687, 82, + 558, 688, 689, 558, 82, 82, 82, 82, 147, 147, 147, 147, 147, 82, 82, 493, + 82, 690, 691, 692, 693, 694, 691, 691, 695, 696, 691, 697, 698, 699, 698, + 700, 701, 701, 701, 701, 701, 701, 701, 701, 701, 701, 702, 703, 704, + 705, 704, 690, 691, 706, 706, 706, 706, 706, 706, 706, 706, 706, 706, + 706, 706, 706, 706, 706, 706, 706, 706, 695, 691, 696, 707, 708, 707, + 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, 709, + 709, 709, 709, 709, 695, 705, 696, 705, 695, 696, 710, 711, 712, 710, + 713, 714, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, 714, - 714, 714, 714, 714, 714, 714, 64, 64, 64, 715, 715, 715, 715, 715, 715, - 715, 715, 715, 715, 64, 715, 715, 715, 715, 715, 715, 715, 715, 715, 716, - 716, 716, 717, 717, 717, 716, 716, 717, 718, 719, 717, 720, 720, 720, - 720, 720, 720, 64, 64, 721, 721, 721, 721, 721, 721, 721, 64, 721, 64, - 721, 721, 721, 721, 64, 721, 721, 721, 721, 721, 721, 721, 721, 721, 721, - 721, 721, 721, 721, 721, 64, 721, 721, 722, 64, 64, 64, 64, 64, 64, 723, - 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, 723, - 724, 725, 725, 725, 724, 724, 724, 724, 724, 724, 726, 727, 64, 64, 64, - 64, 64, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 64, 64, 64, 64, - 64, 64, 729, 729, 730, 730, 64, 731, 731, 731, 731, 731, 731, 731, 731, - 64, 64, 731, 731, 64, 64, 731, 731, 731, 731, 731, 731, 731, 731, 731, - 731, 731, 731, 731, 731, 64, 731, 731, 731, 731, 731, 731, 731, 64, 731, - 731, 64, 731, 731, 731, 731, 731, 64, 64, 732, 731, 730, 730, 729, 730, - 730, 730, 730, 64, 64, 730, 730, 64, 64, 730, 730, 733, 64, 64, 731, 64, - 64, 64, 64, 64, 64, 730, 64, 64, 64, 64, 64, 731, 731, 731, 731, 731, - 730, 730, 64, 64, 734, 734, 734, 734, 734, 734, 734, 64, 64, 64, 735, - 735, 735, 735, 735, 735, 735, 735, 736, 736, 736, 737, 737, 737, 737, - 737, 737, 736, 737, 736, 736, 736, 736, 737, 737, 736, 738, 739, 735, - 735, 740, 735, 741, 741, 741, 741, 741, 741, 741, 741, 741, 741, 64, 64, - 64, 64, 64, 64, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, 742, - 742, 742, 742, 742, 743, 743, 743, 744, 744, 744, 744, 64, 64, 743, 743, - 743, 743, 744, 744, 743, 745, 746, 747, 747, 747, 747, 747, 747, 747, - 747, 747, 747, 747, 747, 747, 747, 747, 742, 742, 742, 742, 744, 744, 64, - 64, 748, 748, 748, 748, 748, 748, 748, 748, 749, 749, 749, 750, 750, 750, - 750, 750, 750, 750, 750, 749, 749, 750, 749, 751, 750, 752, 752, 752, - 748, 64, 64, 64, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 64, - 64, 64, 64, 64, 64, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, - 754, 755, 756, 755, 756, 756, 755, 755, 755, 755, 755, 755, 757, 758, - 759, 759, 759, 759, 759, 759, 759, 759, 759, 759, 64, 64, 64, 64, 64, 64, - 760, 760, 760, 760, 760, 760, 760, 760, 760, 760, 64, 64, 64, 761, 761, - 761, 762, 762, 761, 761, 761, 761, 762, 761, 761, 761, 761, 763, 64, 64, - 64, 64, 764, 764, 764, 764, 764, 764, 764, 764, 764, 764, 765, 765, 766, - 766, 766, 767, 768, 768, 768, 768, 768, 768, 768, 768, 769, 769, 769, - 769, 769, 769, 769, 769, 770, 770, 770, 770, 770, 770, 770, 770, 770, - 770, 771, 771, 771, 771, 771, 771, 771, 771, 771, 64, 64, 64, 64, 64, 64, - 64, 64, 64, 64, 64, 64, 772, 773, 773, 773, 773, 773, 773, 773, 773, 773, - 64, 64, 64, 64, 64, 64, 64, 774, 774, 774, 774, 774, 774, 774, 774, 774, - 774, 64, 64, 64, 64, 64, 64, 775, 775, 775, 775, 775, 775, 775, 775, 775, - 775, 775, 775, 775, 775, 775, 64, 776, 776, 776, 776, 776, 64, 64, 64, - 774, 774, 774, 774, 64, 64, 64, 64, 777, 777, 777, 777, 777, 777, 777, - 777, 777, 777, 777, 777, 777, 777, 777, 64, 778, 778, 778, 778, 778, 778, - 778, 778, 778, 778, 778, 778, 778, 778, 778, 64, 511, 64, 64, 64, 64, 64, - 64, 64, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, 779, - 779, 779, 64, 780, 780, 780, 780, 780, 780, 780, 780, 780, 780, 64, 64, - 64, 64, 781, 781, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, 782, - 782, 782, 782, 64, 64, 783, 783, 783, 783, 783, 784, 64, 64, 785, 785, - 785, 785, 785, 785, 785, 785, 786, 786, 786, 786, 786, 786, 786, 787, - 787, 787, 787, 787, 788, 788, 788, 788, 789, 789, 789, 789, 787, 788, 64, - 64, 790, 790, 790, 790, 790, 790, 790, 790, 790, 790, 64, 791, 791, 791, - 791, 791, 791, 791, 64, 785, 785, 785, 785, 785, 64, 64, 64, 64, 64, 785, - 785, 785, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, 792, - 792, 64, 64, 64, 792, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, - 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 793, 64, 64, 64, - 64, 64, 64, 64, 64, 794, 794, 794, 794, 795, 795, 795, 795, 795, 795, - 795, 795, 795, 795, 795, 795, 795, 486, 482, 64, 64, 64, 64, 64, 64, 796, - 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, 64, 64, 64, 64, 64, - 796, 796, 796, 796, 796, 64, 64, 64, 796, 64, 64, 64, 64, 64, 64, 64, - 796, 796, 64, 64, 797, 798, 799, 800, 410, 410, 410, 410, 64, 64, 64, 64, - 277, 277, 277, 277, 277, 277, 64, 64, 277, 277, 277, 277, 277, 277, 277, - 64, 64, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 277, 801, - 801, 400, 400, 400, 277, 277, 277, 802, 801, 801, 801, 801, 801, 410, - 410, 410, 410, 410, 410, 410, 410, 136, 136, 136, 136, 136, 136, 136, - 136, 277, 277, 78, 78, 78, 78, 78, 136, 136, 277, 277, 277, 277, 277, - 277, 78, 78, 78, 78, 277, 277, 277, 64, 64, 64, 64, 64, 64, 64, 606, 606, - 803, 803, 803, 606, 64, 64, 521, 521, 64, 64, 64, 64, 64, 64, 442, 442, - 442, 442, 442, 442, 442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442, - 442, 442, 442, 442, 34, 34, 34, 34, 34, 34, 34, 64, 34, 34, 34, 34, 34, - 34, 442, 64, 442, 442, 64, 64, 442, 64, 64, 442, 442, 64, 64, 442, 442, - 442, 442, 64, 442, 442, 34, 34, 64, 34, 64, 34, 34, 34, 34, 34, 34, 34, - 64, 34, 34, 34, 34, 34, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 64, - 442, 442, 442, 442, 442, 442, 442, 442, 64, 442, 442, 442, 442, 442, 442, - 442, 64, 34, 34, 442, 442, 64, 442, 442, 442, 442, 64, 442, 442, 442, - 442, 442, 64, 442, 64, 64, 64, 442, 442, 442, 442, 442, 442, 442, 64, 34, - 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 34, 64, 64, 442, 804, 34, 34, 34, - 34, 34, 34, 34, 34, 34, 445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, - 442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34, 445, - 34, 34, 442, 442, 442, 442, 442, 804, 34, 34, 34, 34, 34, 34, 34, 34, 34, - 445, 34, 34, 34, 34, 34, 34, 442, 442, 442, 442, 442, 442, 442, 442, 442, - 804, 34, 445, 34, 34, 34, 34, 34, 34, 34, 34, 442, 34, 64, 64, 805, 805, - 805, 805, 805, 805, 805, 805, 805, 805, 806, 806, 806, 806, 806, 806, - 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, - 807, 807, 807, 806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807, - 807, 807, 807, 806, 806, 806, 806, 806, 806, 806, 806, 807, 806, 806, - 806, 806, 806, 806, 807, 806, 806, 808, 808, 808, 808, 808, 64, 64, 64, - 64, 64, 64, 64, 807, 807, 807, 807, 807, 64, 807, 807, 807, 807, 807, - 807, 807, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, 809, - 809, 64, 64, 810, 810, 810, 810, 810, 810, 810, 810, 810, 811, 811, 811, - 811, 811, 811, 811, 64, 126, 126, 126, 126, 64, 126, 126, 126, 64, 126, - 126, 64, 126, 64, 64, 126, 64, 126, 126, 126, 126, 126, 126, 126, 126, - 126, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126, 64, 64, 64, 64, 64, - 64, 126, 64, 64, 64, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 64, - 126, 64, 126, 64, 126, 64, 126, 64, 126, 126, 126, 126, 64, 126, 64, 126, - 126, 64, 126, 126, 126, 126, 126, 126, 126, 126, 126, 64, 64, 64, 64, 64, - 126, 126, 126, 64, 126, 126, 126, 113, 113, 64, 64, 64, 64, 64, 64, 64, - 26, 26, 26, 26, 26, 26, 26, 33, 33, 33, 446, 446, 64, 64, 64, 453, 453, - 453, 453, 453, 453, 277, 64, 453, 453, 26, 26, 64, 64, 64, 64, 453, 453, - 453, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 64, 277, 277, 812, 489, 489, - 64, 64, 64, 64, 64, 489, 489, 489, 64, 64, 64, 64, 64, 489, 64, 64, 64, - 64, 64, 64, 64, 489, 489, 64, 64, 64, 64, 64, 64, 26, 26, 26, 47, 47, 47, - 47, 47, 26, 26, 64, 26, 26, 26, 26, 26, 26, 26, 26, 26, 64, 26, 26, 26, - 26, 64, 64, 64, 64, 64, 64, 64, 26, 26, 26, 26, 26, 64, 64, 64, 496, 496, - 496, 496, 496, 496, 496, 497, 496, 496, 496, 496, 496, 497, 497, 497, - 497, 497, 497, 497, 497, 497, 64, 64, 64, 410, 64, 64, 64, 64, 64, 64, - 410, 410, 410, 410, 410, 410, 410, 410, 565, 565, 565, 565, 565, 565, 64, - 64, + 714, 714, 714, 714, 714, 717, 717, 718, 718, 718, 718, 718, 718, 718, + 718, 718, 718, 718, 718, 718, 718, 718, 82, 82, 82, 718, 718, 718, 718, + 718, 718, 82, 82, 718, 718, 718, 82, 82, 82, 719, 693, 705, 707, 720, + 693, 693, 82, 721, 722, 722, 722, 722, 721, 721, 82, 82, 723, 723, 723, + 724, 508, 82, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, + 725, 82, 725, 725, 725, 725, 725, 725, 725, 725, 725, 725, 82, 725, 725, + 725, 82, 725, 725, 82, 725, 725, 725, 725, 725, 725, 725, 82, 82, 725, + 725, 725, 82, 82, 82, 82, 82, 199, 373, 199, 82, 82, 82, 82, 620, 620, + 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 620, 82, 82, 82, 313, + 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 726, 727, + 727, 727, 727, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, 728, + 728, 728, 728, 728, 728, 728, 727, 727, 728, 729, 729, 82, 41, 41, 41, + 41, 82, 82, 82, 82, 728, 82, 82, 82, 82, 82, 82, 82, 313, 313, 313, 313, + 313, 157, 82, 82, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, 730, + 730, 730, 82, 82, 82, 731, 731, 731, 731, 731, 731, 731, 731, 731, 82, + 82, 82, 82, 82, 82, 82, 157, 500, 500, 500, 500, 500, 500, 500, 500, 500, + 500, 500, 500, 500, 500, 500, 500, 500, 500, 500, 82, 82, 82, 82, 732, + 732, 732, 732, 732, 732, 732, 732, 733, 733, 733, 733, 82, 82, 82, 82, + 734, 734, 734, 734, 734, 734, 734, 734, 734, 735, 734, 734, 734, 734, + 734, 734, 734, 734, 735, 82, 82, 82, 82, 82, 736, 736, 736, 736, 736, + 736, 736, 736, 736, 736, 736, 736, 736, 736, 737, 737, 737, 737, 737, 82, + 82, 82, 82, 82, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, 738, + 738, 738, 738, 82, 739, 740, 740, 740, 740, 740, 740, 740, 740, 740, 740, + 740, 740, 82, 82, 82, 82, 741, 742, 742, 742, 742, 742, 82, 82, 743, 743, + 743, 743, 743, 743, 743, 743, 744, 744, 744, 744, 744, 744, 744, 744, + 745, 745, 745, 745, 745, 745, 745, 745, 746, 746, 746, 746, 746, 746, + 746, 746, 746, 746, 746, 746, 746, 746, 82, 82, 747, 747, 747, 747, 747, + 747, 747, 747, 747, 747, 82, 82, 82, 82, 82, 82, 748, 748, 748, 748, 748, + 748, 748, 748, 748, 748, 748, 748, 82, 82, 82, 82, 749, 749, 749, 749, + 749, 749, 749, 749, 749, 749, 749, 749, 82, 82, 82, 82, 750, 750, 750, + 750, 750, 750, 750, 750, 751, 751, 751, 751, 751, 751, 751, 751, 751, + 751, 751, 751, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 752, 753, 753, + 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 753, 82, 753, + 753, 753, 753, 753, 753, 82, 82, 754, 754, 754, 754, 754, 754, 82, 82, + 754, 82, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, 754, + 754, 754, 754, 754, 754, 754, 754, 82, 754, 754, 82, 82, 82, 754, 82, 82, + 754, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, 755, + 755, 82, 756, 757, 757, 757, 757, 757, 757, 757, 757, 758, 758, 758, 758, + 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 758, 759, 759, 760, + 760, 760, 760, 760, 760, 760, 761, 761, 761, 761, 761, 761, 761, 761, + 761, 761, 761, 761, 761, 761, 761, 82, 82, 82, 82, 82, 82, 82, 82, 762, + 762, 762, 762, 762, 762, 762, 762, 762, 763, 763, 763, 763, 763, 763, + 763, 763, 763, 763, 763, 82, 763, 763, 82, 82, 82, 82, 82, 764, 764, 764, + 764, 764, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, 765, + 765, 765, 766, 766, 766, 766, 766, 766, 82, 82, 82, 767, 768, 768, 768, + 768, 768, 768, 768, 768, 768, 768, 82, 82, 82, 82, 82, 769, 770, 770, + 770, 770, 770, 770, 770, 770, 771, 771, 771, 771, 771, 771, 771, 771, 82, + 82, 82, 82, 772, 772, 771, 771, 772, 772, 772, 772, 772, 772, 772, 772, + 82, 82, 772, 772, 772, 772, 772, 772, 773, 774, 774, 774, 82, 774, 774, + 82, 82, 82, 82, 82, 774, 775, 774, 776, 773, 773, 773, 773, 82, 773, 773, + 773, 82, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, 773, + 773, 773, 773, 773, 773, 773, 82, 82, 82, 82, 776, 777, 775, 82, 82, 82, + 82, 778, 779, 779, 779, 779, 779, 779, 779, 779, 780, 780, 780, 780, 780, + 780, 780, 780, 781, 82, 82, 82, 82, 82, 82, 82, 782, 782, 782, 782, 782, + 782, 782, 782, 782, 782, 782, 782, 782, 783, 783, 784, 785, 785, 785, + 785, 785, 785, 785, 785, 785, 785, 785, 785, 785, 786, 786, 786, 787, + 787, 787, 787, 787, 787, 787, 787, 788, 787, 787, 787, 787, 787, 787, + 787, 787, 787, 787, 787, 787, 789, 790, 82, 82, 82, 82, 791, 791, 791, + 791, 791, 792, 792, 792, 792, 792, 792, 793, 82, 794, 794, 794, 794, 794, + 794, 794, 794, 794, 794, 794, 794, 794, 794, 82, 82, 82, 795, 795, 795, + 795, 795, 795, 795, 796, 796, 796, 796, 796, 796, 796, 796, 796, 796, + 796, 796, 796, 796, 82, 82, 797, 797, 797, 797, 797, 797, 797, 797, 798, + 798, 798, 798, 798, 798, 798, 798, 798, 798, 798, 82, 82, 82, 82, 82, + 799, 799, 799, 799, 799, 799, 799, 799, 800, 800, 800, 800, 800, 800, + 800, 800, 800, 800, 82, 82, 82, 82, 82, 82, 82, 801, 801, 801, 801, 82, + 82, 82, 82, 802, 802, 802, 802, 802, 802, 802, 803, 803, 803, 803, 803, + 803, 803, 803, 803, 82, 82, 82, 82, 82, 82, 82, 804, 804, 804, 804, 804, + 804, 804, 804, 804, 804, 804, 82, 82, 82, 82, 82, 805, 805, 805, 805, + 805, 805, 805, 805, 805, 805, 805, 82, 82, 82, 82, 82, 82, 82, 806, 806, + 806, 806, 806, 806, 807, 807, 807, 807, 807, 807, 807, 807, 807, 807, + 807, 807, 807, 807, 807, 82, 808, 809, 808, 810, 810, 810, 810, 810, 810, + 810, 810, 810, 810, 810, 810, 810, 809, 809, 809, 809, 809, 809, 809, + 809, 809, 809, 809, 809, 809, 809, 811, 812, 812, 813, 813, 813, 813, + 813, 82, 82, 82, 82, 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, + 814, 814, 814, 814, 814, 814, 814, 814, 814, 814, 815, 815, 815, 815, + 815, 815, 815, 815, 815, 815, 82, 82, 82, 82, 82, 82, 82, 811, 816, 816, + 817, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, 818, + 817, 817, 817, 816, 816, 816, 816, 817, 817, 819, 820, 821, 821, 822, + 823, 823, 823, 823, 82, 82, 82, 82, 82, 82, 824, 824, 824, 824, 824, 824, + 824, 824, 824, 82, 82, 82, 82, 82, 82, 82, 825, 825, 825, 825, 825, 825, + 825, 825, 825, 825, 82, 82, 82, 82, 82, 82, 826, 826, 826, 827, 827, 827, + 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, 827, + 827, 827, 827, 828, 828, 828, 828, 828, 829, 828, 828, 828, 828, 828, + 828, 830, 830, 82, 831, 831, 831, 831, 831, 831, 831, 831, 831, 831, 832, + 832, 832, 832, 82, 82, 82, 82, 833, 833, 833, 833, 833, 833, 833, 833, + 833, 833, 833, 834, 835, 836, 833, 82, 837, 837, 838, 839, 839, 839, 839, + 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 839, 838, 838, + 838, 837, 837, 837, 837, 837, 837, 837, 837, 837, 838, 840, 839, 839, + 839, 839, 841, 841, 842, 841, 842, 843, 837, 837, 842, 82, 82, 844, 844, + 844, 844, 844, 844, 844, 844, 844, 844, 839, 845, 839, 841, 841, 841, 82, + 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, 846, + 846, 846, 846, 846, 846, 846, 82, 82, 82, 847, 847, 847, 847, 847, 847, + 847, 847, 847, 847, 82, 847, 847, 847, 847, 847, 847, 847, 847, 847, 848, + 848, 848, 849, 849, 849, 848, 848, 849, 850, 851, 849, 852, 852, 853, + 852, 852, 853, 849, 82, 854, 854, 854, 854, 854, 854, 854, 82, 854, 82, + 854, 854, 854, 854, 82, 854, 854, 854, 854, 854, 854, 854, 854, 854, 854, + 854, 854, 854, 854, 854, 82, 854, 854, 855, 82, 82, 82, 82, 82, 82, 856, + 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, 856, + 857, 858, 858, 858, 857, 857, 857, 857, 857, 857, 859, 860, 82, 82, 82, + 82, 82, 861, 861, 861, 861, 861, 861, 861, 861, 861, 861, 82, 82, 82, 82, + 82, 82, 862, 862, 863, 863, 82, 864, 864, 864, 864, 864, 864, 864, 864, + 82, 82, 864, 864, 82, 82, 864, 864, 864, 864, 864, 864, 864, 864, 864, + 864, 864, 864, 864, 864, 82, 864, 864, 864, 864, 864, 864, 864, 82, 864, + 864, 82, 864, 864, 864, 864, 864, 82, 82, 865, 864, 863, 863, 862, 863, + 863, 863, 863, 82, 82, 863, 863, 82, 82, 863, 863, 866, 82, 82, 864, 82, + 82, 82, 82, 82, 82, 863, 82, 82, 82, 82, 82, 864, 864, 864, 864, 864, + 863, 863, 82, 82, 867, 867, 867, 867, 867, 867, 867, 82, 82, 82, 868, + 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 868, 869, 869, + 869, 870, 870, 870, 870, 870, 870, 870, 870, 869, 869, 871, 870, 870, + 869, 872, 868, 868, 868, 868, 873, 873, 873, 873, 874, 875, 875, 875, + 875, 875, 875, 875, 875, 875, 875, 82, 873, 82, 874, 82, 82, 876, 876, + 876, 876, 876, 876, 876, 876, 877, 877, 877, 878, 878, 878, 878, 878, + 878, 877, 878, 877, 877, 877, 877, 878, 878, 877, 879, 880, 876, 876, + 881, 876, 882, 882, 882, 882, 882, 882, 882, 882, 882, 882, 82, 82, 82, + 82, 82, 82, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, 883, + 883, 883, 883, 884, 884, 884, 885, 885, 885, 885, 82, 82, 884, 884, 884, + 884, 885, 885, 884, 886, 887, 888, 889, 889, 890, 890, 891, 891, 891, + 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, 889, + 889, 883, 883, 883, 883, 885, 885, 82, 82, 892, 892, 892, 892, 892, 892, + 892, 892, 893, 893, 893, 894, 894, 894, 894, 894, 894, 894, 894, 893, + 893, 894, 893, 895, 894, 896, 896, 897, 892, 82, 82, 82, 898, 898, 898, + 898, 898, 898, 898, 898, 898, 898, 82, 82, 82, 82, 82, 82, 899, 899, 899, + 899, 899, 899, 899, 899, 899, 899, 899, 899, 899, 82, 82, 82, 900, 900, + 900, 900, 900, 900, 900, 900, 900, 900, 900, 901, 902, 901, 902, 902, + 901, 901, 901, 901, 901, 901, 903, 904, 905, 905, 905, 905, 905, 905, + 905, 905, 905, 905, 82, 82, 82, 82, 82, 82, 906, 906, 906, 906, 906, 906, + 906, 906, 906, 906, 82, 82, 82, 907, 907, 907, 908, 908, 907, 907, 907, + 907, 908, 907, 907, 907, 907, 909, 82, 82, 82, 82, 910, 910, 910, 910, + 910, 910, 910, 910, 910, 910, 911, 911, 912, 912, 912, 913, 914, 914, + 914, 914, 914, 914, 914, 914, 915, 915, 915, 915, 915, 915, 915, 915, + 916, 916, 916, 916, 916, 916, 916, 916, 916, 916, 917, 917, 917, 917, + 917, 917, 917, 917, 917, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, 82, + 918, 919, 919, 919, 919, 919, 919, 919, 919, 919, 82, 82, 82, 82, 82, 82, + 82, 920, 920, 920, 920, 920, 920, 920, 920, 920, 82, 920, 920, 920, 920, + 920, 920, 920, 920, 920, 920, 920, 920, 920, 921, 922, 922, 922, 922, + 922, 922, 922, 82, 922, 922, 922, 922, 922, 922, 921, 923, 920, 924, 924, + 924, 924, 924, 82, 82, 925, 925, 925, 925, 925, 925, 925, 925, 925, 925, + 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, 926, + 926, 926, 926, 926, 926, 82, 82, 82, 927, 928, 929, 929, 929, 929, 929, + 929, 929, 929, 929, 929, 929, 929, 929, 929, 82, 82, 930, 930, 930, 930, + 930, 930, 930, 930, 930, 930, 930, 930, 930, 930, 82, 931, 930, 930, 930, + 930, 930, 930, 930, 931, 930, 930, 931, 930, 930, 82, 932, 932, 932, 932, + 932, 932, 932, 932, 932, 932, 82, 82, 82, 82, 82, 82, 933, 933, 933, 933, + 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 933, 82, 934, 934, 934, + 934, 934, 82, 82, 82, 932, 932, 932, 932, 82, 82, 82, 82, 935, 935, 935, + 935, 935, 935, 935, 935, 936, 936, 936, 937, 937, 937, 935, 935, 935, + 935, 937, 935, 935, 935, 936, 937, 936, 937, 935, 935, 935, 935, 935, + 935, 935, 936, 937, 937, 935, 935, 935, 935, 935, 935, 935, 935, 935, + 935, 935, 82, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, 938, + 938, 938, 939, 940, 938, 938, 938, 938, 938, 938, 938, 82, 609, 82, 82, + 82, 82, 82, 82, 82, 941, 941, 941, 941, 941, 941, 941, 941, 941, 941, + 941, 941, 941, 941, 941, 82, 942, 942, 942, 942, 942, 942, 942, 942, 942, + 942, 82, 82, 82, 82, 943, 943, 944, 944, 944, 944, 944, 944, 944, 944, + 944, 944, 944, 944, 944, 944, 82, 82, 945, 945, 945, 945, 945, 946, 82, + 82, 947, 947, 947, 947, 947, 947, 947, 947, 948, 948, 948, 948, 948, 948, + 948, 949, 949, 949, 950, 950, 951, 951, 951, 951, 952, 952, 952, 952, + 949, 951, 82, 82, 953, 953, 953, 953, 953, 953, 953, 953, 953, 953, 82, + 954, 954, 954, 954, 954, 954, 954, 82, 947, 947, 947, 947, 947, 82, 82, + 82, 82, 82, 947, 947, 947, 955, 955, 955, 955, 955, 955, 955, 955, 955, + 955, 955, 955, 955, 82, 82, 82, 955, 956, 956, 956, 956, 956, 956, 956, + 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, 956, + 956, 82, 82, 82, 82, 82, 82, 82, 82, 957, 957, 957, 957, 958, 958, 958, + 958, 958, 958, 958, 958, 958, 958, 958, 958, 958, 959, 82, 82, 82, 82, + 82, 82, 82, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, 960, + 960, 82, 82, 82, 960, 960, 960, 82, 82, 82, 82, 82, 580, 575, 82, 82, 82, + 82, 82, 82, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 961, 82, + 82, 82, 82, 82, 961, 961, 961, 961, 961, 82, 82, 82, 961, 82, 82, 82, 82, + 82, 82, 82, 961, 961, 82, 82, 962, 963, 964, 965, 499, 499, 499, 499, 82, + 82, 82, 82, 313, 313, 313, 313, 313, 313, 82, 82, 313, 313, 313, 313, + 313, 313, 313, 82, 82, 313, 313, 313, 313, 313, 313, 313, 313, 313, 313, + 313, 313, 966, 966, 447, 447, 447, 313, 313, 313, 967, 966, 966, 966, + 966, 966, 499, 499, 499, 499, 499, 499, 499, 499, 157, 157, 157, 157, + 157, 157, 157, 157, 313, 313, 97, 97, 97, 97, 97, 157, 157, 313, 313, + 313, 313, 313, 313, 97, 97, 97, 97, 313, 313, 313, 82, 82, 82, 82, 82, + 82, 82, 728, 728, 968, 968, 968, 728, 82, 82, 620, 620, 82, 82, 82, 82, + 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 506, 506, 506, + 506, 506, 506, 506, 506, 506, 506, 50, 50, 50, 50, 50, 50, 50, 82, 50, + 50, 50, 50, 50, 50, 506, 82, 506, 506, 82, 82, 506, 82, 82, 506, 506, 82, + 82, 506, 506, 506, 506, 82, 506, 506, 50, 50, 82, 50, 82, 50, 50, 50, 50, + 50, 50, 50, 82, 50, 50, 50, 50, 50, 50, 50, 506, 506, 82, 506, 506, 506, + 506, 82, 82, 506, 506, 506, 506, 506, 506, 506, 506, 82, 506, 506, 506, + 506, 506, 506, 506, 82, 50, 50, 506, 506, 82, 506, 506, 506, 506, 82, + 506, 506, 506, 506, 506, 82, 506, 82, 82, 82, 506, 506, 506, 506, 506, + 506, 506, 82, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 50, 82, 82, + 506, 969, 50, 50, 50, 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50, + 50, 506, 506, 506, 506, 506, 506, 506, 506, 506, 969, 50, 50, 50, 50, 50, + 50, 50, 50, 50, 513, 50, 50, 506, 506, 506, 506, 506, 969, 50, 50, 50, + 50, 50, 50, 50, 50, 50, 513, 50, 50, 50, 50, 50, 50, 506, 506, 506, 506, + 506, 506, 506, 506, 506, 969, 50, 513, 50, 50, 50, 50, 50, 50, 50, 50, + 506, 50, 82, 82, 970, 970, 970, 970, 970, 970, 970, 970, 970, 970, 971, + 971, 971, 971, 971, 971, 971, 971, 972, 972, 972, 972, 972, 972, 972, + 972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 972, 972, + 972, 972, 972, 972, 972, 972, 972, 972, 971, 971, 971, 971, 971, 971, + 971, 971, 972, 971, 971, 971, 971, 971, 971, 972, 971, 971, 973, 973, + 973, 973, 974, 82, 82, 82, 82, 82, 82, 82, 972, 972, 972, 972, 972, 82, + 972, 972, 972, 972, 972, 972, 972, 975, 975, 975, 975, 975, 975, 975, 82, + 975, 975, 975, 975, 975, 975, 975, 975, 975, 82, 82, 975, 975, 975, 975, + 975, 975, 975, 82, 975, 975, 82, 975, 975, 975, 975, 975, 82, 82, 82, 82, + 82, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 976, 82, + 82, 977, 977, 977, 977, 977, 977, 977, 977, 977, 978, 978, 978, 978, 978, + 978, 978, 82, 979, 979, 979, 979, 979, 979, 979, 979, 979, 979, 980, 980, + 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, 980, + 980, 980, 981, 981, 981, 981, 981, 981, 982, 82, 82, 82, 82, 82, 983, + 983, 983, 983, 983, 983, 983, 983, 983, 983, 82, 82, 82, 82, 984, 984, + 147, 147, 147, 147, 82, 147, 147, 147, 82, 147, 147, 82, 147, 82, 82, + 147, 82, 147, 147, 147, 147, 147, 147, 147, 147, 147, 147, 82, 147, 147, + 147, 147, 82, 147, 82, 147, 82, 82, 82, 82, 82, 82, 147, 82, 82, 82, 82, + 147, 82, 147, 82, 147, 82, 147, 147, 147, 82, 147, 82, 147, 82, 147, 82, + 147, 82, 147, 147, 147, 147, 82, 147, 82, 147, 147, 82, 147, 147, 147, + 147, 147, 147, 147, 147, 147, 82, 82, 82, 82, 82, 147, 147, 147, 82, 147, + 147, 147, 133, 133, 82, 82, 82, 82, 82, 82, 527, 527, 527, 527, 523, 527, + 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, 527, + 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 985, 527, 527, + 527, 527, 527, 527, 527, 985, 985, 527, 527, 527, 527, 527, 527, 527, + 527, 527, 527, 527, 527, 527, 527, 523, 527, 527, 527, 527, 527, 527, + 985, 985, 48, 48, 48, 516, 516, 985, 985, 985, 528, 528, 528, 528, 528, + 528, 313, 985, 528, 528, 41, 41, 985, 985, 985, 985, 528, 528, 528, 528, + 528, 528, 986, 528, 528, 986, 986, 986, 986, 986, 986, 986, 986, 986, + 986, 528, 528, 528, 528, 528, 528, 528, 528, 528, 528, 985, 985, 985, + 985, 985, 985, 985, 985, 985, 987, 987, 987, 987, 987, 987, 987, 987, + 987, 987, 988, 586, 586, 985, 985, 985, 985, 985, 586, 586, 586, 586, + 985, 985, 985, 985, 586, 985, 985, 985, 985, 985, 985, 985, 586, 586, + 985, 985, 985, 985, 985, 985, 523, 527, 527, 527, 527, 527, 527, 527, + 527, 527, 527, 527, 527, 523, 523, 523, 523, 523, 523, 523, 523, 523, + 527, 523, 523, 523, 523, 523, 523, 527, 523, 523, 523, 523, 523, 523, + 523, 534, 523, 523, 523, 523, 523, 523, 527, 527, 527, 527, 527, 527, + 527, 527, 41, 41, 527, 527, 523, 523, 523, 523, 523, 526, 526, 523, 523, + 523, 523, 523, 526, 523, 523, 523, 523, 523, 523, 534, 534, 523, 523, + 523, 523, 523, 534, 532, 527, 527, 527, 523, 523, 527, 527, 527, 523, + 527, 527, 527, 523, 523, 523, 989, 989, 989, 989, 989, 523, 523, 523, + 523, 523, 523, 523, 527, 523, 527, 534, 534, 523, 523, 534, 534, 534, + 534, 534, 534, 534, 534, 534, 534, 534, 523, 523, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 534, 523, 523, 523, + 523, 534, 523, 534, 523, 523, 523, 534, 523, 523, 523, 523, 534, 534, + 534, 523, 534, 534, 534, 526, 523, 526, 523, 526, 523, 523, 523, 523, + 523, 534, 523, 523, 523, 523, 526, 523, 526, 526, 523, 523, 523, 523, + 523, 523, 523, 523, 523, 523, 527, 527, 523, 526, 526, 526, 526, 526, + 526, 526, 523, 523, 523, 523, 523, 523, 523, 523, 526, 526, 526, 526, + 526, 526, 523, 523, 523, 523, 523, 526, 526, 526, 526, 526, 526, 526, + 526, 526, 526, 526, 526, 41, 41, 41, 41, 527, 523, 523, 523, 523, 527, + 527, 527, 527, 527, 527, 532, 527, 527, 527, 527, 534, 527, 527, 527, + 527, 527, 532, 527, 527, 527, 527, 534, 534, 527, 527, 527, 527, 527, 41, + 41, 41, 41, 41, 41, 41, 41, 527, 527, 527, 527, 41, 41, 527, 523, 523, + 523, 523, 523, 523, 523, 523, 523, 523, 534, 534, 534, 523, 523, 523, + 534, 534, 534, 534, 534, 41, 41, 41, 41, 41, 41, 536, 536, 536, 990, 990, + 990, 41, 41, 41, 41, 523, 523, 523, 534, 523, 523, 523, 523, 523, 523, + 523, 523, 534, 534, 534, 523, 534, 523, 523, 523, 523, 523, 527, 527, + 523, 523, 523, 985, 985, 985, 985, 985, 527, 527, 527, 523, 523, 985, + 985, 985, 527, 527, 527, 527, 523, 523, 523, 985, 41, 41, 41, 41, 985, + 985, 985, 985, 41, 41, 41, 41, 41, 985, 985, 985, 41, 41, 985, 985, 985, + 985, 985, 985, 41, 41, 41, 41, 41, 41, 985, 985, 534, 534, 534, 534, 534, + 534, 534, 985, 523, 523, 523, 523, 523, 523, 534, 523, 534, 985, 985, + 534, 534, 534, 534, 534, 534, 534, 523, 523, 534, 534, 534, 985, 523, + 523, 523, 523, 985, 985, 985, 985, 523, 523, 523, 523, 523, 523, 523, + 985, 523, 523, 985, 985, 985, 985, 985, 985, 523, 985, 985, 985, 985, + 985, 985, 985, 985, 985, 985, 985, 985, 985, 82, 82, 593, 593, 593, 593, + 593, 593, 593, 594, 593, 593, 593, 593, 593, 594, 594, 594, 594, 594, + 594, 594, 594, 594, 82, 82, 82, 499, 82, 82, 82, 82, 82, 82, 499, 499, + 499, 499, 499, 499, 499, 499, 671, 671, 671, 671, 671, 671, 82, 82, }; /* decomposition data */ @@ -3874,98 +4326,98 @@ 25429, 266, 19968, 266, 19977, 266, 36938, 266, 24038, 266, 20013, 266, 21491, 266, 25351, 266, 36208, 266, 25171, 266, 31105, 266, 31354, 266, 21512, 266, 28288, 266, 26377, 266, 26376, 266, 30003, 266, 21106, 266, - 21942, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309, 770, 12308, - 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857, 12309, 770, - 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308, 21213, 12309, - 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256, 20029, 256, 20024, - 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398, 256, 20411, 256, - 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687, 256, 13470, 256, - 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256, 20855, 256, 55361, - 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361, 56651, 256, 20887, - 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, 55396, 56799, 256, - 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, 256, 21106, 256, - 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, 256, 21242, 256, - 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, 256, 21338, 256, - 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, 256, 55362, 56876, - 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187, 256, 21483, 256, - 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, 256, 21608, 256, - 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, 256, 21892, 256, - 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, 256, 22294, 256, - 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, 256, 22766, 256, - 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, 256, 22577, 256, - 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256, 22790, 256, 22810, - 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365, 57066, 256, 23020, - 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, 14062, 256, 14076, - 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776, 256, 23491, 256, - 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256, 23551, 256, 23558, - 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, 23662, 256, 23744, - 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367, 56806, 256, 23918, - 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256, 14383, 256, 24061, - 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256, 55368, 56707, 256, - 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266, 256, 55400, 57234, - 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256, 33281, 256, 24354, - 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384, 56794, 256, 24418, - 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, 24535, 256, 24569, - 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, 55369, 57044, 256, - 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, 256, 24954, 256, - 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, 256, 25074, 256, - 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, 256, 25300, 256, - 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256, 25448, 256, 25475, - 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541, 256, 25513, 256, - 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, 256, 14956, 256, - 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256, 26360, 256, 26185, - 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, 20882, 256, 20885, - 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, 26391, 256, 26395, - 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283, 256, 15177, 256, - 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373, 56429, 256, 26766, - 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256, 27043, 256, 27114, - 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384, 256, 27425, 256, - 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256, 27551, 256, 27578, - 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256, 55374, 57082, 256, - 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256, 27751, 256, 27926, - 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, 28024, 256, 28037, - 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270, 256, 15667, 256, - 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256, 28526, 256, 55375, - 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256, 28702, 256, 28699, - 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, 28845, 256, 55361, - 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256, 55376, 57259, 256, - 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256, 29312, 256, 29333, - 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256, 29579, 256, 16044, - 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256, 29788, 256, 29809, - 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256, 55379, 56374, 256, - 30014, 256, 55379, 56466, 256, 30064, 256, 55368, 56735, 256, 30224, 256, - 55379, 57249, 256, 55379, 57272, 256, 55380, 56388, 256, 16380, 256, - 16392, 256, 30452, 256, 55380, 56563, 256, 55380, 56562, 256, 55380, - 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256, 30495, 256, 30538, - 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256, 55381, 56349, 256, - 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381, 56870, 256, 31062, - 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256, 31211, 256, 16687, - 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700, 256, 55382, 56999, - 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382, 57259, 256, 31686, - 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954, 256, 17056, 256, - 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256, 32099, 256, 17153, - 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, 55384, 56872, 256, - 55384, 56903, 256, 17241, 256, 55384, 57049, 256, 32634, 256, 55384, - 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385, 56538, 256, 55385, - 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256, 55372, 57183, 256, - 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, 256, 23221, 256, - 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256, 55372, 57244, - 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, 256, 33419, - 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, 256, 33510, - 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256, 33709, 256, - 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, 33738, 256, - 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256, 55387, - 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388, 57290, - 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387, 57265, - 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407, 256, - 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681, 256, - 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817, 256, - 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256, 35038, - 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390, 56678, - 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, 35925, - 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215, 256, - 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336, 256, - 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393, + 21942, 266, 37197, 770, 12308, 26412, 12309, 770, 12308, 19977, 12309, + 770, 12308, 20108, 12309, 770, 12308, 23433, 12309, 770, 12308, 28857, + 12309, 770, 12308, 25171, 12309, 770, 12308, 30423, 12309, 770, 12308, + 21213, 12309, 770, 12308, 25943, 12309, 263, 24471, 263, 21487, 256, + 20029, 256, 20024, 256, 20033, 256, 55360, 56610, 256, 20320, 256, 20398, + 256, 20411, 256, 20482, 256, 20602, 256, 20633, 256, 20711, 256, 20687, + 256, 13470, 256, 55361, 56890, 256, 20813, 256, 20820, 256, 20836, 256, + 20855, 256, 55361, 56604, 256, 13497, 256, 20839, 256, 20877, 256, 55361, + 56651, 256, 20887, 256, 20900, 256, 20172, 256, 20908, 256, 20917, 256, + 55396, 56799, 256, 20981, 256, 20995, 256, 13535, 256, 21051, 256, 21062, + 256, 21106, 256, 21111, 256, 13589, 256, 21191, 256, 21193, 256, 21220, + 256, 21242, 256, 21253, 256, 21254, 256, 21271, 256, 21321, 256, 21329, + 256, 21338, 256, 21363, 256, 21373, 256, 21375, 256, 21375, 256, 21375, + 256, 55362, 56876, 256, 28784, 256, 21450, 256, 21471, 256, 55362, 57187, + 256, 21483, 256, 21489, 256, 21510, 256, 21662, 256, 21560, 256, 21576, + 256, 21608, 256, 21666, 256, 21750, 256, 21776, 256, 21843, 256, 21859, + 256, 21892, 256, 21892, 256, 21913, 256, 21931, 256, 21939, 256, 21954, + 256, 22294, 256, 22022, 256, 22295, 256, 22097, 256, 22132, 256, 20999, + 256, 22766, 256, 22478, 256, 22516, 256, 22541, 256, 22411, 256, 22578, + 256, 22577, 256, 22700, 256, 55365, 56548, 256, 22770, 256, 22775, 256, + 22790, 256, 22810, 256, 22818, 256, 22882, 256, 55365, 57000, 256, 55365, + 57066, 256, 23020, 256, 23067, 256, 23079, 256, 23000, 256, 23142, 256, + 14062, 256, 14076, 256, 23304, 256, 23358, 256, 23358, 256, 55366, 56776, + 256, 23491, 256, 23512, 256, 23527, 256, 23539, 256, 55366, 57112, 256, + 23551, 256, 23558, 256, 24403, 256, 23586, 256, 14209, 256, 23648, 256, + 23662, 256, 23744, 256, 23693, 256, 55367, 56804, 256, 23875, 256, 55367, + 56806, 256, 23918, 256, 23915, 256, 23932, 256, 24033, 256, 24034, 256, + 14383, 256, 24061, 256, 24104, 256, 24125, 256, 24169, 256, 14434, 256, + 55368, 56707, 256, 14460, 256, 24240, 256, 24243, 256, 24246, 256, 24266, + 256, 55400, 57234, 256, 24318, 256, 55368, 57137, 256, 55368, 57137, 256, + 33281, 256, 24354, 256, 24354, 256, 14535, 256, 55372, 57016, 256, 55384, + 56794, 256, 24418, 256, 24427, 256, 14563, 256, 24474, 256, 24525, 256, + 24535, 256, 24569, 256, 24705, 256, 14650, 256, 14620, 256, 24724, 256, + 55369, 57044, 256, 24775, 256, 24904, 256, 24908, 256, 24910, 256, 24908, + 256, 24954, 256, 24974, 256, 25010, 256, 24996, 256, 25007, 256, 25054, + 256, 25074, 256, 25078, 256, 25104, 256, 25115, 256, 25181, 256, 25265, + 256, 25300, 256, 25424, 256, 55370, 57100, 256, 25405, 256, 25340, 256, + 25448, 256, 25475, 256, 25572, 256, 55370, 57329, 256, 25634, 256, 25541, + 256, 25513, 256, 14894, 256, 25705, 256, 25726, 256, 25757, 256, 25719, + 256, 14956, 256, 25935, 256, 25964, 256, 55372, 56330, 256, 26083, 256, + 26360, 256, 26185, 256, 15129, 256, 26257, 256, 15112, 256, 15076, 256, + 20882, 256, 20885, 256, 26368, 256, 26268, 256, 32941, 256, 17369, 256, + 26391, 256, 26395, 256, 26401, 256, 26462, 256, 26451, 256, 55372, 57283, + 256, 15177, 256, 26618, 256, 26501, 256, 26706, 256, 26757, 256, 55373, + 56429, 256, 26766, 256, 26655, 256, 26900, 256, 15261, 256, 26946, 256, + 27043, 256, 27114, 256, 27304, 256, 55373, 56995, 256, 27355, 256, 15384, + 256, 27425, 256, 55374, 56487, 256, 27476, 256, 15438, 256, 27506, 256, + 27551, 256, 27578, 256, 27579, 256, 55374, 56973, 256, 55367, 56587, 256, + 55374, 57082, 256, 27726, 256, 55375, 56508, 256, 27839, 256, 27853, 256, + 27751, 256, 27926, 256, 27966, 256, 28023, 256, 27969, 256, 28009, 256, + 28024, 256, 28037, 256, 55375, 56606, 256, 27956, 256, 28207, 256, 28270, + 256, 15667, 256, 28363, 256, 28359, 256, 55375, 57041, 256, 28153, 256, + 28526, 256, 55375, 57182, 256, 55375, 57230, 256, 28614, 256, 28729, 256, + 28702, 256, 28699, 256, 15766, 256, 28746, 256, 28797, 256, 28791, 256, + 28845, 256, 55361, 56613, 256, 28997, 256, 55376, 56931, 256, 29084, 256, + 55376, 57259, 256, 29224, 256, 29237, 256, 29264, 256, 55377, 56840, 256, + 29312, 256, 29333, 256, 55377, 57141, 256, 55378, 56340, 256, 29562, 256, + 29579, 256, 16044, 256, 29605, 256, 16056, 256, 16056, 256, 29767, 256, + 29788, 256, 29809, 256, 29829, 256, 29898, 256, 16155, 256, 29988, 256, + 55379, 56374, 256, 30014, 256, 55379, 56466, 256, 30064, 256, 55368, + 56735, 256, 30224, 256, 55379, 57249, 256, 55379, 57272, 256, 55380, + 56388, 256, 16380, 256, 16392, 256, 30452, 256, 55380, 56563, 256, 55380, + 56562, 256, 55380, 56601, 256, 55380, 56627, 256, 30494, 256, 30495, 256, + 30495, 256, 30538, 256, 16441, 256, 30603, 256, 16454, 256, 16534, 256, + 55381, 56349, 256, 30798, 256, 30860, 256, 30924, 256, 16611, 256, 55381, + 56870, 256, 31062, 256, 55381, 56986, 256, 55381, 57029, 256, 31119, 256, + 31211, 256, 16687, 256, 31296, 256, 31306, 256, 31311, 256, 55382, 56700, + 256, 55382, 56999, 256, 55382, 56999, 256, 31470, 256, 16898, 256, 55382, + 57259, 256, 31686, 256, 31689, 256, 16935, 256, 55383, 56448, 256, 31954, + 256, 17056, 256, 31976, 256, 31971, 256, 32000, 256, 55383, 57222, 256, + 32099, 256, 17153, 256, 32199, 256, 32258, 256, 32325, 256, 17204, 256, + 55384, 56872, 256, 55384, 56903, 256, 17241, 256, 55384, 57049, 256, + 32634, 256, 55384, 57150, 256, 32661, 256, 32762, 256, 32773, 256, 55385, + 56538, 256, 55385, 56611, 256, 32864, 256, 55385, 56744, 256, 32880, 256, + 55372, 57183, 256, 17365, 256, 32946, 256, 33027, 256, 17419, 256, 33086, + 256, 23221, 256, 55385, 57255, 256, 55385, 57269, 256, 55372, 57235, 256, + 55372, 57244, 256, 33281, 256, 33284, 256, 36766, 256, 17515, 256, 33425, + 256, 33419, 256, 33437, 256, 21171, 256, 33457, 256, 33459, 256, 33469, + 256, 33510, 256, 55386, 57148, 256, 33509, 256, 33565, 256, 33635, 256, + 33709, 256, 33571, 256, 33725, 256, 33767, 256, 33879, 256, 33619, 256, + 33738, 256, 33740, 256, 33756, 256, 55387, 56374, 256, 55387, 56683, 256, + 55387, 56533, 256, 17707, 256, 34033, 256, 34035, 256, 34070, 256, 55388, + 57290, 256, 34148, 256, 55387, 57132, 256, 17757, 256, 17761, 256, 55387, + 57265, 256, 55388, 56530, 256, 17771, 256, 34384, 256, 34396, 256, 34407, + 256, 34409, 256, 34473, 256, 34440, 256, 34574, 256, 34530, 256, 34681, + 256, 34600, 256, 34667, 256, 34694, 256, 17879, 256, 34785, 256, 34817, + 256, 17913, 256, 34912, 256, 34915, 256, 55389, 56935, 256, 35031, 256, + 35038, 256, 17973, 256, 35066, 256, 13499, 256, 55390, 56494, 256, 55390, + 56678, 256, 18110, 256, 18119, 256, 35488, 256, 35565, 256, 35722, 256, + 35925, 256, 55391, 56488, 256, 36011, 256, 36033, 256, 36123, 256, 36215, + 256, 55391, 57135, 256, 55362, 56324, 256, 36299, 256, 36284, 256, 36336, + 256, 55362, 56542, 256, 36564, 256, 36664, 256, 55393, 56786, 256, 55393, 56813, 256, 37012, 256, 37105, 256, 37137, 256, 55393, 57134, 256, 37147, 256, 37432, 256, 37591, 256, 37592, 256, 37500, 256, 37881, 256, 37909, 256, 55394, 57338, 256, 38283, 256, 18837, 256, 38327, 256, 55395, 56695, @@ -4642,64 +5094,64 @@ 13103, 13105, 13107, 13109, 13111, 13113, 13115, 13117, 13119, 13121, 13123, 13125, 13127, 13129, 13131, 13133, 13135, 13137, 13139, 13141, 13143, 13145, 13147, 13149, 13151, 13153, 13155, 13157, 13159, 13161, - 13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 0, 0, 0, 0, 0, - 13179, 13183, 13187, 13191, 13195, 13199, 13203, 13207, 13211, 0, 0, 0, - 0, 0, 0, 0, 13215, 13217, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 13219, 13221, 13223, 13225, 13228, 13230, 13232, 13234, 13236, 13238, - 13240, 13242, 13244, 13246, 13249, 13251, 13253, 13255, 13257, 13260, - 13262, 13264, 13266, 13269, 13271, 13273, 13275, 13277, 13279, 13282, - 13284, 13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302, - 13304, 13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322, - 13324, 13326, 13328, 13331, 13333, 13335, 13337, 13340, 13342, 13344, - 13346, 13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364, - 13366, 13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384, - 13386, 13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404, - 13407, 13409, 13411, 13413, 13415, 13417, 13419, 13422, 13425, 13427, - 13429, 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13448, - 13450, 13452, 13454, 13456, 13459, 13461, 13463, 13465, 13467, 13469, - 13471, 13473, 13475, 13477, 13480, 13482, 13485, 13487, 13489, 13491, - 13493, 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13510, 13512, - 13514, 13516, 13518, 13520, 13523, 13525, 13528, 13531, 13533, 13535, - 13537, 13539, 13542, 13545, 13547, 13549, 13551, 13553, 13555, 13557, - 13559, 13561, 13563, 13565, 13567, 13570, 13572, 13574, 13576, 13578, - 13580, 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598, - 13600, 13602, 13604, 13606, 13608, 13611, 13613, 13615, 13617, 13619, - 13621, 13624, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640, - 13642, 13644, 13646, 13649, 13651, 13653, 13655, 13657, 13659, 13661, - 13663, 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, - 13683, 13685, 13688, 13690, 13692, 13694, 13696, 13698, 13701, 13703, - 13705, 13707, 13709, 13711, 13713, 13715, 13717, 13720, 13722, 13724, - 13726, 13729, 13731, 13733, 13735, 13737, 13739, 13741, 13744, 13747, - 13750, 13752, 13755, 13757, 13759, 13761, 13763, 13765, 13767, 13769, - 13771, 13773, 13775, 13778, 13780, 13782, 13784, 13786, 13788, 13790, - 13793, 13795, 13797, 13800, 13803, 13805, 13807, 13809, 13811, 13813, - 13815, 13817, 13819, 13821, 13824, 13826, 13829, 13831, 13834, 13836, - 13838, 13840, 13843, 13845, 13847, 13850, 13853, 13855, 13857, 13859, - 13861, 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879, - 13882, 13884, 13887, 13889, 13892, 13894, 13897, 13900, 13903, 13905, - 13907, 13909, 13912, 13915, 13918, 13921, 13923, 13925, 13927, 13929, - 13931, 13933, 13935, 13937, 13940, 13942, 13944, 13946, 13948, 13951, - 13953, 13956, 13959, 13961, 13963, 13965, 13967, 13969, 13971, 13974, - 13977, 13980, 13982, 13984, 13987, 13989, 13991, 13993, 13996, 13998, - 14000, 14002, 14004, 14006, 14009, 14011, 14013, 14015, 14017, 14019, - 14021, 14024, 14027, 14029, 14032, 14034, 14037, 14039, 14041, 14043, - 14046, 14049, 14051, 14054, 14056, 14059, 14061, 14063, 14065, 14067, - 14069, 14071, 14074, 14077, 14080, 14083, 14085, 14087, 14089, 14091, - 14093, 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14110, 14112, - 14114, 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, - 14134, 14137, 14140, 14143, 14145, 14147, 14149, 14151, 14154, 14156, - 14159, 14161, 14163, 14166, 14169, 14171, 14173, 14175, 14177, 14179, - 14181, 14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199, - 14201, 14203, 14205, 14207, 14210, 14212, 14214, 14216, 14218, 14220, - 14223, 14226, 14228, 14230, 14232, 14234, 14236, 14238, 14241, 14243, - 14245, 14247, 14249, 14252, 14255, 14257, 14259, 14261, 14264, 14266, - 14268, 14271, 14274, 14276, 14278, 14280, 14283, 14285, 14287, 14289, - 14291, 14293, 14295, 14297, 14300, 14302, 14304, 14306, 14309, 14311, - 14313, 14315, 14317, 14320, 14323, 14325, 14327, 14329, 14332, 14334, - 14337, 14339, 14341, 14343, 14346, 14348, 14350, 14352, 14354, 14356, - 14358, 14360, 14363, 14365, 14367, 14369, 14371, 14373, 14375, 14378, - 14380, 14383, 14386, 14389, 14391, 14393, 14395, 14397, 14399, 14401, - 14403, 14405, 0, 0, + 13163, 13165, 13167, 13169, 13171, 13173, 13175, 13177, 13179, 0, 0, 0, + 0, 13181, 13185, 13189, 13193, 13197, 13201, 13205, 13209, 13213, 0, 0, + 0, 0, 0, 0, 0, 13217, 13219, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 13221, 13223, 13225, 13227, 13230, 13232, 13234, 13236, 13238, 13240, + 13242, 13244, 13246, 13248, 13251, 13253, 13255, 13257, 13259, 13262, + 13264, 13266, 13268, 13271, 13273, 13275, 13277, 13279, 13281, 13284, + 13286, 13288, 13290, 13292, 13294, 13296, 13298, 13300, 13302, 13304, + 13306, 13308, 13310, 13312, 13314, 13316, 13318, 13320, 13322, 13324, + 13326, 13328, 13330, 13333, 13335, 13337, 13339, 13342, 13344, 13346, + 13348, 13350, 13352, 13354, 13356, 13358, 13360, 13362, 13364, 13366, + 13368, 13370, 13372, 13374, 13376, 13378, 13380, 13382, 13384, 13386, + 13388, 13390, 13392, 13394, 13396, 13398, 13400, 13402, 13404, 13406, + 13409, 13411, 13413, 13415, 13417, 13419, 13421, 13424, 13427, 13429, + 13431, 13433, 13435, 13437, 13439, 13441, 13443, 13445, 13447, 13450, + 13452, 13454, 13456, 13458, 13461, 13463, 13465, 13467, 13469, 13471, + 13473, 13475, 13477, 13479, 13482, 13484, 13487, 13489, 13491, 13493, + 13495, 13497, 13499, 13501, 13503, 13505, 13507, 13509, 13512, 13514, + 13516, 13518, 13520, 13522, 13525, 13527, 13530, 13533, 13535, 13537, + 13539, 13541, 13544, 13547, 13549, 13551, 13553, 13555, 13557, 13559, + 13561, 13563, 13565, 13567, 13569, 13572, 13574, 13576, 13578, 13580, + 13582, 13584, 13586, 13588, 13590, 13592, 13594, 13596, 13598, 13600, + 13602, 13604, 13606, 13608, 13610, 13613, 13615, 13617, 13619, 13621, + 13623, 13626, 13628, 13630, 13632, 13634, 13636, 13638, 13640, 13642, + 13644, 13646, 13648, 13651, 13653, 13655, 13657, 13659, 13661, 13663, + 13665, 13667, 13669, 13671, 13673, 13675, 13677, 13679, 13681, 13683, + 13685, 13687, 13690, 13692, 13694, 13696, 13698, 13700, 13703, 13705, + 13707, 13709, 13711, 13713, 13715, 13717, 13719, 13722, 13724, 13726, + 13728, 13731, 13733, 13735, 13737, 13739, 13741, 13743, 13746, 13749, + 13752, 13754, 13757, 13759, 13761, 13763, 13765, 13767, 13769, 13771, + 13773, 13775, 13777, 13780, 13782, 13784, 13786, 13788, 13790, 13792, + 13795, 13797, 13799, 13802, 13805, 13807, 13809, 13811, 13813, 13815, + 13817, 13819, 13821, 13823, 13826, 13828, 13831, 13833, 13836, 13838, + 13840, 13842, 13845, 13847, 13849, 13852, 13855, 13857, 13859, 13861, + 13863, 13865, 13867, 13869, 13871, 13873, 13875, 13877, 13879, 13881, + 13884, 13886, 13889, 13891, 13894, 13896, 13899, 13902, 13905, 13907, + 13909, 13911, 13914, 13917, 13920, 13923, 13925, 13927, 13929, 13931, + 13933, 13935, 13937, 13939, 13942, 13944, 13946, 13948, 13950, 13953, + 13955, 13958, 13961, 13963, 13965, 13967, 13969, 13971, 13973, 13976, + 13979, 13982, 13984, 13986, 13989, 13991, 13993, 13995, 13998, 14000, + 14002, 14004, 14006, 14008, 14011, 14013, 14015, 14017, 14019, 14021, + 14023, 14026, 14029, 14031, 14034, 14036, 14039, 14041, 14043, 14045, + 14048, 14051, 14053, 14056, 14058, 14061, 14063, 14065, 14067, 14069, + 14071, 14073, 14076, 14079, 14082, 14085, 14087, 14089, 14091, 14093, + 14095, 14097, 14099, 14101, 14103, 14105, 14107, 14109, 14112, 14114, + 14116, 14118, 14120, 14122, 14124, 14126, 14128, 14130, 14132, 14134, + 14136, 14139, 14142, 14145, 14147, 14149, 14151, 14153, 14156, 14158, + 14161, 14163, 14165, 14168, 14171, 14173, 14175, 14177, 14179, 14181, + 14183, 14185, 14187, 14189, 14191, 14193, 14195, 14197, 14199, 14201, + 14203, 14205, 14207, 14209, 14212, 14214, 14216, 14218, 14220, 14222, + 14225, 14228, 14230, 14232, 14234, 14236, 14238, 14240, 14243, 14245, + 14247, 14249, 14251, 14254, 14257, 14259, 14261, 14263, 14266, 14268, + 14270, 14273, 14276, 14278, 14280, 14282, 14285, 14287, 14289, 14291, + 14293, 14295, 14297, 14299, 14302, 14304, 14306, 14308, 14311, 14313, + 14315, 14317, 14319, 14322, 14325, 14327, 14329, 14331, 14334, 14336, + 14339, 14341, 14343, 14345, 14348, 14350, 14352, 14354, 14356, 14358, + 14360, 14362, 14365, 14367, 14369, 14371, 14373, 14375, 14377, 14380, + 14382, 14385, 14388, 14391, 14393, 14395, 14397, 14399, 14401, 14403, + 14405, 14407, 0, 0, }; /* NFC pairs */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -115,6 +115,8 @@ /* XXX This hack belongs to the Tibetan shaper: * Reorder PADMA to ensure it comes after any vowel marks. */ if (unlikely (unicode == 0x0FC6u)) return 254; + /* Reorder TSA -PHRU to reorder before U+0F74 */ + if (unlikely (unicode == 0x0F39u)) return 127; return _hb_modified_combining_class[combining_class (unicode)]; } @@ -180,8 +182,8 @@ case 0x17: return hb_in_range (ch, 0x17B4u, 0x17B5u); case 0x18: return hb_in_range (ch, 0x180Bu, 0x180Eu); case 0x20: return hb_in_ranges (ch, 0x200Bu, 0x200Fu, - 0x202Au, 0x202Eu, - 0x2060u, 0x206Fu); + 0x202Au, 0x202Eu, + 0x2060u, 0x206Fu); case 0xFE: return hb_in_range (ch, 0xFE00u, 0xFE0Fu) || ch == 0xFEFFu; case 0xFF: return hb_in_range (ch, 0xFFF0u, 0xFFF8u); default: return false; @@ -199,6 +201,50 @@ } } + /* Space estimates based on: + * http://www.unicode.org/charts/PDF/U2000.pdf + * https://www.microsoft.com/typography/developers/fdsspec/spaces.aspx + */ + enum space_t { + NOT_SPACE = 0, + SPACE_EM = 1, + SPACE_EM_2 = 2, + SPACE_EM_3 = 3, + SPACE_EM_4 = 4, + SPACE_EM_5 = 5, + SPACE_EM_6 = 6, + SPACE_EM_16 = 16, + SPACE_4_EM_18, /* 4/18th of an EM! */ + SPACE, + SPACE_FIGURE, + SPACE_PUNCTUATION, + SPACE_NARROW, + }; + static inline space_t + space_fallback_type (hb_codepoint_t u) + { + switch (u) + { + /* All GC=Zs chars that can use a fallback. */ + default: return NOT_SPACE; /* U+1680 OGHAM SPACE MARK */ + case 0x0020u: return SPACE; /* U+0020 SPACE */ + case 0x00A0u: return SPACE; /* U+00A0 NO-BREAK SPACE */ + case 0x2000u: return SPACE_EM_2; /* U+2000 EN QUAD */ + case 0x2001u: return SPACE_EM; /* U+2001 EM QUAD */ + case 0x2002u: return SPACE_EM_2; /* U+2002 EN SPACE */ + case 0x2003u: return SPACE_EM; /* U+2003 EM SPACE */ + case 0x2004u: return SPACE_EM_3; /* U+2004 THREE-PER-EM SPACE */ + case 0x2005u: return SPACE_EM_4; /* U+2005 FOUR-PER-EM SPACE */ + case 0x2006u: return SPACE_EM_6; /* U+2006 SIX-PER-EM SPACE */ + case 0x2007u: return SPACE_FIGURE; /* U+2007 FIGURE SPACE */ + case 0x2008u: return SPACE_PUNCTUATION; /* U+2008 PUNCTUATION SPACE */ + case 0x2009u: return SPACE_EM_5; /* U+2009 THIN SPACE */ + case 0x200Au: return SPACE_EM_16; /* U+200A HAIR SPACE */ + case 0x202Fu: return SPACE_NARROW; /* U+202F NARROW NO-BREAK SPACE */ + case 0x205Fu: return SPACE_4_EM_18; /* U+205F MEDIUM MATHEMATICAL SPACE */ + case 0x3000u: return SPACE_EM; /* U+3000 IDEOGRAPHIC SPACE */ + } + } struct { #define HB_UNICODE_FUNC_IMPLEMENT(name) hb_unicode_##name##_func_t name; @@ -299,10 +345,12 @@ #define HB_MODIFIED_COMBINING_CLASS_CCC118 118 /* sign u / sign uu */ #define HB_MODIFIED_COMBINING_CLASS_CCC122 122 /* mai * */ -/* Tibetan */ +/* Tibetan + * Modify U+0F74 (ccc=132) to reorder before ccc=130 marks. + */ #define HB_MODIFIED_COMBINING_CLASS_CCC129 129 /* sign aa */ #define HB_MODIFIED_COMBINING_CLASS_CCC130 130 /* sign i */ -#define HB_MODIFIED_COMBINING_CLASS_CCC132 132 /* sign u */ +#define HB_MODIFIED_COMBINING_CLASS_CCC132 128 /* sign u */ /* Misc */ @@ -313,5 +361,10 @@ FLAG (HB_UNICODE_GENERAL_CATEGORY_ENCLOSING_MARK) | \ FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK))) +#define HB_UNICODE_GENERAL_CATEGORY_IS_NON_ENCLOSING_MARK_OR_MODIFIER_SYMBOL(gen_cat) \ + (FLAG_SAFE (gen_cat) & \ + (FLAG (HB_UNICODE_GENERAL_CATEGORY_SPACING_MARK) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_NON_SPACING_MARK) | \ + FLAG (HB_UNICODE_GENERAL_CATEGORY_MODIFIER_SYMBOL))) #endif /* HB_UNICODE_PRIVATE_HH */
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-unicode.h Tue Aug 09 16:20:02 2016 -0700 @@ -174,23 +174,23 @@ /* * just give me the best implementation you've got there. */ -hb_unicode_funcs_t * +HB_EXTERN hb_unicode_funcs_t * hb_unicode_funcs_get_default (void); -hb_unicode_funcs_t * +HB_EXTERN hb_unicode_funcs_t * hb_unicode_funcs_create (hb_unicode_funcs_t *parent); -hb_unicode_funcs_t * +HB_EXTERN hb_unicode_funcs_t * hb_unicode_funcs_get_empty (void); -hb_unicode_funcs_t * +HB_EXTERN hb_unicode_funcs_t * hb_unicode_funcs_reference (hb_unicode_funcs_t *ufuncs); -void +HB_EXTERN void hb_unicode_funcs_destroy (hb_unicode_funcs_t *ufuncs); -hb_bool_t +HB_EXTERN hb_bool_t hb_unicode_funcs_set_user_data (hb_unicode_funcs_t *ufuncs, hb_user_data_key_t *key, void * data, @@ -198,18 +198,18 @@ hb_bool_t replace); -void * +HB_EXTERN void * hb_unicode_funcs_get_user_data (hb_unicode_funcs_t *ufuncs, hb_user_data_key_t *key); -void +HB_EXTERN void hb_unicode_funcs_make_immutable (hb_unicode_funcs_t *ufuncs); -hb_bool_t +HB_EXTERN hb_bool_t hb_unicode_funcs_is_immutable (hb_unicode_funcs_t *ufuncs); -hb_unicode_funcs_t * +HB_EXTERN hb_unicode_funcs_t * hb_unicode_funcs_get_parent (hb_unicode_funcs_t *ufuncs); @@ -285,7 +285,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_combining_class_func (hb_unicode_funcs_t *ufuncs, hb_unicode_combining_class_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -301,7 +301,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_eastasian_width_func (hb_unicode_funcs_t *ufuncs, hb_unicode_eastasian_width_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -317,7 +317,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_general_category_func (hb_unicode_funcs_t *ufuncs, hb_unicode_general_category_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -333,7 +333,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_mirroring_func (hb_unicode_funcs_t *ufuncs, hb_unicode_mirroring_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -349,7 +349,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_script_func (hb_unicode_funcs_t *ufuncs, hb_unicode_script_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -365,7 +365,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_compose_func (hb_unicode_funcs_t *ufuncs, hb_unicode_compose_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -381,7 +381,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_decompose_func (hb_unicode_funcs_t *ufuncs, hb_unicode_decompose_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -397,7 +397,7 @@ * * Since: 0.9.2 **/ -void +HB_EXTERN void hb_unicode_funcs_set_decompose_compatibility_func (hb_unicode_funcs_t *ufuncs, hb_unicode_decompose_compatibility_func_t func, void *user_data, hb_destroy_func_t destroy); @@ -405,62 +405,63 @@ /* accessors */ /** + * hb_unicode_combining_class: + * * Since: 0.9.2 **/ -hb_unicode_combining_class_t +HB_EXTERN hb_unicode_combining_class_t hb_unicode_combining_class (hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode); /** + * hb_unicode_eastasian_width: + * * Since: 0.9.2 **/ -unsigned int +HB_EXTERN unsigned int hb_unicode_eastasian_width (hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode); /** + * hb_unicode_general_category: + * * Since: 0.9.2 **/ -hb_unicode_general_category_t +HB_EXTERN hb_unicode_general_category_t hb_unicode_general_category (hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode); /** + * hb_unicode_mirroring: + * * Since: 0.9.2 **/ -hb_codepoint_t +HB_EXTERN hb_codepoint_t hb_unicode_mirroring (hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode); /** + * hb_unicode_script: + * * Since: 0.9.2 **/ -hb_script_t +HB_EXTERN hb_script_t hb_unicode_script (hb_unicode_funcs_t *ufuncs, hb_codepoint_t unicode); -/** - * Since: 0.9.2 - **/ -hb_bool_t +HB_EXTERN hb_bool_t hb_unicode_compose (hb_unicode_funcs_t *ufuncs, hb_codepoint_t a, hb_codepoint_t b, hb_codepoint_t *ab); -/** - * Since: 0.9.2 - **/ -hb_bool_t +HB_EXTERN hb_bool_t hb_unicode_decompose (hb_unicode_funcs_t *ufuncs, hb_codepoint_t ab, hb_codepoint_t *a, hb_codepoint_t *b); -/** - * Since: 0.9.2 - **/ -unsigned int +HB_EXTERN unsigned int hb_unicode_decompose_compatibility (hb_unicode_funcs_t *ufuncs, hb_codepoint_t u, hb_codepoint_t *decomposed);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-utf-private.hh Tue Aug 09 16:20:02 2016 -0700 @@ -146,11 +146,11 @@ return text; } - if (likely (hb_in_range (c, 0xD800u, 0xDBFFu))) + if (likely (c <= 0xDBFFu && text < end)) { /* High-surrogate in c */ - hb_codepoint_t l; - if (text < end && ((l = *text), likely (hb_in_range (l, 0xDC00u, 0xDFFFu)))) + hb_codepoint_t l = *text; + if (likely (hb_in_range (l, 0xDC00u, 0xDFFFu))) { /* Low-surrogate in l */ *unicode = (c << 10) + l - ((0xD800u << 10) - 0x10000u + 0xDC00u); @@ -170,8 +170,7 @@ hb_codepoint_t *unicode, hb_codepoint_t replacement) { - const uint16_t *end = text--; - hb_codepoint_t c = *text; + hb_codepoint_t c = *--text; if (likely (!hb_in_range (c, 0xD800u, 0xDFFFu))) { @@ -179,14 +178,22 @@ return text; } - if (likely (start < text && hb_in_range (c, 0xDC00u, 0xDFFFu))) - text--; + if (likely (c >= 0xDC00u && start < text)) + { + /* Low-surrogate in c */ + hb_codepoint_t h = text[-1]; + if (likely (hb_in_range (h, 0xD800u, 0xDBFFu))) + { + /* High-surrogate in h */ + *unicode = (h << 10) + c - ((0xD800u << 10) - 0x10000u + 0xDC00u); + text--; + return text; + } + } - if (likely (next (text, end, unicode, replacement) == end)) - return text; - + /* Lonely / out-of-order surrogate. */ *unicode = replacement; - return end - 1; + return text; } @@ -211,14 +218,9 @@ hb_codepoint_t *unicode, hb_codepoint_t replacement) { - hb_codepoint_t c = *text++; - if (validate && unlikely (c > 0x10FFFFu || hb_in_range (c, 0xD800u, 0xDFFFu))) - goto error; - *unicode = c; - return text; - - error: - *unicode = replacement; + hb_codepoint_t c = *unicode = *text++; + if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu))) + *unicode = replacement; return text; } @@ -228,8 +230,10 @@ hb_codepoint_t *unicode, hb_codepoint_t replacement) { - next (text - 1, text, unicode, replacement); - return text - 1; + hb_codepoint_t c = *unicode = *--text; + if (validate && unlikely (c >= 0xD800u && (c <= 0xDFFFu || c > 0x10FFFFu))) + *unicode = replacement; + return text; } static inline unsigned int
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb-version.h Tue Aug 09 16:20:02 2016 -0700 @@ -37,25 +37,25 @@ #define HB_VERSION_MAJOR 1 -#define HB_VERSION_MINOR 0 -#define HB_VERSION_MICRO 5 +#define HB_VERSION_MINOR 3 +#define HB_VERSION_MICRO 0 -#define HB_VERSION_STRING "1.0.5" +#define HB_VERSION_STRING "1.3.0" #define HB_VERSION_ATLEAST(major,minor,micro) \ ((major)*10000+(minor)*100+(micro) <= \ HB_VERSION_MAJOR*10000+HB_VERSION_MINOR*100+HB_VERSION_MICRO) -void +HB_EXTERN void hb_version (unsigned int *major, unsigned int *minor, unsigned int *micro); -const char * +HB_EXTERN const char * hb_version_string (void); -hb_bool_t +HB_EXTERN hb_bool_t hb_version_atleast (unsigned int major, unsigned int minor, unsigned int micro);
--- a/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h Tue Aug 09 12:08:51 2016 +0300 +++ b/jdk/src/java.desktop/share/native/libfontmanager/harfbuzz/hb.h Tue Aug 09 16:20:02 2016 -0700 @@ -28,6 +28,10 @@ #define HB_H #define HB_H_IN +#ifndef HB_EXTERN +#define HB_EXTERN extern +#endif + #include "hb-blob.h" #include "hb-buffer.h" #include "hb-common.h"