From 332e2d0310981959b0dadc06f328173d093109c1 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sat, 10 May 2014 12:32:20 +0900 Subject: [PATCH 01/29] initial decoder refactoring. this should make the whole decoder business easy to maintainable. currently this change is available to Korean and Japanese codecs. --- src/encoding/codec/japanese.rs | 373 ++++++++++++--------------------- src/encoding/codec/korean.rs | 138 +++++------- src/encoding/testutils.rs | 29 ++- src/encoding/util.rs | 161 +++++++++++++- 4 files changed, 368 insertions(+), 333 deletions(-) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index 6fbba2c..4b2bcf1 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -4,7 +4,7 @@ //! Legacy Japanese encodings based on JIS X 0208 and JIS X 0212. -use util::{as_char, StrCharIndex}; +use util::StrCharIndex; use index0208 = index::jis0208; use index0212 = index::jis0212; use types::*; @@ -81,170 +81,92 @@ impl Encoder for EUCJPEncoder { } } -/// A decoder for EUC-JP with JIS X 0212 in G3. -#[deriving(Clone)] -pub struct EUCJP0212Decoder { - first: u8, - second: u8, -} - -impl EUCJP0212Decoder { - pub fn new() -> Box { box EUCJP0212Decoder { first: 0, second: 0 } as Box } -} - -impl Decoder for EUCJP0212Decoder { - fn from_self(&self) -> Box { EUCJP0212Decoder::new() } - fn is_ascii_compatible(&self) -> bool { true } - - fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); - - fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { - let lead = lead as uint; - let trail = trail as uint; - let index = match (lead, trail) { - (0xa1..0xfe, 0xa1..0xfe) => (lead - 0xa1) * 94 + trail - 0xa1, - _ => 0xffff, - }; - index0208::forward(index as u16) - } +ascii_compatible_stateful_decoder! { + #[doc="A decoder for EUC-JP with JIS X 0212 in G3."] + #[deriving(Clone)] + struct EUCJP0212Decoder; + + module eucjp; + + internal fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0xa1..0xfe, 0xa1..0xfe) => (lead - 0xa1) * 94 + trail - 0xa1, + _ => 0xffff, + }; + index0208::forward(index as u16) + } - fn map_two_0212_bytes(lead: u8, trail: u8) -> u32 { - let lead = lead as uint; - let trail = trail as uint; - let index = match (lead, trail) { - (0xa1..0xfe, 0xa1..0xfe) => (lead - 0xa1) * 94 + trail - 0xa1, - _ => 0xffff, - }; - index0212::forward(index as u16) - } + internal fn map_two_0212_bytes(lead: u8, trail: u8) -> u32 { + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0xa1..0xfe, 0xa1..0xfe) => (lead - 0xa1) * 94 + trail - 0xa1, + _ => 0xffff, + }; + index0212::forward(index as u16) + } - let mut i = 0; - let mut processed = 0; - let len = input.len(); + // euc-jp lead = 0x00 + initial state S0(ctx) { + case b @ 0x00..0x7f => ctx.emit(b as u32); + case 0x8e => S1(ctx); + case 0x8f => S2(ctx); + case b @ 0xa1..0xfe => S3(ctx, b); + case _ => ctx.err("invalid sequence"); + } - if i >= len { return (processed, None); } + // euc-jp lead = 0x8e + state S1(ctx) { + case b @ 0xa1..0xdf => ctx.emit(0xff61 + b as u32 - 0xa1); + case 0xa1..0xfe => ctx.err("invalid sequence"); + case _ => ctx.backup_and_err(1, "invalid sequence"); + } - if self.first != 0 { - let first = self.first; - match (first, input[i]) { - (0x8e, 0xa1..0xdf) => { - output.write_char(as_char(0xff61 + input[i] as uint - 0xa1)); - } - (0x8f, trail) => { - self.first = 0; - self.second = trail as u8; - // pass through - } - (lead, trail) => { - let ch = map_two_0208_bytes(lead, trail); - if ch == 0xffff { - self.first = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - } - } - i += 1; - if i >= len { - self.first = 0; - return (processed, None); - } - } + // euc-jp lead = 0x8f + // JIS X 0201 half-width katakana + state S2(ctx) { + case b @ 0xa1..0xfe => S4(ctx, b); + case _ => ctx.backup_and_err(1, "invalid sequence"); + } - if self.second != 0 { - let ch = map_two_0212_bytes(self.second, input[i]); + // euc-jp lead != 0x00, euc-jp jis0212 flag = unset + // JIS X 0208 two-byte sequence + state S3(ctx, lead: u8) { + case b @ 0xa1..0xfe => { + let ch = map_two_0208_bytes(lead, b); if ch == 0xffff { - self.second = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); + // do NOT backup, we only backup for out-of-range trails. + ctx.err("invalid sequence") + } else { + ctx.emit(ch as u32) } - output.write_char(as_char(ch)); - i += 1; - } - - self.first = 0; - self.second = 0; - processed = i; - while i < len { - match input[i] { - 0x00..0x7f => { - output.write_char(input[i] as char); - } - 0x8e | 0x8f | 0xa1..0xfe => { - i += 1; - if i >= len { - self.first = input[i-1]; - break; - } - match (input[i-1], input[i]) { - (0x8e, 0xa1..0xdf) => { // JIS X 0201 half-width katakana - output.write_char(as_char(0xff61 + input[i] as uint - 0xa1)); - } - (0x8f, 0xa1..0xfe) => { // JIS X 0212 three-byte sequence - i += 1; - if i >= len { - self.second = input[i]; - break; - } - let ch = map_two_0212_bytes(input[i-1], input[i]); - if ch == 0xffff { - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - } - (0xa1..0xfe, 0xa1..0xfe) => { // JIS X 0208 two-byte sequence - let ch = map_two_0208_bytes(input[i-1], input[i]); - if ch == 0xffff { - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - } - (_, trail) => { - // we should back up when the second byte doesn't look like EUC-JP - // (Encoding standard, Chapter 12.1, decoder step 7-4) - let upto = if trail < 0xa1 || trail > 0xfe {i} else {i+1}; - return (processed, Some(CodecError { - upto: upto, cause: "invalid sequence".into_maybe_owned() - })); - } - } - } - _ => { - return (processed, Some(CodecError { - upto: i+1, cause: "invalid sequence".into_maybe_owned() - })); - } - } - i += 1; - processed = i; - } - (processed, None) + }; + case _ => ctx.backup_and_err(1, "invalid sequence"); } - fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { - let first = self.first; - let second = self.second; - self.first = 0; - self.second = 0; - if second != 0 || first != 0 { - Some(CodecError { upto: 0, cause: "incomplete sequence".into_maybe_owned() }) - } else { - None - } + // euc-jp lead != 0x00, euc-jp jis0212 flag = set + // JIS X 0212 three-byte sequence + state S4(ctx, lead: u8) { + case b @ 0xa1..0xfe => { + let ch = map_two_0212_bytes(lead, b); + if ch == 0xffff { + // do NOT backup, we only backup for out-of-range trails. + ctx.err("invalid sequence") + } else { + ctx.emit(ch as u32) + } + }; + case _ => ctx.backup_and_err(1, "invalid sequence"); } } #[cfg(test)] mod eucjp_tests { + extern crate test; use super::EUCJPEncoding; + use testutils; use types::*; #[test] @@ -296,6 +218,16 @@ mod eucjp_tests { assert_feed_ok!(d, [0xa4, 0xa2], [], "\u3042"); assert_finish_ok!(d, ""); } + + #[bench] + fn bench_decode_short_text(bencher: &mut test::Bencher) { + static Encoding: EUCJPEncoding = EUCJPEncoding; + let s = Encoding.encode(testutils::JAPANESE_TEXT, EncodeStrict).ok().unwrap(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); + }) + } } /** @@ -369,106 +301,57 @@ impl Encoder for Windows31JEncoder { } } -/// A decoder for Shift_JIS with IBM/NEC extensions. -#[deriving(Clone)] -pub struct Windows31JDecoder { - lead: u8 -} - -impl Windows31JDecoder { - pub fn new() -> Box { box Windows31JDecoder { lead: 0 } as Box } -} - -impl Decoder for Windows31JDecoder { - fn from_self(&self) -> Box { Windows31JDecoder::new() } - fn is_ascii_compatible(&self) -> bool { true } - - fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); - - fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { - let lead = lead as uint; - let trail = trail as uint; - let index = match (lead, trail) { - (0x81..0x9f, 0x40..0x7e) | (0x81..0x9f, 0x80..0xfc) | - (0xe0..0xfc, 0x40..0x7e) | (0xe0..0xfc, 0x80..0xfc) => { - let leadoffset = if lead < 0xa0 {0x81} else {0xc1}; - let trailoffset = if trail < 0x7f {0x40} else {0x41}; - (lead - leadoffset) * 188 + trail - trailoffset - } - _ => 0xffff, - }; - index0208::forward(index as u16) - } - - let mut i = 0; - let mut processed = 0; - let len = input.len(); +ascii_compatible_stateful_decoder! { + #[doc="A decoder for Shift_JIS with IBM/NEC extensions."] + #[deriving(Clone)] + struct Windows31JDecoder; + + module windows31j; + + internal fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + let lead = lead as uint; + let trail = trail as uint; + let leadoffset = if lead < 0xa0 {0x81} else {0xc1}; + let trailoffset = if trail < 0x7f {0x40} else {0x41}; + let index = match (lead, trail) { + // XXX the Encoding spec seems to be incorrect in this regard, see Bug 25649. + // INCORRECT: (0xf0..0xf9, _) => + (0xf0..0xf9, 0x40..0x7e) | (0xf0..0xf9, 0x80..0xfc) => + 0xe000 + (lead - leadoffset) * 188 + trail - trailoffset, + (0x81..0x9f, 0x40..0x7e) | (0x81..0x9f, 0x80..0xfc) | + (0xe0..0xfc, 0x40..0x7e) | (0xe0..0xfc, 0x80..0xfc) => + (lead - leadoffset) * 188 + trail - trailoffset, + _ => 0xffff, + }; + index0208::forward(index as u16) + } - if i >= len { return (processed, None); } + // shift_jis lead = 0x00 + initial state S0(ctx) { + case b @ 0x00..0x7f => ctx.emit(b as u32); + case b @ 0xa1..0xdf => ctx.emit(0xff61 + b as u32 - 0xa1); + case b @ 0x81..0x9f | b @ 0xe0..0xfc => S1(ctx, b); + case _ => ctx.err("invalid sequence"); + } - if self.lead != 0 { - let ch = map_two_0208_bytes(self.lead, input[i]); + // shift_jis lead != 0x00 + state S1(ctx, lead: u8) { + case b => { + let ch = map_two_0208_bytes(lead, b); if ch == 0xffff { - self.lead = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); + ctx.backup_and_err(1, "invalid sequence") // unconditional + } else { + ctx.emit(ch as u32) } - output.write_char(as_char(ch)); - i += 1; - } - - self.lead = 0; - processed = i; - while i < len { - match input[i] { - 0x00..0x7f => { - output.write_char(input[i] as char); - } - 0xa1..0xdf => { - output.write_char(as_char(0xff61 + (input[i] as uint) - 0xa1)); - } - 0x81..0x9f | 0xe0..0xfc => { - i += 1; - if i >= len { - self.lead = input[i-1]; - break; - } - let ch = map_two_0208_bytes(input[i-1], input[i]); - if ch == 0xffff { - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - } - _ => { - return (processed, Some(CodecError { - upto: i+1, cause: "invalid sequence".into_maybe_owned() - })); - } - } - i += 1; - processed = i; - } - (processed, None) - } - - fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { - let lead = self.lead; - self.lead = 0; - if lead != 0 { - Some(CodecError { upto: 0, cause: "incomplete sequence".into_maybe_owned() }) - } else { - None - } + }; } } #[cfg(test)] mod windows31j_tests { + extern crate test; use super::Windows31JEncoding; + use testutils; use types::*; #[test] @@ -518,5 +401,15 @@ mod windows31j_tests { assert_feed_ok!(d, [0x82, 0xa0], [], "\u3042"); assert_finish_ok!(d, ""); } + + #[bench] + fn bench_decode_short_text(bencher: &mut test::Bencher) { + static Encoding: Windows31JEncoding = Windows31JEncoding; + let s = Encoding.encode(testutils::JAPANESE_TEXT, EncodeStrict).ok().unwrap(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); + }) + } } diff --git a/src/encoding/codec/korean.rs b/src/encoding/codec/korean.rs index 199234c..77b59e5 100644 --- a/src/encoding/codec/korean.rs +++ b/src/encoding/codec/korean.rs @@ -4,7 +4,7 @@ //! Legacy Korean encodings based on KS X 1001. -use util::{as_char, StrCharIndex}; +use util::StrCharIndex; use index = index::euc_kr; use types::*; @@ -76,103 +76,55 @@ impl Encoder for Windows949Encoder { } } -/// A decoder for Windows code page 949. -#[deriving(Clone)] -pub struct Windows949Decoder { - lead: u8 -} - -impl Windows949Decoder { - pub fn new() -> Box { box Windows949Decoder { lead: 0 } as Box } -} - -impl Decoder for Windows949Decoder { - fn from_self(&self) -> Box { Windows949Decoder::new() } - fn is_ascii_compatible(&self) -> bool { true } - - fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); - - fn map_two_bytes(lead: u8, trail: u8) -> u32 { - let lead = lead as uint; - let trail = trail as uint; - let index = match (lead, trail) { - (0x81..0xc6, 0x41..0x5a) => - (26 + 26 + 126) * (lead - 0x81) + trail - 0x41, - (0x81..0xc6, 0x61..0x7a) => - (26 + 26 + 126) * (lead - 0x81) + 26 + trail - 0x61, - (0x81..0xc6, 0x81..0xfe) => - (26 + 26 + 126) * (lead - 0x81) + 26 + 26 + trail - 0x81, - (0xc7..0xfe, 0xa1..0xfe) => - (26 + 26 + 126) * (0xc7 - 0x81) + (lead - 0xc7) * 94 + trail - 0xa1, - (_, _) => 0xffff, - }; - index::forward(index as u16) - } - - let mut i = 0; - let mut processed = 0; - let len = input.len(); +ascii_compatible_stateful_decoder! { + #[doc="A decoder for Windows code page 949."] + #[deriving(Clone)] + struct Windows949Decoder; + + module windows949; + + internal fn map_two_bytes(lead: u8, trail: u8) -> u32 { + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0x81..0xc6, 0x41..0x5a) => + (26 + 26 + 126) * (lead - 0x81) + trail - 0x41, + (0x81..0xc6, 0x61..0x7a) => + (26 + 26 + 126) * (lead - 0x81) + 26 + trail - 0x61, + (0x81..0xc6, 0x81..0xfe) => + (26 + 26 + 126) * (lead - 0x81) + 26 + 26 + trail - 0x81, + (0xc7..0xfe, 0xa1..0xfe) => + (26 + 26 + 126) * (0xc7 - 0x81) + (lead - 0xc7) * 94 + trail - 0xa1, + (_, _) => 0xffff, + }; + index::forward(index as u16) + } - if i >= len { return (processed, None); } + // euc-kr lead = 0x00 + initial state S0(ctx) { + case b @ 0x00..0x7f => ctx.emit(b as u32); + case b @ 0x81..0xfe => S1(ctx, b); + case _ => ctx.err("invalid sequence"); + } - if self.lead != 0 { - let ch = map_two_bytes(self.lead, input[i]); + // euc-kr lead != 0x00 + state S1(ctx, lead: u8) { + case b => { + let ch = map_two_bytes(lead, b); if ch == 0xffff { - self.lead = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - i += 1; - } - - self.lead = 0; - processed = i; - while i < len { - match input[i] { - 0x00..0x7f => { output.write_char(input[i] as char); } - 0x81..0xfe => { - i += 1; - if i >= len { - self.lead = input[i-1]; - break; - } - let ch = map_two_bytes(input[i-1], input[i]); - if ch == 0xffff { - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - } - _ => { - return (processed, Some(CodecError { - upto: i+1, cause: "invalid sequence".into_maybe_owned() - })); - } + ctx.backup_and_err(1, "invalid sequence") // unconditional + } else { + ctx.emit(ch as u32) } - i += 1; - processed = i; - } - (processed, None) - } - - fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { - let lead = self.lead; - self.lead = 0; - if lead != 0 { - Some(CodecError { upto: 0, cause: "incomplete sequence".into_maybe_owned() }) - } else { - None - } + }; } } #[cfg(test)] mod windows949_tests { + extern crate test; use super::Windows949Encoding; + use testutils; use types::*; #[test] @@ -274,5 +226,15 @@ mod windows949_tests { assert_feed_ok!(d, [0xb0, 0xa1], [], "\uac00"); assert_finish_ok!(d, ""); } + + #[bench] + fn bench_decode_short_text(bencher: &mut test::Bencher) { + static Encoding: Windows949Encoding = Windows949Encoding; + let s = Encoding.encode(testutils::KOREAN_TEXT, EncodeStrict).ok().unwrap(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); + }) + } } diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 84dabba..0bb145f 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -2,7 +2,7 @@ // Copyright (c) 2013, Kang Seonghoon. // See README.md and LICENSE.txt for details. -//! Macros for testing. +//! Macros and utilities for testing. #![macro_escape] @@ -72,3 +72,30 @@ macro_rules! assert_finish_err( }) ) +/// Some Korean text to test. +// +// the first paragraphs of the article "Korean Language" from Korean Wikipedia. +// https://ko.wikipedia.org/w/index.php?title=%ED%95%9C%EA%B5%AD%EC%96%B4&oldid=12331875 +pub static KOREAN_TEXT: &'static str = + "한국어(韓國語)는 주로 한반도(韓半島)와 한민족(韓民族) 거주 지역에서 쓰이는 언어로, \ + 대한민국에서는 한국어, 한국말이라고 부르고, 조선민주주의인민공화국과 중국, 일본에서는 \ + 조선어(朝鮮語), 조선말이라고 불린다. 우즈베키스탄, 러시아 등 구 소련의 고려인들 사이에서는 \ + 고려말(高麗語)로 불린다. 19세기 중반 이후 한반도와 주변 정세의 혼란, 20세기 전반 \ + 일본 제국주의의 침략, 20세기 후반 대한민국의 해외 이민에 의해 중국 동북 지방, 일본, \ + 러시아 연해주와 사할린, 우즈베키스탄, 미국, 캐나다, 오스트레일리아, 필리핀, 베트남, 브라질 등 \ + 세계 곳곳에 한민족이 이주하면서 한국어가 쓰이고 있다. 한국어 쓰는 인구는 전 세계를 통틀어 \ + 약 8천250만 명으로 추산된다."; + +/// Some Japanese text to test. +// +// the first paragraphs of the article "Japanese Language" from Japanese Wikipedia. +// https://ja.wikipedia.org/w/index.php?title=%E6%97%A5%E6%9C%AC%E8%AA%9E&oldid=51443986 +pub static JAPANESE_TEXT: &'static str = + "日本語(にほんご、にっぽんご)とは、主に日本国内や日本人同士の間で使われている言語である。\ + 日本は法令によって「公用語」を規定していないが、法令その他の公用文は日本語で記述され、\ + 各種法令(裁判所法第74条、会社計算規則第57条、特許法施行規則第2条など)において\ + 日本語を用いることが定められるなど事実上の公用語となっており、学校教育の「国語」でも\ + 教えられる。使用人口について正確な統計はないが、日本国内の人口、および日本国外に住む\ + 日本人や日系人、日本がかつて統治した地域の一部の住民など、約1億3千万人以上と考えられる。\ + 統計によって前後する可能性はあるが、この数は世界の母語話者数で上位10位以内に入る人数である。"; + diff --git a/src/encoding/util.rs b/src/encoding/util.rs index b326a46..57992e5 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -4,12 +4,15 @@ //! Internal utilities. -use std::str::CharRange; -use std::cast::transmute; +#![macro_escape] + +use std::{str, cast}; +use std::default::Default; +use types; /// Unchecked conversion to `char`. pub fn as_char(ch: T) -> char { - unsafe { transmute(ch.to_u32().unwrap()) } + unsafe { cast::transmute(ch.to_u32().unwrap()) } } /// External iterator for a string's characters with its corresponding byte offset range. @@ -22,7 +25,7 @@ impl<'r> Iterator<((uint,uint), char)> for StrCharIndexIterator<'r> { #[inline] fn next(&mut self) -> Option<((uint,uint), char)> { if self.index < self.string.len() { - let CharRange {ch, next} = self.string.char_range_at(self.index); + let str::CharRange {ch, next} = self.string.char_range_at(self.index); let prev = self.index; self.index = next; Some(((prev, next), ch)) @@ -43,3 +46,153 @@ impl<'r> StrCharIndex<'r> for &'r str { StrCharIndexIterator { index: 0, string: *self } } } + +/// A helper struct for the stateful decoder DSL. +pub struct StatefulDecoderHelper<'a, State> { + /// The current buffer. + pub buf: &'a [u8], + /// The current index to the buffer. + pub pos: uint, + /// The output buffer. + pub output: &'a mut types::StringWriter, +} + +impl<'a, State: Default> StatefulDecoderHelper<'a, State> { + /// Reads one byte from the buffer if any. + #[inline(always)] + pub fn read(&mut self) -> Option { + match self.buf.get(self.pos) { + Some(&c) => { self.pos += 1; Some(c) } + None => None + } + } + + /// Writes one Unicode scalar value to the output and resets back to the initial state. + /// There is intentionally no check for `c`, so the caller should ensure that it's valid. + #[inline(always)] + pub fn emit(&mut self, c: u32) -> Result { + self.output.write_char(unsafe {cast::transmute(c)}); + Ok(Default::default()) + } + + /// Issues a codec error with given message at the current position. + #[inline(always)] + pub fn err(&self, msg: &'static str) -> Result { + Err(types::CodecError { upto: self.pos, cause: msg.into_maybe_owned() }) + } + + /// Issues a codec error with given message at the current position minus `backup` bytes. + /// This should be used to implement "prepending byte to the stream" in the Encoding spec, + /// which corresponds to `ctx.backup_and_err(1, ...)`. + #[inline(always)] + pub fn backup_and_err(&self, backup: uint, + msg: &'static str) -> Result { + // XXX we should eventually handle a negative `upto` + let upto = if self.pos < backup {0} else {self.pos - backup}; + Err(types::CodecError { upto: upto, cause: msg.into_maybe_owned() }) + } +} + +/// Defines an ASCII-compatible stateful decoder from given state machine. +macro_rules! ascii_compatible_stateful_decoder( + ( + $(#[$decmeta:meta])* + struct $dec:ident; + module $stmod:ident; // should be unique from other existing identifiers + $(internal $item:item)* // will only be visible from state functions + initial state $inist:ident($inictx:ident) { + $(case $($inilhs:pat)|+ => $inirhs:expr;)+ + } + $(state $st:ident($ctx:ident $(, $arg:ident: $ty:ty)*) { + $(case $($lhs:pat)|+ => $rhs:expr;)+ + })* + ) => ( + $(#[$decmeta])* + pub struct $dec { + st: $stmod::State + } + + mod $stmod { + #[deriving(Eq,Clone)] + pub enum State { + $inist, + $( + $st(() $(, $ty)*), + )* + } + + impl ::std::default::Default for State { + fn default() -> State { $inist } + } + } + + impl $dec { + pub fn new() -> Box { box $dec { st: $stmod::$inist } as Box } + } + + impl Decoder for $dec { + fn from_self(&self) -> Box { $dec::new() } + fn is_ascii_compatible(&self) -> bool { true } + + fn raw_feed(&mut self, input: &[u8], + output: &mut StringWriter) -> (uint, Option) { + output.writer_hint(input.len()); + + type Context<'a> = ::util::StatefulDecoderHelper<'a, $stmod::State>; + + $($item)* + + #[inline(always)] + fn $inist($inictx: &mut Context) -> Result<$stmod::State,CodecError> { + match $inictx.read() { + None => Ok($stmod::$inist), + Some(c) => match c { $($($inilhs)|+ => $inirhs,)+ }, + } + } + + $( + #[inline(always)] + fn $st($ctx: &mut Context $(, $arg: $ty)*) -> Result<$stmod::State,CodecError> { + match $inictx.read() { + None => Ok($stmod::$st(() $(, $arg)*)), + Some(c) => match c { $($($lhs)|+ => $rhs,)+ }, + } + } + )* + + let mut ctx = ::util::StatefulDecoderHelper { buf: input, pos: 0, output: output }; + let mut processed = 0; + + let st_or_err = match ::std::mem::replace(&mut self.st, $stmod::$inist) { + $stmod::$inist => Ok($stmod::$inist), + $( + $stmod::$st(() $(, $arg)*) => $st(&mut ctx $(, $arg)*), + )* + }; + match st_or_err { + Ok($stmod::$inist) => { processed = ctx.pos; } + Ok(st) => { self.st = st; return (processed, None); } + Err(err) => { self.st = $stmod::$inist; return (processed, Some(err)); } + } + + while ctx.pos < ctx.buf.len() { + match $inist(&mut ctx) { + Ok($stmod::$inist) => { processed = ctx.pos; } + Ok(st) => { self.st = st; return (processed, None); } + Err(err) => { self.st = $stmod::$inist; return (processed, Some(err)); } + } + } + (processed, None) + } + + fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { + match ::std::mem::replace(&mut self.st, $stmod::$inist) { + $stmod::$inist => None, + _ => Some(CodecError { upto: 0, + cause: "incomplete sequence".into_maybe_owned() }), + } + } + } + ) +) + From 78d9207f0d9a07c0c8b5c5f838322a4d654ff464 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sat, 10 May 2014 20:17:20 +0900 Subject: [PATCH 02/29] fixed a stupid bug on Shift_JIS EUDC decoder. --- src/encoding/codec/japanese.rs | 24 ++++++++++++++++++++++-- 1 file changed, 22 insertions(+), 2 deletions(-) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index 4b2bcf1..8cf3a5d 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -317,7 +317,7 @@ ascii_compatible_stateful_decoder! { // XXX the Encoding spec seems to be incorrect in this regard, see Bug 25649. // INCORRECT: (0xf0..0xf9, _) => (0xf0..0xf9, 0x40..0x7e) | (0xf0..0xf9, 0x80..0xfc) => - 0xe000 + (lead - leadoffset) * 188 + trail - trailoffset, + return (0xe000 + (lead - 0xf0) * 188 + trail - trailoffset) as u32, (0x81..0x9f, 0x40..0x7e) | (0x81..0x9f, 0x80..0xfc) | (0xe0..0xfc, 0x40..0x7e) | (0xe0..0xfc, 0x80..0xfc) => (lead - leadoffset) * 188 + trail - trailoffset, @@ -341,7 +341,7 @@ ascii_compatible_stateful_decoder! { if ch == 0xffff { ctx.backup_and_err(1, "invalid sequence") // unconditional } else { - ctx.emit(ch as u32) + ctx.emit(ch) } }; } @@ -368,6 +368,15 @@ mod windows31j_tests { assert_finish_ok!(e, []); } + #[test] + fn test_encoder_no_eudc() { + let mut e = Windows31JEncoding.encoder(); + assert_feed_err!(e, "", "\ue000", "", []); + assert_feed_err!(e, "", "\ue757", "", []); + assert_feed_err!(e, "", "\ue758", "", []); + assert_finish_ok!(e, []); + } + #[test] fn test_encoder_invalid() { let mut e = Windows31JEncoding.encoder(); @@ -391,6 +400,17 @@ mod windows31j_tests { assert_finish_ok!(d, ""); } + #[test] + fn test_decoder_eudc() { + let mut d = Windows31JEncoding.decoder(); + assert_feed_ok!(d, [], [0xf0], ""); + assert_feed_ok!(d, [0x40], [], "\ue000"); + assert_feed_ok!(d, [0xf9, 0xfc], [], "\ue757"); + assert_feed_err!(d, [], [0xf0], [0x00], ""); + assert_feed_err!(d, [], [0xf0], [0xff], ""); + assert_finish_ok!(d, ""); + } + // TODO more tests #[test] From 67c072af3925779bb11e3d29ba9d194559be3920 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sun, 11 May 2014 01:49:17 +0900 Subject: [PATCH 03/29] additional refactoring work for Chinese encodings. this also keeps up with the recent WHATWG spec changes, including a merge of GBK18030 with GB18030. --- src/encoding/all.rs | 1 - src/encoding/codec/simpchinese.rs | 465 +-- src/encoding/codec/tradchinese.rs | 143 +- src/encoding/index/gb18030.rs | 5038 +++++++++++++++++++++++++- src/encoding/index/gb18030_ranges.rs | 105 + src/encoding/index/gbk.rs | 4777 ------------------------ src/encoding/index/gen_index.py | 6 +- src/encoding/label.rs | 6 +- src/encoding/lib.rs | 2 +- src/encoding/testutils.rs | 32 + src/encoding/util.rs | 7 + 11 files changed, 5239 insertions(+), 5343 deletions(-) create mode 100644 src/encoding/index/gb18030_ranges.rs delete mode 100644 src/encoding/index/gbk.rs diff --git a/src/encoding/all.rs b/src/encoding/all.rs index 5f77298..adbee69 100644 --- a/src/encoding/all.rs +++ b/src/encoding/all.rs @@ -67,7 +67,6 @@ unique!(var=UTF_16BE, mod=codec::utf_16, val=UTF16BEEncoding) unique!(var=WINDOWS_949, mod=codec::korean, val=Windows949Encoding) unique!(var=EUC_JP, mod=codec::japanese, val=EUCJPEncoding) unique!(var=WINDOWS_31J, mod=codec::japanese, val=Windows31JEncoding) -unique!(var=GBK18030, mod=codec::simpchinese, val=GBK18030Encoding) unique!(var=GB18030, mod=codec::simpchinese, val=GB18030Encoding) unique!(var=BIG5_2003, mod=codec::tradchinese, val=BigFive2003Encoding) diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index aaa5ad4..279c76f 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -4,17 +4,22 @@ //! Legacy simplified Chinese encodings based on GB 2312 and GB 18030. -use util::{as_char, StrCharIndex}; -use index2312 = index::gbk; -use index18030 = index::gb18030; +use index = index::gb18030; +use ranges_index = index::gb18030_ranges; use types::*; /** - * An one- and two-byte subset of GB 18030 that supersedes and updates GBK 1.0 encoding. + * GB 18030-2005. + * + * This is a simplified Chinese encoding which extends GBK 1.0 to a pan-Unicode encoding. + * It assigns four-byte sequences to every Unicode codepoint missing from the GBK area, + * lexicographically ordered with occasional "gaps" for codepoints in the GBK area. + * Due to this compatibility decision, + * there is no simple relationship between these four-byte sequences and Unicode codepoints, + * though there *exists* a relatively simple mapping algorithm with a small lookup table. * - * This is a simplified Chinese encoding derived from GB 2312 character set - * and greatly expanded to span the almost entire region of `[81-FE] [40-7E 80-FE]`. - * There are several different revisions of a family of encodings named "GBK": + * The original GBK 1.0 region spans `[81-FE] [40-7E 80-FE]`, and is derived from + * several different revisions of a family of encodings named "GBK": * * - GBK as specified in the normative annex of GB 13000.1-93, * the domestic standard equivalent to Unicode 1.1, @@ -25,214 +30,6 @@ use types::*; * was standardized into GBK 1.0. * - Finally, GB 18030 added four-byte sequences to GBK for becoming a pan-Unicode encoding, * while adding new characters to the (former) GBK region again. - * - * Fortunately for us, these revisions maintain the strict superset and subset relation, - * so this encoding is a catch-all implementation for all those related encodings. - */ -#[deriving(Clone)] -pub struct GBK18030Encoding; - -impl Encoding for GBK18030Encoding { - fn name(&self) -> &'static str { "gbk18030" } - fn whatwg_name(&self) -> Option<&'static str> { Some("gbk") } // WHATWG compatibility - fn encoder(&self) -> Box { GBK18030Encoder::new() } - fn decoder(&self) -> Box { GBK18030Decoder::new() } -} - -/// An encoder for an one- and two-byte subset of GB 18030. -#[deriving(Clone)] -pub struct GBK18030Encoder; - -impl GBK18030Encoder { - pub fn new() -> Box { box GBK18030Encoder as Box } -} - -impl Encoder for GBK18030Encoder { - fn from_self(&self) -> Box { GBK18030Encoder::new() } - fn is_ascii_compatible(&self) -> bool { true } - - fn raw_feed(&mut self, input: &str, output: &mut ByteWriter) -> (uint, Option) { - output.writer_hint(input.len()); - - for ((i,j), ch) in input.index_iter() { - if ch < '\u0080' { - output.write_byte(ch as u8); - } else { - let ptr = index2312::backward(ch as u32); - if ptr == 0xffff { - return (i, Some(CodecError { - upto: j, cause: "unrepresentable character".into_maybe_owned() - })); - } - let lead = ptr / 190 + 0x81; - let trail = ptr % 190; - let trailoffset = if trail < 0x3f {0x40} else {0x41}; - output.write_byte(lead as u8); - output.write_byte((trail + trailoffset) as u8); - } - } - (input.len(), None) - } - - fn raw_finish(&mut self, _output: &mut ByteWriter) -> Option { - None - } -} - -/// A decoder for an one- and two-byte subset of GB 18030. -#[deriving(Clone)] -pub struct GBK18030Decoder { - first: u8 -} - -impl GBK18030Decoder { - pub fn new() -> Box { box GBK18030Decoder { first: 0 } as Box } -} - -impl Decoder for GBK18030Decoder { - fn from_self(&self) -> Box { GBK18030Decoder::new() } - fn is_ascii_compatible(&self) -> bool { true } - - fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); - - fn map_two_2312_bytes(lead: u8, trail: u8) -> u32 { - let lead = lead as uint; - let trail = trail as uint; - let index = match (lead, trail) { - (0x81..0xfe, 0x40..0x7e) | (0x81..0xfe, 0x80..0xfe) => { - let trailoffset = if trail < 0x7f {0x40} else {0x41}; - (lead - 0x81) * 190 + trail - trailoffset - } - _ => 0xffff, - }; - index2312::forward(index as u16) - } - - let mut i = 0; - let mut processed = 0; - let len = input.len(); - - if i >= len { return (processed, None); } - - if self.first != 0 { - let ch = map_two_2312_bytes(self.first, input[i]); - if ch == 0xffff { - self.first = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - i += 1; - } - - self.first = 0; - processed = i; - while i < len { - match input[i] { - 0x00..0x7f => { output.write_char(input[i] as char); } - 0x80 => { output.write_char('\u20ac'); } - 0x81..0xfe => { - i += 1; - if i >= len { - self.first = input[i-1]; - break; - } - let ch = map_two_2312_bytes(input[i-1], input[i]); - if ch == 0xffff { - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - } - _ => { - return (processed, Some(CodecError { - upto: i+1, cause: "invalid sequence".into_maybe_owned() - })); - } - } - i += 1; - processed = i; - } - (processed, None) - } - - fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { - let first = self.first; - self.first = 0; - if first != 0 { - Some(CodecError { upto: 0, cause: "incomplete sequence".into_maybe_owned() }) - } else { - None - } - } -} - -#[cfg(test)] -mod gbk18030_tests { - use super::GBK18030Encoding; - use types::*; - - #[test] - fn test_encoder_valid() { - let mut e = GBK18030Encoding.encoder(); - assert_feed_ok!(e, "A", "", [0x41]); - assert_feed_ok!(e, "BC", "", [0x42, 0x43]); - assert_feed_ok!(e, "", "", []); - assert_feed_ok!(e, "\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd", "", - [0xd6, 0xd0, 0xbb, 0xaa, 0xc8, 0xcb, 0xc3, 0xf1, - 0xb9, 0xb2, 0xba, 0xcd, 0xb9, 0xfa]); - assert_feed_ok!(e, "1\u20ac/m", "", [0x31, 0xa2, 0xe3, 0x2f, 0x6d]); - assert_feed_ok!(e, "\uff21\uff22\uff23", "", [0xa3, 0xc1, 0xa3, 0xc2, 0xa3, 0xc3]); - assert_finish_ok!(e, []); - } - - #[test] - fn test_encoder_invalid() { - let mut e = GBK18030Encoding.encoder(); - assert_feed_err!(e, "", "\uffff", "", []); - assert_feed_err!(e, "?", "\uffff", "!", [0x3f]); - assert_feed_err!(e, "", "\U0002a6a5", "\u3007", []); - assert_finish_ok!(e, []); - } - - #[test] - fn test_decoder_valid() { - let mut d = GBK18030Encoding.decoder(); - assert_feed_ok!(d, [0x41], [], "A"); - assert_feed_ok!(d, [0x42, 0x43], [], "BC"); - assert_feed_ok!(d, [], [], ""); - assert_feed_ok!(d, [0xd6, 0xd0, 0xbb, 0xaa, 0xc8, 0xcb, 0xc3, 0xf1, - 0xb9, 0xb2, 0xba, 0xcd, 0xb9, 0xfa], [], - "\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd"); - assert_feed_ok!(d, [0x31, 0x80, 0x2f, 0x6d], [], "1\u20ac/m"); - assert_feed_ok!(d, [0xa3, 0xc1, 0xa3, 0xc2, 0xa3, 0xc3], [], "\uff21\uff22\uff23"); - assert_finish_ok!(d, ""); - } - - // TODO more tests - - #[test] - fn test_decoder_feed_after_finish() { - let mut d = GBK18030Encoding.decoder(); - assert_feed_ok!(d, [0xd2, 0xbb], [0xd2], "\u4e00"); - assert_finish_err!(d, ""); - assert_feed_ok!(d, [0xd2, 0xbb], [], "\u4e00"); - assert_finish_ok!(d, ""); - } -} - -/** - * GB 18030-2005. - * - * This is a simplified Chinese encoding which extends GBK 1.0 to a pan-Unicode encoding. - * It assigns four-byte sequences to every Unicode codepoint missing from the GBK area, - * lexicographically ordered with occasional "gaps" for codepoints in the GBK area. - * Due to this compatibility decision, - * there is no simple relationship between these four-byte sequences and Unicode codepoints, - * though there *exists* a relatively simple mapping algorithm with a small lookup table. */ #[deriving(Clone)] pub struct GB18030Encoding; @@ -263,9 +60,9 @@ impl Encoder for GB18030Encoder { if ch < '\u0080' { output.write_byte(ch as u8); } else { - let ptr = index2312::backward(ch as u32); + let ptr = index::backward(ch as u32); if ptr == 0xffff { - let ptr = index18030::backward(ch as u32); + let ptr = ranges_index::backward(ch as u32); assert!(ptr != 0xffffffff); let (ptr, byte4) = (ptr / 10, ptr % 10); let (ptr, byte3) = (ptr / 126, ptr % 126); @@ -291,189 +88,79 @@ impl Encoder for GB18030Encoder { } } -/// A decoder for GB 18030. -#[deriving(Clone)] -pub struct GB18030Decoder { - first: u8, - second: u8, - third: u8, -} - -impl GB18030Decoder { - pub fn new() -> Box { - box GB18030Decoder { first: 0, second: 0, third: 0 } as Box - } -} - -impl Decoder for GB18030Decoder { - fn from_self(&self) -> Box { GB18030Decoder::new() } - fn is_ascii_compatible(&self) -> bool { true } - - fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); +ascii_compatible_stateful_decoder! { + #[doc="A decoder for GB 18030."] + #[deriving(Clone)] + struct GB18030Decoder; - fn map_two_2312_bytes(lead: u8, trail: u8) -> u32 { - let lead = lead as uint; - let trail = trail as uint; - let index = match (lead, trail) { - (0x81..0xfe, 0x40..0x7e) | (0x81..0xfe, 0x80..0xfe) => { - let trailoffset = if trail < 0x7f {0x40} else {0x41}; - (lead - 0x81) * 190 + trail - trailoffset - } - _ => 0xffff, - }; - index2312::forward(index as u16) - } + module gb18030; - fn map_four_18030_bytes(b1: u8, b2: u8, b3: u8, b4: u8) -> u32 { - // no range check here, caller should have done all checks - let index = (b1 as uint - 0x81) * 12600 + (b2 as uint - 0x30) * 1260 + - (b3 as uint - 0x81) * 10 + (b4 as uint - 0x30); - index18030::forward(index as u32) - } + internal fn map_two_bytes(lead: u8, trail: u8) -> u32 { + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0x81..0xfe, 0x40..0x7e) | (0x81..0xfe, 0x80..0xfe) => { + let trailoffset = if trail < 0x7f {0x40} else {0x41}; + (lead - 0x81) * 190 + trail - trailoffset + } + _ => 0xffff, + }; + index::forward(index as u16) + } - let mut i = 0; - let mut processed = 0; - let len = input.len(); + internal fn map_four_bytes(b1: u8, b2: u8, b3: u8, b4: u8) -> u32 { + // no range check here, caller should have done all checks + let index = (b1 as uint - 0x81) * 12600 + (b2 as uint - 0x30) * 1260 + + (b3 as uint - 0x81) * 10 + (b4 as uint - 0x30); + ranges_index::forward(index as u32) + } - if i >= len { return (processed, None); } + // gb18030 first = 0x00, gb18030 second = 0x00, gb18030 third = 0x00 + initial state S0(ctx) { + case b @ 0x00..0x7f => ctx.emit(b as u32); + case 0x80 => ctx.emit(0x20ac); + case b @ 0x81..0xfe => S1(ctx, b); + case _ => ctx.err("invalid sequence"); + } - if self.first != 0 && self.second == 0 { - match input[i] { - 0x30..0x39 => { - self.second = input[i]; - // pass through - } - _ => { - let ch = map_two_2312_bytes(self.first, input[i]); - if ch == 0xffff { - self.first = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - } + // gb18030 first != 0x00, gb18030 second = 0x00, gb18030 third = 0x00 + state S1(ctx, first: u8) { + case b @ 0x30..0x39 => S2(ctx, first, b); + case b => { + let ch = map_two_bytes(first, b); + if ch == 0xffff { + ctx.backup_and_err(1, "invalid sequence") // unconditional + } else { + ctx.emit(ch) } - i += 1; - if i >= len { return (processed, None); } - } + }; + } - if self.second != 0 && self.third == 0 { - match input[i] { - 0x81..0xfe => { - self.third = input[i]; - // pass through - } - _ => { - self.first = 0; - self.second = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - } - i += 1; - if i >= len { return (processed, None); } - } + // gb18030 first != 0x00, gb18030 second != 0x00, gb18030 third = 0x00 + state S2(ctx, first: u8, second: u8) { + case b @ 0x81..0xfe => S3(ctx, first, second, b); + case _ => ctx.backup_and_err(2, "invalid sequence"); + } - if self.third != 0 { - let ch = match input[i] { - 0x30..0x39 => map_four_18030_bytes(self.first, self.second, self.third, input[i]), - _ => 0xffffffff - }; + // gb18030 first != 0x00, gb18030 second != 0x00, gb18030 third != 0x00 + state S3(ctx, first: u8, second: u8, third: u8) { + case b @ 0x30..0x39 => { + let ch = map_four_bytes(first, second, third, b); if ch == 0xffffffff { - self.first = 0; - self.second = 0; - self.third = 0; - return (processed, Some(CodecError { - // XXX upto should point to the negative offset??? - upto: if i<2 {0} else {i-2}, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - i += 1; - } - - self.first = 0; - self.second = 0; - self.third = 0; - processed = i; - while i < len { - match input[i] { - 0x00..0x7f => { output.write_char(input[i] as char); } - 0x80 => { output.write_char('\u20ac'); } - 0x81..0xfe => { - i += 1; - if i >= len { - self.first = input[i-1]; - break; - } - - let ch; - match input[i] { - 0x30..0x39 => { // GB 18030 four-byte sequence - // two byte lookahead, since we don't have three-byte sequence - i += 2; - if i >= len { - self.first = input[i-3]; - self.second = input[i-2]; - if i-1 < len { self.third = input[i-1]; } - break; - } - ch = match (input[i-1], input[i]) { - (0x81..0xfe, 0x30..0x39) => - map_four_18030_bytes(input[i-3], input[i-2], - input[i-1], input[i]) as uint, - (_, _) => 0xffffffff - }; - if ch == 0xffffffff { - return (processed, Some(CodecError { - upto: i-2, cause: "invalid sequence".into_maybe_owned() - })); - } - } - _ => { // GBK-compatible four-byte sequence - ch = map_two_2312_bytes(input[i-1], input[i]) as uint; - if ch == 0xffff { - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - } - } - output.write_char(as_char(ch)); - } - _ => { - return (processed, Some(CodecError { - upto: i+1, cause: "invalid sequence".into_maybe_owned() - })); - } + ctx.backup_and_err(3, "invalid sequence") // unconditional + } else { + ctx.emit(ch) } - i += 1; - processed = i; - } - (processed, None) - } - - fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { - let first = self.first; - let second = self.second; - let third = self.third; - self.first = 0; - self.second = 0; - self.third = 0; - if first != 0 || second != 0 || third != 0 { - Some(CodecError { upto: 0, cause: "incomplete sequence".into_maybe_owned() }) - } else { - None - } + }; + case _ => ctx.backup_and_err(3, "invalid sequence"); } } #[cfg(test)] mod gb18030_tests { + extern crate test; use super::GB18030Encoding; + use testutils; use types::*; #[test] @@ -555,5 +242,15 @@ mod gb18030_tests { assert_feed_ok!(d, [0x98, 0x35, 0xee, 0x37], [], "\U0002a6a5"); assert_finish_ok!(d, ""); } + + #[bench] + fn bench_decode_short_text(bencher: &mut test::Bencher) { + static Encoding: GB18030Encoding = GB18030Encoding; + let s = Encoding.encode(testutils::SIMPLIFIED_CHINESE_TEXT, EncodeStrict).ok().unwrap(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); + }) + } } diff --git a/src/encoding/codec/tradchinese.rs b/src/encoding/codec/tradchinese.rs index 68d4759..ad82d7d 100644 --- a/src/encoding/codec/tradchinese.rs +++ b/src/encoding/codec/tradchinese.rs @@ -4,7 +4,7 @@ //! Legacy traditional Chinese encodings. -use util::{as_char, StrCharIndex}; +use util::StrCharIndex; use index = index::big5; use types::*; @@ -73,111 +73,56 @@ impl Encoder for BigFive2003Encoder { } } -/// A decoder for Big5-2003 with HKSCS-2008 extension. -#[deriving(Clone)] -pub struct BigFive2003HKSCS2008Decoder { - lead: u8 -} - -impl BigFive2003HKSCS2008Decoder { - pub fn new() -> Box { box BigFive2003HKSCS2008Decoder { lead: 0 } as Box } -} - -impl Decoder for BigFive2003HKSCS2008Decoder { - fn from_self(&self) -> Box { BigFive2003HKSCS2008Decoder::new() } - fn is_ascii_compatible(&self) -> bool { true } - - fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); - - fn map_two_bytes(lead: u8, trail: u8) -> u32 { - let lead = lead as uint; - let trail = trail as uint; - let index = match (lead, trail) { - (0x81..0xfe, 0x40..0x7e) | (0x81..0xfe, 0xa1..0xfe) => { - let trailoffset = if trail < 0x7f {0x40} else {0x62}; - (lead - 0x81) * 157 + trail - trailoffset - } - _ => 0xffff, - }; - index::forward(index as u16) // may return two-letter replacements 0..3 - } +ascii_compatible_stateful_decoder! { + #[doc="A decoder for Big5-2003 with HKSCS-2008 extension."] + #[deriving(Clone)] + struct BigFive2003HKSCS2008Decoder; - let mut i = 0; - let mut processed = 0; - let len = input.len(); + module bigfive2003; - if i >= len { return (processed, None); } - - if self.lead != 0 { - match map_two_bytes(self.lead, input[i]) { - 0xffff => { - self.lead = 0; - let upto = if input[i] < 0x80 {i} else {i+1}; - return (processed, Some(CodecError { - upto: upto, cause: "invalid sequence".into_maybe_owned() - })); - } - 0 /*index=1133*/ => { output.write_str("\u00ca\u0304"); } - 1 /*index=1135*/ => { output.write_str("\u00ca\u030c"); } - 2 /*index=1164*/ => { output.write_str("\u00ea\u0304"); } - 3 /*index=1166*/ => { output.write_str("\u00ea\u030c"); } - ch => { output.write_char(as_char(ch)); } + internal fn map_two_bytes(lead: u8, trail: u8) -> u32 { + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0x81..0xfe, 0x40..0x7e) | (0x81..0xfe, 0xa1..0xfe) => { + let trailoffset = if trail < 0x7f {0x40} else {0x62}; + (lead - 0x81) * 157 + trail - trailoffset } - i += 1; - } + _ => 0xffff, + }; + index::forward(index as u16) // may return two-letter replacements 0..3 + } - self.lead = 0; - processed = i; - while i < len { - match input[i] { - 0x00..0x7f => { output.write_char(input[i] as char); } - 0x81..0xfe => { - i += 1; - if i >= len { - self.lead = input[i-1]; - break; - } - match map_two_bytes(input[i-1], input[i]) { - 0xffff => { - let upto = if input[i] < 0x80 {i} else {i+1}; - return (processed, Some(CodecError { - upto: upto, cause: "invalid sequence".into_maybe_owned() - })); - } - 0 /*index=1133*/ => { output.write_str("\u00ca\u0304"); } - 1 /*index=1135*/ => { output.write_str("\u00ca\u030c"); } - 2 /*index=1164*/ => { output.write_str("\u00ea\u0304"); } - 3 /*index=1166*/ => { output.write_str("\u00ea\u030c"); } - ch => { output.write_char(as_char(ch)); } - } - } - _ => { - return (processed, Some(CodecError { - upto: i+1, cause: "invalid sequence".into_maybe_owned() - })); - } - } - i += 1; - processed = i; - } - (processed, None) + // big5 lead = 0x00 + initial state S0(ctx) { + case b @ 0x00..0x7f => ctx.emit(b as u32); + case b @ 0x81..0xfe => S1(ctx, b); + case _ => ctx.err("invalid sequence"); } - fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { - let lead = self.lead; - self.lead = 0; - if lead != 0 { - Some(CodecError { upto: 0, cause: "incomplete sequence".into_maybe_owned() }) - } else { - None - } + // big5 lead != 0x00 + state S1(ctx, lead: u8) { + case b => { + match map_two_bytes(lead, b) { + 0xffff => { + let backup = if b < 0x80 {1} else {0}; + ctx.backup_and_err(backup, "invalid sequence") + }, + 0 /*index=1133*/ => ctx.emit_str("\u00ca\u0304"), + 1 /*index=1135*/ => ctx.emit_str("\u00ca\u030c"), + 2 /*index=1164*/ => ctx.emit_str("\u00ea\u0304"), + 3 /*index=1166*/ => ctx.emit_str("\u00ea\u030c"), + ch => ctx.emit(ch), + } + }; } } #[cfg(test)] mod bigfive2003_tests { + extern crate test; use super::BigFive2003Encoding; + use testutils; use types::*; #[test] @@ -236,5 +181,15 @@ mod bigfive2003_tests { assert_feed_ok!(d, [0xa4, 0x40], [], "\u4e00"); assert_finish_ok!(d, ""); } + + #[bench] + fn bench_decode_short_text(bencher: &mut test::Bencher) { + static Encoding: BigFive2003Encoding = BigFive2003Encoding; + let s = Encoding.encode(testutils::TRADITIONAL_CHINESE_TEXT, EncodeStrict).ok().unwrap(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); + }) + } } diff --git a/src/encoding/index/gb18030.rs b/src/encoding/index/gb18030.rs index 6478512..5fbfdda 100644 --- a/src/encoding/index/gb18030.rs +++ b/src/encoding/index/gb18030.rs @@ -6,100 +6,4980 @@ // For details on index-gb18030.txt see the Encoding Standard // http://encoding.spec.whatwg.org/ -static FORWARD_TABLE: &'static [u32] = &[ - 0, 128, 165, 169, 178, 184, 216, 226, 235, 238, 244, 248, 251, 253, 258, - 276, 284, 300, 325, 329, 334, 364, 463, 465, 467, 469, 471, 473, 475, 477, - 506, 594, 610, 712, 716, 730, 930, 938, 962, 970, 1026, 1104, 1106, 8209, - 8215, 8218, 8222, 8231, 8241, 8244, 8246, 8252, 8365, 8452, 8454, 8458, - 8471, 8482, 8556, 8570, 8596, 8602, 8713, 8720, 8722, 8726, 8731, 8737, - 8740, 8742, 8748, 8751, 8760, 8766, 8777, 8781, 8787, 8802, 8808, 8816, - 8854, 8858, 8870, 8896, 8979, 9322, 9372, 9548, 9588, 9616, 9622, 9634, - 9652, 9662, 9672, 9676, 9680, 9702, 9735, 9738, 9793, 9795, 11906, 11909, - 11913, 11917, 11928, 11944, 11947, 11951, 11956, 11960, 11964, 11979, - 12284, 12292, 12312, 12319, 12330, 12351, 12436, 12447, 12535, 12543, - 12586, 12842, 12850, 12964, 13200, 13215, 13218, 13253, 13263, 13267, - 13270, 13384, 13428, 13727, 13839, 13851, 14617, 14703, 14801, 14816, - 14964, 15183, 15471, 15585, 16471, 16736, 17208, 17325, 17330, 17374, - 17623, 17997, 18018, 18212, 18218, 18301, 18318, 18760, 18811, 18814, - 18820, 18823, 18844, 18848, 18872, 19576, 19620, 19738, 19887, 40870, - 59244, 59336, 59367, 59413, 59417, 59423, 59431, 59437, 59443, 59452, - 59460, 59478, 59493, 63789, 63866, 63894, 63976, 63986, 64016, 64018, - 64021, 64025, 64034, 64037, 64042, 65074, 65093, 65107, 65112, 65127, - 65132, 65375, 65510, 65536, -]; - -static BACKWARD_TABLE: &'static [u32] = &[ - 0, 0, 36, 38, 45, 50, 81, 89, 95, 96, 100, 103, 104, 105, 109, 126, 133, - 148, 172, 175, 179, 208, 306, 307, 308, 309, 310, 311, 312, 313, 341, 428, - 443, 544, 545, 558, 741, 742, 749, 750, 805, 819, 820, 7922, 7924, 7925, - 7927, 7934, 7943, 7944, 7945, 7950, 8062, 8148, 8149, 8152, 8164, 8174, - 8236, 8240, 8262, 8264, 8374, 8380, 8381, 8384, 8388, 8390, 8392, 8393, - 8394, 8396, 8401, 8406, 8416, 8419, 8424, 8437, 8439, 8445, 8482, 8485, - 8496, 8521, 8603, 8936, 8946, 9046, 9050, 9063, 9066, 9076, 9092, 9100, - 9108, 9111, 9113, 9131, 9162, 9164, 9218, 9219, 11329, 11331, 11334, 11336, - 11346, 11361, 11363, 11366, 11370, 11372, 11375, 11389, 11682, 11686, - 11687, 11692, 11694, 11714, 11716, 11723, 11725, 11730, 11736, 11982, - 11989, 12102, 12336, 12348, 12350, 12384, 12393, 12395, 12397, 12510, - 12553, 12851, 12962, 12973, 13738, 13823, 13919, 13933, 14080, 14298, - 14585, 14698, 15583, 15847, 16318, 16434, 16438, 16481, 16729, 17102, - 17122, 17315, 17320, 17402, 17418, 17859, 17909, 17911, 17915, 17916, - 17936, 17939, 17961, 18664, 18703, 18814, 18962, 19043, 33469, 33470, - 33471, 33484, 33485, 33490, 33497, 33501, 33505, 33513, 33520, 33536, - 33550, 37845, 37921, 37948, 38029, 38038, 38064, 38065, 38066, 38069, - 38075, 38076, 38078, 39108, 39109, 39113, 39114, 39115, 39116, 39265, - 39394, 189000, +static FORWARD_TABLE: &'static [u16] = &[ + 19970, 19972, 19973, 19974, 19983, 19986, 19991, 19999, 20000, 20001, + 20003, 20006, 20009, 20014, 20015, 20017, 20019, 20021, 20023, 20028, + 20032, 20033, 20034, 20036, 20038, 20042, 20049, 20053, 20055, 20058, + 20059, 20066, 20067, 20068, 20069, 20071, 20072, 20074, 20075, 20076, + 20077, 20078, 20079, 20082, 20084, 20085, 20086, 20087, 20088, 20089, + 20090, 20091, 20092, 20093, 20095, 20096, 20097, 20098, 20099, 20100, + 20101, 20103, 20106, 20112, 20118, 20119, 20121, 20124, 20125, 20126, + 20131, 20138, 20143, 20144, 20145, 20148, 20150, 20151, 20152, 20153, + 20156, 20157, 20158, 20168, 20172, 20175, 20176, 20178, 20186, 20187, + 20188, 20192, 20194, 20198, 20199, 20201, 20205, 20206, 20207, 20209, + 20212, 20216, 20217, 20218, 20220, 20222, 20224, 20226, 20227, 20228, + 20229, 20230, 20231, 20232, 20235, 20236, 20242, 20243, 20244, 20245, + 20246, 20252, 20253, 20257, 20259, 20264, 20265, 20268, 20269, 20270, + 20273, 20275, 20277, 20279, 20281, 20283, 20286, 20287, 20288, 20289, + 20290, 20292, 20293, 20295, 20296, 20297, 20298, 20299, 20300, 20306, + 20308, 20310, 20321, 20322, 20326, 20328, 20330, 20331, 20333, 20334, + 20337, 20338, 20341, 20343, 20344, 20345, 20346, 20349, 20352, 20353, + 20354, 20357, 20358, 20359, 20362, 20364, 20366, 20368, 20370, 20371, + 20373, 20374, 20376, 20377, 20378, 20380, 20382, 20383, 20385, 20386, + 20388, 20395, 20397, 20400, 20401, 20402, 20403, 20404, 20406, 20407, + 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20416, 20417, 20418, + 20422, 20423, 20424, 20425, 20427, 20428, 20429, 20434, 20435, 20436, + 20437, 20438, 20441, 20443, 20448, 20450, 20452, 20453, 20455, 20459, + 20460, 20464, 20466, 20468, 20469, 20470, 20471, 20473, 20475, 20476, + 20477, 20479, 20480, 20481, 20482, 20483, 20484, 20485, 20486, 20487, + 20488, 20489, 20490, 20491, 20494, 20496, 20497, 20499, 20501, 20502, + 20503, 20507, 20509, 20510, 20512, 20514, 20515, 20516, 20519, 20523, + 20527, 20528, 20529, 20530, 20531, 20532, 20533, 20534, 20535, 20536, + 20537, 20539, 20541, 20543, 20544, 20545, 20546, 20548, 20549, 20550, + 20553, 20554, 20555, 20557, 20560, 20561, 20562, 20563, 20564, 20566, + 20567, 20568, 20569, 20571, 20573, 20574, 20575, 20576, 20577, 20578, + 20579, 20580, 20582, 20583, 20584, 20585, 20586, 20587, 20589, 20590, + 20591, 20592, 20593, 20594, 20595, 20596, 20597, 20600, 20601, 20602, + 20604, 20605, 20609, 20610, 20611, 20612, 20614, 20615, 20617, 20618, + 20619, 20620, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, + 20630, 20631, 20632, 20633, 20634, 20635, 20636, 20637, 20638, 20639, + 20640, 20641, 20642, 20644, 20646, 20650, 20651, 20653, 20654, 20655, + 20656, 20657, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20668, + 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, + 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20688, 20689, + 20690, 20691, 20692, 20693, 20695, 20696, 20697, 20699, 20700, 20701, + 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20712, 20713, + 20714, 20715, 20719, 20720, 20721, 20722, 20724, 20726, 20727, 20728, + 20729, 20730, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, + 20740, 20741, 20744, 20745, 20746, 20748, 20749, 20750, 20751, 20752, + 20753, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, + 20764, 20765, 20766, 20767, 20768, 20770, 20771, 20772, 20773, 20774, + 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, + 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, + 20795, 20796, 20797, 20798, 20802, 20807, 20810, 20812, 20814, 20815, + 20816, 20818, 20819, 20823, 20824, 20825, 20827, 20829, 20830, 20831, + 20832, 20833, 20835, 20836, 20838, 20839, 20841, 20842, 20847, 20850, + 20858, 20862, 20863, 20867, 20868, 20870, 20871, 20874, 20875, 20878, + 20879, 20880, 20881, 20883, 20884, 20888, 20890, 20893, 20894, 20895, + 20897, 20899, 20902, 20903, 20904, 20905, 20906, 20909, 20910, 20916, + 20920, 20921, 20922, 20926, 20927, 20929, 20930, 20931, 20933, 20936, + 20938, 20941, 20942, 20944, 20946, 20947, 20948, 20949, 20950, 20951, + 20952, 20953, 20954, 20956, 20958, 20959, 20962, 20963, 20965, 20966, + 20967, 20968, 20969, 20970, 20972, 20974, 20977, 20978, 20980, 20983, + 20990, 20996, 20997, 21001, 21003, 21004, 21007, 21008, 21011, 21012, + 21013, 21020, 21022, 21023, 21025, 21026, 21027, 21029, 21030, 21031, + 21034, 21036, 21039, 21041, 21042, 21044, 21045, 21052, 21054, 21060, + 21061, 21062, 21063, 21064, 21065, 21067, 21070, 21071, 21074, 21075, + 21077, 21079, 21080, 21081, 21082, 21083, 21085, 21087, 21088, 21090, + 21091, 21092, 21094, 21096, 21099, 21100, 21101, 21102, 21104, 21105, + 21107, 21108, 21109, 21110, 21111, 21112, 21113, 21114, 21115, 21116, + 21118, 21120, 21123, 21124, 21125, 21126, 21127, 21129, 21130, 21131, + 21132, 21133, 21134, 21135, 21137, 21138, 21140, 21141, 21142, 21143, + 21144, 21145, 21146, 21148, 21156, 21157, 21158, 21159, 21166, 21167, + 21168, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, + 21181, 21184, 21185, 21186, 21188, 21189, 21190, 21192, 21194, 21196, + 21197, 21198, 21199, 21201, 21203, 21204, 21205, 21207, 21209, 21210, + 21211, 21212, 21213, 21214, 21216, 21217, 21218, 21219, 21221, 21222, + 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, + 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21243, 21244, 21245, + 21249, 21250, 21251, 21252, 21255, 21257, 21258, 21259, 21260, 21262, + 21265, 21266, 21267, 21268, 21272, 21275, 21276, 21278, 21279, 21282, + 21284, 21285, 21287, 21288, 21289, 21291, 21292, 21293, 21295, 21296, + 21297, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21308, 21309, + 21312, 21314, 21316, 21318, 21323, 21324, 21325, 21328, 21332, 21336, + 21337, 21339, 21341, 21349, 21352, 21354, 21356, 21357, 21362, 21366, + 21369, 21371, 21372, 21373, 21374, 21376, 21377, 21379, 21383, 21384, + 21386, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21398, 21399, + 21401, 21403, 21404, 21406, 21408, 21409, 21412, 21415, 21418, 21419, + 21420, 21421, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21431, + 21432, 21433, 21434, 21436, 21437, 21438, 21440, 21443, 21444, 21445, + 21446, 21447, 21454, 21455, 21456, 21458, 21459, 21461, 21466, 21468, + 21469, 21470, 21473, 21474, 21479, 21492, 21498, 21502, 21503, 21504, + 21506, 21509, 21511, 21515, 21524, 21528, 21529, 21530, 21532, 21538, + 21540, 21541, 21546, 21552, 21555, 21558, 21559, 21562, 21565, 21567, + 21569, 21570, 21572, 21573, 21575, 21577, 21580, 21581, 21582, 21583, + 21585, 21594, 21597, 21598, 21599, 21600, 21601, 21603, 21605, 21607, + 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21620, 21625, + 21626, 21630, 21631, 21633, 21635, 21637, 21639, 21640, 21641, 21642, + 21645, 21649, 21651, 21655, 21656, 21660, 21662, 21663, 21664, 21665, + 21666, 21669, 21678, 21680, 21682, 21685, 21686, 21687, 21689, 21690, + 21692, 21694, 21699, 21701, 21706, 21707, 21718, 21720, 21723, 21728, + 21729, 21730, 21731, 21732, 21739, 21740, 21743, 21744, 21745, 21748, + 21749, 21750, 21751, 21752, 21753, 21755, 21758, 21760, 21762, 21763, + 21764, 21765, 21768, 21770, 21771, 21772, 21773, 21774, 21778, 21779, + 21781, 21782, 21783, 21784, 21785, 21786, 21788, 21789, 21790, 21791, + 21793, 21797, 21798, 21800, 21801, 21803, 21805, 21810, 21812, 21813, + 21814, 21816, 21817, 21818, 21819, 21821, 21824, 21826, 21829, 21831, + 21832, 21835, 21836, 21837, 21838, 21839, 21841, 21842, 21843, 21844, + 21847, 21848, 21849, 21850, 21851, 21853, 21854, 21855, 21856, 21858, + 21859, 21864, 21865, 21867, 21871, 21872, 21873, 21874, 21875, 21876, + 21881, 21882, 21885, 21887, 21893, 21894, 21900, 21901, 21902, 21904, + 21906, 21907, 21909, 21910, 21911, 21914, 21915, 21918, 21920, 21921, + 21922, 21923, 21924, 21925, 21926, 21928, 21929, 21930, 21931, 21932, + 21933, 21934, 21935, 21936, 21938, 21940, 21942, 21944, 21946, 21948, + 21951, 21952, 21953, 21954, 21955, 21958, 21959, 21960, 21962, 21963, + 21966, 21967, 21968, 21973, 21975, 21976, 21977, 21978, 21979, 21982, + 21984, 21986, 21991, 21993, 21997, 21998, 22000, 22001, 22004, 22006, + 22008, 22009, 22010, 22011, 22012, 22015, 22018, 22019, 22020, 22021, + 22022, 22023, 22026, 22027, 22029, 22032, 22033, 22034, 22035, 22036, + 22037, 22038, 22039, 22041, 22042, 22044, 22045, 22048, 22049, 22050, + 22053, 22054, 22056, 22057, 22058, 22059, 22062, 22063, 22064, 22067, + 22069, 22071, 22072, 22074, 22076, 22077, 22078, 22080, 22081, 22082, + 22083, 22084, 22085, 22086, 22087, 22088, 22089, 22090, 22091, 22095, + 22096, 22097, 22098, 22099, 22101, 22102, 22106, 22107, 22109, 22110, + 22111, 22112, 22113, 22115, 22117, 22118, 22119, 22125, 22126, 22127, + 22128, 22130, 22131, 22132, 22133, 22135, 22136, 22137, 22138, 22141, + 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22151, 22152, 22153, + 22154, 22155, 22156, 22157, 22160, 22161, 22162, 22164, 22165, 22166, + 22167, 22168, 22169, 22170, 22171, 22172, 22173, 22174, 22175, 22176, + 22177, 22178, 22180, 22181, 22182, 22183, 22184, 22185, 22186, 22187, + 22188, 22189, 22190, 22192, 22193, 22194, 22195, 22196, 22197, 22198, + 22200, 22201, 22202, 22203, 22205, 22206, 22207, 22208, 22209, 22210, + 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22219, 22220, 22221, + 22222, 22223, 22224, 22225, 22226, 22227, 22229, 22230, 22232, 22233, + 22236, 22243, 22245, 22246, 22247, 22248, 22249, 22250, 22252, 22254, + 22255, 22258, 22259, 22262, 22263, 22264, 22267, 22268, 22272, 22273, + 22274, 22277, 22279, 22283, 22284, 22285, 22286, 22287, 22288, 22289, + 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, + 22301, 22302, 22304, 22305, 22306, 22308, 22309, 22310, 22311, 22315, + 22321, 22322, 22324, 22325, 22326, 22327, 22328, 22332, 22333, 22335, + 22337, 22339, 22340, 22341, 22342, 22344, 22345, 22347, 22354, 22355, + 22356, 22357, 22358, 22360, 22361, 22370, 22371, 22373, 22375, 22380, + 22382, 22384, 22385, 22386, 22388, 22389, 22392, 22393, 22394, 22397, + 22398, 22399, 22400, 22401, 22407, 22408, 22409, 22410, 22413, 22414, + 22415, 22416, 22417, 22420, 22421, 22422, 22423, 22424, 22425, 22426, + 22428, 22429, 22430, 22431, 22437, 22440, 22442, 22444, 22447, 22448, + 22449, 22451, 22453, 22454, 22455, 22457, 22458, 22459, 22460, 22461, + 22462, 22463, 22464, 22465, 22468, 22469, 22470, 22471, 22472, 22473, + 22474, 22476, 22477, 22480, 22481, 22483, 22486, 22487, 22491, 22492, + 22494, 22497, 22498, 22499, 22501, 22502, 22503, 22504, 22505, 22506, + 22507, 22508, 22510, 22512, 22513, 22514, 22515, 22517, 22518, 22519, + 22523, 22524, 22526, 22527, 22529, 22531, 22532, 22533, 22536, 22537, + 22538, 22540, 22542, 22543, 22544, 22546, 22547, 22548, 22550, 22551, + 22552, 22554, 22555, 22556, 22557, 22559, 22562, 22563, 22565, 22566, + 22567, 22568, 22569, 22571, 22572, 22573, 22574, 22575, 22577, 22578, + 22579, 22580, 22582, 22583, 22584, 22585, 22586, 22587, 22588, 22589, + 22590, 22591, 22592, 22593, 22594, 22595, 22597, 22598, 22599, 22600, + 22601, 22602, 22603, 22606, 22607, 22608, 22610, 22611, 22613, 22614, + 22615, 22617, 22618, 22619, 22620, 22621, 22623, 22624, 22625, 22626, + 22627, 22628, 22630, 22631, 22632, 22633, 22634, 22637, 22638, 22639, + 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, + 22650, 22651, 22652, 22653, 22655, 22658, 22660, 22662, 22663, 22664, + 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22676, 22677, + 22678, 22679, 22680, 22683, 22684, 22685, 22688, 22689, 22690, 22691, + 22692, 22693, 22694, 22695, 22698, 22699, 22700, 22701, 22702, 22703, + 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, + 22714, 22715, 22717, 22718, 22719, 22720, 22722, 22723, 22724, 22726, + 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, + 22738, 22739, 22740, 22742, 22743, 22744, 22745, 22746, 22747, 22748, + 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22757, 22758, 22759, + 22760, 22761, 22762, 22765, 22767, 22769, 22770, 22772, 22773, 22775, + 22776, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22787, + 22789, 22790, 22792, 22793, 22794, 22795, 22796, 22798, 22800, 22801, + 22802, 22803, 22807, 22808, 22811, 22813, 22814, 22816, 22817, 22818, + 22819, 22822, 22824, 22828, 22832, 22834, 22835, 22837, 22838, 22843, + 22845, 22846, 22847, 22848, 22851, 22853, 22854, 22858, 22860, 22861, + 22864, 22866, 22867, 22873, 22875, 22876, 22877, 22878, 22879, 22881, + 22883, 22884, 22886, 22887, 22888, 22889, 22890, 22891, 22892, 22893, + 22894, 22895, 22896, 22897, 22898, 22901, 22903, 22906, 22907, 22908, + 22910, 22911, 22912, 22917, 22921, 22923, 22924, 22926, 22927, 22928, + 22929, 22932, 22933, 22936, 22938, 22939, 22940, 22941, 22943, 22944, + 22945, 22946, 22950, 22951, 22956, 22957, 22960, 22961, 22963, 22964, + 22965, 22966, 22967, 22968, 22970, 22972, 22973, 22975, 22976, 22977, + 22978, 22979, 22980, 22981, 22983, 22984, 22985, 22988, 22989, 22990, + 22991, 22997, 22998, 23001, 23003, 23006, 23007, 23008, 23009, 23010, + 23012, 23014, 23015, 23017, 23018, 23019, 23021, 23022, 23023, 23024, + 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23034, 23036, + 23037, 23038, 23040, 23042, 23050, 23051, 23053, 23054, 23055, 23056, + 23058, 23060, 23061, 23062, 23063, 23065, 23066, 23067, 23069, 23070, + 23073, 23074, 23076, 23078, 23079, 23080, 23082, 23083, 23084, 23085, + 23086, 23087, 23088, 23091, 23093, 23095, 23096, 23097, 23098, 23099, + 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23111, 23112, + 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, + 23126, 23127, 23128, 23129, 23131, 23132, 23133, 23134, 23135, 23136, + 23137, 23139, 23140, 23141, 23142, 23144, 23145, 23147, 23148, 23149, + 23150, 23151, 23152, 23153, 23154, 23155, 23160, 23161, 23163, 23164, + 23165, 23166, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, + 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, + 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23196, 23197, 23198, + 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, + 23209, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23220, 23222, + 23223, 23225, 23226, 23227, 23228, 23229, 23231, 23232, 23235, 23236, + 23237, 23238, 23239, 23240, 23242, 23243, 23245, 23246, 23247, 23248, + 23249, 23251, 23253, 23255, 23257, 23258, 23259, 23261, 23262, 23263, + 23266, 23268, 23269, 23271, 23272, 23274, 23276, 23277, 23278, 23279, + 23280, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, + 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, + 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23309, 23310, 23311, + 23312, 23313, 23314, 23315, 23316, 23317, 23320, 23321, 23322, 23323, + 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, + 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, + 23344, 23345, 23347, 23349, 23350, 23352, 23353, 23354, 23355, 23356, + 23357, 23358, 23359, 23361, 23362, 23363, 23364, 23365, 23366, 23367, + 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23378, 23382, + 23390, 23392, 23393, 23399, 23400, 23403, 23405, 23406, 23407, 23410, + 23412, 23414, 23415, 23416, 23417, 23419, 23420, 23422, 23423, 23426, + 23430, 23434, 23437, 23438, 23440, 23441, 23442, 23444, 23446, 23455, + 23463, 23464, 23465, 23468, 23469, 23470, 23471, 23473, 23474, 23479, + 23482, 23483, 23484, 23488, 23489, 23491, 23496, 23497, 23498, 23499, + 23501, 23502, 23503, 23505, 23508, 23509, 23510, 23511, 23512, 23513, + 23514, 23515, 23516, 23520, 23522, 23523, 23526, 23527, 23529, 23530, + 23531, 23532, 23533, 23535, 23537, 23538, 23539, 23540, 23541, 23542, + 23543, 23549, 23550, 23552, 23554, 23555, 23557, 23559, 23560, 23563, + 23564, 23565, 23566, 23568, 23570, 23571, 23575, 23577, 23579, 23582, + 23583, 23584, 23585, 23587, 23590, 23592, 23593, 23594, 23595, 23597, + 23598, 23599, 23600, 23602, 23603, 23605, 23606, 23607, 23619, 23620, + 23622, 23623, 23628, 23629, 23634, 23635, 23636, 23638, 23639, 23640, + 23642, 23643, 23644, 23645, 23647, 23650, 23652, 23655, 23656, 23657, + 23658, 23659, 23660, 23661, 23664, 23666, 23667, 23668, 23669, 23670, + 23671, 23672, 23675, 23676, 23677, 23678, 23680, 23683, 23684, 23685, + 23686, 23687, 23689, 23690, 23691, 23694, 23695, 23698, 23699, 23701, + 23709, 23710, 23711, 23712, 23713, 23716, 23717, 23718, 23719, 23720, + 23722, 23726, 23727, 23728, 23730, 23732, 23734, 23737, 23738, 23739, + 23740, 23742, 23744, 23746, 23747, 23749, 23750, 23751, 23752, 23753, + 23754, 23756, 23757, 23758, 23759, 23760, 23761, 23763, 23764, 23765, + 23766, 23767, 23768, 23770, 23771, 23772, 23773, 23774, 23775, 23776, + 23778, 23779, 23783, 23785, 23787, 23788, 23790, 23791, 23793, 23794, + 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23804, 23805, + 23806, 23807, 23808, 23809, 23812, 23813, 23816, 23817, 23818, 23819, + 23820, 23821, 23823, 23824, 23825, 23826, 23827, 23829, 23831, 23832, + 23833, 23834, 23836, 23837, 23839, 23840, 23841, 23842, 23843, 23845, + 23848, 23850, 23851, 23852, 23855, 23856, 23857, 23858, 23859, 23861, + 23862, 23863, 23864, 23865, 23866, 23867, 23868, 23871, 23872, 23873, + 23874, 23875, 23876, 23877, 23878, 23880, 23881, 23885, 23886, 23887, + 23888, 23889, 23890, 23891, 23892, 23893, 23894, 23895, 23897, 23898, + 23900, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, + 23911, 23912, 23914, 23917, 23918, 23920, 23921, 23922, 23923, 23925, + 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, 23935, + 23936, 23937, 23939, 23940, 23941, 23942, 23943, 23944, 23945, 23946, + 23947, 23948, 23949, 23950, 23951, 23952, 23953, 23954, 23955, 23956, + 23957, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, + 23969, 23970, 23971, 23972, 23973, 23974, 23975, 23976, 23977, 23978, + 23979, 23980, 23981, 23982, 23983, 23984, 23985, 23986, 23987, 23988, + 23989, 23990, 23992, 23993, 23994, 23995, 23996, 23997, 23998, 23999, + 24000, 24001, 24002, 24003, 24004, 24006, 24007, 24008, 24009, 24010, + 24011, 24012, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24021, + 24022, 24023, 24024, 24025, 24026, 24028, 24031, 24032, 24035, 24036, + 24042, 24044, 24045, 24048, 24053, 24054, 24056, 24057, 24058, 24059, + 24060, 24063, 24064, 24068, 24071, 24073, 24074, 24075, 24077, 24078, + 24082, 24083, 24087, 24094, 24095, 24096, 24097, 24098, 24099, 24100, + 24101, 24104, 24105, 24106, 24107, 24108, 24111, 24112, 24114, 24115, + 24116, 24117, 24118, 24121, 24122, 24126, 24127, 24128, 24129, 24131, + 24134, 24135, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24144, + 24145, 24146, 24147, 24150, 24151, 24152, 24153, 24154, 24156, 24157, + 24159, 24160, 24163, 24164, 24165, 24166, 24167, 24168, 24169, 24170, + 24171, 24172, 24173, 24174, 24175, 24176, 24177, 24181, 24183, 24185, + 24190, 24193, 24194, 24195, 24197, 24200, 24201, 24204, 24205, 24206, + 24210, 24216, 24219, 24221, 24225, 24226, 24227, 24228, 24232, 24233, + 24234, 24235, 24236, 24238, 24239, 24240, 24241, 24242, 24244, 24250, + 24251, 24252, 24253, 24255, 24256, 24257, 24258, 24259, 24260, 24261, + 24262, 24263, 24264, 24267, 24268, 24269, 24270, 24271, 24272, 24276, + 24277, 24279, 24280, 24281, 24282, 24284, 24285, 24286, 24287, 24288, + 24289, 24290, 24291, 24292, 24293, 24294, 24295, 24297, 24299, 24300, + 24301, 24302, 24303, 24304, 24305, 24306, 24307, 24309, 24312, 24313, + 24315, 24316, 24317, 24325, 24326, 24327, 24329, 24332, 24333, 24334, + 24336, 24338, 24340, 24342, 24345, 24346, 24348, 24349, 24350, 24353, + 24354, 24355, 24356, 24360, 24363, 24364, 24366, 24368, 24370, 24371, + 24372, 24373, 24374, 24375, 24376, 24379, 24381, 24382, 24383, 24385, + 24386, 24387, 24388, 24389, 24390, 24391, 24392, 24393, 24394, 24395, + 24396, 24397, 24398, 24399, 24401, 24404, 24409, 24410, 24411, 24412, + 24414, 24415, 24416, 24419, 24421, 24423, 24424, 24427, 24430, 24431, + 24434, 24436, 24437, 24438, 24440, 24442, 24445, 24446, 24447, 24451, + 24454, 24461, 24462, 24463, 24465, 24467, 24468, 24470, 24474, 24475, + 24477, 24478, 24479, 24480, 24482, 24483, 24484, 24485, 24486, 24487, + 24489, 24491, 24492, 24495, 24496, 24497, 24498, 24499, 24500, 24502, + 24504, 24505, 24506, 24507, 24510, 24511, 24512, 24513, 24514, 24519, + 24520, 24522, 24523, 24526, 24531, 24532, 24533, 24538, 24539, 24540, + 24542, 24543, 24546, 24547, 24549, 24550, 24552, 24553, 24556, 24559, + 24560, 24562, 24563, 24564, 24566, 24567, 24569, 24570, 24572, 24583, + 24584, 24585, 24587, 24588, 24592, 24593, 24595, 24599, 24600, 24602, + 24606, 24607, 24610, 24611, 24612, 24620, 24621, 24622, 24624, 24625, + 24626, 24627, 24628, 24630, 24631, 24632, 24633, 24634, 24637, 24638, + 24640, 24644, 24645, 24646, 24647, 24648, 24649, 24650, 24652, 24654, + 24655, 24657, 24659, 24660, 24662, 24663, 24664, 24667, 24668, 24670, + 24671, 24672, 24673, 24677, 24678, 24686, 24689, 24690, 24692, 24693, + 24695, 24702, 24704, 24705, 24706, 24709, 24710, 24711, 24712, 24714, + 24715, 24718, 24719, 24720, 24721, 24723, 24725, 24727, 24728, 24729, + 24732, 24734, 24737, 24738, 24740, 24741, 24743, 24745, 24746, 24750, + 24752, 24755, 24757, 24758, 24759, 24761, 24762, 24765, 24766, 24767, + 24768, 24769, 24770, 24771, 24772, 24775, 24776, 24777, 24780, 24781, + 24782, 24783, 24784, 24786, 24787, 24788, 24790, 24791, 24793, 24795, + 24798, 24801, 24802, 24803, 24804, 24805, 24810, 24817, 24818, 24821, + 24823, 24824, 24827, 24828, 24829, 24830, 24831, 24834, 24835, 24836, + 24837, 24839, 24842, 24843, 24844, 24848, 24849, 24850, 24851, 24852, + 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24865, 24866, + 24869, 24872, 24873, 24874, 24876, 24877, 24878, 24879, 24880, 24881, + 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24890, 24891, + 24892, 24893, 24894, 24896, 24897, 24898, 24899, 24900, 24901, 24902, + 24903, 24905, 24907, 24909, 24911, 24912, 24914, 24915, 24916, 24918, + 24919, 24920, 24921, 24922, 24923, 24924, 24926, 24927, 24928, 24929, + 24931, 24932, 24933, 24934, 24937, 24938, 24939, 24940, 24941, 24942, + 24943, 24945, 24946, 24947, 24948, 24950, 24952, 24953, 24954, 24955, + 24956, 24957, 24958, 24959, 24960, 24961, 24962, 24963, 24964, 24965, + 24966, 24967, 24968, 24969, 24970, 24972, 24973, 24975, 24976, 24977, + 24978, 24979, 24981, 24982, 24983, 24984, 24985, 24986, 24987, 24988, + 24990, 24991, 24992, 24993, 24994, 24995, 24996, 24997, 24998, 25002, + 25003, 25005, 25006, 25007, 25008, 25009, 25010, 25011, 25012, 25013, + 25014, 25016, 25017, 25018, 25019, 25020, 25021, 25023, 25024, 25025, + 25027, 25028, 25029, 25030, 25031, 25033, 25036, 25037, 25038, 25039, + 25040, 25043, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, + 25053, 25054, 25055, 25056, 25057, 25058, 25059, 25060, 25061, 25063, + 25064, 25065, 25066, 25067, 25068, 25069, 25070, 25071, 25072, 25073, + 25074, 25075, 25076, 25078, 25079, 25080, 25081, 25082, 25083, 25084, + 25085, 25086, 25088, 25089, 25090, 25091, 25092, 25093, 25095, 25097, + 25107, 25108, 25113, 25116, 25117, 25118, 25120, 25123, 25126, 25127, + 25128, 25129, 25131, 25133, 25135, 25136, 25137, 25138, 25141, 25142, + 25144, 25145, 25146, 25147, 25148, 25154, 25156, 25157, 25158, 25162, + 25167, 25168, 25173, 25174, 25175, 25177, 25178, 25180, 25181, 25182, + 25183, 25184, 25185, 25186, 25188, 25189, 25192, 25201, 25202, 25204, + 25205, 25207, 25208, 25210, 25211, 25213, 25217, 25218, 25219, 25221, + 25222, 25223, 25224, 25227, 25228, 25229, 25230, 25231, 25232, 25236, + 25241, 25244, 25245, 25246, 25251, 25254, 25255, 25257, 25258, 25261, + 25262, 25263, 25264, 25266, 25267, 25268, 25270, 25271, 25272, 25274, + 25278, 25280, 25281, 25283, 25291, 25295, 25297, 25301, 25309, 25310, + 25312, 25313, 25316, 25322, 25323, 25328, 25330, 25333, 25336, 25337, + 25338, 25339, 25344, 25347, 25348, 25349, 25350, 25354, 25355, 25356, + 25357, 25359, 25360, 25362, 25363, 25364, 25365, 25367, 25368, 25369, + 25372, 25382, 25383, 25385, 25388, 25389, 25390, 25392, 25393, 25395, + 25396, 25397, 25398, 25399, 25400, 25403, 25404, 25406, 25407, 25408, + 25409, 25412, 25415, 25416, 25418, 25425, 25426, 25427, 25428, 25430, + 25431, 25432, 25433, 25434, 25435, 25436, 25437, 25440, 25444, 25445, + 25446, 25448, 25450, 25451, 25452, 25455, 25456, 25458, 25459, 25460, + 25461, 25464, 25465, 25468, 25469, 25470, 25471, 25473, 25475, 25476, + 25477, 25478, 25483, 25485, 25489, 25491, 25492, 25493, 25495, 25497, + 25498, 25499, 25500, 25501, 25502, 25503, 25505, 25508, 25510, 25515, + 25519, 25521, 25522, 25525, 25526, 25529, 25531, 25533, 25535, 25536, + 25537, 25538, 25539, 25541, 25543, 25544, 25546, 25547, 25548, 25553, + 25555, 25556, 25557, 25559, 25560, 25561, 25562, 25563, 25564, 25565, + 25567, 25570, 25572, 25573, 25574, 25575, 25576, 25579, 25580, 25582, + 25583, 25584, 25585, 25587, 25589, 25591, 25593, 25594, 25595, 25596, + 25598, 25603, 25604, 25606, 25607, 25608, 25609, 25610, 25613, 25614, + 25617, 25618, 25621, 25622, 25623, 25624, 25625, 25626, 25629, 25631, + 25634, 25635, 25636, 25637, 25639, 25640, 25641, 25643, 25646, 25647, + 25648, 25649, 25650, 25651, 25653, 25654, 25655, 25656, 25657, 25659, + 25660, 25662, 25664, 25666, 25667, 25673, 25675, 25676, 25677, 25678, + 25679, 25680, 25681, 25683, 25685, 25686, 25687, 25689, 25690, 25691, + 25692, 25693, 25695, 25696, 25697, 25698, 25699, 25700, 25701, 25702, + 25704, 25706, 25707, 25708, 25710, 25711, 25712, 25713, 25714, 25715, + 25716, 25717, 25718, 25719, 25723, 25724, 25725, 25726, 25727, 25728, + 25729, 25731, 25734, 25736, 25737, 25738, 25739, 25740, 25741, 25742, + 25743, 25744, 25747, 25748, 25751, 25752, 25754, 25755, 25756, 25757, + 25759, 25760, 25761, 25762, 25763, 25765, 25766, 25767, 25768, 25770, + 25771, 25775, 25777, 25778, 25779, 25780, 25782, 25785, 25787, 25789, + 25790, 25791, 25793, 25795, 25796, 25798, 25799, 25800, 25801, 25802, + 25803, 25804, 25807, 25809, 25811, 25812, 25813, 25814, 25817, 25818, + 25819, 25820, 25821, 25823, 25824, 25825, 25827, 25829, 25831, 25832, + 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, + 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25850, 25851, 25852, + 25853, 25854, 25855, 25857, 25858, 25859, 25860, 25861, 25862, 25863, + 25864, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25875, + 25876, 25877, 25878, 25879, 25881, 25882, 25883, 25884, 25885, 25886, + 25887, 25888, 25889, 25890, 25891, 25892, 25894, 25895, 25896, 25897, + 25898, 25900, 25901, 25904, 25905, 25906, 25907, 25911, 25914, 25916, + 25917, 25920, 25921, 25922, 25923, 25924, 25926, 25927, 25930, 25931, + 25933, 25934, 25936, 25938, 25939, 25940, 25943, 25944, 25946, 25948, + 25951, 25952, 25953, 25956, 25957, 25959, 25960, 25961, 25962, 25965, + 25966, 25967, 25969, 25971, 25973, 25974, 25976, 25977, 25978, 25979, + 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, + 25990, 25992, 25993, 25994, 25997, 25998, 25999, 26002, 26004, 26005, + 26006, 26008, 26010, 26013, 26014, 26016, 26018, 26019, 26022, 26024, + 26026, 26028, 26030, 26033, 26034, 26035, 26036, 26037, 26038, 26039, + 26040, 26042, 26043, 26046, 26047, 26048, 26050, 26055, 26056, 26057, + 26058, 26061, 26064, 26065, 26067, 26068, 26069, 26072, 26073, 26074, + 26075, 26076, 26077, 26078, 26079, 26081, 26083, 26084, 26090, 26091, + 26098, 26099, 26100, 26101, 26104, 26105, 26107, 26108, 26109, 26110, + 26111, 26113, 26116, 26117, 26119, 26120, 26121, 26123, 26125, 26128, + 26129, 26130, 26134, 26135, 26136, 26138, 26139, 26140, 26142, 26145, + 26146, 26147, 26148, 26150, 26153, 26154, 26155, 26156, 26158, 26160, + 26162, 26163, 26167, 26168, 26169, 26170, 26171, 26173, 26175, 26176, + 26178, 26180, 26181, 26182, 26183, 26184, 26185, 26186, 26189, 26190, + 26192, 26193, 26200, 26201, 26203, 26204, 26205, 26206, 26208, 26210, + 26211, 26213, 26215, 26217, 26218, 26219, 26220, 26221, 26225, 26226, + 26227, 26229, 26232, 26233, 26235, 26236, 26237, 26239, 26240, 26241, + 26243, 26245, 26246, 26248, 26249, 26250, 26251, 26253, 26254, 26255, + 26256, 26258, 26259, 26260, 26261, 26264, 26265, 26266, 26267, 26268, + 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26281, + 26282, 26283, 26284, 26285, 26287, 26288, 26289, 26290, 26291, 26293, + 26294, 26295, 26296, 26298, 26299, 26300, 26301, 26303, 26304, 26305, + 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, + 26316, 26317, 26318, 26319, 26320, 26321, 26322, 26323, 26324, 26325, + 26326, 26327, 26328, 26330, 26334, 26335, 26336, 26337, 26338, 26339, + 26340, 26341, 26343, 26344, 26346, 26347, 26348, 26349, 26350, 26351, + 26353, 26357, 26358, 26360, 26362, 26363, 26365, 26369, 26370, 26371, + 26372, 26373, 26374, 26375, 26380, 26382, 26383, 26385, 26386, 26387, + 26390, 26392, 26393, 26394, 26396, 26398, 26400, 26401, 26402, 26403, + 26404, 26405, 26407, 26409, 26414, 26416, 26418, 26419, 26422, 26423, + 26424, 26425, 26427, 26428, 26430, 26431, 26433, 26436, 26437, 26439, + 26442, 26443, 26445, 26450, 26452, 26453, 26455, 26456, 26457, 26458, + 26459, 26461, 26466, 26467, 26468, 26470, 26471, 26475, 26476, 26478, + 26481, 26484, 26486, 26488, 26489, 26490, 26491, 26493, 26496, 26498, + 26499, 26501, 26502, 26504, 26506, 26508, 26509, 26510, 26511, 26513, + 26514, 26515, 26516, 26518, 26521, 26523, 26527, 26528, 26529, 26532, + 26534, 26537, 26540, 26542, 26545, 26546, 26548, 26553, 26554, 26555, + 26556, 26557, 26558, 26559, 26560, 26562, 26565, 26566, 26567, 26568, + 26569, 26570, 26571, 26572, 26573, 26574, 26581, 26582, 26583, 26587, + 26591, 26593, 26595, 26596, 26598, 26599, 26600, 26602, 26603, 26605, + 26606, 26610, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, + 26622, 26625, 26626, 26627, 26628, 26630, 26637, 26640, 26642, 26644, + 26645, 26648, 26649, 26650, 26651, 26652, 26654, 26655, 26656, 26658, + 26659, 26660, 26661, 26662, 26663, 26664, 26667, 26668, 26669, 26670, + 26671, 26672, 26673, 26676, 26677, 26678, 26682, 26683, 26687, 26695, + 26699, 26701, 26703, 26706, 26710, 26711, 26712, 26713, 26714, 26715, + 26716, 26717, 26718, 26719, 26730, 26732, 26733, 26734, 26735, 26736, + 26737, 26738, 26739, 26741, 26744, 26745, 26746, 26747, 26748, 26749, + 26750, 26751, 26752, 26754, 26756, 26759, 26760, 26761, 26762, 26763, + 26764, 26765, 26766, 26768, 26769, 26770, 26772, 26773, 26774, 26776, + 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26787, + 26788, 26789, 26793, 26794, 26795, 26796, 26798, 26801, 26802, 26804, + 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, + 26817, 26819, 26820, 26821, 26822, 26823, 26824, 26826, 26828, 26830, + 26831, 26832, 26833, 26835, 26836, 26838, 26839, 26841, 26843, 26844, + 26845, 26846, 26847, 26849, 26850, 26852, 26853, 26854, 26855, 26856, + 26857, 26858, 26859, 26860, 26861, 26863, 26866, 26867, 26868, 26870, + 26871, 26872, 26875, 26877, 26878, 26879, 26880, 26882, 26883, 26884, + 26886, 26887, 26888, 26889, 26890, 26892, 26895, 26897, 26899, 26900, + 26901, 26902, 26903, 26904, 26905, 26906, 26907, 26908, 26909, 26910, + 26913, 26914, 26915, 26917, 26918, 26919, 26920, 26921, 26922, 26923, + 26924, 26926, 26927, 26929, 26930, 26931, 26933, 26934, 26935, 26936, + 26938, 26939, 26940, 26942, 26944, 26945, 26947, 26948, 26949, 26950, + 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, + 26961, 26962, 26963, 26965, 26966, 26968, 26969, 26971, 26972, 26975, + 26977, 26978, 26980, 26981, 26983, 26984, 26985, 26986, 26988, 26989, + 26991, 26992, 26994, 26995, 26996, 26997, 26998, 27002, 27003, 27005, + 27006, 27007, 27009, 27011, 27013, 27018, 27019, 27020, 27022, 27023, + 27024, 27025, 27026, 27027, 27030, 27031, 27033, 27034, 27037, 27038, + 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27049, 27050, + 27052, 27054, 27055, 27056, 27058, 27059, 27061, 27062, 27064, 27065, + 27066, 27068, 27069, 27070, 27071, 27072, 27074, 27075, 27076, 27077, + 27078, 27079, 27080, 27081, 27083, 27085, 27087, 27089, 27090, 27091, + 27093, 27094, 27095, 27096, 27097, 27098, 27100, 27101, 27102, 27105, + 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, + 27116, 27118, 27119, 27120, 27121, 27123, 27124, 27125, 27126, 27127, + 27128, 27129, 27130, 27131, 27132, 27134, 27136, 27137, 27138, 27139, + 27140, 27141, 27142, 27143, 27144, 27145, 27147, 27148, 27149, 27150, + 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27161, 27162, + 27163, 27164, 27165, 27166, 27168, 27170, 27171, 27172, 27173, 27174, + 27175, 27177, 27179, 27180, 27181, 27182, 27184, 27186, 27187, 27188, + 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27199, 27200, 27201, + 27202, 27203, 27205, 27206, 27208, 27209, 27210, 27211, 27212, 27213, + 27214, 27215, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27226, + 27228, 27229, 27230, 27231, 27232, 27234, 27235, 27236, 27238, 27239, + 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27250, + 27251, 27252, 27253, 27254, 27255, 27256, 27258, 27259, 27261, 27262, + 27263, 27265, 27266, 27267, 27269, 27270, 27271, 27272, 27273, 27274, + 27275, 27276, 27277, 27279, 27282, 27283, 27284, 27285, 27286, 27288, + 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27297, 27298, 27299, + 27300, 27301, 27302, 27303, 27304, 27306, 27309, 27310, 27311, 27312, + 27313, 27314, 27315, 27316, 27317, 27318, 27319, 27320, 27321, 27322, + 27323, 27324, 27325, 27326, 27327, 27328, 27329, 27330, 27331, 27332, + 27333, 27334, 27335, 27336, 27337, 27338, 27339, 27340, 27341, 27342, + 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, + 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, + 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, + 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27381, 27382, + 27383, 27384, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, + 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, + 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, + 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, + 27423, 27429, 27430, 27432, 27433, 27434, 27435, 27436, 27437, 27438, + 27439, 27440, 27441, 27443, 27444, 27445, 27446, 27448, 27451, 27452, + 27453, 27455, 27456, 27457, 27458, 27460, 27461, 27464, 27466, 27467, + 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, + 27479, 27480, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, + 27496, 27497, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, + 27507, 27508, 27509, 27510, 27511, 27512, 27514, 27517, 27518, 27519, + 27520, 27525, 27528, 27532, 27534, 27535, 27536, 27537, 27540, 27541, + 27543, 27544, 27545, 27548, 27549, 27550, 27551, 27552, 27554, 27555, + 27556, 27557, 27558, 27559, 27560, 27561, 27563, 27564, 27565, 27566, + 27567, 27568, 27569, 27570, 27574, 27576, 27577, 27578, 27579, 27580, + 27581, 27582, 27584, 27587, 27588, 27590, 27591, 27592, 27593, 27594, + 27596, 27598, 27600, 27601, 27608, 27610, 27612, 27613, 27614, 27615, + 27616, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27628, + 27629, 27630, 27632, 27633, 27634, 27636, 27638, 27639, 27640, 27642, + 27643, 27644, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27656, + 27657, 27658, 27659, 27660, 27662, 27666, 27671, 27676, 27677, 27678, + 27680, 27683, 27685, 27691, 27692, 27693, 27697, 27699, 27702, 27703, + 27705, 27706, 27707, 27708, 27710, 27711, 27715, 27716, 27717, 27720, + 27723, 27724, 27725, 27726, 27727, 27729, 27730, 27731, 27734, 27736, + 27737, 27738, 27746, 27747, 27749, 27750, 27751, 27755, 27756, 27757, + 27758, 27759, 27761, 27763, 27765, 27767, 27768, 27770, 27771, 27772, + 27775, 27776, 27780, 27783, 27786, 27787, 27789, 27790, 27793, 27794, + 27797, 27798, 27799, 27800, 27802, 27804, 27805, 27806, 27808, 27810, + 27816, 27820, 27823, 27824, 27828, 27829, 27830, 27831, 27834, 27840, + 27841, 27842, 27843, 27846, 27847, 27848, 27851, 27853, 27854, 27855, + 27857, 27858, 27864, 27865, 27866, 27868, 27869, 27871, 27876, 27878, + 27879, 27881, 27884, 27885, 27890, 27892, 27897, 27903, 27904, 27906, + 27907, 27909, 27910, 27912, 27913, 27914, 27917, 27919, 27920, 27921, + 27923, 27924, 27925, 27926, 27928, 27932, 27933, 27935, 27936, 27937, + 27938, 27939, 27940, 27942, 27944, 27945, 27948, 27949, 27951, 27952, + 27956, 27958, 27959, 27960, 27962, 27967, 27968, 27970, 27972, 27977, + 27980, 27984, 27989, 27990, 27991, 27992, 27995, 27997, 27999, 28001, + 28002, 28004, 28005, 28007, 28008, 28011, 28012, 28013, 28016, 28017, + 28018, 28019, 28021, 28022, 28025, 28026, 28027, 28029, 28030, 28031, + 28032, 28033, 28035, 28036, 28038, 28039, 28042, 28043, 28045, 28047, + 28048, 28050, 28054, 28055, 28056, 28057, 28058, 28060, 28066, 28069, + 28076, 28077, 28080, 28081, 28083, 28084, 28086, 28087, 28089, 28090, + 28091, 28092, 28093, 28094, 28097, 28098, 28099, 28104, 28105, 28106, + 28109, 28110, 28111, 28112, 28114, 28115, 28116, 28117, 28119, 28122, + 28123, 28124, 28127, 28130, 28131, 28133, 28135, 28136, 28137, 28138, + 28141, 28143, 28144, 28146, 28148, 28149, 28150, 28152, 28154, 28157, + 28158, 28159, 28160, 28161, 28162, 28163, 28164, 28166, 28167, 28168, + 28169, 28171, 28175, 28178, 28179, 28181, 28184, 28185, 28187, 28188, + 28190, 28191, 28194, 28198, 28199, 28200, 28202, 28204, 28206, 28208, + 28209, 28211, 28213, 28214, 28215, 28217, 28219, 28220, 28221, 28222, + 28223, 28224, 28225, 28226, 28229, 28230, 28231, 28232, 28233, 28234, + 28235, 28236, 28239, 28240, 28241, 28242, 28245, 28247, 28249, 28250, + 28252, 28253, 28254, 28256, 28257, 28258, 28259, 28260, 28261, 28262, + 28263, 28264, 28265, 28266, 28268, 28269, 28271, 28272, 28273, 28274, + 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, + 28285, 28288, 28289, 28290, 28292, 28295, 28296, 28298, 28299, 28300, + 28301, 28302, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28313, + 28314, 28315, 28317, 28318, 28320, 28321, 28323, 28324, 28326, 28328, + 28329, 28331, 28332, 28333, 28334, 28336, 28339, 28341, 28344, 28345, + 28348, 28350, 28351, 28352, 28355, 28356, 28357, 28358, 28360, 28361, + 28362, 28364, 28365, 28366, 28368, 28370, 28374, 28376, 28377, 28379, + 28380, 28381, 28387, 28391, 28394, 28395, 28396, 28397, 28398, 28399, + 28400, 28401, 28402, 28403, 28405, 28406, 28407, 28408, 28410, 28411, + 28412, 28413, 28414, 28415, 28416, 28417, 28419, 28420, 28421, 28423, + 28424, 28426, 28427, 28428, 28429, 28430, 28432, 28433, 28434, 28438, + 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28449, + 28450, 28451, 28453, 28454, 28455, 28456, 28460, 28462, 28464, 28466, + 28468, 28469, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28479, + 28480, 28481, 28482, 28483, 28484, 28485, 28488, 28489, 28490, 28492, + 28494, 28495, 28496, 28497, 28498, 28499, 28500, 28501, 28502, 28503, + 28505, 28506, 28507, 28509, 28511, 28512, 28513, 28515, 28516, 28517, + 28519, 28520, 28521, 28522, 28523, 28524, 28527, 28528, 28529, 28531, + 28533, 28534, 28535, 28537, 28539, 28541, 28542, 28543, 28544, 28545, + 28546, 28547, 28549, 28550, 28551, 28554, 28555, 28559, 28560, 28561, + 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, + 28573, 28574, 28575, 28576, 28578, 28579, 28580, 28581, 28582, 28584, + 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, + 28596, 28597, 28599, 28600, 28602, 28603, 28604, 28605, 28606, 28607, + 28609, 28611, 28612, 28613, 28614, 28615, 28616, 28618, 28619, 28620, + 28621, 28622, 28623, 28624, 28627, 28628, 28629, 28630, 28631, 28632, + 28633, 28634, 28635, 28636, 28637, 28639, 28642, 28643, 28644, 28645, + 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28656, 28657, + 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, + 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, + 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28686, 28687, + 28688, 28690, 28691, 28692, 28693, 28694, 28695, 28696, 28697, 28700, + 28701, 28702, 28703, 28704, 28705, 28706, 28708, 28709, 28710, 28711, + 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, + 28722, 28723, 28724, 28726, 28727, 28728, 28730, 28731, 28732, 28733, + 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, + 28744, 28745, 28746, 28747, 28749, 28750, 28752, 28753, 28754, 28755, + 28756, 28757, 28758, 28759, 28760, 28761, 28762, 28763, 28764, 28765, + 28767, 28768, 28769, 28770, 28771, 28772, 28773, 28774, 28775, 28776, + 28777, 28778, 28782, 28785, 28786, 28787, 28788, 28791, 28793, 28794, + 28795, 28797, 28801, 28802, 28803, 28804, 28806, 28807, 28808, 28811, + 28812, 28813, 28815, 28816, 28817, 28819, 28823, 28824, 28826, 28827, + 28830, 28831, 28832, 28833, 28834, 28835, 28836, 28837, 28838, 28839, + 28840, 28841, 28842, 28848, 28850, 28852, 28853, 28854, 28858, 28862, + 28863, 28868, 28869, 28870, 28871, 28873, 28875, 28876, 28877, 28878, + 28879, 28880, 28881, 28882, 28883, 28884, 28885, 28886, 28887, 28890, + 28892, 28893, 28894, 28896, 28897, 28898, 28899, 28901, 28906, 28910, + 28912, 28913, 28914, 28915, 28916, 28917, 28918, 28920, 28922, 28923, + 28924, 28926, 28927, 28928, 28929, 28930, 28931, 28932, 28933, 28934, + 28935, 28936, 28939, 28940, 28941, 28942, 28943, 28945, 28946, 28948, + 28951, 28955, 28956, 28957, 28958, 28959, 28960, 28961, 28962, 28963, + 28964, 28965, 28967, 28968, 28969, 28970, 28971, 28972, 28973, 28974, + 28978, 28979, 28980, 28981, 28983, 28984, 28985, 28986, 28987, 28988, + 28989, 28990, 28991, 28992, 28993, 28994, 28995, 28996, 28998, 28999, + 29000, 29001, 29003, 29005, 29007, 29008, 29009, 29010, 29011, 29012, + 29013, 29014, 29015, 29016, 29017, 29018, 29019, 29021, 29023, 29024, + 29025, 29026, 29027, 29029, 29033, 29034, 29035, 29036, 29037, 29039, + 29040, 29041, 29044, 29045, 29046, 29047, 29049, 29051, 29052, 29054, + 29055, 29056, 29057, 29058, 29059, 29061, 29062, 29063, 29064, 29065, + 29067, 29068, 29069, 29070, 29072, 29073, 29074, 29075, 29077, 29078, + 29079, 29082, 29083, 29084, 29085, 29086, 29089, 29090, 29091, 29092, + 29093, 29094, 29095, 29097, 29098, 29099, 29101, 29102, 29103, 29104, + 29105, 29106, 29108, 29110, 29111, 29112, 29114, 29115, 29116, 29117, + 29118, 29119, 29120, 29121, 29122, 29124, 29125, 29126, 29127, 29128, + 29129, 29130, 29131, 29132, 29133, 29135, 29136, 29137, 29138, 29139, + 29142, 29143, 29144, 29145, 29146, 29147, 29148, 29149, 29150, 29151, + 29153, 29154, 29155, 29156, 29158, 29160, 29161, 29162, 29163, 29164, + 29165, 29167, 29168, 29169, 29170, 29171, 29172, 29173, 29174, 29175, + 29176, 29178, 29179, 29180, 29181, 29182, 29183, 29184, 29185, 29186, + 29187, 29188, 29189, 29191, 29192, 29193, 29194, 29195, 29196, 29197, + 29198, 29199, 29200, 29201, 29202, 29203, 29204, 29205, 29206, 29207, + 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, + 29219, 29220, 29221, 29222, 29223, 29225, 29227, 29229, 29230, 29231, + 29234, 29235, 29236, 29242, 29244, 29246, 29248, 29249, 29250, 29251, + 29252, 29253, 29254, 29257, 29258, 29259, 29262, 29263, 29264, 29265, + 29267, 29268, 29269, 29271, 29272, 29274, 29276, 29278, 29280, 29283, + 29284, 29285, 29288, 29290, 29291, 29292, 29293, 29296, 29297, 29299, + 29300, 29302, 29303, 29304, 29307, 29308, 29309, 29314, 29315, 29317, + 29318, 29319, 29320, 29321, 29324, 29326, 29328, 29329, 29331, 29332, + 29333, 29334, 29335, 29336, 29337, 29338, 29339, 29340, 29341, 29342, + 29344, 29345, 29346, 29347, 29348, 29349, 29350, 29351, 29352, 29353, + 29354, 29355, 29358, 29361, 29362, 29363, 29365, 29370, 29371, 29372, + 29373, 29374, 29375, 29376, 29381, 29382, 29383, 29385, 29386, 29387, + 29388, 29391, 29393, 29395, 29396, 29397, 29398, 29400, 29402, 29403, + 58566, 58567, 58568, 58569, 58570, 58571, 58572, 58573, 58574, 58575, + 58576, 58577, 58578, 58579, 58580, 58581, 58582, 58583, 58584, 58585, + 58586, 58587, 58588, 58589, 58590, 58591, 58592, 58593, 58594, 58595, + 58596, 58597, 58598, 58599, 58600, 58601, 58602, 58603, 58604, 58605, + 58606, 58607, 58608, 58609, 58610, 58611, 58612, 58613, 58614, 58615, + 58616, 58617, 58618, 58619, 58620, 58621, 58622, 58623, 58624, 58625, + 58626, 58627, 58628, 58629, 58630, 58631, 58632, 58633, 58634, 58635, + 58636, 58637, 58638, 58639, 58640, 58641, 58642, 58643, 58644, 58645, + 58646, 58647, 58648, 58649, 58650, 58651, 58652, 58653, 58654, 58655, + 58656, 58657, 58658, 58659, 58660, 58661, 12288, 12289, 12290, 183, 713, + 711, 168, 12291, 12293, 8212, 65374, 8214, 8230, 8216, 8217, 8220, 8221, + 12308, 12309, 12296, 12297, 12298, 12299, 12300, 12301, 12302, 12303, + 12310, 12311, 12304, 12305, 177, 215, 247, 8758, 8743, 8744, 8721, 8719, + 8746, 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, + 8801, 8780, 8776, 8765, 8733, 8800, 8814, 8815, 8804, 8805, 8734, 8757, + 8756, 9794, 9792, 176, 8242, 8243, 8451, 65284, 164, 65504, 65505, 8240, + 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632, 9651, + 9650, 8251, 8594, 8592, 8593, 8595, 12307, 58662, 58663, 58664, 58665, + 58666, 58667, 58668, 58669, 58670, 58671, 58672, 58673, 58674, 58675, + 58676, 58677, 58678, 58679, 58680, 58681, 58682, 58683, 58684, 58685, + 58686, 58687, 58688, 58689, 58690, 58691, 58692, 58693, 58694, 58695, + 58696, 58697, 58698, 58699, 58700, 58701, 58702, 58703, 58704, 58705, + 58706, 58707, 58708, 58709, 58710, 58711, 58712, 58713, 58714, 58715, + 58716, 58717, 58718, 58719, 58720, 58721, 58722, 58723, 58724, 58725, + 58726, 58727, 58728, 58729, 58730, 58731, 58732, 58733, 58734, 58735, + 58736, 58737, 58738, 58739, 58740, 58741, 58742, 58743, 58744, 58745, + 58746, 58747, 58748, 58749, 58750, 58751, 58752, 58753, 58754, 58755, + 58756, 58757, 8560, 8561, 8562, 8563, 8564, 8565, 8566, 8567, 8568, 8569, + 59238, 59239, 59240, 59241, 59242, 59243, 9352, 9353, 9354, 9355, 9356, + 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, + 9369, 9370, 9371, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, + 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, 9350, 9351, 9312, + 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 8364, 59245, 12832, + 12833, 12834, 12835, 12836, 12837, 12838, 12839, 12840, 12841, 59246, + 59247, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 8554, + 8555, 59248, 59249, 58758, 58759, 58760, 58761, 58762, 58763, 58764, 58765, + 58766, 58767, 58768, 58769, 58770, 58771, 58772, 58773, 58774, 58775, + 58776, 58777, 58778, 58779, 58780, 58781, 58782, 58783, 58784, 58785, + 58786, 58787, 58788, 58789, 58790, 58791, 58792, 58793, 58794, 58795, + 58796, 58797, 58798, 58799, 58800, 58801, 58802, 58803, 58804, 58805, + 58806, 58807, 58808, 58809, 58810, 58811, 58812, 58813, 58814, 58815, + 58816, 58817, 58818, 58819, 58820, 58821, 58822, 58823, 58824, 58825, + 58826, 58827, 58828, 58829, 58830, 58831, 58832, 58833, 58834, 58835, + 58836, 58837, 58838, 58839, 58840, 58841, 58842, 58843, 58844, 58845, + 58846, 58847, 58848, 58849, 58850, 58851, 58852, 12288, 65281, 65282, + 65283, 65509, 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, + 65293, 65294, 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, + 65303, 65304, 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, + 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, + 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, + 65333, 65334, 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, + 65343, 65344, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, + 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, + 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, + 65373, 65507, 58854, 58855, 58856, 58857, 58858, 58859, 58860, 58861, + 58862, 58863, 58864, 58865, 58866, 58867, 58868, 58869, 58870, 58871, + 58872, 58873, 58874, 58875, 58876, 58877, 58878, 58879, 58880, 58881, + 58882, 58883, 58884, 58885, 58886, 58887, 58888, 58889, 58890, 58891, + 58892, 58893, 58894, 58895, 58896, 58897, 58898, 58899, 58900, 58901, + 58902, 58903, 58904, 58905, 58906, 58907, 58908, 58909, 58910, 58911, + 58912, 58913, 58914, 58915, 58916, 58917, 58918, 58919, 58920, 58921, + 58922, 58923, 58924, 58925, 58926, 58927, 58928, 58929, 58930, 58931, + 58932, 58933, 58934, 58935, 58936, 58937, 58938, 58939, 58940, 58941, + 58942, 58943, 58944, 58945, 58946, 58947, 58948, 58949, 12353, 12354, + 12355, 12356, 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, + 12365, 12366, 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, + 12375, 12376, 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, + 12385, 12386, 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, + 12395, 12396, 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, + 12405, 12406, 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, + 12415, 12416, 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, + 12425, 12426, 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, + 12435, 59250, 59251, 59252, 59253, 59254, 59255, 59256, 59257, 59258, + 59259, 59260, 58950, 58951, 58952, 58953, 58954, 58955, 58956, 58957, + 58958, 58959, 58960, 58961, 58962, 58963, 58964, 58965, 58966, 58967, + 58968, 58969, 58970, 58971, 58972, 58973, 58974, 58975, 58976, 58977, + 58978, 58979, 58980, 58981, 58982, 58983, 58984, 58985, 58986, 58987, + 58988, 58989, 58990, 58991, 58992, 58993, 58994, 58995, 58996, 58997, + 58998, 58999, 59000, 59001, 59002, 59003, 59004, 59005, 59006, 59007, + 59008, 59009, 59010, 59011, 59012, 59013, 59014, 59015, 59016, 59017, + 59018, 59019, 59020, 59021, 59022, 59023, 59024, 59025, 59026, 59027, + 59028, 59029, 59030, 59031, 59032, 59033, 59034, 59035, 59036, 59037, + 59038, 59039, 59040, 59041, 59042, 59043, 59044, 59045, 12449, 12450, + 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, + 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, + 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, + 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, + 12491, 12492, 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, + 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, + 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, + 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, + 12531, 12532, 12533, 12534, 59261, 59262, 59263, 59264, 59265, 59266, + 59267, 59268, 59046, 59047, 59048, 59049, 59050, 59051, 59052, 59053, + 59054, 59055, 59056, 59057, 59058, 59059, 59060, 59061, 59062, 59063, + 59064, 59065, 59066, 59067, 59068, 59069, 59070, 59071, 59072, 59073, + 59074, 59075, 59076, 59077, 59078, 59079, 59080, 59081, 59082, 59083, + 59084, 59085, 59086, 59087, 59088, 59089, 59090, 59091, 59092, 59093, + 59094, 59095, 59096, 59097, 59098, 59099, 59100, 59101, 59102, 59103, + 59104, 59105, 59106, 59107, 59108, 59109, 59110, 59111, 59112, 59113, + 59114, 59115, 59116, 59117, 59118, 59119, 59120, 59121, 59122, 59123, + 59124, 59125, 59126, 59127, 59128, 59129, 59130, 59131, 59132, 59133, + 59134, 59135, 59136, 59137, 59138, 59139, 59140, 59141, 913, 914, 915, 916, + 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, + 933, 934, 935, 936, 937, 59269, 59270, 59271, 59272, 59273, 59274, 59275, + 59276, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, + 958, 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, 59277, 59278, 59279, + 59280, 59281, 59282, 59283, 65077, 65078, 65081, 65082, 65087, 65088, + 65085, 65086, 65089, 65090, 65091, 65092, 59284, 59285, 65083, 65084, + 65079, 65080, 65073, 59286, 65075, 65076, 59287, 59288, 59289, 59290, + 59291, 59292, 59293, 59294, 59295, 59142, 59143, 59144, 59145, 59146, + 59147, 59148, 59149, 59150, 59151, 59152, 59153, 59154, 59155, 59156, + 59157, 59158, 59159, 59160, 59161, 59162, 59163, 59164, 59165, 59166, + 59167, 59168, 59169, 59170, 59171, 59172, 59173, 59174, 59175, 59176, + 59177, 59178, 59179, 59180, 59181, 59182, 59183, 59184, 59185, 59186, + 59187, 59188, 59189, 59190, 59191, 59192, 59193, 59194, 59195, 59196, + 59197, 59198, 59199, 59200, 59201, 59202, 59203, 59204, 59205, 59206, + 59207, 59208, 59209, 59210, 59211, 59212, 59213, 59214, 59215, 59216, + 59217, 59218, 59219, 59220, 59221, 59222, 59223, 59224, 59225, 59226, + 59227, 59228, 59229, 59230, 59231, 59232, 59233, 59234, 59235, 59236, + 59237, 1040, 1041, 1042, 1043, 1044, 1045, 1025, 1046, 1047, 1048, 1049, + 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, + 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 59296, 59297, + 59298, 59299, 59300, 59301, 59302, 59303, 59304, 59305, 59306, 59307, + 59308, 59309, 59310, 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, 1079, + 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, + 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, + 59311, 59312, 59313, 59314, 59315, 59316, 59317, 59318, 59319, 59320, + 59321, 59322, 59323, 714, 715, 729, 8211, 8213, 8229, 8245, 8453, 8457, + 8598, 8599, 8600, 8601, 8725, 8735, 8739, 8786, 8806, 8807, 8895, 9552, + 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, + 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, + 9577, 9578, 9579, 9580, 9581, 9582, 9583, 9584, 9585, 9586, 9587, 9601, + 9602, 9603, 9604, 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, + 9614, 9615, 9619, 9620, 9621, 9660, 9661, 9698, 9699, 9700, 9701, 9737, + 8853, 12306, 12317, 12318, 59324, 59325, 59326, 59327, 59328, 59329, 59330, + 59331, 59332, 59333, 59334, 257, 225, 462, 224, 275, 233, 283, 232, 299, + 237, 464, 236, 333, 243, 466, 242, 363, 250, 468, 249, 470, 472, 474, 476, + 252, 234, 593, 59335, 324, 328, 505, 609, 59337, 59338, 59339, 59340, + 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, + 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, + 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, + 12579, 12580, 12581, 12582, 12583, 12584, 12585, 59341, 59342, 59343, + 59344, 59345, 59346, 59347, 59348, 59349, 59350, 59351, 59352, 59353, + 59354, 59355, 59356, 59357, 59358, 59359, 59360, 59361, 12321, 12322, + 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12963, 13198, 13199, + 13212, 13213, 13214, 13217, 13252, 13262, 13265, 13266, 13269, 65072, + 65506, 65508, 59362, 8481, 12849, 59363, 8208, 59364, 59365, 59366, 12540, + 12443, 12444, 12541, 12542, 12294, 12445, 12446, 65097, 65098, 65099, + 65100, 65101, 65102, 65103, 65104, 65105, 65106, 65108, 65109, 65110, + 65111, 65113, 65114, 65115, 65116, 65117, 65118, 65119, 65120, 65121, + 65122, 65123, 65124, 65125, 65126, 65128, 65129, 65130, 65131, 12350, + 12272, 12273, 12274, 12275, 12276, 12277, 12278, 12279, 12280, 12281, + 12282, 12283, 12295, 59380, 59381, 59382, 59383, 59384, 59385, 59386, + 59387, 59388, 59389, 59390, 59391, 59392, 9472, 9473, 9474, 9475, 9476, + 9477, 9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 9487, 9488, + 9489, 9490, 9491, 9492, 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, + 9501, 9502, 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, + 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, 9523, 9524, + 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, 9533, 9534, 9535, 9536, + 9537, 9538, 9539, 9540, 9541, 9542, 9543, 9544, 9545, 9546, 9547, 59393, + 59394, 59395, 59396, 59397, 59398, 59399, 59400, 59401, 59402, 59403, + 59404, 59405, 59406, 59407, 29404, 29405, 29407, 29410, 29411, 29412, + 29413, 29414, 29415, 29418, 29419, 29429, 29430, 29433, 29437, 29438, + 29439, 29440, 29442, 29444, 29445, 29446, 29447, 29448, 29449, 29451, + 29452, 29453, 29455, 29456, 29457, 29458, 29460, 29464, 29465, 29466, + 29471, 29472, 29475, 29476, 29478, 29479, 29480, 29485, 29487, 29488, + 29490, 29491, 29493, 29494, 29498, 29499, 29500, 29501, 29504, 29505, + 29506, 29507, 29508, 29509, 29510, 29511, 29512, 29513, 29514, 29515, + 29516, 29518, 29519, 29521, 29523, 29524, 29525, 29526, 29528, 29529, + 29530, 29531, 29532, 29533, 29534, 29535, 29537, 29538, 29539, 29540, + 29541, 29542, 29543, 29544, 29545, 29546, 29547, 29550, 29552, 29553, + 57344, 57345, 57346, 57347, 57348, 57349, 57350, 57351, 57352, 57353, + 57354, 57355, 57356, 57357, 57358, 57359, 57360, 57361, 57362, 57363, + 57364, 57365, 57366, 57367, 57368, 57369, 57370, 57371, 57372, 57373, + 57374, 57375, 57376, 57377, 57378, 57379, 57380, 57381, 57382, 57383, + 57384, 57385, 57386, 57387, 57388, 57389, 57390, 57391, 57392, 57393, + 57394, 57395, 57396, 57397, 57398, 57399, 57400, 57401, 57402, 57403, + 57404, 57405, 57406, 57407, 57408, 57409, 57410, 57411, 57412, 57413, + 57414, 57415, 57416, 57417, 57418, 57419, 57420, 57421, 57422, 57423, + 57424, 57425, 57426, 57427, 57428, 57429, 57430, 57431, 57432, 57433, + 57434, 57435, 57436, 57437, 29554, 29555, 29556, 29557, 29558, 29559, + 29560, 29561, 29562, 29563, 29564, 29565, 29567, 29568, 29569, 29570, + 29571, 29573, 29574, 29576, 29578, 29580, 29581, 29583, 29584, 29586, + 29587, 29588, 29589, 29591, 29592, 29593, 29594, 29596, 29597, 29598, + 29600, 29601, 29603, 29604, 29605, 29606, 29607, 29608, 29610, 29612, + 29613, 29617, 29620, 29621, 29622, 29624, 29625, 29628, 29629, 29630, + 29631, 29633, 29635, 29636, 29637, 29638, 29639, 29643, 29644, 29646, + 29650, 29651, 29652, 29653, 29654, 29655, 29656, 29658, 29659, 29660, + 29661, 29663, 29665, 29666, 29667, 29668, 29670, 29672, 29674, 29675, + 29676, 29678, 29679, 29680, 29681, 29683, 29684, 29685, 29686, 29687, + 57438, 57439, 57440, 57441, 57442, 57443, 57444, 57445, 57446, 57447, + 57448, 57449, 57450, 57451, 57452, 57453, 57454, 57455, 57456, 57457, + 57458, 57459, 57460, 57461, 57462, 57463, 57464, 57465, 57466, 57467, + 57468, 57469, 57470, 57471, 57472, 57473, 57474, 57475, 57476, 57477, + 57478, 57479, 57480, 57481, 57482, 57483, 57484, 57485, 57486, 57487, + 57488, 57489, 57490, 57491, 57492, 57493, 57494, 57495, 57496, 57497, + 57498, 57499, 57500, 57501, 57502, 57503, 57504, 57505, 57506, 57507, + 57508, 57509, 57510, 57511, 57512, 57513, 57514, 57515, 57516, 57517, + 57518, 57519, 57520, 57521, 57522, 57523, 57524, 57525, 57526, 57527, + 57528, 57529, 57530, 57531, 29688, 29689, 29690, 29691, 29692, 29693, + 29694, 29695, 29696, 29697, 29698, 29700, 29703, 29704, 29707, 29708, + 29709, 29710, 29713, 29714, 29715, 29716, 29717, 29718, 29719, 29720, + 29721, 29724, 29725, 29726, 29727, 29728, 29729, 29731, 29732, 29735, + 29737, 29739, 29741, 29743, 29745, 29746, 29751, 29752, 29753, 29754, + 29755, 29757, 29758, 29759, 29760, 29762, 29763, 29764, 29765, 29766, + 29767, 29768, 29769, 29770, 29771, 29772, 29773, 29774, 29775, 29776, + 29777, 29778, 29779, 29780, 29782, 29784, 29789, 29792, 29793, 29794, + 29795, 29796, 29797, 29798, 29799, 29800, 29801, 29802, 29803, 29804, + 29806, 29807, 29809, 29810, 29811, 29812, 29813, 29816, 29817, 29818, + 57532, 57533, 57534, 57535, 57536, 57537, 57538, 57539, 57540, 57541, + 57542, 57543, 57544, 57545, 57546, 57547, 57548, 57549, 57550, 57551, + 57552, 57553, 57554, 57555, 57556, 57557, 57558, 57559, 57560, 57561, + 57562, 57563, 57564, 57565, 57566, 57567, 57568, 57569, 57570, 57571, + 57572, 57573, 57574, 57575, 57576, 57577, 57578, 57579, 57580, 57581, + 57582, 57583, 57584, 57585, 57586, 57587, 57588, 57589, 57590, 57591, + 57592, 57593, 57594, 57595, 57596, 57597, 57598, 57599, 57600, 57601, + 57602, 57603, 57604, 57605, 57606, 57607, 57608, 57609, 57610, 57611, + 57612, 57613, 57614, 57615, 57616, 57617, 57618, 57619, 57620, 57621, + 57622, 57623, 57624, 57625, 29819, 29820, 29821, 29823, 29826, 29828, + 29829, 29830, 29832, 29833, 29834, 29836, 29837, 29839, 29841, 29842, + 29843, 29844, 29845, 29846, 29847, 29848, 29849, 29850, 29851, 29853, + 29855, 29856, 29857, 29858, 29859, 29860, 29861, 29862, 29866, 29867, + 29868, 29869, 29870, 29871, 29872, 29873, 29874, 29875, 29876, 29877, + 29878, 29879, 29880, 29881, 29883, 29884, 29885, 29886, 29887, 29888, + 29889, 29890, 29891, 29892, 29893, 29894, 29895, 29896, 29897, 29898, + 29899, 29900, 29901, 29902, 29903, 29904, 29905, 29907, 29908, 29909, + 29910, 29911, 29912, 29913, 29914, 29915, 29917, 29919, 29921, 29925, + 29927, 29928, 29929, 29930, 29931, 29932, 29933, 29936, 29937, 29938, + 57626, 57627, 57628, 57629, 57630, 57631, 57632, 57633, 57634, 57635, + 57636, 57637, 57638, 57639, 57640, 57641, 57642, 57643, 57644, 57645, + 57646, 57647, 57648, 57649, 57650, 57651, 57652, 57653, 57654, 57655, + 57656, 57657, 57658, 57659, 57660, 57661, 57662, 57663, 57664, 57665, + 57666, 57667, 57668, 57669, 57670, 57671, 57672, 57673, 57674, 57675, + 57676, 57677, 57678, 57679, 57680, 57681, 57682, 57683, 57684, 57685, + 57686, 57687, 57688, 57689, 57690, 57691, 57692, 57693, 57694, 57695, + 57696, 57697, 57698, 57699, 57700, 57701, 57702, 57703, 57704, 57705, + 57706, 57707, 57708, 57709, 57710, 57711, 57712, 57713, 57714, 57715, + 57716, 57717, 57718, 57719, 29939, 29941, 29944, 29945, 29946, 29947, + 29948, 29949, 29950, 29952, 29953, 29954, 29955, 29957, 29958, 29959, + 29960, 29961, 29962, 29963, 29964, 29966, 29968, 29970, 29972, 29973, + 29974, 29975, 29979, 29981, 29982, 29984, 29985, 29986, 29987, 29988, + 29990, 29991, 29994, 29998, 30004, 30006, 30009, 30012, 30013, 30015, + 30017, 30018, 30019, 30020, 30022, 30023, 30025, 30026, 30029, 30032, + 30033, 30034, 30035, 30037, 30038, 30039, 30040, 30045, 30046, 30047, + 30048, 30049, 30050, 30051, 30052, 30055, 30056, 30057, 30059, 30060, + 30061, 30062, 30063, 30064, 30065, 30067, 30069, 30070, 30071, 30074, + 30075, 30076, 30077, 30078, 30080, 30081, 30082, 30084, 30085, 30087, + 57720, 57721, 57722, 57723, 57724, 57725, 57726, 57727, 57728, 57729, + 57730, 57731, 57732, 57733, 57734, 57735, 57736, 57737, 57738, 57739, + 57740, 57741, 57742, 57743, 57744, 57745, 57746, 57747, 57748, 57749, + 57750, 57751, 57752, 57753, 57754, 57755, 57756, 57757, 57758, 57759, + 57760, 57761, 57762, 57763, 57764, 57765, 57766, 57767, 57768, 57769, + 57770, 57771, 57772, 57773, 57774, 57775, 57776, 57777, 57778, 57779, + 57780, 57781, 57782, 57783, 57784, 57785, 57786, 57787, 57788, 57789, + 57790, 57791, 57792, 57793, 57794, 57795, 57796, 57797, 57798, 57799, + 57800, 57801, 57802, 57803, 57804, 57805, 57806, 57807, 57808, 57809, + 57810, 57811, 57812, 57813, 30088, 30089, 30090, 30092, 30093, 30094, + 30096, 30099, 30101, 30104, 30107, 30108, 30110, 30114, 30118, 30119, + 30120, 30121, 30122, 30125, 30134, 30135, 30138, 30139, 30143, 30144, + 30145, 30150, 30155, 30156, 30158, 30159, 30160, 30161, 30163, 30167, + 30169, 30170, 30172, 30173, 30175, 30176, 30177, 30181, 30185, 30188, + 30189, 30190, 30191, 30194, 30195, 30197, 30198, 30199, 30200, 30202, + 30203, 30205, 30206, 30210, 30212, 30214, 30215, 30216, 30217, 30219, + 30221, 30222, 30223, 30225, 30226, 30227, 30228, 30230, 30234, 30236, + 30237, 30238, 30241, 30243, 30247, 30248, 30252, 30254, 30255, 30257, + 30258, 30262, 30263, 30265, 30266, 30267, 30269, 30273, 30274, 30276, + 57814, 57815, 57816, 57817, 57818, 57819, 57820, 57821, 57822, 57823, + 57824, 57825, 57826, 57827, 57828, 57829, 57830, 57831, 57832, 57833, + 57834, 57835, 57836, 57837, 57838, 57839, 57840, 57841, 57842, 57843, + 57844, 57845, 57846, 57847, 57848, 57849, 57850, 57851, 57852, 57853, + 57854, 57855, 57856, 57857, 57858, 57859, 57860, 57861, 57862, 57863, + 57864, 57865, 57866, 57867, 57868, 57869, 57870, 57871, 57872, 57873, + 57874, 57875, 57876, 57877, 57878, 57879, 57880, 57881, 57882, 57883, + 57884, 57885, 57886, 57887, 57888, 57889, 57890, 57891, 57892, 57893, + 57894, 57895, 57896, 57897, 57898, 57899, 57900, 57901, 57902, 57903, + 57904, 57905, 57906, 57907, 30277, 30278, 30279, 30280, 30281, 30282, + 30283, 30286, 30287, 30288, 30289, 30290, 30291, 30293, 30295, 30296, + 30297, 30298, 30299, 30301, 30303, 30304, 30305, 30306, 30308, 30309, + 30310, 30311, 30312, 30313, 30314, 30316, 30317, 30318, 30320, 30321, + 30322, 30323, 30324, 30325, 30326, 30327, 30329, 30330, 30332, 30335, + 30336, 30337, 30339, 30341, 30345, 30346, 30348, 30349, 30351, 30352, + 30354, 30356, 30357, 30359, 30360, 30362, 30363, 30364, 30365, 30366, + 30367, 30368, 30369, 30370, 30371, 30373, 30374, 30375, 30376, 30377, + 30378, 30379, 30380, 30381, 30383, 30384, 30387, 30389, 30390, 30391, + 30392, 30393, 30394, 30395, 30396, 30397, 30398, 30400, 30401, 30403, + 21834, 38463, 22467, 25384, 21710, 21769, 21696, 30353, 30284, 34108, + 30702, 33406, 30861, 29233, 38552, 38797, 27688, 23433, 20474, 25353, + 26263, 23736, 33018, 26696, 32942, 26114, 30414, 20985, 25942, 29100, + 32753, 34948, 20658, 22885, 25034, 28595, 33453, 25420, 25170, 21485, + 21543, 31494, 20843, 30116, 24052, 25300, 36299, 38774, 25226, 32793, + 22365, 38712, 32610, 29240, 30333, 26575, 30334, 25670, 20336, 36133, + 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256, + 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758, + 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502, + 32990, 21253, 35090, 21093, 30404, 30407, 30409, 30411, 30412, 30419, + 30421, 30425, 30426, 30428, 30429, 30430, 30432, 30433, 30434, 30435, + 30436, 30438, 30439, 30440, 30441, 30442, 30443, 30444, 30445, 30448, + 30451, 30453, 30454, 30455, 30458, 30459, 30461, 30463, 30464, 30466, + 30467, 30469, 30470, 30474, 30476, 30478, 30479, 30480, 30481, 30482, + 30483, 30484, 30485, 30486, 30487, 30488, 30491, 30492, 30493, 30494, + 30497, 30499, 30500, 30501, 30503, 30506, 30507, 30508, 30510, 30512, + 30513, 30514, 30515, 30516, 30521, 30523, 30525, 30526, 30527, 30530, + 30532, 30533, 30534, 30536, 30537, 30538, 30539, 30540, 30541, 30542, + 30543, 30546, 30547, 30548, 30549, 30550, 30551, 30552, 30553, 30556, + 34180, 38649, 20445, 22561, 39281, 23453, 25265, 25253, 26292, 35961, + 40077, 29190, 26479, 30865, 24754, 21329, 21271, 36744, 32972, 36125, + 38049, 20493, 29384, 22791, 24811, 28953, 34987, 22868, 33519, 26412, + 31528, 23849, 32503, 29997, 27893, 36454, 36856, 36924, 40763, 27604, + 37145, 31508, 24444, 30887, 34006, 34109, 27605, 27609, 27606, 24065, + 24199, 30201, 38381, 25949, 24330, 24517, 36767, 22721, 33218, 36991, + 38491, 38829, 36793, 32534, 36140, 25153, 20415, 21464, 21342, 36776, + 36777, 36779, 36941, 26631, 24426, 33176, 34920, 40150, 24971, 21035, + 30250, 24428, 25996, 28626, 28392, 23486, 25672, 20853, 20912, 26564, + 19993, 31177, 39292, 28851, 30557, 30558, 30559, 30560, 30564, 30567, + 30569, 30570, 30573, 30574, 30575, 30576, 30577, 30578, 30579, 30580, + 30581, 30582, 30583, 30584, 30586, 30587, 30588, 30593, 30594, 30595, + 30598, 30599, 30600, 30601, 30602, 30603, 30607, 30608, 30611, 30612, + 30613, 30614, 30615, 30616, 30617, 30618, 30619, 30620, 30621, 30622, + 30625, 30627, 30628, 30630, 30632, 30635, 30637, 30638, 30639, 30641, + 30642, 30644, 30646, 30647, 30648, 30649, 30650, 30652, 30654, 30656, + 30657, 30658, 30659, 30660, 30661, 30662, 30663, 30664, 30665, 30666, + 30667, 30668, 30670, 30671, 30672, 30673, 30674, 30675, 30676, 30677, + 30678, 30680, 30681, 30682, 30685, 30686, 30687, 30688, 30689, 30692, + 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187, + 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850, + 39539, 25429, 21340, 21754, 34917, 22496, 19981, 24067, 27493, 31807, + 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572, 36393, + 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813, 24808, + 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133, 26361, + 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554, 21449, + 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815, 25286, + 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130, 20135, + 38416, 39076, 26124, 29462, 30694, 30696, 30698, 30703, 30704, 30705, + 30706, 30708, 30709, 30711, 30713, 30714, 30715, 30716, 30723, 30724, + 30725, 30726, 30727, 30728, 30730, 30731, 30734, 30735, 30736, 30739, + 30741, 30745, 30747, 30750, 30752, 30753, 30754, 30756, 30760, 30762, + 30763, 30766, 30767, 30769, 30770, 30771, 30773, 30774, 30781, 30783, + 30785, 30786, 30787, 30788, 30790, 30792, 30793, 30794, 30795, 30797, + 30799, 30801, 30803, 30804, 30808, 30809, 30810, 30811, 30812, 30814, + 30815, 30816, 30817, 30818, 30819, 30820, 30821, 30822, 30823, 30824, + 30825, 30831, 30832, 30833, 30834, 30835, 30836, 30837, 30838, 30840, + 30841, 30842, 30843, 30845, 30846, 30847, 30848, 30849, 30850, 30851, + 22330, 23581, 24120, 38271, 20607, 32928, 21378, 25950, 30021, 21809, + 20513, 36229, 25220, 38046, 26397, 22066, 28526, 24034, 21557, 28818, + 36710, 25199, 25764, 25507, 24443, 28552, 37108, 33251, 36784, 23576, + 26216, 24561, 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, + 25104, 21576, 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, + 31204, 21507, 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, + 40831, 20360, 23610, 36196, 32709, 26021, 28861, 20805, 20914, 34411, + 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167, + 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148, + 38607, 28353, 38500, 26970, 30852, 30853, 30854, 30856, 30858, 30859, + 30863, 30864, 30866, 30868, 30869, 30870, 30873, 30877, 30878, 30880, + 30882, 30884, 30886, 30888, 30889, 30890, 30891, 30892, 30893, 30894, + 30895, 30901, 30902, 30903, 30904, 30906, 30907, 30908, 30909, 30911, + 30912, 30914, 30915, 30916, 30918, 30919, 30920, 30924, 30925, 30926, + 30927, 30929, 30930, 30931, 30934, 30935, 30936, 30938, 30939, 30940, + 30941, 30942, 30943, 30944, 30945, 30946, 30947, 30948, 30949, 30950, + 30951, 30953, 30954, 30955, 30957, 30958, 30959, 30960, 30961, 30963, + 30965, 30966, 30968, 30969, 30971, 30972, 30973, 30974, 30975, 30976, + 30978, 30979, 30980, 30982, 30983, 30984, 30985, 30986, 30987, 30988, + 30784, 20648, 30679, 25616, 35302, 22788, 25571, 24029, 31359, 26941, + 20256, 33337, 21912, 20018, 30126, 31383, 24162, 24202, 38383, 21019, + 21561, 28810, 25462, 38180, 22402, 26149, 26943, 37255, 21767, 28147, + 32431, 34850, 25139, 32496, 30133, 33576, 30913, 38604, 36766, 24904, + 29943, 35789, 27492, 21050, 36176, 27425, 32874, 33905, 22257, 21254, + 20174, 19995, 20945, 31895, 37259, 31751, 20419, 36479, 31713, 31388, + 25703, 23828, 20652, 33030, 30209, 31929, 28140, 32736, 26449, 23384, + 23544, 30923, 25774, 25619, 25514, 25387, 38169, 25645, 36798, 31572, + 30249, 25171, 22823, 21574, 27513, 20643, 25140, 24102, 27526, 20195, + 36151, 34955, 24453, 36910, 30989, 30990, 30991, 30992, 30993, 30994, + 30996, 30997, 30998, 30999, 31000, 31001, 31002, 31003, 31004, 31005, + 31007, 31008, 31009, 31010, 31011, 31013, 31014, 31015, 31016, 31017, + 31018, 31019, 31020, 31021, 31022, 31023, 31024, 31025, 31026, 31027, + 31029, 31030, 31031, 31032, 31033, 31037, 31039, 31042, 31043, 31044, + 31045, 31047, 31050, 31051, 31052, 31053, 31054, 31055, 31056, 31057, + 31058, 31060, 31061, 31064, 31065, 31073, 31075, 31076, 31078, 31081, + 31082, 31083, 31084, 31086, 31088, 31089, 31090, 31091, 31092, 31093, + 31094, 31097, 31099, 31100, 31101, 31102, 31103, 31106, 31107, 31110, + 31111, 31112, 31113, 31115, 31116, 31117, 31118, 31120, 31121, 31122, + 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086, 27694, + 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826, 33633, + 26723, 20992, 25443, 36424, 20498, 23707, 31095, 23548, 21040, 31291, + 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783, 30331, 31561, + 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932, 31515, 29380, + 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532, 24093, 24351, + 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856, 38747, 22443, + 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583, 30857, 21500, + 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300, 29241, 30879, + 34678, 36845, 35853, 21472, 31123, 31124, 31125, 31126, 31127, 31128, + 31129, 31131, 31132, 31133, 31134, 31135, 31136, 31137, 31138, 31139, + 31140, 31141, 31142, 31144, 31145, 31146, 31147, 31148, 31149, 31150, + 31151, 31152, 31153, 31154, 31156, 31157, 31158, 31159, 31160, 31164, + 31167, 31170, 31172, 31173, 31175, 31176, 31178, 31180, 31182, 31183, + 31184, 31187, 31188, 31190, 31191, 31193, 31194, 31195, 31196, 31197, + 31198, 31200, 31201, 31202, 31205, 31208, 31210, 31212, 31214, 31217, + 31218, 31219, 31220, 31221, 31222, 31223, 31225, 31226, 31228, 31230, + 31231, 31233, 31236, 31237, 31239, 31240, 31241, 31242, 31244, 31247, + 31248, 31249, 31250, 31251, 31253, 31254, 31256, 31257, 31259, 31260, + 19969, 30447, 21486, 38025, 39030, 40718, 38189, 23450, 35746, 20002, + 19996, 20908, 33891, 25026, 21160, 26635, 20375, 24683, 20923, 27934, + 20828, 25238, 26007, 38497, 35910, 36887, 30168, 37117, 30563, 27602, + 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230, + 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817, + 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462, + 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333, + 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077, + 24694, 21380, 25212, 36943, 37122, 39295, 24681, 32780, 20799, 32819, + 23572, 39285, 27953, 20108, 31261, 31263, 31265, 31266, 31268, 31269, + 31270, 31271, 31272, 31273, 31274, 31275, 31276, 31277, 31278, 31279, + 31280, 31281, 31282, 31284, 31285, 31286, 31288, 31290, 31294, 31296, + 31297, 31298, 31299, 31300, 31301, 31303, 31304, 31305, 31306, 31307, + 31308, 31309, 31310, 31311, 31312, 31314, 31315, 31316, 31317, 31318, + 31320, 31321, 31322, 31323, 31324, 31325, 31326, 31327, 31328, 31329, + 31330, 31331, 31332, 31333, 31334, 31335, 31336, 31337, 31338, 31339, + 31340, 31341, 31342, 31343, 31345, 31346, 31347, 31349, 31355, 31356, + 31357, 31358, 31362, 31365, 31367, 31369, 31370, 31371, 31372, 31374, + 31375, 31376, 31379, 31380, 31385, 31386, 31387, 31390, 31393, 31394, + 36144, 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, + 24070, 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, + 36820, 33539, 36137, 29359, 39277, 27867, 22346, 33459, 26041, 32938, + 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, 38750, 21857, + 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153, 33452, + 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881, 22859, + 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792, 38155, + 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964, 20315, + 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133, 27679, + 31526, 20239, 20440, 26381, 31395, 31396, 31399, 31401, 31402, 31403, + 31406, 31407, 31408, 31409, 31410, 31412, 31413, 31414, 31415, 31416, + 31417, 31418, 31419, 31420, 31421, 31422, 31424, 31425, 31426, 31427, + 31428, 31429, 31430, 31431, 31432, 31433, 31434, 31436, 31437, 31438, + 31439, 31440, 31441, 31442, 31443, 31444, 31445, 31447, 31448, 31450, + 31451, 31452, 31453, 31457, 31458, 31460, 31463, 31464, 31465, 31466, + 31467, 31468, 31470, 31472, 31473, 31474, 31475, 31476, 31477, 31478, + 31479, 31480, 31483, 31484, 31486, 31488, 31489, 31490, 31493, 31495, + 31497, 31500, 31501, 31502, 31504, 31506, 31507, 31510, 31511, 31512, + 31514, 31516, 31517, 31519, 31521, 31522, 31523, 31527, 31529, 31533, + 28014, 28074, 31119, 34993, 24343, 29995, 25242, 36741, 20463, 37340, + 26023, 33071, 33105, 24220, 33104, 36212, 21103, 35206, 36171, 22797, + 20613, 20184, 38428, 29238, 33145, 36127, 23500, 35747, 38468, 22919, + 32538, 21648, 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, + 24178, 29976, 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954, + 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464, + 31705, 30347, 39640, 33167, 32660, 31957, 25630, 38224, 31295, 21578, + 21733, 27468, 25601, 25096, 40509, 33011, 30105, 21106, 38761, 33883, + 26684, 34532, 38401, 38548, 38124, 20010, 21508, 32473, 26681, 36319, + 32789, 26356, 24218, 32697, 31535, 31536, 31538, 31540, 31541, 31542, + 31543, 31545, 31547, 31549, 31551, 31552, 31553, 31554, 31555, 31556, + 31558, 31560, 31562, 31565, 31566, 31571, 31573, 31575, 31577, 31580, + 31582, 31583, 31585, 31587, 31588, 31589, 31590, 31591, 31592, 31593, + 31594, 31595, 31596, 31597, 31599, 31600, 31603, 31604, 31606, 31608, + 31610, 31612, 31613, 31615, 31617, 31618, 31619, 31620, 31622, 31623, + 31624, 31625, 31626, 31627, 31628, 31630, 31631, 31633, 31634, 31635, + 31638, 31640, 31641, 31642, 31643, 31646, 31647, 31648, 31651, 31652, + 31653, 31662, 31663, 31664, 31666, 31667, 31669, 31670, 31671, 31673, + 31674, 31675, 31676, 31677, 31678, 31679, 31680, 31682, 31683, 31684, + 22466, 32831, 26775, 24037, 25915, 21151, 24685, 40858, 20379, 36524, + 20844, 23467, 24339, 24041, 27742, 25329, 36129, 20849, 38057, 21246, + 27807, 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, + 31629, 20272, 27837, 23396, 22993, 40723, 21476, 34506, 39592, 35895, + 32929, 25925, 39038, 22266, 38599, 21038, 29916, 21072, 23521, 25346, + 35074, 20054, 25296, 24618, 26874, 20851, 23448, 20896, 35266, 31649, + 39302, 32592, 24815, 28748, 36143, 20809, 24191, 36891, 29808, 35268, + 22317, 30789, 24402, 40863, 38394, 36712, 39740, 35809, 30328, 26690, + 26588, 36330, 36149, 21053, 36746, 28378, 26829, 38149, 37101, 22269, + 26524, 35065, 36807, 21704, 31685, 31688, 31689, 31690, 31691, 31693, + 31694, 31695, 31696, 31698, 31700, 31701, 31702, 31703, 31704, 31707, + 31708, 31710, 31711, 31712, 31714, 31715, 31716, 31719, 31720, 31721, + 31723, 31724, 31725, 31727, 31728, 31730, 31731, 31732, 31733, 31734, + 31736, 31737, 31738, 31739, 31741, 31743, 31744, 31745, 31746, 31747, + 31748, 31749, 31750, 31752, 31753, 31754, 31757, 31758, 31760, 31761, + 31762, 31763, 31764, 31765, 31767, 31768, 31769, 31770, 31771, 31772, + 31773, 31774, 31776, 31777, 31778, 31779, 31780, 31781, 31784, 31785, + 31787, 31788, 31789, 31790, 31791, 31792, 31793, 31794, 31795, 31796, + 31797, 31798, 31799, 31801, 31802, 31803, 31804, 31805, 31806, 31810, + 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039, + 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421, + 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741, + 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917, + 33655, 33743, 26680, 31166, 21644, 20309, 21512, 30418, 35977, 38402, + 27827, 28088, 36203, 35088, 40548, 36154, 22079, 40657, 30165, 24456, + 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720, 21700, 28888, + 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399, 29492, 21564, + 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774, 33899, 32993, + 34676, 29392, 31946, 28246, 31811, 31812, 31813, 31814, 31815, 31816, + 31817, 31818, 31819, 31820, 31822, 31823, 31824, 31825, 31826, 31827, + 31828, 31829, 31830, 31831, 31832, 31833, 31834, 31835, 31836, 31837, + 31838, 31839, 31840, 31841, 31842, 31843, 31844, 31845, 31846, 31847, + 31848, 31849, 31850, 31851, 31852, 31853, 31854, 31855, 31856, 31857, + 31858, 31861, 31862, 31863, 31864, 31865, 31866, 31870, 31871, 31872, + 31873, 31874, 31875, 31876, 31877, 31878, 31879, 31880, 31882, 31883, + 31884, 31885, 31886, 31887, 31888, 31891, 31892, 31894, 31897, 31898, + 31899, 31904, 31905, 31907, 31910, 31911, 31912, 31913, 31915, 31916, + 31917, 31919, 31920, 31924, 31925, 31926, 31927, 31928, 31930, 31931, + 24359, 34382, 21804, 25252, 20114, 27818, 25143, 33457, 21719, 21326, + 29502, 28369, 30011, 21010, 21270, 35805, 27088, 24458, 24576, 28142, + 22351, 27426, 29615, 26707, 36824, 32531, 25442, 24739, 21796, 30186, + 35938, 28949, 28067, 23462, 24187, 33618, 24908, 40644, 30970, 34647, + 31783, 30343, 20976, 24822, 29004, 26179, 24140, 24653, 35854, 28784, + 25381, 36745, 24509, 24674, 34516, 22238, 27585, 24724, 24935, 21321, + 24800, 26214, 36159, 31229, 20250, 28905, 27719, 35763, 35826, 32472, + 33636, 26127, 23130, 39746, 27985, 28151, 35905, 27963, 20249, 28779, + 33719, 25110, 24785, 38669, 36135, 31096, 20987, 22334, 22522, 26426, + 30072, 31293, 31215, 31637, 31935, 31936, 31938, 31939, 31940, 31942, + 31945, 31947, 31950, 31951, 31952, 31953, 31954, 31955, 31956, 31960, + 31962, 31963, 31965, 31966, 31969, 31970, 31971, 31972, 31973, 31974, + 31975, 31977, 31978, 31979, 31980, 31981, 31982, 31984, 31985, 31986, + 31987, 31988, 31989, 31990, 31991, 31993, 31994, 31996, 31997, 31998, + 31999, 32000, 32001, 32002, 32003, 32004, 32005, 32006, 32007, 32008, + 32009, 32011, 32012, 32013, 32014, 32015, 32016, 32017, 32018, 32019, + 32020, 32021, 32022, 32023, 32024, 32025, 32026, 32027, 32028, 32029, + 32030, 32031, 32033, 32035, 32036, 32037, 32038, 32040, 32041, 32042, + 32044, 32045, 32046, 32048, 32049, 32050, 32051, 32052, 32053, 32054, + 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521, 21513, + 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762, 21363, + 23241, 32423, 25380, 20960, 33034, 24049, 34015, 25216, 20864, 23395, + 20238, 31085, 21058, 24760, 27982, 23492, 23490, 35745, 35760, 26082, + 24524, 38469, 22931, 32487, 32426, 22025, 26551, 22841, 20339, 23478, + 21152, 33626, 39050, 36158, 30002, 38078, 20551, 31292, 20215, 26550, + 39550, 23233, 27516, 30417, 22362, 23574, 31546, 38388, 29006, 20860, + 32937, 33392, 22904, 32516, 33575, 26816, 26604, 30897, 30839, 25315, + 25441, 31616, 20461, 21098, 20943, 33616, 27099, 37492, 36341, 36145, + 35265, 38190, 31661, 20214, 32055, 32056, 32057, 32058, 32059, 32060, + 32061, 32062, 32063, 32064, 32065, 32066, 32067, 32068, 32069, 32070, + 32071, 32072, 32073, 32074, 32075, 32076, 32077, 32078, 32079, 32080, + 32081, 32082, 32083, 32084, 32085, 32086, 32087, 32088, 32089, 32090, + 32091, 32092, 32093, 32094, 32095, 32096, 32097, 32098, 32099, 32100, + 32101, 32102, 32103, 32104, 32105, 32106, 32107, 32108, 32109, 32111, + 32112, 32113, 32114, 32115, 32116, 32117, 32118, 32120, 32121, 32122, + 32123, 32124, 32125, 32126, 32127, 32128, 32129, 32130, 32131, 32132, + 32133, 32134, 32135, 32136, 32137, 32138, 32139, 32140, 32141, 32142, + 32143, 32144, 32145, 32146, 32147, 32148, 32149, 32150, 32151, 32152, + 20581, 33328, 21073, 39279, 28176, 28293, 28071, 24314, 20725, 23004, + 23558, 27974, 27743, 30086, 33931, 26728, 22870, 35762, 21280, 37233, + 38477, 34121, 26898, 30977, 28966, 33014, 20132, 37066, 27975, 39556, + 23047, 22204, 25605, 38128, 30699, 20389, 33050, 29409, 35282, 39290, + 32564, 32478, 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, + 25509, 30342, 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, + 25463, 30571, 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, + 30028, 20511, 20171, 30117, 35819, 23626, 24062, 31563, 26020, 37329, + 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827, 38771, 26187, + 31105, 36817, 28908, 28024, 32153, 32154, 32155, 32156, 32157, 32158, + 32159, 32160, 32161, 32162, 32163, 32164, 32165, 32167, 32168, 32169, + 32170, 32171, 32172, 32173, 32175, 32176, 32177, 32178, 32179, 32180, + 32181, 32182, 32183, 32184, 32185, 32186, 32187, 32188, 32189, 32190, + 32191, 32192, 32193, 32194, 32195, 32196, 32197, 32198, 32199, 32200, + 32201, 32202, 32203, 32204, 32205, 32206, 32207, 32208, 32209, 32210, + 32211, 32212, 32213, 32214, 32215, 32216, 32217, 32218, 32219, 32220, + 32221, 32222, 32223, 32224, 32225, 32226, 32227, 32228, 32229, 32230, + 32231, 32232, 32233, 32234, 32235, 32236, 32237, 32238, 32239, 32240, + 32241, 32242, 32243, 32244, 32245, 32246, 32247, 32248, 32249, 32250, + 23613, 21170, 33606, 20834, 33550, 30555, 26230, 40120, 20140, 24778, + 31934, 31923, 32463, 20117, 35686, 26223, 39048, 38745, 22659, 25964, + 38236, 24452, 30153, 38742, 31455, 31454, 20928, 28847, 31384, 25578, + 31350, 32416, 29590, 38893, 20037, 28792, 20061, 37202, 21417, 25937, + 26087, 33276, 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141, + 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298, + 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844, + 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899, + 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740, + 38055, 20891, 21531, 23803, 32251, 32252, 32253, 32254, 32255, 32256, + 32257, 32258, 32259, 32260, 32261, 32262, 32263, 32264, 32265, 32266, + 32267, 32268, 32269, 32270, 32271, 32272, 32273, 32274, 32275, 32276, + 32277, 32278, 32279, 32280, 32281, 32282, 32283, 32284, 32285, 32286, + 32287, 32288, 32289, 32290, 32291, 32292, 32293, 32294, 32295, 32296, + 32297, 32298, 32299, 32300, 32301, 32302, 32303, 32304, 32305, 32306, + 32307, 32308, 32309, 32310, 32311, 32312, 32313, 32314, 32316, 32317, + 32318, 32319, 32320, 32322, 32323, 32324, 32325, 32326, 32328, 32329, + 32330, 32331, 32332, 32333, 32334, 32335, 32336, 32337, 32338, 32339, + 32340, 32341, 32342, 32343, 32344, 32345, 32346, 32347, 32348, 32349, + 20426, 31459, 27994, 37089, 39567, 21888, 21654, 21345, 21679, 24320, + 25577, 26999, 20975, 24936, 21002, 22570, 21208, 22350, 30733, 30475, + 24247, 24951, 31968, 25179, 25239, 20130, 28821, 32771, 25335, 28900, + 38752, 22391, 33499, 26607, 26869, 30933, 39063, 31185, 22771, 21683, + 21487, 28212, 20811, 21051, 23458, 35838, 32943, 21827, 22438, 24691, + 22353, 21549, 31354, 24656, 23380, 25511, 25248, 21475, 25187, 23495, + 26543, 21741, 31391, 33510, 37239, 24211, 35044, 22840, 22446, 25358, + 36328, 33007, 22359, 31607, 20393, 24555, 23485, 27454, 21281, 31568, + 29378, 26694, 30719, 30518, 26103, 20917, 20111, 30420, 23743, 31397, + 33909, 22862, 39745, 20608, 32350, 32351, 32352, 32353, 32354, 32355, + 32356, 32357, 32358, 32359, 32360, 32361, 32362, 32363, 32364, 32365, + 32366, 32367, 32368, 32369, 32370, 32371, 32372, 32373, 32374, 32375, + 32376, 32377, 32378, 32379, 32380, 32381, 32382, 32383, 32384, 32385, + 32387, 32388, 32389, 32390, 32391, 32392, 32393, 32394, 32395, 32396, + 32397, 32398, 32399, 32400, 32401, 32402, 32403, 32404, 32405, 32406, + 32407, 32408, 32409, 32410, 32412, 32413, 32414, 32430, 32436, 32443, + 32444, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567, 32569, + 32571, 32572, 32573, 32574, 32575, 32576, 32577, 32579, 32582, 32583, + 32584, 32585, 32586, 32587, 32588, 32589, 32590, 32591, 32594, 32595, + 39304, 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, + 38420, 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, + 36182, 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, + 25597, 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, + 37070, 26391, 28010, 25438, 21171, 29282, 32769, 20332, 23013, 37226, + 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769, + 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792, + 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, 37324, 40100, + 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782, 21382, + 21033, 20616, 20363, 20432, 32598, 32601, 32603, 32604, 32605, 32606, + 32608, 32611, 32612, 32613, 32614, 32615, 32619, 32620, 32621, 32623, + 32624, 32627, 32629, 32630, 32631, 32632, 32634, 32635, 32636, 32637, + 32639, 32640, 32642, 32643, 32644, 32645, 32646, 32647, 32648, 32649, + 32651, 32653, 32655, 32656, 32657, 32658, 32659, 32661, 32662, 32663, + 32664, 32665, 32667, 32668, 32672, 32674, 32675, 32677, 32678, 32680, + 32681, 32682, 32683, 32684, 32685, 32686, 32689, 32691, 32692, 32693, + 32694, 32695, 32698, 32699, 32702, 32704, 32706, 32707, 32708, 32710, + 32711, 32712, 32713, 32715, 32717, 32719, 32720, 32721, 32722, 32723, + 32726, 32727, 32729, 32730, 32731, 32732, 32733, 32734, 32738, 32739, + 30178, 31435, 31890, 27813, 38582, 21147, 29827, 21737, 20457, 32852, + 33714, 36830, 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, + 24651, 28860, 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, + 37327, 26238, 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, + 36797, 28518, 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, + 21155, 29454, 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, + 20955, 36161, 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, + 32666, 20940, 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, + 27060, 30827, 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, + 32843, 21657, 31548, 31423, 32740, 32743, 32744, 32746, 32747, 32748, + 32749, 32751, 32754, 32756, 32757, 32758, 32759, 32760, 32761, 32762, + 32765, 32766, 32767, 32770, 32775, 32776, 32777, 32778, 32782, 32783, + 32785, 32787, 32794, 32795, 32797, 32798, 32799, 32801, 32803, 32804, + 32811, 32812, 32813, 32814, 32815, 32816, 32818, 32820, 32825, 32826, + 32828, 32830, 32832, 32833, 32836, 32837, 32839, 32840, 32841, 32846, + 32847, 32848, 32849, 32851, 32853, 32854, 32855, 32857, 32859, 32860, + 32861, 32862, 32863, 32864, 32865, 32866, 32867, 32868, 32869, 32870, + 32871, 32872, 32875, 32876, 32877, 32878, 32879, 32880, 32882, 32883, + 32884, 32885, 32886, 32887, 32888, 32889, 32890, 32891, 32892, 32893, + 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699, 28431, 38475, + 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383, 40065, 40595, + 30860, 38706, 36335, 36162, 40575, 28510, 31108, 24405, 38470, 25134, + 39540, 21525, 38109, 20387, 26053, 23653, 23649, 32533, 34385, 27695, + 24459, 29575, 28388, 32511, 23782, 25371, 23402, 28390, 21365, 20081, + 25504, 30053, 25249, 36718, 20262, 20177, 27814, 32438, 35770, 33821, + 34746, 32599, 36923, 38179, 31657, 39585, 35064, 33853, 27931, 39558, + 32476, 22920, 40635, 29595, 30721, 34434, 39532, 39554, 22043, 21527, + 22475, 20080, 40614, 21334, 36808, 33033, 30610, 39314, 34542, 28385, + 34067, 26364, 24930, 28459, 32894, 32897, 32898, 32901, 32904, 32906, + 32909, 32910, 32911, 32912, 32913, 32914, 32916, 32917, 32919, 32921, + 32926, 32931, 32934, 32935, 32936, 32940, 32944, 32947, 32949, 32950, + 32952, 32953, 32955, 32965, 32967, 32968, 32969, 32970, 32971, 32975, + 32976, 32977, 32978, 32979, 32980, 32981, 32984, 32991, 32992, 32994, + 32995, 32998, 33006, 33013, 33015, 33017, 33019, 33022, 33023, 33024, + 33025, 33027, 33028, 33029, 33031, 33032, 33035, 33036, 33045, 33047, + 33049, 33051, 33052, 33053, 33055, 33056, 33057, 33058, 33059, 33060, + 33061, 33062, 33063, 33064, 33065, 33066, 33067, 33069, 33070, 33072, + 33075, 33076, 33077, 33079, 33081, 33082, 33083, 33084, 33085, 33087, + 35881, 33426, 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, + 27611, 30683, 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040, + 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209, + 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804, + 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753, + 31964, 36855, 35868, 24357, 31859, 31192, 35269, 27852, 34588, 23494, + 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517, 38754, + 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937, 34065, 28781, + 27665, 25279, 30399, 25935, 24751, 38397, 26126, 34719, 40483, 38125, + 21517, 21629, 35884, 25720, 33088, 33089, 33090, 33091, 33092, 33093, + 33095, 33097, 33101, 33102, 33103, 33106, 33110, 33111, 33112, 33115, + 33116, 33117, 33118, 33119, 33121, 33122, 33123, 33124, 33126, 33128, + 33130, 33131, 33132, 33135, 33138, 33139, 33141, 33142, 33143, 33144, + 33153, 33155, 33156, 33157, 33158, 33159, 33161, 33163, 33164, 33165, + 33166, 33168, 33170, 33171, 33172, 33173, 33174, 33175, 33177, 33178, + 33182, 33183, 33184, 33185, 33186, 33188, 33189, 33191, 33193, 33195, + 33196, 33197, 33198, 33199, 33200, 33201, 33202, 33204, 33205, 33206, + 33207, 33208, 33209, 33212, 33213, 33214, 33215, 33220, 33221, 33223, + 33224, 33225, 33227, 33229, 33230, 33231, 33232, 33233, 33234, 33235, + 25721, 34321, 27169, 33180, 30952, 25705, 39764, 25273, 26411, 33707, + 22696, 40664, 27819, 28448, 23518, 38476, 35851, 29279, 26576, 25287, + 29281, 20137, 22982, 27597, 22675, 26286, 24149, 21215, 24917, 26408, + 30446, 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, + 32435, 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, + 25376, 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, + 22958, 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, + 28346, 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, + 40479, 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, + 26592, 29406, 20957, 23425, 33236, 33237, 33238, 33239, 33240, 33241, + 33242, 33243, 33244, 33245, 33246, 33247, 33248, 33249, 33250, 33252, + 33253, 33254, 33256, 33257, 33259, 33262, 33263, 33264, 33265, 33266, + 33269, 33270, 33271, 33272, 33273, 33274, 33277, 33279, 33283, 33287, + 33288, 33289, 33290, 33291, 33294, 33295, 33297, 33299, 33301, 33302, + 33303, 33304, 33305, 33306, 33309, 33312, 33316, 33317, 33318, 33319, + 33321, 33326, 33330, 33338, 33340, 33341, 33343, 33344, 33345, 33346, + 33347, 33349, 33350, 33352, 33354, 33356, 33357, 33358, 33360, 33361, + 33362, 33363, 33364, 33365, 33366, 33367, 33369, 33371, 33372, 33373, + 33374, 33376, 33377, 33378, 33379, 33380, 33381, 33382, 33383, 33385, + 25319, 27870, 29275, 25197, 38062, 32445, 33043, 27987, 20892, 24324, + 22900, 21162, 24594, 22899, 26262, 34384, 30111, 25386, 25062, 31983, + 35834, 21734, 27431, 40485, 27572, 34261, 21589, 20598, 27812, 21866, + 36276, 29228, 24085, 24597, 29750, 25293, 25490, 29260, 24472, 28227, + 27966, 25856, 28504, 30424, 30928, 30460, 30036, 21028, 21467, 20051, + 24222, 26049, 32810, 32982, 25243, 21638, 21032, 28846, 34957, 36305, + 27873, 21624, 32986, 22521, 35060, 36180, 38506, 37197, 20329, 27803, + 21943, 30406, 30768, 25256, 28921, 28558, 24429, 34028, 26842, 30844, + 31735, 33192, 26379, 40527, 25447, 30896, 22383, 30738, 38713, 25209, + 25259, 21128, 29749, 27607, 33386, 33387, 33388, 33389, 33393, 33397, + 33398, 33399, 33400, 33403, 33404, 33408, 33409, 33411, 33413, 33414, + 33415, 33417, 33420, 33424, 33427, 33428, 33429, 33430, 33434, 33435, + 33438, 33440, 33442, 33443, 33447, 33458, 33461, 33462, 33466, 33467, + 33468, 33471, 33472, 33474, 33475, 33477, 33478, 33481, 33488, 33494, + 33497, 33498, 33501, 33506, 33511, 33512, 33513, 33514, 33516, 33517, + 33518, 33520, 33522, 33523, 33525, 33526, 33528, 33530, 33532, 33533, + 33534, 33535, 33536, 33546, 33547, 33549, 33552, 33554, 33555, 33558, + 33560, 33561, 33565, 33566, 33567, 33568, 33569, 33570, 33571, 33572, + 33573, 33574, 33577, 33578, 33582, 33584, 33586, 33591, 33595, 33597, + 21860, 33086, 30130, 30382, 21305, 30174, 20731, 23617, 35692, 31687, + 20559, 29255, 39575, 39128, 28418, 29922, 31080, 25735, 30629, 25340, + 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179, 20973, + 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748, 36843, + 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970, 22484, + 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450, 26646, + 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827, 22855, + 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569, 36215, + 23682, 20062, 20225, 21551, 22865, 30732, 22120, 27668, 36804, 24323, + 27773, 27875, 35755, 25488, 33598, 33599, 33601, 33602, 33604, 33605, + 33608, 33610, 33611, 33612, 33613, 33614, 33619, 33621, 33622, 33623, + 33624, 33625, 33629, 33634, 33648, 33649, 33650, 33651, 33652, 33653, + 33654, 33657, 33658, 33662, 33663, 33664, 33665, 33666, 33667, 33668, + 33671, 33672, 33674, 33675, 33676, 33677, 33679, 33680, 33681, 33684, + 33685, 33686, 33687, 33689, 33690, 33693, 33695, 33697, 33698, 33699, + 33700, 33701, 33702, 33703, 33708, 33709, 33710, 33711, 33717, 33723, + 33726, 33727, 33730, 33731, 33732, 33734, 33736, 33737, 33739, 33741, + 33742, 33744, 33745, 33746, 33747, 33749, 33751, 33753, 33754, 33755, + 33758, 33762, 33763, 33764, 33766, 33767, 33768, 33771, 33772, 33773, + 24688, 27965, 29301, 25190, 38030, 38085, 21315, 36801, 31614, 20191, + 35878, 20094, 40660, 38065, 38067, 21069, 28508, 36963, 27973, 35892, + 22545, 23884, 27424, 27465, 26538, 21595, 33108, 32652, 22681, 34103, + 24378, 25250, 27207, 38201, 25970, 24708, 26725, 30631, 20052, 20392, + 24039, 38808, 25772, 32728, 23789, 20431, 31373, 20999, 33540, 19988, + 24623, 31363, 38054, 20405, 20146, 31206, 29748, 21220, 33465, 25810, + 31165, 23517, 27777, 38738, 36731, 27682, 20542, 21375, 28165, 25806, + 26228, 27696, 24773, 39031, 35831, 24198, 29756, 31351, 31179, 19992, + 37041, 29699, 27714, 22234, 37195, 27845, 36235, 21306, 34502, 26354, + 36527, 23624, 39537, 28192, 33774, 33775, 33779, 33780, 33781, 33782, + 33783, 33786, 33787, 33788, 33790, 33791, 33792, 33794, 33797, 33799, + 33800, 33801, 33802, 33808, 33810, 33811, 33812, 33813, 33814, 33815, + 33817, 33818, 33819, 33822, 33823, 33824, 33825, 33826, 33827, 33833, + 33834, 33835, 33836, 33837, 33838, 33839, 33840, 33842, 33843, 33844, + 33845, 33846, 33847, 33849, 33850, 33851, 33854, 33855, 33856, 33857, + 33858, 33859, 33860, 33861, 33863, 33864, 33865, 33866, 33867, 33868, + 33869, 33870, 33871, 33872, 33874, 33875, 33876, 33877, 33878, 33880, + 33885, 33886, 33887, 33888, 33890, 33892, 33893, 33894, 33895, 33896, + 33898, 33902, 33903, 33904, 33906, 33908, 33911, 33913, 33915, 33916, + 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275, 27849, + 20840, 30154, 25331, 29356, 21048, 21149, 32570, 28820, 30264, 21364, + 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123, 20873, 26579, + 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469, 24825, 28909, + 22764, 20161, 20154, 24525, 38887, 20219, 35748, 20995, 22922, 32427, + 25172, 20173, 26085, 25102, 33592, 33993, 33635, 34701, 29076, 28342, + 23481, 32466, 20887, 25545, 26580, 32905, 33593, 34837, 20754, 23418, + 22914, 36785, 20083, 27741, 20837, 35109, 36719, 38446, 34122, 29790, + 38160, 38384, 28070, 33509, 24369, 25746, 27922, 33832, 33134, 40131, + 22622, 36187, 19977, 21441, 33917, 33918, 33919, 33920, 33921, 33923, + 33924, 33925, 33926, 33930, 33933, 33935, 33936, 33937, 33938, 33939, + 33940, 33941, 33942, 33944, 33946, 33947, 33949, 33950, 33951, 33952, + 33954, 33955, 33956, 33957, 33958, 33959, 33960, 33961, 33962, 33963, + 33964, 33965, 33966, 33968, 33969, 33971, 33973, 33974, 33975, 33979, + 33980, 33982, 33984, 33986, 33987, 33989, 33990, 33991, 33992, 33995, + 33996, 33998, 33999, 34002, 34004, 34005, 34007, 34008, 34009, 34010, + 34011, 34012, 34014, 34017, 34018, 34020, 34023, 34024, 34025, 34026, + 34027, 34029, 34030, 34031, 34033, 34034, 34035, 34036, 34037, 34038, + 34039, 34040, 34041, 34042, 34043, 34045, 34046, 34048, 34049, 34050, + 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234, 29791, + 33394, 28073, 26862, 20711, 33678, 30722, 26432, 21049, 27801, 32433, + 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441, 23665, 21024, + 29053, 34923, 38378, 38485, 25797, 36193, 33203, 21892, 27733, 25159, + 32558, 22674, 20260, 21830, 36175, 26188, 19978, 23578, 35059, 26786, + 25422, 31245, 28903, 33421, 21242, 38902, 23569, 21736, 37045, 32461, + 22882, 36170, 34503, 33292, 33293, 36198, 25668, 23556, 24913, 28041, + 31038, 35774, 30775, 30003, 21627, 20280, 36523, 28145, 23072, 32453, + 31070, 27784, 23457, 23158, 29978, 32958, 24910, 28183, 22768, 29983, + 29989, 29298, 21319, 32499, 34051, 34052, 34053, 34054, 34055, 34056, + 34057, 34058, 34059, 34061, 34062, 34063, 34064, 34066, 34068, 34069, + 34070, 34072, 34073, 34075, 34076, 34077, 34078, 34080, 34082, 34083, + 34084, 34085, 34086, 34087, 34088, 34089, 34090, 34093, 34094, 34095, + 34096, 34097, 34098, 34099, 34100, 34101, 34102, 34110, 34111, 34112, + 34113, 34114, 34116, 34117, 34118, 34119, 34123, 34124, 34125, 34126, + 34127, 34128, 34129, 34130, 34131, 34132, 34133, 34135, 34136, 34138, + 34139, 34140, 34141, 34143, 34144, 34145, 34146, 34147, 34149, 34150, + 34151, 34153, 34154, 34155, 34156, 34157, 34158, 34159, 34160, 34161, + 34163, 34165, 34166, 34167, 34168, 34172, 34173, 34175, 34176, 34177, + 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287, + 35799, 23608, 34417, 21313, 30707, 25342, 26102, 20160, 39135, 34432, + 23454, 35782, 21490, 30690, 20351, 23630, 39542, 22987, 24335, 31034, + 22763, 19990, 26623, 20107, 25325, 35475, 36893, 21183, 26159, 21980, + 22124, 36866, 20181, 20365, 37322, 39280, 27663, 24066, 24643, 23460, + 35270, 35797, 25910, 25163, 39318, 23432, 23551, 25480, 21806, 21463, + 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298, + 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626, + 34560, 40653, 40736, 23646, 26415, 36848, 26641, 26463, 25101, 31446, + 22661, 24246, 25968, 28465, 34178, 34179, 34182, 34184, 34185, 34186, + 34187, 34188, 34189, 34190, 34192, 34193, 34194, 34195, 34196, 34197, + 34198, 34199, 34200, 34201, 34202, 34205, 34206, 34207, 34208, 34209, + 34210, 34211, 34213, 34214, 34215, 34217, 34219, 34220, 34221, 34225, + 34226, 34227, 34228, 34229, 34230, 34232, 34234, 34235, 34236, 34237, + 34238, 34239, 34240, 34242, 34243, 34244, 34245, 34246, 34247, 34248, + 34250, 34251, 34252, 34253, 34254, 34257, 34258, 34260, 34262, 34263, + 34264, 34265, 34266, 34267, 34269, 34270, 34271, 34272, 34273, 34274, + 34275, 34277, 34278, 34279, 34280, 34282, 34283, 34284, 34285, 34286, + 34287, 34288, 34289, 34290, 34291, 34292, 34293, 34294, 34295, 34296, + 24661, 21047, 32781, 25684, 34928, 29993, 24069, 26643, 25332, 38684, + 21452, 29245, 35841, 27700, 30561, 31246, 21550, 30636, 39034, 33308, + 35828, 30805, 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, + 19997, 27515, 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, + 26494, 32824, 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, + 25822, 22013, 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, + 28335, 23487, 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, + 32485, 39635, 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, + 31499, 34001, 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, + 20182, 23427, 22905, 22612, 34297, 34298, 34300, 34301, 34302, 34304, + 34305, 34306, 34307, 34308, 34310, 34311, 34312, 34313, 34314, 34315, + 34316, 34317, 34318, 34319, 34320, 34322, 34323, 34324, 34325, 34327, + 34328, 34329, 34330, 34331, 34332, 34333, 34334, 34335, 34336, 34337, + 34338, 34339, 34340, 34341, 34342, 34344, 34346, 34347, 34348, 34349, + 34350, 34351, 34352, 34353, 34354, 34355, 34356, 34357, 34358, 34359, + 34361, 34362, 34363, 34365, 34366, 34367, 34368, 34369, 34370, 34371, + 34372, 34373, 34374, 34375, 34376, 34377, 34378, 34379, 34380, 34386, + 34387, 34389, 34390, 34391, 34392, 34393, 34395, 34396, 34397, 34399, + 34400, 34401, 34403, 34404, 34405, 34406, 34407, 34408, 34409, 34410, + 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488, 27888, 37214, + 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393, 22363, 27264, + 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899, 25506, 21497, + 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776, 31958, 20504, + 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486, 33796, 26691, + 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150, 30140, 35466, + 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884, 20307, 26367, + 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635, 30000, 29980, + 24684, 33300, 33094, 25361, 26465, 36834, 30522, 36339, 36148, 38081, + 24086, 21381, 21548, 28867, 34413, 34415, 34416, 34418, 34419, 34420, + 34421, 34422, 34423, 34424, 34435, 34436, 34437, 34438, 34439, 34440, + 34441, 34446, 34447, 34448, 34449, 34450, 34452, 34454, 34455, 34456, + 34457, 34458, 34459, 34462, 34463, 34464, 34465, 34466, 34469, 34470, + 34475, 34477, 34478, 34482, 34483, 34487, 34488, 34489, 34491, 34492, + 34493, 34494, 34495, 34497, 34498, 34499, 34501, 34504, 34508, 34509, + 34514, 34515, 34517, 34518, 34519, 34522, 34524, 34525, 34528, 34529, + 34530, 34531, 34533, 34534, 34535, 34536, 34538, 34539, 34540, 34543, + 34549, 34550, 34551, 34554, 34555, 34556, 34557, 34559, 34561, 34564, + 34565, 34566, 34571, 34572, 34574, 34575, 34576, 34577, 34580, 34582, + 27712, 24311, 20572, 20141, 24237, 25402, 33351, 36890, 26704, 37230, + 30643, 21516, 38108, 24420, 31461, 26742, 25413, 31570, 32479, 30171, + 20599, 25237, 22836, 36879, 20984, 31171, 31361, 22270, 24466, 36884, + 28034, 23648, 22303, 21520, 20820, 28237, 22242, 25512, 39059, 33151, + 34581, 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, + 38464, 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, + 27964, 23043, 29926, 34972, 27498, 22806, 35916, 24367, 28286, 29609, + 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451, + 23113, 19975, 33109, 27754, 29579, 20129, 26505, 32593, 24448, 26106, + 26395, 24536, 22916, 23041, 34585, 34587, 34589, 34591, 34592, 34596, + 34598, 34599, 34600, 34602, 34603, 34604, 34605, 34607, 34608, 34610, + 34611, 34613, 34614, 34616, 34617, 34618, 34620, 34621, 34624, 34625, + 34626, 34627, 34628, 34629, 34630, 34634, 34635, 34637, 34639, 34640, + 34641, 34642, 34644, 34645, 34646, 34648, 34650, 34651, 34652, 34653, + 34654, 34655, 34657, 34658, 34662, 34663, 34664, 34665, 34666, 34667, + 34668, 34669, 34671, 34673, 34674, 34675, 34677, 34679, 34680, 34681, + 34682, 34687, 34688, 34689, 34692, 34694, 34695, 34697, 34698, 34700, + 34702, 34703, 34704, 34705, 34706, 34708, 34709, 34710, 34712, 34713, + 34714, 34715, 34716, 34717, 34718, 34720, 34721, 34722, 34723, 34724, + 24013, 24494, 21361, 38886, 36829, 26693, 22260, 21807, 24799, 20026, + 28493, 32500, 33479, 33806, 22996, 20255, 20266, 23614, 32428, 26410, + 34074, 21619, 30031, 32963, 21890, 39759, 20301, 28205, 35859, 23561, + 24944, 21355, 30239, 28201, 34442, 25991, 38395, 32441, 21563, 31283, + 32010, 38382, 21985, 32705, 29934, 25373, 34583, 28065, 31389, 25105, + 26017, 21351, 25569, 27779, 24043, 21596, 38056, 20044, 27745, 35820, + 23627, 26080, 33436, 26791, 21566, 21556, 27595, 27494, 20116, 25410, + 21320, 33310, 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, + 21153, 24735, 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, + 22075, 21560, 38177, 29306, 34725, 34726, 34727, 34729, 34730, 34734, + 34736, 34737, 34738, 34740, 34742, 34743, 34744, 34745, 34747, 34748, + 34750, 34751, 34753, 34754, 34755, 34756, 34757, 34759, 34760, 34761, + 34764, 34765, 34766, 34767, 34768, 34772, 34773, 34774, 34775, 34776, + 34777, 34778, 34780, 34781, 34782, 34783, 34785, 34786, 34787, 34788, + 34790, 34791, 34792, 34793, 34795, 34796, 34797, 34799, 34800, 34801, + 34802, 34803, 34804, 34805, 34806, 34807, 34808, 34810, 34811, 34812, + 34813, 34815, 34816, 34817, 34818, 34820, 34821, 34822, 34823, 34824, + 34825, 34827, 34828, 34829, 34830, 34831, 34832, 34833, 34834, 34836, + 34839, 34840, 34841, 34842, 34844, 34845, 34846, 34847, 34848, 34851, + 31232, 24687, 24076, 24713, 33181, 22805, 24796, 29060, 28911, 28330, + 27728, 29312, 27268, 34989, 24109, 20064, 23219, 21916, 38115, 27927, + 31995, 38553, 25103, 32454, 30606, 34430, 21283, 38686, 36758, 26247, + 23777, 20384, 29421, 19979, 21414, 22799, 21523, 25472, 38184, 20808, + 20185, 40092, 32420, 21688, 36132, 34900, 33335, 38386, 28046, 24358, + 23244, 26174, 38505, 29616, 29486, 21439, 33146, 39301, 32673, 23466, + 38519, 38480, 32447, 30456, 21410, 38262, 39321, 31665, 35140, 28248, + 20065, 32724, 31077, 35814, 24819, 21709, 20139, 39033, 24055, 27233, + 20687, 21521, 35937, 33831, 30813, 38660, 21066, 21742, 22179, 38144, + 28040, 23477, 28102, 26195, 34852, 34853, 34854, 34855, 34856, 34857, + 34858, 34859, 34860, 34861, 34862, 34863, 34864, 34865, 34867, 34868, + 34869, 34870, 34871, 34872, 34874, 34875, 34877, 34878, 34879, 34881, + 34882, 34883, 34886, 34887, 34888, 34889, 34890, 34891, 34894, 34895, + 34896, 34897, 34898, 34899, 34901, 34902, 34904, 34906, 34907, 34908, + 34909, 34910, 34911, 34912, 34918, 34919, 34922, 34925, 34927, 34929, + 34931, 34932, 34933, 34934, 34936, 34937, 34938, 34939, 34940, 34944, + 34947, 34950, 34951, 34953, 34954, 34956, 34958, 34959, 34960, 34961, + 34963, 34964, 34965, 34967, 34968, 34969, 34970, 34971, 34973, 34974, + 34975, 34976, 34977, 34979, 34981, 34982, 34983, 34984, 34985, 34986, + 23567, 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123, 27463, + 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856, 20889, + 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218, 33455, + 38156, 27427, 36763, 26032, 24571, 24515, 20449, 34885, 26143, 33125, + 29481, 24826, 20852, 21009, 22411, 24418, 37026, 34892, 37266, 24184, + 26447, 24615, 22995, 20804, 20982, 33016, 21256, 27769, 38596, 29066, + 20241, 20462, 32670, 26429, 21957, 38152, 31168, 34966, 32483, 22687, + 25100, 38656, 34394, 22040, 39035, 24464, 35768, 33988, 37207, 21465, + 26093, 24207, 30044, 24676, 32110, 23167, 32490, 32493, 36713, 21927, + 23459, 24748, 26059, 29572, 34988, 34990, 34991, 34992, 34994, 34995, + 34996, 34997, 34998, 35000, 35001, 35002, 35003, 35005, 35006, 35007, + 35008, 35011, 35012, 35015, 35016, 35018, 35019, 35020, 35021, 35023, + 35024, 35025, 35027, 35030, 35031, 35034, 35035, 35036, 35037, 35038, + 35040, 35041, 35046, 35047, 35049, 35050, 35051, 35052, 35053, 35054, + 35055, 35058, 35061, 35062, 35063, 35066, 35067, 35069, 35071, 35072, + 35073, 35075, 35076, 35077, 35078, 35079, 35080, 35081, 35083, 35084, + 35085, 35086, 35087, 35089, 35092, 35093, 35094, 35095, 35096, 35100, + 35101, 35102, 35103, 35104, 35106, 35107, 35108, 35110, 35111, 35112, + 35113, 35116, 35117, 35118, 35119, 35121, 35122, 35123, 35125, 35127, + 36873, 30307, 30505, 32474, 38772, 34203, 23398, 31348, 38634, 34880, + 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033, 27529, 27739, + 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493, 21568, 20011, + 33469, 29273, 34460, 23830, 34905, 28079, 38597, 21713, 20122, 35766, + 28937, 21693, 38409, 28895, 28153, 30416, 20005, 30740, 34578, 23721, + 24310, 35328, 39068, 38414, 28814, 27839, 22852, 25513, 30524, 34893, + 28436, 33395, 22576, 29141, 21388, 30746, 38593, 21761, 24422, 28976, + 23476, 35866, 39564, 27523, 22830, 40495, 31207, 26472, 25196, 20335, + 30113, 32650, 27915, 38451, 27687, 20208, 30162, 20859, 26679, 28478, + 36992, 33136, 22934, 29814, 35128, 35129, 35130, 35131, 35132, 35133, + 35134, 35135, 35136, 35138, 35139, 35141, 35142, 35143, 35144, 35145, + 35146, 35147, 35148, 35149, 35150, 35151, 35152, 35153, 35154, 35155, + 35156, 35157, 35158, 35159, 35160, 35161, 35162, 35163, 35164, 35165, + 35168, 35169, 35170, 35171, 35172, 35173, 35175, 35176, 35177, 35178, + 35179, 35180, 35181, 35182, 35183, 35184, 35185, 35186, 35187, 35188, + 35189, 35190, 35191, 35192, 35193, 35194, 35196, 35197, 35198, 35200, + 35202, 35204, 35205, 35207, 35208, 35209, 35210, 35211, 35212, 35213, + 35214, 35215, 35216, 35217, 35218, 35219, 35220, 35221, 35222, 35223, + 35224, 35225, 35226, 35227, 35228, 35229, 35230, 35231, 35232, 35233, + 25671, 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, + 32768, 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, + 19994, 21494, 26355, 33099, 22812, 28082, 19968, 22777, 21307, 25558, + 38129, 20381, 20234, 34915, 39056, 22839, 36951, 31227, 20202, 33008, + 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050, 20057, + 30691, 20197, 33402, 25233, 26131, 37009, 23673, 20159, 24441, 33222, + 36920, 32900, 30123, 20134, 35028, 24847, 27589, 24518, 20041, 30410, + 28322, 35811, 35758, 35850, 35793, 24322, 32764, 32716, 32462, 33589, + 33643, 22240, 27575, 38899, 38452, 23035, 21535, 38134, 28139, 23493, + 39278, 23609, 24341, 38544, 35234, 35235, 35236, 35237, 35238, 35239, + 35240, 35241, 35242, 35243, 35244, 35245, 35246, 35247, 35248, 35249, + 35250, 35251, 35252, 35253, 35254, 35255, 35256, 35257, 35258, 35259, + 35260, 35261, 35262, 35263, 35264, 35267, 35277, 35283, 35284, 35285, + 35287, 35288, 35289, 35291, 35293, 35295, 35296, 35297, 35298, 35300, + 35303, 35304, 35305, 35306, 35308, 35309, 35310, 35312, 35313, 35314, + 35316, 35317, 35318, 35319, 35320, 35321, 35322, 35323, 35324, 35325, + 35326, 35327, 35329, 35330, 35331, 35332, 35333, 35334, 35336, 35337, + 35338, 35339, 35340, 35341, 35342, 35343, 35344, 35345, 35346, 35347, + 35348, 35349, 35350, 35351, 35352, 35353, 35354, 35355, 35356, 35357, + 21360, 33521, 27185, 23156, 40560, 24212, 32552, 33721, 33828, 33829, + 33639, 34631, 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, + 25317, 20323, 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, + 28044, 27704, 24703, 21191, 29992, 24189, 20248, 24736, 24551, 23588, + 30001, 37038, 38080, 29369, 27833, 28216, 37193, 26377, 21451, 21491, + 20305, 37321, 35825, 21448, 24188, 36802, 28132, 20110, 30402, 27014, + 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189, 28180, + 38533, 20104, 23089, 38632, 19982, 23679, 31161, 23431, 35821, 32701, + 29577, 22495, 33419, 37057, 21505, 36935, 21947, 23786, 24481, 24840, + 27442, 29425, 32946, 35465, 35358, 35359, 35360, 35361, 35362, 35363, + 35364, 35365, 35366, 35367, 35368, 35369, 35370, 35371, 35372, 35373, + 35374, 35375, 35376, 35377, 35378, 35379, 35380, 35381, 35382, 35383, + 35384, 35385, 35386, 35387, 35388, 35389, 35391, 35392, 35393, 35394, + 35395, 35396, 35397, 35398, 35399, 35401, 35402, 35403, 35404, 35405, + 35406, 35407, 35408, 35409, 35410, 35411, 35412, 35413, 35414, 35415, + 35416, 35417, 35418, 35419, 35420, 35421, 35422, 35423, 35424, 35425, + 35426, 35427, 35428, 35429, 35430, 35431, 35432, 35433, 35434, 35435, + 35436, 35437, 35438, 35439, 35440, 35441, 35442, 35443, 35444, 35445, + 35446, 35447, 35448, 35450, 35451, 35452, 35453, 35454, 35455, 35456, + 28020, 23507, 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, + 22435, 34945, 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, + 32536, 36828, 33489, 24895, 24616, 38498, 26352, 32422, 36234, 36291, + 38053, 23731, 31908, 26376, 24742, 38405, 32792, 20113, 37095, 21248, + 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776, + 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874, + 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531, + 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131, + 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166, + 21939, 28195, 26413, 36711, 35457, 35458, 35459, 35460, 35461, 35462, + 35463, 35464, 35467, 35468, 35469, 35470, 35471, 35472, 35473, 35474, + 35476, 35477, 35478, 35479, 35480, 35481, 35482, 35483, 35484, 35485, + 35486, 35487, 35488, 35489, 35490, 35491, 35492, 35493, 35494, 35495, + 35496, 35497, 35498, 35499, 35500, 35501, 35502, 35503, 35504, 35505, + 35506, 35507, 35508, 35509, 35510, 35511, 35512, 35513, 35514, 35515, + 35516, 35517, 35518, 35519, 35520, 35521, 35522, 35523, 35524, 35525, + 35526, 35527, 35528, 35529, 35530, 35531, 35532, 35533, 35534, 35535, + 35536, 35537, 35538, 35539, 35540, 35541, 35542, 35543, 35544, 35545, + 35546, 35547, 35548, 35549, 35550, 35551, 35552, 35553, 35554, 35555, + 38113, 38392, 30504, 26629, 27048, 21643, 20045, 28856, 35784, 25688, + 25995, 23429, 31364, 20538, 23528, 30651, 27617, 35449, 31896, 27838, + 30415, 26025, 36759, 23853, 23637, 34360, 26632, 21344, 25112, 31449, + 28251, 32509, 27167, 31456, 24432, 28467, 24352, 25484, 28072, 26454, + 19976, 24080, 36134, 20183, 32960, 30260, 38556, 25307, 26157, 25214, + 27836, 36213, 29031, 32617, 20806, 32903, 21484, 36974, 25240, 21746, + 34544, 36761, 32773, 38167, 34071, 36825, 27993, 29645, 26015, 30495, + 29956, 30759, 33275, 36126, 38024, 20390, 26517, 30137, 35786, 38663, + 25391, 38215, 38453, 33976, 25379, 30529, 24449, 29424, 20105, 24596, + 25972, 25327, 27491, 25919, 35556, 35557, 35558, 35559, 35560, 35561, + 35562, 35563, 35564, 35565, 35566, 35567, 35568, 35569, 35570, 35571, + 35572, 35573, 35574, 35575, 35576, 35577, 35578, 35579, 35580, 35581, + 35582, 35583, 35584, 35585, 35586, 35587, 35588, 35589, 35590, 35592, + 35593, 35594, 35595, 35596, 35597, 35598, 35599, 35600, 35601, 35602, + 35603, 35604, 35605, 35606, 35607, 35608, 35609, 35610, 35611, 35612, + 35613, 35614, 35615, 35616, 35617, 35618, 35619, 35620, 35621, 35623, + 35624, 35625, 35626, 35627, 35628, 35629, 35630, 35631, 35632, 35633, + 35634, 35635, 35636, 35637, 35638, 35639, 35640, 35641, 35642, 35643, + 35644, 35645, 35646, 35647, 35648, 35649, 35650, 35651, 35652, 35653, + 24103, 30151, 37073, 35777, 33437, 26525, 25903, 21553, 34584, 30693, + 32930, 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, + 20540, 20356, 22336, 25351, 27490, 36286, 21482, 26088, 32440, 24535, + 25370, 25527, 33267, 33268, 32622, 24092, 23769, 21046, 26234, 31209, + 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405, 24544, + 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247, 33311, 21608, + 24030, 27954, 35788, 31909, 36724, 32920, 24090, 21650, 30385, 23449, + 26172, 39588, 29664, 26666, 34523, 26417, 29482, 35832, 35803, 36880, + 31481, 28891, 29038, 25284, 30633, 22065, 20027, 33879, 26609, 21161, + 34496, 36142, 38136, 31569, 35654, 35655, 35656, 35657, 35658, 35659, + 35660, 35661, 35662, 35663, 35664, 35665, 35666, 35667, 35668, 35669, + 35670, 35671, 35672, 35673, 35674, 35675, 35676, 35677, 35678, 35679, + 35680, 35681, 35682, 35683, 35684, 35685, 35687, 35688, 35689, 35690, + 35691, 35693, 35694, 35695, 35696, 35697, 35698, 35699, 35700, 35701, + 35702, 35703, 35704, 35705, 35706, 35707, 35708, 35709, 35710, 35711, + 35712, 35713, 35714, 35715, 35716, 35717, 35718, 35719, 35720, 35721, + 35722, 35723, 35724, 35725, 35726, 35727, 35728, 35729, 35730, 35731, + 35732, 35733, 35734, 35735, 35736, 35737, 35738, 35739, 35740, 35741, + 35742, 35743, 35756, 35761, 35771, 35783, 35792, 35818, 35849, 35870, + 20303, 27880, 31069, 39547, 25235, 29226, 25341, 19987, 30742, 36716, + 25776, 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, + 26894, 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, + 21331, 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, + 21672, 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371, + 23376, 33258, 28173, 23383, 39683, 26837, 36394, 23447, 32508, 24635, + 32437, 37049, 36208, 22863, 25549, 31199, 36275, 21330, 26063, 31062, + 35781, 38459, 32452, 38075, 32386, 22068, 37257, 26368, 32618, 23562, + 36981, 26152, 24038, 20304, 26590, 20570, 20316, 22352, 24231, 59408, + 59409, 59410, 59411, 59412, 35896, 35897, 35898, 35899, 35900, 35901, + 35902, 35903, 35904, 35906, 35907, 35908, 35909, 35912, 35914, 35915, + 35917, 35918, 35919, 35920, 35921, 35922, 35923, 35924, 35926, 35927, + 35928, 35929, 35931, 35932, 35933, 35934, 35935, 35936, 35939, 35940, + 35941, 35942, 35943, 35944, 35945, 35948, 35949, 35950, 35951, 35952, + 35953, 35954, 35956, 35957, 35958, 35959, 35963, 35964, 35965, 35966, + 35967, 35968, 35969, 35971, 35972, 35974, 35975, 35976, 35979, 35981, + 35982, 35983, 35984, 35985, 35986, 35987, 35989, 35990, 35991, 35993, + 35994, 35995, 35996, 35997, 35998, 35999, 36000, 36001, 36002, 36003, + 36004, 36005, 36006, 36007, 36008, 36009, 36010, 36011, 36012, 36013, + 20109, 19980, 20800, 19984, 24319, 21317, 19989, 20120, 19998, 39730, + 23404, 22121, 20008, 31162, 20031, 21269, 20039, 22829, 29243, 21358, + 27664, 22239, 32996, 39319, 27603, 30590, 40727, 20022, 20127, 40720, + 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405, + 21411, 21413, 21422, 38757, 36189, 21274, 21493, 21286, 21294, 21310, + 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043, 21055, 21056, + 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121, 21136, 21139, + 20866, 32596, 20155, 20163, 20169, 20162, 20200, 20193, 20203, 20190, + 20251, 20211, 20258, 20324, 20213, 20261, 20263, 20233, 20267, 20318, + 20327, 25912, 20314, 20317, 36014, 36015, 36016, 36017, 36018, 36019, + 36020, 36021, 36022, 36023, 36024, 36025, 36026, 36027, 36028, 36029, + 36030, 36031, 36032, 36033, 36034, 36035, 36036, 36037, 36038, 36039, + 36040, 36041, 36042, 36043, 36044, 36045, 36046, 36047, 36048, 36049, + 36050, 36051, 36052, 36053, 36054, 36055, 36056, 36057, 36058, 36059, + 36060, 36061, 36062, 36063, 36064, 36065, 36066, 36067, 36068, 36069, + 36070, 36071, 36072, 36073, 36074, 36075, 36076, 36077, 36078, 36079, + 36080, 36081, 36082, 36083, 36084, 36085, 36086, 36087, 36088, 36089, + 36090, 36091, 36092, 36093, 36094, 36095, 36096, 36097, 36098, 36099, + 36100, 36101, 36102, 36103, 36104, 36105, 36106, 36107, 36108, 36109, + 20319, 20311, 20274, 20285, 20342, 20340, 20369, 20361, 20355, 20367, + 20350, 20347, 20394, 20348, 20396, 20372, 20454, 20456, 20458, 20421, + 20442, 20451, 20444, 20433, 20447, 20472, 20521, 20556, 20467, 20524, + 20495, 20526, 20525, 20478, 20508, 20492, 20517, 20520, 20606, 20547, + 20565, 20552, 20558, 20588, 20603, 20645, 20647, 20649, 20666, 20694, + 20742, 20717, 20716, 20710, 20718, 20743, 20747, 20189, 27709, 20312, + 20325, 20430, 40864, 27718, 31860, 20846, 24061, 40649, 39320, 20865, + 22804, 21241, 21261, 35335, 21264, 20971, 22809, 20821, 20128, 20822, + 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819, 32696, + 20907, 20913, 20925, 20924, 36110, 36111, 36112, 36113, 36114, 36115, + 36116, 36117, 36118, 36119, 36120, 36121, 36122, 36123, 36124, 36128, + 36177, 36178, 36183, 36191, 36197, 36200, 36201, 36202, 36204, 36206, + 36207, 36209, 36210, 36216, 36217, 36218, 36219, 36220, 36221, 36222, + 36223, 36224, 36226, 36227, 36230, 36231, 36232, 36233, 36236, 36237, + 36238, 36239, 36240, 36242, 36243, 36245, 36246, 36247, 36248, 36249, + 36250, 36251, 36252, 36253, 36254, 36256, 36257, 36258, 36260, 36261, + 36262, 36263, 36264, 36265, 36266, 36267, 36268, 36269, 36270, 36271, + 36272, 36274, 36278, 36279, 36281, 36283, 36285, 36288, 36289, 36290, + 36293, 36295, 36296, 36297, 36298, 36301, 36304, 36306, 36307, 36308, + 20935, 20886, 20898, 20901, 35744, 35750, 35751, 35754, 35764, 35765, + 35767, 35778, 35779, 35787, 35791, 35790, 35794, 35795, 35796, 35798, + 35800, 35801, 35804, 35807, 35808, 35812, 35816, 35817, 35822, 35824, + 35827, 35830, 35833, 35836, 35839, 35840, 35842, 35844, 35847, 35852, + 35855, 35857, 35858, 35860, 35861, 35862, 35865, 35867, 35864, 35869, + 35871, 35872, 35873, 35877, 35879, 35882, 35883, 35886, 35887, 35890, + 35891, 35893, 35894, 21353, 21370, 38429, 38434, 38433, 38449, 38442, + 38461, 38460, 38466, 38473, 38484, 38495, 38503, 38508, 38514, 38516, + 38536, 38541, 38551, 38576, 37015, 37019, 37021, 37017, 37036, 37025, + 37044, 37043, 37046, 37050, 36309, 36312, 36313, 36316, 36320, 36321, + 36322, 36325, 36326, 36327, 36329, 36333, 36334, 36336, 36337, 36338, + 36340, 36342, 36348, 36350, 36351, 36352, 36353, 36354, 36355, 36356, + 36358, 36359, 36360, 36363, 36365, 36366, 36368, 36369, 36370, 36371, + 36373, 36374, 36375, 36376, 36377, 36378, 36379, 36380, 36384, 36385, + 36388, 36389, 36390, 36391, 36392, 36395, 36397, 36400, 36402, 36403, + 36404, 36406, 36407, 36408, 36411, 36412, 36414, 36415, 36419, 36421, + 36422, 36428, 36429, 36430, 36431, 36432, 36435, 36436, 36437, 36438, + 36439, 36440, 36442, 36443, 36444, 36445, 36446, 36447, 36448, 36449, + 36450, 36451, 36452, 36453, 36455, 36456, 36458, 36459, 36462, 36465, + 37048, 37040, 37071, 37061, 37054, 37072, 37060, 37063, 37075, 37094, + 37090, 37084, 37079, 37083, 37099, 37103, 37118, 37124, 37154, 37150, + 37155, 37169, 37167, 37177, 37187, 37190, 21005, 22850, 21154, 21164, + 21165, 21182, 21759, 21200, 21206, 21232, 21471, 29166, 30669, 24308, + 20981, 20988, 39727, 21430, 24321, 30042, 24047, 22348, 22441, 22433, + 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329, 22318, + 22319, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396, 22395, + 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479, 22439, + 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456, 22516, + 22511, 22520, 22500, 22493, 36467, 36469, 36471, 36472, 36473, 36474, + 36475, 36477, 36478, 36480, 36482, 36483, 36484, 36486, 36488, 36489, + 36490, 36491, 36492, 36493, 36494, 36497, 36498, 36499, 36501, 36502, + 36503, 36504, 36505, 36506, 36507, 36509, 36511, 36512, 36513, 36514, + 36515, 36516, 36517, 36518, 36519, 36520, 36521, 36522, 36525, 36526, + 36528, 36529, 36531, 36532, 36533, 36534, 36535, 36536, 36537, 36539, + 36540, 36541, 36542, 36543, 36544, 36545, 36546, 36547, 36548, 36549, + 36550, 36551, 36552, 36553, 36554, 36555, 36556, 36557, 36559, 36560, + 36561, 36562, 36563, 36564, 36565, 36566, 36567, 36568, 36569, 36570, + 36571, 36572, 36573, 36574, 36575, 36576, 36577, 36578, 36579, 36580, + 22539, 22541, 22525, 22509, 22528, 22558, 22553, 22596, 22560, 22629, + 22636, 22657, 22665, 22682, 22656, 39336, 40729, 25087, 33401, 33405, + 33407, 33423, 33418, 33448, 33412, 33422, 33425, 33431, 33433, 33451, + 33464, 33470, 33456, 33480, 33482, 33507, 33432, 33463, 33454, 33483, + 33484, 33473, 33449, 33460, 33441, 33450, 33439, 33476, 33486, 33444, + 33505, 33545, 33527, 33508, 33551, 33543, 33500, 33524, 33490, 33496, + 33548, 33531, 33491, 33553, 33562, 33542, 33556, 33557, 33504, 33493, + 33564, 33617, 33627, 33628, 33544, 33682, 33596, 33588, 33585, 33691, + 33630, 33583, 33615, 33607, 33603, 33631, 33600, 33559, 33632, 33581, + 33594, 33587, 33638, 33637, 36581, 36582, 36583, 36584, 36585, 36586, + 36587, 36588, 36589, 36590, 36591, 36592, 36593, 36594, 36595, 36596, + 36597, 36598, 36599, 36600, 36601, 36602, 36603, 36604, 36605, 36606, + 36607, 36608, 36609, 36610, 36611, 36612, 36613, 36614, 36615, 36616, + 36617, 36618, 36619, 36620, 36621, 36622, 36623, 36624, 36625, 36626, + 36627, 36628, 36629, 36630, 36631, 36632, 36633, 36634, 36635, 36636, + 36637, 36638, 36639, 36640, 36641, 36642, 36643, 36644, 36645, 36646, + 36647, 36648, 36649, 36650, 36651, 36652, 36653, 36654, 36655, 36656, + 36657, 36658, 36659, 36660, 36661, 36662, 36663, 36664, 36665, 36666, + 36667, 36668, 36669, 36670, 36671, 36672, 36673, 36674, 36675, 36676, + 33640, 33563, 33641, 33644, 33642, 33645, 33646, 33712, 33656, 33715, + 33716, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705, 33661, + 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793, 33765, + 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848, 33809, + 33798, 33748, 33759, 33807, 33795, 33784, 33785, 33770, 33733, 33728, + 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907, 33927, 33928, + 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932, 33934, 33841, + 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994, 33983, 33978, + 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060, 29965, 34104, + 34032, 34105, 34079, 34106, 36677, 36678, 36679, 36680, 36681, 36682, + 36683, 36684, 36685, 36686, 36687, 36688, 36689, 36690, 36691, 36692, + 36693, 36694, 36695, 36696, 36697, 36698, 36699, 36700, 36701, 36702, + 36703, 36704, 36705, 36706, 36707, 36708, 36709, 36714, 36736, 36748, + 36754, 36765, 36768, 36769, 36770, 36772, 36773, 36774, 36775, 36778, + 36780, 36781, 36782, 36783, 36786, 36787, 36788, 36789, 36791, 36792, + 36794, 36795, 36796, 36799, 36800, 36803, 36806, 36809, 36810, 36811, + 36812, 36813, 36815, 36818, 36822, 36823, 36826, 36832, 36833, 36835, + 36839, 36844, 36847, 36849, 36850, 36852, 36853, 36854, 36858, 36859, + 36860, 36862, 36863, 36871, 36872, 36876, 36878, 36883, 36885, 36888, + 34134, 34107, 34047, 34044, 34137, 34120, 34152, 34148, 34142, 34170, + 30626, 34115, 34162, 34171, 34212, 34216, 34183, 34191, 34169, 34222, + 34204, 34181, 34233, 34231, 34224, 34259, 34241, 34268, 34303, 34343, + 34309, 34345, 34326, 34364, 24318, 24328, 22844, 22849, 32823, 22869, + 22874, 22872, 21263, 23586, 23589, 23596, 23604, 25164, 25194, 25247, + 25275, 25290, 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, + 25517, 25590, 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, + 25518, 25532, 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, + 25542, 25534, 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, + 25694, 25732, 25709, 25750, 36889, 36892, 36899, 36900, 36901, 36903, + 36904, 36905, 36906, 36907, 36908, 36912, 36913, 36914, 36915, 36916, + 36919, 36921, 36922, 36925, 36927, 36928, 36931, 36933, 36934, 36936, + 36937, 36938, 36939, 36940, 36942, 36948, 36949, 36950, 36953, 36954, + 36956, 36957, 36958, 36959, 36960, 36961, 36964, 36966, 36967, 36969, + 36970, 36971, 36972, 36975, 36976, 36977, 36978, 36979, 36982, 36983, + 36984, 36985, 36986, 36987, 36988, 36990, 36993, 36996, 36997, 36998, + 36999, 37001, 37002, 37004, 37005, 37006, 37007, 37008, 37010, 37012, + 37014, 37016, 37018, 37020, 37022, 37023, 37024, 37028, 37029, 37031, + 37032, 37033, 37035, 37037, 37042, 37047, 37052, 37053, 37055, 37056, + 25722, 25783, 25784, 25753, 25786, 25792, 25808, 25815, 25828, 25826, + 25865, 25893, 25902, 24331, 24530, 29977, 24337, 21343, 21489, 21501, + 21481, 21480, 21499, 21522, 21526, 21510, 21579, 21586, 21587, 21588, + 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634, 21652, 21623, + 21617, 21604, 21658, 21659, 21636, 21622, 21606, 21661, 21712, 21677, + 21698, 21684, 21714, 21671, 21670, 21715, 21716, 21618, 21667, 21717, + 21691, 21695, 21708, 21721, 21722, 21724, 21673, 21674, 21668, 21725, + 21711, 21726, 21787, 21735, 21792, 21757, 21780, 21747, 21794, 21795, + 21775, 21777, 21799, 21802, 21863, 21903, 21941, 21833, 21869, 21825, + 21845, 21823, 21840, 21820, 37058, 37059, 37062, 37064, 37065, 37067, + 37068, 37069, 37074, 37076, 37077, 37078, 37080, 37081, 37082, 37086, + 37087, 37088, 37091, 37092, 37093, 37097, 37098, 37100, 37102, 37104, + 37105, 37106, 37107, 37109, 37110, 37111, 37113, 37114, 37115, 37116, + 37119, 37120, 37121, 37123, 37125, 37126, 37127, 37128, 37129, 37130, + 37131, 37132, 37133, 37134, 37135, 37136, 37137, 37138, 37139, 37140, + 37141, 37142, 37143, 37144, 37146, 37147, 37148, 37149, 37151, 37152, + 37153, 37156, 37157, 37158, 37159, 37160, 37161, 37162, 37163, 37164, + 37165, 37166, 37168, 37170, 37171, 37172, 37173, 37174, 37175, 37176, + 37178, 37179, 37180, 37181, 37182, 37183, 37184, 37185, 37186, 37188, + 21815, 21846, 21877, 21878, 21879, 21811, 21808, 21852, 21899, 21970, + 21891, 21937, 21945, 21896, 21889, 21919, 21886, 21974, 21905, 21883, + 21983, 21949, 21950, 21908, 21913, 21994, 22007, 21961, 22047, 21969, + 21995, 21996, 21972, 21990, 21981, 21956, 21999, 21989, 22002, 22003, + 21964, 21965, 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, + 22052, 22051, 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, + 22093, 22114, 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, + 22139, 22140, 22149, 22163, 22191, 22228, 22231, 22237, 22241, 22261, + 22251, 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, + 24081, 24113, 24123, 24124, 37189, 37191, 37192, 37201, 37203, 37204, + 37205, 37206, 37208, 37209, 37211, 37212, 37215, 37216, 37222, 37223, + 37224, 37227, 37229, 37235, 37242, 37243, 37244, 37248, 37249, 37250, + 37251, 37252, 37254, 37256, 37258, 37262, 37263, 37267, 37268, 37269, + 37270, 37271, 37272, 37273, 37276, 37277, 37278, 37279, 37280, 37281, + 37284, 37285, 37286, 37287, 37288, 37289, 37291, 37292, 37296, 37297, + 37298, 37299, 37302, 37303, 37304, 37305, 37307, 37308, 37309, 37310, + 37311, 37312, 37313, 37314, 37315, 37316, 37317, 37318, 37320, 37323, + 37328, 37330, 37331, 37332, 37333, 37334, 37335, 37336, 37337, 37338, + 37339, 37341, 37342, 37343, 37344, 37345, 37346, 37347, 37348, 37349, + 24119, 24132, 24148, 24155, 24158, 24161, 23692, 23674, 23693, 23696, + 23702, 23688, 23704, 23705, 23697, 23706, 23708, 23733, 23714, 23741, + 23724, 23723, 23729, 23715, 23745, 23735, 23748, 23762, 23780, 23755, + 23781, 23810, 23811, 23847, 23846, 23854, 23844, 23838, 23814, 23835, + 23896, 23870, 23860, 23869, 23916, 23899, 23919, 23901, 23915, 23883, + 23882, 23913, 23924, 23938, 23961, 23965, 35955, 23991, 24005, 24435, + 24439, 24450, 24455, 24457, 24460, 24469, 24473, 24476, 24488, 24493, + 24501, 24508, 34914, 24417, 29357, 29360, 29364, 29367, 29368, 29379, + 29377, 29390, 29389, 29394, 29416, 29423, 29417, 29426, 29428, 29431, + 29441, 29427, 29443, 29434, 37350, 37351, 37352, 37353, 37354, 37355, + 37356, 37357, 37358, 37359, 37360, 37361, 37362, 37363, 37364, 37365, + 37366, 37367, 37368, 37369, 37370, 37371, 37372, 37373, 37374, 37375, + 37376, 37377, 37378, 37379, 37380, 37381, 37382, 37383, 37384, 37385, + 37386, 37387, 37388, 37389, 37390, 37391, 37392, 37393, 37394, 37395, + 37396, 37397, 37398, 37399, 37400, 37401, 37402, 37403, 37404, 37405, + 37406, 37407, 37408, 37409, 37410, 37411, 37412, 37413, 37414, 37415, + 37416, 37417, 37418, 37419, 37420, 37421, 37422, 37423, 37424, 37425, + 37426, 37427, 37428, 37429, 37430, 37431, 37432, 37433, 37434, 37435, + 37436, 37437, 37438, 37439, 37440, 37441, 37442, 37443, 37444, 37445, + 29435, 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, + 29477, 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, + 29566, 33307, 22821, 39143, 22820, 22786, 39267, 39271, 39272, 39273, + 39274, 39275, 39276, 39284, 39287, 39293, 39296, 39300, 39303, 39306, + 39309, 39312, 39313, 39315, 39316, 39317, 24192, 24209, 24203, 24214, + 24229, 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, + 24296, 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, + 24545, 24548, 24574, 24581, 24582, 24554, 24557, 24568, 24601, 24629, + 24614, 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, 24696, + 24697, 24699, 24698, 24642, 37446, 37447, 37448, 37449, 37450, 37451, + 37452, 37453, 37454, 37455, 37456, 37457, 37458, 37459, 37460, 37461, + 37462, 37463, 37464, 37465, 37466, 37467, 37468, 37469, 37470, 37471, + 37472, 37473, 37474, 37475, 37476, 37477, 37478, 37479, 37480, 37481, + 37482, 37483, 37484, 37485, 37486, 37487, 37488, 37489, 37490, 37491, + 37493, 37494, 37495, 37496, 37497, 37498, 37499, 37500, 37501, 37502, + 37503, 37504, 37505, 37506, 37507, 37508, 37509, 37510, 37511, 37512, + 37513, 37514, 37515, 37516, 37517, 37519, 37520, 37521, 37522, 37523, + 37524, 37525, 37526, 37527, 37528, 37529, 37530, 37531, 37532, 37533, + 37534, 37535, 37536, 37537, 37538, 37539, 37540, 37541, 37542, 37543, + 24682, 24701, 24726, 24730, 24749, 24733, 24707, 24722, 24716, 24731, + 24812, 24763, 24753, 24797, 24792, 24774, 24794, 24756, 24864, 24870, + 24853, 24867, 24820, 24832, 24846, 24875, 24906, 24949, 25004, 24980, + 24999, 25015, 25044, 25077, 24541, 38579, 38377, 38379, 38385, 38387, + 38389, 38390, 38396, 38398, 38403, 38404, 38406, 38408, 38410, 38411, + 38412, 38413, 38415, 38418, 38421, 38422, 38423, 38425, 38426, 20012, + 29247, 25109, 27701, 27732, 27740, 27722, 27811, 27781, 27792, 27796, + 27788, 27752, 27753, 27764, 27766, 27782, 27817, 27856, 27860, 27821, + 27895, 27896, 27889, 27863, 27826, 27872, 27862, 27898, 27883, 27886, + 27825, 27859, 27887, 27902, 37544, 37545, 37546, 37547, 37548, 37549, + 37551, 37552, 37553, 37554, 37555, 37556, 37557, 37558, 37559, 37560, + 37561, 37562, 37563, 37564, 37565, 37566, 37567, 37568, 37569, 37570, + 37571, 37572, 37573, 37574, 37575, 37577, 37578, 37579, 37580, 37581, + 37582, 37583, 37584, 37585, 37586, 37587, 37588, 37589, 37590, 37591, + 37592, 37593, 37594, 37595, 37596, 37597, 37598, 37599, 37600, 37601, + 37602, 37603, 37604, 37605, 37606, 37607, 37608, 37609, 37610, 37611, + 37612, 37613, 37614, 37615, 37616, 37617, 37618, 37619, 37620, 37621, + 37622, 37623, 37624, 37625, 37626, 37627, 37628, 37629, 37630, 37631, + 37632, 37633, 37634, 37635, 37636, 37637, 37638, 37639, 37640, 37641, + 27961, 27943, 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, + 27981, 27950, 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, + 28062, 28064, 27998, 28051, 28052, 27996, 28000, 28028, 28003, 28186, + 28103, 28101, 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, + 28182, 28075, 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, + 28294, 28243, 28244, 28210, 28197, 28228, 28383, 28337, 28312, 28384, + 28461, 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, + 28303, 28354, 28319, 28514, 28486, 28487, 28452, 28437, 28409, 28463, + 28470, 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, + 28530, 28540, 28538, 28625, 37642, 37643, 37644, 37645, 37646, 37647, + 37648, 37649, 37650, 37651, 37652, 37653, 37654, 37655, 37656, 37657, + 37658, 37659, 37660, 37661, 37662, 37663, 37664, 37665, 37666, 37667, + 37668, 37669, 37670, 37671, 37672, 37673, 37674, 37675, 37676, 37677, + 37678, 37679, 37680, 37681, 37682, 37683, 37684, 37685, 37686, 37687, + 37688, 37689, 37690, 37691, 37692, 37693, 37695, 37696, 37697, 37698, + 37699, 37700, 37701, 37702, 37703, 37704, 37705, 37706, 37707, 37708, + 37709, 37710, 37711, 37712, 37713, 37714, 37715, 37716, 37717, 37718, + 37719, 37720, 37721, 37722, 37723, 37724, 37725, 37726, 37727, 37728, + 37729, 37730, 37731, 37732, 37733, 37734, 37735, 37736, 37737, 37739, + 28617, 28583, 28601, 28598, 28610, 28641, 28654, 28638, 28640, 28655, + 28698, 28707, 28699, 28729, 28725, 28751, 28766, 23424, 23428, 23445, + 23443, 23461, 23480, 29999, 39582, 25652, 23524, 23534, 35120, 23536, + 36423, 35591, 36790, 36819, 36821, 36837, 36846, 36836, 36841, 36838, + 36851, 36840, 36869, 36868, 36875, 36902, 36881, 36877, 36886, 36897, + 36917, 36918, 36909, 36911, 36932, 36945, 36946, 36944, 36968, 36952, + 36962, 36955, 26297, 36980, 36989, 36994, 37000, 36995, 37003, 24400, + 24407, 24406, 24408, 23611, 21675, 23632, 23641, 23409, 23651, 23654, + 32700, 24362, 24361, 24365, 33396, 24380, 39739, 23662, 22913, 22915, + 22925, 22953, 22954, 22947, 37740, 37741, 37742, 37743, 37744, 37745, + 37746, 37747, 37748, 37749, 37750, 37751, 37752, 37753, 37754, 37755, + 37756, 37757, 37758, 37759, 37760, 37761, 37762, 37763, 37764, 37765, + 37766, 37767, 37768, 37769, 37770, 37771, 37772, 37773, 37774, 37776, + 37777, 37778, 37779, 37780, 37781, 37782, 37783, 37784, 37785, 37786, + 37787, 37788, 37789, 37790, 37791, 37792, 37793, 37794, 37795, 37796, + 37797, 37798, 37799, 37800, 37801, 37802, 37803, 37804, 37805, 37806, + 37807, 37808, 37809, 37810, 37811, 37812, 37813, 37814, 37815, 37816, + 37817, 37818, 37819, 37820, 37821, 37822, 37823, 37824, 37825, 37826, + 37827, 37828, 37829, 37830, 37831, 37832, 37833, 37835, 37836, 37837, + 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999, 22974, + 23045, 23046, 23005, 23048, 23011, 23000, 23033, 23052, 23049, 23090, + 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100, 23138, + 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218, 23250, + 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260, 23305, + 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397, 23411, + 23377, 23379, 23394, 39541, 39543, 39544, 39546, 39551, 39549, 39552, + 39553, 39557, 39560, 39562, 39568, 39570, 39571, 39574, 39576, 39579, + 39580, 39581, 39583, 39584, 39586, 39587, 39589, 39591, 32415, 32417, + 32419, 32421, 32424, 32425, 37838, 37839, 37840, 37841, 37842, 37843, + 37844, 37845, 37847, 37848, 37849, 37850, 37851, 37852, 37853, 37854, + 37855, 37856, 37857, 37858, 37859, 37860, 37861, 37862, 37863, 37864, + 37865, 37866, 37867, 37868, 37869, 37870, 37871, 37872, 37873, 37874, + 37875, 37876, 37877, 37878, 37879, 37880, 37881, 37882, 37883, 37884, + 37885, 37886, 37887, 37888, 37889, 37890, 37891, 37892, 37893, 37894, + 37895, 37896, 37897, 37898, 37899, 37900, 37901, 37902, 37903, 37904, + 37905, 37906, 37907, 37908, 37909, 37910, 37911, 37912, 37913, 37914, + 37915, 37916, 37917, 37918, 37919, 37920, 37921, 37922, 37923, 37924, + 37925, 37926, 37927, 37928, 37929, 37930, 37931, 37932, 37933, 37934, + 32429, 32432, 32446, 32448, 32449, 32450, 32457, 32459, 32460, 32464, + 32468, 32471, 32475, 32480, 32481, 32488, 32491, 32494, 32495, 32497, + 32498, 32525, 32502, 32506, 32507, 32510, 32513, 32514, 32515, 32519, + 32520, 32523, 32524, 32527, 32529, 32530, 32535, 32537, 32540, 32539, + 32543, 32545, 32546, 32547, 32548, 32549, 32550, 32551, 32554, 32555, + 32556, 32557, 32559, 32560, 32561, 32562, 32563, 32565, 24186, 30079, + 24027, 30014, 37013, 29582, 29585, 29614, 29602, 29599, 29647, 29634, + 29649, 29623, 29619, 29632, 29641, 29640, 29669, 29657, 39036, 29706, + 29673, 29671, 29662, 29626, 29682, 29711, 29738, 29787, 29734, 29733, + 29736, 29744, 29742, 29740, 37935, 37936, 37937, 37938, 37939, 37940, + 37941, 37942, 37943, 37944, 37945, 37946, 37947, 37948, 37949, 37951, + 37952, 37953, 37954, 37955, 37956, 37957, 37958, 37959, 37960, 37961, + 37962, 37963, 37964, 37965, 37966, 37967, 37968, 37969, 37970, 37971, + 37972, 37973, 37974, 37975, 37976, 37977, 37978, 37979, 37980, 37981, + 37982, 37983, 37984, 37985, 37986, 37987, 37988, 37989, 37990, 37991, + 37992, 37993, 37994, 37996, 37997, 37998, 37999, 38000, 38001, 38002, + 38003, 38004, 38005, 38006, 38007, 38008, 38009, 38010, 38011, 38012, + 38013, 38014, 38015, 38016, 38017, 38018, 38019, 38020, 38033, 38038, + 38040, 38087, 38095, 38099, 38100, 38106, 38118, 38139, 38172, 38176, + 29723, 29722, 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, + 29852, 29838, 29824, 29825, 29831, 29835, 29854, 29864, 29865, 29840, + 29863, 29906, 29882, 38890, 38891, 38892, 26444, 26451, 26462, 26440, + 26473, 26533, 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, + 26541, 26507, 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, + 26636, 26585, 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, + 26638, 26561, 26621, 26674, 26675, 26720, 26721, 26702, 26722, 26692, + 26724, 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, + 26697, 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, + 26876, 26911, 26912, 26873, 38183, 38195, 38205, 38211, 38216, 38219, + 38229, 38234, 38240, 38254, 38260, 38261, 38263, 38264, 38265, 38266, + 38267, 38268, 38269, 38270, 38272, 38273, 38274, 38275, 38276, 38277, + 38278, 38279, 38280, 38281, 38282, 38283, 38284, 38285, 38286, 38287, + 38288, 38289, 38290, 38291, 38292, 38293, 38294, 38295, 38296, 38297, + 38298, 38299, 38300, 38301, 38302, 38303, 38304, 38305, 38306, 38307, + 38308, 38309, 38310, 38311, 38312, 38313, 38314, 38315, 38316, 38317, + 38318, 38319, 38320, 38321, 38322, 38323, 38324, 38325, 38326, 38327, + 38328, 38329, 38330, 38331, 38332, 38333, 38334, 38335, 38336, 38337, + 38338, 38339, 38340, 38341, 38342, 38343, 38344, 38345, 38346, 38347, + 26916, 26864, 26891, 26881, 26967, 26851, 26896, 26993, 26937, 26976, + 26946, 26973, 27012, 26987, 27008, 27032, 27000, 26932, 27084, 27015, + 27016, 27086, 27017, 26982, 26979, 27001, 27035, 27047, 27067, 27051, + 27053, 27092, 27057, 27073, 27082, 27103, 27029, 27104, 27021, 27135, + 27183, 27117, 27159, 27160, 27237, 27122, 27204, 27198, 27296, 27216, + 27227, 27189, 27278, 27257, 27197, 27176, 27224, 27260, 27281, 27280, + 27305, 27287, 27307, 29495, 29522, 27521, 27522, 27527, 27524, 27538, + 27539, 27533, 27546, 27547, 27553, 27562, 36715, 36717, 36721, 36722, + 36723, 36725, 36726, 36728, 36727, 36729, 36730, 36732, 36734, 36737, + 36738, 36740, 36743, 36747, 38348, 38349, 38350, 38351, 38352, 38353, + 38354, 38355, 38356, 38357, 38358, 38359, 38360, 38361, 38362, 38363, + 38364, 38365, 38366, 38367, 38368, 38369, 38370, 38371, 38372, 38373, + 38374, 38375, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432, + 38435, 38436, 38437, 38438, 38439, 38440, 38441, 38443, 38444, 38445, + 38447, 38448, 38455, 38456, 38457, 38458, 38462, 38465, 38467, 38474, + 38478, 38479, 38481, 38482, 38483, 38486, 38487, 38488, 38489, 38490, + 38492, 38493, 38494, 38496, 38499, 38501, 38502, 38507, 38509, 38510, + 38511, 38512, 38513, 38515, 38520, 38521, 38522, 38523, 38524, 38525, + 38526, 38527, 38528, 38529, 38530, 38531, 38532, 38535, 38537, 38538, + 36749, 36750, 36751, 36760, 36762, 36558, 25099, 25111, 25115, 25119, + 25122, 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, + 29969, 29971, 25908, 26094, 26095, 26096, 26122, 26137, 26482, 26115, + 26133, 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, + 26207, 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, + 26279, 26269, 26302, 26331, 26332, 26342, 26345, 36146, 36147, 36150, + 36155, 36157, 36160, 36165, 36166, 36168, 36169, 36167, 36173, 36181, + 36185, 35271, 35274, 35275, 35276, 35278, 35279, 35280, 35281, 29294, + 29343, 29277, 29286, 29295, 29310, 29311, 29316, 29323, 29325, 29327, + 29330, 25352, 25394, 25520, 38540, 38542, 38545, 38546, 38547, 38549, + 38550, 38554, 38555, 38557, 38558, 38559, 38560, 38561, 38562, 38563, + 38564, 38565, 38566, 38568, 38569, 38570, 38571, 38572, 38573, 38574, + 38575, 38577, 38578, 38580, 38581, 38583, 38584, 38586, 38587, 38591, + 38594, 38595, 38600, 38602, 38603, 38608, 38609, 38611, 38612, 38614, + 38615, 38616, 38617, 38618, 38619, 38620, 38621, 38622, 38623, 38625, + 38626, 38627, 38628, 38629, 38630, 38631, 38635, 38636, 38637, 38638, + 38640, 38641, 38642, 38644, 38645, 38648, 38650, 38651, 38652, 38653, + 38655, 38658, 38659, 38661, 38666, 38667, 38668, 38672, 38673, 38674, + 38676, 38677, 38679, 38680, 38681, 38682, 38683, 38685, 38687, 38688, + 25663, 25816, 32772, 27626, 27635, 27645, 27637, 27641, 27653, 27655, + 27654, 27661, 27669, 27672, 27673, 27674, 27681, 27689, 27684, 27690, + 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232, 34402, 21014, + 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939, 32941, 32948, + 32951, 32999, 33000, 33001, 33002, 32987, 32962, 32964, 32985, 32973, + 32983, 26384, 32989, 33003, 33009, 33012, 33005, 33037, 33038, 33010, + 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096, + 33100, 33107, 33140, 33113, 33114, 33137, 33120, 33129, 33148, 33149, + 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373, 33187, 33194, + 33228, 26406, 33226, 33211, 38689, 38690, 38691, 38692, 38693, 38694, + 38695, 38696, 38697, 38699, 38700, 38702, 38703, 38705, 38707, 38708, + 38709, 38710, 38711, 38714, 38715, 38716, 38717, 38719, 38720, 38721, + 38722, 38723, 38724, 38725, 38726, 38727, 38728, 38729, 38730, 38731, + 38732, 38733, 38734, 38735, 38736, 38737, 38740, 38741, 38743, 38744, + 38746, 38748, 38749, 38751, 38755, 38756, 38758, 38759, 38760, 38762, + 38763, 38764, 38765, 38766, 38767, 38768, 38769, 38770, 38773, 38775, + 38776, 38777, 38778, 38779, 38781, 38782, 38783, 38784, 38785, 38786, + 38787, 38788, 38790, 38791, 38792, 38793, 38794, 38796, 38798, 38799, + 38800, 38803, 38805, 38806, 38807, 38809, 38810, 38811, 38812, 38813, + 33217, 33190, 27428, 27447, 27449, 27459, 27462, 27481, 39121, 39122, + 39123, 39125, 39129, 39130, 27571, 24384, 27586, 35315, 26000, 40785, + 26003, 26044, 26054, 26052, 26051, 26060, 26062, 26066, 26070, 28800, + 28828, 28822, 28829, 28859, 28864, 28855, 28843, 28849, 28904, 28874, + 28944, 28947, 28950, 28975, 28977, 29043, 29020, 29032, 28997, 29042, + 29002, 29048, 29050, 29080, 29107, 29109, 29096, 29088, 29152, 29140, + 29159, 29177, 29213, 29224, 28780, 28952, 29030, 29113, 25150, 25149, + 25155, 25160, 25161, 31035, 31040, 31046, 31049, 31067, 31068, 31059, + 31066, 31074, 31063, 31072, 31087, 31079, 31098, 31109, 31114, 31130, + 31143, 31155, 24529, 24528, 38814, 38815, 38817, 38818, 38820, 38821, + 38822, 38823, 38824, 38825, 38826, 38828, 38830, 38832, 38833, 38835, + 38837, 38838, 38839, 38840, 38841, 38842, 38843, 38844, 38845, 38846, + 38847, 38848, 38849, 38850, 38851, 38852, 38853, 38854, 38855, 38856, + 38857, 38858, 38859, 38860, 38861, 38862, 38863, 38864, 38865, 38866, + 38867, 38868, 38869, 38870, 38871, 38872, 38873, 38874, 38875, 38876, + 38877, 38878, 38879, 38880, 38881, 38882, 38883, 38884, 38885, 38888, + 38894, 38895, 38896, 38897, 38898, 38900, 38903, 38904, 38905, 38906, + 38907, 38908, 38909, 38910, 38911, 38912, 38913, 38914, 38915, 38916, + 38917, 38918, 38919, 38920, 38921, 38922, 38923, 38924, 38925, 38926, + 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838, 24845, + 24925, 25001, 24989, 25035, 25041, 25094, 32896, 32895, 27795, 27894, + 28156, 30710, 30712, 30720, 30729, 30743, 30744, 30737, 26027, 30765, + 30748, 30749, 30777, 30778, 30779, 30751, 30780, 30757, 30764, 30755, + 30761, 30798, 30829, 30806, 30807, 30758, 30800, 30791, 30796, 30826, + 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898, 30905, 30885, + 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995, 31012, 31006, + 31028, 40859, 40697, 40699, 40700, 30449, 30468, 30477, 30457, 30471, + 30472, 30490, 30498, 30489, 30509, 30502, 30517, 30520, 30544, 30545, + 30535, 30531, 30554, 30568, 38927, 38928, 38929, 38930, 38931, 38932, + 38933, 38934, 38935, 38936, 38937, 38938, 38939, 38940, 38941, 38942, + 38943, 38944, 38945, 38946, 38947, 38948, 38949, 38950, 38951, 38952, + 38953, 38954, 38955, 38956, 38957, 38958, 38959, 38960, 38961, 38962, + 38963, 38964, 38965, 38966, 38967, 38968, 38969, 38970, 38971, 38972, + 38973, 38974, 38975, 38976, 38977, 38978, 38979, 38980, 38981, 38982, + 38983, 38984, 38985, 38986, 38987, 38988, 38989, 38990, 38991, 38992, + 38993, 38994, 38995, 38996, 38997, 38998, 38999, 39000, 39001, 39002, + 39003, 39004, 39005, 39006, 39007, 39008, 39009, 39010, 39011, 39012, + 39013, 39014, 39015, 39016, 39017, 39018, 39019, 39020, 39021, 39022, + 30562, 30565, 30591, 30605, 30589, 30592, 30604, 30609, 30623, 30624, + 30640, 30645, 30653, 30010, 30016, 30030, 30027, 30024, 30043, 30066, + 30073, 30083, 32600, 32609, 32607, 35400, 32616, 32628, 32625, 32633, + 32641, 32638, 30413, 30437, 34866, 38021, 38022, 38023, 38027, 38026, + 38028, 38029, 38031, 38032, 38036, 38039, 38037, 38042, 38043, 38044, + 38051, 38052, 38059, 38058, 38061, 38060, 38063, 38064, 38066, 38068, + 38070, 38071, 38072, 38073, 38074, 38076, 38077, 38079, 38084, 38088, + 38089, 38090, 38091, 38092, 38093, 38094, 38096, 38097, 38098, 38101, + 38102, 38103, 38105, 38104, 38107, 38110, 38111, 38112, 38114, 38116, + 38117, 38119, 38120, 38122, 39023, 39024, 39025, 39026, 39027, 39028, + 39051, 39054, 39058, 39061, 39065, 39075, 39080, 39081, 39082, 39083, + 39084, 39085, 39086, 39087, 39088, 39089, 39090, 39091, 39092, 39093, + 39094, 39095, 39096, 39097, 39098, 39099, 39100, 39101, 39102, 39103, + 39104, 39105, 39106, 39107, 39108, 39109, 39110, 39111, 39112, 39113, + 39114, 39115, 39116, 39117, 39119, 39120, 39124, 39126, 39127, 39131, + 39132, 39133, 39136, 39137, 39138, 39139, 39140, 39141, 39142, 39145, + 39146, 39147, 39148, 39149, 39150, 39151, 39152, 39153, 39154, 39155, + 39156, 39157, 39158, 39159, 39160, 39161, 39162, 39163, 39164, 39165, + 39166, 39167, 39168, 39169, 39170, 39171, 39172, 39173, 39174, 39175, + 38121, 38123, 38126, 38127, 38131, 38132, 38133, 38135, 38137, 38140, + 38141, 38143, 38147, 38146, 38150, 38151, 38153, 38154, 38157, 38158, + 38159, 38162, 38163, 38164, 38165, 38166, 38168, 38171, 38173, 38174, + 38175, 38178, 38186, 38187, 38185, 38188, 38193, 38194, 38196, 38198, + 38199, 38200, 38204, 38206, 38207, 38210, 38197, 38212, 38213, 38214, + 38217, 38220, 38222, 38223, 38226, 38227, 38228, 38230, 38231, 38232, + 38233, 38235, 38238, 38239, 38237, 38241, 38242, 38244, 38245, 38246, + 38247, 38248, 38249, 38250, 38251, 38252, 38255, 38257, 38258, 38259, + 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211, 31238, 23879, + 31235, 31234, 31262, 31252, 39176, 39177, 39178, 39179, 39180, 39182, + 39183, 39185, 39186, 39187, 39188, 39189, 39190, 39191, 39192, 39193, + 39194, 39195, 39196, 39197, 39198, 39199, 39200, 39201, 39202, 39203, + 39204, 39205, 39206, 39207, 39208, 39209, 39210, 39211, 39212, 39213, + 39215, 39216, 39217, 39218, 39219, 39220, 39221, 39222, 39223, 39224, + 39225, 39226, 39227, 39228, 39229, 39230, 39231, 39232, 39233, 39234, + 39235, 39236, 39237, 39238, 39239, 39240, 39241, 39242, 39243, 39244, + 39245, 39246, 39247, 39248, 39249, 39250, 39251, 39254, 39255, 39256, + 39257, 39258, 39259, 39260, 39261, 39262, 39263, 39264, 39265, 39266, + 39268, 39270, 39283, 39288, 39289, 39291, 39294, 39298, 39299, 39305, + 31289, 31287, 31313, 40655, 39333, 31344, 30344, 30350, 30355, 30361, + 30372, 29918, 29920, 29996, 40480, 40482, 40488, 40489, 40490, 40491, + 40492, 40498, 40497, 40502, 40504, 40503, 40505, 40506, 40510, 40513, + 40514, 40516, 40518, 40519, 40520, 40521, 40523, 40524, 40526, 40529, + 40533, 40535, 40538, 40539, 40540, 40542, 40547, 40550, 40551, 40552, + 40553, 40554, 40555, 40556, 40561, 40557, 40563, 30098, 30100, 30102, + 30112, 30109, 30124, 30115, 30131, 30132, 30136, 30148, 30129, 30128, + 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183, + 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218, + 30245, 30232, 30229, 30233, 39308, 39310, 39322, 39323, 39324, 39325, + 39326, 39327, 39328, 39329, 39330, 39331, 39332, 39334, 39335, 39337, + 39338, 39339, 39340, 39341, 39342, 39343, 39344, 39345, 39346, 39347, + 39348, 39349, 39350, 39351, 39352, 39353, 39354, 39355, 39356, 39357, + 39358, 39359, 39360, 39361, 39362, 39363, 39364, 39365, 39366, 39367, + 39368, 39369, 39370, 39371, 39372, 39373, 39374, 39375, 39376, 39377, + 39378, 39379, 39380, 39381, 39382, 39383, 39384, 39385, 39386, 39387, + 39388, 39389, 39390, 39391, 39392, 39393, 39394, 39395, 39396, 39397, + 39398, 39399, 39400, 39401, 39402, 39403, 39404, 39405, 39406, 39407, + 39408, 39409, 39410, 39411, 39412, 39413, 39414, 39415, 39416, 39417, + 30235, 30268, 30242, 30240, 30272, 30253, 30256, 30271, 30261, 30275, + 30270, 30259, 30285, 30302, 30292, 30300, 30294, 30315, 30319, 32714, + 31462, 31352, 31353, 31360, 31366, 31368, 31381, 31398, 31392, 31404, + 31400, 31405, 31411, 34916, 34921, 34930, 34941, 34943, 34946, 34978, + 35014, 34999, 35004, 35017, 35042, 35022, 35043, 35045, 35057, 35098, + 35068, 35048, 35070, 35056, 35105, 35097, 35091, 35099, 35082, 35124, + 35115, 35126, 35137, 35174, 35195, 30091, 32997, 30386, 30388, 30684, + 32786, 32788, 32790, 32796, 32800, 32802, 32805, 32806, 32807, 32809, + 32808, 32817, 32779, 32821, 32835, 32838, 32845, 32850, 32873, 32881, + 35203, 39032, 39040, 39043, 39418, 39419, 39420, 39421, 39422, 39423, + 39424, 39425, 39426, 39427, 39428, 39429, 39430, 39431, 39432, 39433, + 39434, 39435, 39436, 39437, 39438, 39439, 39440, 39441, 39442, 39443, + 39444, 39445, 39446, 39447, 39448, 39449, 39450, 39451, 39452, 39453, + 39454, 39455, 39456, 39457, 39458, 39459, 39460, 39461, 39462, 39463, + 39464, 39465, 39466, 39467, 39468, 39469, 39470, 39471, 39472, 39473, + 39474, 39475, 39476, 39477, 39478, 39479, 39480, 39481, 39482, 39483, + 39484, 39485, 39486, 39487, 39488, 39489, 39490, 39491, 39492, 39493, + 39494, 39495, 39496, 39497, 39498, 39499, 39500, 39501, 39502, 39503, + 39504, 39505, 39506, 39507, 39508, 39509, 39510, 39511, 39512, 39513, + 39049, 39052, 39053, 39055, 39060, 39066, 39067, 39070, 39071, 39073, + 39074, 39077, 39078, 34381, 34388, 34412, 34414, 34431, 34426, 34428, + 34427, 34472, 34445, 34443, 34476, 34461, 34471, 34467, 34474, 34451, + 34473, 34486, 34500, 34485, 34510, 34480, 34490, 34481, 34479, 34505, + 34511, 34484, 34537, 34545, 34546, 34541, 34547, 34512, 34579, 34526, + 34548, 34527, 34520, 34513, 34563, 34567, 34552, 34568, 34570, 34573, + 34569, 34595, 34619, 34590, 34597, 34606, 34586, 34622, 34632, 34612, + 34609, 34601, 34615, 34623, 34690, 34594, 34685, 34686, 34683, 34656, + 34672, 34636, 34670, 34699, 34643, 34659, 34684, 34660, 34649, 34661, + 34707, 34735, 34728, 34770, 39514, 39515, 39516, 39517, 39518, 39519, + 39520, 39521, 39522, 39523, 39524, 39525, 39526, 39527, 39528, 39529, + 39530, 39531, 39538, 39555, 39561, 39565, 39566, 39572, 39573, 39577, + 39590, 39593, 39594, 39595, 39596, 39597, 39598, 39599, 39602, 39603, + 39604, 39605, 39609, 39611, 39613, 39614, 39615, 39619, 39620, 39622, + 39623, 39624, 39625, 39626, 39629, 39630, 39631, 39632, 39634, 39636, + 39637, 39638, 39639, 39641, 39642, 39643, 39644, 39645, 39646, 39648, + 39650, 39651, 39652, 39653, 39655, 39656, 39657, 39658, 39660, 39662, + 39664, 39665, 39666, 39667, 39668, 39669, 39670, 39671, 39672, 39674, + 39676, 39677, 39678, 39679, 39680, 39681, 39682, 39684, 39685, 39686, + 34758, 34696, 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, + 34739, 34763, 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, + 34798, 34838, 34835, 34814, 34826, 34843, 34849, 34873, 34876, 32566, + 32578, 32580, 32581, 33296, 31482, 31485, 31496, 31491, 31492, 31509, + 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520, + 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564, + 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, 31654, 31655, + 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668, + 31697, 31681, 31692, 31709, 31706, 31717, 31718, 31722, 31756, 31742, + 31740, 31759, 31766, 31755, 39687, 39689, 39690, 39691, 39692, 39693, + 39694, 39696, 39697, 39698, 39700, 39701, 39702, 39703, 39704, 39705, + 39706, 39707, 39708, 39709, 39710, 39712, 39713, 39714, 39716, 39717, + 39718, 39719, 39720, 39721, 39722, 39723, 39724, 39725, 39726, 39728, + 39729, 39731, 39732, 39733, 39734, 39735, 39736, 39737, 39738, 39741, + 39742, 39743, 39744, 39750, 39754, 39755, 39756, 39758, 39760, 39762, + 39763, 39765, 39766, 39767, 39768, 39769, 39770, 39771, 39772, 39773, + 39774, 39775, 39776, 39777, 39778, 39779, 39780, 39781, 39782, 39783, + 39784, 39785, 39786, 39787, 39788, 39789, 39790, 39791, 39792, 39793, + 39794, 39795, 39796, 39797, 39798, 39799, 39800, 39801, 39802, 39803, + 31775, 31786, 31782, 31800, 31809, 31808, 33278, 33281, 33282, 33284, + 33260, 34884, 33313, 33314, 33315, 33325, 33327, 33320, 33323, 33336, + 33339, 33331, 33332, 33342, 33348, 33353, 33355, 33359, 33370, 33375, + 33384, 34942, 34949, 34952, 35032, 35039, 35166, 32669, 32671, 32679, + 32687, 32688, 32690, 31868, 25929, 31889, 31901, 31900, 31902, 31906, + 31922, 31932, 31933, 31937, 31943, 31948, 31949, 31944, 31941, 31959, + 31976, 33390, 26280, 32703, 32718, 32725, 32741, 32737, 32742, 32745, + 32750, 32755, 31992, 32119, 32166, 32174, 32327, 32411, 40632, 40628, + 36211, 36228, 36244, 36241, 36273, 36199, 36205, 35911, 35913, 37194, + 37200, 37198, 37199, 37220, 39804, 39805, 39806, 39807, 39808, 39809, + 39810, 39811, 39812, 39813, 39814, 39815, 39816, 39817, 39818, 39819, + 39820, 39821, 39822, 39823, 39824, 39825, 39826, 39827, 39828, 39829, + 39830, 39831, 39832, 39833, 39834, 39835, 39836, 39837, 39838, 39839, + 39840, 39841, 39842, 39843, 39844, 39845, 39846, 39847, 39848, 39849, + 39850, 39851, 39852, 39853, 39854, 39855, 39856, 39857, 39858, 39859, + 39860, 39861, 39862, 39863, 39864, 39865, 39866, 39867, 39868, 39869, + 39870, 39871, 39872, 39873, 39874, 39875, 39876, 39877, 39878, 39879, + 39880, 39881, 39882, 39883, 39884, 39885, 39886, 39887, 39888, 39889, + 39890, 39891, 39892, 39893, 39894, 39895, 39896, 39897, 39898, 39899, + 37218, 37217, 37232, 37225, 37231, 37245, 37246, 37234, 37236, 37241, + 37260, 37253, 37264, 37261, 37265, 37282, 37283, 37290, 37293, 37294, + 37295, 37301, 37300, 37306, 35925, 40574, 36280, 36331, 36357, 36441, + 36457, 36277, 36287, 36284, 36282, 36292, 36310, 36311, 36314, 36318, + 36302, 36303, 36315, 36294, 36332, 36343, 36344, 36323, 36345, 36347, + 36324, 36361, 36349, 36372, 36381, 36383, 36396, 36398, 36387, 36399, + 36410, 36416, 36409, 36405, 36413, 36401, 36425, 36417, 36418, 36433, + 36434, 36426, 36464, 36470, 36476, 36463, 36468, 36485, 36495, 36500, + 36496, 36508, 36510, 35960, 35970, 35978, 35973, 35992, 35988, 26011, + 35286, 35294, 35290, 35292, 39900, 39901, 39902, 39903, 39904, 39905, + 39906, 39907, 39908, 39909, 39910, 39911, 39912, 39913, 39914, 39915, + 39916, 39917, 39918, 39919, 39920, 39921, 39922, 39923, 39924, 39925, + 39926, 39927, 39928, 39929, 39930, 39931, 39932, 39933, 39934, 39935, + 39936, 39937, 39938, 39939, 39940, 39941, 39942, 39943, 39944, 39945, + 39946, 39947, 39948, 39949, 39950, 39951, 39952, 39953, 39954, 39955, + 39956, 39957, 39958, 39959, 39960, 39961, 39962, 39963, 39964, 39965, + 39966, 39967, 39968, 39969, 39970, 39971, 39972, 39973, 39974, 39975, + 39976, 39977, 39978, 39979, 39980, 39981, 39982, 39983, 39984, 39985, + 39986, 39987, 39988, 39989, 39990, 39991, 39992, 39993, 39994, 39995, + 35301, 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, + 38657, 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835, + 40837, 40838, 40839, 40840, 40841, 40842, 40844, 40702, 40715, 40717, + 38585, 38588, 38589, 38606, 38610, 30655, 38624, 37518, 37550, 37576, + 37694, 37738, 37834, 37775, 37950, 37995, 40063, 40066, 40069, 40070, + 40071, 40072, 31267, 40075, 40078, 40080, 40081, 40082, 40084, 40085, + 40090, 40091, 40094, 40095, 40096, 40097, 40098, 40099, 40101, 40102, + 40103, 40104, 40105, 40107, 40109, 40110, 40112, 40113, 40114, 40115, + 40116, 40117, 40118, 40119, 40122, 40123, 40124, 40125, 40132, 40133, + 40134, 40135, 40138, 40139, 39996, 39997, 39998, 39999, 40000, 40001, + 40002, 40003, 40004, 40005, 40006, 40007, 40008, 40009, 40010, 40011, + 40012, 40013, 40014, 40015, 40016, 40017, 40018, 40019, 40020, 40021, + 40022, 40023, 40024, 40025, 40026, 40027, 40028, 40029, 40030, 40031, + 40032, 40033, 40034, 40035, 40036, 40037, 40038, 40039, 40040, 40041, + 40042, 40043, 40044, 40045, 40046, 40047, 40048, 40049, 40050, 40051, + 40052, 40053, 40054, 40055, 40056, 40057, 40058, 40059, 40061, 40062, + 40064, 40067, 40068, 40073, 40074, 40076, 40079, 40083, 40086, 40087, + 40088, 40089, 40093, 40106, 40108, 40111, 40121, 40126, 40127, 40128, + 40129, 40130, 40136, 40137, 40145, 40146, 40154, 40155, 40160, 40161, + 40140, 40141, 40142, 40143, 40144, 40147, 40148, 40149, 40151, 40152, + 40153, 40156, 40157, 40159, 40162, 38780, 38789, 38801, 38802, 38804, + 38831, 38827, 38819, 38834, 38836, 39601, 39600, 39607, 40536, 39606, + 39610, 39612, 39617, 39616, 39621, 39618, 39627, 39628, 39633, 39749, + 39747, 39751, 39753, 39752, 39757, 39761, 39144, 39181, 39214, 39253, + 39252, 39647, 39649, 39654, 39663, 39659, 39675, 39661, 39673, 39688, + 39695, 39699, 39711, 39715, 40637, 40638, 32315, 40578, 40583, 40584, + 40587, 40594, 37846, 40605, 40607, 40667, 40668, 40669, 40672, 40671, + 40674, 40681, 40679, 40677, 40682, 40687, 40738, 40748, 40751, 40761, + 40759, 40765, 40766, 40772, 40163, 40164, 40165, 40166, 40167, 40168, + 40169, 40170, 40171, 40172, 40173, 40174, 40175, 40176, 40177, 40178, + 40179, 40180, 40181, 40182, 40183, 40184, 40185, 40186, 40187, 40188, + 40189, 40190, 40191, 40192, 40193, 40194, 40195, 40196, 40197, 40198, + 40199, 40200, 40201, 40202, 40203, 40204, 40205, 40206, 40207, 40208, + 40209, 40210, 40211, 40212, 40213, 40214, 40215, 40216, 40217, 40218, + 40219, 40220, 40221, 40222, 40223, 40224, 40225, 40226, 40227, 40228, + 40229, 40230, 40231, 40232, 40233, 40234, 40235, 40236, 40237, 40238, + 40239, 40240, 40241, 40242, 40243, 40244, 40245, 40246, 40247, 40248, + 40249, 40250, 40251, 40252, 40253, 40254, 40255, 40256, 40257, 40258, + 57908, 57909, 57910, 57911, 57912, 57913, 57914, 57915, 57916, 57917, + 57918, 57919, 57920, 57921, 57922, 57923, 57924, 57925, 57926, 57927, + 57928, 57929, 57930, 57931, 57932, 57933, 57934, 57935, 57936, 57937, + 57938, 57939, 57940, 57941, 57942, 57943, 57944, 57945, 57946, 57947, + 57948, 57949, 57950, 57951, 57952, 57953, 57954, 57955, 57956, 57957, + 57958, 57959, 57960, 57961, 57962, 57963, 57964, 57965, 57966, 57967, + 57968, 57969, 57970, 57971, 57972, 57973, 57974, 57975, 57976, 57977, + 57978, 57979, 57980, 57981, 57982, 57983, 57984, 57985, 57986, 57987, + 57988, 57989, 57990, 57991, 57992, 57993, 57994, 57995, 57996, 57997, + 57998, 57999, 58000, 58001, 40259, 40260, 40261, 40262, 40263, 40264, + 40265, 40266, 40267, 40268, 40269, 40270, 40271, 40272, 40273, 40274, + 40275, 40276, 40277, 40278, 40279, 40280, 40281, 40282, 40283, 40284, + 40285, 40286, 40287, 40288, 40289, 40290, 40291, 40292, 40293, 40294, + 40295, 40296, 40297, 40298, 40299, 40300, 40301, 40302, 40303, 40304, + 40305, 40306, 40307, 40308, 40309, 40310, 40311, 40312, 40313, 40314, + 40315, 40316, 40317, 40318, 40319, 40320, 40321, 40322, 40323, 40324, + 40325, 40326, 40327, 40328, 40329, 40330, 40331, 40332, 40333, 40334, + 40335, 40336, 40337, 40338, 40339, 40340, 40341, 40342, 40343, 40344, + 40345, 40346, 40347, 40348, 40349, 40350, 40351, 40352, 40353, 40354, + 58002, 58003, 58004, 58005, 58006, 58007, 58008, 58009, 58010, 58011, + 58012, 58013, 58014, 58015, 58016, 58017, 58018, 58019, 58020, 58021, + 58022, 58023, 58024, 58025, 58026, 58027, 58028, 58029, 58030, 58031, + 58032, 58033, 58034, 58035, 58036, 58037, 58038, 58039, 58040, 58041, + 58042, 58043, 58044, 58045, 58046, 58047, 58048, 58049, 58050, 58051, + 58052, 58053, 58054, 58055, 58056, 58057, 58058, 58059, 58060, 58061, + 58062, 58063, 58064, 58065, 58066, 58067, 58068, 58069, 58070, 58071, + 58072, 58073, 58074, 58075, 58076, 58077, 58078, 58079, 58080, 58081, + 58082, 58083, 58084, 58085, 58086, 58087, 58088, 58089, 58090, 58091, + 58092, 58093, 58094, 58095, 40355, 40356, 40357, 40358, 40359, 40360, + 40361, 40362, 40363, 40364, 40365, 40366, 40367, 40368, 40369, 40370, + 40371, 40372, 40373, 40374, 40375, 40376, 40377, 40378, 40379, 40380, + 40381, 40382, 40383, 40384, 40385, 40386, 40387, 40388, 40389, 40390, + 40391, 40392, 40393, 40394, 40395, 40396, 40397, 40398, 40399, 40400, + 40401, 40402, 40403, 40404, 40405, 40406, 40407, 40408, 40409, 40410, + 40411, 40412, 40413, 40414, 40415, 40416, 40417, 40418, 40419, 40420, + 40421, 40422, 40423, 40424, 40425, 40426, 40427, 40428, 40429, 40430, + 40431, 40432, 40433, 40434, 40435, 40436, 40437, 40438, 40439, 40440, + 40441, 40442, 40443, 40444, 40445, 40446, 40447, 40448, 40449, 40450, + 58096, 58097, 58098, 58099, 58100, 58101, 58102, 58103, 58104, 58105, + 58106, 58107, 58108, 58109, 58110, 58111, 58112, 58113, 58114, 58115, + 58116, 58117, 58118, 58119, 58120, 58121, 58122, 58123, 58124, 58125, + 58126, 58127, 58128, 58129, 58130, 58131, 58132, 58133, 58134, 58135, + 58136, 58137, 58138, 58139, 58140, 58141, 58142, 58143, 58144, 58145, + 58146, 58147, 58148, 58149, 58150, 58151, 58152, 58153, 58154, 58155, + 58156, 58157, 58158, 58159, 58160, 58161, 58162, 58163, 58164, 58165, + 58166, 58167, 58168, 58169, 58170, 58171, 58172, 58173, 58174, 58175, + 58176, 58177, 58178, 58179, 58180, 58181, 58182, 58183, 58184, 58185, + 58186, 58187, 58188, 58189, 40451, 40452, 40453, 40454, 40455, 40456, + 40457, 40458, 40459, 40460, 40461, 40462, 40463, 40464, 40465, 40466, + 40467, 40468, 40469, 40470, 40471, 40472, 40473, 40474, 40475, 40476, + 40477, 40478, 40484, 40487, 40494, 40496, 40500, 40507, 40508, 40512, + 40525, 40528, 40530, 40531, 40532, 40534, 40537, 40541, 40543, 40544, + 40545, 40546, 40549, 40558, 40559, 40562, 40564, 40565, 40566, 40567, + 40568, 40569, 40570, 40571, 40572, 40573, 40576, 40577, 40579, 40580, + 40581, 40582, 40585, 40586, 40588, 40589, 40590, 40591, 40592, 40593, + 40596, 40597, 40598, 40599, 40600, 40601, 40602, 40603, 40604, 40606, + 40608, 40609, 40610, 40611, 40612, 40613, 40615, 40616, 40617, 40618, + 58190, 58191, 58192, 58193, 58194, 58195, 58196, 58197, 58198, 58199, + 58200, 58201, 58202, 58203, 58204, 58205, 58206, 58207, 58208, 58209, + 58210, 58211, 58212, 58213, 58214, 58215, 58216, 58217, 58218, 58219, + 58220, 58221, 58222, 58223, 58224, 58225, 58226, 58227, 58228, 58229, + 58230, 58231, 58232, 58233, 58234, 58235, 58236, 58237, 58238, 58239, + 58240, 58241, 58242, 58243, 58244, 58245, 58246, 58247, 58248, 58249, + 58250, 58251, 58252, 58253, 58254, 58255, 58256, 58257, 58258, 58259, + 58260, 58261, 58262, 58263, 58264, 58265, 58266, 58267, 58268, 58269, + 58270, 58271, 58272, 58273, 58274, 58275, 58276, 58277, 58278, 58279, + 58280, 58281, 58282, 58283, 40619, 40620, 40621, 40622, 40623, 40624, + 40625, 40626, 40627, 40629, 40630, 40631, 40633, 40634, 40636, 40639, + 40640, 40641, 40642, 40643, 40645, 40646, 40647, 40648, 40650, 40651, + 40652, 40656, 40658, 40659, 40661, 40662, 40663, 40665, 40666, 40670, + 40673, 40675, 40676, 40678, 40680, 40683, 40684, 40685, 40686, 40688, + 40689, 40690, 40691, 40692, 40693, 40694, 40695, 40696, 40698, 40701, + 40703, 40704, 40705, 40706, 40707, 40708, 40709, 40710, 40711, 40712, + 40713, 40714, 40716, 40719, 40721, 40722, 40724, 40725, 40726, 40728, + 40730, 40731, 40732, 40733, 40734, 40735, 40737, 40739, 40740, 40741, + 40742, 40743, 40744, 40745, 40746, 40747, 40749, 40750, 40752, 40753, + 58284, 58285, 58286, 58287, 58288, 58289, 58290, 58291, 58292, 58293, + 58294, 58295, 58296, 58297, 58298, 58299, 58300, 58301, 58302, 58303, + 58304, 58305, 58306, 58307, 58308, 58309, 58310, 58311, 58312, 58313, + 58314, 58315, 58316, 58317, 58318, 58319, 58320, 58321, 58322, 58323, + 58324, 58325, 58326, 58327, 58328, 58329, 58330, 58331, 58332, 58333, + 58334, 58335, 58336, 58337, 58338, 58339, 58340, 58341, 58342, 58343, + 58344, 58345, 58346, 58347, 58348, 58349, 58350, 58351, 58352, 58353, + 58354, 58355, 58356, 58357, 58358, 58359, 58360, 58361, 58362, 58363, + 58364, 58365, 58366, 58367, 58368, 58369, 58370, 58371, 58372, 58373, + 58374, 58375, 58376, 58377, 40754, 40755, 40756, 40757, 40758, 40760, + 40762, 40764, 40767, 40768, 40769, 40770, 40771, 40773, 40774, 40775, + 40776, 40777, 40778, 40779, 40780, 40781, 40782, 40783, 40786, 40787, + 40788, 40789, 40790, 40791, 40792, 40793, 40794, 40795, 40796, 40797, + 40798, 40799, 40800, 40801, 40802, 40803, 40804, 40805, 40806, 40807, + 40808, 40809, 40810, 40811, 40812, 40813, 40814, 40815, 40816, 40817, + 40818, 40819, 40820, 40821, 40822, 40823, 40824, 40825, 40826, 40827, + 40828, 40829, 40830, 40833, 40834, 40845, 40846, 40847, 40848, 40849, + 40850, 40851, 40852, 40853, 40854, 40855, 40856, 40860, 40861, 40862, + 40865, 40866, 40867, 40868, 40869, 63788, 63865, 63893, 63975, 63985, + 58378, 58379, 58380, 58381, 58382, 58383, 58384, 58385, 58386, 58387, + 58388, 58389, 58390, 58391, 58392, 58393, 58394, 58395, 58396, 58397, + 58398, 58399, 58400, 58401, 58402, 58403, 58404, 58405, 58406, 58407, + 58408, 58409, 58410, 58411, 58412, 58413, 58414, 58415, 58416, 58417, + 58418, 58419, 58420, 58421, 58422, 58423, 58424, 58425, 58426, 58427, + 58428, 58429, 58430, 58431, 58432, 58433, 58434, 58435, 58436, 58437, + 58438, 58439, 58440, 58441, 58442, 58443, 58444, 58445, 58446, 58447, + 58448, 58449, 58450, 58451, 58452, 58453, 58454, 58455, 58456, 58457, + 58458, 58459, 58460, 58461, 58462, 58463, 58464, 58465, 58466, 58467, + 58468, 58469, 58470, 58471, 64012, 64013, 64014, 64015, 64017, 64019, + 64020, 64024, 64031, 64032, 64033, 64035, 64036, 64039, 64040, 64041, + 11905, 59414, 59415, 59416, 11908, 13427, 13383, 11912, 11915, 59422, + 13726, 13850, 13838, 11916, 11927, 14702, 14616, 59430, 14799, 14815, + 14963, 14800, 59435, 59436, 15182, 15470, 15584, 11943, 59441, 59442, + 11946, 16470, 16735, 11950, 17207, 11955, 11958, 11959, 59451, 17329, + 17324, 11963, 17373, 17622, 18017, 17996, 59459, 18211, 18217, 18300, + 18317, 11978, 18759, 18810, 18813, 18818, 18819, 18821, 18822, 18847, + 18843, 18871, 18870, 59476, 59477, 19619, 19615, 19616, 19617, 19575, + 19618, 19731, 19732, 19733, 19734, 19735, 19736, 19737, 19886, 59492, + 58472, 58473, 58474, 58475, 58476, 58477, 58478, 58479, 58480, 58481, + 58482, 58483, 58484, 58485, 58486, 58487, 58488, 58489, 58490, 58491, + 58492, 58493, 58494, 58495, 58496, 58497, 58498, 58499, 58500, 58501, + 58502, 58503, 58504, 58505, 58506, 58507, 58508, 58509, 58510, 58511, + 58512, 58513, 58514, 58515, 58516, 58517, 58518, 58519, 58520, 58521, + 58522, 58523, 58524, 58525, 58526, 58527, 58528, 58529, 58530, 58531, + 58532, 58533, 58534, 58535, 58536, 58537, 58538, 58539, 58540, 58541, + 58542, 58543, 58544, 58545, 58546, 58547, 58548, 58549, 58550, 58551, + 58552, 58553, 58554, 58555, 58556, 58557, 58558, 58559, 58560, 58561, + 58562, 58563, 58564, 58565, ]; #[inline] -pub fn forward(code: u32) -> u32 { - if (code > 39419 && code < 189000) || code > 1237575 { return 0xffffffff; } - let mut i = if code >= BACKWARD_TABLE[127] {81} else {0}; - if code >= BACKWARD_TABLE[i+63] { i += 64; } - if code >= BACKWARD_TABLE[i+31] { i += 32; } - if code >= BACKWARD_TABLE[i+15] { i += 16; } - if code >= BACKWARD_TABLE[i+7] { i += 8; } - if code >= BACKWARD_TABLE[i+3] { i += 4; } - if code >= BACKWARD_TABLE[i+1] { i += 2; } - if code >= BACKWARD_TABLE[i] { i += 1; } - (code - BACKWARD_TABLE[i-1]) + FORWARD_TABLE[i-1] +pub fn forward(code: u16) -> u32 { + let code = code as uint; + if code < 23940 { + FORWARD_TABLE[code] as u32 + } else { + 0xffff + } } +static BACKWARD_TABLE_LOWER: &'static [u16] = &[ + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 6247, 65535, 65535, 6251, 6182, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6242, 6207, 65535, 65535, + 65535, 65535, 65535, 6179, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 6208, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 7509, 7507, 65535, 65535, 65535, 65535, 65535, 65535, 7513, + 7511, 7531, 65535, 7517, 7515, 65535, 65535, 65535, 65535, 7521, 7519, + 65535, 65535, 65535, 6209, 65535, 7525, 7523, 65535, 7530, 65535, 65535, + 65535, 65535, 7506, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7510, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 7512, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 7514, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 7534, 65535, 65535, 65535, 7535, 65535, + 65535, 65535, 65535, 7518, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 7522, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 7508, 65535, 7516, 65535, 7520, + 65535, 7524, 65535, 7526, 65535, 7527, 65535, 7528, 65535, 7529, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7536, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7532, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 7537, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 6181, 65535, 6180, 7410, 7411, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7412, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 7126, 7127, 7128, 7129, 7130, 7131, 7132, 7133, 7134, 7135, + 7136, 7137, 7138, 7139, 7140, 7141, 7142, 65535, 7143, 7144, 7145, 7146, + 7147, 7148, 7149, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7158, + 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, 7170, + 7171, 7172, 7173, 7174, 65535, 7175, 7176, 7177, 7178, 7179, 7180, 7181, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 7322, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7316, 7317, 7318, 7319, + 7320, 7321, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, + 7333, 7334, 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, + 7345, 7346, 7347, 7348, 7364, 7365, 7366, 7367, 7368, 7369, 7371, 7372, + 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384, + 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, + 65535, 7370, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 7628, 65535, 65535, 7413, 6185, 7414, 6187, 65535, 6189, 6190, + 65535, 65535, 6191, 6192, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 7415, 6188, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 6250, 65535, 6243, 6244, 65535, 7416, 65535, 65535, 65535, 65535, 65535, + 6264, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 6432, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6245, 65535, 7417, + 65535, 65535, 65535, 7418, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 6252, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 7625, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 6446, 6447, 6448, 6449, 6450, 6451, + 6452, 6453, 6454, 6455, 6456, 6457, 65535, 65535, 65535, 65535, 6366, 6367, + 6368, 6369, 6370, 6371, 6372, 6373, 6374, 6375, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6266, 6267, 6265, + 6268, 65535, 65535, 7419, 7420, 7421, 7422, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6217, + 65535, 65535, 65535, 65535, 65535, 65535, 6214, 65535, 6213, 65535, 65535, + 65535, 7423, 65535, 65535, 65535, 65535, 6219, 65535, 65535, 6231, 6237, + 7424, 6222, 65535, 65535, 7425, 65535, 6221, 65535, 6211, 6212, 6216, 6215, + 6225, 65535, 65535, 6226, 65535, 65535, 65535, 65535, 65535, 6239, 6238, + 6210, 6218, 65535, 65535, 65535, 65535, 65535, 6230, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6229, 65535, 65535, 65535, + 6228, 65535, 65535, 65535, 65535, 65535, 7426, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6232, 6227, + 65535, 65535, 6235, 6236, 7427, 7428, 65535, 65535, 65535, 65535, 65535, + 65535, 6233, 6234, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7491, 65535, + 65535, 65535, 6224, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 6220, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7429, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 6223, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6422, 6423, + 6424, 6425, 6426, 6427, 6428, 6429, 6430, 6431, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 6402, 6403, 6404, 6405, 6406, + 6407, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, + 6419, 6420, 6421, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, + 6391, 6392, 6393, 6394, 6395, 6396, 6397, 6398, 6399, 6400, 6401, 65535, + 65535, 65535, 65535, 7699, 7700, 7701, 7702, 7703, 7704, 7705, 7706, 7707, + 7708, 7709, 7710, 7711, 7712, 7713, 7714, 7715, 7716, 7717, 7718, 7719, + 7720, 7721, 7722, 7723, 7724, 7725, 7726, 7727, 7728, 7729, 7730, 7731, + 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7743, + 7744, 7745, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755, + 7756, 7757, 7758, 7759, 7760, 7761, 7762, 7763, 7764, 7765, 7766, 7767, + 7768, 7769, 7770, 7771, 7772, 7773, 7774, 65535, 65535, 65535, 65535, 7430, + 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, + 7443, 7444, 7445, 7446, 7447, 7448, 7449, 7450, 7451, 7452, 7453, 7454, + 7455, 7456, 7457, 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7465, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, 7474, 7475, + 7476, 7477, 7478, 7479, 7480, 65535, 65535, 65535, 7481, 7482, 7483, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6261, 6260, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 6263, 6262, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 7484, 7485, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 6259, 6258, 65535, 65535, 65535, 6255, 65535, + 65535, 6257, 6256, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7486, + 7487, 7488, 7489, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 6254, 6253, 65535, 65535, 7490, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6241, 65535, + 6240, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 23766, 65535, 65535, 23770, 65535, 65535, 65535, 23773, 65535, 65535, + 23774, 23779, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23780, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23793, 65535, + 65535, 23796, 65535, 65535, 65535, 23799, 65535, 65535, 65535, 65535, + 23801, 65535, 65535, 23802, 23803, 65535, 65535, 65535, 23807, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 23817, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 7673, 7674, 7675, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7683, + 7684, 65535, 65535, 65535, 65535, 6176, 6177, 6178, 6183, 65535, 6184, + 7637, 7685, 6195, 6196, 6197, 6198, 6199, 6200, 6201, 6202, 6205, 6206, + 7492, 6269, 6193, 6194, 6203, 6204, 65535, 65535, 65535, 65535, 65535, + 7493, 7494, 65535, 65535, 7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, + 7608, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7672, + 65535, 65535, 6746, 6747, 6748, 6749, 6750, 6751, 6752, 6753, 6754, 6755, + 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, + 6768, 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, + 6780, 6781, 6782, 6783, 6784, 6785, 6786, 6787, 6788, 6789, 6790, 6791, + 6792, 6793, 6794, 6795, 6796, 6797, 6798, 6799, 6800, 6801, 6802, 6803, + 6804, 6805, 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, 6814, 6815, + 6816, 6817, 6818, 6819, 6820, 6821, 6822, 6823, 6824, 6825, 6826, 6827, + 6828, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7633, 7634, 7638, + 7639, 65535, 65535, 6936, 6937, 6938, 6939, 6940, 6941, 6942, 6943, 6944, + 6945, 6946, 6947, 6948, 6949, 6950, 6951, 6952, 6953, 6954, 6955, 6956, + 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6964, 6965, 6966, 6967, 6968, + 6969, 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979, 6980, + 6981, 6982, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6992, + 6993, 6994, 6995, 6996, 6997, 6998, 6999, 7000, 7001, 7002, 7003, 7004, + 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, + 7017, 7018, 7019, 7020, 7021, 65535, 65535, 65535, 65535, 65535, 7632, + 7635, 7636, 65535, 65535, 65535, 65535, 65535, 65535, 7542, 7543, 7544, + 7545, 7546, 7547, 7548, 7549, 7550, 7551, 7552, 7553, 7554, 7555, 7556, + 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, + 7569, 7570, 7571, 7572, 7573, 7574, 7575, 7576, 7577, 7578, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6434, + 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 7626, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 7609, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 7610, 7611, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 7612, 7613, 7614, 65535, 65535, + 7615, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 7616, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 7617, 65535, 65535, 7618, 7619, 65535, 65535, 7620, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23772, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 23771, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 23776, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 23778, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23777, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23782, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 23781, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23784, 23787, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 23785, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 23786, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 23790, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23791, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 23792, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 23797, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 23798, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23800, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 23806, 65535, 65535, 65535, 65535, 23805, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23808, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 23809, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 23811, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23810, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 23813, 65535, 65535, 65535, 65535, 65535, 23814, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23815, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 23816, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 23818, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23819, 65535, 65535, 23820, 65535, 65535, 65535, 65535, + 23821, 23822, 65535, 23823, 23824, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 23826, 65535, 65535, 65535, 23825, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23828, 23827, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 23835, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 23832, 23833, 23834, 23836, 23831, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23837, 23838, 23839, + 23840, 23841, 23842, 23843, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 23844, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 15512, 10166, 0, 13268, 1, 2, 3, 14617, 16096, 13678, 13822, + 14949, 16627, 9432, 15750, 4, 16629, 9678, 5, 16443, 13445, 16632, 13997, + 6, 13475, 9306, 15506, 9837, 10176, 14186, 16634, 7, 8, 9, 10175, 10, + 12284, 15342, 11, 13780, 16638, 12, 10631, 15325, 18775, 16293, 13, 14, + 10420, 15, 9799, 16, 12312, 17, 16653, 18, 14607, 9979, 14735, 16332, 19, + 12151, 11742, 16640, 20, 21, 22, 12868, 23, 11720, 24, 16642, 12655, 15554, + 25, 16259, 14783, 16062, 11010, 10361, 12119, 26, 13230, 13065, 13434, 27, + 10787, 28, 9638, 15535, 29, 30, 16656, 11722, 13287, 15503, 14931, 14986, + 31, 32, 33, 34, 14038, 35, 36, 16657, 37, 38, 39, 40, 41, 42, 12527, 12495, + 43, 13658, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 13407, 54, 55, 56, 57, + 58, 59, 60, 12298, 61, 15747, 16144, 62, 13999, 10259, 16626, 15733, 11962, + 63, 15903, 11120, 16658, 14794, 11699, 64, 65, 16633, 66, 15334, 15114, 67, + 68, 69, 16654, 16894, 14621, 11901, 70, 11522, 10930, 15549, 9495, 10989, + 12847, 71, 14992, 11694, 14539, 12288, 72, 73, 74, 13450, 16896, 75, 16899, + 76, 77, 78, 79, 13628, 16698, 80, 81, 82, 15543, 13983, 13627, 16701, + 16699, 16663, 11581, 13250, 9675, 83, 16700, 11576, 11568, 84, 13637, 9836, + 85, 86, 12501, 87, 9459, 16483, 14008, 14246, 16099, 10567, 14956, 88, 89, + 90, 16873, 16705, 13405, 91, 16703, 92, 9875, 12333, 15537, 93, 94, 16702, + 95, 15524, 16704, 12674, 96, 97, 98, 15381, 99, 16302, 16707, 100, 16710, + 11399, 11364, 101, 102, 103, 13631, 104, 10416, 105, 10389, 106, 13288, + 107, 108, 109, 110, 111, 112, 113, 16713, 15518, 114, 115, 14798, 11336, + 10447, 10360, 15166, 116, 117, 118, 119, 120, 16303, 15712, 11194, 11180, + 16706, 121, 122, 13776, 14741, 9796, 123, 16708, 124, 13818, 16711, 12500, + 16712, 125, 126, 14742, 16714, 127, 128, 129, 9419, 10767, 130, 16818, 131, + 9098, 132, 12325, 133, 13851, 134, 14192, 135, 14193, 16819, 136, 137, 138, + 139, 140, 10047, 141, 142, 9986, 143, 144, 145, 146, 147, 148, 14752, + 10020, 16436, 16519, 15726, 149, 14414, 150, 10971, 151, 16817, 16875, + 15739, 16718, 10435, 16522, 16719, 16715, 16816, 12892, 152, 153, 15697, + 16709, 16876, 154, 16716, 155, 13084, 156, 157, 12113, 158, 159, 15375, + 9084, 160, 161, 11354, 16821, 162, 16820, 163, 164, 165, 166, 16827, 16829, + 167, 16826, 13990, 168, 169, 170, 16824, 16267, 171, 172, 173, 9657, 16823, + 174, 12158, 175, 14009, 176, 16825, 177, 16822, 178, 179, 16831, 180, 181, + 10182, 182, 183, 184, 10744, 185, 15517, 186, 187, 14947, 188, 189, 12479, + 190, 11531, 16131, 9469, 13435, 11950, 16828, 191, 16830, 192, 14799, + 11003, 193, 194, 195, 196, 197, 13449, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 9282, 207, 208, 209, 9842, 10242, 16835, 210, 211, 212, 213, + 11876, 214, 215, 216, 16877, 13441, 12159, 16839, 217, 218, 219, 220, 221, + 14210, 10448, 222, 16836, 223, 16838, 9218, 15740, 16840, 224, 15142, 225, + 16837, 226, 227, 16832, 228, 16833, 12264, 16834, 229, 230, 11388, 15167, + 10554, 231, 11752, 232, 16844, 233, 234, 235, 236, 16841, 237, 9044, 238, + 239, 240, 16849, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, + 252, 253, 16851, 9237, 254, 16846, 255, 256, 10000, 257, 11768, 258, 259, + 260, 14385, 11007, 15533, 261, 16850, 262, 263, 11567, 264, 9606, 265, 266, + 267, 16852, 11760, 268, 16853, 16842, 12888, 269, 16845, 16848, 16847, 270, + 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 16069, 281, 16266, 282, + 13462, 283, 284, 285, 286, 16855, 287, 288, 289, 11362, 16857, 290, 291, + 292, 16843, 293, 16858, 13216, 294, 295, 296, 297, 298, 16856, 299, 300, + 301, 302, 16521, 303, 14538, 304, 305, 306, 307, 308, 309, 310, 311, 11496, + 312, 313, 314, 315, 316, 317, 16859, 318, 319, 320, 321, 322, 323, 324, + 325, 326, 13043, 14556, 327, 328, 329, 16860, 330, 331, 16854, 9600, 11969, + 332, 333, 334, 335, 10566, 336, 337, 12157, 338, 339, 340, 341, 9113, 342, + 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, + 358, 359, 360, 361, 362, 9871, 363, 16861, 364, 16862, 9787, 16863, 365, + 366, 9848, 367, 368, 369, 370, 371, 9058, 372, 373, 374, 375, 376, 377, + 378, 16864, 13796, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, + 390, 391, 392, 393, 394, 395, 396, 397, 14996, 398, 399, 400, 401, 402, + 403, 16865, 404, 405, 406, 12292, 407, 408, 409, 410, 411, 412, 413, 414, + 415, 416, 417, 16869, 13789, 418, 419, 420, 421, 16868, 16867, 16870, 422, + 423, 424, 425, 14214, 426, 11504, 427, 428, 429, 430, 431, 13212, 432, 433, + 434, 435, 436, 437, 438, 439, 440, 441, 16866, 16871, 442, 443, 444, 16872, + 445, 446, 447, 448, 449, 450, 13654, 451, 452, 453, 454, 455, 456, 457, + 458, 459, 460, 461, 462, 463, 464, 12125, 465, 466, 467, 468, 469, 470, + 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, + 486, 487, 488, 489, 490, 491, 492, 493, 10254, 16628, 15907, 494, 15875, + 15159, 9663, 16110, 495, 14955, 10801, 496, 11918, 497, 12701, 498, 499, + 500, 10215, 501, 502, 14570, 16893, 16895, 503, 504, 505, 9994, 506, 10186, + 507, 508, 509, 510, 511, 11689, 512, 513, 13660, 514, 515, 13596, 516, 517, + 9068, 10746, 12344, 16881, 518, 12093, 10753, 519, 10791, 15148, 9303, + 13273, 11748, 10043, 16475, 520, 15383, 11375, 14027, 521, 522, 11334, + 16885, 16696, 523, 524, 12883, 525, 526, 10597, 13614, 527, 528, 9470, + 15922, 529, 530, 531, 532, 12651, 533, 534, 12700, 17007, 13648, 535, + 15125, 536, 11777, 13024, 537, 538, 539, 10793, 540, 17008, 541, 15874, + 17009, 542, 543, 544, 545, 546, 16906, 10177, 547, 548, 10430, 9304, 16907, + 9664, 11771, 549, 11961, 15502, 12133, 550, 551, 552, 10184, 16909, 16908, + 553, 554, 11712, 555, 556, 557, 13269, 558, 16463, 17006, 559, 12280, 560, + 10057, 12327, 561, 562, 11390, 563, 9838, 564, 565, 566, 567, 568, 569, + 570, 571, 572, 12316, 573, 12918, 574, 575, 11329, 10373, 576, 577, 10434, + 578, 579, 580, 581, 582, 583, 16891, 584, 13235, 585, 11888, 11158, 586, + 587, 10017, 588, 17236, 15160, 589, 14560, 9053, 9681, 11202, 17237, 10940, + 590, 15933, 9997, 10058, 16679, 13633, 591, 592, 10409, 13443, 16680, 593, + 11890, 594, 595, 17222, 16681, 596, 597, 15149, 11129, 598, 599, 600, + 20265, 12303, 12340, 15947, 10598, 9805, 601, 9680, 602, 603, 13805, 604, + 605, 606, 13063, 607, 608, 609, 13072, 12156, 610, 9295, 611, 16682, 10781, + 612, 10004, 613, 614, 16683, 615, 616, 16283, 14157, 13600, 13793, 9829, + 11919, 617, 10819, 618, 16684, 16685, 10236, 11338, 14419, 619, 620, 621, + 622, 623, 624, 15002, 625, 16686, 13411, 626, 627, 10783, 11498, 628, 629, + 14407, 630, 13247, 631, 632, 633, 634, 635, 16689, 636, 16687, 637, 638, + 16688, 639, 640, 641, 9119, 642, 11756, 643, 13968, 11389, 644, 645, 646, + 647, 10562, 648, 649, 10623, 650, 651, 652, 653, 654, 655, 656, 657, 658, + 659, 16691, 660, 11538, 661, 16693, 16692, 662, 663, 664, 665, 666, 13107, + 667, 668, 669, 670, 671, 672, 673, 16694, 674, 675, 16695, 676, 677, 678, + 679, 680, 681, 682, 12261, 683, 13601, 9101, 10741, 11356, 14806, 17224, + 12306, 684, 685, 686, 687, 10180, 16335, 13027, 11552, 17225, 17226, 688, + 689, 690, 12153, 11687, 12110, 691, 692, 693, 694, 695, 696, 697, 698, 699, + 700, 17227, 14003, 701, 702, 703, 9415, 704, 705, 706, 15709, 707, 12702, + 708, 15306, 709, 710, 711, 712, 17229, 713, 12118, 714, 715, 716, 17230, + 717, 11892, 718, 719, 720, 721, 722, 723, 12853, 724, 725, 726, 727, 13453, + 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 17231, 739, 740, + 741, 742, 743, 744, 745, 746, 16887, 13830, 747, 748, 749, 10755, 14805, + 15905, 750, 751, 752, 753, 9117, 9835, 754, 15162, 755, 756, 757, 758, + 16888, 759, 17808, 16890, 760, 761, 762, 763, 16641, 11130, 9232, 764, + 9650, 16671, 765, 766, 15914, 767, 768, 11514, 11954, 769, 14942, 770, 771, + 16673, 772, 773, 774, 10398, 775, 776, 777, 16674, 778, 779, 780, 781, 782, + 783, 784, 785, 786, 787, 13210, 13483, 15514, 788, 789, 16675, 12893, 790, + 13979, 791, 13402, 792, 16631, 793, 13868, 14796, 11175, 9100, 794, 795, + 796, 11125, 15118, 797, 9231, 16503, 16466, 798, 9980, 12529, 12872, 799, + 800, 9414, 801, 9428, 802, 9284, 17973, 16083, 11883, 12457, 16678, 12462, + 803, 16677, 14777, 804, 17069, 805, 14757, 806, 807, 16645, 12649, 15676, + 14728, 808, 11325, 13605, 12494, 809, 11762, 15127, 810, 17070, 811, 812, + 813, 814, 13463, 815, 816, 9602, 817, 10247, 14437, 12155, 818, 819, 12152, + 820, 15320, 15360, 16664, 821, 822, 823, 824, 825, 826, 827, 9467, 828, + 829, 12134, 830, 11006, 831, 832, 16665, 833, 15878, 834, 835, 14980, + 16666, 836, 16667, 14950, 837, 9683, 11724, 838, 839, 840, 841, 16668, 842, + 843, 844, 845, 846, 847, 848, 17239, 849, 850, 851, 852, 13590, 853, 854, + 855, 14971, 856, 13679, 9451, 857, 858, 859, 860, 861, 15729, 9475, 11321, + 15724, 14166, 10375, 862, 863, 864, 10357, 865, 866, 14034, 867, 13586, + 14025, 9283, 15185, 868, 13064, 869, 870, 871, 17232, 10069, 872, 873, + 11933, 10772, 11753, 12332, 874, 17977, 17976, 16272, 11543, 16112, 9065, + 10168, 11916, 14353, 17974, 13988, 15725, 875, 16672, 15507, 10962, 14185, + 14375, 876, 17978, 10055, 17975, 877, 878, 879, 15760, 880, 9647, 10632, + 881, 17981, 882, 10972, 11315, 10060, 883, 14547, 12726, 11008, 12149, + 14569, 14997, 17979, 14952, 884, 12477, 17980, 12525, 885, 886, 887, 11778, + 888, 12318, 14579, 15572, 10400, 17988, 889, 17991, 890, 891, 10436, 9066, + 10219, 10407, 892, 10937, 14438, 11927, 14172, 13289, 893, 16253, 17992, + 894, 14791, 9614, 895, 896, 14817, 9806, 897, 14764, 11005, 898, 14790, + 899, 15324, 900, 901, 17987, 902, 903, 9869, 904, 9637, 905, 10615, 17982, + 906, 907, 908, 909, 12862, 910, 17983, 17984, 17985, 13042, 17986, 17989, + 15882, 17990, 911, 13421, 14781, 912, 913, 914, 915, 916, 12881, 917, + 17997, 918, 18002, 919, 16305, 920, 921, 922, 923, 924, 925, 926, 927, + 17996, 18013, 14747, 928, 10964, 18001, 17995, 13077, 929, 930, 13850, + 11009, 12727, 931, 932, 11740, 933, 17993, 934, 18000, 935, 13071, 936, + 937, 938, 939, 16061, 10970, 940, 11729, 15704, 10577, 941, 16313, 942, + 17994, 10765, 11882, 943, 944, 12347, 17998, 17999, 945, 18003, 946, 947, + 948, 949, 950, 18014, 18024, 951, 18010, 18009, 16476, 18022, 18023, 19170, + 15492, 18005, 952, 11884, 953, 15924, 954, 11915, 18007, 955, 956, 957, + 14959, 958, 959, 18016, 960, 15337, 961, 18017, 9032, 13228, 18006, 962, + 10994, 963, 10228, 14594, 10829, 15918, 964, 965, 18018, 14991, 9030, + 18026, 18004, 15333, 18008, 18011, 18012, 18015, 966, 11124, 967, 18019, + 18020, 968, 18021, 18025, 18027, 15695, 969, 970, 971, 972, 973, 10616, + 13037, 18029, 13833, 12263, 12861, 974, 975, 11937, 15003, 976, 977, 978, + 16115, 18033, 979, 980, 981, 982, 983, 984, 9429, 985, 10988, 18031, 986, + 17228, 987, 15363, 988, 989, 990, 991, 14239, 9814, 992, 9031, 993, 994, + 995, 996, 997, 18036, 14383, 18037, 998, 999, 18032, 1000, 1001, 1002, + 1003, 1004, 1005, 18028, 1006, 1007, 1008, 1009, 18030, 1010, 18034, 18035, + 11144, 1011, 1012, 18038, 1013, 1014, 18039, 1015, 11118, 1016, 14024, + 14733, 18152, 9605, 1017, 18151, 1018, 1019, 1020, 18146, 1021, 1022, 1023, + 1024, 18049, 1025, 14592, 18047, 1026, 18045, 1027, 11923, 16471, 1028, + 13819, 1029, 1030, 18043, 9026, 1031, 1032, 1033, 1034, 1035, 18048, 1036, + 1037, 1038, 1039, 18046, 18147, 1040, 1041, 1042, 1043, 1044, 18153, 1045, + 1046, 1047, 1048, 10395, 1049, 1050, 13206, 13797, 12083, 18040, 1051, + 1052, 13045, 1053, 16661, 18044, 12911, 1054, 1055, 1056, 1057, 1058, 1059, + 18148, 18149, 18150, 15110, 1060, 1061, 18165, 14413, 1062, 18162, 1063, + 11881, 18160, 14750, 18156, 13813, 1064, 1065, 12079, 18159, 11002, 10941, + 18154, 1066, 1067, 1068, 18041, 1069, 18164, 1070, 1071, 18169, 1072, 1073, + 1074, 9798, 18170, 1075, 1076, 14933, 10965, 1077, 18161, 1078, 1079, 1080, + 1081, 1082, 1083, 1084, 15195, 1085, 1086, 1087, 1088, 1089, 1090, 1091, + 1092, 1093, 18157, 1094, 15956, 1095, 18042, 1096, 13086, 1097, 18158, + 1098, 15762, 1099, 18167, 18168, 1100, 1101, 1102, 1103, 1104, 18181, + 15170, 1105, 1106, 1107, 18173, 1108, 1109, 18186, 18187, 1110, 1111, 1112, + 18175, 18155, 13779, 18178, 1113, 18163, 1114, 1115, 1116, 1117, 1118, + 14005, 18180, 1119, 18166, 1120, 14768, 1121, 14190, 18190, 18183, 18179, + 1122, 18188, 1123, 18171, 18176, 18177, 1124, 1125, 18182, 1126, 1127, + 18184, 18185, 1128, 18189, 1129, 18172, 1130, 1131, 1132, 1133, 1134, + 14207, 18198, 1135, 18199, 18195, 1136, 1137, 1138, 1139, 1140, 1141, + 18193, 11351, 1142, 1143, 18194, 1144, 10579, 16662, 1145, 1146, 1147, + 1148, 1149, 1150, 1151, 1152, 15179, 1153, 1154, 12524, 1155, 1156, 18192, + 18174, 1157, 1158, 1159, 18197, 18196, 1160, 1161, 18200, 1162, 1163, 1164, + 1165, 18205, 18201, 1166, 1167, 1168, 16331, 9611, 1169, 16511, 1170, + 14182, 1171, 1172, 18203, 1173, 14816, 1174, 1175, 1176, 10982, 1177, 1178, + 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 18210, 18206, + 15498, 1189, 1190, 1191, 1192, 1193, 18211, 1194, 1195, 18204, 18202, + 18208, 1196, 1197, 18209, 1198, 1199, 1200, 1201, 1202, 18207, 1203, 18213, + 1204, 1205, 1206, 13292, 16637, 15940, 18215, 14006, 1207, 1208, 1209, + 1210, 18214, 1211, 1212, 1213, 1214, 10578, 1215, 1216, 1217, 1218, 18216, + 18217, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 18218, 18212, 1227, + 1228, 1229, 1230, 1231, 1232, 1233, 10956, 14416, 1234, 1235, 1236, 18219, + 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, + 1249, 1250, 1251, 15004, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, + 1260, 1261, 1262, 18220, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 13619, + 1270, 1271, 1272, 1273, 11527, 1274, 1275, 1276, 1277, 1278, 1279, 1280, + 1281, 1282, 1283, 1284, 1285, 1286, 12875, 1287, 1288, 1289, 1290, 1291, + 1292, 1293, 1294, 1295, 18221, 1296, 1297, 18222, 1298, 1299, 13479, 14191, + 1300, 18223, 11171, 16647, 15567, 18224, 14572, 1301, 10223, 1302, 1303, + 1304, 1305, 1306, 1307, 18226, 1308, 15881, 1309, 1310, 12072, 9834, 1311, + 1312, 14732, 18225, 1313, 1314, 1315, 18227, 10779, 1316, 1317, 10825, + 14563, 18228, 1318, 1319, 1320, 13257, 18229, 1321, 15883, 1322, 13591, + 18231, 18230, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, + 1333, 1334, 1335, 1336, 1337, 1338, 1339, 18232, 1340, 1341, 14568, 1342, + 1343, 1344, 13970, 1345, 1346, 1347, 1348, 15923, 17250, 17252, 1349, + 17251, 10806, 17255, 17256, 10031, 1350, 1351, 17253, 1352, 1353, 1354, + 1355, 1356, 17254, 9596, 17258, 1357, 1358, 11203, 1359, 16268, 1360, + 17259, 1361, 1362, 1363, 1364, 11774, 1365, 1366, 10382, 1367, 17243, + 14359, 11893, 11136, 16523, 11926, 1368, 1369, 1370, 1371, 1372, 11948, + 1373, 1374, 11370, 14364, 17257, 9076, 14800, 10411, 16460, 13239, 1375, + 1376, 12069, 1377, 14370, 1378, 17266, 17260, 13231, 17262, 1379, 17267, + 1380, 13102, 1381, 1382, 1383, 17269, 1384, 1385, 17268, 11907, 1386, 1387, + 1388, 17265, 17264, 1389, 1390, 1391, 1392, 1393, 9810, 12077, 12447, + 17261, 17263, 1394, 1395, 1396, 1397, 15150, 17272, 1398, 1399, 1400, 1401, + 1402, 12126, 17277, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 10231, 1410, + 1411, 1412, 1413, 17278, 17245, 10759, 15876, 17271, 1414, 11924, 17275, + 1415, 17244, 1416, 10045, 1417, 17270, 11944, 1418, 1419, 1420, 17273, + 1421, 17276, 1422, 1423, 1424, 17284, 1425, 1426, 1427, 1428, 1429, 1430, + 1431, 1432, 1433, 10736, 9028, 1434, 1435, 1436, 1437, 1438, 1439, 1440, + 12526, 1441, 1442, 9634, 17274, 1443, 1444, 17283, 1445, 13255, 17279, + 1446, 1447, 17280, 17282, 17281, 1448, 1449, 17289, 1450, 15757, 9431, + 1451, 1452, 1453, 17288, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, + 17389, 1462, 17286, 1463, 1464, 1465, 1466, 17285, 1467, 1468, 1469, 17287, + 13079, 11204, 1470, 1471, 17388, 1472, 1473, 17390, 1474, 14380, 1475, + 1476, 1477, 10214, 17607, 1478, 1479, 1480, 17386, 1481, 17387, 1482, 1483, + 1484, 13416, 1485, 1486, 1487, 10238, 1488, 1489, 1490, 17392, 1491, 1492, + 1493, 1494, 17391, 1495, 17394, 9219, 1496, 1497, 10019, 1498, 1499, 1500, + 1501, 1502, 11891, 1503, 1504, 1505, 1506, 1507, 15358, 1508, 1509, 1510, + 1511, 10199, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, + 1522, 1523, 1524, 1525, 17393, 1526, 1527, 1528, 1529, 1530, 1531, 1532, + 14245, 20318, 1533, 1534, 1535, 14215, 1536, 1537, 14249, 1538, 1539, 1540, + 14378, 1541, 1542, 1543, 1544, 1545, 13676, 1546, 1547, 1548, 1549, 1550, + 1551, 17395, 1552, 1553, 1554, 1555, 1556, 14423, 17396, 1557, 1558, 1559, + 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, + 1572, 1573, 17246, 1574, 17400, 17397, 1575, 11704, 1576, 14056, 1577, + 1578, 1579, 17398, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 13817, + 12850, 1588, 1589, 1590, 1591, 1592, 13424, 17399, 1593, 1594, 1595, 15951, + 15175, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 12836, 10218, 1604, + 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, + 1617, 1618, 1619, 1620, 1621, 17247, 1622, 1623, 1624, 1625, 9273, 1626, + 1627, 1628, 17248, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, + 1638, 1639, 17249, 1640, 1641, 1642, 10955, 1643, 1644, 1645, 1646, 1647, + 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 13617, 1657, 1658, + 1659, 1660, 1661, 1662, 13996, 13626, 1663, 16454, 1664, 13864, 1665, 1666, + 11914, 1667, 1668, 11013, 1669, 1670, 15513, 1671, 1672, 1673, 1674, 1675, + 1676, 1677, 1678, 18551, 1679, 9791, 1680, 1681, 9239, 1682, 1683, 1684, + 1685, 1686, 10565, 1687, 14951, 1688, 1689, 1690, 1691, 16886, 14921, + 14601, 1692, 1693, 16892, 10229, 1694, 15510, 1695, 1696, 10762, 1697, + 1698, 1699, 1700, 18550, 18548, 1701, 9868, 1702, 14421, 14356, 10437, + 1703, 16643, 15370, 10952, 1704, 13972, 1705, 1706, 14558, 1707, 1708, + 15521, 11943, 11353, 10230, 1709, 17802, 1710, 1711, 1712, 1713, 17803, + 17223, 1714, 15352, 1715, 1716, 13275, 12871, 10433, 1717, 10415, 1718, + 1719, 11967, 16499, 1720, 13290, 1721, 1722, 9243, 17805, 11512, 14400, + 17807, 1723, 17806, 1724, 1725, 1726, 1727, 1728, 10051, 1729, 13836, 1730, + 1731, 9059, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, + 1742, 1743, 1744, 13029, 13026, 1745, 12869, 1746, 11378, 14248, 1747, + 1748, 1749, 10960, 1750, 1751, 1752, 19184, 13656, 19185, 14628, 1753, + 16452, 10575, 12517, 1754, 13634, 1755, 1756, 19186, 1757, 1758, 1759, + 1760, 10207, 11348, 1761, 1762, 15388, 19286, 1763, 12713, 1764, 1765, + 1766, 1767, 19289, 1768, 1769, 1770, 1771, 19189, 19290, 14590, 1772, 1773, + 10388, 19187, 19188, 19288, 1774, 1775, 12886, 19293, 1776, 1777, 19292, + 1778, 1779, 1780, 1781, 1782, 1783, 12670, 1784, 13267, 1785, 1786, 19295, + 1787, 1788, 1789, 1790, 1791, 1792, 1793, 12848, 1794, 1795, 1796, 19287, + 13993, 1797, 1798, 1799, 1800, 11562, 10770, 19291, 15158, 14740, 1801, + 1802, 19294, 19301, 1803, 15491, 1804, 11505, 19298, 1805, 1806, 1807, + 1808, 1809, 19300, 1810, 12114, 1811, 1812, 15529, 1813, 1814, 1815, 11312, + 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, + 19302, 1828, 15571, 1829, 1830, 1831, 16478, 1832, 14629, 1833, 14597, + 12451, 19296, 19297, 11526, 19299, 19304, 1834, 1835, 19303, 1836, 1837, + 1838, 1839, 19307, 1840, 19309, 1841, 1842, 1843, 1844, 12904, 1845, 1846, + 1847, 12865, 1848, 1849, 11759, 13854, 1850, 1851, 19308, 1852, 10245, + 1853, 1854, 1855, 12703, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 15748, + 19305, 1863, 19306, 1864, 13587, 1865, 1866, 1867, 1868, 1869, 19314, 1870, + 1871, 1872, 19310, 1873, 1874, 1875, 1876, 1877, 13242, 1878, 1879, 14616, + 19312, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 19313, + 1890, 1891, 1892, 1893, 11188, 1894, 1895, 1896, 1897, 1898, 1899, 1900, + 19315, 1901, 1902, 1903, 1904, 19311, 1905, 1906, 12088, 1907, 1908, 1909, + 1910, 1911, 1912, 1913, 1914, 1915, 15679, 19316, 13859, 19320, 1916, 1917, + 19321, 1918, 1919, 1920, 1921, 15191, 1922, 1923, 1924, 1925, 1926, 1927, + 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, + 12664, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 12671, 19319, 1947, 1948, + 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, + 19318, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 19324, 14932, 1968, 20319, + 1969, 1970, 19327, 1971, 1972, 1973, 1974, 1975, 19322, 1976, 1977, 11367, + 13784, 1978, 1979, 1980, 1981, 1982, 1983, 11326, 1984, 1985, 14966, 1986, + 1987, 1988, 1989, 1990, 19325, 1991, 19326, 1992, 19331, 1993, 19333, 1994, + 1995, 1996, 19334, 1997, 1998, 1999, 19328, 10028, 2000, 19329, 2001, 2002, + 19332, 2003, 2004, 12884, 2005, 19323, 2006, 2007, 2008, 2009, 2010, 19330, + 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, + 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 19335, + 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, + 19337, 19336, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, + 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, + 2068, 2069, 2070, 2071, 19338, 2072, 16903, 2073, 2074, 19339, 2075, 2076, + 2077, 2078, 2079, 2080, 2081, 2082, 19340, 2083, 2084, 2085, 2086, 2087, + 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 16486, 19346, + 2098, 19347, 11930, 15913, 2099, 16489, 9855, 14234, 19343, 16660, 16481, + 15107, 2100, 12682, 2101, 2102, 19348, 11335, 10769, 19344, 15302, 2103, + 2104, 10927, 12492, 2105, 16636, 2106, 2107, 2108, 14040, 19173, 2109, + 19345, 2110, 10440, 2111, 2112, 2113, 2114, 13655, 2115, 2116, 12910, 2117, + 2118, 19113, 12919, 2119, 14247, 19114, 16067, 2120, 15753, 14021, 9043, + 2121, 14201, 14609, 2122, 2123, 10999, 2124, 2125, 2126, 19116, 2127, + 19115, 2128, 16493, 10792, 16315, 10173, 14615, 15528, 9221, 13986, 2129, + 9667, 13858, 11920, 15196, 14015, 19117, 11149, 2130, 2131, 2132, 14975, + 10747, 2133, 2134, 2135, 2136, 15920, 2137, 2138, 10931, 15366, 15007, + 11355, 2139, 19118, 13646, 2140, 2141, 2142, 11952, 9301, 14217, 2143, + 2144, 11342, 2145, 11341, 15575, 12695, 11935, 2146, 2147, 2148, 2149, + 10572, 2150, 2151, 2152, 12669, 2153, 10939, 15867, 2154, 2155, 2156, 2157, + 2158, 2159, 2160, 2161, 2162, 13457, 12840, 9481, 2163, 10784, 2164, 2165, + 19122, 12295, 2166, 2167, 16070, 2168, 2169, 2170, 2171, 2172, 19123, 2173, + 19125, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 9856, 10217, 14189, 15311, + 10003, 2181, 2182, 14022, 2183, 10421, 2184, 2185, 13843, 2186, 11506, + 2187, 2188, 14755, 16515, 2189, 2190, 2191, 2192, 15106, 2193, 13832, 2194, + 2195, 10256, 19341, 11371, 2196, 9625, 2197, 13823, 2198, 19342, 9597, + 2199, 2200, 2201, 2202, 17809, 2203, 15715, 17810, 2204, 15487, 2205, 2206, + 2207, 2208, 17811, 2209, 2210, 2211, 2212, 11730, 2213, 2214, 17812, 2215, + 2216, 2217, 13977, 15577, 9658, 19169, 12890, 11686, 14743, 12907, 11739, + 13213, 9472, 2218, 2219, 11736, 2220, 2221, 13487, 14420, 11571, 14786, + 2222, 2223, 13991, 13238, 19171, 15133, 2224, 2225, 2226, 16080, 2227, + 2228, 2229, 19172, 2230, 2231, 2232, 2233, 14049, 2234, 14567, 12482, 2235, + 19174, 2236, 12481, 19175, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 19183, + 14580, 2244, 13804, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 15542, 18343, + 2252, 2253, 2254, 2255, 15751, 2256, 14229, 13286, 2257, 2258, 2259, 2260, + 2261, 18347, 2262, 2263, 2264, 18342, 18344, 2265, 2266, 18345, 18350, + 2267, 2268, 9482, 2269, 18346, 10603, 18348, 18349, 18351, 10001, 18352, + 2270, 2271, 2272, 2273, 2274, 18354, 18359, 2275, 2276, 2277, 2278, 2279, + 15345, 2280, 18357, 18356, 12330, 2281, 2282, 2283, 18358, 2284, 15897, + 2285, 18353, 2286, 18361, 9047, 2287, 2288, 2289, 2290, 18355, 2291, 11964, + 2292, 18360, 2293, 2294, 18362, 2295, 2296, 2297, 2298, 2299, 2300, 18365, + 2301, 2302, 2303, 2304, 2305, 2306, 18363, 2307, 2308, 2309, 2310, 2311, + 2312, 16282, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 14946, 2320, 2321, + 18364, 18366, 12490, 2322, 10240, 2323, 15763, 2324, 2325, 13440, 2326, + 2327, 10424, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, + 11779, 2338, 2339, 2340, 2341, 2342, 2343, 18367, 18368, 2344, 2345, 18374, + 9666, 2346, 2347, 2348, 2349, 2350, 2351, 13278, 2352, 2353, 2354, 2355, + 2356, 9847, 2357, 15329, 2358, 2359, 2360, 2361, 18375, 2362, 2363, 18373, + 2364, 2365, 2366, 2367, 2368, 18372, 2369, 18370, 18369, 2370, 9247, 2371, + 2372, 2373, 16079, 18371, 2374, 2375, 2376, 2377, 2378, 18378, 2379, 2380, + 2381, 2382, 2383, 2384, 2385, 2386, 18379, 18377, 2387, 2388, 2389, 2390, + 2391, 2392, 2393, 2394, 21085, 2395, 2396, 18386, 18385, 13417, 2397, 2398, + 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 18376, 2408, 2409, + 18381, 2410, 18383, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, + 2420, 2421, 18387, 2422, 18384, 18380, 2423, 2424, 18382, 2425, 2426, 2427, + 2428, 18388, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, + 2439, 2440, 2441, 18389, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, + 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, + 2462, 2463, 18390, 2464, 2465, 2466, 18391, 2467, 2468, 2469, 2470, 2471, + 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, + 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 18393, 2492, 2493, 2494, + 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 18394, 2505, + 2506, 2507, 2508, 2509, 2510, 2511, 14726, 2512, 2513, 2514, 2515, 2516, + 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 19536, 2525, 9793, 16306, + 2526, 2527, 15313, 9613, 2528, 2529, 10739, 16518, 13436, 11747, 10749, + 2530, 14780, 2531, 2532, 9483, 17242, 2533, 11331, 15534, 14195, 9070, + 2534, 2535, 14994, 2536, 2537, 2538, 2539, 2540, 16882, 11572, 2541, 2542, + 9265, 14013, 9433, 2543, 14162, 10366, 2544, 13971, 2545, 2546, 2547, + 14918, 2548, 2549, 18233, 16097, 18236, 2550, 2551, 18235, 13048, 14436, + 2552, 12272, 18234, 16312, 9420, 16281, 10034, 2553, 2554, 2555, 2556, + 2557, 2558, 2559, 2560, 9873, 16246, 2561, 2562, 2563, 2564, 2565, 14930, + 9104, 2566, 2567, 18237, 2568, 2569, 2570, 2571, 2572, 18336, 9598, 2573, + 2574, 18238, 18239, 12652, 2575, 2576, 2577, 2578, 12696, 2579, 18337, + 10444, 2580, 2581, 2582, 2583, 2584, 2585, 11162, 2586, 2587, 2588, 2589, + 2590, 2591, 2592, 18338, 12852, 2593, 2594, 2595, 2596, 2597, 18339, 2598, + 2599, 18340, 2600, 2601, 18341, 9802, 2602, 2603, 2604, 2605, 2606, 2607, + 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 10586, 13234, 12899, + 2617, 9407, 2618, 15155, 2619, 19534, 11150, 15730, 15711, 2620, 10802, + 18572, 2621, 2622, 2623, 16450, 2624, 13471, 9266, 2625, 2626, 9803, 18574, + 2627, 2628, 2629, 15187, 12459, 18573, 2630, 11941, 15681, 10030, 18575, + 10049, 2631, 12712, 10638, 2632, 10559, 2633, 13066, 10402, 18577, 2634, + 2635, 2636, 2637, 18576, 10205, 16524, 2638, 2639, 2640, 2641, 2642, 14540, + 2643, 2644, 2645, 2646, 2647, 18581, 2648, 18579, 14057, 11896, 15700, + 18578, 2649, 2650, 2651, 2652, 18580, 2653, 2654, 2655, 2656, 2657, 2658, + 2659, 2660, 2661, 2662, 12269, 12105, 2663, 2664, 2665, 2666, 2667, 2668, + 18584, 18583, 12075, 2669, 2670, 12301, 2671, 2672, 2673, 2674, 18585, + 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, + 18586, 2687, 18587, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, + 17235, 2697, 15346, 14537, 2698, 2699, 11503, 2700, 2701, 2702, 17800, + 16630, 11885, 17240, 15561, 13295, 13025, 2703, 2704, 2705, 17801, 2706, + 9270, 17969, 2707, 2708, 2709, 13994, 2710, 17972, 2711, 10748, 2712, + 15578, 2713, 10550, 11000, 2714, 2715, 9653, 2716, 2717, 2718, 10035, + 16092, 2719, 2720, 2721, 2722, 12689, 14965, 11116, 2723, 19178, 19177, + 2724, 2725, 19179, 2726, 14603, 2727, 13670, 2728, 2729, 2730, 2731, 2732, + 2733, 2734, 9990, 13426, 2735, 19181, 2736, 2737, 2738, 20441, 2739, 2740, + 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, + 2753, 19165, 2754, 10808, 9992, 2755, 12473, 19167, 19166, 19168, 2756, + 2757, 2758, 2759, 15530, 2760, 2761, 2762, 18409, 15151, 2763, 14549, 2764, + 15364, 2765, 2766, 9447, 9290, 2767, 9297, 13092, 2768, 2769, 16090, 15691, + 2770, 18395, 2771, 2772, 2773, 18396, 2774, 15544, 2775, 9620, 9258, 2776, + 2777, 2778, 14624, 16142, 18397, 2779, 11707, 9878, 2780, 18398, 10985, + 18399, 11133, 12486, 18400, 2781, 2782, 2783, 15181, 2784, 14564, 2785, + 2786, 18401, 2787, 10010, 13054, 18402, 2788, 2789, 18403, 2790, 2791, + 2792, 2793, 15764, 2794, 2795, 2796, 2797, 2798, 2799, 18404, 2800, 15308, + 2801, 2802, 18405, 14727, 2803, 2804, 2805, 2806, 2807, 2808, 18406, 2809, + 10009, 2810, 2811, 2812, 2813, 18407, 11168, 2814, 2815, 2816, 2817, 2818, + 15141, 18589, 9271, 15553, 2819, 2820, 18590, 2821, 2822, 11346, 13629, + 2823, 18592, 20519, 20518, 17970, 2824, 2825, 2826, 18591, 16275, 14627, + 12641, 2827, 2828, 2829, 18750, 2830, 2831, 16295, 18596, 2832, 2833, + 18597, 2834, 2835, 15714, 2836, 2837, 18601, 11951, 2838, 18602, 18594, + 2839, 2840, 9627, 2841, 2842, 2843, 12903, 2844, 2845, 18603, 2846, 2847, + 15140, 2848, 11011, 18598, 10417, 11134, 14357, 14198, 18593, 18595, 18599, + 18600, 2849, 2850, 2851, 18612, 2852, 2853, 18609, 15950, 18608, 2854, + 2855, 13028, 2856, 16145, 13049, 9437, 2857, 2858, 18604, 2859, 18607, + 12270, 14183, 2860, 2861, 9976, 18614, 2862, 2863, 2864, 11322, 18606, + 15157, 15890, 18610, 10789, 18611, 2865, 2866, 2867, 13446, 2868, 2869, + 2870, 2871, 2872, 18605, 2873, 2874, 2875, 2876, 2877, 16495, 20616, 2878, + 2879, 18613, 2880, 20620, 18619, 14014, 2881, 2882, 2883, 2884, 2885, 2886, + 2887, 12276, 2888, 11163, 2889, 2890, 11929, 2891, 10992, 2892, 2893, + 14156, 2894, 2895, 2896, 20621, 20618, 2897, 2898, 20617, 2899, 2900, 2901, + 2902, 11169, 20622, 15189, 2903, 2904, 20619, 10987, 10252, 18716, 10183, + 14426, 10742, 2905, 14917, 13396, 2906, 2907, 11925, 2908, 2909, 10246, + 2910, 18615, 18616, 18618, 18617, 12878, 18717, 2911, 15708, 2912, 2913, + 2914, 18722, 13431, 2915, 2916, 2917, 2918, 14919, 2919, 2920, 18724, + 10948, 2921, 2922, 2923, 2924, 18723, 2925, 11173, 2926, 18718, 2927, 2928, + 2929, 18719, 18725, 2930, 18721, 2931, 14807, 15713, 2932, 2933, 11143, + 2934, 2935, 15900, 2936, 12915, 2937, 2938, 20623, 15197, 18720, 2939, + 12720, 2940, 18728, 9230, 2941, 18733, 2942, 2943, 2944, 11339, 2945, 2946, + 18727, 10006, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 13468, 18731, + 2955, 2956, 2957, 11695, 14614, 2958, 2959, 2960, 2961, 2962, 11198, 2963, + 2964, 2965, 14417, 2966, 2967, 18730, 2968, 18732, 2969, 14922, 18729, + 2970, 14734, 11176, 2971, 2972, 2973, 2974, 2975, 10050, 11754, 9455, 9640, + 2976, 9240, 18726, 9454, 9987, 10798, 10237, 2977, 2978, 14990, 18738, + 2979, 11159, 2980, 2981, 13624, 15147, 2982, 2983, 2984, 2985, 2986, 18739, + 9673, 2987, 2988, 2989, 2990, 20624, 2991, 15765, 15743, 2992, 2993, 2994, + 20625, 18740, 15551, 2995, 2996, 2997, 2998, 2999, 18736, 3000, 3001, 3002, + 3003, 15737, 3004, 3005, 3006, 3007, 10593, 18734, 3008, 3009, 18737, + 10418, 3010, 18735, 12067, 3011, 3012, 3013, 18741, 3014, 3015, 3016, 3017, + 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, + 3030, 3031, 3032, 15889, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, + 9825, 3041, 18742, 3042, 11152, 3043, 13862, 3044, 3045, 13844, 3046, 3047, + 3048, 12854, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 20626, 3056, 3057, + 3058, 3059, 12538, 3060, 3061, 3062, 3063, 11174, 11889, 3064, 3065, 3066, + 3067, 3068, 3069, 3070, 14756, 3071, 3072, 3073, 3074, 18743, 3075, 11897, + 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, + 3088, 3089, 3090, 3091, 3092, 3093, 3094, 9294, 3095, 3096, 15952, 3097, + 3098, 3099, 3100, 3101, 18745, 3102, 3103, 3104, 3105, 3106, 3107, 3108, + 3109, 20628, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 18746, + 10934, 20627, 3119, 3120, 18744, 3121, 3122, 3123, 3124, 3125, 3126, 3127, + 3128, 3129, 3130, 18747, 3131, 3132, 3133, 3134, 3135, 3136, 10947, 3137, + 3138, 3139, 10179, 3140, 3141, 3142, 3143, 3144, 15129, 3145, 9060, 20629, + 3146, 3147, 3148, 3149, 3150, 20630, 12098, 3151, 18748, 3152, 3153, 3154, + 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, + 3167, 3168, 13034, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, + 3178, 3179, 3180, 3181, 3182, 18749, 3183, 3184, 3185, 3186, 3187, 3188, + 3189, 3190, 3191, 17403, 3192, 3193, 3194, 3195, 3196, 3197, 20631, 3198, + 10619, 3199, 14801, 20052, 15176, 14054, 13639, 14938, 9636, 14775, 11563, + 3200, 3201, 18777, 11197, 20053, 16084, 3202, 13266, 20054, 3203, 3204, + 3205, 20055, 3206, 20057, 20056, 3207, 20059, 20058, 3208, 3209, 3210, + 3211, 11551, 3212, 20060, 3213, 12475, 3214, 3215, 3216, 3217, 9818, 9872, + 3218, 3219, 11122, 3220, 3221, 3222, 3223, 3224, 20495, 20494, 10386, + 14244, 9281, 3225, 20496, 3226, 3227, 3228, 13815, 20497, 20498, 3229, + 14019, 17813, 9442, 15955, 3230, 3231, 13248, 9064, 9867, 13636, 3232, + 3233, 3234, 14583, 3235, 3236, 11899, 3237, 3238, 3239, 3240, 3241, 3242, + 3243, 11934, 3244, 3245, 13399, 16265, 3246, 12074, 17814, 13783, 15374, + 13019, 9096, 9617, 13622, 3247, 3248, 9091, 3249, 3250, 10441, 3251, 3252, + 13105, 3253, 3254, 10248, 3255, 16105, 9643, 11333, 3256, 3257, 3258, 9608, + 3259, 3260, 3261, 3262, 11766, 9074, 3263, 3264, 3265, 3266, 3267, 3268, + 15539, 14032, 16440, 3269, 14557, 10187, 11900, 16114, 3270, 10552, 13070, + 3271, 3272, 3273, 17815, 11932, 12498, 13427, 3274, 11119, 9223, 3275, + 3276, 13089, 3277, 3278, 13106, 14352, 3279, 3280, 3281, 3282, 9222, 3283, + 3284, 3285, 10029, 3286, 3287, 3288, 12833, 3289, 17816, 15321, 9668, 3290, + 12717, 3291, 3292, 10442, 3293, 16329, 9978, 9485, 12845, 12898, 12078, + 17817, 3294, 9097, 13051, 12319, 3295, 10788, 3296, 11745, 14591, 9071, + 3297, 14582, 17819, 11733, 16465, 17818, 16103, 9086, 3298, 3299, 12891, + 3300, 3301, 12448, 11385, 3302, 15696, 12090, 13016, 9411, 15946, 3303, + 3304, 12073, 14000, 17820, 16147, 3305, 10751, 3306, 13598, 14164, 3307, + 17822, 11904, 3308, 3309, 3310, 3311, 13225, 16442, 13981, 12860, 3312, + 9649, 10785, 3313, 3314, 3315, 3316, 16269, 20137, 9045, 3317, 3318, 3319, + 3320, 11945, 3321, 3322, 14429, 3323, 3324, 3325, 3326, 14593, 3327, 3328, + 3329, 16276, 12491, 3330, 14771, 14347, 15119, 12876, 9993, 17821, 16140, + 11328, 11166, 3331, 3332, 9029, 3333, 13033, 9861, 3334, 3335, 3336, 16136, + 3337, 3338, 20138, 3339, 3340, 3341, 3342, 3343, 3344, 17823, 14541, 3345, + 3346, 14611, 3347, 3348, 3349, 3350, 14795, 17825, 3351, 14552, 12071, + 3352, 3353, 16464, 3354, 17824, 9063, 10945, 13826, 12908, 11757, 3355, + 3356, 3357, 3358, 9427, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, + 12109, 14235, 3367, 11386, 11142, 9998, 3368, 3369, 3370, 13100, 3371, + 17835, 3372, 3373, 3374, 17832, 11746, 3375, 3376, 17828, 3377, 3378, 3379, + 3380, 9808, 11556, 3381, 3382, 17829, 12902, 3383, 3384, 3385, 3386, 14953, + 3387, 10039, 3388, 3389, 3390, 3391, 10227, 14023, 10059, 17834, 3392, + 16093, 3393, 17830, 14390, 13299, 3394, 13052, 3395, 3396, 3397, 15505, + 3398, 11767, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 12496, 3406, 14374, + 9619, 3407, 11546, 3408, 11931, 14573, 15353, 9860, 3409, 17833, 17826, + 17836, 3410, 20139, 3411, 3412, 12461, 17831, 3413, 3414, 16277, 9982, + 3415, 9489, 3416, 17837, 3417, 17847, 3418, 3419, 3420, 3421, 3422, 17842, + 3423, 17846, 3424, 3425, 13649, 3426, 3427, 3428, 16500, 17844, 12707, + 14410, 3429, 9474, 3430, 3431, 3432, 15515, 3433, 3434, 3435, 3436, 3437, + 3438, 3439, 17843, 3440, 17840, 14778, 3441, 9792, 3442, 3443, 3444, 3445, + 3446, 11886, 11715, 3447, 3448, 11545, 3449, 3450, 3451, 3452, 17838, 3453, + 15879, 3454, 17827, 3455, 17839, 3456, 3457, 3458, 3459, 12096, 3460, + 17841, 9488, 10618, 12452, 3461, 3462, 11528, 3463, 3464, 3465, 3466, 3467, + 17850, 17853, 3468, 3469, 9416, 9789, 3470, 3471, 9859, 13781, 3472, 3473, + 3474, 3475, 3476, 3477, 17851, 14204, 3478, 10612, 3479, 17852, 17855, + 3480, 3481, 3482, 3483, 17854, 3484, 3485, 3486, 14379, 3487, 9090, 9863, + 3488, 3489, 3490, 3491, 3492, 3493, 19121, 3494, 3495, 3496, 3497, 3498, + 15120, 3499, 3500, 9480, 3501, 20236, 3502, 17849, 3503, 3504, 13842, + 17848, 9083, 15486, 9302, 3505, 14360, 3506, 3507, 3508, 3509, 3510, 3511, + 3512, 17845, 3513, 14159, 3514, 3515, 3516, 16065, 3517, 3518, 3519, 3520, + 3521, 17856, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 9846, 3530, + 12831, 3531, 3532, 3533, 17858, 3534, 3535, 3536, 3537, 3538, 3539, 3540, + 3541, 3542, 3543, 12729, 12826, 17956, 3544, 3545, 3546, 3547, 3548, 3549, + 3550, 12299, 3551, 17857, 11764, 3552, 13223, 3553, 3554, 3555, 3556, 3557, + 3558, 3559, 3560, 3561, 9632, 13671, 3562, 3563, 14181, 17859, 3564, 3565, + 17959, 3566, 3567, 3568, 3569, 16453, 3570, 3571, 3572, 3573, 3574, 9618, + 3575, 3576, 3577, 3578, 12290, 3579, 3580, 13438, 9410, 9858, 3581, 16446, + 3582, 3583, 3584, 3585, 12901, 3586, 17957, 17958, 3587, 17960, 3588, + 10944, 3589, 3590, 3591, 17961, 3592, 12127, 3593, 3594, 13810, 3595, 3596, + 3597, 3598, 3599, 3600, 3601, 9462, 13465, 3602, 17962, 3603, 13455, 3604, + 3605, 3606, 3607, 17963, 20237, 3608, 3609, 3610, 3611, 3612, 14206, 3613, + 3614, 3615, 17965, 3616, 17964, 3617, 9438, 3618, 3619, 3620, 3621, 3622, + 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, + 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 13057, 3643, 3644, 3645, + 3646, 3647, 3648, 3649, 3650, 17966, 3651, 3652, 3653, 3654, 3655, 3656, + 3657, 3658, 15925, 3659, 3660, 3661, 3662, 3663, 13618, 3664, 3665, 3666, + 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 17967, 3676, 3677, + 3678, 3679, 3680, 11765, 3681, 3682, 17968, 16252, 3683, 3684, 3685, 3686, + 20068, 20257, 14018, 3687, 16717, 10581, 3688, 10740, 3689, 3690, 10392, + 16149, 3691, 3692, 3693, 3694, 3695, 10777, 3696, 3697, 15112, 21990, 3698, + 3699, 10023, 3700, 3701, 12719, 3702, 11725, 3703, 3704, 3705, 20258, 9054, + 3706, 3707, 11539, 3708, 12273, 3709, 9269, 9603, 3710, 3711, 3712, 10595, + 13777, 3713, 3714, 10221, 3715, 3716, 3717, 3718, 20259, 11705, 3719, 3720, + 3721, 14058, 3722, 13430, 3723, 16146, 3724, 3725, 10438, 3726, 3727, 3728, + 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, + 14761, 3741, 3742, 3743, 16066, 9298, 3744, 3745, 3746, 20444, 9088, 3747, + 20446, 3748, 3749, 3750, 10188, 3751, 12302, 3752, 22225, 15122, 3753, + 3754, 16124, 3755, 14776, 3756, 3757, 11574, 9661, 3758, 10556, 3759, + 16077, 3760, 20644, 3761, 10212, 3762, 14180, 15139, 3763, 3764, 3765, + 3766, 3767, 3768, 3769, 3770, 10384, 3771, 3772, 20447, 13974, 3773, 3774, + 3775, 13067, 3776, 20450, 20449, 12480, 20448, 3777, 3778, 3779, 3780, + 15198, 20451, 3781, 20452, 16504, 3782, 3783, 20453, 3784, 3785, 3786, + 20454, 13281, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 14787, 3795, + 11345, 3796, 3797, 13638, 9984, 11726, 16273, 15936, 3798, 3799, 15309, + 15186, 20069, 20070, 20071, 10946, 3800, 3801, 3802, 3803, 13982, 11960, + 3804, 3805, 14625, 3806, 3807, 3808, 3809, 3810, 20077, 3811, 9051, 20075, + 3812, 3813, 12070, 3814, 3815, 3816, 20072, 3817, 9498, 3818, 12722, 11187, + 3819, 3820, 3821, 15540, 14809, 20076, 3822, 3823, 3824, 20073, 3825, 3826, + 3827, 20080, 3828, 15144, 15694, 3829, 3830, 3831, 3832, 9811, 3833, 12668, + 16517, 3834, 3835, 3836, 3837, 16104, 3838, 14004, 3839, 20082, 3840, 3841, + 20081, 20084, 20083, 3842, 3843, 3844, 3845, 3846, 16316, 3847, 14967, + 3848, 3849, 20088, 3850, 11161, 3851, 3852, 3853, 3854, 3855, 3856, 3857, + 11585, 13821, 3858, 3859, 20089, 3860, 3861, 13800, 15009, 20087, 15911, + 20090, 20092, 3862, 3863, 14612, 3864, 3865, 3866, 3867, 20086, 3868, + 20091, 3869, 3870, 14803, 3871, 11177, 3872, 9626, 3873, 3874, 3875, 3876, + 3877, 13258, 11701, 14815, 3878, 3879, 3880, 13466, 3881, 11692, 20093, + 3882, 3883, 16284, 3884, 3885, 3886, 12287, 3887, 3888, 3889, 15926, 3890, + 20094, 3891, 3892, 14945, 3893, 3894, 3895, 3896, 20095, 3897, 3898, 3899, + 3900, 14043, 3901, 3902, 3903, 3904, 13030, 9046, 3905, 3906, 3907, 3908, + 3909, 20097, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 20096, + 22008, 3919, 3920, 3921, 3922, 3923, 12851, 3924, 3925, 3926, 3927, 3928, + 9224, 3929, 3930, 3931, 3932, 19158, 3933, 3934, 3935, 3936, 20098, 3937, + 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, + 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, + 3962, 14044, 3963, 20099, 20100, 13261, 3964, 3965, 3966, 3967, 3968, 3969, + 3970, 3971, 20101, 3972, 3973, 20102, 3974, 3975, 3976, 3977, 3978, 3979, + 15892, 3980, 13485, 15508, 10637, 3981, 3982, 20079, 3983, 9465, 3984, + 3985, 12537, 3986, 15953, 14415, 16513, 3987, 3988, 3989, 3990, 3991, 3992, + 3993, 15899, 15723, 20270, 13098, 3994, 10449, 3995, 3996, 20287, 3997, + 3998, 3999, 14178, 20297, 4000, 12107, 4001, 4002, 4003, 14626, 4004, 9610, + 4005, 13263, 4006, 4007, 4008, 4009, 4010, 4011, 20327, 4012, 12855, 4013, + 14745, 12834, 9245, 15958, 4014, 14050, 4015, 16321, 4016, 4017, 13256, + 10233, 4018, 4019, 4020, 4021, 11205, 4022, 4023, 15169, 4024, 4025, 13792, + 4026, 15916, 13593, 4027, 4028, 10588, 4029, 19695, 13803, 4030, 4031, + 19692, 4032, 12143, 15156, 9441, 9854, 4033, 19693, 4034, 4035, 16095, + 4036, 4037, 4038, 4039, 4040, 10202, 4041, 19694, 14053, 10605, 14430, + 4042, 4043, 4044, 12085, 4045, 4046, 15373, 19696, 19699, 4047, 4048, + 10953, 4049, 9228, 11555, 4050, 20074, 19700, 4051, 19703, 4052, 19708, + 4053, 4054, 4055, 4056, 19709, 4057, 14196, 9094, 4058, 11316, 4059, 4060, + 10760, 4061, 4062, 19698, 4063, 14622, 4064, 19707, 4065, 4066, 4067, 4068, + 14811, 4069, 4070, 4071, 4072, 16132, 4073, 12309, 19701, 4074, 12657, + 4075, 10826, 16251, 19705, 4076, 4077, 4078, 14029, 15935, 4079, 19697, + 4080, 19702, 19704, 4081, 13420, 10422, 4082, 19706, 4083, 11936, 19715, + 4084, 4085, 19720, 4086, 19718, 11365, 11352, 19724, 4087, 4088, 4089, + 4090, 4091, 4092, 4093, 4094, 19727, 4095, 19723, 9305, 4096, 4097, 4098, + 4099, 4100, 4101, 4102, 4103, 4104, 4105, 9081, 12844, 10589, 13271, 13615, + 13650, 4106, 4107, 4108, 19712, 19717, 19719, 4109, 10816, 19721, 16520, + 4110, 12916, 4111, 19725, 4112, 4113, 9478, 4114, 4115, 4116, 19714, 4117, + 4118, 11382, 4119, 4120, 11909, 19710, 16334, 4121, 12343, 9486, 4122, + 4123, 4124, 4125, 4126, 4127, 4128, 4129, 19728, 4130, 13998, 19722, 4131, + 4132, 4133, 4134, 16059, 4135, 9289, 16082, 19711, 19713, 10181, 19716, + 4136, 19726, 12089, 4137, 14052, 4138, 14163, 4139, 4140, 13265, 12150, + 4141, 4142, 4143, 4144, 4145, 19738, 4146, 4147, 4148, 15108, 4149, 4150, + 4151, 4152, 4153, 4154, 4155, 19747, 16319, 4156, 4157, 4158, 4159, 4160, + 4161, 4162, 19729, 19730, 4163, 4164, 4165, 15384, 10968, 10634, 4166, + 4167, 10626, 15917, 19744, 4168, 19743, 19741, 10815, 14395, 19735, 14731, + 11957, 4169, 9049, 19746, 19745, 4170, 16467, 4171, 19733, 4172, 14544, + 13778, 4173, 11139, 11554, 19739, 4174, 4175, 4176, 4177, 4178, 4179, 4180, + 4181, 4182, 4183, 19731, 19732, 19734, 9996, 19736, 13432, 19740, 19742, + 11511, 16449, 4184, 19753, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, + 19750, 4193, 14551, 19751, 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, + 4202, 12281, 4203, 19737, 4204, 12658, 9105, 4205, 4206, 4207, 4208, 4209, + 4210, 4211, 4212, 19749, 4213, 4214, 4215, 19752, 4216, 4217, 4218, 10738, + 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 13825, 4229, + 4230, 4231, 12681, 14789, 12135, 4232, 4233, 4234, 4235, 14238, 4236, + 14406, 15126, 4237, 4238, 14030, 4239, 19748, 4240, 4241, 4242, 4243, 4244, + 4245, 4246, 4247, 4248, 4249, 11381, 4250, 19754, 4251, 4252, 4253, 4254, + 4255, 4256, 12697, 4257, 13274, 4258, 10822, 4259, 4260, 4261, 4262, 9109, + 4263, 4264, 16491, 4265, 4266, 11317, 4267, 13094, 4268, 4269, 4270, 4271, + 4272, 14381, 4273, 4274, 19861, 4275, 4276, 4277, 4278, 4279, 4280, 4281, + 4282, 4283, 4284, 13788, 4285, 19857, 12131, 4286, 4287, 4288, 11910, 4289, + 4290, 4291, 19759, 10790, 4292, 19756, 4293, 4294, 4295, 4296, 19859, 4297, + 4298, 4299, 15531, 4300, 4301, 4302, 4303, 4304, 19858, 4305, 16263, 16456, + 4306, 19862, 4307, 11518, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, + 4316, 4317, 4318, 4319, 19757, 19758, 4320, 4321, 4322, 19856, 4323, 4324, + 4325, 4326, 4327, 4328, 4329, 4330, 14589, 4331, 4332, 15497, 4333, 4334, + 4335, 19873, 4336, 4337, 4338, 4339, 19864, 4340, 4341, 4342, 9795, 4343, + 9812, 4344, 4345, 19866, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, + 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 15113, 4363, 4364, + 19860, 4365, 4366, 9689, 4367, 4368, 19867, 12132, 4369, 19865, 4370, 4371, + 19880, 4372, 4373, 19879, 4374, 4375, 4376, 4377, 19869, 4378, 4379, 19755, + 4380, 4381, 19863, 4382, 4383, 4384, 4385, 4386, 11887, 19872, 19881, 4387, + 4388, 12450, 4389, 4390, 4391, 19870, 4392, 10582, 4393, 19868, 4394, + 15735, 19875, 19876, 19878, 4395, 4396, 4397, 19894, 4398, 4399, 4400, + 4401, 4402, 4403, 12103, 19892, 4404, 4405, 19871, 4406, 4407, 19882, 9106, + 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 19883, 16060, + 4418, 4419, 19885, 4420, 19886, 4421, 4422, 4423, 19888, 4424, 4425, 12336, + 4426, 4427, 13607, 4428, 4429, 4430, 19884, 4431, 4432, 4433, 4434, 4435, + 19889, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 19890, 4444, 19874, + 4445, 19877, 4446, 11132, 4447, 4448, 4449, 19887, 4450, 4451, 4452, 4453, + 4454, 4455, 11392, 4456, 4457, 4458, 19891, 19893, 4459, 4460, 4461, 4462, + 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 19897, 4471, 4472, 4473, + 4474, 19901, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, + 9464, 4485, 19895, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, + 4495, 10369, 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, + 4506, 4507, 19898, 19899, 4508, 4509, 4510, 4511, 4512, 4513, 16088, 4514, + 12828, 4515, 4516, 4517, 4518, 4519, 4520, 19911, 4521, 10990, 4522, 4523, + 4524, 4525, 19896, 4526, 15678, 4527, 4528, 4529, 19907, 4530, 4531, 4532, + 4533, 4534, 4535, 4536, 19910, 19903, 4537, 4538, 4539, 4540, 4541, 19902, + 4542, 4543, 13428, 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, 19905, + 4552, 4553, 4554, 4555, 4556, 4557, 4558, 19912, 9635, 4559, 19906, 4560, + 4561, 4562, 4563, 4564, 14995, 4565, 4566, 4567, 19900, 4568, 4569, 4570, + 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 9682, 4579, 4580, 4581, + 4582, 4583, 4584, 4585, 19909, 4586, 4587, 19913, 4588, 4589, 4590, 14365, + 4591, 4592, 4593, 14928, 4594, 4595, 4596, 4597, 4598, 4599, 4600, 4601, + 4602, 19908, 4603, 19915, 19914, 4604, 4605, 4606, 4607, 4608, 19917, 4609, + 4610, 4611, 4612, 4613, 4614, 4615, 4616, 19904, 4617, 4618, 4619, 4620, + 4621, 4622, 4623, 4624, 19916, 4625, 19918, 12677, 4626, 4627, 4628, 4629, + 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, + 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, + 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, + 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, + 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, + 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699, 4700, 4701, + 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, + 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, + 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, + 4738, 4739, 4740, 13418, 9831, 11137, 15137, 20428, 4741, 4742, 13038, + 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 15766, 4753, + 4754, 4755, 4756, 20429, 4757, 20430, 13264, 4758, 4759, 4760, 11953, 4761, + 4762, 4763, 4764, 20431, 4765, 4766, 20432, 15115, 4767, 13419, 4768, 4769, + 10617, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, + 4781, 20433, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789, 16270, 16148, + 9828, 9434, 14793, 13276, 4790, 4791, 14600, 4792, 4793, 4794, 4795, 4796, + 4797, 4798, 4799, 4800, 4801, 4802, 4803, 4804, 4805, 9870, 4806, 14187, + 11368, 4807, 4808, 4809, 4810, 19921, 19922, 15369, 19924, 4811, 9874, + 19923, 4812, 15314, 14031, 9453, 4813, 19927, 4814, 4815, 4816, 4817, + 19925, 19926, 4818, 4819, 16264, 4820, 4821, 4822, 19928, 19929, 4823, + 4824, 4825, 4826, 4827, 19930, 4828, 4829, 4830, 4831, 4832, 4833, 4834, + 4835, 19931, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 20440, 13040, + 10211, 4844, 15568, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 10053, 4852, + 11172, 20442, 4853, 4854, 15552, 4855, 4856, 4857, 4858, 4859, 14792, 4860, + 12849, 4861, 12666, 4862, 4863, 10195, 16650, 9255, 9262, 9264, 13109, + 4864, 9263, 4865, 12646, 4866, 4867, 4868, 4869, 4870, 16072, 4871, 4872, + 4873, 4874, 4875, 4876, 4877, 4878, 20239, 10958, 4879, 4880, 4881, 14371, + 4882, 4883, 4884, 20240, 4885, 20242, 4886, 4887, 4888, 20243, 4889, 4890, + 4891, 20241, 4892, 4893, 4894, 4895, 4896, 4897, 4898, 20244, 20246, 20245, + 4899, 4900, 4901, 4902, 4903, 20247, 4904, 14012, 16646, 12716, 4905, + 12640, 13293, 20248, 12867, 4906, 20249, 20250, 20251, 10408, 4907, 4908, + 4909, 10445, 4910, 20252, 13461, 4911, 20254, 4912, 10929, 15380, 9042, + 20253, 20255, 4913, 4914, 4915, 9985, 12485, 13467, 4916, 20256, 4917, + 14169, 18778, 4918, 4919, 15707, 4920, 4921, 4922, 4923, 16874, 4924, 4925, + 14536, 16258, 13478, 4926, 4927, 4928, 16879, 11182, 4929, 10951, 18781, + 4930, 4931, 4932, 4933, 4934, 14926, 4935, 4936, 4937, 18779, 13814, 4938, + 10950, 4939, 4940, 4941, 15315, 18780, 13659, 10750, 11508, 9651, 14784, + 4942, 4943, 14377, 4944, 4945, 4946, 18787, 18788, 14619, 4947, 4948, 4949, + 4950, 4951, 14358, 4952, 11324, 4953, 18789, 4954, 18790, 4955, 4956, + 15163, 4957, 4958, 4959, 13296, 10413, 4960, 4961, 13458, 15527, 14779, + 4962, 18783, 18791, 4963, 13857, 9628, 4964, 4965, 18786, 4966, 4967, + 13272, 18784, 4968, 4969, 20634, 18785, 4970, 4971, 4972, 4973, 13794, + 4974, 13085, 4975, 4976, 4977, 10756, 4978, 12662, 4979, 18782, 13044, + 12259, 12502, 9460, 4980, 18792, 11121, 12838, 4981, 18795, 11743, 4982, + 4983, 18806, 18800, 10976, 4984, 4985, 4986, 4987, 10403, 15720, 4988, + 16291, 16106, 10768, 16075, 15351, 4989, 4990, 4991, 4992, 15130, 13481, + 4993, 4994, 4995, 13595, 9425, 4996, 12693, 4997, 4998, 4999, 18793, 5000, + 5001, 18807, 18794, 10363, 18802, 18799, 5002, 5003, 5004, 10381, 5005, + 5006, 13017, 5007, 18801, 13076, 9413, 13297, 5008, 12889, 5009, 5010, + 16437, 5011, 12130, 18804, 5012, 5013, 18805, 18808, 14354, 18798, 5014, + 15705, 5015, 9250, 20635, 18796, 18797, 5016, 18803, 15131, 13240, 15948, + 18809, 5017, 5018, 11559, 5019, 5020, 18912, 5021, 5022, 18911, 5023, 5024, + 5025, 15378, 18908, 5026, 18914, 5027, 5028, 5029, 13672, 5030, 5031, 5032, + 5033, 14935, 5034, 18913, 18919, 12514, 5035, 5036, 10185, 5037, 5038, + 5039, 5040, 5041, 5042, 11577, 5043, 18907, 5044, 5045, 10998, 18915, 5046, + 5047, 18917, 5048, 5049, 10258, 16307, 18923, 5050, 18918, 5051, 5052, + 5053, 18906, 5054, 11193, 14596, 13397, 13056, 5055, 5056, 12342, 5057, + 18909, 5058, 13414, 11507, 11524, 18910, 5059, 16474, 9471, 5060, 18916, + 11340, 18920, 5061, 11190, 18921, 13023, 18922, 5062, 5063, 5064, 5065, + 16122, 11878, 5066, 18931, 5067, 18928, 5068, 18932, 5069, 5070, 18934, + 5071, 5072, 13259, 5073, 5074, 10963, 12108, 5075, 5076, 5077, 10546, + 18925, 5078, 5079, 5080, 5081, 15866, 5082, 5083, 10928, 11589, 5084, 5085, + 5086, 18933, 5087, 5088, 5089, 5090, 5091, 14566, 5092, 5093, 12914, 5094, + 5095, 15006, 13845, 5096, 5097, 15706, 5098, 14964, 5099, 5100, 18924, + 5101, 18929, 18930, 14418, 5102, 5103, 5104, 5105, 5106, 14391, 5107, + 12117, 18926, 12271, 18927, 14773, 5108, 11148, 10026, 5109, 13668, 11502, + 16094, 13787, 10547, 18947, 5110, 5111, 18949, 15331, 5112, 5113, 15511, + 5114, 5115, 10938, 5116, 5117, 10977, 5118, 5119, 5120, 5121, 5122, 5123, + 18940, 10052, 5124, 5125, 5126, 16480, 18937, 15008, 18936, 5127, 5128, + 5129, 12315, 14387, 5130, 5131, 5132, 5133, 14036, 5134, 5135, 5136, 5137, + 12880, 5138, 14397, 18945, 5139, 5140, 5141, 18944, 18938, 5142, 18941, + 9988, 5143, 5144, 15732, 5145, 18943, 5146, 5147, 5148, 5149, 15574, 9852, + 5150, 11135, 5151, 5152, 13853, 5153, 9815, 5154, 5155, 5156, 11191, 5157, + 15340, 5158, 14422, 20636, 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5166, + 13464, 5167, 5168, 5169, 5170, 15873, 5171, 18948, 16488, 18939, 5172, + 11500, 18942, 5173, 5174, 15745, 5175, 18946, 13863, 5176, 5177, 18935, + 5178, 5179, 15744, 5180, 5181, 13489, 10206, 5182, 15957, 9424, 18960, + 5183, 5184, 5185, 14759, 5186, 18950, 5187, 14753, 5188, 10604, 5189, 5190, + 18959, 5191, 11917, 5192, 5193, 5194, 15721, 5195, 12711, 5196, 5197, 5198, + 5199, 5200, 5201, 5202, 5203, 13055, 18961, 5204, 5205, 5206, 5207, 5208, + 5209, 5210, 5211, 14571, 18952, 5212, 5213, 5214, 5215, 18957, 18958, 5216, + 11019, 5217, 14985, 5218, 5219, 16086, 5220, 5221, 5222, 18955, 5223, 5224, + 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, 18953, 5234, 5235, + 18951, 5236, 5237, 5238, 5239, 5240, 5241, 5242, 5243, 5244, 5245, 5246, + 5247, 5248, 5249, 5250, 14604, 13975, 5251, 5252, 5253, 12068, 5254, 11501, + 18956, 5255, 5256, 10585, 5257, 5258, 5259, 5260, 5261, 18976, 15885, 5262, + 5263, 5264, 5265, 5266, 5267, 5268, 18964, 5269, 5270, 5271, 12334, 5272, + 5273, 18978, 5274, 5275, 15556, 5276, 5277, 18968, 5278, 18969, 5279, 5280, + 14925, 5281, 5282, 5283, 5284, 14216, 5285, 18963, 18954, 5286, 18974, + 5287, 13645, 18972, 5288, 5289, 12896, 18971, 5290, 18970, 5291, 5292, + 5293, 9687, 18977, 5294, 5295, 5296, 5297, 10040, 5298, 5299, 5300, 16479, + 5301, 5302, 5303, 18975, 5304, 11127, 5305, 16485, 14392, 20323, 5306, + 18973, 5307, 5308, 10821, 5309, 5310, 5311, 16290, 18962, 18965, 12535, + 18967, 5312, 12488, 12101, 12493, 5313, 9300, 14363, 5314, 5315, 5316, + 5317, 5318, 5319, 5320, 5321, 5322, 5323, 10021, 5324, 5325, 5326, 5327, + 18984, 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, 13220, 5336, 5337, + 5338, 13270, 5339, 5340, 18990, 5341, 5342, 5343, 5344, 5345, 12454, 5346, + 5347, 5348, 12141, 15356, 18983, 5349, 5350, 5351, 5352, 5353, 5354, 5355, + 5356, 5357, 5358, 12839, 5359, 5360, 5361, 18982, 5362, 5363, 5364, 5365, + 18991, 18989, 12539, 5366, 18966, 5367, 18985, 5368, 14059, 5369, 16091, + 5370, 5371, 18986, 5372, 5373, 5374, 5375, 5376, 5377, 5378, 15385, 5379, + 5380, 5381, 5382, 5383, 5384, 5385, 18980, 18981, 5386, 5387, 5388, 18987, + 5389, 14736, 5390, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399, + 13058, 5400, 5401, 5402, 13412, 5403, 12471, 5404, 5405, 5406, 18979, 5407, + 5408, 5409, 12297, 5410, 5411, 5412, 5413, 5414, 5415, 14367, 9612, 5416, + 5417, 5418, 18996, 5419, 18988, 5420, 5421, 5422, 18995, 5423, 18998, 5424, + 18997, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 9641, 5432, 5433, 5434, + 9621, 18992, 5435, 5436, 18994, 18993, 13091, 5437, 5438, 5439, 5440, 5441, + 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449, 12094, 5450, 5451, 5452, + 5453, 15937, 5454, 5455, 5456, 5457, 5458, 19097, 5459, 5460, 5461, 5462, + 5463, 5464, 5465, 5466, 5467, 5468, 5469, 9061, 5470, 5471, 19099, 5472, + 5473, 19098, 5474, 5475, 5476, 5477, 5478, 5479, 11309, 5480, 19100, 5481, + 5482, 5483, 5484, 5485, 5486, 19096, 5487, 5488, 5489, 5490, 5491, 5492, + 5493, 18999, 9299, 5494, 5495, 5496, 5497, 5498, 5499, 5500, 5501, 5502, + 5503, 5504, 19103, 5505, 19104, 19101, 5506, 5507, 5508, 5509, 5510, 5511, + 5512, 5513, 5514, 5515, 5516, 5517, 19102, 19105, 5518, 5519, 5520, 5521, + 5522, 5523, 5524, 5525, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, + 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, + 5546, 5547, 5548, 5549, 5550, 13262, 5551, 5552, 5553, 5554, 5555, 5556, + 5557, 5558, 19106, 19108, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 19107, + 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, + 5578, 5579, 5580, 5581, 5582, 19110, 5583, 5584, 5585, 19109, 5586, 5587, + 5588, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 5599, + 5600, 5601, 5602, 5603, 10799, 5604, 5605, 19111, 5606, 5607, 5608, 5609, + 5610, 5611, 5612, 5613, 5614, 5615, 5616, 5617, 5618, 5619, 19112, 5620, + 5621, 5622, 5623, 5624, 5625, 5626, 5627, 5628, 5629, 5630, 5631, 11195, + 20490, 12715, 5632, 10013, 11165, 5633, 5634, 5635, 5636, 12328, 15943, + 5637, 11721, 5638, 5639, 5640, 16473, 5641, 15919, 9456, 20455, 5642, 5643, + 5644, 5645, 20078, 5646, 5647, 5648, 12460, 9807, 5649, 5650, 5651, 15350, + 5652, 5653, 5654, 9615, 5655, 13603, 11902, 20457, 5656, 5657, 16288, 5658, + 5659, 20456, 20458, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, + 5669, 5670, 5671, 5672, 20462, 11755, 14376, 13073, 11713, 5673, 20463, + 5674, 9309, 5675, 5676, 5677, 20461, 16063, 10042, 5678, 20459, 12277, + 9662, 5679, 5680, 20460, 14179, 12100, 14439, 5681, 5682, 5683, 5684, + 12305, 5685, 20465, 5686, 5687, 5688, 5689, 5690, 5691, 5692, 5693, 5694, + 5695, 5696, 5697, 5698, 10995, 12116, 5699, 16327, 5700, 5701, 5702, 15339, + 5703, 5704, 5705, 5706, 11905, 5707, 10374, 13828, 20464, 11181, 5708, + 14389, 11588, 13625, 5709, 14924, 5710, 5711, 5712, 5713, 5714, 5715, 5716, + 14608, 5717, 13090, 5718, 5719, 5720, 10428, 5721, 5722, 5723, 5724, 5725, + 5726, 5727, 5728, 5729, 5730, 5731, 15336, 10949, 5732, 5733, 5734, 5735, + 5736, 20466, 5737, 5738, 20467, 5739, 11147, 20468, 5740, 20491, 9241, + 10412, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5749, 5750, 5751, + 11520, 5752, 5753, 5754, 5755, 5756, 5757, 5758, 5759, 20469, 15365, 20470, + 5760, 5761, 5762, 5763, 13612, 5764, 5765, 5766, 5767, 5768, 5769, 5770, + 5771, 5772, 5773, 5774, 5775, 5776, 5777, 20474, 5778, 5779, 5780, 5781, + 20476, 5782, 11160, 5783, 11374, 5784, 5785, 5786, 5787, 5788, 5789, 5790, + 5791, 5792, 5793, 5794, 5795, 5796, 20472, 5797, 13798, 5798, 5799, 5800, + 5801, 5802, 12661, 5803, 20492, 16108, 20473, 5804, 5805, 5806, 5807, 5808, + 16328, 5809, 5810, 5811, 20475, 20471, 5812, 5813, 5814, 5815, 20477, 5816, + 20478, 5817, 5818, 13806, 5819, 5820, 5821, 5822, 5823, 5824, 14923, 5825, + 5826, 5827, 5828, 5829, 15165, 5830, 5831, 5832, 5833, 15307, 5834, 5835, + 5836, 5837, 13644, 5838, 5839, 5840, 20479, 14810, 5841, 5842, 5843, 5844, + 5845, 14041, 20483, 5846, 5847, 5848, 5849, 5850, 5851, 5852, 20482, 5853, + 5854, 5855, 9055, 5856, 5857, 5858, 5859, 5860, 5861, 20480, 5862, 20481, + 5863, 5864, 5865, 20493, 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, + 5874, 13613, 5875, 5876, 5877, 5878, 5879, 5880, 5881, 5882, 5883, 5884, + 12294, 5885, 5886, 5887, 5888, 5889, 20485, 15359, 5890, 5891, 5892, 5893, + 5894, 5895, 5896, 5897, 5898, 5899, 20484, 5900, 5901, 5902, 5903, 15944, + 5904, 20486, 5905, 5906, 5907, 5908, 5909, 5910, 17233, 5911, 5912, 5913, + 5914, 5915, 5916, 5917, 5918, 5919, 5920, 20487, 5921, 5922, 5923, 5924, + 5925, 5926, 5927, 5928, 5929, 5930, 5931, 5932, 9227, 5933, 5934, 5935, + 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947, + 5948, 5949, 5950, 5951, 5952, 5953, 5954, 20488, 5955, 5956, 5957, 5958, + 5959, 5960, 5961, 5962, 5963, 5964, 20489, 5965, 16441, 5966, 13047, 5967, + 5968, 5969, 20263, 9039, 5970, 5971, 5972, 11769, 10569, 15500, 9079, + 10064, 5973, 16644, 5974, 14167, 5975, 18776, 5976, 5977, 5978, 5979, 5980, + 5981, 5982, 13217, 9095, 5983, 5984, 5985, 13053, 20260, 5986, 5987, 5988, + 5989, 20261, 5990, 5991, 5992, 20262, 5993, 5994, 15327, 5995, 13018, 5996, + 20127, 5997, 12843, 5998, 12846, 12111, 5999, 6000, 6001, 20128, 12858, + 6002, 14804, 6003, 6004, 6005, 6006, 20125, 20129, 6007, 6008, 13867, 6009, + 6010, 13398, 6011, 6012, 6013, 14401, 14819, 6014, 6015, 6016, 20130, + 20131, 14927, 12136, 6017, 6018, 20132, 6019, 6020, 6021, 6022, 6023, + 10196, 20133, 6024, 20134, 6025, 20135, 6026, 6027, 20136, 6028, 6029, + 6030, 6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 20126, 6040, + 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049, 6050, 6051, 13599, + 18410, 6052, 10379, 18411, 6053, 6054, 6055, 18412, 6056, 16455, 18413, + 18414, 15719, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 18416, 11956, + 18415, 10025, 6064, 6065, 6066, 9238, 6067, 6068, 6069, 6070, 18418, 18417, + 6071, 11017, 6072, 18419, 6073, 6074, 6075, 6076, 10758, 6077, 11734, 6078, + 6079, 7790, 7791, 12917, 7792, 10986, 11533, 7793, 7794, 7795, 7796, 7797, + 7798, 18420, 18422, 7799, 7800, 10197, 14948, 13973, 18421, 16143, 15767, + 18423, 18427, 18424, 7801, 7802, 18425, 12139, 7803, 18429, 18526, 12104, + 7804, 7805, 7806, 7807, 18426, 7808, 18428, 7809, 7810, 7811, 7812, 7813, + 7814, 18530, 7815, 7816, 7817, 12307, 7818, 7819, 7820, 7821, 18528, 7822, + 18533, 9499, 18527, 7823, 7824, 7825, 12680, 9439, 18532, 18531, 7826, + 7827, 18529, 18534, 7828, 7829, 18536, 7830, 7831, 7832, 15146, 16322, + 12643, 18537, 7833, 14970, 7834, 7835, 18539, 7836, 7837, 11004, 7838, + 7839, 19919, 18538, 18535, 7840, 7841, 7842, 7843, 11126, 15884, 7844, + 7845, 7846, 7847, 7848, 7849, 7850, 7851, 7852, 7853, 7854, 7855, 7856, + 18541, 7857, 7858, 18540, 7859, 19920, 7860, 7861, 7862, 7863, 18542, 7864, + 7865, 7866, 7867, 7868, 7869, 7870, 7871, 18543, 7872, 7873, 7874, 7875, + 7876, 7877, 7878, 7879, 7880, 7881, 7882, 18544, 14346, 7883, 18545, 7884, + 7885, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, + 7991, 18546, 7992, 7993, 7994, 7995, 7996, 15199, 7997, 7998, 12487, 7999, + 15756, 8000, 14620, 8001, 8002, 19539, 8003, 8004, 19540, 8005, 8006, 8007, + 8008, 11718, 8009, 8010, 8011, 8012, 12519, 8013, 8014, 8015, 19543, 8016, + 8017, 19542, 8018, 8019, 8020, 8021, 8022, 8023, 14605, 8024, 12656, 8025, + 8026, 19541, 11138, 14969, 8027, 12320, 19548, 8028, 8029, 8030, 19547, + 8031, 8032, 19559, 9408, 8033, 8034, 8035, 8036, 19549, 8037, 19545, 8038, + 8039, 8040, 8041, 8042, 19551, 19550, 13801, 8043, 8044, 16123, 8045, + 19544, 10364, 19546, 8046, 8047, 8048, 8049, 8050, 8051, 8052, 19553, 8053, + 8054, 8055, 8056, 19558, 8057, 16318, 8058, 8059, 8060, 8061, 19552, 8062, + 19557, 8063, 19556, 8064, 8065, 8066, 9089, 8067, 8068, 8069, 8070, 19560, + 8071, 8072, 8073, 8074, 8075, 8170, 8171, 8172, 8173, 8174, 8175, 8176, + 8177, 8178, 8179, 8180, 13477, 8181, 12102, 12142, 8182, 8183, 12335, + 19555, 8184, 8185, 8186, 8187, 19561, 14241, 8188, 8189, 8190, 8191, 8192, + 8193, 8194, 8195, 8196, 19667, 19666, 8197, 8198, 8199, 8200, 8201, 8202, + 16468, 8203, 8204, 19565, 19564, 8205, 19566, 8206, 19562, 8207, 19569, + 8208, 19568, 8209, 19567, 8210, 8211, 12308, 13452, 13108, 13050, 8212, + 8213, 8214, 8215, 8216, 13472, 8217, 8218, 8219, 8220, 19668, 8221, 8222, + 8223, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, 8233, 8234, + 8235, 8236, 8237, 8238, 8239, 19671, 8240, 19670, 8241, 19672, 11012, + 19563, 19669, 8242, 13665, 13785, 8243, 8244, 8245, 8246, 8247, 8248, 8249, + 8250, 8251, 8252, 8253, 8254, 8255, 19674, 8256, 8257, 10804, 8258, 8259, + 8260, 8261, 8262, 15389, 19673, 8263, 8264, 8265, 8360, 8361, 8362, 19675, + 8363, 19678, 19679, 8364, 12262, 8365, 8366, 8367, 19680, 8368, 8369, 8370, + 19681, 8371, 8372, 19677, 8373, 19685, 8374, 8375, 8376, 8377, 8378, 8379, + 8380, 8381, 8382, 8383, 8384, 19676, 8385, 19682, 8386, 8387, 8388, 8389, + 8390, 8391, 8392, 8393, 19686, 19683, 19684, 8394, 8395, 8396, 8397, 8398, + 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 19688, + 8410, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, + 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 19687, + 8433, 8434, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 10782, 8442, 21197, + 8443, 21198, 8444, 13221, 9099, 13616, 8445, 14598, 8446, 8447, 8448, 8449, + 8450, 8451, 8452, 14770, 20062, 8453, 8454, 8455, 8550, 20063, 8551, 13236, + 9826, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 20064, 8559, 8560, 8561, + 8562, 16126, 8563, 8564, 8565, 8566, 8567, 8568, 8569, 8570, 17664, 8571, + 20065, 8572, 20066, 8573, 20067, 8574, 8575, 8576, 8577, 10587, 17971, + 13860, 8578, 14425, 8579, 8580, 13865, 8581, 8582, 8583, 8584, 8585, 13866, + 8586, 8587, 15710, 14161, 8588, 10551, 21199, 9249, 8589, 19119, 14424, + 15716, 11360, 13849, 8590, 10046, 8591, 12873, 10048, 8592, 20819, 11128, + 8593, 8594, 19537, 8595, 20820, 8596, 8597, 8598, 8599, 9604, 8600, 8601, + 20823, 8602, 8603, 20822, 11566, 8604, 20821, 14748, 8605, 8606, 8607, + 8608, 13062, 8609, 8610, 8611, 8612, 12339, 17241, 20824, 15188, 8613, + 8614, 8615, 8616, 8617, 8618, 8619, 8620, 12497, 13277, 8621, 8622, 8623, + 10367, 8624, 8625, 8626, 8627, 8628, 8629, 8630, 20825, 8631, 9670, 8632, + 8633, 8634, 11206, 20826, 8635, 8636, 8637, 8638, 8639, 19535, 8640, 8641, + 8642, 20827, 8643, 8644, 11509, 8645, 8740, 8741, 8742, 21441, 8743, 8744, + 8745, 14037, 8746, 15526, 21243, 8747, 21244, 8748, 21245, 12293, 8749, + 10622, 11731, 8750, 8751, 21247, 8752, 13032, 21246, 15376, 8753, 21249, + 9069, 11569, 8754, 8755, 8756, 8757, 8758, 15548, 21248, 8759, 9800, 10427, + 21255, 21254, 13208, 21250, 21251, 9820, 8760, 8761, 21252, 16133, 8762, + 8763, 14404, 11735, 11323, 8764, 8765, 8766, 21257, 21256, 21253, 9406, + 8767, 16247, 15699, 11708, 13597, 8768, 8769, 21259, 8770, 8771, 8772, + 8773, 15382, 8774, 16289, 10984, 21258, 8775, 10192, 8776, 8777, 14555, + 8778, 8779, 13211, 8780, 8781, 8782, 12256, 21260, 21263, 8783, 21262, + 21265, 21261, 8784, 11145, 21264, 8785, 8786, 8787, 8788, 14366, 21267, + 8789, 8790, 9648, 8791, 8792, 8793, 8794, 9267, 8795, 8796, 21268, 8797, + 8798, 21269, 21271, 9850, 8799, 21266, 8800, 21272, 8801, 8802, 8803, 8804, + 21275, 8805, 21273, 8806, 8807, 8808, 21270, 8809, 8810, 8811, 8812, 21278, + 8813, 21274, 21277, 21279, 8814, 21376, 8815, 8816, 8817, 14758, 21379, + 8818, 21378, 8819, 12341, 21276, 14026, 8820, 8821, 9866, 9296, 14362, + 8822, 21381, 8823, 8824, 21382, 8825, 8826, 21387, 16101, 21384, 8827, + 8828, 13604, 8829, 8830, 8831, 21377, 8832, 21386, 21383, 21380, 8833, + 8834, 21385, 8835, 8930, 8931, 8932, 8933, 8934, 8935, 8936, 9034, 21388, + 8937, 8938, 8939, 8940, 8941, 8942, 21390, 8943, 21392, 8944, 8945, 8946, + 8947, 8948, 21391, 8949, 21389, 8950, 8951, 8952, 8953, 15297, 8954, 8955, + 8956, 8957, 8958, 8959, 8960, 21393, 8961, 8962, 8963, 21394, 8964, 8965, + 8966, 8967, 8968, 8969, 8970, 8971, 10814, 8972, 8973, 10014, 8974, 9080, + 9082, 8975, 8976, 8977, 15942, 8978, 10011, 8979, 11547, 11157, 21192, + 8980, 8981, 10607, 8982, 8983, 21193, 8984, 8985, 9033, 8986, 21194, 8987, + 8988, 14613, 8989, 8990, 21195, 8991, 8992, 8993, 8994, 8995, 8996, 8997, + 8998, 8999, 9000, 21196, 9001, 9002, 9003, 9004, 9005, 9006, 9007, 9008, + 9009, 13209, 9010, 9011, 16314, 21443, 9012, 21444, 9013, 9014, 9015, 9016, + 9017, 9018, 9019, 9020, 9021, 9022, 12718, 9023, 9024, 15734, 9025, 9120, + 16294, 13087, 9121, 15690, 9122, 15555, 9123, 9124, 20838, 9052, 16076, + 15341, 11369, 10973, 9125, 11963, 9126, 10584, 10008, 13059, 9127, 9128, + 13967, 9129, 9130, 9131, 12678, 9132, 9133, 9134, 9135, 9136, 20839, 9137, + 9138, 9139, 9140, 9141, 9142, 9143, 9144, 12856, 10167, 9145, 20691, 12639, + 9146, 16262, 9147, 9148, 9149, 14979, 20694, 9150, 9151, 13061, 9152, + 10225, 9153, 9154, 13966, 9155, 9156, 20692, 9157, 9158, 20695, 20696, + 12663, 9159, 11895, 9160, 20693, 9161, 9162, 9163, 9164, 9165, 9166, 9167, + 9168, 9169, 9170, 9171, 20699, 20697, 9172, 9173, 9174, 9175, 16125, 12698, + 9176, 20698, 9177, 9178, 9179, 20701, 9180, 16058, 15298, 9181, 9182, 9183, + 20700, 9184, 12683, 9185, 9186, 9187, 9188, 9189, 20702, 11959, 11761, + 20703, 9190, 14432, 9191, 15354, 9192, 9193, 9194, 16472, 16141, 9195, + 20707, 9196, 9197, 9198, 20706, 9199, 9200, 9201, 9202, 9203, 9204, 9205, + 9206, 20704, 20705, 9207, 9208, 9209, 9210, 9211, 9212, 9213, 9214, 20708, + 11691, 9215, 9310, 9311, 9312, 9313, 14170, 20806, 10194, 9314, 20807, + 12857, 9315, 20709, 9316, 9317, 11557, 9444, 9318, 9319, 9320, 9321, 9322, + 9323, 9324, 9325, 9326, 9327, 9328, 9329, 10200, 9330, 9331, 9332, 20810, + 16651, 20808, 20811, 9333, 9334, 9335, 12708, 9677, 9336, 9337, 9338, 9339, + 9340, 9341, 20812, 20809, 14940, 9342, 9343, 20813, 12532, 9344, 9345, + 9346, 9347, 9348, 9349, 9350, 9351, 9352, 9353, 9354, 9355, 20814, 20815, + 9356, 17776, 9357, 9358, 13224, 9359, 13433, 9360, 16330, 10016, 9361, + 14173, 9362, 9363, 9364, 20816, 9365, 9366, 14546, 9367, 20817, 9368, 9369, + 9370, 9371, 9372, 16071, 9373, 20818, 9374, 22361, 9375, 9376, 9377, 9378, + 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 17234, 9388, 9389, + 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9788, 9397, 9398, 9399, 12647, + 21445, 9400, 9401, 9402, 9403, 9404, 13989, 15536, 9405, 16255, 9500, + 21077, 9501, 11741, 9502, 11530, 21078, 10209, 9036, 9503, 9504, 9505, + 9506, 13980, 9507, 9508, 20637, 9509, 20638, 9510, 9511, 9512, 9513, 14814, + 10370, 11958, 20639, 12520, 13791, 9514, 9515, 9516, 9517, 9518, 9519, + 20640, 9520, 9521, 13291, 11894, 9522, 9523, 9524, 20643, 13103, 9525, + 15343, 9526, 16444, 20641, 20642, 9527, 15361, 9528, 20646, 20647, 9529, + 20651, 9530, 9531, 9532, 20655, 9533, 20653, 20661, 16127, 9534, 20656, + 9535, 9536, 20654, 20645, 9537, 9538, 13088, 9539, 9540, 9541, 13243, 9542, + 9543, 13848, 15915, 20648, 20649, 20650, 20652, 9544, 12154, 9545, 9786, + 9546, 9547, 9548, 9549, 10807, 9550, 20663, 9551, 9552, 9553, 9554, 20664, + 9555, 20657, 9556, 20662, 9557, 14813, 9558, 9559, 14177, 20659, 20660, + 9560, 9561, 9562, 9563, 9564, 15000, 9565, 9566, 9567, 9568, 9569, 9570, + 9571, 9572, 9573, 9574, 9575, 9576, 20665, 12337, 15693, 20658, 13608, + 9577, 9578, 9579, 9580, 9581, 9582, 9583, 9584, 11384, 9585, 9586, 9587, + 9588, 13095, 9589, 9590, 9591, 9592, 9593, 9594, 9595, 9690, 9691, 9692, + 20669, 9693, 10054, 9694, 9695, 12466, 9038, 14228, 9696, 9697, 9229, 9698, + 20667, 9699, 9700, 9701, 14610, 10041, 9702, 20668, 20666, 20670, 9703, + 9704, 10065, 9705, 20671, 9706, 20672, 9707, 20675, 9708, 9259, 9709, 9710, + 9711, 9712, 9713, 9714, 9715, 9716, 13101, 11383, 20673, 14373, 9479, 9717, + 9718, 9719, 9720, 20674, 9721, 9722, 9723, 9724, 12900, 9725, 9726, 9822, + 9727, 9728, 9729, 9110, 9730, 9731, 9732, 20678, 12123, 9857, 9733, 9734, + 9735, 9736, 13060, 9737, 9738, 9739, 20676, 11911, 9740, 9741, 9742, 20677, + 9743, 9744, 9745, 9746, 9747, 9748, 9749, 9750, 9751, 9752, 9753, 9754, + 9755, 9756, 12830, 9757, 9758, 9759, 20679, 9760, 9761, 9762, 9763, 9764, + 20680, 9765, 20682, 9766, 9767, 12310, 9768, 9769, 11154, 9770, 9771, 9772, + 9773, 9774, 9775, 11519, 9776, 9777, 9778, 20681, 9779, 9780, 9781, 9782, + 9783, 9784, 9785, 9880, 9881, 9882, 9883, 9884, 9885, 20683, 9886, 9887, + 9888, 9889, 9890, 9891, 9892, 9893, 9894, 9895, 20685, 9896, 9897, 9898, + 9899, 9900, 20684, 9901, 9902, 9903, 9904, 9905, 9906, 9907, 9908, 9909, + 9910, 9911, 9912, 9913, 9914, 9915, 20686, 9916, 9917, 9918, 9919, 9920, + 13995, 20499, 12146, 9921, 13846, 9922, 20500, 13283, 9923, 9924, 9925, + 9926, 20501, 9927, 13282, 20502, 9928, 9929, 9930, 9931, 9932, 9933, 9934, + 9935, 9936, 20505, 9937, 9938, 16505, 20508, 9939, 9940, 20506, 20503, + 20504, 16438, 13856, 14233, 20509, 9941, 20507, 9942, 9943, 14988, 9944, + 20511, 13222, 9945, 9946, 9947, 9948, 11337, 9949, 20510, 9950, 9951, 9952, + 9953, 9954, 9955, 9956, 10002, 11201, 9957, 20512, 9958, 9959, 9960, 9961, + 9962, 16902, 11586, 9963, 9964, 12472, 20513, 9965, 9966, 9967, 9968, + 20514, 9969, 9970, 9971, 9972, 10548, 9973, 9974, 9975, 10070, 10071, + 10072, 10073, 10074, 10075, 10076, 20515, 10077, 10078, 10079, 10080, + 10081, 10082, 10083, 10084, 10085, 10086, 10087, 10088, 20516, 10089, + 10090, 10091, 10092, 10093, 10094, 10095, 10096, 10097, 10098, 10099, + 20517, 10100, 10101, 10102, 10103, 10104, 15752, 16639, 12140, 10105, + 13456, 10969, 10106, 15172, 14184, 10107, 14561, 10108, 10109, 10594, + 10110, 10111, 9307, 10112, 13474, 10113, 16299, 10114, 10115, 10116, 11913, + 12710, 10117, 10118, 21080, 10119, 10120, 12691, 10121, 10122, 10123, + 10124, 10125, 10126, 16501, 10127, 10128, 10129, 21082, 9646, 10130, 13451, + 15372, 10131, 16285, 10132, 21083, 10133, 21081, 10134, 11208, 9633, 10135, + 10136, 10137, 10138, 10139, 10140, 10141, 11548, 10142, 10143, 15523, + 10144, 11179, 10145, 10146, 14916, 10147, 21087, 21086, 10148, 10149, + 21084, 10150, 10151, 10152, 10153, 9639, 10154, 13827, 14171, 10155, 10156, + 10157, 10158, 10159, 21089, 10160, 10161, 9087, 10162, 10163, 16286, 10164, + 10165, 10260, 21088, 10261, 9672, 10262, 10263, 22378, 10264, 10265, 10266, + 10267, 10268, 10269, 10270, 10271, 10272, 10273, 10274, 10275, 10276, + 10277, 10278, 14765, 10279, 10280, 10281, 21187, 10282, 21186, 10283, + 10005, 11363, 11207, 10284, 10614, 10285, 10286, 10287, 10288, 10289, + 10290, 12859, 10291, 10292, 10293, 10294, 10295, 10296, 10297, 10298, + 10299, 10300, 21188, 10301, 10302, 10303, 10304, 10305, 14230, 10306, + 10307, 10308, 10309, 10310, 10311, 10312, 10313, 10314, 10315, 10316, + 10317, 10318, 10319, 10320, 10321, 10322, 10323, 10324, 10325, 10326, + 10327, 10328, 10329, 21191, 10330, 10331, 10332, 15303, 10333, 11716, + 13473, 21397, 21398, 11928, 10334, 10335, 10336, 10337, 9794, 21399, 14562, + 10338, 13447, 16068, 10339, 21400, 10340, 21401, 10341, 10342, 10343, + 10344, 13442, 10345, 10346, 10347, 15489, 16292, 10348, 10349, 21402, + 11544, 9801, 11714, 10350, 10351, 10352, 9845, 14774, 10353, 11938, 21404, + 10354, 10355, 10450, 10451, 11965, 21403, 10452, 21406, 10453, 10454, + 10455, 21405, 21407, 10456, 10457, 10458, 10459, 10460, 21408, 10461, + 10462, 10463, 10464, 10465, 10466, 10467, 10468, 10469, 10470, 10471, + 12349, 10472, 10473, 10474, 10475, 10476, 10477, 10478, 10479, 10480, + 10481, 10482, 12257, 10483, 10484, 10485, 10486, 10487, 10488, 10489, + 10490, 10491, 10492, 14055, 10493, 10494, 16085, 10495, 10496, 10497, + 10498, 11711, 11710, 16089, 10499, 10500, 11877, 10501, 14550, 21396, + 10502, 10503, 10504, 10505, 10506, 10507, 11558, 10508, 10208, 10509, + 10510, 10511, 10512, 10513, 10514, 10515, 10516, 10517, 16326, 21790, + 10518, 10519, 21791, 10520, 10590, 10521, 10522, 10523, 21793, 21794, + 10524, 9067, 10525, 21792, 10526, 21796, 14236, 10527, 10528, 10529, 21798, + 10530, 15111, 10531, 10532, 9257, 21795, 10533, 10534, 10535, 21802, 10536, + 10024, 10537, 10538, 21810, 10539, 21805, 10540, 10541, 10542, 21807, + 21806, 10446, 10543, 9246, 10544, 21801, 21797, 10033, 10545, 21803, 10640, + 10641, 21804, 10642, 21808, 10643, 10644, 10645, 10646, 21800, 10647, + 11372, 10648, 12348, 10649, 21809, 10650, 10651, 10652, 10653, 10654, + 10655, 21813, 10656, 21799, 10657, 10015, 10658, 11573, 21815, 10659, + 10660, 10359, 11955, 16339, 14553, 10661, 9865, 10662, 9468, 10663, 21811, + 10664, 21812, 13799, 10665, 21816, 10666, 10667, 21817, 10668, 21820, + 10669, 10670, 10671, 10672, 10673, 10674, 10675, 10676, 10677, 10678, + 10679, 21818, 10680, 10681, 21822, 21821, 10682, 10683, 21814, 10684, + 11949, 10685, 9674, 10686, 21819, 10687, 10688, 13404, 10689, 11387, 10690, + 10691, 10692, 10693, 21830, 10694, 10695, 10696, 10697, 10698, 10699, + 10700, 10766, 10701, 10702, 21823, 10703, 10704, 10705, 9418, 11209, 10706, + 14222, 10707, 10708, 10709, 10710, 21832, 21828, 10711, 10712, 10713, + 10795, 21833, 10714, 10715, 10716, 21824, 21825, 21829, 12510, 21831, + 21834, 21827, 11398, 10717, 10718, 10719, 14983, 10720, 10721, 21835, + 10722, 10723, 10724, 21826, 10725, 10726, 10727, 10728, 10729, 10730, + 10731, 10732, 21837, 10733, 10734, 10735, 10830, 16448, 13215, 10831, + 10832, 10833, 10834, 21838, 10835, 10836, 10837, 10838, 21836, 10839, + 12453, 10840, 10841, 10842, 10843, 10844, 10606, 21840, 10845, 10846, + 21839, 10847, 10848, 10849, 9844, 10850, 10851, 10852, 21841, 21842, 10853, + 10854, 10855, 21843, 10856, 10857, 10858, 12091, 10859, 10860, 12138, + 10861, 10862, 10863, 10864, 10865, 13096, 10866, 10867, 10868, 10869, + 21846, 10870, 21845, 10871, 10872, 10873, 10874, 10875, 10876, 10877, + 10878, 9841, 10879, 10880, 10881, 21849, 21844, 10882, 10883, 21847, 10884, + 10885, 10886, 10887, 10888, 10889, 21848, 10890, 10891, 10892, 10893, + 10894, 10895, 10896, 10897, 21946, 10898, 10899, 10900, 10901, 10902, + 10903, 21948, 11156, 10904, 10905, 21947, 10906, 10907, 10908, 10909, + 10910, 10911, 10912, 10913, 10914, 10915, 10916, 10917, 10918, 21949, + 10919, 10920, 10921, 10922, 10923, 10924, 9435, 21951, 21950, 10925, 11020, + 11021, 11022, 11023, 11024, 11025, 11026, 11027, 11028, 11029, 11319, + 11030, 11031, 11032, 11033, 11034, 11035, 11036, 11037, 11038, 11039, + 11040, 11041, 11042, 11043, 11044, 11045, 11046, 11047, 11048, 11049, + 11050, 11051, 11052, 11053, 11054, 11055, 11056, 11057, 11058, 11059, + 11060, 11061, 11062, 11063, 11064, 11065, 11066, 12690, 16880, 11067, + 11068, 11069, 11070, 11071, 11072, 12129, 21989, 16484, 11073, 11074, + 11075, 11076, 11077, 11078, 11079, 11080, 11081, 11082, 11083, 10414, + 11084, 11085, 11086, 11087, 11088, 11089, 11090, 21991, 12258, 11091, + 11092, 13246, 11093, 9839, 16074, 11094, 11095, 11096, 21993, 21992, 21994, + 14213, 11097, 11098, 21995, 11099, 15898, 16309, 11100, 11101, 11102, + 11103, 10419, 11104, 11105, 11106, 12279, 11107, 11108, 12282, 21996, + 11697, 11109, 11110, 11111, 11112, 11113, 9851, 11114, 11115, 21997, 21998, + 11696, 11210, 11211, 21999, 11212, 11213, 11214, 22004, 11215, 22000, + 22003, 11216, 11018, 11217, 22001, 22002, 11218, 11219, 11220, 11221, + 11222, 11223, 11224, 10611, 14384, 22005, 11225, 9463, 11226, 11227, 12686, + 11228, 11229, 15932, 11898, 11230, 11231, 11232, 11233, 11234, 11235, + 11236, 22006, 11237, 11238, 11239, 11240, 11241, 11242, 13035, 11243, + 11244, 11245, 11246, 11247, 11248, 11249, 11250, 22018, 11251, 11252, + 14936, 11253, 11254, 11255, 11256, 11257, 11258, 11259, 11260, 11261, + 11262, 11263, 11264, 11265, 11266, 14766, 11267, 11268, 11269, 11270, + 11271, 11272, 11273, 11274, 11275, 11276, 11277, 11278, 11279, 11280, + 11281, 11282, 11283, 11284, 11285, 11286, 11287, 14211, 11288, 14242, + 11289, 11290, 11291, 11292, 11579, 11293, 11294, 11295, 16482, 11296, + 11297, 11298, 12124, 11299, 11300, 11301, 11302, 11303, 11304, 11305, + 11400, 11401, 11402, 11403, 11404, 11405, 11406, 11407, 11408, 11409, + 11410, 11411, 11412, 11413, 11414, 11415, 11416, 11417, 11418, 11419, + 11420, 11421, 11422, 11423, 11424, 11425, 11426, 11427, 11428, 11429, + 11430, 11431, 11432, 11433, 11434, 11435, 11436, 11437, 11438, 11439, + 11440, 11441, 11442, 11443, 11444, 11445, 11446, 11447, 11448, 11449, + 11450, 11451, 11452, 11453, 11454, 15190, 11455, 11456, 11457, 11458, + 11459, 11460, 11461, 11462, 22019, 11463, 11464, 11465, 11466, 11467, + 11468, 11469, 11470, 11471, 11472, 11473, 11474, 11475, 11476, 11477, + 11478, 11479, 11480, 11481, 11482, 11483, 11484, 11485, 11486, 11487, + 11488, 11489, 11490, 11491, 11492, 11493, 11494, 11495, 11590, 11591, + 11592, 11593, 11594, 11595, 11596, 11597, 11598, 11599, 11600, 11601, + 11602, 22020, 11603, 11604, 11605, 11606, 11607, 11608, 11609, 22021, + 11610, 11611, 11612, 11613, 11614, 11615, 11616, 11617, 11618, 11619, + 11620, 11621, 11622, 11623, 11624, 11625, 11626, 11627, 11628, 11629, + 11630, 11631, 11632, 11633, 11634, 11635, 11636, 11637, 11638, 11639, + 11640, 11641, 11642, 11643, 11644, 11645, 11646, 11647, 11648, 11649, + 11650, 11651, 11652, 11653, 11654, 11655, 11656, 11657, 11658, 11659, + 11660, 11661, 11662, 11663, 11664, 11665, 11666, 11667, 11668, 11669, + 11670, 11671, 11672, 11673, 11674, 11675, 11676, 11677, 11678, 11679, + 11680, 11681, 11682, 11683, 11684, 11685, 11780, 11781, 11782, 11783, + 11784, 11785, 11786, 11787, 11788, 11789, 11790, 11791, 11792, 11793, + 11794, 11795, 11796, 11797, 11798, 11799, 11800, 11801, 11802, 11803, + 11804, 11805, 11806, 11807, 11808, 11809, 11810, 11811, 11812, 11813, + 11814, 11815, 11816, 11817, 11818, 11819, 11820, 11821, 11822, 11823, + 11824, 11825, 11826, 11827, 11828, 11829, 11830, 11831, 11832, 11833, + 11834, 11835, 11836, 11837, 11838, 11839, 11840, 11841, 11842, 11843, + 22582, 11844, 11845, 11846, 11847, 11848, 10372, 11849, 11850, 11851, + 11852, 11853, 22022, 11854, 11855, 11856, 11857, 11858, 11859, 11860, + 11861, 11862, 11863, 11864, 11865, 11866, 11867, 11868, 11869, 11870, + 11871, 11872, 11873, 11874, 11875, 11970, 11971, 11972, 11973, 11974, + 11975, 11976, 11977, 11978, 11979, 11980, 11981, 11982, 11983, 11984, + 11985, 11986, 11987, 11988, 11989, 11990, 11991, 11992, 11993, 11994, + 11995, 11996, 11997, 11998, 11999, 12000, 12001, 12002, 12003, 12004, + 12005, 16510, 12006, 12007, 12008, 12009, 12010, 12011, 12012, 12013, + 12014, 12015, 12016, 12017, 12018, 12019, 12020, 12021, 12022, 12023, + 12024, 12025, 12026, 12027, 12028, 12029, 22023, 12030, 12031, 12032, + 19374, 11717, 19375, 11001, 19376, 14958, 19377, 15893, 11327, 19378, + 19379, 11350, 13635, 14744, 19476, 12033, 9816, 19477, 13795, 10602, 12866, + 12034, 16496, 12503, 10410, 16274, 14763, 10391, 12035, 12036, 13021, + 19478, 14978, 19479, 19480, 19481, 12278, 16508, 13855, 14939, 16260, + 16298, 19482, 9102, 19483, 19484, 13835, 15564, 11698, 19485, 9108, 13647, + 11560, 19486, 13623, 12037, 19487, 11185, 10633, 15299, 19488, 12516, + 11773, 11537, 14554, 19489, 19490, 11763, 15174, 12038, 14226, 14393, + 11349, 19491, 11313, 15192, 19492, 12039, 15193, 19493, 19494, 9819, 19495, + 19496, 13869, 14737, 12699, 19498, 9248, 9676, 12040, 19499, 19500, 16494, + 16087, 19501, 12489, 16461, 19502, 19503, 19504, 11379, 12704, 12099, + 19505, 19506, 11314, 12041, 19507, 19508, 19497, 10213, 19509, 12042, + 19510, 19511, 11141, 10037, 12483, 9279, 19512, 15886, 19513, 10576, 19515, + 19514, 10431, 12043, 19516, 9493, 19517, 19518, 19519, 19520, 19521, 19522, + 19523, 15682, 14240, 19524, 19525, 19526, 19527, 13816, 19528, 19529, + 19530, 19531, 19532, 11536, 19533, 21785, 12044, 10600, 12045, 13602, + 12046, 12047, 12048, 12049, 12050, 12051, 12052, 21786, 12053, 21787, + 21788, 12054, 12055, 12056, 12057, 12058, 12059, 12060, 12061, 12062, + 12063, 10797, 14623, 12064, 12065, 16697, 10942, 12160, 12507, 20828, + 12161, 10358, 12162, 12163, 12164, 12165, 20830, 12166, 20829, 9078, 12167, + 12168, 12169, 12170, 12171, 20832, 16109, 16514, 12172, 12173, 12174, + 16280, 12175, 12176, 20834, 14045, 12177, 20833, 12178, 12179, 12180, + 12181, 20835, 12182, 12183, 12184, 12185, 20837, 12186, 12187, 20836, + 12188, 12189, 12190, 12191, 12192, 12193, 12194, 12195, 15377, 12196, + 13423, 12197, 12667, 12198, 12199, 12200, 12201, 12202, 10610, 12203, + 12204, 12205, 12206, 12207, 12326, 12208, 12209, 21983, 15168, 21984, + 12210, 14974, 12211, 12212, 13611, 12213, 12214, 21985, 12215, 12216, + 12217, 12218, 12219, 12220, 12221, 21986, 21987, 12222, 21988, 12223, + 12224, 12225, 12226, 12227, 16905, 10639, 12228, 12229, 19176, 15755, + 12230, 22009, 12231, 14769, 12232, 12233, 12234, 9660, 12235, 12236, 12237, + 12238, 21395, 12239, 15563, 12240, 22010, 12241, 12242, 12243, 12244, + 12245, 14987, 22011, 12246, 12247, 13439, 12248, 12249, 12250, 12251, + 12252, 12253, 10027, 9853, 22013, 12254, 12255, 12350, 22012, 22014, 12351, + 12352, 22015, 12353, 12354, 12355, 12356, 22016, 12357, 10943, 9056, 12358, + 22017, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 10368, 15562, + 12366, 12367, 12368, 15496, 12112, 12369, 11903, 20238, 16118, 20085, + 12370, 12371, 12372, 12373, 21458, 10253, 14158, 12374, 12375, 12870, + 12376, 21446, 12377, 21447, 10636, 21448, 10961, 15902, 9075, 12378, 12379, + 21449, 12380, 12381, 12382, 21450, 12383, 21451, 12384, 12385, 21452, + 21453, 21454, 21456, 21455, 13068, 12386, 12387, 12388, 12389, 12390, + 12391, 21457, 12392, 10255, 12393, 21459, 15499, 17804, 14197, 12394, + 12395, 9655, 12396, 9977, 12397, 10737, 12398, 12399, 12909, 21460, 12400, + 12401, 21461, 12402, 12403, 12404, 12291, 12346, 16261, 21462, 12405, + 12406, 12407, 12408, 21463, 12409, 12265, 12410, 12411, 12412, 13229, + 12413, 11744, 12414, 12415, 12416, 12417, 12418, 12419, 12420, 12421, + 12422, 12423, 12424, 12425, 12426, 12427, 21464, 9832, 12428, 12429, 12430, + 12431, 12432, 12433, 21465, 12434, 12435, 12436, 12437, 12438, 12439, + 12440, 12441, 12442, 12443, 12444, 12445, 12540, 20633, 20632, 12541, + 12542, 14219, 15547, 12543, 14188, 16111, 12544, 13651, 12545, 12128, + 11306, 12546, 12547, 12548, 12549, 12550, 12551, 20268, 12552, 12553, + 15109, 12554, 16311, 12555, 10204, 10601, 20267, 10591, 12556, 20266, 9601, + 10776, 16256, 12557, 10439, 10397, 12558, 12559, 12560, 11376, 10385, + 20273, 12561, 20274, 9050, 11922, 12562, 20272, 15768, 12563, 20275, 12564, + 12565, 20276, 12566, 12567, 10401, 12568, 20269, 20271, 13861, 16300, + 16100, 15123, 20282, 14749, 20283, 12569, 9983, 12570, 12571, 12572, 12573, + 12574, 9234, 20285, 14350, 12575, 12576, 12577, 12578, 12579, 12580, 12581, + 13069, 20286, 12582, 20284, 13078, 20281, 13969, 20288, 9116, 12583, 12584, + 11015, 12585, 12586, 16648, 21442, 12587, 20277, 20278, 20279, 20280, + 20289, 19317, 20292, 12588, 11947, 15525, 20290, 20295, 10621, 20291, + 12589, 11521, 12590, 15161, 12591, 9048, 12592, 20296, 12885, 12593, 12594, + 12595, 12596, 16257, 12597, 12598, 12599, 9849, 12600, 12601, 12531, 11330, + 12602, 12603, 20293, 20294, 15929, 13279, 12877, 20298, 13022, 16900, + 12604, 9422, 12605, 20303, 12606, 11532, 12607, 12608, 12609, 20301, 12610, + 12611, 12612, 12613, 12614, 12615, 12616, 12617, 12618, 12619, 12620, + 12621, 12622, 20302, 12623, 12624, 10557, 12625, 14584, 20304, 12626, + 12627, 12628, 20300, 12629, 12274, 12630, 12631, 12632, 12633, 12634, + 13207, 12635, 12730, 12731, 12732, 12733, 12734, 12735, 14428, 12736, + 20305, 12737, 12081, 15509, 20306, 12738, 12739, 12740, 10560, 10558, + 12741, 20307, 13422, 14618, 12742, 12743, 12744, 20309, 20310, 12745, + 12746, 12747, 12748, 12749, 20312, 12750, 12751, 12752, 12753, 15145, + 12754, 20317, 12755, 20313, 12756, 12757, 12758, 20316, 13674, 12759, + 15387, 20311, 12760, 12761, 20308, 12762, 12763, 12764, 12765, 10570, + 14972, 12894, 20314, 20315, 14403, 14575, 9107, 12766, 20321, 12767, 12768, + 12769, 12770, 12771, 20320, 12772, 9423, 12773, 12774, 12775, 12776, 10609, + 12777, 20322, 12778, 12779, 12780, 12781, 12782, 12783, 9291, 12784, 12785, + 14382, 12829, 14920, 12786, 12787, 12788, 12789, 12790, 20324, 12791, + 12792, 20427, 12793, 13097, 12794, 20325, 12795, 12796, 12797, 12798, + 12799, 12800, 12801, 12802, 13812, 12803, 12804, 12805, 12806, 12807, + 12808, 18588, 20329, 12809, 12810, 12811, 12812, 14581, 20426, 9274, 15698, + 12813, 12814, 15545, 12815, 12816, 12817, 20328, 12818, 20326, 12819, + 12820, 12821, 12822, 12823, 12824, 12825, 12920, 12921, 12922, 12923, + 12924, 12925, 12926, 12927, 12928, 12929, 12930, 12931, 12932, 12933, + 12934, 9623, 12935, 12936, 12937, 20061, 12938, 12939, 16487, 12940, 21956, + 9679, 12941, 12942, 12943, 12944, 12945, 16278, 16279, 12946, 12947, 12948, + 12949, 12950, 12951, 16128, 11727, 12952, 21952, 12953, 15493, 21953, + 21954, 12954, 21955, 11728, 15738, 12955, 12956, 12957, 12958, 12959, + 13839, 13840, 12960, 12961, 21789, 12962, 14035, 12963, 14427, 12964, + 12965, 12966, 12967, 12968, 12969, 18547, 14175, 12970, 14797, 16304, + 12971, 21958, 21959, 21960, 12972, 12973, 12974, 12975, 21963, 12976, + 10954, 21964, 9092, 21961, 12977, 21962, 11497, 9458, 12978, 21967, 21968, + 10235, 9421, 14962, 21965, 9797, 12979, 21966, 12980, 12981, 21969, 12982, + 12983, 12984, 12985, 12986, 21970, 12987, 12988, 14542, 12989, 21971, + 12990, 21972, 12991, 12992, 12993, 21973, 12994, 12995, 12996, 12997, + 12998, 12999, 13000, 13001, 14205, 13002, 21974, 13003, 13004, 13005, + 13006, 21975, 13007, 13008, 13009, 13010, 13011, 13012, 13013, 13014, + 21976, 13015, 13110, 13111, 13112, 13113, 22007, 12283, 11377, 13114, + 13786, 15357, 19180, 13115, 13116, 13117, 13118, 17404, 15538, 13119, + 13120, 17405, 9037, 17406, 13121, 13122, 11553, 13123, 17410, 13124, 13125, + 13126, 16659, 13127, 17408, 15758, 13128, 13829, 17411, 17407, 13129, + 17412, 12637, 13130, 13131, 13132, 13133, 17413, 17422, 17414, 13134, + 13135, 14788, 16250, 13136, 17432, 13137, 17430, 13138, 13139, 17435, + 11565, 12456, 13140, 17409, 17428, 17431, 17415, 10405, 9062, 17424, 15135, + 17418, 11123, 13141, 10383, 17429, 13142, 13143, 17423, 17416, 13454, + 13144, 13145, 13146, 15326, 17417, 13147, 13148, 17427, 13149, 13150, + 17433, 13151, 13152, 14738, 17419, 13153, 17420, 17425, 17426, 9457, 17434, + 14208, 13154, 15888, 17444, 17448, 14351, 17455, 13155, 12706, 17445, + 13156, 13157, 11908, 17442, 13158, 9115, 10757, 17454, 17436, 13159, 17421, + 17439, 13669, 11939, 13160, 13161, 13162, 13163, 13802, 13164, 13165, + 13166, 9244, 13167, 15677, 13168, 13169, 17443, 13170, 13171, 17438, 13172, + 13232, 13173, 17447, 13174, 13175, 13176, 13177, 13178, 16469, 12650, + 10377, 13444, 12644, 17451, 17441, 17460, 17437, 13179, 13180, 17446, + 13181, 11690, 17440, 13182, 17449, 13183, 13184, 17452, 17453, 13185, + 17473, 13186, 13187, 17450, 17577, 17456, 13188, 13189, 13190, 13191, + 13192, 13193, 13194, 13195, 13196, 13197, 11380, 9821, 13198, 13199, 12638, + 9476, 17475, 13200, 17467, 13201, 17464, 13202, 17477, 17463, 15565, 9477, + 13203, 13640, 13652, 17476, 13204, 17462, 13205, 13300, 13301, 17472, + 13302, 13303, 17470, 13304, 13305, 11688, 17469, 13306, 9466, 13307, 13308, + 13309, 13310, 13311, 17468, 11391, 17457, 11151, 13312, 12148, 13313, + 13314, 13315, 13316, 13317, 11357, 17458, 17459, 13318, 17466, 17471, + 17474, 9995, 13319, 13642, 11186, 17479, 17478, 15686, 17576, 17578, 17580, + 15566, 17579, 17581, 17582, 15494, 13320, 13321, 13322, 13323, 13324, + 13325, 13326, 10966, 17584, 13327, 13328, 17597, 17592, 17595, 13329, + 13330, 13331, 13332, 13333, 13334, 13335, 17591, 13251, 13336, 13337, + 12147, 13338, 13339, 13340, 13341, 13790, 13342, 13343, 13344, 17461, + 17589, 13345, 13346, 13347, 13348, 17598, 13349, 13350, 17465, 17590, + 13351, 17599, 13352, 17587, 13353, 13354, 13355, 13356, 13357, 13358, + 13359, 17600, 17594, 17588, 12835, 13360, 13361, 13362, 13363, 17583, + 12084, 12266, 17585, 17586, 13364, 17593, 11196, 17596, 15683, 17601, + 13365, 17602, 12642, 13366, 13367, 17625, 17603, 13368, 13369, 13370, + 17624, 13371, 10764, 13372, 13373, 11738, 13374, 11775, 13375, 13376, + 10967, 13377, 13378, 13379, 13380, 17617, 13381, 17612, 13382, 17606, + 13383, 13384, 13385, 9448, 17610, 13386, 17618, 9409, 17628, 13387, 13388, + 13389, 17605, 13390, 13391, 13392, 13253, 17623, 13393, 13394, 13395, + 13490, 13491, 17627, 12321, 10393, 13492, 13493, 13494, 13495, 13496, + 17621, 17622, 13497, 13498, 13499, 17611, 13500, 13501, 13502, 17604, + 13503, 17620, 14394, 13504, 17616, 13505, 13506, 13507, 13508, 17609, + 12675, 13233, 14739, 17619, 13509, 17615, 13510, 13511, 13512, 13513, + 13514, 13515, 17608, 13516, 13517, 13518, 17613, 12505, 13519, 13520, + 13521, 13522, 13523, 13524, 15684, 15685, 17626, 14999, 13673, 13525, + 13526, 13527, 13528, 13529, 13530, 13531, 13532, 17645, 13533, 13534, + 13535, 13536, 13537, 13538, 17614, 13539, 13540, 13541, 17639, 12513, + 13542, 13543, 13544, 13545, 13546, 13547, 13548, 13549, 17640, 13550, + 13551, 13552, 13553, 13554, 13555, 13556, 13557, 13558, 13559, 17630, + 13560, 13561, 13562, 13563, 13564, 16333, 13565, 17632, 17631, 10625, + 17629, 13566, 13567, 13568, 13569, 13252, 13570, 10178, 13571, 13572, + 13573, 13574, 13575, 17641, 13576, 11014, 15930, 17646, 13577, 13578, + 13579, 9833, 13580, 17633, 13581, 11966, 17642, 13582, 17638, 13583, 17636, + 13584, 13585, 13680, 13681, 13682, 13683, 13684, 10032, 13685, 13686, + 13687, 13688, 17634, 17635, 17637, 13689, 11510, 17643, 13690, 17644, + 13691, 13692, 13693, 13694, 13695, 13696, 13697, 13698, 17660, 13699, + 12676, 13700, 13701, 14221, 13702, 13703, 13704, 13705, 17657, 13706, + 13707, 13708, 13709, 13710, 13711, 13712, 13713, 13714, 13715, 13716, + 13717, 13718, 16690, 13719, 13720, 13254, 13721, 17659, 13722, 13723, + 13724, 16139, 17658, 17655, 13725, 13726, 17651, 13727, 17654, 13728, + 17647, 13729, 13730, 15183, 13731, 13732, 13733, 13734, 13641, 17653, + 13735, 13736, 17648, 13737, 13738, 17649, 14237, 13739, 17652, 13740, + 13741, 9260, 13742, 13743, 13744, 13745, 13746, 13747, 12087, 13748, 11332, + 17656, 13749, 13750, 17662, 13751, 17661, 17650, 13752, 13753, 13754, + 13755, 13756, 13093, 13757, 13758, 13759, 17666, 13760, 13761, 13762, + 13763, 13764, 13765, 13766, 13767, 13768, 13769, 13770, 17769, 13771, + 13772, 17768, 13773, 13774, 13775, 13870, 13871, 13872, 13873, 13874, + 13875, 13876, 13877, 13878, 17663, 13879, 13880, 13881, 13882, 12714, + 13883, 12536, 13884, 13885, 13886, 16120, 13887, 13888, 14746, 13889, + 13890, 13891, 13892, 17668, 13893, 9449, 13894, 13895, 13896, 13897, 13898, + 13899, 13900, 13901, 13902, 12897, 14028, 13903, 13904, 13905, 13906, + 13907, 13908, 13909, 13910, 13911, 13912, 13425, 17665, 17667, 17669, + 17767, 9035, 9261, 13913, 13914, 13915, 13916, 13917, 17777, 13918, 13919, + 13920, 13921, 17771, 11517, 13664, 13922, 13923, 13924, 13925, 13926, + 13927, 13928, 13929, 13930, 13931, 13932, 17766, 13933, 13934, 17770, + 13935, 13936, 13937, 13938, 17774, 13939, 13940, 13941, 13942, 13943, + 17773, 13944, 13945, 13946, 17772, 13947, 13948, 13949, 13950, 13951, + 13952, 13953, 13954, 13955, 17778, 13956, 15909, 13957, 13958, 13959, + 13960, 17784, 17775, 17779, 13961, 13962, 12122, 13963, 13964, 13965, + 14060, 14061, 9216, 17787, 14062, 17782, 14063, 14064, 14065, 14066, 14067, + 14068, 14069, 17783, 14070, 14071, 14072, 14073, 14074, 14075, 14076, + 14077, 14078, 14079, 14080, 15301, 17786, 14081, 14082, 14083, 14084, + 14085, 14086, 14087, 17780, 14088, 14089, 14090, 17781, 14091, 15134, + 14092, 14093, 14094, 17785, 14042, 17790, 14095, 14096, 14097, 14098, + 14099, 14100, 17789, 14101, 17788, 14102, 14103, 14104, 14105, 14106, + 14107, 14108, 17792, 14109, 14110, 14111, 14112, 14113, 14114, 14115, + 11564, 14116, 14117, 14118, 14119, 14120, 9461, 12709, 14121, 14122, 17791, + 14123, 13041, 14124, 14125, 14126, 14127, 14128, 14129, 17793, 14130, + 14131, 14132, 14133, 14134, 14135, 14136, 14402, 14137, 14138, 14139, + 14140, 10365, 14141, 14142, 14143, 14144, 14145, 14146, 14147, 14148, + 14149, 14150, 14151, 14152, 14153, 14154, 14155, 14250, 14251, 15934, + 14252, 14253, 14254, 17794, 14255, 14256, 14257, 14258, 14259, 17796, + 14260, 14261, 14262, 14263, 14264, 14265, 14266, 14267, 14268, 14269, + 14270, 12827, 14271, 14272, 14273, 14274, 17798, 14275, 14276, 14277, + 14278, 14279, 14280, 14281, 14282, 14283, 14284, 14285, 14286, 14287, + 14288, 14289, 14290, 17795, 14291, 17797, 14292, 14293, 14294, 14295, + 14296, 14297, 14298, 14299, 14300, 14301, 14302, 14303, 14304, 14305, + 16081, 14306, 14307, 14308, 17799, 14309, 14310, 14311, 14312, 14313, + 14314, 14315, 14316, 14317, 14318, 14319, 14320, 14321, 14322, 14323, + 14324, 21579, 11117, 12463, 13031, 12484, 14325, 14326, 21580, 14327, + 14328, 14329, 14330, 14331, 15178, 14332, 14333, 14334, 15736, 14335, + 14336, 14337, 20264, 14338, 14339, 14340, 14341, 14342, 14343, 14344, + 14345, 9665, 21581, 14440, 21582, 14441, 14442, 13978, 14443, 14444, 14445, + 14446, 14447, 14448, 14449, 10996, 21584, 21586, 21585, 14223, 14941, + 21583, 13985, 15532, 12521, 14450, 14451, 14452, 14453, 14454, 14455, + 14456, 14760, 21589, 9111, 21588, 14457, 14458, 14459, 14460, 14461, 21595, + 14462, 9452, 14463, 14464, 14465, 14466, 14467, 14468, 15328, 21591, 14469, + 14470, 14471, 14472, 14473, 21593, 15938, 14474, 14475, 21592, 21587, + 21596, 21594, 14476, 21590, 14477, 14478, 21604, 21601, 21603, 14479, + 14480, 21607, 21599, 21597, 14481, 14482, 14483, 21602, 14484, 14485, + 14486, 14487, 14488, 16336, 14489, 14490, 14491, 21598, 14492, 13484, + 13838, 14493, 21605, 10773, 9991, 14494, 14495, 21600, 21606, 21613, 21619, + 14496, 14497, 11170, 14498, 14499, 14500, 21618, 14595, 14501, 16320, + 14502, 14503, 21615, 21617, 14504, 14505, 14506, 14507, 10627, 14508, + 14509, 14510, 14511, 21608, 14512, 14513, 14514, 21611, 12534, 14515, + 16116, 21609, 21610, 21612, 21616, 14516, 14517, 14518, 21622, 15703, + 14519, 14520, 14521, 14522, 10239, 14523, 14046, 14524, 10423, 21620, + 14525, 14526, 14527, 21621, 21623, 21626, 21624, 14528, 14529, 21625, + 14530, 14531, 14532, 14533, 15344, 21614, 14534, 14576, 14535, 14772, + 16254, 14630, 21632, 14631, 12694, 14632, 21629, 14633, 14634, 12080, + 21641, 21627, 14635, 21630, 14636, 14637, 14638, 21637, 14639, 14640, + 14641, 14642, 21631, 14643, 14644, 21636, 14645, 14646, 21635, 14647, + 14648, 21638, 14649, 14650, 14651, 21628, 14652, 14653, 21633, 21639, + 14654, 14655, 14656, 14657, 14658, 14659, 14660, 15687, 21634, 9490, 14661, + 14662, 21647, 14663, 15116, 14664, 14665, 14666, 14667, 21650, 14668, + 14669, 14670, 11155, 14671, 21654, 14672, 14673, 14674, 14675, 14676, + 14677, 21645, 14678, 14679, 21651, 21653, 21655, 14680, 14681, 14682, + 14683, 14684, 14685, 14686, 14687, 21648, 14688, 21646, 14689, 14690, + 14691, 11016, 14692, 10066, 14693, 14694, 14695, 14696, 21644, 21652, + 21642, 21643, 14697, 14698, 14699, 21640, 21761, 14700, 21758, 14701, + 14702, 21757, 14703, 14704, 21649, 14705, 13643, 14706, 14707, 14708, + 14709, 14710, 21656, 14711, 14712, 14713, 21760, 14714, 14715, 14716, + 14717, 14718, 14719, 14720, 12723, 14721, 14722, 14723, 14724, 14725, + 14820, 14821, 14822, 21658, 14823, 14824, 21762, 21764, 21759, 14825, + 21657, 14826, 14827, 14828, 21766, 14829, 21765, 14830, 14831, 14832, + 14833, 12506, 14834, 14835, 21769, 14836, 14837, 21771, 14838, 14839, + 14840, 14841, 14842, 21756, 14843, 14844, 14845, 21772, 21767, 14846, + 14847, 14848, 14849, 14850, 21770, 21659, 21768, 14851, 14852, 14853, + 14854, 14855, 14856, 14857, 21773, 14858, 14859, 14860, 14861, 21775, + 14862, 14863, 14864, 14865, 21763, 14866, 14867, 14868, 14869, 21774, + 14870, 14871, 14872, 21776, 14873, 14874, 14875, 14876, 14877, 14878, + 14879, 14880, 14881, 14882, 15128, 14883, 14884, 14885, 14886, 21779, + 14887, 14888, 14889, 14890, 16904, 14891, 14892, 14893, 14894, 14895, + 14896, 21780, 14897, 14898, 14899, 14900, 14901, 14902, 14903, 14904, + 21778, 14905, 13653, 21777, 14906, 14907, 14908, 14909, 21781, 14910, + 14911, 14912, 14913, 14914, 21782, 9817, 14915, 15010, 15011, 15012, 15013, + 15014, 15015, 15016, 15017, 15018, 15019, 15020, 15021, 15022, 15023, + 20840, 15024, 15025, 15026, 15027, 15028, 15029, 21783, 15030, 15031, + 21784, 15032, 15033, 15034, 15305, 15035, 15036, 15037, 21957, 15143, + 15038, 15039, 15040, 15041, 15042, 15043, 15153, 15355, 15044, 15045, + 15046, 15047, 15048, 15049, 14961, 15050, 15051, 11549, 15052, 15330, + 15053, 15054, 15055, 15056, 15057, 15058, 15059, 10991, 18408, 15519, + 21409, 9430, 15060, 15061, 9292, 21410, 15062, 13807, 9631, 15063, 16897, + 15064, 14160, 15065, 21411, 15066, 15067, 15068, 15069, 16297, 15070, + 15071, 15072, 15073, 15074, 21412, 21977, 21413, 15075, 15877, 21414, + 15076, 9057, 21978, 15077, 15078, 21979, 15079, 15080, 9877, 15081, 13074, + 15082, 15083, 15084, 15085, 14372, 15086, 15087, 15088, 15173, 15089, + 15090, 15091, 15092, 15093, 14599, 15094, 15095, 15096, 15097, 15098, + 21415, 15099, 16898, 15100, 15101, 15102, 15103, 15104, 15105, 9242, 15200, + 14929, 15201, 15202, 15203, 10549, 15204, 15205, 15206, 15207, 15208, + 21417, 15209, 15210, 15211, 15212, 21418, 15213, 15214, 15215, 15216, 9440, + 12304, 15217, 15218, 16451, 21416, 15219, 15220, 21419, 15221, 15222, + 15223, 15224, 21421, 15225, 15226, 15227, 16901, 15228, 15550, 15868, + 15229, 15230, 21980, 13610, 15231, 15232, 15233, 15234, 15235, 21981, + 15236, 15237, 21420, 21422, 11942, 21423, 15238, 15239, 21427, 15240, + 15241, 15242, 15243, 15244, 15245, 15246, 21429, 21424, 15247, 13824, + 13080, 15248, 15249, 15250, 12512, 10827, 15251, 15252, 21426, 15253, + 21428, 15254, 15255, 15256, 10786, 15257, 15258, 15259, 15260, 15261, + 15262, 15263, 21434, 15264, 15265, 15266, 15267, 15268, 10979, 15269, 9118, + 21432, 15270, 15271, 15272, 15273, 15274, 21431, 21425, 21433, 15275, + 15276, 15277, 15278, 15279, 21430, 15280, 15281, 15282, 13661, 15283, + 15284, 15285, 15286, 14577, 21436, 15287, 15288, 15289, 15290, 19124, + 15291, 15292, 15293, 21435, 15294, 21437, 15295, 15390, 15391, 15392, + 15393, 15394, 15395, 15396, 15397, 15398, 21438, 15399, 15400, 14984, + 15401, 15402, 15403, 15404, 15405, 15406, 15407, 15408, 15409, 15410, + 15411, 15412, 15413, 15414, 15415, 15416, 15417, 15418, 15419, 15420, + 15421, 15422, 15423, 15424, 15425, 21982, 11578, 15426, 15427, 15428, + 15429, 15430, 15431, 21439, 15432, 15433, 15434, 15435, 15436, 15437, + 15438, 15439, 15440, 15441, 15442, 15443, 15444, 15445, 15446, 15447, + 15448, 15449, 15450, 15451, 21440, 15452, 15453, 15454, 14812, 15455, + 15495, 15456, 21466, 15457, 15458, 10563, 15459, 15460, 15461, 15462, + 15463, 15464, 15465, 15466, 15467, 15468, 15469, 15470, 15471, 15472, + 15473, 15474, 15475, 15476, 15477, 15478, 15479, 15480, 15481, 15482, + 15483, 15484, 15485, 15580, 15581, 15582, 15583, 15584, 15585, 15586, + 15587, 15588, 15589, 15590, 15591, 15592, 15593, 15594, 15595, 15596, + 15597, 15598, 15599, 15600, 15601, 15602, 15603, 15604, 15605, 15606, + 15607, 15608, 15609, 15610, 11396, 10794, 15611, 10805, 12692, 14016, + 20117, 12097, 11770, 20118, 20119, 20120, 15612, 20121, 20122, 20123, + 20124, 11534, 15613, 15614, 15615, 22226, 15616, 15617, 15618, 22228, + 15619, 22229, 15620, 22227, 15621, 15622, 15623, 15624, 11561, 15625, + 22326, 9790, 15626, 15627, 15628, 15629, 22327, 15630, 15631, 15632, 22328, + 15633, 15634, 15635, 20443, 15636, 15637, 15638, 15639, 15640, 15641, + 15642, 15643, 15644, 15645, 15646, 15647, 15347, 15648, 15649, 15650, + 15651, 15652, 15653, 16889, 15654, 15655, 15656, 15657, 15658, 15659, + 15660, 15661, 15662, 15663, 15664, 15665, 15666, 15667, 15668, 15669, + 15670, 15671, 15672, 15673, 15674, 15675, 15770, 15771, 15772, 15773, + 15774, 15775, 15776, 15777, 15778, 15779, 15780, 15781, 15782, 15783, + 15784, 15785, 15786, 15787, 15788, 15789, 15790, 15791, 15792, 15793, + 15794, 15795, 15796, 15797, 15798, 15799, 15800, 15801, 22329, 15802, + 15803, 15804, 15805, 15806, 15807, 15808, 15809, 15810, 20831, 15811, + 15812, 15813, 15814, 15815, 15816, 15817, 15818, 15819, 15820, 15821, + 15822, 15823, 15824, 15825, 15826, 15827, 15828, 15829, 15830, 15831, + 15832, 15833, 15834, 15835, 15836, 15837, 15838, 15839, 15840, 15841, + 15842, 15843, 15844, 15845, 15846, 15847, 15848, 15849, 15850, 15851, + 15852, 15853, 15854, 15855, 15856, 15857, 15858, 16073, 15859, 15860, + 15861, 15862, 15863, 15864, 15865, 15960, 15961, 15962, 15963, 15964, + 15965, 15966, 15967, 15769, 14405, 15968, 15969, 15970, 15971, 15972, + 15973, 15974, 15975, 14001, 15976, 15977, 15978, 15979, 15980, 15981, + 15982, 15983, 15984, 15985, 15986, 15987, 15988, 15989, 15990, 15991, + 15992, 15993, 15994, 15995, 15996, 15997, 15998, 15999, 16000, 16001, + 16002, 16003, 16004, 16005, 16006, 16007, 16008, 16009, 16010, 16011, + 16012, 16013, 16014, 16015, 16016, 16017, 16018, 16019, 16020, 16021, + 16022, 16023, 16024, 16025, 16026, 16027, 16028, 16029, 16030, 16031, + 16032, 16033, 16034, 16035, 16036, 16037, 16038, 16039, 16040, 16041, + 16042, 16043, 16044, 16045, 16046, 16047, 16048, 16049, 16050, 16051, + 16052, 16053, 16054, 16055, 16150, 16151, 16152, 16153, 16154, 16155, + 16156, 16157, 16158, 16159, 16160, 16161, 16162, 16163, 16164, 16165, + 16166, 16167, 16168, 16169, 16170, 16171, 16172, 16173, 16174, 16175, + 16176, 16177, 16178, 16179, 16180, 16181, 16182, 16183, 16184, 19127, + 16185, 16186, 16187, 16188, 16189, 16190, 16191, 16192, 16193, 16194, + 16195, 16196, 16197, 16198, 16199, 16200, 16201, 16202, 16203, 16204, + 16205, 16206, 16207, 16208, 16209, 16210, 16211, 16212, 16213, 16214, + 22330, 16215, 16216, 16217, 16218, 16219, 16220, 16221, 16222, 16223, + 16224, 16225, 16226, 16227, 16228, 16229, 16230, 16231, 16232, 16233, + 16234, 16235, 16236, 16237, 16238, 16239, 16240, 16241, 16242, 16243, + 16244, 16245, 16340, 16341, 16342, 16343, 16344, 16345, 16346, 16347, + 16348, 16349, 16350, 16351, 16352, 16353, 16354, 16355, 16356, 16357, + 16358, 16359, 16360, 16361, 16362, 16363, 16364, 16365, 16366, 16367, + 16368, 16369, 16370, 16371, 11700, 16372, 16373, 16374, 16375, 16376, + 13214, 16377, 16378, 16379, 16380, 16381, 16382, 16383, 16384, 16385, + 16386, 16387, 16388, 16389, 16390, 16391, 16392, 16393, 16394, 16395, + 16396, 16397, 16398, 16399, 16400, 16401, 16402, 16403, 16404, 16405, + 16406, 16407, 16408, 16409, 16410, 16411, 16412, 16413, 16414, 16415, + 16416, 16417, 16418, 16419, 16420, 16421, 16422, 16423, 16424, 16425, + 16426, 16427, 17010, 11343, 10174, 10573, 13632, 11310, 17011, 17012, + 14399, 13620, 17013, 13298, 16428, 15316, 15558, 15317, 11344, 16429, + 11513, 11183, 17014, 17015, 15335, 17016, 15182, 10244, 12504, 16430, + 14202, 10432, 13847, 10390, 11772, 16249, 17017, 17018, 13237, 16506, + 13987, 16431, 16064, 14218, 16134, 17019, 16308, 9827, 17021, 17020, 16432, + 15560, 17022, 17023, 17024, 14017, 17025, 13976, 17026, 17027, 9642, 16324, + 17028, 11131, 9989, 17029, 17030, 10813, 15310, 15557, 17031, 10580, 14989, + 9484, 17032, 17033, 16433, 11570, 14785, 15754, 17034, 14808, 17035, 15728, + 11184, 17036, 14176, 14203, 17037, 13470, 16323, 17038, 13036, 10198, + 17039, 10399, 11921, 17040, 17041, 14168, 17042, 10062, 17043, 12289, + 16462, 17044, 14369, 16434, 15559, 12842, 17045, 10068, 11164, 17046, + 15124, 17047, 17048, 14754, 17049, 17050, 17051, 9492, 17054, 17052, 15367, + 17053, 12688, 17055, 16435, 17056, 17057, 17058, 15132, 15490, 9114, 17059, + 13406, 17060, 11582, 12636, 17061, 17062, 12728, 14368, 17063, 17064, + 12095, 13260, 17065, 17066, 13415, 17067, 17068, 10775, 16530, 16531, + 16532, 16533, 16534, 16535, 16536, 16537, 16538, 11192, 16539, 16540, + 16541, 16542, 10190, 22033, 16543, 22034, 16544, 16545, 14602, 16546, + 16547, 16548, 16549, 16550, 16551, 16552, 16553, 22160, 16554, 16555, + 16556, 16557, 20299, 16558, 16559, 16560, 16561, 16562, 16563, 14998, + 11146, 16564, 16565, 16566, 16567, 16568, 16569, 16570, 10957, 15870, + 16571, 16572, 16573, 16574, 16575, 16576, 16577, 18392, 16578, 16579, + 16580, 16581, 22219, 9225, 9487, 16582, 16583, 16584, 16585, 16586, 16587, + 16588, 22220, 16589, 16590, 22222, 16591, 16592, 16593, 10974, 22221, + 16594, 12653, 16595, 16596, 16597, 16598, 16599, 16600, 16601, 22224, + 16602, 16603, 16604, 22223, 16605, 16606, 16607, 16608, 16609, 16610, + 16611, 16612, 16613, 16614, 16615, 16616, 16617, 16618, 16619, 16620, + 16621, 16622, 16623, 16624, 16625, 16720, 16721, 16722, 16723, 16724, + 16725, 16726, 16727, 16728, 16729, 16730, 16731, 16732, 16733, 16734, + 16735, 16736, 16737, 16738, 16739, 16740, 16741, 16742, 16743, 16744, + 16745, 16746, 16747, 16748, 16749, 16750, 16751, 16752, 16753, 16754, + 16755, 16756, 16757, 16758, 16759, 16760, 16761, 16762, 16763, 16764, + 16765, 16766, 16767, 16768, 16769, 16770, 16771, 16772, 16773, 16774, + 16775, 16776, 16777, 16778, 16779, 16780, 16781, 16782, 16783, 16784, + 16785, 16786, 16787, 16788, 16789, 16790, 16791, 16792, 16793, 16794, + 16795, 16796, 16797, 16798, 16799, 16800, 16801, 16802, 16803, 16804, + 16805, 16806, 16807, 16808, 16809, 16810, 16811, 16812, 16813, 16814, + 16815, 16910, 16911, 16912, 16913, 16914, 16915, 16916, 16917, 16918, + 16919, 16920, 16921, 16922, 16923, 16924, 9235, 16129, 10571, 16925, 10752, + 9443, 15945, 14960, 9085, 16098, 11200, 16287, 10378, 14361, 13227, 9280, + 10761, 16337, 10800, 10356, 11395, 20103, 20104, 14434, 10818, 20105, 9876, + 12654, 10404, 10981, 20106, 15949, 20107, 11359, 11178, 20108, 12317, + 12469, 15928, 16477, 20109, 20110, 20113, 20111, 20112, 13837, 10564, + 10201, 20114, 14039, 13820, 9830, 16926, 16927, 18582, 13081, 20115, 12086, + 16928, 16459, 20116, 16447, 13677, 16676, 16670, 15927, 16929, 15954, + 13811, 15689, 10596, 9659, 16930, 13841, 22031, 16931, 16932, 16933, 10978, + 16934, 22032, 16935, 16936, 16498, 16937, 16938, 22026, 10561, 16107, + 10592, 13285, 16939, 16940, 16941, 16942, 16943, 16944, 16945, 16946, + 16947, 9630, 16948, 16949, 22027, 9607, 16950, 16951, 16952, 16953, 15894, + 13482, 16954, 16955, 16956, 16957, 16958, 22029, 16959, 16960, 22028, + 16961, 16962, 16963, 16964, 16965, 16966, 16967, 16968, 16969, 16970, + 14388, 16971, 16972, 16973, 13589, 16974, 16975, 16976, 16977, 16978, + 16979, 16980, 16981, 16982, 16983, 16984, 16985, 16986, 22030, 16987, + 16502, 13046, 22167, 16988, 16989, 22162, 16990, 22170, 16991, 22169, + 16992, 16271, 22168, 16993, 16994, 16995, 15895, 22171, 16996, 22179, + 16997, 16998, 16999, 17000, 9072, 10063, 17001, 22176, 22177, 17002, 13075, + 17003, 17004, 17005, 17100, 22172, 22173, 17101, 17102, 22174, 22178, + 17103, 11749, 22175, 10635, 17104, 17105, 17106, 22183, 22186, 17107, + 17108, 17109, 11946, 17110, 10817, 22163, 22180, 17111, 17112, 12468, + 17113, 17114, 17115, 14433, 17116, 11394, 17117, 22181, 22182, 22184, + 10234, 22185, 17118, 22188, 17119, 17120, 17121, 17122, 17123, 17124, + 17125, 22164, 17126, 17127, 17128, 22187, 15702, 17129, 9671, 17130, 17131, + 14349, 17132, 17133, 17134, 17135, 22189, 17136, 17137, 17138, 17139, + 17140, 17141, 17142, 17143, 22190, 11750, 22191, 17144, 17145, 14408, + 22194, 17146, 17147, 17148, 17149, 17150, 9445, 16492, 17151, 22192, 17152, + 22193, 22195, 17153, 22201, 17154, 17155, 17156, 22199, 17157, 17158, + 17159, 22198, 22196, 17160, 17161, 22200, 17162, 17163, 22197, 22203, + 22204, 17164, 14412, 17165, 17166, 19126, 9999, 22202, 22207, 14348, 17167, + 17168, 17169, 17170, 17171, 22205, 22206, 17172, 17173, 17174, 17175, + 17176, 17177, 22165, 17178, 17179, 17180, 17181, 17182, 17183, 17184, + 17185, 17186, 17187, 17188, 17189, 9251, 17190, 17191, 22166, 17192, 17193, + 10012, 9473, 17194, 22211, 22208, 17195, 10220, 17290, 22212, 17291, 22209, + 17292, 17293, 17294, 17295, 17296, 22210, 17297, 17298, 9843, 17299, 15939, + 17300, 17301, 17302, 22213, 17303, 9684, 17304, 17305, 17306, 17307, 17308, + 17309, 17310, 22214, 22216, 17311, 17312, 17313, 22215, 17314, 17315, + 17316, 17317, 17318, 17319, 17320, 22217, 17321, 22218, 17322, 17323, + 17324, 17325, 17326, 17327, 17328, 17329, 17330, 17331, 17332, 17333, + 13852, 10745, 17334, 17335, 13486, 17336, 17337, 10232, 17338, 17339, + 17340, 17341, 17342, 17343, 17344, 14386, 17345, 17346, 17347, 17348, + 17349, 17350, 17351, 17352, 17353, 17354, 17355, 17356, 17357, 17358, + 17359, 17360, 17361, 17362, 17363, 20051, 17364, 17365, 17366, 17367, + 17368, 17369, 17370, 17371, 17372, 17373, 17374, 17375, 17376, 17377, + 17378, 17379, 17380, 17381, 17382, 17383, 17384, 17385, 17480, 17481, + 17482, 17483, 17484, 17485, 17486, 17487, 17488, 17489, 17490, 17491, + 17492, 17493, 17494, 17495, 17496, 17497, 17498, 17499, 17500, 17501, + 17502, 17503, 17504, 17505, 17506, 17507, 17508, 17509, 17510, 17511, + 17512, 17513, 17514, 17515, 17516, 17517, 17518, 17519, 17520, 17521, + 17522, 17523, 17524, 17525, 17526, 17527, 17528, 17529, 17530, 17531, + 17532, 17533, 17534, 17535, 17536, 17537, 17538, 17539, 17540, 17541, + 17542, 17543, 17544, 17545, 17546, 17547, 17548, 17549, 17550, 17551, + 17552, 17553, 17554, 17555, 17556, 17557, 17558, 17559, 17560, 17561, + 17562, 17563, 17564, 17565, 17566, 17567, 17568, 17569, 17570, 17571, + 17572, 17573, 17574, 17575, 17670, 17671, 17672, 17673, 17674, 17675, + 17676, 17677, 17678, 17679, 17680, 17681, 17682, 17683, 17684, 17685, + 17686, 17687, 17688, 17689, 17690, 17691, 17692, 17693, 17694, 17695, + 17696, 17697, 17698, 17699, 17700, 17701, 17702, 9616, 15959, 10811, 15194, + 17703, 19932, 16445, 19933, 12499, 13662, 10993, 19934, 19935, 19936, + 16310, 19937, 19938, 19940, 19939, 19941, 19942, 13460, 19943, 15921, + 19944, 11541, 17704, 19945, 19946, 11542, 19947, 10553, 12285, 19948, 9233, + 11167, 10820, 19949, 17705, 20046, 20047, 20048, 10443, 11318, 17706, + 14033, 18191, 15880, 14944, 16078, 20049, 16117, 20050, 15138, 10763, + 17707, 9824, 9272, 17708, 17709, 17710, 12082, 17711, 17712, 17713, 17714, + 9285, 9286, 17715, 9287, 17716, 17717, 17718, 17719, 9624, 13657, 17720, + 17721, 17722, 17723, 19128, 17724, 17725, 9278, 17726, 17727, 17728, 12296, + 9864, 17729, 17730, 13403, 15731, 17731, 13294, 15319, 17732, 10828, 12530, + 17733, 17734, 17735, 17736, 17737, 15688, 17738, 15908, 11587, 17739, + 19129, 10376, 19130, 17740, 17741, 11140, 16121, 17742, 11583, 15887, + 14730, 12267, 9652, 17743, 17744, 14431, 17745, 19133, 19131, 19135, 17746, + 19137, 19134, 10022, 13245, 17747, 10067, 19132, 17748, 14051, 17749, + 17750, 19136, 17751, 17752, 17753, 12687, 9252, 11308, 17754, 17755, 17756, + 16458, 17757, 17758, 14578, 14200, 14007, 14396, 19139, 19138, 12895, + 17759, 17760, 15296, 15318, 19140, 17761, 19143, 17762, 14559, 16325, + 19142, 10036, 17763, 14565, 17764, 19144, 10191, 17765, 17860, 14543, + 10803, 17861, 14002, 9644, 14212, 15941, 19145, 10429, 17862, 17863, 17864, + 19141, 17865, 17866, 17867, 17868, 17869, 17870, 19148, 9879, 19149, 17871, + 17872, 17873, 17874, 17875, 19146, 19147, 17876, 15546, 17877, 17878, + 12508, 9253, 17879, 15741, 17880, 17881, 10226, 14231, 17882, 19150, 17883, + 17884, 15761, 17885, 17886, 17887, 17888, 17889, 9288, 17890, 10249, 19153, + 19151, 19152, 10007, 17891, 17892, 17893, 15522, 19155, 17894, 17895, + 19157, 17896, 17897, 17898, 17899, 17900, 17901, 19156, 13413, 17902, + 15488, 17903, 17904, 19154, 17905, 17906, 17907, 17908, 15931, 16113, + 17909, 17910, 17911, 17912, 17913, 19159, 16516, 17914, 17915, 17916, + 17917, 17918, 17919, 17920, 19160, 17921, 9275, 15386, 17922, 19161, 19163, + 17923, 17924, 17925, 17926, 19162, 17927, 17928, 19164, 17929, 17930, + 17931, 17932, 17933, 15541, 17934, 10018, 17935, 19538, 17936, 17090, + 17937, 17093, 17938, 17091, 17939, 17092, 17940, 17941, 17942, 17095, + 15152, 12864, 17943, 17944, 9103, 17945, 17946, 17947, 15121, 17948, 17094, + 17949, 15717, 10935, 17197, 13476, 17950, 17097, 17096, 13834, 17098, + 17951, 17196, 16497, 17099, 12313, 17952, 17953, 17200, 17954, 17955, + 15759, 18050, 18051, 17202, 17199, 18052, 17203, 18053, 18054, 11523, + 18055, 18056, 18057, 12106, 17198, 17201, 16248, 18058, 17204, 18059, + 18060, 18061, 17208, 18062, 18063, 18064, 17209, 17207, 10959, 18065, + 18066, 18067, 11879, 17206, 18068, 18069, 18070, 17205, 15904, 9436, 18071, + 18072, 17210, 18073, 10824, 18074, 17211, 18075, 18076, 18077, 18078, 9622, + 18079, 18080, 18081, 9981, 18082, 18083, 18084, 18085, 10193, 17212, 18086, + 18087, 18088, 10250, 18089, 17213, 18090, 18091, 18092, 18093, 18094, + 18095, 18096, 18097, 18098, 18099, 18100, 18101, 18102, 18103, 18104, + 18105, 18106, 18107, 18108, 18109, 9256, 18110, 18111, 18112, 18113, 17215, + 18114, 18115, 18116, 17214, 17216, 18117, 18118, 18119, 18120, 18121, + 18122, 18123, 18124, 18125, 18126, 18127, 17218, 18128, 17217, 18129, + 18130, 18131, 18132, 18133, 18134, 18135, 17219, 18136, 18137, 18138, + 18139, 18140, 18141, 18142, 18143, 18144, 17220, 18145, 18240, 17221, + 18241, 18242, 15722, 22035, 13480, 16470, 13083, 22037, 22038, 22036, + 18243, 11723, 18244, 18245, 18246, 18247, 15184, 18248, 18249, 10406, + 18250, 18251, 15910, 14355, 18252, 18253, 22137, 22136, 10933, 22039, + 14209, 18254, 18255, 18256, 22139, 12115, 18257, 9669, 18258, 14545, 22140, + 22138, 11515, 22143, 18259, 22144, 11540, 12659, 11940, 14220, 22145, + 18260, 18261, 18262, 22141, 22142, 12905, 18263, 18264, 18265, 18266, + 18267, 22147, 18268, 9813, 18269, 16512, 18270, 9840, 22146, 22149, 18271, + 18272, 22148, 22150, 15154, 18273, 18274, 18275, 18276, 18277, 18278, + 18279, 12684, 13594, 18280, 18281, 18282, 18283, 18284, 18285, 22151, + 22152, 18286, 18287, 18288, 18289, 18290, 18291, 22153, 18292, 18293, + 22154, 22155, 22156, 18294, 18295, 18296, 18297, 22158, 22157, 18298, + 18299, 18300, 18301, 22159, 18302, 18303, 18304, 18305, 18306, 18307, + 18308, 18309, 18310, 18311, 18312, 18313, 9446, 18314, 15727, 14010, 18315, + 12144, 16301, 15501, 12286, 18316, 11575, 18317, 18318, 18319, 18320, + 18321, 18322, 18323, 18324, 18325, 18326, 10555, 18327, 18328, 18329, + 18330, 18331, 18332, 18333, 18334, 18335, 18430, 18431, 18432, 18433, + 18434, 18435, 18436, 18437, 18438, 18439, 18440, 18441, 18442, 18443, + 18444, 18445, 18446, 18447, 18448, 18449, 18450, 18451, 18452, 18453, + 18454, 18455, 18456, 18457, 18458, 18459, 18460, 18461, 18462, 18463, + 18464, 18465, 18466, 18467, 18468, 18469, 18470, 18471, 18472, 18473, + 18474, 18475, 18476, 18477, 18478, 18479, 18480, 18481, 18482, 18483, + 18484, 18485, 18486, 18487, 18488, 18489, 18490, 18491, 18492, 18493, + 18494, 18495, 18496, 18497, 18498, 18499, 18500, 18501, 18502, 18503, + 18504, 18505, 18506, 18507, 18508, 18509, 18510, 18511, 18512, 18513, + 18514, 18515, 18516, 18517, 18518, 18519, 18520, 18521, 18522, 18523, + 18524, 18525, 18620, 18621, 18622, 18623, 18624, 18625, 18626, 18627, + 18628, 18629, 18630, 18631, 18632, 18633, 18634, 18635, 18636, 18637, + 18638, 18639, 18640, 18641, 18642, 18643, 18644, 18645, 18646, 18647, + 18648, 18649, 18650, 18651, 18652, 18653, 18654, 18655, 18656, 18657, + 18658, 18659, 18660, 18661, 18662, 18663, 18664, 18665, 11393, 18666, + 18667, 18668, 18669, 18670, 18671, 18672, 18673, 18674, 18675, 18676, + 18677, 18678, 18679, 18680, 18681, 18682, 18683, 18684, 18685, 18686, + 18687, 18688, 18689, 18690, 22363, 18691, 18692, 18693, 18694, 18695, + 18696, 18697, 18698, 18699, 18700, 18701, 18702, 18703, 18704, 18705, + 18706, 18707, 18708, 18709, 18710, 18711, 18712, 18713, 18714, 18715, + 18810, 18811, 18812, 18813, 18814, 18815, 22364, 18816, 18817, 18818, + 18819, 18820, 18821, 18822, 18823, 18824, 18825, 18826, 18827, 18828, + 18829, 18830, 18831, 18832, 18833, 18834, 18835, 18836, 18837, 18838, + 18839, 18840, 22365, 18841, 18842, 18843, 18844, 18845, 18846, 18847, + 18848, 18849, 18850, 18851, 18852, 18853, 18854, 18855, 18856, 18857, + 18858, 18859, 18860, 18861, 18862, 18863, 18864, 18865, 18866, 18867, + 18868, 18869, 18870, 18871, 18872, 18873, 18874, 18875, 18876, 18877, + 18878, 18879, 18880, 18881, 18882, 18883, 18884, 18885, 18886, 18887, + 18888, 18889, 18890, 18891, 18892, 18893, 18894, 18895, 18896, 18897, + 18898, 18899, 18900, 18901, 18902, 18903, 18904, 18905, 19000, 19001, + 19002, 19003, 19004, 19005, 19006, 19007, 19008, 19009, 19010, 19011, + 19012, 19013, 19014, 19015, 19016, 19017, 19018, 19019, 19020, 19021, + 19022, 19023, 19024, 19025, 19026, 19027, 19028, 19029, 19030, 19031, + 19032, 19033, 19034, 19035, 19036, 19037, 19038, 19039, 19040, 19041, + 19042, 19043, 19044, 19045, 19046, 19047, 19048, 19049, 19050, 19051, + 22366, 19052, 19053, 19054, 19055, 19056, 19057, 19058, 19059, 19060, + 19061, 19062, 19063, 19064, 19065, 19066, 19067, 19068, 19069, 19070, + 19071, 19072, 19073, 19074, 19075, 19076, 19077, 19078, 19079, 19080, + 19081, 19082, 19083, 19084, 19085, 19086, 19087, 19088, 19089, 19090, + 19091, 19092, 19093, 19094, 22367, 19095, 19190, 19191, 19192, 19193, + 19194, 19195, 19196, 19197, 19198, 19199, 19200, 19201, 19202, 19203, + 19204, 19205, 19206, 19207, 19208, 19209, 19210, 19211, 19212, 19213, + 19214, 19215, 19216, 19217, 19218, 19219, 19220, 19221, 19222, 19223, + 19224, 22369, 19225, 19226, 19227, 19228, 19229, 19230, 19231, 19232, + 19233, 19234, 19235, 19236, 19237, 19238, 19239, 19240, 19241, 19242, + 19243, 19244, 19245, 19246, 19247, 19248, 19249, 19250, 19251, 19252, + 19253, 19254, 19255, 19256, 19257, 19258, 19259, 19260, 19261, 19262, + 19263, 19264, 19265, 19266, 19267, 19268, 19269, 19270, 19271, 19272, + 19273, 19274, 19275, 19276, 19277, 19278, 19279, 19280, 19281, 19282, + 22368, 19283, 19284, 19285, 19380, 19381, 19382, 19383, 19384, 19385, + 19386, 19387, 22588, 19388, 19389, 19390, 19391, 19392, 19393, 19394, + 19395, 19396, 19397, 19398, 19399, 19400, 19401, 19402, 19403, 19404, + 19405, 19406, 19407, 19408, 19409, 19410, 19411, 19412, 19413, 19414, + 19415, 19416, 19417, 19418, 19419, 19420, 19421, 19422, 19423, 19424, + 19425, 19426, 19427, 19428, 19429, 19430, 19431, 19432, 19433, 19434, + 19435, 19436, 19437, 19438, 19439, 19440, 19441, 19442, 19443, 19444, + 19445, 19446, 19447, 19448, 19449, 19450, 19451, 19452, 19453, 19454, + 19455, 19456, 19457, 19458, 19459, 19460, 19461, 19462, 19463, 19464, + 19465, 19466, 19467, 19468, 19469, 19470, 19471, 19472, 19473, 19474, + 19475, 19570, 19571, 19572, 19573, 19574, 19575, 19576, 19577, 19578, + 19579, 19580, 19581, 19582, 19583, 19584, 22370, 19585, 19586, 19587, + 19588, 19589, 19590, 19591, 19592, 19593, 19594, 19595, 19596, 19597, + 19598, 19599, 19600, 19601, 19602, 19603, 19604, 19605, 19606, 19607, + 19608, 19609, 19610, 19611, 19612, 19613, 19614, 19615, 19616, 19617, + 19618, 19619, 19620, 19621, 19622, 19623, 19624, 19625, 19626, 19627, + 19628, 22371, 19629, 19630, 19631, 19632, 19633, 19634, 19635, 19636, + 19637, 19638, 19639, 19640, 19641, 19642, 19643, 19644, 19645, 19646, + 19647, 19648, 19649, 19650, 19651, 19652, 19653, 20841, 20842, 20843, + 16130, 10169, 20845, 20844, 20846, 20847, 13400, 20848, 20849, 19654, + 10371, 10061, 20850, 20852, 19655, 20851, 19656, 10583, 20853, 20854, + 20855, 10224, 9609, 16296, 12863, 9236, 10599, 20856, 20857, 15896, 13448, + 11776, 14782, 10754, 20859, 20858, 20861, 20860, 13020, 20862, 20863, + 13409, 20864, 13410, 20865, 9412, 20866, 20867, 20868, 20869, 20870, 16509, + 20871, 20872, 11361, 20873, 15718, 14435, 9417, 12324, 20874, 13401, 12648, + 19657, 20875, 20876, 20877, 20878, 20879, 20880, 20881, 19658, 20882, + 20883, 20884, 19659, 19660, 20885, 20886, 20887, 20889, 20888, 19661, + 20890, 14548, 12478, 20891, 20892, 20893, 16056, 20894, 14934, 20895, + 20896, 19662, 20897, 20898, 20996, 20899, 20997, 10630, 12725, 20998, + 20999, 11529, 15516, 9494, 21000, 21001, 21002, 15573, 21003, 16338, 21004, + 13249, 19663, 21005, 21006, 12275, 21007, 15005, 14243, 21009, 21008, 9685, + 10823, 21010, 21011, 15171, 21012, 21013, 10425, 15136, 21014, 21015, + 21016, 13666, 14409, 21017, 21018, 21019, 21020, 21021, 16119, 21022, 9862, + 12645, 21023, 19664, 21024, 21025, 21026, 19665, 14818, 21027, 12509, 9809, + 16457, 11580, 19760, 14954, 21030, 21028, 21029, 21031, 10172, 11397, + 11751, 12679, 21032, 21033, 19761, 21034, 21042, 21035, 21036, 21037, + 13429, 21076, 10210, 21038, 19762, 21039, 21040, 10203, 12665, 21041, + 19763, 21043, 21044, 21045, 16137, 19764, 21046, 12912, 19765, 21047, + 12913, 21048, 21049, 10613, 9112, 21050, 21051, 21052, 19766, 21053, 21054, + 21055, 21056, 19767, 21057, 11706, 21060, 21058, 21059, 19768, 21061, + 21062, 12300, 21063, 21064, 21065, 21066, 21067, 21068, 21069, 21070, + 21071, 12121, 19769, 21072, 12268, 21073, 21074, 21075, 19770, 19771, + 14981, 19772, 19773, 19774, 19775, 19776, 19777, 19778, 19779, 9599, 19780, + 19781, 19782, 19783, 19784, 19785, 19786, 19787, 19788, 19789, 19790, + 19791, 19792, 19793, 19794, 19795, 19796, 19797, 19798, 19799, 19800, + 19801, 19802, 19803, 19804, 19805, 19806, 19807, 19808, 19809, 19810, + 19811, 19812, 19813, 19814, 19815, 19816, 19817, 19818, 19819, 19820, + 19821, 19822, 19823, 19824, 19825, 19826, 19827, 19828, 19829, 19830, + 19831, 19832, 19833, 19834, 19835, 19836, 19837, 19838, 19839, 19840, + 19841, 19842, 19843, 19844, 19845, 19846, 19847, 19848, 19849, 19850, + 19851, 19852, 19853, 19854, 19855, 19950, 19951, 19952, 19953, 19954, + 19955, 19956, 19957, 19958, 19959, 19960, 19961, 19962, 19963, 19964, + 19965, 19966, 19967, 19968, 19969, 19970, 19971, 19972, 19973, 19974, + 19975, 19976, 19977, 12672, 18752, 13808, 18753, 19978, 9268, 14767, 9804, + 13667, 18754, 14963, 18755, 11373, 18756, 18757, 12673, 16057, 12879, + 10810, 14762, 18758, 12721, 18759, 19979, 10362, 10628, 10975, 18760, + 18761, 15901, 18762, 19980, 18763, 15338, 18764, 18765, 18766, 18767, + 15349, 18768, 9496, 12092, 18769, 19981, 12076, 18770, 18771, 18772, 19982, + 18773, 18774, 19983, 10568, 17071, 19984, 10216, 19985, 17073, 17072, + 19986, 19987, 19988, 19989, 19990, 19991, 19992, 17075, 19993, 19994, + 19995, 13663, 19996, 19997, 17074, 10387, 15379, 15570, 16138, 11550, + 19998, 19999, 20000, 20001, 16507, 17077, 17076, 20002, 9027, 14586, 20003, + 17078, 20004, 10574, 11347, 12474, 12449, 9629, 17079, 20005, 12455, 12841, + 11516, 20006, 20007, 14977, 20008, 20009, 20010, 17080, 13809, 20011, + 20012, 20013, 20014, 20015, 9276, 20016, 20017, 20018, 17081, 20019, 10189, + 15891, 20020, 9688, 20021, 20022, 17082, 15906, 14968, 13082, 20023, 17083, + 20024, 20025, 20026, 20027, 20028, 17084, 20029, 17085, 12329, 14398, + 14976, 20030, 20031, 20032, 20033, 20034, 20035, 20036, 20037, 20038, + 20039, 20040, 20041, 20042, 15746, 12446, 20043, 17086, 20044, 20045, + 14224, 20140, 17087, 20141, 14225, 15579, 20142, 20143, 20144, 10629, + 20145, 20146, 17088, 9040, 14937, 20147, 20148, 16102, 20149, 20150, 20151, + 20152, 20153, 20154, 20155, 20156, 20157, 20158, 14232, 20159, 20160, + 20161, 20162, 20163, 20164, 20165, 20166, 17089, 20167, 20168, 18751, + 20169, 20170, 12260, 20171, 20172, 22356, 20173, 20174, 22357, 22358, + 12874, 20175, 13609, 15362, 20176, 20177, 15164, 15332, 11320, 10780, + 20178, 21079, 20179, 20180, 9823, 15701, 22359, 9686, 20181, 20182, 22360, + 20183, 20184, 10056, 20185, 20186, 20187, 20188, 20189, 20190, 20191, + 20192, 20193, 20194, 22362, 20195, 20196, 20197, 20198, 20199, 20200, + 20201, 15749, 22332, 15304, 20202, 20203, 20204, 20205, 22334, 20206, + 20207, 20208, 22333, 20209, 20210, 12322, 12120, 20211, 9217, 20212, 20213, + 20214, 20215, 14802, 20216, 15177, 22336, 20217, 20218, 15001, 20219, + 22335, 16135, 22337, 12660, 20220, 20221, 20222, 11199, 22339, 22338, + 20223, 20224, 20225, 12887, 20226, 20227, 12311, 20228, 20229, 20230, + 20231, 20232, 14165, 20233, 14943, 20234, 20235, 20330, 20331, 20332, + 20333, 20334, 20335, 20336, 20337, 20338, 22340, 20339, 20340, 22341, + 20341, 20342, 22342, 20343, 12467, 20344, 20345, 20346, 20347, 20348, 9077, + 13104, 20349, 20350, 20351, 20352, 22343, 20353, 20354, 20355, 20356, + 20357, 20358, 20359, 20360, 20361, 20362, 20363, 20364, 20365, 20366, + 20367, 20368, 20369, 20370, 20371, 13459, 22331, 20372, 20373, 11709, + 20374, 20375, 11703, 20376, 10044, 20377, 20378, 10394, 20379, 11906, + 12685, 12705, 20380, 20381, 16669, 20382, 20383, 20384, 10624, 20385, + 20386, 20387, 20388, 20389, 20390, 20391, 20392, 20393, 11584, 15300, + 20394, 9073, 20395, 20396, 20397, 20398, 20399, 22531, 20400, 20401, 20402, + 20403, 20404, 20405, 20406, 20407, 22532, 20408, 20409, 20410, 20411, + 20412, 15117, 20413, 9041, 20414, 20415, 20416, 22533, 22534, 20417, 22535, + 20418, 20419, 20420, 13437, 20421, 20422, 20423, 20424, 20425, 20520, + 20521, 11732, 20522, 20523, 22538, 20524, 20525, 20526, 20527, 20528, + 20529, 20530, 22537, 20531, 9277, 20532, 22536, 20533, 20534, 22539, 20535, + 22540, 20536, 20537, 20538, 20539, 20540, 20541, 20542, 20543, 20544, + 20545, 20546, 20547, 20548, 20549, 20550, 20551, 20552, 20553, 20554, + 20555, 20556, 20557, 20558, 20559, 20560, 20561, 20562, 20563, 20564, + 20565, 20566, 20567, 20568, 20569, 20570, 20571, 20572, 20573, 20574, + 20575, 20576, 20577, 20578, 20579, 20580, 20581, 20582, 20583, 20584, + 14729, 13630, 20585, 10936, 19689, 19690, 19691, 11719, 20586, 20587, + 20588, 20589, 20590, 15569, 20591, 15912, 13831, 20592, 20593, 20594, + 20595, 20596, 20597, 20598, 20599, 20600, 20601, 20602, 20603, 20604, + 20605, 20606, 20607, 20608, 20609, 20610, 20611, 20612, 20613, 20614, + 20615, 20710, 20711, 20712, 20713, 20714, 20715, 20716, 20717, 20718, + 20719, 20720, 20721, 20722, 20723, 20724, 20725, 20726, 20727, 20728, + 20729, 20730, 20731, 20732, 20733, 20734, 20735, 20736, 20737, 20738, + 20739, 20740, 20741, 20742, 20743, 20744, 20745, 20746, 20747, 20748, + 20749, 20750, 20751, 20752, 20753, 20754, 20755, 20756, 20757, 20758, + 20759, 20760, 20761, 20762, 20763, 20764, 20765, 20766, 20767, 20768, + 20769, 20770, 20771, 20772, 20773, 20774, 20775, 20776, 20777, 20778, + 20779, 20780, 20781, 20782, 20783, 20784, 20785, 20786, 20787, 20788, + 20789, 20790, 20791, 20792, 20793, 20794, 20795, 20796, 20797, 20798, + 20799, 20800, 20801, 20802, 20803, 20804, 20805, 20900, 20901, 20902, + 20903, 20904, 20905, 15504, 10170, 13469, 21467, 14993, 14174, 15180, + 19554, 14606, 10778, 10222, 21468, 9093, 14199, 21469, 15869, 12458, 12331, + 13241, 11702, 21566, 11358, 20906, 21567, 21568, 20907, 21569, 15520, + 13226, 20908, 14574, 21570, 20909, 15692, 11912, 14411, 20910, 21571, + 21572, 15348, 10243, 21573, 21574, 10038, 21575, 21576, 20911, 9497, 21577, + 21578, 13592, 20912, 20913, 20914, 20915, 20916, 20917, 20918, 20919, + 20920, 20921, 20922, 20923, 20924, 20925, 20926, 20927, 20928, 20929, + 20930, 20931, 20932, 20933, 20934, 20935, 20936, 20937, 20938, 20939, + 20940, 20941, 20942, 20943, 20944, 20945, 20946, 20947, 20948, 20949, + 10426, 20950, 20951, 20434, 20435, 20436, 20952, 20437, 20953, 20954, + 13219, 20438, 20439, 20955, 20956, 20957, 10396, 13984, 20958, 20959, + 20960, 20961, 20962, 20963, 20964, 18549, 22562, 20965, 20966, 20967, + 20968, 20969, 20970, 20971, 20972, 20973, 20974, 20975, 20976, 20977, + 20978, 20979, 20980, 20981, 20982, 20983, 20984, 20985, 20986, 20987, + 20988, 20989, 20990, 20991, 20992, 20993, 20994, 20995, 21090, 21091, + 21092, 21093, 21094, 22563, 21095, 21096, 9450, 21097, 21098, 21099, 21100, + 21101, 21102, 21103, 21104, 21105, 21106, 21107, 21108, 21109, 21110, + 21111, 21112, 21113, 21114, 21115, 21116, 21117, 21118, 21119, 21120, + 21121, 21122, 21123, 21124, 21125, 22564, 21126, 21127, 21128, 21129, + 21130, 21131, 21132, 21133, 21134, 21135, 21136, 21137, 21138, 21139, + 21140, 21141, 21142, 21143, 21144, 21145, 21146, 21147, 21148, 21149, + 21150, 21151, 21152, 21153, 21154, 21155, 21156, 21157, 21158, 21159, + 21160, 21161, 21162, 22566, 22565, 21163, 21164, 21165, 21166, 21167, + 21168, 21169, 21170, 21171, 21172, 21173, 21174, 21175, 18552, 21176, + 11307, 21177, 18553, 18554, 18555, 18556, 18557, 18558, 10380, 15576, + 11499, 14011, 9220, 14194, 21178, 18559, 10257, 13621, 18560, 21179, 21180, + 11535, 21181, 9308, 18561, 21182, 10251, 18562, 12882, 21183, 21184, 18563, + 14973, 10796, 18564, 12066, 21185, 18565, 9491, 21280, 18566, 21281, 12338, + 18567, 18568, 12533, 18569, 18570, 18571, 14020, 16649, 16884, 14982, + 21282, 21283, 21284, 21285, 21286, 21287, 21288, 21289, 21290, 21291, + 21292, 21190, 21293, 21294, 17401, 21295, 21296, 21297, 21298, 21299, + 21300, 21301, 21302, 21303, 21304, 21305, 21306, 21307, 21308, 21309, + 21310, 21311, 21312, 21313, 21314, 21315, 21316, 21317, 21318, 21319, + 21320, 21321, 21322, 21323, 21324, 21325, 21326, 21327, 21328, 21329, + 21330, 21331, 21332, 21333, 21334, 21335, 21336, 21337, 21338, 21339, + 21340, 21341, 21342, 21343, 21344, 21345, 21346, 21347, 21348, 21349, + 21350, 21351, 21352, 21353, 21354, 21355, 21356, 21357, 21358, 21359, + 21360, 21361, 21362, 21363, 21364, 21365, 21366, 21367, 21368, 21369, + 21370, 21371, 21372, 21373, 21374, 21375, 21470, 21471, 21472, 21473, + 21474, 21475, 21476, 21477, 21478, 21479, 21480, 21481, 21482, 21483, + 21484, 21485, 21486, 21487, 21488, 21489, 21490, 21491, 21492, 21493, + 21494, 21495, 21496, 21497, 21498, 21499, 21500, 21501, 21502, 21503, + 21504, 21505, 21506, 21507, 21508, 21509, 21510, 21511, 21512, 21513, + 21514, 21515, 21516, 21517, 21518, 21519, 21520, 21521, 21522, 21523, + 21524, 21525, 21526, 21527, 21528, 21529, 21530, 21531, 21532, 21533, + 21534, 21535, 21536, 21537, 21538, 21539, 21540, 21541, 21542, 21543, + 21544, 21545, 21546, 21547, 21548, 21549, 21550, 21551, 21552, 21553, + 21554, 21555, 21556, 21557, 21558, 21559, 21560, 21561, 21562, 21563, + 21564, 21565, 21660, 21661, 21662, 21663, 21664, 21665, 21666, 21667, + 21668, 21669, 21670, 21671, 21672, 21673, 21674, 21675, 21676, 21677, + 12522, 15871, 14587, 15312, 9654, 13488, 21678, 9426, 12476, 19349, 13992, + 19350, 19351, 11737, 19352, 16439, 14588, 19354, 11366, 19353, 19355, + 19356, 12523, 21679, 11525, 19357, 12515, 10932, 19358, 21680, 19359, 9645, + 15368, 21681, 21682, 11880, 19360, 13284, 19361, 19362, 21683, 21684, + 19363, 13218, 19364, 21685, 13782, 19365, 19366, 19367, 19120, 19368, + 19369, 12511, 19370, 19371, 16317, 19372, 21686, 19373, 10774, 21687, + 21688, 21689, 21690, 21691, 21692, 21693, 22542, 22541, 21694, 21695, + 21696, 21697, 22545, 22543, 10926, 21698, 22546, 21699, 22547, 21700, + 21701, 21702, 22549, 22548, 22551, 21703, 21704, 22550, 21705, 21706, + 21707, 21708, 21709, 22552, 22553, 21710, 21711, 21712, 21713, 22554, + 21714, 14227, 21715, 21716, 21717, 21718, 10608, 21719, 21720, 21721, + 21722, 21723, 21724, 22567, 21725, 22568, 21726, 21727, 21728, 21729, + 22569, 21730, 21731, 21732, 21733, 22571, 21734, 22573, 21735, 22570, + 21736, 21737, 21738, 21739, 21740, 21741, 21742, 21743, 21744, 22574, + 21745, 22572, 21746, 21747, 21748, 21749, 21750, 21751, 21752, 16490, + 21753, 21754, 21755, 21850, 22575, 21851, 21852, 21853, 21854, 21855, + 21856, 22576, 21857, 21858, 21859, 22577, 21860, 21861, 21862, 21863, + 21864, 21865, 21866, 21867, 21868, 21869, 21870, 22578, 21871, 21872, + 21873, 22579, 21874, 21875, 21876, 21877, 21878, 21879, 21880, 21881, + 21882, 21883, 21884, 17238, 21885, 21886, 16635, 21887, 21888, 21889, + 21890, 21891, 21892, 21893, 21894, 19182, 10812, 21895, 21896, 21897, + 21898, 11968, 11189, 22556, 13244, 22555, 21899, 22557, 22559, 22558, + 21900, 21901, 21902, 22560, 21903, 14751, 21904, 22561, 21905, 21906, + 12832, 21907, 21908, 21909, 21910, 21911, 21912, 21913, 21914, 21915, + 21916, 21917, 21918, 21919, 21920, 21921, 21922, 21923, 21924, 21925, + 21926, 21927, 21928, 21929, 21930, 21931, 21932, 21933, 21934, 21935, + 21936, 21937, 21938, 21939, 21940, 21941, 21942, 21943, 21944, 21945, + 22040, 22041, 22042, 22043, 22044, 22045, 22046, 22047, 22048, 22049, + 22050, 22051, 22052, 22053, 22054, 22055, 22056, 22057, 22058, 22059, + 22060, 22061, 22062, 22063, 22064, 22065, 22066, 22067, 22068, 22069, + 22070, 22071, 22072, 22073, 22074, 22075, 22076, 22077, 22078, 22079, + 22080, 22081, 22082, 22083, 22084, 22085, 22086, 22087, 22088, 22089, + 22090, 22091, 22092, 22093, 22094, 22095, 22096, 22097, 22098, 22099, + 22100, 22101, 22102, 22103, 22104, 22105, 22106, 22107, 22108, 22109, + 22110, 22111, 22112, 22113, 22114, 22115, 22116, 22117, 22118, 22119, + 22120, 22121, 22122, 22123, 22124, 22125, 22126, 22127, 22128, 22129, + 22130, 22131, 22132, 22133, 22134, 22135, 22230, 22231, 22232, 22233, + 22234, 22235, 22236, 22237, 22238, 22239, 22240, 22241, 22242, 22243, + 22244, 22245, 22246, 22247, 22248, 22249, 22250, 22251, 22252, 22253, + 22254, 22255, 22256, 22257, 22258, 22259, 22260, 22261, 22262, 22263, + 22264, 22265, 22266, 22267, 22268, 22269, 22270, 22271, 22272, 22273, + 22274, 22275, 22276, 22277, 22278, 22279, 22280, 22281, 22282, 22283, + 22284, 22285, 22286, 22287, 22288, 22289, 22290, 22291, 22292, 22293, + 22294, 22295, 22296, 22297, 22298, 22299, 22300, 22301, 22302, 22303, + 22304, 22305, 22306, 22307, 22308, 22309, 22310, 22311, 22312, 22313, + 22314, 22315, 22316, 22317, 22318, 22319, 22320, 22321, 22322, 22323, + 22324, 22325, 22420, 22421, 22422, 22423, 22424, 22425, 22426, 22427, + 22428, 22429, 22430, 22431, 22432, 22433, 22434, 22435, 22436, 22437, + 22438, 22439, 22440, 22441, 22442, 22443, 22444, 22445, 22446, 22447, + 22448, 22449, 22450, 22451, 22452, 22453, 22454, 22455, 22456, 22457, + 22458, 22459, 22460, 22461, 22462, 22463, 22464, 22465, 22466, 22467, + 22468, 22469, 22470, 22471, 22472, 22473, 22474, 22475, 22476, 22477, + 22478, 22479, 22480, 22481, 22482, 22483, 15742, 22484, 22485, 22372, + 22486, 12464, 22373, 22487, 22488, 22374, 22375, 22376, 22377, 22489, + 22490, 22379, 22491, 9226, 22380, 22492, 22381, 22382, 22383, 22493, 22384, + 22385, 22494, 22495, 22496, 22497, 22386, 22387, 14957, 22498, 22388, + 22389, 22390, 22391, 22392, 22393, 12145, 22394, 22395, 22396, 22397, + 22398, 22499, 22399, 22500, 22400, 22401, 22501, 22402, 22403, 22404, + 22405, 22406, 22407, 22408, 22409, 11693, 22502, 22410, 22411, 22412, + 22413, 22503, 22504, 22505, 22506, 22507, 13675, 22414, 22415, 22416, + 22417, 22508, 22509, 22418, 22419, 22516, 22517, 22518, 22519, 22520, + 22510, 22511, 22521, 22522, 22523, 9293, 22524, 22525, 22526, 22512, 22513, + 22527, 22528, 12314, 22529, 22514, 22515, 22530, 22610, 22611, 22612, + 22613, 22614, 22615, 22616, 22617, 22618, 22619, 22620, 22621, 22622, + 22623, 22624, 22625, 22626, 22627, 22628, 22629, 22630, 22631, 22632, + 22633, 22634, 22635, 22636, 22637, 22638, 22639, 22640, 22641, 22642, + 22643, 22644, 22645, 22646, 22647, 22648, 22649, 22650, 22651, 22652, + 22653, 22654, 22655, 22656, 22657, 22658, 22659, 22660, 22661, 22662, + 22663, 22664, 22665, 22666, 22667, 22668, 22669, 22670, 22671, 22672, + 22673, 22674, 22675, 22676, 22677, 22678, 22679, 22680, 22681, 22682, + 22683, 22684, 22685, 22686, 22687, 22688, 22689, 22690, 22691, 22692, + 22693, 22694, 22695, 22696, 22697, 22698, 22699, 22700, 22701, 22702, + 22703, 22704, 22705, 22800, 22801, 22802, 22803, 22804, 22805, 22806, + 22807, 22808, 22809, 22810, 22811, 22812, 22813, 22814, 22815, 22816, + 22817, 22818, 22819, 22820, 22821, 22822, 22823, 22824, 22825, 22826, + 22827, 22828, 22829, 22830, 22831, 22832, 22833, 22834, 22835, 22836, + 22837, 22838, 22839, 22840, 22841, 22842, 22843, 22844, 22845, 22846, + 22847, 22848, 22849, 22850, 22851, 22852, 22853, 22854, 22855, 22856, + 22857, 22858, 22859, 22860, 22861, 22862, 22863, 22864, 22865, 22866, + 22867, 22868, 22869, 22870, 22871, 22872, 22873, 22874, 22875, 22876, + 22877, 22878, 22879, 22880, 22881, 22882, 22883, 22884, 22885, 22886, + 22887, 22888, 22889, 22890, 22891, 22892, 22893, 22894, 22895, 22990, + 22991, 22992, 22993, 22994, 22995, 22996, 22997, 22998, 22999, 23000, + 23001, 23002, 23003, 23004, 23005, 23006, 23007, 23008, 23009, 23010, + 23011, 23012, 23013, 23014, 23015, 23016, 23017, 23018, 23019, 23020, + 23021, 23022, 23023, 23024, 23025, 23026, 23027, 23028, 23029, 23030, + 23031, 23032, 23033, 23034, 23035, 23036, 23037, 23038, 23039, 23040, + 23041, 23042, 23043, 23044, 23045, 23046, 23047, 23048, 23049, 23050, + 23051, 23052, 23053, 23054, 23055, 23056, 23057, 23058, 23059, 23060, + 23061, 23062, 23063, 23064, 23065, 23066, 23067, 23068, 23069, 23070, + 23071, 23072, 23073, 23074, 23075, 23076, 23077, 23078, 23079, 23080, + 23081, 23082, 23083, 23084, 23085, 23180, 23181, 23182, 23183, 23184, + 23185, 23186, 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23194, + 23195, 23196, 23197, 23198, 23199, 23200, 23201, 23202, 23203, 23204, + 23205, 23206, 23207, 12906, 21200, 11311, 21201, 12724, 23208, 13039, + 15322, 23209, 21202, 21203, 21204, 21205, 21206, 15323, 23210, 15371, + 23211, 21208, 21207, 15872, 23212, 14585, 21209, 21211, 21210, 21212, + 21213, 23213, 23214, 10620, 21214, 10997, 23215, 21215, 21216, 11758, + 21217, 10241, 21218, 21219, 21220, 21221, 13606, 21222, 21223, 23216, + 21224, 13099, 23217, 21225, 23218, 23219, 23220, 21226, 23221, 21227, + 22544, 23222, 21228, 21229, 21230, 23223, 21231, 23224, 23225, 23226, + 23227, 21232, 10980, 23228, 21233, 21234, 21235, 21236, 21237, 21238, + 21239, 21241, 23229, 23230, 15680, 21240, 23231, 21242, 23232, 23233, + 23234, 23235, 23236, 23237, 23238, 23239, 23240, 23241, 22161, 12470, + 23242, 23243, 22583, 23244, 23245, 23246, 23247, 22584, 22585, 23248, + 23249, 22586, 23250, 23251, 23252, 23253, 23254, 23255, 22587, 12465, + 23256, 23257, 23258, 23259, 23260, 23261, 23262, 23263, 23264, 22589, + 23265, 22590, 23266, 23267, 23268, 23269, 23270, 23271, 12528, 23272, + 23273, 23274, 23275, 23370, 23371, 23372, 23373, 23374, 23375, 23376, + 23377, 23378, 22025, 23379, 23380, 23381, 22024, 23382, 23383, 12518, + 23384, 22580, 22581, 23385, 23386, 23387, 23388, 23389, 11153, 23390, + 23391, 23392, 23393, 16883, 23394, 23395, 23396, 14047, 12137, 21189, + 23397, 10983, 23398, 23399, 13408, 23400, 23401, 23402, 12837, 23403, + 23404, 22591, 22592, 22593, 23405, 22595, 22594, 23406, 22596, 23407, + 23408, 22599, 23409, 22598, 23410, 22597, 22600, 23411, 23412, 23413, + 23414, 22601, 23415, 23416, 23417, 23418, 23419, 23420, 23421, 23422, + 23423, 20688, 23424, 20689, 20690, 23425, 22353, 23426, 23427, 23428, + 23429, 23430, 23431, 23432, 23433, 23434, 23435, 23436, 23437, 22354, + 23438, 22355, 10171, 23439, 16655, 23440, 23441, 10771, 23442, 23443, + 23444, 16652, 23445, 17402, 23446, 23447, 23448, 23449, 23450, 23451, + 14048, 23452, 22602, 23453, 23454, 23455, 23456, 23457, 23458, 23459, + 23460, 23461, 22603, 23462, 23463, 22604, 23464, 23465, 23560, 23561, + 23562, 23563, 23564, 22606, 23565, 22605, 23566, 9254, 23567, 22607, 22608, + 23568, 23569, 23570, 23571, 23572, 22609, 23573, 23574, 23575, 23576, + 23577, 23578, 23579, 23580, 23581, 23582, 23583, 13280, 20445, 23584, + 23585, 23586, 23587, 23588, 23589, 23590, 23591, 23592, 23593, 23594, + 23595, 23596, 23597, 23598, 23599, 23600, 23601, 23602, 23603, 23604, + 23605, 23606, 23607, 23608, 23609, 23610, 23611, 23612, 23613, 23614, + 23615, 23616, 23617, 23618, 23619, 23620, 23621, 23622, 23623, 23624, + 23625, 23626, 23627, 23628, 9656, 22344, 23629, 23630, 22345, 12323, 22346, + 22347, 22348, 22349, 22350, 22351, 13588, 22352, 23631, 23632, 23633, + 23634, 23635, 23636, 23637, 23638, 23639, 23640, 23641, 23642, 12345, + 10743, 20687, 23643, 23644, 23645, 10809, 16878, 23646, 23647, 23648, + 23649, 23650, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7886, 7887, 7888, + 7889, 7890, 7891, 7892, 7893, 7894, 7895, 7896, 7897, 7898, 7899, 7900, + 7901, 7902, 7903, 7904, 7905, 7906, 7907, 7908, 7909, 7910, 7911, 7912, + 7913, 7914, 7915, 7916, 7917, 7918, 7919, 7920, 7921, 7922, 7923, 7924, + 7925, 7926, 7927, 7928, 7929, 7930, 7931, 7932, 7933, 7934, 7935, 7936, + 7937, 7938, 7939, 7940, 7941, 7942, 7943, 7944, 7945, 7946, 7947, 7948, + 7949, 7950, 7951, 7952, 7953, 7954, 7955, 7956, 7957, 7958, 7959, 7960, + 7961, 7962, 7963, 7964, 7965, 7966, 7967, 7968, 7969, 7970, 7971, 7972, + 7973, 7974, 7975, 7976, 7977, 7978, 7979, 8076, 8077, 8078, 8079, 8080, + 8081, 8082, 8083, 8084, 8085, 8086, 8087, 8088, 8089, 8090, 8091, 8092, + 8093, 8094, 8095, 8096, 8097, 8098, 8099, 8100, 8101, 8102, 8103, 8104, + 8105, 8106, 8107, 8108, 8109, 8110, 8111, 8112, 8113, 8114, 8115, 8116, + 8117, 8118, 8119, 8120, 8121, 8122, 8123, 8124, 8125, 8126, 8127, 8128, + 8129, 8130, 8131, 8132, 8133, 8134, 8135, 8136, 8137, 8138, 8139, 8140, + 8141, 8142, 8143, 8144, 8145, 8146, 8147, 8148, 8149, 8150, 8151, 8152, + 8153, 8154, 8155, 8156, 8157, 8158, 8159, 8160, 8161, 8162, 8163, 8164, + 8165, 8166, 8167, 8168, 8169, 8266, 8267, 8268, 8269, 8270, 8271, 8272, + 8273, 8274, 8275, 8276, 8277, 8278, 8279, 8280, 8281, 8282, 8283, 8284, + 8285, 8286, 8287, 8288, 8289, 8290, 8291, 8292, 8293, 8294, 8295, 8296, + 8297, 8298, 8299, 8300, 8301, 8302, 8303, 8304, 8305, 8306, 8307, 8308, + 8309, 8310, 8311, 8312, 8313, 8314, 8315, 8316, 8317, 8318, 8319, 8320, + 8321, 8322, 8323, 8324, 8325, 8326, 8327, 8328, 8329, 8330, 8331, 8332, + 8333, 8334, 8335, 8336, 8337, 8338, 8339, 8340, 8341, 8342, 8343, 8344, + 8345, 8346, 8347, 8348, 8349, 8350, 8351, 8352, 8353, 8354, 8355, 8356, + 8357, 8358, 8359, 8456, 8457, 8458, 8459, 8460, 8461, 8462, 8463, 8464, + 8465, 8466, 8467, 8468, 8469, 8470, 8471, 8472, 8473, 8474, 8475, 8476, + 8477, 8478, 8479, 8480, 8481, 8482, 8483, 8484, 8485, 8486, 8487, 8488, + 8489, 8490, 8491, 8492, 8493, 8494, 8495, 8496, 8497, 8498, 8499, 8500, + 8501, 8502, 8503, 8504, 8505, 8506, 8507, 8508, 8509, 8510, 8511, 8512, + 8513, 8514, 8515, 8516, 8517, 8518, 8519, 8520, 8521, 8522, 8523, 8524, + 8525, 8526, 8527, 8528, 8529, 8530, 8531, 8532, 8533, 8534, 8535, 8536, + 8537, 8538, 8539, 8540, 8541, 8542, 8543, 8544, 8545, 8546, 8547, 8548, + 8549, 8646, 8647, 8648, 8649, 8650, 8651, 8652, 8653, 8654, 8655, 8656, + 8657, 8658, 8659, 8660, 8661, 8662, 8663, 8664, 8665, 8666, 8667, 8668, + 8669, 8670, 8671, 8672, 8673, 8674, 8675, 8676, 8677, 8678, 8679, 8680, + 8681, 8682, 8683, 8684, 8685, 8686, 8687, 8688, 8689, 8690, 8691, 8692, + 8693, 8694, 8695, 8696, 8697, 8698, 8699, 8700, 8701, 8702, 8703, 8704, + 8705, 8706, 8707, 8708, 8709, 8710, 8711, 8712, 8713, 8714, 8715, 8716, + 8717, 8718, 8719, 8720, 8721, 8722, 8723, 8724, 8725, 8726, 8727, 8728, + 8729, 8730, 8731, 8732, 8733, 8734, 8735, 8736, 8737, 8738, 8739, 8836, + 8837, 8838, 8839, 8840, 8841, 8842, 8843, 8844, 8845, 8846, 8847, 8848, + 8849, 8850, 8851, 8852, 8853, 8854, 8855, 8856, 8857, 8858, 8859, 8860, + 8861, 8862, 8863, 8864, 8865, 8866, 8867, 8868, 8869, 8870, 8871, 8872, + 8873, 8874, 8875, 8876, 8877, 8878, 8879, 8880, 8881, 8882, 8883, 8884, + 8885, 8886, 8887, 8888, 8889, 8890, 8891, 8892, 8893, 8894, 8895, 8896, + 8897, 8898, 8899, 8900, 8901, 8902, 8903, 8904, 8905, 8906, 8907, 8908, + 8909, 8910, 8911, 8912, 8913, 8914, 8915, 8916, 8917, 8918, 8919, 8920, + 8921, 8922, 8923, 8924, 8925, 8926, 8927, 8928, 8929, 22706, 22707, 22708, + 22709, 22710, 22711, 22712, 22713, 22714, 22715, 22716, 22717, 22718, + 22719, 22720, 22721, 22722, 22723, 22724, 22725, 22726, 22727, 22728, + 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, 22737, 22738, + 22739, 22740, 22741, 22742, 22743, 22744, 22745, 22746, 22747, 22748, + 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22756, 22757, 22758, + 22759, 22760, 22761, 22762, 22763, 22764, 22765, 22766, 22767, 22768, + 22769, 22770, 22771, 22772, 22773, 22774, 22775, 22776, 22777, 22778, + 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22786, 22787, 22788, + 22789, 22790, 22791, 22792, 22793, 22794, 22795, 22796, 22797, 22798, + 22799, 22896, 22897, 22898, 22899, 22900, 22901, 22902, 22903, 22904, + 22905, 22906, 22907, 22908, 22909, 22910, 22911, 22912, 22913, 22914, + 22915, 22916, 22917, 22918, 22919, 22920, 22921, 22922, 22923, 22924, + 22925, 22926, 22927, 22928, 22929, 22930, 22931, 22932, 22933, 22934, + 22935, 22936, 22937, 22938, 22939, 22940, 22941, 22942, 22943, 22944, + 22945, 22946, 22947, 22948, 22949, 22950, 22951, 22952, 22953, 22954, + 22955, 22956, 22957, 22958, 22959, 22960, 22961, 22962, 22963, 22964, + 22965, 22966, 22967, 22968, 22969, 22970, 22971, 22972, 22973, 22974, + 22975, 22976, 22977, 22978, 22979, 22980, 22981, 22982, 22983, 22984, + 22985, 22986, 22987, 22988, 22989, 23086, 23087, 23088, 23089, 23090, + 23091, 23092, 23093, 23094, 23095, 23096, 23097, 23098, 23099, 23100, + 23101, 23102, 23103, 23104, 23105, 23106, 23107, 23108, 23109, 23110, + 23111, 23112, 23113, 23114, 23115, 23116, 23117, 23118, 23119, 23120, + 23121, 23122, 23123, 23124, 23125, 23126, 23127, 23128, 23129, 23130, + 23131, 23132, 23133, 23134, 23135, 23136, 23137, 23138, 23139, 23140, + 23141, 23142, 23143, 23144, 23145, 23146, 23147, 23148, 23149, 23150, + 23151, 23152, 23153, 23154, 23155, 23156, 23157, 23158, 23159, 23160, + 23161, 23162, 23163, 23164, 23165, 23166, 23167, 23168, 23169, 23170, + 23171, 23172, 23173, 23174, 23175, 23176, 23177, 23178, 23179, 23276, + 23277, 23278, 23279, 23280, 23281, 23282, 23283, 23284, 23285, 23286, + 23287, 23288, 23289, 23290, 23291, 23292, 23293, 23294, 23295, 23296, + 23297, 23298, 23299, 23300, 23301, 23302, 23303, 23304, 23305, 23306, + 23307, 23308, 23309, 23310, 23311, 23312, 23313, 23314, 23315, 23316, + 23317, 23318, 23319, 23320, 23321, 23322, 23323, 23324, 23325, 23326, + 23327, 23328, 23329, 23330, 23331, 23332, 23333, 23334, 23335, 23336, + 23337, 23338, 23339, 23340, 23341, 23342, 23343, 23344, 23345, 23346, + 23347, 23348, 23349, 23350, 23351, 23352, 23353, 23354, 23355, 23356, + 23357, 23358, 23359, 23360, 23361, 23362, 23363, 23364, 23365, 23366, + 23367, 23368, 23369, 23466, 23467, 23468, 23469, 23470, 23471, 23472, + 23473, 23474, 23475, 23476, 23477, 23478, 23479, 23480, 23481, 23482, + 23483, 23484, 23485, 23486, 23487, 23488, 23489, 23490, 23491, 23492, + 23493, 23494, 23495, 23496, 23497, 23498, 23499, 23500, 23501, 23502, + 23503, 23504, 23505, 23506, 23507, 23508, 23509, 23510, 23511, 23512, + 23513, 23514, 23515, 23516, 23517, 23518, 23519, 23520, 23521, 23522, + 23523, 23524, 23525, 23526, 23527, 23528, 23529, 23530, 23531, 23532, + 23533, 23534, 23535, 23536, 23537, 23538, 23539, 23540, 23541, 23542, + 23543, 23544, 23545, 23546, 23547, 23548, 23549, 23550, 23551, 23552, + 23553, 23554, 23555, 23556, 23557, 23558, 23559, 23656, 23657, 23658, + 23659, 23660, 23661, 23662, 23663, 23664, 23665, 23666, 23667, 23668, + 23669, 23670, 23671, 23672, 23673, 23674, 23675, 23676, 23677, 23678, + 23679, 23680, 23681, 23682, 23683, 23684, 23685, 23686, 23687, 23688, + 23689, 23690, 23691, 23692, 23693, 23694, 23695, 23696, 23697, 23698, + 23699, 23700, 23701, 23702, 23703, 23704, 23705, 23706, 23707, 23708, + 23709, 23710, 23711, 23712, 23713, 23714, 23715, 23716, 23717, 23718, + 23719, 23720, 23721, 23722, 23723, 23724, 23725, 23726, 23727, 23728, + 23729, 23730, 23731, 23732, 23733, 23734, 23735, 23736, 23737, 23738, + 23739, 23740, 23741, 23742, 23743, 23744, 23745, 23746, 23747, 23748, + 23749, 23846, 23847, 23848, 23849, 23850, 23851, 23852, 23853, 23854, + 23855, 23856, 23857, 23858, 23859, 23860, 23861, 23862, 23863, 23864, + 23865, 23866, 23867, 23868, 23869, 23870, 23871, 23872, 23873, 23874, + 23875, 23876, 23877, 23878, 23879, 23880, 23881, 23882, 23883, 23884, + 23885, 23886, 23887, 23888, 23889, 23890, 23891, 23892, 23893, 23894, + 23895, 23896, 23897, 23898, 23899, 23900, 23901, 23902, 23903, 23904, + 23905, 23906, 23907, 23908, 23909, 23910, 23911, 23912, 23913, 23914, + 23915, 23916, 23917, 23918, 23919, 23920, 23921, 23922, 23923, 23924, + 23925, 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, + 23935, 23936, 23937, 23938, 23939, 6080, 6081, 6082, 6083, 6084, 6085, + 6086, 6087, 6088, 6089, 6090, 6091, 6092, 6093, 6094, 6095, 6096, 6097, + 6098, 6099, 6100, 6101, 6102, 6103, 6104, 6105, 6106, 6107, 6108, 6109, + 6110, 6111, 6112, 6113, 6114, 6115, 6116, 6117, 6118, 6119, 6120, 6121, + 6122, 6123, 6124, 6125, 6126, 6127, 6128, 6129, 6130, 6131, 6132, 6133, + 6134, 6135, 6136, 6137, 6138, 6139, 6140, 6141, 6142, 6143, 6144, 6145, + 6146, 6147, 6148, 6149, 6150, 6151, 6152, 6153, 6154, 6155, 6156, 6157, + 6158, 6159, 6160, 6161, 6162, 6163, 6164, 6165, 6166, 6167, 6168, 6169, + 6170, 6171, 6172, 6173, 6174, 6175, 6270, 6271, 6272, 6273, 6274, 6275, + 6276, 6277, 6278, 6279, 6280, 6281, 6282, 6283, 6284, 6285, 6286, 6287, + 6288, 6289, 6290, 6291, 6292, 6293, 6294, 6295, 6296, 6297, 6298, 6299, + 6300, 6301, 6302, 6303, 6304, 6305, 6306, 6307, 6308, 6309, 6310, 6311, + 6312, 6313, 6314, 6315, 6316, 6317, 6318, 6319, 6320, 6321, 6322, 6323, + 6324, 6325, 6326, 6327, 6328, 6329, 6330, 6331, 6332, 6333, 6334, 6335, + 6336, 6337, 6338, 6339, 6340, 6341, 6342, 6343, 6344, 6345, 6346, 6347, + 6348, 6349, 6350, 6351, 6352, 6353, 6354, 6355, 6356, 6357, 6358, 6359, + 6360, 6361, 6362, 6363, 6364, 6365, 6460, 6461, 6462, 6463, 6464, 6465, + 6466, 6467, 6468, 6469, 6470, 6471, 6472, 6473, 6474, 6475, 6476, 6477, + 6478, 6479, 6480, 6481, 6482, 6483, 6484, 6485, 6486, 6487, 6488, 6489, + 6490, 6491, 6492, 6493, 6494, 6495, 6496, 6497, 6498, 6499, 6500, 6501, + 6502, 6503, 6504, 6505, 6506, 6507, 6508, 6509, 6510, 6511, 6512, 6513, + 6514, 6515, 6516, 6517, 6518, 6519, 6520, 6521, 6522, 6523, 6524, 6525, + 6526, 6527, 6528, 6529, 6530, 6531, 6532, 6533, 6534, 6535, 6536, 6537, + 6538, 6539, 6540, 6541, 6542, 6543, 6544, 6545, 6546, 6547, 6548, 6549, + 6550, 6551, 6552, 6553, 6554, 65535, 6650, 6651, 6652, 6653, 6654, 6655, + 6656, 6657, 6658, 6659, 6660, 6661, 6662, 6663, 6664, 6665, 6666, 6667, + 6668, 6669, 6670, 6671, 6672, 6673, 6674, 6675, 6676, 6677, 6678, 6679, + 6680, 6681, 6682, 6683, 6684, 6685, 6686, 6687, 6688, 6689, 6690, 6691, + 6692, 6693, 6694, 6695, 6696, 6697, 6698, 6699, 6700, 6701, 6702, 6703, + 6704, 6705, 6706, 6707, 6708, 6709, 6710, 6711, 6712, 6713, 6714, 6715, + 6716, 6717, 6718, 6719, 6720, 6721, 6722, 6723, 6724, 6725, 6726, 6727, + 6728, 6729, 6730, 6731, 6732, 6733, 6734, 6735, 6736, 6737, 6738, 6739, + 6740, 6741, 6742, 6743, 6744, 6745, 6840, 6841, 6842, 6843, 6844, 6845, + 6846, 6847, 6848, 6849, 6850, 6851, 6852, 6853, 6854, 6855, 6856, 6857, + 6858, 6859, 6860, 6861, 6862, 6863, 6864, 6865, 6866, 6867, 6868, 6869, + 6870, 6871, 6872, 6873, 6874, 6875, 6876, 6877, 6878, 6879, 6880, 6881, + 6882, 6883, 6884, 6885, 6886, 6887, 6888, 6889, 6890, 6891, 6892, 6893, + 6894, 6895, 6896, 6897, 6898, 6899, 6900, 6901, 6902, 6903, 6904, 6905, + 6906, 6907, 6908, 6909, 6910, 6911, 6912, 6913, 6914, 6915, 6916, 6917, + 6918, 6919, 6920, 6921, 6922, 6923, 6924, 6925, 6926, 6927, 6928, 6929, + 6930, 6931, 6932, 6933, 6934, 6935, 7030, 7031, 7032, 7033, 7034, 7035, + 7036, 7037, 7038, 7039, 7040, 7041, 7042, 7043, 7044, 7045, 7046, 7047, + 7048, 7049, 7050, 7051, 7052, 7053, 7054, 7055, 7056, 7057, 7058, 7059, + 7060, 7061, 7062, 7063, 7064, 7065, 7066, 7067, 7068, 7069, 7070, 7071, + 7072, 7073, 7074, 7075, 7076, 7077, 7078, 7079, 7080, 7081, 7082, 7083, + 7084, 7085, 7086, 7087, 7088, 7089, 7090, 7091, 7092, 7093, 7094, 7095, + 7096, 7097, 7098, 7099, 7100, 7101, 7102, 7103, 7104, 7105, 7106, 7107, + 7108, 7109, 7110, 7111, 7112, 7113, 7114, 7115, 7116, 7117, 7118, 7119, + 7120, 7121, 7122, 7123, 7124, 7125, 7220, 7221, 7222, 7223, 7224, 7225, + 7226, 7227, 7228, 7229, 7230, 7231, 7232, 7233, 7234, 7235, 7236, 7237, + 7238, 7239, 7240, 7241, 7242, 7243, 7244, 7245, 7246, 7247, 7248, 7249, + 7250, 7251, 7252, 7253, 7254, 7255, 7256, 7257, 7258, 7259, 7260, 7261, + 7262, 7263, 7264, 7265, 7266, 7267, 7268, 7269, 7270, 7271, 7272, 7273, + 7274, 7275, 7276, 7277, 7278, 7279, 7280, 7281, 7282, 7283, 7284, 7285, + 7286, 7287, 7288, 7289, 7290, 7291, 7292, 7293, 7294, 7295, 7296, 7297, + 7298, 7299, 7300, 7301, 7302, 7303, 7304, 7305, 7306, 7307, 7308, 7309, + 7310, 7311, 7312, 7313, 7314, 7315, 6376, 6377, 6378, 6379, 6380, 6381, + 65535, 6433, 6444, 6445, 6458, 6459, 6829, 6830, 6831, 6832, 6833, 6834, + 6835, 6836, 6837, 6838, 6839, 7022, 7023, 7024, 7025, 7026, 7027, 7028, + 7029, 7150, 7151, 7152, 7153, 7154, 7155, 7156, 7157, 7182, 7183, 7184, + 7185, 7186, 7187, 7188, 7201, 7202, 7208, 7211, 7212, 7213, 7214, 7215, + 7216, 7217, 7218, 7219, 7349, 7350, 7351, 7352, 7353, 7354, 7355, 7356, + 7357, 7358, 7359, 7360, 7361, 7362, 7363, 7397, 7398, 7399, 7400, 7401, + 7402, 7403, 7404, 7405, 7406, 7407, 7408, 7409, 7495, 7496, 7497, 7498, + 7499, 7500, 7501, 7502, 7503, 7504, 7505, 7533, 65535, 7538, 7539, 7540, + 7541, 7579, 7580, 7581, 7582, 7583, 7584, 7585, 7586, 7587, 7588, 7589, + 7590, 7591, 7592, 7593, 7594, 7595, 7596, 7597, 7598, 7599, 7624, 7627, + 7629, 7630, 7631, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 7686, 7687, 7688, 7689, 7690, 7691, + 7692, 7693, 7694, 7695, 7696, 7697, 7698, 7775, 7776, 7777, 7778, 7779, + 7780, 7781, 7782, 7783, 7784, 7785, 7786, 7787, 7788, 7789, 16525, 16526, + 16527, 16528, 16529, 65535, 23767, 23768, 23769, 65535, 65535, 65535, + 65535, 65535, 23775, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 23783, 65535, 65535, 65535, 65535, 23788, 23789, 65535, 65535, 65535, + 65535, 23794, 23795, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 23804, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23812, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 23829, 23830, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23845, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 23651, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23652, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 23653, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 23654, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 23655, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 23750, 23751, 23752, 23753, 65535, 23754, 65535, 23755, 23756, 65535, + 65535, 65535, 23757, 65535, 65535, 65535, 65535, 65535, 65535, 23758, + 23759, 23760, 65535, 23761, 23762, 65535, 65535, 23763, 23764, 23765, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7621, 7207, 65535, + 7209, 7210, 7189, 7190, 7205, 7206, 7191, 7192, 7203, 7204, 7195, 7196, + 7193, 7194, 7197, 7198, 7199, 7200, 65535, 65535, 65535, 65535, 7640, 7641, + 7642, 7643, 7644, 7645, 7646, 7647, 7648, 7649, 65535, 7650, 7651, 7652, + 7653, 65535, 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, + 7664, 7665, 7666, 7667, 65535, 7668, 7669, 7670, 7671, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6556, 6557, 6558, + 6246, 6560, 6561, 6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 6570, + 6571, 6572, 6573, 6574, 6575, 6576, 6577, 6578, 6579, 6580, 6581, 6582, + 6583, 6584, 6585, 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593, 6594, + 6595, 6596, 6597, 6598, 6599, 6600, 6601, 6602, 6603, 6604, 6605, 6606, + 6607, 6608, 6609, 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, + 6619, 6620, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 6628, 6629, 6630, + 6631, 6632, 6633, 6634, 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, + 6643, 6644, 6645, 6646, 6647, 6648, 6186, 65535, 6248, 6249, 7622, 6649, + 7623, 6559, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 32, 64, 96, 128, 160, 192, 224, 0, 0, 256, 288, 0, 0, 320, + 352, 0, 0, 384, 0, 0, 0, 0, 0, 416, 448, 480, 0, 512, 544, 576, 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, 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, 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, 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, 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, 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, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 640, 0, 0, 0, 672, + 0, 0, 704, 736, 0, 768, 800, 0, 0, 0, 832, 864, 896, 928, 960, 992, 0, 0, + 1024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1056, 1088, 0, 0, 0, 1120, 1152, 1184, + 1216, 1248, 1280, 1312, 1344, 1376, 0, 1408, 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, 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, 1440, 1472, 1504, 0, 0, 0, 0, 0, 0, 0, 0, 1536, 1568, 1600, + 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856, 0, 0, 0, 0, 0, 0, 0, 1888, + 0, 0, 0, 1920, 0, 0, 0, 0, 0, 0, 1952, 1984, 2016, 0, 0, 0, 2048, 2080, 0, + 0, 0, 0, 0, 0, 0, 0, 2112, 0, 0, 0, 2144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2176, 0, 0, 2208, 0, 0, 2240, 0, 0, 0, + 0, 2272, 0, 0, 0, 0, 0, 0, 2304, 0, 0, 0, 0, 0, 0, 0, 0, 2336, 0, 0, 0, + 2368, 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, 2400, 0, 0, 0, 0, 0, 0, 0, 2432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 2464, 0, 0, 0, 2496, 2528, 0, 0, 0, 0, 0, 0, 0, 2560, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 2592, 2624, 0, 0, 0, 0, 0, 2656, 0, 2688, 2720, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2752, 2784, 2816, 2848, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2880, 2912, 2944, 0, 0, 2976, + 0, 0, 0, 0, 3008, 0, 0, 3040, 3072, 3104, 3136, 3168, 3200, 3232, 3264, + 3296, 3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552, 3584, 3616, 3648, + 3680, 3712, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, 4000, 4032, + 4064, 4096, 4128, 4160, 4192, 4224, 4256, 4288, 4320, 4352, 4384, 4416, + 4448, 4480, 4512, 4544, 4576, 4608, 4640, 4672, 4704, 4736, 4768, 4800, + 4832, 4864, 4896, 4928, 4960, 4992, 5024, 5056, 5088, 5120, 5152, 5184, + 5216, 5248, 5280, 5312, 5344, 5376, 5408, 5440, 5472, 5504, 5536, 5568, + 5600, 5632, 5664, 5696, 5728, 5760, 5792, 5824, 5856, 5888, 5920, 5952, + 5984, 6016, 6048, 6080, 6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, + 6368, 6400, 6432, 6464, 6496, 6528, 6560, 6592, 6624, 6656, 6688, 6720, + 6752, 6784, 6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, + 7136, 7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, + 7520, 7552, 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, 7872, + 7904, 7936, 7968, 8000, 8032, 8064, 8096, 8128, 8160, 8192, 8224, 8256, + 8288, 8320, 8352, 8384, 8416, 8448, 8480, 8512, 8544, 8576, 8608, 8640, + 8672, 8704, 8736, 8768, 8800, 8832, 8864, 8896, 8928, 8960, 8992, 9024, + 9056, 9088, 9120, 9152, 9184, 9216, 9248, 9280, 9312, 9344, 9376, 9408, + 9440, 9472, 9504, 9536, 9568, 9600, 9632, 9664, 9696, 9728, 9760, 9792, + 9824, 9856, 9888, 9920, 9952, 9984, 10016, 10048, 10080, 10112, 10144, + 10176, 10208, 10240, 10272, 10304, 10336, 10368, 10400, 10432, 10464, + 10496, 10528, 10560, 10592, 10624, 10656, 10688, 10720, 10752, 10784, + 10816, 10848, 10880, 10912, 10944, 10976, 11008, 11040, 11072, 11104, + 11136, 11168, 11200, 11232, 11264, 11296, 11328, 11360, 11392, 11424, + 11456, 11488, 11520, 11552, 11584, 11616, 11648, 11680, 11712, 11744, + 11776, 11808, 11840, 11872, 11904, 11936, 11968, 12000, 12032, 12064, + 12096, 12128, 12160, 12192, 12224, 12256, 12288, 12320, 12352, 12384, + 12416, 12448, 12480, 12512, 12544, 12576, 12608, 12640, 12672, 12704, + 12736, 12768, 12800, 12832, 12864, 12896, 12928, 12960, 12992, 13024, + 13056, 13088, 13120, 13152, 13184, 13216, 13248, 13280, 13312, 13344, + 13376, 13408, 13440, 13472, 13504, 13536, 13568, 13600, 13632, 13664, + 13696, 13728, 13760, 13792, 13824, 13856, 13888, 13920, 13952, 13984, + 14016, 14048, 14080, 14112, 14144, 14176, 14208, 14240, 14272, 14304, + 14336, 14368, 14400, 14432, 14464, 14496, 14528, 14560, 14592, 14624, + 14656, 14688, 14720, 14752, 14784, 14816, 14848, 14880, 14912, 14944, + 14976, 15008, 15040, 15072, 15104, 15136, 15168, 15200, 15232, 15264, + 15296, 15328, 15360, 15392, 15424, 15456, 15488, 15520, 15552, 15584, + 15616, 15648, 15680, 15712, 15744, 15776, 15808, 15840, 15872, 15904, + 15936, 15968, 16000, 16032, 16064, 16096, 16128, 16160, 16192, 16224, + 16256, 16288, 16320, 16352, 16384, 16416, 16448, 16480, 16512, 16544, + 16576, 16608, 16640, 16672, 16704, 16736, 16768, 16800, 16832, 16864, + 16896, 16928, 16960, 16992, 17024, 17056, 17088, 17120, 17152, 17184, + 17216, 17248, 17280, 17312, 17344, 17376, 17408, 17440, 17472, 17504, + 17536, 17568, 17600, 17632, 17664, 17696, 17728, 17760, 17792, 17824, + 17856, 17888, 17920, 17952, 17984, 18016, 18048, 18080, 18112, 18144, + 18176, 18208, 18240, 18272, 18304, 18336, 18368, 18400, 18432, 18464, + 18496, 18528, 18560, 18592, 18624, 18656, 18688, 18720, 18752, 18784, + 18816, 18848, 18880, 18912, 18944, 18976, 19008, 19040, 19072, 19104, + 19136, 19168, 19200, 19232, 19264, 19296, 19328, 19360, 19392, 19424, + 19456, 19488, 19520, 19552, 19584, 19616, 19648, 19680, 19712, 19744, + 19776, 19808, 19840, 19872, 19904, 19936, 19968, 20000, 20032, 20064, + 20096, 20128, 20160, 20192, 20224, 20256, 20288, 20320, 20352, 20384, + 20416, 20448, 20480, 20512, 20544, 20576, 20608, 20640, 20672, 20704, + 20736, 20768, 20800, 20832, 20864, 20896, 20928, 20960, 20992, 21024, + 21056, 21088, 21120, 21152, 21184, 21216, 21248, 21280, 21312, 21344, + 21376, 21408, 21440, 21472, 21504, 21536, 21568, 21600, 21632, 21664, + 21696, 21728, 21760, 21792, 21824, 21856, 21888, 21920, 21952, 21984, + 22016, 22048, 22080, 22112, 22144, 22176, 22208, 22240, 22272, 22304, + 22336, 22368, 22400, 22432, 22464, 22496, 22528, 22560, 22592, 22624, + 22656, 22688, 22720, 22752, 22784, 22816, 22848, 22880, 22912, 22944, + 22976, 23008, 23040, 23072, 23104, 23136, 23168, 23200, 23232, 23264, + 23296, 23328, 23360, 23392, 23424, 23456, 23488, 23520, 23552, 23584, + 23616, 23648, 23680, 23712, 23744, 23776, 23808, 23840, 23872, 23904, + 23936, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 23968, 24000, 24032, 24064, + 24096, 24128, 24160, 24192, 24224, 24256, 24288, 24320, 24352, 24384, + 24416, 24448, 24480, 24512, 24544, 24576, 24608, 24640, 24672, 24704, + 24736, 24768, 24800, 24832, 24864, 24896, 24928, 24960, 24992, 25024, + 25056, 25088, 25120, 25152, 25184, 25216, 25248, 25280, 25312, 25344, + 25376, 25408, 25440, 25472, 25504, 25536, 25568, 25600, 25632, 25664, + 25696, 25728, 25760, 25792, 25824, 25856, 25888, 25920, 25952, 25984, + 26016, 26048, 26080, 26112, 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, 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, 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, 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, 26144, 0, 26176, 26208, + 0, 0, 26240, 26272, 26304, 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, 26336, 26368, 26400, 0, 0, 0, + 0, 26432, 26464, 26496, 0, 0, 0, 0, 26528, +]; + #[inline] -pub fn backward(code: u32) -> u32 { - if code < 128 { return 0xffffffff; } - let mut i = if code >= FORWARD_TABLE[127] {81} else {0}; - if code >= FORWARD_TABLE[i+63] { i += 64; } - if code >= FORWARD_TABLE[i+31] { i += 32; } - if code >= FORWARD_TABLE[i+15] { i += 16; } - if code >= FORWARD_TABLE[i+7] { i += 8; } - if code >= FORWARD_TABLE[i+3] { i += 4; } - if code >= FORWARD_TABLE[i+1] { i += 2; } - if code >= FORWARD_TABLE[i] { i += 1; } - (code - FORWARD_TABLE[i-1]) + BACKWARD_TABLE[i-1] +pub fn backward(code: u32) -> u16 { + let offset = (code >> 5) as uint; + let offset = if offset < 2048 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] mod tests { use super::{forward, backward}; - #[test] - fn test_no_failure() { - for i in range(0u32, 189002) { - forward(i); - } - for j in range(127u32, 65538) { - backward(j); - } - } - #[test] fn test_correct_table() { - for i in range(0u32, 189002) { + for i in range(0u32, 0x10000) { + let i = i as u16; + if i == 6555 { continue; } let j = forward(i); - if j == 0xffffffff { continue; } - let i_ = backward(j); - if i_ == 0xffffffff { continue; } - assert!(i_ == i, "backward(forward({})) = backward({}) = {} != {}", i, j, i_, i); + if j != 0xffff { assert_eq!(backward(j), i); } } } } diff --git a/src/encoding/index/gb18030_ranges.rs b/src/encoding/index/gb18030_ranges.rs new file mode 100644 index 0000000..c4005e1 --- /dev/null +++ b/src/encoding/index/gb18030_ranges.rs @@ -0,0 +1,105 @@ +// AUTOGENERATED FROM index-gb18030-ranges.txt, ORIGINAL COMMENT FOLLOWS: +// +// Any copyright is dedicated to the Public Domain. +// http://creativecommons.org/publicdomain/zero/1.0/ +// +// For details on index-gb18030-ranges.txt see the Encoding Standard +// http://encoding.spec.whatwg.org/ + +static FORWARD_TABLE: &'static [u32] = &[ + 0, 128, 165, 169, 178, 184, 216, 226, 235, 238, 244, 248, 251, 253, 258, + 276, 284, 300, 325, 329, 334, 364, 463, 465, 467, 469, 471, 473, 475, 477, + 506, 594, 610, 712, 716, 730, 930, 938, 962, 970, 1026, 1104, 1106, 8209, + 8215, 8218, 8222, 8231, 8241, 8244, 8246, 8252, 8365, 8452, 8454, 8458, + 8471, 8482, 8556, 8570, 8596, 8602, 8713, 8720, 8722, 8726, 8731, 8737, + 8740, 8742, 8748, 8751, 8760, 8766, 8777, 8781, 8787, 8802, 8808, 8816, + 8854, 8858, 8870, 8896, 8979, 9322, 9372, 9548, 9588, 9616, 9622, 9634, + 9652, 9662, 9672, 9676, 9680, 9702, 9735, 9738, 9793, 9795, 11906, 11909, + 11913, 11917, 11928, 11944, 11947, 11951, 11956, 11960, 11964, 11979, + 12284, 12292, 12312, 12319, 12330, 12351, 12436, 12447, 12535, 12543, + 12586, 12842, 12850, 12964, 13200, 13215, 13218, 13253, 13263, 13267, + 13270, 13384, 13428, 13727, 13839, 13851, 14617, 14703, 14801, 14816, + 14964, 15183, 15471, 15585, 16471, 16736, 17208, 17325, 17330, 17374, + 17623, 17997, 18018, 18212, 18218, 18301, 18318, 18760, 18811, 18814, + 18820, 18823, 18844, 18848, 18872, 19576, 19620, 19738, 19887, 40870, + 59244, 59336, 59367, 59413, 59417, 59423, 59431, 59437, 59443, 59452, + 59460, 59478, 59493, 63789, 63866, 63894, 63976, 63986, 64016, 64018, + 64021, 64025, 64034, 64037, 64042, 65074, 65093, 65107, 65112, 65127, + 65132, 65375, 65510, 65536, +]; + +static BACKWARD_TABLE: &'static [u32] = &[ + 0, 0, 36, 38, 45, 50, 81, 89, 95, 96, 100, 103, 104, 105, 109, 126, 133, + 148, 172, 175, 179, 208, 306, 307, 308, 309, 310, 311, 312, 313, 341, 428, + 443, 544, 545, 558, 741, 742, 749, 750, 805, 819, 820, 7922, 7924, 7925, + 7927, 7934, 7943, 7944, 7945, 7950, 8062, 8148, 8149, 8152, 8164, 8174, + 8236, 8240, 8262, 8264, 8374, 8380, 8381, 8384, 8388, 8390, 8392, 8393, + 8394, 8396, 8401, 8406, 8416, 8419, 8424, 8437, 8439, 8445, 8482, 8485, + 8496, 8521, 8603, 8936, 8946, 9046, 9050, 9063, 9066, 9076, 9092, 9100, + 9108, 9111, 9113, 9131, 9162, 9164, 9218, 9219, 11329, 11331, 11334, 11336, + 11346, 11361, 11363, 11366, 11370, 11372, 11375, 11389, 11682, 11686, + 11687, 11692, 11694, 11714, 11716, 11723, 11725, 11730, 11736, 11982, + 11989, 12102, 12336, 12348, 12350, 12384, 12393, 12395, 12397, 12510, + 12553, 12851, 12962, 12973, 13738, 13823, 13919, 13933, 14080, 14298, + 14585, 14698, 15583, 15847, 16318, 16434, 16438, 16481, 16729, 17102, + 17122, 17315, 17320, 17402, 17418, 17859, 17909, 17911, 17915, 17916, + 17936, 17939, 17961, 18664, 18703, 18814, 18962, 19043, 33469, 33470, + 33471, 33484, 33485, 33490, 33497, 33501, 33505, 33513, 33520, 33536, + 33550, 37845, 37921, 37948, 38029, 38038, 38064, 38065, 38066, 38069, + 38075, 38076, 38078, 39108, 39109, 39113, 39114, 39115, 39116, 39265, + 39394, 189000, +]; + +#[inline] +pub fn forward(code: u32) -> u32 { + if (code > 39419 && code < 189000) || code > 1237575 { return 0xffffffff; } + let mut i = if code >= BACKWARD_TABLE[127] {81} else {0}; + if code >= BACKWARD_TABLE[i+63] { i += 64; } + if code >= BACKWARD_TABLE[i+31] { i += 32; } + if code >= BACKWARD_TABLE[i+15] { i += 16; } + if code >= BACKWARD_TABLE[i+7] { i += 8; } + if code >= BACKWARD_TABLE[i+3] { i += 4; } + if code >= BACKWARD_TABLE[i+1] { i += 2; } + if code >= BACKWARD_TABLE[i] { i += 1; } + (code - BACKWARD_TABLE[i-1]) + FORWARD_TABLE[i-1] +} + +#[inline] +pub fn backward(code: u32) -> u32 { + if code < 128 { return 0xffffffff; } + let mut i = if code >= FORWARD_TABLE[127] {81} else {0}; + if code >= FORWARD_TABLE[i+63] { i += 64; } + if code >= FORWARD_TABLE[i+31] { i += 32; } + if code >= FORWARD_TABLE[i+15] { i += 16; } + if code >= FORWARD_TABLE[i+7] { i += 8; } + if code >= FORWARD_TABLE[i+3] { i += 4; } + if code >= FORWARD_TABLE[i+1] { i += 2; } + if code >= FORWARD_TABLE[i] { i += 1; } + (code - FORWARD_TABLE[i-1]) + BACKWARD_TABLE[i-1] +} + +#[cfg(test)] +mod tests { + use super::{forward, backward}; + + #[test] + fn test_no_failure() { + for i in range(0u32, 189002) { + forward(i); + } + for j in range(127u32, 65538) { + backward(j); + } + } + + #[test] + fn test_correct_table() { + for i in range(0u32, 189002) { + let j = forward(i); + if j == 0xffffffff { continue; } + let i_ = backward(j); + if i_ == 0xffffffff { continue; } + assert!(i_ == i, "backward(forward({})) = backward({}) = {} != {}", i, j, i_, i); + } + } +} diff --git a/src/encoding/index/gbk.rs b/src/encoding/index/gbk.rs deleted file mode 100644 index b937349..0000000 --- a/src/encoding/index/gbk.rs +++ /dev/null @@ -1,4777 +0,0 @@ -// AUTOGENERATED FROM index-gbk.txt, ORIGINAL COMMENT FOLLOWS: -// -// Any copyright is dedicated to the Public Domain. -// http://creativecommons.org/publicdomain/zero/1.0/ -// -// For details on index-gbk.txt see the Encoding Standard -// http://encoding.spec.whatwg.org/ - -static FORWARD_TABLE: &'static [u16] = &[ - 19970, 19972, 19973, 19974, 19983, 19986, 19991, 19999, 20000, 20001, - 20003, 20006, 20009, 20014, 20015, 20017, 20019, 20021, 20023, 20028, - 20032, 20033, 20034, 20036, 20038, 20042, 20049, 20053, 20055, 20058, - 20059, 20066, 20067, 20068, 20069, 20071, 20072, 20074, 20075, 20076, - 20077, 20078, 20079, 20082, 20084, 20085, 20086, 20087, 20088, 20089, - 20090, 20091, 20092, 20093, 20095, 20096, 20097, 20098, 20099, 20100, - 20101, 20103, 20106, 20112, 20118, 20119, 20121, 20124, 20125, 20126, - 20131, 20138, 20143, 20144, 20145, 20148, 20150, 20151, 20152, 20153, - 20156, 20157, 20158, 20168, 20172, 20175, 20176, 20178, 20186, 20187, - 20188, 20192, 20194, 20198, 20199, 20201, 20205, 20206, 20207, 20209, - 20212, 20216, 20217, 20218, 20220, 20222, 20224, 20226, 20227, 20228, - 20229, 20230, 20231, 20232, 20235, 20236, 20242, 20243, 20244, 20245, - 20246, 20252, 20253, 20257, 20259, 20264, 20265, 20268, 20269, 20270, - 20273, 20275, 20277, 20279, 20281, 20283, 20286, 20287, 20288, 20289, - 20290, 20292, 20293, 20295, 20296, 20297, 20298, 20299, 20300, 20306, - 20308, 20310, 20321, 20322, 20326, 20328, 20330, 20331, 20333, 20334, - 20337, 20338, 20341, 20343, 20344, 20345, 20346, 20349, 20352, 20353, - 20354, 20357, 20358, 20359, 20362, 20364, 20366, 20368, 20370, 20371, - 20373, 20374, 20376, 20377, 20378, 20380, 20382, 20383, 20385, 20386, - 20388, 20395, 20397, 20400, 20401, 20402, 20403, 20404, 20406, 20407, - 20408, 20409, 20410, 20411, 20412, 20413, 20414, 20416, 20417, 20418, - 20422, 20423, 20424, 20425, 20427, 20428, 20429, 20434, 20435, 20436, - 20437, 20438, 20441, 20443, 20448, 20450, 20452, 20453, 20455, 20459, - 20460, 20464, 20466, 20468, 20469, 20470, 20471, 20473, 20475, 20476, - 20477, 20479, 20480, 20481, 20482, 20483, 20484, 20485, 20486, 20487, - 20488, 20489, 20490, 20491, 20494, 20496, 20497, 20499, 20501, 20502, - 20503, 20507, 20509, 20510, 20512, 20514, 20515, 20516, 20519, 20523, - 20527, 20528, 20529, 20530, 20531, 20532, 20533, 20534, 20535, 20536, - 20537, 20539, 20541, 20543, 20544, 20545, 20546, 20548, 20549, 20550, - 20553, 20554, 20555, 20557, 20560, 20561, 20562, 20563, 20564, 20566, - 20567, 20568, 20569, 20571, 20573, 20574, 20575, 20576, 20577, 20578, - 20579, 20580, 20582, 20583, 20584, 20585, 20586, 20587, 20589, 20590, - 20591, 20592, 20593, 20594, 20595, 20596, 20597, 20600, 20601, 20602, - 20604, 20605, 20609, 20610, 20611, 20612, 20614, 20615, 20617, 20618, - 20619, 20620, 20622, 20623, 20624, 20625, 20626, 20627, 20628, 20629, - 20630, 20631, 20632, 20633, 20634, 20635, 20636, 20637, 20638, 20639, - 20640, 20641, 20642, 20644, 20646, 20650, 20651, 20653, 20654, 20655, - 20656, 20657, 20659, 20660, 20661, 20662, 20663, 20664, 20665, 20668, - 20669, 20670, 20671, 20672, 20673, 20674, 20675, 20676, 20677, 20678, - 20679, 20680, 20681, 20682, 20683, 20684, 20685, 20686, 20688, 20689, - 20690, 20691, 20692, 20693, 20695, 20696, 20697, 20699, 20700, 20701, - 20702, 20703, 20704, 20705, 20706, 20707, 20708, 20709, 20712, 20713, - 20714, 20715, 20719, 20720, 20721, 20722, 20724, 20726, 20727, 20728, - 20729, 20730, 20732, 20733, 20734, 20735, 20736, 20737, 20738, 20739, - 20740, 20741, 20744, 20745, 20746, 20748, 20749, 20750, 20751, 20752, - 20753, 20755, 20756, 20757, 20758, 20759, 20760, 20761, 20762, 20763, - 20764, 20765, 20766, 20767, 20768, 20770, 20771, 20772, 20773, 20774, - 20775, 20776, 20777, 20778, 20779, 20780, 20781, 20782, 20783, 20784, - 20785, 20786, 20787, 20788, 20789, 20790, 20791, 20792, 20793, 20794, - 20795, 20796, 20797, 20798, 20802, 20807, 20810, 20812, 20814, 20815, - 20816, 20818, 20819, 20823, 20824, 20825, 20827, 20829, 20830, 20831, - 20832, 20833, 20835, 20836, 20838, 20839, 20841, 20842, 20847, 20850, - 20858, 20862, 20863, 20867, 20868, 20870, 20871, 20874, 20875, 20878, - 20879, 20880, 20881, 20883, 20884, 20888, 20890, 20893, 20894, 20895, - 20897, 20899, 20902, 20903, 20904, 20905, 20906, 20909, 20910, 20916, - 20920, 20921, 20922, 20926, 20927, 20929, 20930, 20931, 20933, 20936, - 20938, 20941, 20942, 20944, 20946, 20947, 20948, 20949, 20950, 20951, - 20952, 20953, 20954, 20956, 20958, 20959, 20962, 20963, 20965, 20966, - 20967, 20968, 20969, 20970, 20972, 20974, 20977, 20978, 20980, 20983, - 20990, 20996, 20997, 21001, 21003, 21004, 21007, 21008, 21011, 21012, - 21013, 21020, 21022, 21023, 21025, 21026, 21027, 21029, 21030, 21031, - 21034, 21036, 21039, 21041, 21042, 21044, 21045, 21052, 21054, 21060, - 21061, 21062, 21063, 21064, 21065, 21067, 21070, 21071, 21074, 21075, - 21077, 21079, 21080, 21081, 21082, 21083, 21085, 21087, 21088, 21090, - 21091, 21092, 21094, 21096, 21099, 21100, 21101, 21102, 21104, 21105, - 21107, 21108, 21109, 21110, 21111, 21112, 21113, 21114, 21115, 21116, - 21118, 21120, 21123, 21124, 21125, 21126, 21127, 21129, 21130, 21131, - 21132, 21133, 21134, 21135, 21137, 21138, 21140, 21141, 21142, 21143, - 21144, 21145, 21146, 21148, 21156, 21157, 21158, 21159, 21166, 21167, - 21168, 21172, 21173, 21174, 21175, 21176, 21177, 21178, 21179, 21180, - 21181, 21184, 21185, 21186, 21188, 21189, 21190, 21192, 21194, 21196, - 21197, 21198, 21199, 21201, 21203, 21204, 21205, 21207, 21209, 21210, - 21211, 21212, 21213, 21214, 21216, 21217, 21218, 21219, 21221, 21222, - 21223, 21224, 21225, 21226, 21227, 21228, 21229, 21230, 21231, 21233, - 21234, 21235, 21236, 21237, 21238, 21239, 21240, 21243, 21244, 21245, - 21249, 21250, 21251, 21252, 21255, 21257, 21258, 21259, 21260, 21262, - 21265, 21266, 21267, 21268, 21272, 21275, 21276, 21278, 21279, 21282, - 21284, 21285, 21287, 21288, 21289, 21291, 21292, 21293, 21295, 21296, - 21297, 21298, 21299, 21300, 21301, 21302, 21303, 21304, 21308, 21309, - 21312, 21314, 21316, 21318, 21323, 21324, 21325, 21328, 21332, 21336, - 21337, 21339, 21341, 21349, 21352, 21354, 21356, 21357, 21362, 21366, - 21369, 21371, 21372, 21373, 21374, 21376, 21377, 21379, 21383, 21384, - 21386, 21390, 21391, 21392, 21393, 21394, 21395, 21396, 21398, 21399, - 21401, 21403, 21404, 21406, 21408, 21409, 21412, 21415, 21418, 21419, - 21420, 21421, 21423, 21424, 21425, 21426, 21427, 21428, 21429, 21431, - 21432, 21433, 21434, 21436, 21437, 21438, 21440, 21443, 21444, 21445, - 21446, 21447, 21454, 21455, 21456, 21458, 21459, 21461, 21466, 21468, - 21469, 21470, 21473, 21474, 21479, 21492, 21498, 21502, 21503, 21504, - 21506, 21509, 21511, 21515, 21524, 21528, 21529, 21530, 21532, 21538, - 21540, 21541, 21546, 21552, 21555, 21558, 21559, 21562, 21565, 21567, - 21569, 21570, 21572, 21573, 21575, 21577, 21580, 21581, 21582, 21583, - 21585, 21594, 21597, 21598, 21599, 21600, 21601, 21603, 21605, 21607, - 21609, 21610, 21611, 21612, 21613, 21614, 21615, 21616, 21620, 21625, - 21626, 21630, 21631, 21633, 21635, 21637, 21639, 21640, 21641, 21642, - 21645, 21649, 21651, 21655, 21656, 21660, 21662, 21663, 21664, 21665, - 21666, 21669, 21678, 21680, 21682, 21685, 21686, 21687, 21689, 21690, - 21692, 21694, 21699, 21701, 21706, 21707, 21718, 21720, 21723, 21728, - 21729, 21730, 21731, 21732, 21739, 21740, 21743, 21744, 21745, 21748, - 21749, 21750, 21751, 21752, 21753, 21755, 21758, 21760, 21762, 21763, - 21764, 21765, 21768, 21770, 21771, 21772, 21773, 21774, 21778, 21779, - 21781, 21782, 21783, 21784, 21785, 21786, 21788, 21789, 21790, 21791, - 21793, 21797, 21798, 21800, 21801, 21803, 21805, 21810, 21812, 21813, - 21814, 21816, 21817, 21818, 21819, 21821, 21824, 21826, 21829, 21831, - 21832, 21835, 21836, 21837, 21838, 21839, 21841, 21842, 21843, 21844, - 21847, 21848, 21849, 21850, 21851, 21853, 21854, 21855, 21856, 21858, - 21859, 21864, 21865, 21867, 21871, 21872, 21873, 21874, 21875, 21876, - 21881, 21882, 21885, 21887, 21893, 21894, 21900, 21901, 21902, 21904, - 21906, 21907, 21909, 21910, 21911, 21914, 21915, 21918, 21920, 21921, - 21922, 21923, 21924, 21925, 21926, 21928, 21929, 21930, 21931, 21932, - 21933, 21934, 21935, 21936, 21938, 21940, 21942, 21944, 21946, 21948, - 21951, 21952, 21953, 21954, 21955, 21958, 21959, 21960, 21962, 21963, - 21966, 21967, 21968, 21973, 21975, 21976, 21977, 21978, 21979, 21982, - 21984, 21986, 21991, 21993, 21997, 21998, 22000, 22001, 22004, 22006, - 22008, 22009, 22010, 22011, 22012, 22015, 22018, 22019, 22020, 22021, - 22022, 22023, 22026, 22027, 22029, 22032, 22033, 22034, 22035, 22036, - 22037, 22038, 22039, 22041, 22042, 22044, 22045, 22048, 22049, 22050, - 22053, 22054, 22056, 22057, 22058, 22059, 22062, 22063, 22064, 22067, - 22069, 22071, 22072, 22074, 22076, 22077, 22078, 22080, 22081, 22082, - 22083, 22084, 22085, 22086, 22087, 22088, 22089, 22090, 22091, 22095, - 22096, 22097, 22098, 22099, 22101, 22102, 22106, 22107, 22109, 22110, - 22111, 22112, 22113, 22115, 22117, 22118, 22119, 22125, 22126, 22127, - 22128, 22130, 22131, 22132, 22133, 22135, 22136, 22137, 22138, 22141, - 22142, 22143, 22144, 22145, 22146, 22147, 22148, 22151, 22152, 22153, - 22154, 22155, 22156, 22157, 22160, 22161, 22162, 22164, 22165, 22166, - 22167, 22168, 22169, 22170, 22171, 22172, 22173, 22174, 22175, 22176, - 22177, 22178, 22180, 22181, 22182, 22183, 22184, 22185, 22186, 22187, - 22188, 22189, 22190, 22192, 22193, 22194, 22195, 22196, 22197, 22198, - 22200, 22201, 22202, 22203, 22205, 22206, 22207, 22208, 22209, 22210, - 22211, 22212, 22213, 22214, 22215, 22216, 22217, 22219, 22220, 22221, - 22222, 22223, 22224, 22225, 22226, 22227, 22229, 22230, 22232, 22233, - 22236, 22243, 22245, 22246, 22247, 22248, 22249, 22250, 22252, 22254, - 22255, 22258, 22259, 22262, 22263, 22264, 22267, 22268, 22272, 22273, - 22274, 22277, 22279, 22283, 22284, 22285, 22286, 22287, 22288, 22289, - 22290, 22291, 22292, 22293, 22294, 22295, 22296, 22297, 22298, 22299, - 22301, 22302, 22304, 22305, 22306, 22308, 22309, 22310, 22311, 22315, - 22321, 22322, 22324, 22325, 22326, 22327, 22328, 22332, 22333, 22335, - 22337, 22339, 22340, 22341, 22342, 22344, 22345, 22347, 22354, 22355, - 22356, 22357, 22358, 22360, 22361, 22370, 22371, 22373, 22375, 22380, - 22382, 22384, 22385, 22386, 22388, 22389, 22392, 22393, 22394, 22397, - 22398, 22399, 22400, 22401, 22407, 22408, 22409, 22410, 22413, 22414, - 22415, 22416, 22417, 22420, 22421, 22422, 22423, 22424, 22425, 22426, - 22428, 22429, 22430, 22431, 22437, 22440, 22442, 22444, 22447, 22448, - 22449, 22451, 22453, 22454, 22455, 22457, 22458, 22459, 22460, 22461, - 22462, 22463, 22464, 22465, 22468, 22469, 22470, 22471, 22472, 22473, - 22474, 22476, 22477, 22480, 22481, 22483, 22486, 22487, 22491, 22492, - 22494, 22497, 22498, 22499, 22501, 22502, 22503, 22504, 22505, 22506, - 22507, 22508, 22510, 22512, 22513, 22514, 22515, 22517, 22518, 22519, - 22523, 22524, 22526, 22527, 22529, 22531, 22532, 22533, 22536, 22537, - 22538, 22540, 22542, 22543, 22544, 22546, 22547, 22548, 22550, 22551, - 22552, 22554, 22555, 22556, 22557, 22559, 22562, 22563, 22565, 22566, - 22567, 22568, 22569, 22571, 22572, 22573, 22574, 22575, 22577, 22578, - 22579, 22580, 22582, 22583, 22584, 22585, 22586, 22587, 22588, 22589, - 22590, 22591, 22592, 22593, 22594, 22595, 22597, 22598, 22599, 22600, - 22601, 22602, 22603, 22606, 22607, 22608, 22610, 22611, 22613, 22614, - 22615, 22617, 22618, 22619, 22620, 22621, 22623, 22624, 22625, 22626, - 22627, 22628, 22630, 22631, 22632, 22633, 22634, 22637, 22638, 22639, - 22640, 22641, 22642, 22643, 22644, 22645, 22646, 22647, 22648, 22649, - 22650, 22651, 22652, 22653, 22655, 22658, 22660, 22662, 22663, 22664, - 22666, 22667, 22668, 22669, 22670, 22671, 22672, 22673, 22676, 22677, - 22678, 22679, 22680, 22683, 22684, 22685, 22688, 22689, 22690, 22691, - 22692, 22693, 22694, 22695, 22698, 22699, 22700, 22701, 22702, 22703, - 22704, 22705, 22706, 22707, 22708, 22709, 22710, 22711, 22712, 22713, - 22714, 22715, 22717, 22718, 22719, 22720, 22722, 22723, 22724, 22726, - 22727, 22728, 22729, 22730, 22731, 22732, 22733, 22734, 22735, 22736, - 22738, 22739, 22740, 22742, 22743, 22744, 22745, 22746, 22747, 22748, - 22749, 22750, 22751, 22752, 22753, 22754, 22755, 22757, 22758, 22759, - 22760, 22761, 22762, 22765, 22767, 22769, 22770, 22772, 22773, 22775, - 22776, 22778, 22779, 22780, 22781, 22782, 22783, 22784, 22785, 22787, - 22789, 22790, 22792, 22793, 22794, 22795, 22796, 22798, 22800, 22801, - 22802, 22803, 22807, 22808, 22811, 22813, 22814, 22816, 22817, 22818, - 22819, 22822, 22824, 22828, 22832, 22834, 22835, 22837, 22838, 22843, - 22845, 22846, 22847, 22848, 22851, 22853, 22854, 22858, 22860, 22861, - 22864, 22866, 22867, 22873, 22875, 22876, 22877, 22878, 22879, 22881, - 22883, 22884, 22886, 22887, 22888, 22889, 22890, 22891, 22892, 22893, - 22894, 22895, 22896, 22897, 22898, 22901, 22903, 22906, 22907, 22908, - 22910, 22911, 22912, 22917, 22921, 22923, 22924, 22926, 22927, 22928, - 22929, 22932, 22933, 22936, 22938, 22939, 22940, 22941, 22943, 22944, - 22945, 22946, 22950, 22951, 22956, 22957, 22960, 22961, 22963, 22964, - 22965, 22966, 22967, 22968, 22970, 22972, 22973, 22975, 22976, 22977, - 22978, 22979, 22980, 22981, 22983, 22984, 22985, 22988, 22989, 22990, - 22991, 22997, 22998, 23001, 23003, 23006, 23007, 23008, 23009, 23010, - 23012, 23014, 23015, 23017, 23018, 23019, 23021, 23022, 23023, 23024, - 23025, 23026, 23027, 23028, 23029, 23030, 23031, 23032, 23034, 23036, - 23037, 23038, 23040, 23042, 23050, 23051, 23053, 23054, 23055, 23056, - 23058, 23060, 23061, 23062, 23063, 23065, 23066, 23067, 23069, 23070, - 23073, 23074, 23076, 23078, 23079, 23080, 23082, 23083, 23084, 23085, - 23086, 23087, 23088, 23091, 23093, 23095, 23096, 23097, 23098, 23099, - 23101, 23102, 23103, 23105, 23106, 23107, 23108, 23109, 23111, 23112, - 23115, 23116, 23117, 23118, 23119, 23120, 23121, 23122, 23123, 23124, - 23126, 23127, 23128, 23129, 23131, 23132, 23133, 23134, 23135, 23136, - 23137, 23139, 23140, 23141, 23142, 23144, 23145, 23147, 23148, 23149, - 23150, 23151, 23152, 23153, 23154, 23155, 23160, 23161, 23163, 23164, - 23165, 23166, 23168, 23169, 23170, 23171, 23172, 23173, 23174, 23175, - 23176, 23177, 23178, 23179, 23180, 23181, 23182, 23183, 23184, 23185, - 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23196, 23197, 23198, - 23199, 23200, 23201, 23202, 23203, 23204, 23205, 23206, 23207, 23208, - 23209, 23211, 23212, 23213, 23214, 23215, 23216, 23217, 23220, 23222, - 23223, 23225, 23226, 23227, 23228, 23229, 23231, 23232, 23235, 23236, - 23237, 23238, 23239, 23240, 23242, 23243, 23245, 23246, 23247, 23248, - 23249, 23251, 23253, 23255, 23257, 23258, 23259, 23261, 23262, 23263, - 23266, 23268, 23269, 23271, 23272, 23274, 23276, 23277, 23278, 23279, - 23280, 23282, 23283, 23284, 23285, 23286, 23287, 23288, 23289, 23290, - 23291, 23292, 23293, 23294, 23295, 23296, 23297, 23298, 23299, 23300, - 23301, 23302, 23303, 23304, 23306, 23307, 23308, 23309, 23310, 23311, - 23312, 23313, 23314, 23315, 23316, 23317, 23320, 23321, 23322, 23323, - 23324, 23325, 23326, 23327, 23328, 23329, 23330, 23331, 23332, 23333, - 23334, 23335, 23336, 23337, 23338, 23339, 23340, 23341, 23342, 23343, - 23344, 23345, 23347, 23349, 23350, 23352, 23353, 23354, 23355, 23356, - 23357, 23358, 23359, 23361, 23362, 23363, 23364, 23365, 23366, 23367, - 23368, 23369, 23370, 23371, 23372, 23373, 23374, 23375, 23378, 23382, - 23390, 23392, 23393, 23399, 23400, 23403, 23405, 23406, 23407, 23410, - 23412, 23414, 23415, 23416, 23417, 23419, 23420, 23422, 23423, 23426, - 23430, 23434, 23437, 23438, 23440, 23441, 23442, 23444, 23446, 23455, - 23463, 23464, 23465, 23468, 23469, 23470, 23471, 23473, 23474, 23479, - 23482, 23483, 23484, 23488, 23489, 23491, 23496, 23497, 23498, 23499, - 23501, 23502, 23503, 23505, 23508, 23509, 23510, 23511, 23512, 23513, - 23514, 23515, 23516, 23520, 23522, 23523, 23526, 23527, 23529, 23530, - 23531, 23532, 23533, 23535, 23537, 23538, 23539, 23540, 23541, 23542, - 23543, 23549, 23550, 23552, 23554, 23555, 23557, 23559, 23560, 23563, - 23564, 23565, 23566, 23568, 23570, 23571, 23575, 23577, 23579, 23582, - 23583, 23584, 23585, 23587, 23590, 23592, 23593, 23594, 23595, 23597, - 23598, 23599, 23600, 23602, 23603, 23605, 23606, 23607, 23619, 23620, - 23622, 23623, 23628, 23629, 23634, 23635, 23636, 23638, 23639, 23640, - 23642, 23643, 23644, 23645, 23647, 23650, 23652, 23655, 23656, 23657, - 23658, 23659, 23660, 23661, 23664, 23666, 23667, 23668, 23669, 23670, - 23671, 23672, 23675, 23676, 23677, 23678, 23680, 23683, 23684, 23685, - 23686, 23687, 23689, 23690, 23691, 23694, 23695, 23698, 23699, 23701, - 23709, 23710, 23711, 23712, 23713, 23716, 23717, 23718, 23719, 23720, - 23722, 23726, 23727, 23728, 23730, 23732, 23734, 23737, 23738, 23739, - 23740, 23742, 23744, 23746, 23747, 23749, 23750, 23751, 23752, 23753, - 23754, 23756, 23757, 23758, 23759, 23760, 23761, 23763, 23764, 23765, - 23766, 23767, 23768, 23770, 23771, 23772, 23773, 23774, 23775, 23776, - 23778, 23779, 23783, 23785, 23787, 23788, 23790, 23791, 23793, 23794, - 23795, 23796, 23797, 23798, 23799, 23800, 23801, 23802, 23804, 23805, - 23806, 23807, 23808, 23809, 23812, 23813, 23816, 23817, 23818, 23819, - 23820, 23821, 23823, 23824, 23825, 23826, 23827, 23829, 23831, 23832, - 23833, 23834, 23836, 23837, 23839, 23840, 23841, 23842, 23843, 23845, - 23848, 23850, 23851, 23852, 23855, 23856, 23857, 23858, 23859, 23861, - 23862, 23863, 23864, 23865, 23866, 23867, 23868, 23871, 23872, 23873, - 23874, 23875, 23876, 23877, 23878, 23880, 23881, 23885, 23886, 23887, - 23888, 23889, 23890, 23891, 23892, 23893, 23894, 23895, 23897, 23898, - 23900, 23902, 23903, 23904, 23905, 23906, 23907, 23908, 23909, 23910, - 23911, 23912, 23914, 23917, 23918, 23920, 23921, 23922, 23923, 23925, - 23926, 23927, 23928, 23929, 23930, 23931, 23932, 23933, 23934, 23935, - 23936, 23937, 23939, 23940, 23941, 23942, 23943, 23944, 23945, 23946, - 23947, 23948, 23949, 23950, 23951, 23952, 23953, 23954, 23955, 23956, - 23957, 23958, 23959, 23960, 23962, 23963, 23964, 23966, 23967, 23968, - 23969, 23970, 23971, 23972, 23973, 23974, 23975, 23976, 23977, 23978, - 23979, 23980, 23981, 23982, 23983, 23984, 23985, 23986, 23987, 23988, - 23989, 23990, 23992, 23993, 23994, 23995, 23996, 23997, 23998, 23999, - 24000, 24001, 24002, 24003, 24004, 24006, 24007, 24008, 24009, 24010, - 24011, 24012, 24014, 24015, 24016, 24017, 24018, 24019, 24020, 24021, - 24022, 24023, 24024, 24025, 24026, 24028, 24031, 24032, 24035, 24036, - 24042, 24044, 24045, 24048, 24053, 24054, 24056, 24057, 24058, 24059, - 24060, 24063, 24064, 24068, 24071, 24073, 24074, 24075, 24077, 24078, - 24082, 24083, 24087, 24094, 24095, 24096, 24097, 24098, 24099, 24100, - 24101, 24104, 24105, 24106, 24107, 24108, 24111, 24112, 24114, 24115, - 24116, 24117, 24118, 24121, 24122, 24126, 24127, 24128, 24129, 24131, - 24134, 24135, 24136, 24137, 24138, 24139, 24141, 24142, 24143, 24144, - 24145, 24146, 24147, 24150, 24151, 24152, 24153, 24154, 24156, 24157, - 24159, 24160, 24163, 24164, 24165, 24166, 24167, 24168, 24169, 24170, - 24171, 24172, 24173, 24174, 24175, 24176, 24177, 24181, 24183, 24185, - 24190, 24193, 24194, 24195, 24197, 24200, 24201, 24204, 24205, 24206, - 24210, 24216, 24219, 24221, 24225, 24226, 24227, 24228, 24232, 24233, - 24234, 24235, 24236, 24238, 24239, 24240, 24241, 24242, 24244, 24250, - 24251, 24252, 24253, 24255, 24256, 24257, 24258, 24259, 24260, 24261, - 24262, 24263, 24264, 24267, 24268, 24269, 24270, 24271, 24272, 24276, - 24277, 24279, 24280, 24281, 24282, 24284, 24285, 24286, 24287, 24288, - 24289, 24290, 24291, 24292, 24293, 24294, 24295, 24297, 24299, 24300, - 24301, 24302, 24303, 24304, 24305, 24306, 24307, 24309, 24312, 24313, - 24315, 24316, 24317, 24325, 24326, 24327, 24329, 24332, 24333, 24334, - 24336, 24338, 24340, 24342, 24345, 24346, 24348, 24349, 24350, 24353, - 24354, 24355, 24356, 24360, 24363, 24364, 24366, 24368, 24370, 24371, - 24372, 24373, 24374, 24375, 24376, 24379, 24381, 24382, 24383, 24385, - 24386, 24387, 24388, 24389, 24390, 24391, 24392, 24393, 24394, 24395, - 24396, 24397, 24398, 24399, 24401, 24404, 24409, 24410, 24411, 24412, - 24414, 24415, 24416, 24419, 24421, 24423, 24424, 24427, 24430, 24431, - 24434, 24436, 24437, 24438, 24440, 24442, 24445, 24446, 24447, 24451, - 24454, 24461, 24462, 24463, 24465, 24467, 24468, 24470, 24474, 24475, - 24477, 24478, 24479, 24480, 24482, 24483, 24484, 24485, 24486, 24487, - 24489, 24491, 24492, 24495, 24496, 24497, 24498, 24499, 24500, 24502, - 24504, 24505, 24506, 24507, 24510, 24511, 24512, 24513, 24514, 24519, - 24520, 24522, 24523, 24526, 24531, 24532, 24533, 24538, 24539, 24540, - 24542, 24543, 24546, 24547, 24549, 24550, 24552, 24553, 24556, 24559, - 24560, 24562, 24563, 24564, 24566, 24567, 24569, 24570, 24572, 24583, - 24584, 24585, 24587, 24588, 24592, 24593, 24595, 24599, 24600, 24602, - 24606, 24607, 24610, 24611, 24612, 24620, 24621, 24622, 24624, 24625, - 24626, 24627, 24628, 24630, 24631, 24632, 24633, 24634, 24637, 24638, - 24640, 24644, 24645, 24646, 24647, 24648, 24649, 24650, 24652, 24654, - 24655, 24657, 24659, 24660, 24662, 24663, 24664, 24667, 24668, 24670, - 24671, 24672, 24673, 24677, 24678, 24686, 24689, 24690, 24692, 24693, - 24695, 24702, 24704, 24705, 24706, 24709, 24710, 24711, 24712, 24714, - 24715, 24718, 24719, 24720, 24721, 24723, 24725, 24727, 24728, 24729, - 24732, 24734, 24737, 24738, 24740, 24741, 24743, 24745, 24746, 24750, - 24752, 24755, 24757, 24758, 24759, 24761, 24762, 24765, 24766, 24767, - 24768, 24769, 24770, 24771, 24772, 24775, 24776, 24777, 24780, 24781, - 24782, 24783, 24784, 24786, 24787, 24788, 24790, 24791, 24793, 24795, - 24798, 24801, 24802, 24803, 24804, 24805, 24810, 24817, 24818, 24821, - 24823, 24824, 24827, 24828, 24829, 24830, 24831, 24834, 24835, 24836, - 24837, 24839, 24842, 24843, 24844, 24848, 24849, 24850, 24851, 24852, - 24854, 24855, 24856, 24857, 24859, 24860, 24861, 24862, 24865, 24866, - 24869, 24872, 24873, 24874, 24876, 24877, 24878, 24879, 24880, 24881, - 24882, 24883, 24884, 24885, 24886, 24887, 24888, 24889, 24890, 24891, - 24892, 24893, 24894, 24896, 24897, 24898, 24899, 24900, 24901, 24902, - 24903, 24905, 24907, 24909, 24911, 24912, 24914, 24915, 24916, 24918, - 24919, 24920, 24921, 24922, 24923, 24924, 24926, 24927, 24928, 24929, - 24931, 24932, 24933, 24934, 24937, 24938, 24939, 24940, 24941, 24942, - 24943, 24945, 24946, 24947, 24948, 24950, 24952, 24953, 24954, 24955, - 24956, 24957, 24958, 24959, 24960, 24961, 24962, 24963, 24964, 24965, - 24966, 24967, 24968, 24969, 24970, 24972, 24973, 24975, 24976, 24977, - 24978, 24979, 24981, 24982, 24983, 24984, 24985, 24986, 24987, 24988, - 24990, 24991, 24992, 24993, 24994, 24995, 24996, 24997, 24998, 25002, - 25003, 25005, 25006, 25007, 25008, 25009, 25010, 25011, 25012, 25013, - 25014, 25016, 25017, 25018, 25019, 25020, 25021, 25023, 25024, 25025, - 25027, 25028, 25029, 25030, 25031, 25033, 25036, 25037, 25038, 25039, - 25040, 25043, 25045, 25046, 25047, 25048, 25049, 25050, 25051, 25052, - 25053, 25054, 25055, 25056, 25057, 25058, 25059, 25060, 25061, 25063, - 25064, 25065, 25066, 25067, 25068, 25069, 25070, 25071, 25072, 25073, - 25074, 25075, 25076, 25078, 25079, 25080, 25081, 25082, 25083, 25084, - 25085, 25086, 25088, 25089, 25090, 25091, 25092, 25093, 25095, 25097, - 25107, 25108, 25113, 25116, 25117, 25118, 25120, 25123, 25126, 25127, - 25128, 25129, 25131, 25133, 25135, 25136, 25137, 25138, 25141, 25142, - 25144, 25145, 25146, 25147, 25148, 25154, 25156, 25157, 25158, 25162, - 25167, 25168, 25173, 25174, 25175, 25177, 25178, 25180, 25181, 25182, - 25183, 25184, 25185, 25186, 25188, 25189, 25192, 25201, 25202, 25204, - 25205, 25207, 25208, 25210, 25211, 25213, 25217, 25218, 25219, 25221, - 25222, 25223, 25224, 25227, 25228, 25229, 25230, 25231, 25232, 25236, - 25241, 25244, 25245, 25246, 25251, 25254, 25255, 25257, 25258, 25261, - 25262, 25263, 25264, 25266, 25267, 25268, 25270, 25271, 25272, 25274, - 25278, 25280, 25281, 25283, 25291, 25295, 25297, 25301, 25309, 25310, - 25312, 25313, 25316, 25322, 25323, 25328, 25330, 25333, 25336, 25337, - 25338, 25339, 25344, 25347, 25348, 25349, 25350, 25354, 25355, 25356, - 25357, 25359, 25360, 25362, 25363, 25364, 25365, 25367, 25368, 25369, - 25372, 25382, 25383, 25385, 25388, 25389, 25390, 25392, 25393, 25395, - 25396, 25397, 25398, 25399, 25400, 25403, 25404, 25406, 25407, 25408, - 25409, 25412, 25415, 25416, 25418, 25425, 25426, 25427, 25428, 25430, - 25431, 25432, 25433, 25434, 25435, 25436, 25437, 25440, 25444, 25445, - 25446, 25448, 25450, 25451, 25452, 25455, 25456, 25458, 25459, 25460, - 25461, 25464, 25465, 25468, 25469, 25470, 25471, 25473, 25475, 25476, - 25477, 25478, 25483, 25485, 25489, 25491, 25492, 25493, 25495, 25497, - 25498, 25499, 25500, 25501, 25502, 25503, 25505, 25508, 25510, 25515, - 25519, 25521, 25522, 25525, 25526, 25529, 25531, 25533, 25535, 25536, - 25537, 25538, 25539, 25541, 25543, 25544, 25546, 25547, 25548, 25553, - 25555, 25556, 25557, 25559, 25560, 25561, 25562, 25563, 25564, 25565, - 25567, 25570, 25572, 25573, 25574, 25575, 25576, 25579, 25580, 25582, - 25583, 25584, 25585, 25587, 25589, 25591, 25593, 25594, 25595, 25596, - 25598, 25603, 25604, 25606, 25607, 25608, 25609, 25610, 25613, 25614, - 25617, 25618, 25621, 25622, 25623, 25624, 25625, 25626, 25629, 25631, - 25634, 25635, 25636, 25637, 25639, 25640, 25641, 25643, 25646, 25647, - 25648, 25649, 25650, 25651, 25653, 25654, 25655, 25656, 25657, 25659, - 25660, 25662, 25664, 25666, 25667, 25673, 25675, 25676, 25677, 25678, - 25679, 25680, 25681, 25683, 25685, 25686, 25687, 25689, 25690, 25691, - 25692, 25693, 25695, 25696, 25697, 25698, 25699, 25700, 25701, 25702, - 25704, 25706, 25707, 25708, 25710, 25711, 25712, 25713, 25714, 25715, - 25716, 25717, 25718, 25719, 25723, 25724, 25725, 25726, 25727, 25728, - 25729, 25731, 25734, 25736, 25737, 25738, 25739, 25740, 25741, 25742, - 25743, 25744, 25747, 25748, 25751, 25752, 25754, 25755, 25756, 25757, - 25759, 25760, 25761, 25762, 25763, 25765, 25766, 25767, 25768, 25770, - 25771, 25775, 25777, 25778, 25779, 25780, 25782, 25785, 25787, 25789, - 25790, 25791, 25793, 25795, 25796, 25798, 25799, 25800, 25801, 25802, - 25803, 25804, 25807, 25809, 25811, 25812, 25813, 25814, 25817, 25818, - 25819, 25820, 25821, 25823, 25824, 25825, 25827, 25829, 25831, 25832, - 25833, 25834, 25835, 25836, 25837, 25838, 25839, 25840, 25841, 25842, - 25843, 25844, 25845, 25846, 25847, 25848, 25849, 25850, 25851, 25852, - 25853, 25854, 25855, 25857, 25858, 25859, 25860, 25861, 25862, 25863, - 25864, 25866, 25867, 25868, 25869, 25870, 25871, 25872, 25873, 25875, - 25876, 25877, 25878, 25879, 25881, 25882, 25883, 25884, 25885, 25886, - 25887, 25888, 25889, 25890, 25891, 25892, 25894, 25895, 25896, 25897, - 25898, 25900, 25901, 25904, 25905, 25906, 25907, 25911, 25914, 25916, - 25917, 25920, 25921, 25922, 25923, 25924, 25926, 25927, 25930, 25931, - 25933, 25934, 25936, 25938, 25939, 25940, 25943, 25944, 25946, 25948, - 25951, 25952, 25953, 25956, 25957, 25959, 25960, 25961, 25962, 25965, - 25966, 25967, 25969, 25971, 25973, 25974, 25976, 25977, 25978, 25979, - 25980, 25981, 25982, 25983, 25984, 25985, 25986, 25987, 25988, 25989, - 25990, 25992, 25993, 25994, 25997, 25998, 25999, 26002, 26004, 26005, - 26006, 26008, 26010, 26013, 26014, 26016, 26018, 26019, 26022, 26024, - 26026, 26028, 26030, 26033, 26034, 26035, 26036, 26037, 26038, 26039, - 26040, 26042, 26043, 26046, 26047, 26048, 26050, 26055, 26056, 26057, - 26058, 26061, 26064, 26065, 26067, 26068, 26069, 26072, 26073, 26074, - 26075, 26076, 26077, 26078, 26079, 26081, 26083, 26084, 26090, 26091, - 26098, 26099, 26100, 26101, 26104, 26105, 26107, 26108, 26109, 26110, - 26111, 26113, 26116, 26117, 26119, 26120, 26121, 26123, 26125, 26128, - 26129, 26130, 26134, 26135, 26136, 26138, 26139, 26140, 26142, 26145, - 26146, 26147, 26148, 26150, 26153, 26154, 26155, 26156, 26158, 26160, - 26162, 26163, 26167, 26168, 26169, 26170, 26171, 26173, 26175, 26176, - 26178, 26180, 26181, 26182, 26183, 26184, 26185, 26186, 26189, 26190, - 26192, 26193, 26200, 26201, 26203, 26204, 26205, 26206, 26208, 26210, - 26211, 26213, 26215, 26217, 26218, 26219, 26220, 26221, 26225, 26226, - 26227, 26229, 26232, 26233, 26235, 26236, 26237, 26239, 26240, 26241, - 26243, 26245, 26246, 26248, 26249, 26250, 26251, 26253, 26254, 26255, - 26256, 26258, 26259, 26260, 26261, 26264, 26265, 26266, 26267, 26268, - 26270, 26271, 26272, 26273, 26274, 26275, 26276, 26277, 26278, 26281, - 26282, 26283, 26284, 26285, 26287, 26288, 26289, 26290, 26291, 26293, - 26294, 26295, 26296, 26298, 26299, 26300, 26301, 26303, 26304, 26305, - 26306, 26307, 26308, 26309, 26310, 26311, 26312, 26313, 26314, 26315, - 26316, 26317, 26318, 26319, 26320, 26321, 26322, 26323, 26324, 26325, - 26326, 26327, 26328, 26330, 26334, 26335, 26336, 26337, 26338, 26339, - 26340, 26341, 26343, 26344, 26346, 26347, 26348, 26349, 26350, 26351, - 26353, 26357, 26358, 26360, 26362, 26363, 26365, 26369, 26370, 26371, - 26372, 26373, 26374, 26375, 26380, 26382, 26383, 26385, 26386, 26387, - 26390, 26392, 26393, 26394, 26396, 26398, 26400, 26401, 26402, 26403, - 26404, 26405, 26407, 26409, 26414, 26416, 26418, 26419, 26422, 26423, - 26424, 26425, 26427, 26428, 26430, 26431, 26433, 26436, 26437, 26439, - 26442, 26443, 26445, 26450, 26452, 26453, 26455, 26456, 26457, 26458, - 26459, 26461, 26466, 26467, 26468, 26470, 26471, 26475, 26476, 26478, - 26481, 26484, 26486, 26488, 26489, 26490, 26491, 26493, 26496, 26498, - 26499, 26501, 26502, 26504, 26506, 26508, 26509, 26510, 26511, 26513, - 26514, 26515, 26516, 26518, 26521, 26523, 26527, 26528, 26529, 26532, - 26534, 26537, 26540, 26542, 26545, 26546, 26548, 26553, 26554, 26555, - 26556, 26557, 26558, 26559, 26560, 26562, 26565, 26566, 26567, 26568, - 26569, 26570, 26571, 26572, 26573, 26574, 26581, 26582, 26583, 26587, - 26591, 26593, 26595, 26596, 26598, 26599, 26600, 26602, 26603, 26605, - 26606, 26610, 26613, 26614, 26615, 26616, 26617, 26618, 26619, 26620, - 26622, 26625, 26626, 26627, 26628, 26630, 26637, 26640, 26642, 26644, - 26645, 26648, 26649, 26650, 26651, 26652, 26654, 26655, 26656, 26658, - 26659, 26660, 26661, 26662, 26663, 26664, 26667, 26668, 26669, 26670, - 26671, 26672, 26673, 26676, 26677, 26678, 26682, 26683, 26687, 26695, - 26699, 26701, 26703, 26706, 26710, 26711, 26712, 26713, 26714, 26715, - 26716, 26717, 26718, 26719, 26730, 26732, 26733, 26734, 26735, 26736, - 26737, 26738, 26739, 26741, 26744, 26745, 26746, 26747, 26748, 26749, - 26750, 26751, 26752, 26754, 26756, 26759, 26760, 26761, 26762, 26763, - 26764, 26765, 26766, 26768, 26769, 26770, 26772, 26773, 26774, 26776, - 26777, 26778, 26779, 26780, 26781, 26782, 26783, 26784, 26785, 26787, - 26788, 26789, 26793, 26794, 26795, 26796, 26798, 26801, 26802, 26804, - 26806, 26807, 26808, 26809, 26810, 26811, 26812, 26813, 26814, 26815, - 26817, 26819, 26820, 26821, 26822, 26823, 26824, 26826, 26828, 26830, - 26831, 26832, 26833, 26835, 26836, 26838, 26839, 26841, 26843, 26844, - 26845, 26846, 26847, 26849, 26850, 26852, 26853, 26854, 26855, 26856, - 26857, 26858, 26859, 26860, 26861, 26863, 26866, 26867, 26868, 26870, - 26871, 26872, 26875, 26877, 26878, 26879, 26880, 26882, 26883, 26884, - 26886, 26887, 26888, 26889, 26890, 26892, 26895, 26897, 26899, 26900, - 26901, 26902, 26903, 26904, 26905, 26906, 26907, 26908, 26909, 26910, - 26913, 26914, 26915, 26917, 26918, 26919, 26920, 26921, 26922, 26923, - 26924, 26926, 26927, 26929, 26930, 26931, 26933, 26934, 26935, 26936, - 26938, 26939, 26940, 26942, 26944, 26945, 26947, 26948, 26949, 26950, - 26951, 26952, 26953, 26954, 26955, 26956, 26957, 26958, 26959, 26960, - 26961, 26962, 26963, 26965, 26966, 26968, 26969, 26971, 26972, 26975, - 26977, 26978, 26980, 26981, 26983, 26984, 26985, 26986, 26988, 26989, - 26991, 26992, 26994, 26995, 26996, 26997, 26998, 27002, 27003, 27005, - 27006, 27007, 27009, 27011, 27013, 27018, 27019, 27020, 27022, 27023, - 27024, 27025, 27026, 27027, 27030, 27031, 27033, 27034, 27037, 27038, - 27039, 27040, 27041, 27042, 27043, 27044, 27045, 27046, 27049, 27050, - 27052, 27054, 27055, 27056, 27058, 27059, 27061, 27062, 27064, 27065, - 27066, 27068, 27069, 27070, 27071, 27072, 27074, 27075, 27076, 27077, - 27078, 27079, 27080, 27081, 27083, 27085, 27087, 27089, 27090, 27091, - 27093, 27094, 27095, 27096, 27097, 27098, 27100, 27101, 27102, 27105, - 27106, 27107, 27108, 27109, 27110, 27111, 27112, 27113, 27114, 27115, - 27116, 27118, 27119, 27120, 27121, 27123, 27124, 27125, 27126, 27127, - 27128, 27129, 27130, 27131, 27132, 27134, 27136, 27137, 27138, 27139, - 27140, 27141, 27142, 27143, 27144, 27145, 27147, 27148, 27149, 27150, - 27151, 27152, 27153, 27154, 27155, 27156, 27157, 27158, 27161, 27162, - 27163, 27164, 27165, 27166, 27168, 27170, 27171, 27172, 27173, 27174, - 27175, 27177, 27179, 27180, 27181, 27182, 27184, 27186, 27187, 27188, - 27190, 27191, 27192, 27193, 27194, 27195, 27196, 27199, 27200, 27201, - 27202, 27203, 27205, 27206, 27208, 27209, 27210, 27211, 27212, 27213, - 27214, 27215, 27217, 27218, 27219, 27220, 27221, 27222, 27223, 27226, - 27228, 27229, 27230, 27231, 27232, 27234, 27235, 27236, 27238, 27239, - 27240, 27241, 27242, 27243, 27244, 27245, 27246, 27247, 27248, 27250, - 27251, 27252, 27253, 27254, 27255, 27256, 27258, 27259, 27261, 27262, - 27263, 27265, 27266, 27267, 27269, 27270, 27271, 27272, 27273, 27274, - 27275, 27276, 27277, 27279, 27282, 27283, 27284, 27285, 27286, 27288, - 27289, 27290, 27291, 27292, 27293, 27294, 27295, 27297, 27298, 27299, - 27300, 27301, 27302, 27303, 27304, 27306, 27309, 27310, 27311, 27312, - 27313, 27314, 27315, 27316, 27317, 27318, 27319, 27320, 27321, 27322, - 27323, 27324, 27325, 27326, 27327, 27328, 27329, 27330, 27331, 27332, - 27333, 27334, 27335, 27336, 27337, 27338, 27339, 27340, 27341, 27342, - 27343, 27344, 27345, 27346, 27347, 27348, 27349, 27350, 27351, 27352, - 27353, 27354, 27355, 27356, 27357, 27358, 27359, 27360, 27361, 27362, - 27363, 27364, 27365, 27366, 27367, 27368, 27369, 27370, 27371, 27372, - 27373, 27374, 27375, 27376, 27377, 27378, 27379, 27380, 27381, 27382, - 27383, 27384, 27385, 27386, 27387, 27388, 27389, 27390, 27391, 27392, - 27393, 27394, 27395, 27396, 27397, 27398, 27399, 27400, 27401, 27402, - 27403, 27404, 27405, 27406, 27407, 27408, 27409, 27410, 27411, 27412, - 27413, 27414, 27415, 27416, 27417, 27418, 27419, 27420, 27421, 27422, - 27423, 27429, 27430, 27432, 27433, 27434, 27435, 27436, 27437, 27438, - 27439, 27440, 27441, 27443, 27444, 27445, 27446, 27448, 27451, 27452, - 27453, 27455, 27456, 27457, 27458, 27460, 27461, 27464, 27466, 27467, - 27469, 27470, 27471, 27472, 27473, 27474, 27475, 27476, 27477, 27478, - 27479, 27480, 27482, 27483, 27484, 27485, 27486, 27487, 27488, 27489, - 27496, 27497, 27499, 27500, 27501, 27502, 27503, 27504, 27505, 27506, - 27507, 27508, 27509, 27510, 27511, 27512, 27514, 27517, 27518, 27519, - 27520, 27525, 27528, 27532, 27534, 27535, 27536, 27537, 27540, 27541, - 27543, 27544, 27545, 27548, 27549, 27550, 27551, 27552, 27554, 27555, - 27556, 27557, 27558, 27559, 27560, 27561, 27563, 27564, 27565, 27566, - 27567, 27568, 27569, 27570, 27574, 27576, 27577, 27578, 27579, 27580, - 27581, 27582, 27584, 27587, 27588, 27590, 27591, 27592, 27593, 27594, - 27596, 27598, 27600, 27601, 27608, 27610, 27612, 27613, 27614, 27615, - 27616, 27618, 27619, 27620, 27621, 27622, 27623, 27624, 27625, 27628, - 27629, 27630, 27632, 27633, 27634, 27636, 27638, 27639, 27640, 27642, - 27643, 27644, 27646, 27647, 27648, 27649, 27650, 27651, 27652, 27656, - 27657, 27658, 27659, 27660, 27662, 27666, 27671, 27676, 27677, 27678, - 27680, 27683, 27685, 27691, 27692, 27693, 27697, 27699, 27702, 27703, - 27705, 27706, 27707, 27708, 27710, 27711, 27715, 27716, 27717, 27720, - 27723, 27724, 27725, 27726, 27727, 27729, 27730, 27731, 27734, 27736, - 27737, 27738, 27746, 27747, 27749, 27750, 27751, 27755, 27756, 27757, - 27758, 27759, 27761, 27763, 27765, 27767, 27768, 27770, 27771, 27772, - 27775, 27776, 27780, 27783, 27786, 27787, 27789, 27790, 27793, 27794, - 27797, 27798, 27799, 27800, 27802, 27804, 27805, 27806, 27808, 27810, - 27816, 27820, 27823, 27824, 27828, 27829, 27830, 27831, 27834, 27840, - 27841, 27842, 27843, 27846, 27847, 27848, 27851, 27853, 27854, 27855, - 27857, 27858, 27864, 27865, 27866, 27868, 27869, 27871, 27876, 27878, - 27879, 27881, 27884, 27885, 27890, 27892, 27897, 27903, 27904, 27906, - 27907, 27909, 27910, 27912, 27913, 27914, 27917, 27919, 27920, 27921, - 27923, 27924, 27925, 27926, 27928, 27932, 27933, 27935, 27936, 27937, - 27938, 27939, 27940, 27942, 27944, 27945, 27948, 27949, 27951, 27952, - 27956, 27958, 27959, 27960, 27962, 27967, 27968, 27970, 27972, 27977, - 27980, 27984, 27989, 27990, 27991, 27992, 27995, 27997, 27999, 28001, - 28002, 28004, 28005, 28007, 28008, 28011, 28012, 28013, 28016, 28017, - 28018, 28019, 28021, 28022, 28025, 28026, 28027, 28029, 28030, 28031, - 28032, 28033, 28035, 28036, 28038, 28039, 28042, 28043, 28045, 28047, - 28048, 28050, 28054, 28055, 28056, 28057, 28058, 28060, 28066, 28069, - 28076, 28077, 28080, 28081, 28083, 28084, 28086, 28087, 28089, 28090, - 28091, 28092, 28093, 28094, 28097, 28098, 28099, 28104, 28105, 28106, - 28109, 28110, 28111, 28112, 28114, 28115, 28116, 28117, 28119, 28122, - 28123, 28124, 28127, 28130, 28131, 28133, 28135, 28136, 28137, 28138, - 28141, 28143, 28144, 28146, 28148, 28149, 28150, 28152, 28154, 28157, - 28158, 28159, 28160, 28161, 28162, 28163, 28164, 28166, 28167, 28168, - 28169, 28171, 28175, 28178, 28179, 28181, 28184, 28185, 28187, 28188, - 28190, 28191, 28194, 28198, 28199, 28200, 28202, 28204, 28206, 28208, - 28209, 28211, 28213, 28214, 28215, 28217, 28219, 28220, 28221, 28222, - 28223, 28224, 28225, 28226, 28229, 28230, 28231, 28232, 28233, 28234, - 28235, 28236, 28239, 28240, 28241, 28242, 28245, 28247, 28249, 28250, - 28252, 28253, 28254, 28256, 28257, 28258, 28259, 28260, 28261, 28262, - 28263, 28264, 28265, 28266, 28268, 28269, 28271, 28272, 28273, 28274, - 28275, 28276, 28277, 28278, 28279, 28280, 28281, 28282, 28283, 28284, - 28285, 28288, 28289, 28290, 28292, 28295, 28296, 28298, 28299, 28300, - 28301, 28302, 28305, 28306, 28307, 28308, 28309, 28310, 28311, 28313, - 28314, 28315, 28317, 28318, 28320, 28321, 28323, 28324, 28326, 28328, - 28329, 28331, 28332, 28333, 28334, 28336, 28339, 28341, 28344, 28345, - 28348, 28350, 28351, 28352, 28355, 28356, 28357, 28358, 28360, 28361, - 28362, 28364, 28365, 28366, 28368, 28370, 28374, 28376, 28377, 28379, - 28380, 28381, 28387, 28391, 28394, 28395, 28396, 28397, 28398, 28399, - 28400, 28401, 28402, 28403, 28405, 28406, 28407, 28408, 28410, 28411, - 28412, 28413, 28414, 28415, 28416, 28417, 28419, 28420, 28421, 28423, - 28424, 28426, 28427, 28428, 28429, 28430, 28432, 28433, 28434, 28438, - 28439, 28440, 28441, 28442, 28443, 28444, 28445, 28446, 28447, 28449, - 28450, 28451, 28453, 28454, 28455, 28456, 28460, 28462, 28464, 28466, - 28468, 28469, 28471, 28472, 28473, 28474, 28475, 28476, 28477, 28479, - 28480, 28481, 28482, 28483, 28484, 28485, 28488, 28489, 28490, 28492, - 28494, 28495, 28496, 28497, 28498, 28499, 28500, 28501, 28502, 28503, - 28505, 28506, 28507, 28509, 28511, 28512, 28513, 28515, 28516, 28517, - 28519, 28520, 28521, 28522, 28523, 28524, 28527, 28528, 28529, 28531, - 28533, 28534, 28535, 28537, 28539, 28541, 28542, 28543, 28544, 28545, - 28546, 28547, 28549, 28550, 28551, 28554, 28555, 28559, 28560, 28561, - 28562, 28563, 28564, 28565, 28566, 28567, 28568, 28569, 28570, 28571, - 28573, 28574, 28575, 28576, 28578, 28579, 28580, 28581, 28582, 28584, - 28585, 28586, 28587, 28588, 28589, 28590, 28591, 28592, 28593, 28594, - 28596, 28597, 28599, 28600, 28602, 28603, 28604, 28605, 28606, 28607, - 28609, 28611, 28612, 28613, 28614, 28615, 28616, 28618, 28619, 28620, - 28621, 28622, 28623, 28624, 28627, 28628, 28629, 28630, 28631, 28632, - 28633, 28634, 28635, 28636, 28637, 28639, 28642, 28643, 28644, 28645, - 28646, 28647, 28648, 28649, 28650, 28651, 28652, 28653, 28656, 28657, - 28658, 28659, 28660, 28661, 28662, 28663, 28664, 28665, 28666, 28667, - 28668, 28669, 28670, 28671, 28672, 28673, 28674, 28675, 28676, 28677, - 28678, 28679, 28680, 28681, 28682, 28683, 28684, 28685, 28686, 28687, - 28688, 28690, 28691, 28692, 28693, 28694, 28695, 28696, 28697, 28700, - 28701, 28702, 28703, 28704, 28705, 28706, 28708, 28709, 28710, 28711, - 28712, 28713, 28714, 28715, 28716, 28717, 28718, 28719, 28720, 28721, - 28722, 28723, 28724, 28726, 28727, 28728, 28730, 28731, 28732, 28733, - 28734, 28735, 28736, 28737, 28738, 28739, 28740, 28741, 28742, 28743, - 28744, 28745, 28746, 28747, 28749, 28750, 28752, 28753, 28754, 28755, - 28756, 28757, 28758, 28759, 28760, 28761, 28762, 28763, 28764, 28765, - 28767, 28768, 28769, 28770, 28771, 28772, 28773, 28774, 28775, 28776, - 28777, 28778, 28782, 28785, 28786, 28787, 28788, 28791, 28793, 28794, - 28795, 28797, 28801, 28802, 28803, 28804, 28806, 28807, 28808, 28811, - 28812, 28813, 28815, 28816, 28817, 28819, 28823, 28824, 28826, 28827, - 28830, 28831, 28832, 28833, 28834, 28835, 28836, 28837, 28838, 28839, - 28840, 28841, 28842, 28848, 28850, 28852, 28853, 28854, 28858, 28862, - 28863, 28868, 28869, 28870, 28871, 28873, 28875, 28876, 28877, 28878, - 28879, 28880, 28881, 28882, 28883, 28884, 28885, 28886, 28887, 28890, - 28892, 28893, 28894, 28896, 28897, 28898, 28899, 28901, 28906, 28910, - 28912, 28913, 28914, 28915, 28916, 28917, 28918, 28920, 28922, 28923, - 28924, 28926, 28927, 28928, 28929, 28930, 28931, 28932, 28933, 28934, - 28935, 28936, 28939, 28940, 28941, 28942, 28943, 28945, 28946, 28948, - 28951, 28955, 28956, 28957, 28958, 28959, 28960, 28961, 28962, 28963, - 28964, 28965, 28967, 28968, 28969, 28970, 28971, 28972, 28973, 28974, - 28978, 28979, 28980, 28981, 28983, 28984, 28985, 28986, 28987, 28988, - 28989, 28990, 28991, 28992, 28993, 28994, 28995, 28996, 28998, 28999, - 29000, 29001, 29003, 29005, 29007, 29008, 29009, 29010, 29011, 29012, - 29013, 29014, 29015, 29016, 29017, 29018, 29019, 29021, 29023, 29024, - 29025, 29026, 29027, 29029, 29033, 29034, 29035, 29036, 29037, 29039, - 29040, 29041, 29044, 29045, 29046, 29047, 29049, 29051, 29052, 29054, - 29055, 29056, 29057, 29058, 29059, 29061, 29062, 29063, 29064, 29065, - 29067, 29068, 29069, 29070, 29072, 29073, 29074, 29075, 29077, 29078, - 29079, 29082, 29083, 29084, 29085, 29086, 29089, 29090, 29091, 29092, - 29093, 29094, 29095, 29097, 29098, 29099, 29101, 29102, 29103, 29104, - 29105, 29106, 29108, 29110, 29111, 29112, 29114, 29115, 29116, 29117, - 29118, 29119, 29120, 29121, 29122, 29124, 29125, 29126, 29127, 29128, - 29129, 29130, 29131, 29132, 29133, 29135, 29136, 29137, 29138, 29139, - 29142, 29143, 29144, 29145, 29146, 29147, 29148, 29149, 29150, 29151, - 29153, 29154, 29155, 29156, 29158, 29160, 29161, 29162, 29163, 29164, - 29165, 29167, 29168, 29169, 29170, 29171, 29172, 29173, 29174, 29175, - 29176, 29178, 29179, 29180, 29181, 29182, 29183, 29184, 29185, 29186, - 29187, 29188, 29189, 29191, 29192, 29193, 29194, 29195, 29196, 29197, - 29198, 29199, 29200, 29201, 29202, 29203, 29204, 29205, 29206, 29207, - 29208, 29209, 29210, 29211, 29212, 29214, 29215, 29216, 29217, 29218, - 29219, 29220, 29221, 29222, 29223, 29225, 29227, 29229, 29230, 29231, - 29234, 29235, 29236, 29242, 29244, 29246, 29248, 29249, 29250, 29251, - 29252, 29253, 29254, 29257, 29258, 29259, 29262, 29263, 29264, 29265, - 29267, 29268, 29269, 29271, 29272, 29274, 29276, 29278, 29280, 29283, - 29284, 29285, 29288, 29290, 29291, 29292, 29293, 29296, 29297, 29299, - 29300, 29302, 29303, 29304, 29307, 29308, 29309, 29314, 29315, 29317, - 29318, 29319, 29320, 29321, 29324, 29326, 29328, 29329, 29331, 29332, - 29333, 29334, 29335, 29336, 29337, 29338, 29339, 29340, 29341, 29342, - 29344, 29345, 29346, 29347, 29348, 29349, 29350, 29351, 29352, 29353, - 29354, 29355, 29358, 29361, 29362, 29363, 29365, 29370, 29371, 29372, - 29373, 29374, 29375, 29376, 29381, 29382, 29383, 29385, 29386, 29387, - 29388, 29391, 29393, 29395, 29396, 29397, 29398, 29400, 29402, 29403, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 12288, 12289, 12290, 183, 713, - 711, 168, 12291, 12293, 8212, 65374, 8214, 8230, 8216, 8217, 8220, 8221, - 12308, 12309, 12296, 12297, 12298, 12299, 12300, 12301, 12302, 12303, - 12310, 12311, 12304, 12305, 177, 215, 247, 8758, 8743, 8744, 8721, 8719, - 8746, 8745, 8712, 8759, 8730, 8869, 8741, 8736, 8978, 8857, 8747, 8750, - 8801, 8780, 8776, 8765, 8733, 8800, 8814, 8815, 8804, 8805, 8734, 8757, - 8756, 9794, 9792, 176, 8242, 8243, 8451, 65284, 164, 65504, 65505, 8240, - 167, 8470, 9734, 9733, 9675, 9679, 9678, 9671, 9670, 9633, 9632, 9651, - 9650, 8251, 8594, 8592, 8593, 8595, 12307, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 8560, 8561, 8562, 8563, 8564, 8565, 8566, 8567, 8568, 8569, - 65535, 65535, 65535, 65535, 65535, 65535, 9352, 9353, 9354, 9355, 9356, - 9357, 9358, 9359, 9360, 9361, 9362, 9363, 9364, 9365, 9366, 9367, 9368, - 9369, 9370, 9371, 9332, 9333, 9334, 9335, 9336, 9337, 9338, 9339, 9340, - 9341, 9342, 9343, 9344, 9345, 9346, 9347, 9348, 9349, 9350, 9351, 9312, - 9313, 9314, 9315, 9316, 9317, 9318, 9319, 9320, 9321, 8364, 65535, 12832, - 12833, 12834, 12835, 12836, 12837, 12838, 12839, 12840, 12841, 65535, - 65535, 8544, 8545, 8546, 8547, 8548, 8549, 8550, 8551, 8552, 8553, 8554, - 8555, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 12288, 65281, 65282, - 65283, 65509, 65285, 65286, 65287, 65288, 65289, 65290, 65291, 65292, - 65293, 65294, 65295, 65296, 65297, 65298, 65299, 65300, 65301, 65302, - 65303, 65304, 65305, 65306, 65307, 65308, 65309, 65310, 65311, 65312, - 65313, 65314, 65315, 65316, 65317, 65318, 65319, 65320, 65321, 65322, - 65323, 65324, 65325, 65326, 65327, 65328, 65329, 65330, 65331, 65332, - 65333, 65334, 65335, 65336, 65337, 65338, 65339, 65340, 65341, 65342, - 65343, 65344, 65345, 65346, 65347, 65348, 65349, 65350, 65351, 65352, - 65353, 65354, 65355, 65356, 65357, 65358, 65359, 65360, 65361, 65362, - 65363, 65364, 65365, 65366, 65367, 65368, 65369, 65370, 65371, 65372, - 65373, 65507, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 12353, 12354, - 12355, 12356, 12357, 12358, 12359, 12360, 12361, 12362, 12363, 12364, - 12365, 12366, 12367, 12368, 12369, 12370, 12371, 12372, 12373, 12374, - 12375, 12376, 12377, 12378, 12379, 12380, 12381, 12382, 12383, 12384, - 12385, 12386, 12387, 12388, 12389, 12390, 12391, 12392, 12393, 12394, - 12395, 12396, 12397, 12398, 12399, 12400, 12401, 12402, 12403, 12404, - 12405, 12406, 12407, 12408, 12409, 12410, 12411, 12412, 12413, 12414, - 12415, 12416, 12417, 12418, 12419, 12420, 12421, 12422, 12423, 12424, - 12425, 12426, 12427, 12428, 12429, 12430, 12431, 12432, 12433, 12434, - 12435, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 12449, 12450, - 12451, 12452, 12453, 12454, 12455, 12456, 12457, 12458, 12459, 12460, - 12461, 12462, 12463, 12464, 12465, 12466, 12467, 12468, 12469, 12470, - 12471, 12472, 12473, 12474, 12475, 12476, 12477, 12478, 12479, 12480, - 12481, 12482, 12483, 12484, 12485, 12486, 12487, 12488, 12489, 12490, - 12491, 12492, 12493, 12494, 12495, 12496, 12497, 12498, 12499, 12500, - 12501, 12502, 12503, 12504, 12505, 12506, 12507, 12508, 12509, 12510, - 12511, 12512, 12513, 12514, 12515, 12516, 12517, 12518, 12519, 12520, - 12521, 12522, 12523, 12524, 12525, 12526, 12527, 12528, 12529, 12530, - 12531, 12532, 12533, 12534, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 913, 914, 915, 916, - 917, 918, 919, 920, 921, 922, 923, 924, 925, 926, 927, 928, 929, 931, 932, - 933, 934, 935, 936, 937, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 945, 946, 947, 948, 949, 950, 951, 952, 953, 954, 955, 956, 957, - 958, 959, 960, 961, 963, 964, 965, 966, 967, 968, 969, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65077, 65078, 65081, 65082, 65087, 65088, - 65085, 65086, 65089, 65090, 65091, 65092, 65535, 65535, 65083, 65084, - 65079, 65080, 65073, 65535, 65075, 65076, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 1040, 1041, 1042, 1043, 1044, 1045, 1025, 1046, 1047, 1048, 1049, - 1050, 1051, 1052, 1053, 1054, 1055, 1056, 1057, 1058, 1059, 1060, 1061, - 1062, 1063, 1064, 1065, 1066, 1067, 1068, 1069, 1070, 1071, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 1072, 1073, 1074, 1075, 1076, 1077, 1105, 1078, 1079, - 1080, 1081, 1082, 1083, 1084, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 1094, 1095, 1096, 1097, 1098, 1099, 1100, 1101, 1102, 1103, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 714, 715, 729, 8211, 8213, 8229, 8245, 8453, 8457, - 8598, 8599, 8600, 8601, 8725, 8735, 8739, 8786, 8806, 8807, 8895, 9552, - 9553, 9554, 9555, 9556, 9557, 9558, 9559, 9560, 9561, 9562, 9563, 9564, - 9565, 9566, 9567, 9568, 9569, 9570, 9571, 9572, 9573, 9574, 9575, 9576, - 9577, 9578, 9579, 9580, 9581, 9582, 9583, 9584, 9585, 9586, 9587, 9601, - 9602, 9603, 9604, 9605, 9606, 9607, 9608, 9609, 9610, 9611, 9612, 9613, - 9614, 9615, 9619, 9620, 9621, 9660, 9661, 9698, 9699, 9700, 9701, 9737, - 8853, 12306, 12317, 12318, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 257, 225, 462, 224, 275, 233, 283, 232, 299, - 237, 464, 236, 333, 243, 466, 242, 363, 250, 468, 249, 470, 472, 474, 476, - 252, 234, 593, 65535, 324, 328, 505, 609, 65535, 65535, 65535, 65535, - 12549, 12550, 12551, 12552, 12553, 12554, 12555, 12556, 12557, 12558, - 12559, 12560, 12561, 12562, 12563, 12564, 12565, 12566, 12567, 12568, - 12569, 12570, 12571, 12572, 12573, 12574, 12575, 12576, 12577, 12578, - 12579, 12580, 12581, 12582, 12583, 12584, 12585, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 12321, 12322, - 12323, 12324, 12325, 12326, 12327, 12328, 12329, 12963, 13198, 13199, - 13212, 13213, 13214, 13217, 13252, 13262, 13265, 13266, 13269, 65072, - 65506, 65508, 65535, 8481, 12849, 65535, 8208, 65535, 65535, 65535, 12540, - 12443, 12444, 12541, 12542, 12294, 12445, 12446, 65097, 65098, 65099, - 65100, 65101, 65102, 65103, 65104, 65105, 65106, 65108, 65109, 65110, - 65111, 65113, 65114, 65115, 65116, 65117, 65118, 65119, 65120, 65121, - 65122, 65123, 65124, 65125, 65126, 65128, 65129, 65130, 65131, 12350, - 12272, 12273, 12274, 12275, 12276, 12277, 12278, 12279, 12280, 12281, - 12282, 12283, 12295, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 9472, 9473, 9474, 9475, 9476, - 9477, 9478, 9479, 9480, 9481, 9482, 9483, 9484, 9485, 9486, 9487, 9488, - 9489, 9490, 9491, 9492, 9493, 9494, 9495, 9496, 9497, 9498, 9499, 9500, - 9501, 9502, 9503, 9504, 9505, 9506, 9507, 9508, 9509, 9510, 9511, 9512, - 9513, 9514, 9515, 9516, 9517, 9518, 9519, 9520, 9521, 9522, 9523, 9524, - 9525, 9526, 9527, 9528, 9529, 9530, 9531, 9532, 9533, 9534, 9535, 9536, - 9537, 9538, 9539, 9540, 9541, 9542, 9543, 9544, 9545, 9546, 9547, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 29404, 29405, 29407, 29410, 29411, 29412, - 29413, 29414, 29415, 29418, 29419, 29429, 29430, 29433, 29437, 29438, - 29439, 29440, 29442, 29444, 29445, 29446, 29447, 29448, 29449, 29451, - 29452, 29453, 29455, 29456, 29457, 29458, 29460, 29464, 29465, 29466, - 29471, 29472, 29475, 29476, 29478, 29479, 29480, 29485, 29487, 29488, - 29490, 29491, 29493, 29494, 29498, 29499, 29500, 29501, 29504, 29505, - 29506, 29507, 29508, 29509, 29510, 29511, 29512, 29513, 29514, 29515, - 29516, 29518, 29519, 29521, 29523, 29524, 29525, 29526, 29528, 29529, - 29530, 29531, 29532, 29533, 29534, 29535, 29537, 29538, 29539, 29540, - 29541, 29542, 29543, 29544, 29545, 29546, 29547, 29550, 29552, 29553, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 29554, 29555, 29556, 29557, 29558, 29559, - 29560, 29561, 29562, 29563, 29564, 29565, 29567, 29568, 29569, 29570, - 29571, 29573, 29574, 29576, 29578, 29580, 29581, 29583, 29584, 29586, - 29587, 29588, 29589, 29591, 29592, 29593, 29594, 29596, 29597, 29598, - 29600, 29601, 29603, 29604, 29605, 29606, 29607, 29608, 29610, 29612, - 29613, 29617, 29620, 29621, 29622, 29624, 29625, 29628, 29629, 29630, - 29631, 29633, 29635, 29636, 29637, 29638, 29639, 29643, 29644, 29646, - 29650, 29651, 29652, 29653, 29654, 29655, 29656, 29658, 29659, 29660, - 29661, 29663, 29665, 29666, 29667, 29668, 29670, 29672, 29674, 29675, - 29676, 29678, 29679, 29680, 29681, 29683, 29684, 29685, 29686, 29687, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 29688, 29689, 29690, 29691, 29692, 29693, - 29694, 29695, 29696, 29697, 29698, 29700, 29703, 29704, 29707, 29708, - 29709, 29710, 29713, 29714, 29715, 29716, 29717, 29718, 29719, 29720, - 29721, 29724, 29725, 29726, 29727, 29728, 29729, 29731, 29732, 29735, - 29737, 29739, 29741, 29743, 29745, 29746, 29751, 29752, 29753, 29754, - 29755, 29757, 29758, 29759, 29760, 29762, 29763, 29764, 29765, 29766, - 29767, 29768, 29769, 29770, 29771, 29772, 29773, 29774, 29775, 29776, - 29777, 29778, 29779, 29780, 29782, 29784, 29789, 29792, 29793, 29794, - 29795, 29796, 29797, 29798, 29799, 29800, 29801, 29802, 29803, 29804, - 29806, 29807, 29809, 29810, 29811, 29812, 29813, 29816, 29817, 29818, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 29819, 29820, 29821, 29823, 29826, 29828, - 29829, 29830, 29832, 29833, 29834, 29836, 29837, 29839, 29841, 29842, - 29843, 29844, 29845, 29846, 29847, 29848, 29849, 29850, 29851, 29853, - 29855, 29856, 29857, 29858, 29859, 29860, 29861, 29862, 29866, 29867, - 29868, 29869, 29870, 29871, 29872, 29873, 29874, 29875, 29876, 29877, - 29878, 29879, 29880, 29881, 29883, 29884, 29885, 29886, 29887, 29888, - 29889, 29890, 29891, 29892, 29893, 29894, 29895, 29896, 29897, 29898, - 29899, 29900, 29901, 29902, 29903, 29904, 29905, 29907, 29908, 29909, - 29910, 29911, 29912, 29913, 29914, 29915, 29917, 29919, 29921, 29925, - 29927, 29928, 29929, 29930, 29931, 29932, 29933, 29936, 29937, 29938, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 29939, 29941, 29944, 29945, 29946, 29947, - 29948, 29949, 29950, 29952, 29953, 29954, 29955, 29957, 29958, 29959, - 29960, 29961, 29962, 29963, 29964, 29966, 29968, 29970, 29972, 29973, - 29974, 29975, 29979, 29981, 29982, 29984, 29985, 29986, 29987, 29988, - 29990, 29991, 29994, 29998, 30004, 30006, 30009, 30012, 30013, 30015, - 30017, 30018, 30019, 30020, 30022, 30023, 30025, 30026, 30029, 30032, - 30033, 30034, 30035, 30037, 30038, 30039, 30040, 30045, 30046, 30047, - 30048, 30049, 30050, 30051, 30052, 30055, 30056, 30057, 30059, 30060, - 30061, 30062, 30063, 30064, 30065, 30067, 30069, 30070, 30071, 30074, - 30075, 30076, 30077, 30078, 30080, 30081, 30082, 30084, 30085, 30087, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 30088, 30089, 30090, 30092, 30093, 30094, - 30096, 30099, 30101, 30104, 30107, 30108, 30110, 30114, 30118, 30119, - 30120, 30121, 30122, 30125, 30134, 30135, 30138, 30139, 30143, 30144, - 30145, 30150, 30155, 30156, 30158, 30159, 30160, 30161, 30163, 30167, - 30169, 30170, 30172, 30173, 30175, 30176, 30177, 30181, 30185, 30188, - 30189, 30190, 30191, 30194, 30195, 30197, 30198, 30199, 30200, 30202, - 30203, 30205, 30206, 30210, 30212, 30214, 30215, 30216, 30217, 30219, - 30221, 30222, 30223, 30225, 30226, 30227, 30228, 30230, 30234, 30236, - 30237, 30238, 30241, 30243, 30247, 30248, 30252, 30254, 30255, 30257, - 30258, 30262, 30263, 30265, 30266, 30267, 30269, 30273, 30274, 30276, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 30277, 30278, 30279, 30280, 30281, 30282, - 30283, 30286, 30287, 30288, 30289, 30290, 30291, 30293, 30295, 30296, - 30297, 30298, 30299, 30301, 30303, 30304, 30305, 30306, 30308, 30309, - 30310, 30311, 30312, 30313, 30314, 30316, 30317, 30318, 30320, 30321, - 30322, 30323, 30324, 30325, 30326, 30327, 30329, 30330, 30332, 30335, - 30336, 30337, 30339, 30341, 30345, 30346, 30348, 30349, 30351, 30352, - 30354, 30356, 30357, 30359, 30360, 30362, 30363, 30364, 30365, 30366, - 30367, 30368, 30369, 30370, 30371, 30373, 30374, 30375, 30376, 30377, - 30378, 30379, 30380, 30381, 30383, 30384, 30387, 30389, 30390, 30391, - 30392, 30393, 30394, 30395, 30396, 30397, 30398, 30400, 30401, 30403, - 21834, 38463, 22467, 25384, 21710, 21769, 21696, 30353, 30284, 34108, - 30702, 33406, 30861, 29233, 38552, 38797, 27688, 23433, 20474, 25353, - 26263, 23736, 33018, 26696, 32942, 26114, 30414, 20985, 25942, 29100, - 32753, 34948, 20658, 22885, 25034, 28595, 33453, 25420, 25170, 21485, - 21543, 31494, 20843, 30116, 24052, 25300, 36299, 38774, 25226, 32793, - 22365, 38712, 32610, 29240, 30333, 26575, 30334, 25670, 20336, 36133, - 25308, 31255, 26001, 29677, 25644, 25203, 33324, 39041, 26495, 29256, - 25198, 25292, 20276, 29923, 21322, 21150, 32458, 37030, 24110, 26758, - 27036, 33152, 32465, 26834, 30917, 34444, 38225, 20621, 35876, 33502, - 32990, 21253, 35090, 21093, 30404, 30407, 30409, 30411, 30412, 30419, - 30421, 30425, 30426, 30428, 30429, 30430, 30432, 30433, 30434, 30435, - 30436, 30438, 30439, 30440, 30441, 30442, 30443, 30444, 30445, 30448, - 30451, 30453, 30454, 30455, 30458, 30459, 30461, 30463, 30464, 30466, - 30467, 30469, 30470, 30474, 30476, 30478, 30479, 30480, 30481, 30482, - 30483, 30484, 30485, 30486, 30487, 30488, 30491, 30492, 30493, 30494, - 30497, 30499, 30500, 30501, 30503, 30506, 30507, 30508, 30510, 30512, - 30513, 30514, 30515, 30516, 30521, 30523, 30525, 30526, 30527, 30530, - 30532, 30533, 30534, 30536, 30537, 30538, 30539, 30540, 30541, 30542, - 30543, 30546, 30547, 30548, 30549, 30550, 30551, 30552, 30553, 30556, - 34180, 38649, 20445, 22561, 39281, 23453, 25265, 25253, 26292, 35961, - 40077, 29190, 26479, 30865, 24754, 21329, 21271, 36744, 32972, 36125, - 38049, 20493, 29384, 22791, 24811, 28953, 34987, 22868, 33519, 26412, - 31528, 23849, 32503, 29997, 27893, 36454, 36856, 36924, 40763, 27604, - 37145, 31508, 24444, 30887, 34006, 34109, 27605, 27609, 27606, 24065, - 24199, 30201, 38381, 25949, 24330, 24517, 36767, 22721, 33218, 36991, - 38491, 38829, 36793, 32534, 36140, 25153, 20415, 21464, 21342, 36776, - 36777, 36779, 36941, 26631, 24426, 33176, 34920, 40150, 24971, 21035, - 30250, 24428, 25996, 28626, 28392, 23486, 25672, 20853, 20912, 26564, - 19993, 31177, 39292, 28851, 30557, 30558, 30559, 30560, 30564, 30567, - 30569, 30570, 30573, 30574, 30575, 30576, 30577, 30578, 30579, 30580, - 30581, 30582, 30583, 30584, 30586, 30587, 30588, 30593, 30594, 30595, - 30598, 30599, 30600, 30601, 30602, 30603, 30607, 30608, 30611, 30612, - 30613, 30614, 30615, 30616, 30617, 30618, 30619, 30620, 30621, 30622, - 30625, 30627, 30628, 30630, 30632, 30635, 30637, 30638, 30639, 30641, - 30642, 30644, 30646, 30647, 30648, 30649, 30650, 30652, 30654, 30656, - 30657, 30658, 30659, 30660, 30661, 30662, 30663, 30664, 30665, 30666, - 30667, 30668, 30670, 30671, 30672, 30673, 30674, 30675, 30676, 30677, - 30678, 30680, 30681, 30682, 30685, 30686, 30687, 30688, 30689, 30692, - 30149, 24182, 29627, 33760, 25773, 25320, 38069, 27874, 21338, 21187, - 25615, 38082, 31636, 20271, 24091, 33334, 33046, 33162, 28196, 27850, - 39539, 25429, 21340, 21754, 34917, 22496, 19981, 24067, 27493, 31807, - 37096, 24598, 25830, 29468, 35009, 26448, 25165, 36130, 30572, 36393, - 37319, 24425, 33756, 34081, 39184, 21442, 34453, 27531, 24813, 24808, - 28799, 33485, 33329, 20179, 27815, 34255, 25805, 31961, 27133, 26361, - 33609, 21397, 31574, 20391, 20876, 27979, 23618, 36461, 25554, 21449, - 33580, 33590, 26597, 30900, 25661, 23519, 23700, 24046, 35815, 25286, - 26612, 35962, 25600, 25530, 34633, 39307, 35863, 32544, 38130, 20135, - 38416, 39076, 26124, 29462, 30694, 30696, 30698, 30703, 30704, 30705, - 30706, 30708, 30709, 30711, 30713, 30714, 30715, 30716, 30723, 30724, - 30725, 30726, 30727, 30728, 30730, 30731, 30734, 30735, 30736, 30739, - 30741, 30745, 30747, 30750, 30752, 30753, 30754, 30756, 30760, 30762, - 30763, 30766, 30767, 30769, 30770, 30771, 30773, 30774, 30781, 30783, - 30785, 30786, 30787, 30788, 30790, 30792, 30793, 30794, 30795, 30797, - 30799, 30801, 30803, 30804, 30808, 30809, 30810, 30811, 30812, 30814, - 30815, 30816, 30817, 30818, 30819, 30820, 30821, 30822, 30823, 30824, - 30825, 30831, 30832, 30833, 30834, 30835, 30836, 30837, 30838, 30840, - 30841, 30842, 30843, 30845, 30846, 30847, 30848, 30849, 30850, 30851, - 22330, 23581, 24120, 38271, 20607, 32928, 21378, 25950, 30021, 21809, - 20513, 36229, 25220, 38046, 26397, 22066, 28526, 24034, 21557, 28818, - 36710, 25199, 25764, 25507, 24443, 28552, 37108, 33251, 36784, 23576, - 26216, 24561, 27785, 38472, 36225, 34924, 25745, 31216, 22478, 27225, - 25104, 21576, 20056, 31243, 24809, 28548, 35802, 25215, 36894, 39563, - 31204, 21507, 30196, 25345, 21273, 27744, 36831, 24347, 39536, 32827, - 40831, 20360, 23610, 36196, 32709, 26021, 28861, 20805, 20914, 34411, - 23815, 23456, 25277, 37228, 30068, 36364, 31264, 24833, 31609, 20167, - 32504, 30597, 19985, 33261, 21021, 20986, 27249, 21416, 36487, 38148, - 38607, 28353, 38500, 26970, 30852, 30853, 30854, 30856, 30858, 30859, - 30863, 30864, 30866, 30868, 30869, 30870, 30873, 30877, 30878, 30880, - 30882, 30884, 30886, 30888, 30889, 30890, 30891, 30892, 30893, 30894, - 30895, 30901, 30902, 30903, 30904, 30906, 30907, 30908, 30909, 30911, - 30912, 30914, 30915, 30916, 30918, 30919, 30920, 30924, 30925, 30926, - 30927, 30929, 30930, 30931, 30934, 30935, 30936, 30938, 30939, 30940, - 30941, 30942, 30943, 30944, 30945, 30946, 30947, 30948, 30949, 30950, - 30951, 30953, 30954, 30955, 30957, 30958, 30959, 30960, 30961, 30963, - 30965, 30966, 30968, 30969, 30971, 30972, 30973, 30974, 30975, 30976, - 30978, 30979, 30980, 30982, 30983, 30984, 30985, 30986, 30987, 30988, - 30784, 20648, 30679, 25616, 35302, 22788, 25571, 24029, 31359, 26941, - 20256, 33337, 21912, 20018, 30126, 31383, 24162, 24202, 38383, 21019, - 21561, 28810, 25462, 38180, 22402, 26149, 26943, 37255, 21767, 28147, - 32431, 34850, 25139, 32496, 30133, 33576, 30913, 38604, 36766, 24904, - 29943, 35789, 27492, 21050, 36176, 27425, 32874, 33905, 22257, 21254, - 20174, 19995, 20945, 31895, 37259, 31751, 20419, 36479, 31713, 31388, - 25703, 23828, 20652, 33030, 30209, 31929, 28140, 32736, 26449, 23384, - 23544, 30923, 25774, 25619, 25514, 25387, 38169, 25645, 36798, 31572, - 30249, 25171, 22823, 21574, 27513, 20643, 25140, 24102, 27526, 20195, - 36151, 34955, 24453, 36910, 30989, 30990, 30991, 30992, 30993, 30994, - 30996, 30997, 30998, 30999, 31000, 31001, 31002, 31003, 31004, 31005, - 31007, 31008, 31009, 31010, 31011, 31013, 31014, 31015, 31016, 31017, - 31018, 31019, 31020, 31021, 31022, 31023, 31024, 31025, 31026, 31027, - 31029, 31030, 31031, 31032, 31033, 31037, 31039, 31042, 31043, 31044, - 31045, 31047, 31050, 31051, 31052, 31053, 31054, 31055, 31056, 31057, - 31058, 31060, 31061, 31064, 31065, 31073, 31075, 31076, 31078, 31081, - 31082, 31083, 31084, 31086, 31088, 31089, 31090, 31091, 31092, 31093, - 31094, 31097, 31099, 31100, 31101, 31102, 31103, 31106, 31107, 31110, - 31111, 31112, 31113, 31115, 31116, 31117, 31118, 31120, 31121, 31122, - 24608, 32829, 25285, 20025, 21333, 37112, 25528, 32966, 26086, 27694, - 20294, 24814, 28129, 35806, 24377, 34507, 24403, 25377, 20826, 33633, - 26723, 20992, 25443, 36424, 20498, 23707, 31095, 23548, 21040, 31291, - 24764, 36947, 30423, 24503, 24471, 30340, 36460, 28783, 30331, 31561, - 30634, 20979, 37011, 22564, 20302, 28404, 36842, 25932, 31515, 29380, - 28068, 32735, 23265, 25269, 24213, 22320, 33922, 31532, 24093, 24351, - 36882, 32532, 39072, 25474, 28359, 30872, 28857, 20856, 38747, 22443, - 30005, 20291, 30008, 24215, 24806, 22880, 28096, 27583, 30857, 21500, - 38613, 20939, 20993, 25481, 21514, 38035, 35843, 36300, 29241, 30879, - 34678, 36845, 35853, 21472, 31123, 31124, 31125, 31126, 31127, 31128, - 31129, 31131, 31132, 31133, 31134, 31135, 31136, 31137, 31138, 31139, - 31140, 31141, 31142, 31144, 31145, 31146, 31147, 31148, 31149, 31150, - 31151, 31152, 31153, 31154, 31156, 31157, 31158, 31159, 31160, 31164, - 31167, 31170, 31172, 31173, 31175, 31176, 31178, 31180, 31182, 31183, - 31184, 31187, 31188, 31190, 31191, 31193, 31194, 31195, 31196, 31197, - 31198, 31200, 31201, 31202, 31205, 31208, 31210, 31212, 31214, 31217, - 31218, 31219, 31220, 31221, 31222, 31223, 31225, 31226, 31228, 31230, - 31231, 31233, 31236, 31237, 31239, 31240, 31241, 31242, 31244, 31247, - 31248, 31249, 31250, 31251, 31253, 31254, 31256, 31257, 31259, 31260, - 19969, 30447, 21486, 38025, 39030, 40718, 38189, 23450, 35746, 20002, - 19996, 20908, 33891, 25026, 21160, 26635, 20375, 24683, 20923, 27934, - 20828, 25238, 26007, 38497, 35910, 36887, 30168, 37117, 30563, 27602, - 29322, 29420, 35835, 22581, 30585, 36172, 26460, 38208, 32922, 24230, - 28193, 22930, 31471, 30701, 38203, 27573, 26029, 32526, 22534, 20817, - 38431, 23545, 22697, 21544, 36466, 25958, 39039, 22244, 38045, 30462, - 36929, 25479, 21702, 22810, 22842, 22427, 36530, 26421, 36346, 33333, - 21057, 24816, 22549, 34558, 23784, 40517, 20420, 39069, 35769, 23077, - 24694, 21380, 25212, 36943, 37122, 39295, 24681, 32780, 20799, 32819, - 23572, 39285, 27953, 20108, 31261, 31263, 31265, 31266, 31268, 31269, - 31270, 31271, 31272, 31273, 31274, 31275, 31276, 31277, 31278, 31279, - 31280, 31281, 31282, 31284, 31285, 31286, 31288, 31290, 31294, 31296, - 31297, 31298, 31299, 31300, 31301, 31303, 31304, 31305, 31306, 31307, - 31308, 31309, 31310, 31311, 31312, 31314, 31315, 31316, 31317, 31318, - 31320, 31321, 31322, 31323, 31324, 31325, 31326, 31327, 31328, 31329, - 31330, 31331, 31332, 31333, 31334, 31335, 31336, 31337, 31338, 31339, - 31340, 31341, 31342, 31343, 31345, 31346, 31347, 31349, 31355, 31356, - 31357, 31358, 31362, 31365, 31367, 31369, 31370, 31371, 31372, 31374, - 31375, 31376, 31379, 31380, 31385, 31386, 31387, 31390, 31393, 31394, - 36144, 21457, 32602, 31567, 20240, 20047, 38400, 27861, 29648, 34281, - 24070, 30058, 32763, 27146, 30718, 38034, 32321, 20961, 28902, 21453, - 36820, 33539, 36137, 29359, 39277, 27867, 22346, 33459, 26041, 32938, - 25151, 38450, 22952, 20223, 35775, 32442, 25918, 33778, 38750, 21857, - 39134, 32933, 21290, 35837, 21536, 32954, 24223, 27832, 36153, 33452, - 37210, 21545, 27675, 20998, 32439, 22367, 28954, 27774, 31881, 22859, - 20221, 24575, 24868, 31914, 20016, 23553, 26539, 34562, 23792, 38155, - 39118, 30127, 28925, 36898, 20911, 32541, 35773, 22857, 20964, 20315, - 21542, 22827, 25975, 32932, 23413, 25206, 25282, 36752, 24133, 27679, - 31526, 20239, 20440, 26381, 31395, 31396, 31399, 31401, 31402, 31403, - 31406, 31407, 31408, 31409, 31410, 31412, 31413, 31414, 31415, 31416, - 31417, 31418, 31419, 31420, 31421, 31422, 31424, 31425, 31426, 31427, - 31428, 31429, 31430, 31431, 31432, 31433, 31434, 31436, 31437, 31438, - 31439, 31440, 31441, 31442, 31443, 31444, 31445, 31447, 31448, 31450, - 31451, 31452, 31453, 31457, 31458, 31460, 31463, 31464, 31465, 31466, - 31467, 31468, 31470, 31472, 31473, 31474, 31475, 31476, 31477, 31478, - 31479, 31480, 31483, 31484, 31486, 31488, 31489, 31490, 31493, 31495, - 31497, 31500, 31501, 31502, 31504, 31506, 31507, 31510, 31511, 31512, - 31514, 31516, 31517, 31519, 31521, 31522, 31523, 31527, 31529, 31533, - 28014, 28074, 31119, 34993, 24343, 29995, 25242, 36741, 20463, 37340, - 26023, 33071, 33105, 24220, 33104, 36212, 21103, 35206, 36171, 22797, - 20613, 20184, 38428, 29238, 33145, 36127, 23500, 35747, 38468, 22919, - 32538, 21648, 22134, 22030, 35813, 25913, 27010, 38041, 30422, 28297, - 24178, 29976, 26438, 26577, 31487, 32925, 36214, 24863, 31174, 25954, - 36195, 20872, 21018, 38050, 32568, 32923, 32434, 23703, 28207, 26464, - 31705, 30347, 39640, 33167, 32660, 31957, 25630, 38224, 31295, 21578, - 21733, 27468, 25601, 25096, 40509, 33011, 30105, 21106, 38761, 33883, - 26684, 34532, 38401, 38548, 38124, 20010, 21508, 32473, 26681, 36319, - 32789, 26356, 24218, 32697, 31535, 31536, 31538, 31540, 31541, 31542, - 31543, 31545, 31547, 31549, 31551, 31552, 31553, 31554, 31555, 31556, - 31558, 31560, 31562, 31565, 31566, 31571, 31573, 31575, 31577, 31580, - 31582, 31583, 31585, 31587, 31588, 31589, 31590, 31591, 31592, 31593, - 31594, 31595, 31596, 31597, 31599, 31600, 31603, 31604, 31606, 31608, - 31610, 31612, 31613, 31615, 31617, 31618, 31619, 31620, 31622, 31623, - 31624, 31625, 31626, 31627, 31628, 31630, 31631, 31633, 31634, 31635, - 31638, 31640, 31641, 31642, 31643, 31646, 31647, 31648, 31651, 31652, - 31653, 31662, 31663, 31664, 31666, 31667, 31669, 31670, 31671, 31673, - 31674, 31675, 31676, 31677, 31678, 31679, 31680, 31682, 31683, 31684, - 22466, 32831, 26775, 24037, 25915, 21151, 24685, 40858, 20379, 36524, - 20844, 23467, 24339, 24041, 27742, 25329, 36129, 20849, 38057, 21246, - 27807, 33503, 29399, 22434, 26500, 36141, 22815, 36764, 33735, 21653, - 31629, 20272, 27837, 23396, 22993, 40723, 21476, 34506, 39592, 35895, - 32929, 25925, 39038, 22266, 38599, 21038, 29916, 21072, 23521, 25346, - 35074, 20054, 25296, 24618, 26874, 20851, 23448, 20896, 35266, 31649, - 39302, 32592, 24815, 28748, 36143, 20809, 24191, 36891, 29808, 35268, - 22317, 30789, 24402, 40863, 38394, 36712, 39740, 35809, 30328, 26690, - 26588, 36330, 36149, 21053, 36746, 28378, 26829, 38149, 37101, 22269, - 26524, 35065, 36807, 21704, 31685, 31688, 31689, 31690, 31691, 31693, - 31694, 31695, 31696, 31698, 31700, 31701, 31702, 31703, 31704, 31707, - 31708, 31710, 31711, 31712, 31714, 31715, 31716, 31719, 31720, 31721, - 31723, 31724, 31725, 31727, 31728, 31730, 31731, 31732, 31733, 31734, - 31736, 31737, 31738, 31739, 31741, 31743, 31744, 31745, 31746, 31747, - 31748, 31749, 31750, 31752, 31753, 31754, 31757, 31758, 31760, 31761, - 31762, 31763, 31764, 31765, 31767, 31768, 31769, 31770, 31771, 31772, - 31773, 31774, 31776, 31777, 31778, 31779, 31780, 31781, 31784, 31785, - 31787, 31788, 31789, 31790, 31791, 31792, 31793, 31794, 31795, 31796, - 31797, 31798, 31799, 31801, 31802, 31803, 31804, 31805, 31806, 31810, - 39608, 23401, 28023, 27686, 20133, 23475, 39559, 37219, 25000, 37039, - 38889, 21547, 28085, 23506, 20989, 21898, 32597, 32752, 25788, 25421, - 26097, 25022, 24717, 28938, 27735, 27721, 22831, 26477, 33322, 22741, - 22158, 35946, 27627, 37085, 22909, 32791, 21495, 28009, 21621, 21917, - 33655, 33743, 26680, 31166, 21644, 20309, 21512, 30418, 35977, 38402, - 27827, 28088, 36203, 35088, 40548, 36154, 22079, 40657, 30165, 24456, - 29408, 24680, 21756, 20136, 27178, 34913, 24658, 36720, 21700, 28888, - 34425, 40511, 27946, 23439, 24344, 32418, 21897, 20399, 29492, 21564, - 21402, 20505, 21518, 21628, 20046, 24573, 29786, 22774, 33899, 32993, - 34676, 29392, 31946, 28246, 31811, 31812, 31813, 31814, 31815, 31816, - 31817, 31818, 31819, 31820, 31822, 31823, 31824, 31825, 31826, 31827, - 31828, 31829, 31830, 31831, 31832, 31833, 31834, 31835, 31836, 31837, - 31838, 31839, 31840, 31841, 31842, 31843, 31844, 31845, 31846, 31847, - 31848, 31849, 31850, 31851, 31852, 31853, 31854, 31855, 31856, 31857, - 31858, 31861, 31862, 31863, 31864, 31865, 31866, 31870, 31871, 31872, - 31873, 31874, 31875, 31876, 31877, 31878, 31879, 31880, 31882, 31883, - 31884, 31885, 31886, 31887, 31888, 31891, 31892, 31894, 31897, 31898, - 31899, 31904, 31905, 31907, 31910, 31911, 31912, 31913, 31915, 31916, - 31917, 31919, 31920, 31924, 31925, 31926, 31927, 31928, 31930, 31931, - 24359, 34382, 21804, 25252, 20114, 27818, 25143, 33457, 21719, 21326, - 29502, 28369, 30011, 21010, 21270, 35805, 27088, 24458, 24576, 28142, - 22351, 27426, 29615, 26707, 36824, 32531, 25442, 24739, 21796, 30186, - 35938, 28949, 28067, 23462, 24187, 33618, 24908, 40644, 30970, 34647, - 31783, 30343, 20976, 24822, 29004, 26179, 24140, 24653, 35854, 28784, - 25381, 36745, 24509, 24674, 34516, 22238, 27585, 24724, 24935, 21321, - 24800, 26214, 36159, 31229, 20250, 28905, 27719, 35763, 35826, 32472, - 33636, 26127, 23130, 39746, 27985, 28151, 35905, 27963, 20249, 28779, - 33719, 25110, 24785, 38669, 36135, 31096, 20987, 22334, 22522, 26426, - 30072, 31293, 31215, 31637, 31935, 31936, 31938, 31939, 31940, 31942, - 31945, 31947, 31950, 31951, 31952, 31953, 31954, 31955, 31956, 31960, - 31962, 31963, 31965, 31966, 31969, 31970, 31971, 31972, 31973, 31974, - 31975, 31977, 31978, 31979, 31980, 31981, 31982, 31984, 31985, 31986, - 31987, 31988, 31989, 31990, 31991, 31993, 31994, 31996, 31997, 31998, - 31999, 32000, 32001, 32002, 32003, 32004, 32005, 32006, 32007, 32008, - 32009, 32011, 32012, 32013, 32014, 32015, 32016, 32017, 32018, 32019, - 32020, 32021, 32022, 32023, 32024, 32025, 32026, 32027, 32028, 32029, - 32030, 32031, 32033, 32035, 32036, 32037, 32038, 32040, 32041, 32042, - 32044, 32045, 32046, 32048, 32049, 32050, 32051, 32052, 32053, 32054, - 32908, 39269, 36857, 28608, 35749, 40481, 23020, 32489, 32521, 21513, - 26497, 26840, 36753, 31821, 38598, 21450, 24613, 30142, 27762, 21363, - 23241, 32423, 25380, 20960, 33034, 24049, 34015, 25216, 20864, 23395, - 20238, 31085, 21058, 24760, 27982, 23492, 23490, 35745, 35760, 26082, - 24524, 38469, 22931, 32487, 32426, 22025, 26551, 22841, 20339, 23478, - 21152, 33626, 39050, 36158, 30002, 38078, 20551, 31292, 20215, 26550, - 39550, 23233, 27516, 30417, 22362, 23574, 31546, 38388, 29006, 20860, - 32937, 33392, 22904, 32516, 33575, 26816, 26604, 30897, 30839, 25315, - 25441, 31616, 20461, 21098, 20943, 33616, 27099, 37492, 36341, 36145, - 35265, 38190, 31661, 20214, 32055, 32056, 32057, 32058, 32059, 32060, - 32061, 32062, 32063, 32064, 32065, 32066, 32067, 32068, 32069, 32070, - 32071, 32072, 32073, 32074, 32075, 32076, 32077, 32078, 32079, 32080, - 32081, 32082, 32083, 32084, 32085, 32086, 32087, 32088, 32089, 32090, - 32091, 32092, 32093, 32094, 32095, 32096, 32097, 32098, 32099, 32100, - 32101, 32102, 32103, 32104, 32105, 32106, 32107, 32108, 32109, 32111, - 32112, 32113, 32114, 32115, 32116, 32117, 32118, 32120, 32121, 32122, - 32123, 32124, 32125, 32126, 32127, 32128, 32129, 32130, 32131, 32132, - 32133, 32134, 32135, 32136, 32137, 32138, 32139, 32140, 32141, 32142, - 32143, 32144, 32145, 32146, 32147, 32148, 32149, 32150, 32151, 32152, - 20581, 33328, 21073, 39279, 28176, 28293, 28071, 24314, 20725, 23004, - 23558, 27974, 27743, 30086, 33931, 26728, 22870, 35762, 21280, 37233, - 38477, 34121, 26898, 30977, 28966, 33014, 20132, 37066, 27975, 39556, - 23047, 22204, 25605, 38128, 30699, 20389, 33050, 29409, 35282, 39290, - 32564, 32478, 21119, 25945, 37237, 36735, 36739, 21483, 31382, 25581, - 25509, 30342, 31224, 34903, 38454, 25130, 21163, 33410, 26708, 26480, - 25463, 30571, 31469, 27905, 32467, 35299, 22992, 25106, 34249, 33445, - 30028, 20511, 20171, 30117, 35819, 23626, 24062, 31563, 26020, 37329, - 20170, 27941, 35167, 32039, 38182, 20165, 35880, 36827, 38771, 26187, - 31105, 36817, 28908, 28024, 32153, 32154, 32155, 32156, 32157, 32158, - 32159, 32160, 32161, 32162, 32163, 32164, 32165, 32167, 32168, 32169, - 32170, 32171, 32172, 32173, 32175, 32176, 32177, 32178, 32179, 32180, - 32181, 32182, 32183, 32184, 32185, 32186, 32187, 32188, 32189, 32190, - 32191, 32192, 32193, 32194, 32195, 32196, 32197, 32198, 32199, 32200, - 32201, 32202, 32203, 32204, 32205, 32206, 32207, 32208, 32209, 32210, - 32211, 32212, 32213, 32214, 32215, 32216, 32217, 32218, 32219, 32220, - 32221, 32222, 32223, 32224, 32225, 32226, 32227, 32228, 32229, 32230, - 32231, 32232, 32233, 32234, 32235, 32236, 32237, 32238, 32239, 32240, - 32241, 32242, 32243, 32244, 32245, 32246, 32247, 32248, 32249, 32250, - 23613, 21170, 33606, 20834, 33550, 30555, 26230, 40120, 20140, 24778, - 31934, 31923, 32463, 20117, 35686, 26223, 39048, 38745, 22659, 25964, - 38236, 24452, 30153, 38742, 31455, 31454, 20928, 28847, 31384, 25578, - 31350, 32416, 29590, 38893, 20037, 28792, 20061, 37202, 21417, 25937, - 26087, 33276, 33285, 21646, 23601, 30106, 38816, 25304, 29401, 30141, - 23621, 39545, 33738, 23616, 21632, 30697, 20030, 27822, 32858, 25298, - 25454, 24040, 20855, 36317, 36382, 38191, 20465, 21477, 24807, 28844, - 21095, 25424, 40515, 23071, 20518, 30519, 21367, 32482, 25733, 25899, - 25225, 25496, 20500, 29237, 35273, 20915, 35776, 32477, 22343, 33740, - 38055, 20891, 21531, 23803, 32251, 32252, 32253, 32254, 32255, 32256, - 32257, 32258, 32259, 32260, 32261, 32262, 32263, 32264, 32265, 32266, - 32267, 32268, 32269, 32270, 32271, 32272, 32273, 32274, 32275, 32276, - 32277, 32278, 32279, 32280, 32281, 32282, 32283, 32284, 32285, 32286, - 32287, 32288, 32289, 32290, 32291, 32292, 32293, 32294, 32295, 32296, - 32297, 32298, 32299, 32300, 32301, 32302, 32303, 32304, 32305, 32306, - 32307, 32308, 32309, 32310, 32311, 32312, 32313, 32314, 32316, 32317, - 32318, 32319, 32320, 32322, 32323, 32324, 32325, 32326, 32328, 32329, - 32330, 32331, 32332, 32333, 32334, 32335, 32336, 32337, 32338, 32339, - 32340, 32341, 32342, 32343, 32344, 32345, 32346, 32347, 32348, 32349, - 20426, 31459, 27994, 37089, 39567, 21888, 21654, 21345, 21679, 24320, - 25577, 26999, 20975, 24936, 21002, 22570, 21208, 22350, 30733, 30475, - 24247, 24951, 31968, 25179, 25239, 20130, 28821, 32771, 25335, 28900, - 38752, 22391, 33499, 26607, 26869, 30933, 39063, 31185, 22771, 21683, - 21487, 28212, 20811, 21051, 23458, 35838, 32943, 21827, 22438, 24691, - 22353, 21549, 31354, 24656, 23380, 25511, 25248, 21475, 25187, 23495, - 26543, 21741, 31391, 33510, 37239, 24211, 35044, 22840, 22446, 25358, - 36328, 33007, 22359, 31607, 20393, 24555, 23485, 27454, 21281, 31568, - 29378, 26694, 30719, 30518, 26103, 20917, 20111, 30420, 23743, 31397, - 33909, 22862, 39745, 20608, 32350, 32351, 32352, 32353, 32354, 32355, - 32356, 32357, 32358, 32359, 32360, 32361, 32362, 32363, 32364, 32365, - 32366, 32367, 32368, 32369, 32370, 32371, 32372, 32373, 32374, 32375, - 32376, 32377, 32378, 32379, 32380, 32381, 32382, 32383, 32384, 32385, - 32387, 32388, 32389, 32390, 32391, 32392, 32393, 32394, 32395, 32396, - 32397, 32398, 32399, 32400, 32401, 32402, 32403, 32404, 32405, 32406, - 32407, 32408, 32409, 32410, 32412, 32413, 32414, 32430, 32436, 32443, - 32444, 32470, 32484, 32492, 32505, 32522, 32528, 32542, 32567, 32569, - 32571, 32572, 32573, 32574, 32575, 32576, 32577, 32579, 32582, 32583, - 32584, 32585, 32586, 32587, 32588, 32589, 32590, 32591, 32594, 32595, - 39304, 24871, 28291, 22372, 26118, 25414, 22256, 25324, 25193, 24275, - 38420, 22403, 25289, 21895, 34593, 33098, 36771, 21862, 33713, 26469, - 36182, 34013, 23146, 26639, 25318, 31726, 38417, 20848, 28572, 35888, - 25597, 35272, 25042, 32518, 28866, 28389, 29701, 27028, 29436, 24266, - 37070, 26391, 28010, 25438, 21171, 29282, 32769, 20332, 23013, 37226, - 28889, 28061, 21202, 20048, 38647, 38253, 34174, 30922, 32047, 20769, - 22418, 25794, 32907, 31867, 27882, 26865, 26974, 20919, 21400, 26792, - 29313, 40654, 31729, 29432, 31163, 28435, 29702, 26446, 37324, 40100, - 31036, 33673, 33620, 21519, 26647, 20029, 21385, 21169, 30782, 21382, - 21033, 20616, 20363, 20432, 32598, 32601, 32603, 32604, 32605, 32606, - 32608, 32611, 32612, 32613, 32614, 32615, 32619, 32620, 32621, 32623, - 32624, 32627, 32629, 32630, 32631, 32632, 32634, 32635, 32636, 32637, - 32639, 32640, 32642, 32643, 32644, 32645, 32646, 32647, 32648, 32649, - 32651, 32653, 32655, 32656, 32657, 32658, 32659, 32661, 32662, 32663, - 32664, 32665, 32667, 32668, 32672, 32674, 32675, 32677, 32678, 32680, - 32681, 32682, 32683, 32684, 32685, 32686, 32689, 32691, 32692, 32693, - 32694, 32695, 32698, 32699, 32702, 32704, 32706, 32707, 32708, 32710, - 32711, 32712, 32713, 32715, 32717, 32719, 32720, 32721, 32722, 32723, - 32726, 32727, 32729, 32730, 32731, 32732, 32733, 32734, 32738, 32739, - 30178, 31435, 31890, 27813, 38582, 21147, 29827, 21737, 20457, 32852, - 33714, 36830, 38256, 24265, 24604, 28063, 24088, 25947, 33080, 38142, - 24651, 28860, 32451, 31918, 20937, 26753, 31921, 33391, 20004, 36742, - 37327, 26238, 20142, 35845, 25769, 32842, 20698, 30103, 29134, 23525, - 36797, 28518, 20102, 25730, 38243, 24278, 26009, 21015, 35010, 28872, - 21155, 29454, 29747, 26519, 30967, 38678, 20020, 37051, 40158, 28107, - 20955, 36161, 21533, 25294, 29618, 33777, 38646, 40836, 38083, 20278, - 32666, 20940, 28789, 38517, 23725, 39046, 21478, 20196, 28316, 29705, - 27060, 30827, 39311, 30041, 21016, 30244, 27969, 26611, 20845, 40857, - 32843, 21657, 31548, 31423, 32740, 32743, 32744, 32746, 32747, 32748, - 32749, 32751, 32754, 32756, 32757, 32758, 32759, 32760, 32761, 32762, - 32765, 32766, 32767, 32770, 32775, 32776, 32777, 32778, 32782, 32783, - 32785, 32787, 32794, 32795, 32797, 32798, 32799, 32801, 32803, 32804, - 32811, 32812, 32813, 32814, 32815, 32816, 32818, 32820, 32825, 32826, - 32828, 32830, 32832, 32833, 32836, 32837, 32839, 32840, 32841, 32846, - 32847, 32848, 32849, 32851, 32853, 32854, 32855, 32857, 32859, 32860, - 32861, 32862, 32863, 32864, 32865, 32866, 32867, 32868, 32869, 32870, - 32871, 32872, 32875, 32876, 32877, 32878, 32879, 32880, 32882, 32883, - 32884, 32885, 32886, 32887, 32888, 32889, 32890, 32891, 32892, 32893, - 38534, 22404, 25314, 38471, 27004, 23044, 25602, 31699, 28431, 38475, - 33446, 21346, 39045, 24208, 28809, 25523, 21348, 34383, 40065, 40595, - 30860, 38706, 36335, 36162, 40575, 28510, 31108, 24405, 38470, 25134, - 39540, 21525, 38109, 20387, 26053, 23653, 23649, 32533, 34385, 27695, - 24459, 29575, 28388, 32511, 23782, 25371, 23402, 28390, 21365, 20081, - 25504, 30053, 25249, 36718, 20262, 20177, 27814, 32438, 35770, 33821, - 34746, 32599, 36923, 38179, 31657, 39585, 35064, 33853, 27931, 39558, - 32476, 22920, 40635, 29595, 30721, 34434, 39532, 39554, 22043, 21527, - 22475, 20080, 40614, 21334, 36808, 33033, 30610, 39314, 34542, 28385, - 34067, 26364, 24930, 28459, 32894, 32897, 32898, 32901, 32904, 32906, - 32909, 32910, 32911, 32912, 32913, 32914, 32916, 32917, 32919, 32921, - 32926, 32931, 32934, 32935, 32936, 32940, 32944, 32947, 32949, 32950, - 32952, 32953, 32955, 32965, 32967, 32968, 32969, 32970, 32971, 32975, - 32976, 32977, 32978, 32979, 32980, 32981, 32984, 32991, 32992, 32994, - 32995, 32998, 33006, 33013, 33015, 33017, 33019, 33022, 33023, 33024, - 33025, 33027, 33028, 33029, 33031, 33032, 33035, 33036, 33045, 33047, - 33049, 33051, 33052, 33053, 33055, 33056, 33057, 33058, 33059, 33060, - 33061, 33062, 33063, 33064, 33065, 33066, 33067, 33069, 33070, 33072, - 33075, 33076, 33077, 33079, 33081, 33082, 33083, 33084, 33085, 33087, - 35881, 33426, 33579, 30450, 27667, 24537, 33725, 29483, 33541, 38170, - 27611, 30683, 38086, 21359, 33538, 20882, 24125, 35980, 36152, 20040, - 29611, 26522, 26757, 37238, 38665, 29028, 27809, 30473, 23186, 38209, - 27599, 32654, 26151, 23504, 22969, 23194, 38376, 38391, 20204, 33804, - 33945, 27308, 30431, 38192, 29467, 26790, 23391, 30511, 37274, 38753, - 31964, 36855, 35868, 24357, 31859, 31192, 35269, 27852, 34588, 23494, - 24130, 26825, 30496, 32501, 20885, 20813, 21193, 23081, 32517, 38754, - 33495, 25551, 30596, 34256, 31186, 28218, 24217, 22937, 34065, 28781, - 27665, 25279, 30399, 25935, 24751, 38397, 26126, 34719, 40483, 38125, - 21517, 21629, 35884, 25720, 33088, 33089, 33090, 33091, 33092, 33093, - 33095, 33097, 33101, 33102, 33103, 33106, 33110, 33111, 33112, 33115, - 33116, 33117, 33118, 33119, 33121, 33122, 33123, 33124, 33126, 33128, - 33130, 33131, 33132, 33135, 33138, 33139, 33141, 33142, 33143, 33144, - 33153, 33155, 33156, 33157, 33158, 33159, 33161, 33163, 33164, 33165, - 33166, 33168, 33170, 33171, 33172, 33173, 33174, 33175, 33177, 33178, - 33182, 33183, 33184, 33185, 33186, 33188, 33189, 33191, 33193, 33195, - 33196, 33197, 33198, 33199, 33200, 33201, 33202, 33204, 33205, 33206, - 33207, 33208, 33209, 33212, 33213, 33214, 33215, 33220, 33221, 33223, - 33224, 33225, 33227, 33229, 33230, 33231, 33232, 33233, 33234, 33235, - 25721, 34321, 27169, 33180, 30952, 25705, 39764, 25273, 26411, 33707, - 22696, 40664, 27819, 28448, 23518, 38476, 35851, 29279, 26576, 25287, - 29281, 20137, 22982, 27597, 22675, 26286, 24149, 21215, 24917, 26408, - 30446, 30566, 29287, 31302, 25343, 21738, 21584, 38048, 37027, 23068, - 32435, 27670, 20035, 22902, 32784, 22856, 21335, 30007, 38590, 22218, - 25376, 33041, 24700, 38393, 28118, 21602, 39297, 20869, 23273, 33021, - 22958, 38675, 20522, 27877, 23612, 25311, 20320, 21311, 33147, 36870, - 28346, 34091, 25288, 24180, 30910, 25781, 25467, 24565, 23064, 37247, - 40479, 23615, 25423, 32834, 23421, 21870, 38218, 38221, 28037, 24744, - 26592, 29406, 20957, 23425, 33236, 33237, 33238, 33239, 33240, 33241, - 33242, 33243, 33244, 33245, 33246, 33247, 33248, 33249, 33250, 33252, - 33253, 33254, 33256, 33257, 33259, 33262, 33263, 33264, 33265, 33266, - 33269, 33270, 33271, 33272, 33273, 33274, 33277, 33279, 33283, 33287, - 33288, 33289, 33290, 33291, 33294, 33295, 33297, 33299, 33301, 33302, - 33303, 33304, 33305, 33306, 33309, 33312, 33316, 33317, 33318, 33319, - 33321, 33326, 33330, 33338, 33340, 33341, 33343, 33344, 33345, 33346, - 33347, 33349, 33350, 33352, 33354, 33356, 33357, 33358, 33360, 33361, - 33362, 33363, 33364, 33365, 33366, 33367, 33369, 33371, 33372, 33373, - 33374, 33376, 33377, 33378, 33379, 33380, 33381, 33382, 33383, 33385, - 25319, 27870, 29275, 25197, 38062, 32445, 33043, 27987, 20892, 24324, - 22900, 21162, 24594, 22899, 26262, 34384, 30111, 25386, 25062, 31983, - 35834, 21734, 27431, 40485, 27572, 34261, 21589, 20598, 27812, 21866, - 36276, 29228, 24085, 24597, 29750, 25293, 25490, 29260, 24472, 28227, - 27966, 25856, 28504, 30424, 30928, 30460, 30036, 21028, 21467, 20051, - 24222, 26049, 32810, 32982, 25243, 21638, 21032, 28846, 34957, 36305, - 27873, 21624, 32986, 22521, 35060, 36180, 38506, 37197, 20329, 27803, - 21943, 30406, 30768, 25256, 28921, 28558, 24429, 34028, 26842, 30844, - 31735, 33192, 26379, 40527, 25447, 30896, 22383, 30738, 38713, 25209, - 25259, 21128, 29749, 27607, 33386, 33387, 33388, 33389, 33393, 33397, - 33398, 33399, 33400, 33403, 33404, 33408, 33409, 33411, 33413, 33414, - 33415, 33417, 33420, 33424, 33427, 33428, 33429, 33430, 33434, 33435, - 33438, 33440, 33442, 33443, 33447, 33458, 33461, 33462, 33466, 33467, - 33468, 33471, 33472, 33474, 33475, 33477, 33478, 33481, 33488, 33494, - 33497, 33498, 33501, 33506, 33511, 33512, 33513, 33514, 33516, 33517, - 33518, 33520, 33522, 33523, 33525, 33526, 33528, 33530, 33532, 33533, - 33534, 33535, 33536, 33546, 33547, 33549, 33552, 33554, 33555, 33558, - 33560, 33561, 33565, 33566, 33567, 33568, 33569, 33570, 33571, 33572, - 33573, 33574, 33577, 33578, 33582, 33584, 33586, 33591, 33595, 33597, - 21860, 33086, 30130, 30382, 21305, 30174, 20731, 23617, 35692, 31687, - 20559, 29255, 39575, 39128, 28418, 29922, 31080, 25735, 30629, 25340, - 39057, 36139, 21697, 32856, 20050, 22378, 33529, 33805, 24179, 20973, - 29942, 35780, 23631, 22369, 27900, 39047, 23110, 30772, 39748, 36843, - 31893, 21078, 25169, 38138, 20166, 33670, 33889, 33769, 33970, 22484, - 26420, 22275, 26222, 28006, 35889, 26333, 28689, 26399, 27450, 26646, - 25114, 22971, 19971, 20932, 28422, 26578, 27791, 20854, 26827, 22855, - 27495, 30054, 23822, 33040, 40784, 26071, 31048, 31041, 39569, 36215, - 23682, 20062, 20225, 21551, 22865, 30732, 22120, 27668, 36804, 24323, - 27773, 27875, 35755, 25488, 33598, 33599, 33601, 33602, 33604, 33605, - 33608, 33610, 33611, 33612, 33613, 33614, 33619, 33621, 33622, 33623, - 33624, 33625, 33629, 33634, 33648, 33649, 33650, 33651, 33652, 33653, - 33654, 33657, 33658, 33662, 33663, 33664, 33665, 33666, 33667, 33668, - 33671, 33672, 33674, 33675, 33676, 33677, 33679, 33680, 33681, 33684, - 33685, 33686, 33687, 33689, 33690, 33693, 33695, 33697, 33698, 33699, - 33700, 33701, 33702, 33703, 33708, 33709, 33710, 33711, 33717, 33723, - 33726, 33727, 33730, 33731, 33732, 33734, 33736, 33737, 33739, 33741, - 33742, 33744, 33745, 33746, 33747, 33749, 33751, 33753, 33754, 33755, - 33758, 33762, 33763, 33764, 33766, 33767, 33768, 33771, 33772, 33773, - 24688, 27965, 29301, 25190, 38030, 38085, 21315, 36801, 31614, 20191, - 35878, 20094, 40660, 38065, 38067, 21069, 28508, 36963, 27973, 35892, - 22545, 23884, 27424, 27465, 26538, 21595, 33108, 32652, 22681, 34103, - 24378, 25250, 27207, 38201, 25970, 24708, 26725, 30631, 20052, 20392, - 24039, 38808, 25772, 32728, 23789, 20431, 31373, 20999, 33540, 19988, - 24623, 31363, 38054, 20405, 20146, 31206, 29748, 21220, 33465, 25810, - 31165, 23517, 27777, 38738, 36731, 27682, 20542, 21375, 28165, 25806, - 26228, 27696, 24773, 39031, 35831, 24198, 29756, 31351, 31179, 19992, - 37041, 29699, 27714, 22234, 37195, 27845, 36235, 21306, 34502, 26354, - 36527, 23624, 39537, 28192, 33774, 33775, 33779, 33780, 33781, 33782, - 33783, 33786, 33787, 33788, 33790, 33791, 33792, 33794, 33797, 33799, - 33800, 33801, 33802, 33808, 33810, 33811, 33812, 33813, 33814, 33815, - 33817, 33818, 33819, 33822, 33823, 33824, 33825, 33826, 33827, 33833, - 33834, 33835, 33836, 33837, 33838, 33839, 33840, 33842, 33843, 33844, - 33845, 33846, 33847, 33849, 33850, 33851, 33854, 33855, 33856, 33857, - 33858, 33859, 33860, 33861, 33863, 33864, 33865, 33866, 33867, 33868, - 33869, 33870, 33871, 33872, 33874, 33875, 33876, 33877, 33878, 33880, - 33885, 33886, 33887, 33888, 33890, 33892, 33893, 33894, 33895, 33896, - 33898, 33902, 33903, 33904, 33906, 33908, 33911, 33913, 33915, 33916, - 21462, 23094, 40843, 36259, 21435, 22280, 39079, 26435, 37275, 27849, - 20840, 30154, 25331, 29356, 21048, 21149, 32570, 28820, 30264, 21364, - 40522, 27063, 30830, 38592, 35033, 32676, 28982, 29123, 20873, 26579, - 29924, 22756, 25880, 22199, 35753, 39286, 25200, 32469, 24825, 28909, - 22764, 20161, 20154, 24525, 38887, 20219, 35748, 20995, 22922, 32427, - 25172, 20173, 26085, 25102, 33592, 33993, 33635, 34701, 29076, 28342, - 23481, 32466, 20887, 25545, 26580, 32905, 33593, 34837, 20754, 23418, - 22914, 36785, 20083, 27741, 20837, 35109, 36719, 38446, 34122, 29790, - 38160, 38384, 28070, 33509, 24369, 25746, 27922, 33832, 33134, 40131, - 22622, 36187, 19977, 21441, 33917, 33918, 33919, 33920, 33921, 33923, - 33924, 33925, 33926, 33930, 33933, 33935, 33936, 33937, 33938, 33939, - 33940, 33941, 33942, 33944, 33946, 33947, 33949, 33950, 33951, 33952, - 33954, 33955, 33956, 33957, 33958, 33959, 33960, 33961, 33962, 33963, - 33964, 33965, 33966, 33968, 33969, 33971, 33973, 33974, 33975, 33979, - 33980, 33982, 33984, 33986, 33987, 33989, 33990, 33991, 33992, 33995, - 33996, 33998, 33999, 34002, 34004, 34005, 34007, 34008, 34009, 34010, - 34011, 34012, 34014, 34017, 34018, 34020, 34023, 34024, 34025, 34026, - 34027, 34029, 34030, 34031, 34033, 34034, 34035, 34036, 34037, 34038, - 34039, 34040, 34041, 34042, 34043, 34045, 34046, 34048, 34049, 34050, - 20254, 25955, 26705, 21971, 20007, 25620, 39578, 25195, 23234, 29791, - 33394, 28073, 26862, 20711, 33678, 30722, 26432, 21049, 27801, 32433, - 20667, 21861, 29022, 31579, 26194, 29642, 33515, 26441, 23665, 21024, - 29053, 34923, 38378, 38485, 25797, 36193, 33203, 21892, 27733, 25159, - 32558, 22674, 20260, 21830, 36175, 26188, 19978, 23578, 35059, 26786, - 25422, 31245, 28903, 33421, 21242, 38902, 23569, 21736, 37045, 32461, - 22882, 36170, 34503, 33292, 33293, 36198, 25668, 23556, 24913, 28041, - 31038, 35774, 30775, 30003, 21627, 20280, 36523, 28145, 23072, 32453, - 31070, 27784, 23457, 23158, 29978, 32958, 24910, 28183, 22768, 29983, - 29989, 29298, 21319, 32499, 34051, 34052, 34053, 34054, 34055, 34056, - 34057, 34058, 34059, 34061, 34062, 34063, 34064, 34066, 34068, 34069, - 34070, 34072, 34073, 34075, 34076, 34077, 34078, 34080, 34082, 34083, - 34084, 34085, 34086, 34087, 34088, 34089, 34090, 34093, 34094, 34095, - 34096, 34097, 34098, 34099, 34100, 34101, 34102, 34110, 34111, 34112, - 34113, 34114, 34116, 34117, 34118, 34119, 34123, 34124, 34125, 34126, - 34127, 34128, 34129, 34130, 34131, 34132, 34133, 34135, 34136, 34138, - 34139, 34140, 34141, 34143, 34144, 34145, 34146, 34147, 34149, 34150, - 34151, 34153, 34154, 34155, 34156, 34157, 34158, 34159, 34160, 34161, - 34163, 34165, 34166, 34167, 34168, 34172, 34173, 34175, 34176, 34177, - 30465, 30427, 21097, 32988, 22307, 24072, 22833, 29422, 26045, 28287, - 35799, 23608, 34417, 21313, 30707, 25342, 26102, 20160, 39135, 34432, - 23454, 35782, 21490, 30690, 20351, 23630, 39542, 22987, 24335, 31034, - 22763, 19990, 26623, 20107, 25325, 35475, 36893, 21183, 26159, 21980, - 22124, 36866, 20181, 20365, 37322, 39280, 27663, 24066, 24643, 23460, - 35270, 35797, 25910, 25163, 39318, 23432, 23551, 25480, 21806, 21463, - 30246, 20861, 34092, 26530, 26803, 27530, 25234, 36755, 21460, 33298, - 28113, 30095, 20070, 36174, 23408, 29087, 34223, 26257, 26329, 32626, - 34560, 40653, 40736, 23646, 26415, 36848, 26641, 26463, 25101, 31446, - 22661, 24246, 25968, 28465, 34178, 34179, 34182, 34184, 34185, 34186, - 34187, 34188, 34189, 34190, 34192, 34193, 34194, 34195, 34196, 34197, - 34198, 34199, 34200, 34201, 34202, 34205, 34206, 34207, 34208, 34209, - 34210, 34211, 34213, 34214, 34215, 34217, 34219, 34220, 34221, 34225, - 34226, 34227, 34228, 34229, 34230, 34232, 34234, 34235, 34236, 34237, - 34238, 34239, 34240, 34242, 34243, 34244, 34245, 34246, 34247, 34248, - 34250, 34251, 34252, 34253, 34254, 34257, 34258, 34260, 34262, 34263, - 34264, 34265, 34266, 34267, 34269, 34270, 34271, 34272, 34273, 34274, - 34275, 34277, 34278, 34279, 34280, 34282, 34283, 34284, 34285, 34286, - 34287, 34288, 34289, 34290, 34291, 34292, 34293, 34294, 34295, 34296, - 24661, 21047, 32781, 25684, 34928, 29993, 24069, 26643, 25332, 38684, - 21452, 29245, 35841, 27700, 30561, 31246, 21550, 30636, 39034, 33308, - 35828, 30805, 26388, 28865, 26031, 25749, 22070, 24605, 31169, 21496, - 19997, 27515, 32902, 23546, 21987, 22235, 20282, 20284, 39282, 24051, - 26494, 32824, 24578, 39042, 36865, 23435, 35772, 35829, 25628, 33368, - 25822, 22013, 33487, 37221, 20439, 32032, 36895, 31903, 20723, 22609, - 28335, 23487, 35785, 32899, 37240, 33948, 31639, 34429, 38539, 38543, - 32485, 39635, 30862, 23681, 31319, 36930, 38567, 31071, 23385, 25439, - 31499, 34001, 26797, 21766, 32553, 29712, 32034, 38145, 25152, 22604, - 20182, 23427, 22905, 22612, 34297, 34298, 34300, 34301, 34302, 34304, - 34305, 34306, 34307, 34308, 34310, 34311, 34312, 34313, 34314, 34315, - 34316, 34317, 34318, 34319, 34320, 34322, 34323, 34324, 34325, 34327, - 34328, 34329, 34330, 34331, 34332, 34333, 34334, 34335, 34336, 34337, - 34338, 34339, 34340, 34341, 34342, 34344, 34346, 34347, 34348, 34349, - 34350, 34351, 34352, 34353, 34354, 34355, 34356, 34357, 34358, 34359, - 34361, 34362, 34363, 34365, 34366, 34367, 34368, 34369, 34370, 34371, - 34372, 34373, 34374, 34375, 34376, 34377, 34378, 34379, 34380, 34386, - 34387, 34389, 34390, 34391, 34392, 34393, 34395, 34396, 34397, 34399, - 34400, 34401, 34403, 34404, 34405, 34406, 34407, 34408, 34409, 34410, - 29549, 25374, 36427, 36367, 32974, 33492, 25260, 21488, 27888, 37214, - 22826, 24577, 27760, 22349, 25674, 36138, 30251, 28393, 22363, 27264, - 30192, 28525, 35885, 35848, 22374, 27631, 34962, 30899, 25506, 21497, - 28845, 27748, 22616, 25642, 22530, 26848, 33179, 21776, 31958, 20504, - 36538, 28108, 36255, 28907, 25487, 28059, 28372, 32486, 33796, 26691, - 36867, 28120, 38518, 35752, 22871, 29305, 34276, 33150, 30140, 35466, - 26799, 21076, 36386, 38161, 25552, 39064, 36420, 21884, 20307, 26367, - 22159, 24789, 28053, 21059, 23625, 22825, 28155, 22635, 30000, 29980, - 24684, 33300, 33094, 25361, 26465, 36834, 30522, 36339, 36148, 38081, - 24086, 21381, 21548, 28867, 34413, 34415, 34416, 34418, 34419, 34420, - 34421, 34422, 34423, 34424, 34435, 34436, 34437, 34438, 34439, 34440, - 34441, 34446, 34447, 34448, 34449, 34450, 34452, 34454, 34455, 34456, - 34457, 34458, 34459, 34462, 34463, 34464, 34465, 34466, 34469, 34470, - 34475, 34477, 34478, 34482, 34483, 34487, 34488, 34489, 34491, 34492, - 34493, 34494, 34495, 34497, 34498, 34499, 34501, 34504, 34508, 34509, - 34514, 34515, 34517, 34518, 34519, 34522, 34524, 34525, 34528, 34529, - 34530, 34531, 34533, 34534, 34535, 34536, 34538, 34539, 34540, 34543, - 34549, 34550, 34551, 34554, 34555, 34556, 34557, 34559, 34561, 34564, - 34565, 34566, 34571, 34572, 34574, 34575, 34576, 34577, 34580, 34582, - 27712, 24311, 20572, 20141, 24237, 25402, 33351, 36890, 26704, 37230, - 30643, 21516, 38108, 24420, 31461, 26742, 25413, 31570, 32479, 30171, - 20599, 25237, 22836, 36879, 20984, 31171, 31361, 22270, 24466, 36884, - 28034, 23648, 22303, 21520, 20820, 28237, 22242, 25512, 39059, 33151, - 34581, 35114, 36864, 21534, 23663, 33216, 25302, 25176, 33073, 40501, - 38464, 39534, 39548, 26925, 22949, 25299, 21822, 25366, 21703, 34521, - 27964, 23043, 29926, 34972, 27498, 22806, 35916, 24367, 28286, 29609, - 39037, 20024, 28919, 23436, 30871, 25405, 26202, 30358, 24779, 23451, - 23113, 19975, 33109, 27754, 29579, 20129, 26505, 32593, 24448, 26106, - 26395, 24536, 22916, 23041, 34585, 34587, 34589, 34591, 34592, 34596, - 34598, 34599, 34600, 34602, 34603, 34604, 34605, 34607, 34608, 34610, - 34611, 34613, 34614, 34616, 34617, 34618, 34620, 34621, 34624, 34625, - 34626, 34627, 34628, 34629, 34630, 34634, 34635, 34637, 34639, 34640, - 34641, 34642, 34644, 34645, 34646, 34648, 34650, 34651, 34652, 34653, - 34654, 34655, 34657, 34658, 34662, 34663, 34664, 34665, 34666, 34667, - 34668, 34669, 34671, 34673, 34674, 34675, 34677, 34679, 34680, 34681, - 34682, 34687, 34688, 34689, 34692, 34694, 34695, 34697, 34698, 34700, - 34702, 34703, 34704, 34705, 34706, 34708, 34709, 34710, 34712, 34713, - 34714, 34715, 34716, 34717, 34718, 34720, 34721, 34722, 34723, 34724, - 24013, 24494, 21361, 38886, 36829, 26693, 22260, 21807, 24799, 20026, - 28493, 32500, 33479, 33806, 22996, 20255, 20266, 23614, 32428, 26410, - 34074, 21619, 30031, 32963, 21890, 39759, 20301, 28205, 35859, 23561, - 24944, 21355, 30239, 28201, 34442, 25991, 38395, 32441, 21563, 31283, - 32010, 38382, 21985, 32705, 29934, 25373, 34583, 28065, 31389, 25105, - 26017, 21351, 25569, 27779, 24043, 21596, 38056, 20044, 27745, 35820, - 23627, 26080, 33436, 26791, 21566, 21556, 27595, 27494, 20116, 25410, - 21320, 33310, 20237, 20398, 22366, 25098, 38654, 26212, 29289, 21247, - 21153, 24735, 35823, 26132, 29081, 26512, 35199, 30802, 30717, 26224, - 22075, 21560, 38177, 29306, 34725, 34726, 34727, 34729, 34730, 34734, - 34736, 34737, 34738, 34740, 34742, 34743, 34744, 34745, 34747, 34748, - 34750, 34751, 34753, 34754, 34755, 34756, 34757, 34759, 34760, 34761, - 34764, 34765, 34766, 34767, 34768, 34772, 34773, 34774, 34775, 34776, - 34777, 34778, 34780, 34781, 34782, 34783, 34785, 34786, 34787, 34788, - 34790, 34791, 34792, 34793, 34795, 34796, 34797, 34799, 34800, 34801, - 34802, 34803, 34804, 34805, 34806, 34807, 34808, 34810, 34811, 34812, - 34813, 34815, 34816, 34817, 34818, 34820, 34821, 34822, 34823, 34824, - 34825, 34827, 34828, 34829, 34830, 34831, 34832, 34833, 34834, 34836, - 34839, 34840, 34841, 34842, 34844, 34845, 34846, 34847, 34848, 34851, - 31232, 24687, 24076, 24713, 33181, 22805, 24796, 29060, 28911, 28330, - 27728, 29312, 27268, 34989, 24109, 20064, 23219, 21916, 38115, 27927, - 31995, 38553, 25103, 32454, 30606, 34430, 21283, 38686, 36758, 26247, - 23777, 20384, 29421, 19979, 21414, 22799, 21523, 25472, 38184, 20808, - 20185, 40092, 32420, 21688, 36132, 34900, 33335, 38386, 28046, 24358, - 23244, 26174, 38505, 29616, 29486, 21439, 33146, 39301, 32673, 23466, - 38519, 38480, 32447, 30456, 21410, 38262, 39321, 31665, 35140, 28248, - 20065, 32724, 31077, 35814, 24819, 21709, 20139, 39033, 24055, 27233, - 20687, 21521, 35937, 33831, 30813, 38660, 21066, 21742, 22179, 38144, - 28040, 23477, 28102, 26195, 34852, 34853, 34854, 34855, 34856, 34857, - 34858, 34859, 34860, 34861, 34862, 34863, 34864, 34865, 34867, 34868, - 34869, 34870, 34871, 34872, 34874, 34875, 34877, 34878, 34879, 34881, - 34882, 34883, 34886, 34887, 34888, 34889, 34890, 34891, 34894, 34895, - 34896, 34897, 34898, 34899, 34901, 34902, 34904, 34906, 34907, 34908, - 34909, 34910, 34911, 34912, 34918, 34919, 34922, 34925, 34927, 34929, - 34931, 34932, 34933, 34934, 34936, 34937, 34938, 34939, 34940, 34944, - 34947, 34950, 34951, 34953, 34954, 34956, 34958, 34959, 34960, 34961, - 34963, 34964, 34965, 34967, 34968, 34969, 34970, 34971, 34973, 34974, - 34975, 34976, 34977, 34979, 34981, 34982, 34983, 34984, 34985, 34986, - 23567, 23389, 26657, 32918, 21880, 31505, 25928, 26964, 20123, 27463, - 34638, 38795, 21327, 25375, 25658, 37034, 26012, 32961, 35856, 20889, - 26800, 21368, 34809, 25032, 27844, 27899, 35874, 23633, 34218, 33455, - 38156, 27427, 36763, 26032, 24571, 24515, 20449, 34885, 26143, 33125, - 29481, 24826, 20852, 21009, 22411, 24418, 37026, 34892, 37266, 24184, - 26447, 24615, 22995, 20804, 20982, 33016, 21256, 27769, 38596, 29066, - 20241, 20462, 32670, 26429, 21957, 38152, 31168, 34966, 32483, 22687, - 25100, 38656, 34394, 22040, 39035, 24464, 35768, 33988, 37207, 21465, - 26093, 24207, 30044, 24676, 32110, 23167, 32490, 32493, 36713, 21927, - 23459, 24748, 26059, 29572, 34988, 34990, 34991, 34992, 34994, 34995, - 34996, 34997, 34998, 35000, 35001, 35002, 35003, 35005, 35006, 35007, - 35008, 35011, 35012, 35015, 35016, 35018, 35019, 35020, 35021, 35023, - 35024, 35025, 35027, 35030, 35031, 35034, 35035, 35036, 35037, 35038, - 35040, 35041, 35046, 35047, 35049, 35050, 35051, 35052, 35053, 35054, - 35055, 35058, 35061, 35062, 35063, 35066, 35067, 35069, 35071, 35072, - 35073, 35075, 35076, 35077, 35078, 35079, 35080, 35081, 35083, 35084, - 35085, 35086, 35087, 35089, 35092, 35093, 35094, 35095, 35096, 35100, - 35101, 35102, 35103, 35104, 35106, 35107, 35108, 35110, 35111, 35112, - 35113, 35116, 35117, 35118, 35119, 35121, 35122, 35123, 35125, 35127, - 36873, 30307, 30505, 32474, 38772, 34203, 23398, 31348, 38634, 34880, - 21195, 29071, 24490, 26092, 35810, 23547, 39535, 24033, 27529, 27739, - 35757, 35759, 36874, 36805, 21387, 25276, 40486, 40493, 21568, 20011, - 33469, 29273, 34460, 23830, 34905, 28079, 38597, 21713, 20122, 35766, - 28937, 21693, 38409, 28895, 28153, 30416, 20005, 30740, 34578, 23721, - 24310, 35328, 39068, 38414, 28814, 27839, 22852, 25513, 30524, 34893, - 28436, 33395, 22576, 29141, 21388, 30746, 38593, 21761, 24422, 28976, - 23476, 35866, 39564, 27523, 22830, 40495, 31207, 26472, 25196, 20335, - 30113, 32650, 27915, 38451, 27687, 20208, 30162, 20859, 26679, 28478, - 36992, 33136, 22934, 29814, 35128, 35129, 35130, 35131, 35132, 35133, - 35134, 35135, 35136, 35138, 35139, 35141, 35142, 35143, 35144, 35145, - 35146, 35147, 35148, 35149, 35150, 35151, 35152, 35153, 35154, 35155, - 35156, 35157, 35158, 35159, 35160, 35161, 35162, 35163, 35164, 35165, - 35168, 35169, 35170, 35171, 35172, 35173, 35175, 35176, 35177, 35178, - 35179, 35180, 35181, 35182, 35183, 35184, 35185, 35186, 35187, 35188, - 35189, 35190, 35191, 35192, 35193, 35194, 35196, 35197, 35198, 35200, - 35202, 35204, 35205, 35207, 35208, 35209, 35210, 35211, 35212, 35213, - 35214, 35215, 35216, 35217, 35218, 35219, 35220, 35221, 35222, 35223, - 35224, 35225, 35226, 35227, 35228, 35229, 35230, 35231, 35232, 35233, - 25671, 23591, 36965, 31377, 35875, 23002, 21676, 33280, 33647, 35201, - 32768, 26928, 22094, 32822, 29239, 37326, 20918, 20063, 39029, 25494, - 19994, 21494, 26355, 33099, 22812, 28082, 19968, 22777, 21307, 25558, - 38129, 20381, 20234, 34915, 39056, 22839, 36951, 31227, 20202, 33008, - 30097, 27778, 23452, 23016, 24413, 26885, 34433, 20506, 24050, 20057, - 30691, 20197, 33402, 25233, 26131, 37009, 23673, 20159, 24441, 33222, - 36920, 32900, 30123, 20134, 35028, 24847, 27589, 24518, 20041, 30410, - 28322, 35811, 35758, 35850, 35793, 24322, 32764, 32716, 32462, 33589, - 33643, 22240, 27575, 38899, 38452, 23035, 21535, 38134, 28139, 23493, - 39278, 23609, 24341, 38544, 35234, 35235, 35236, 35237, 35238, 35239, - 35240, 35241, 35242, 35243, 35244, 35245, 35246, 35247, 35248, 35249, - 35250, 35251, 35252, 35253, 35254, 35255, 35256, 35257, 35258, 35259, - 35260, 35261, 35262, 35263, 35264, 35267, 35277, 35283, 35284, 35285, - 35287, 35288, 35289, 35291, 35293, 35295, 35296, 35297, 35298, 35300, - 35303, 35304, 35305, 35306, 35308, 35309, 35310, 35312, 35313, 35314, - 35316, 35317, 35318, 35319, 35320, 35321, 35322, 35323, 35324, 35325, - 35326, 35327, 35329, 35330, 35331, 35332, 35333, 35334, 35336, 35337, - 35338, 35339, 35340, 35341, 35342, 35343, 35344, 35345, 35346, 35347, - 35348, 35349, 35350, 35351, 35352, 35353, 35354, 35355, 35356, 35357, - 21360, 33521, 27185, 23156, 40560, 24212, 32552, 33721, 33828, 33829, - 33639, 34631, 36814, 36194, 30408, 24433, 39062, 30828, 26144, 21727, - 25317, 20323, 33219, 30152, 24248, 38605, 36362, 34553, 21647, 27891, - 28044, 27704, 24703, 21191, 29992, 24189, 20248, 24736, 24551, 23588, - 30001, 37038, 38080, 29369, 27833, 28216, 37193, 26377, 21451, 21491, - 20305, 37321, 35825, 21448, 24188, 36802, 28132, 20110, 30402, 27014, - 34398, 24858, 33286, 20313, 20446, 36926, 40060, 24841, 28189, 28180, - 38533, 20104, 23089, 38632, 19982, 23679, 31161, 23431, 35821, 32701, - 29577, 22495, 33419, 37057, 21505, 36935, 21947, 23786, 24481, 24840, - 27442, 29425, 32946, 35465, 35358, 35359, 35360, 35361, 35362, 35363, - 35364, 35365, 35366, 35367, 35368, 35369, 35370, 35371, 35372, 35373, - 35374, 35375, 35376, 35377, 35378, 35379, 35380, 35381, 35382, 35383, - 35384, 35385, 35386, 35387, 35388, 35389, 35391, 35392, 35393, 35394, - 35395, 35396, 35397, 35398, 35399, 35401, 35402, 35403, 35404, 35405, - 35406, 35407, 35408, 35409, 35410, 35411, 35412, 35413, 35414, 35415, - 35416, 35417, 35418, 35419, 35420, 35421, 35422, 35423, 35424, 35425, - 35426, 35427, 35428, 35429, 35430, 35431, 35432, 35433, 35434, 35435, - 35436, 35437, 35438, 35439, 35440, 35441, 35442, 35443, 35444, 35445, - 35446, 35447, 35448, 35450, 35451, 35452, 35453, 35454, 35455, 35456, - 28020, 23507, 35029, 39044, 35947, 39533, 40499, 28170, 20900, 20803, - 22435, 34945, 21407, 25588, 36757, 22253, 21592, 22278, 29503, 28304, - 32536, 36828, 33489, 24895, 24616, 38498, 26352, 32422, 36234, 36291, - 38053, 23731, 31908, 26376, 24742, 38405, 32792, 20113, 37095, 21248, - 38504, 20801, 36816, 34164, 37213, 26197, 38901, 23381, 21277, 30776, - 26434, 26685, 21705, 28798, 23472, 36733, 20877, 22312, 21681, 25874, - 26242, 36190, 36163, 33039, 33900, 36973, 31967, 20991, 34299, 26531, - 26089, 28577, 34468, 36481, 22122, 36896, 30338, 28790, 29157, 36131, - 25321, 21017, 27901, 36156, 24590, 22686, 24974, 26366, 36192, 25166, - 21939, 28195, 26413, 36711, 35457, 35458, 35459, 35460, 35461, 35462, - 35463, 35464, 35467, 35468, 35469, 35470, 35471, 35472, 35473, 35474, - 35476, 35477, 35478, 35479, 35480, 35481, 35482, 35483, 35484, 35485, - 35486, 35487, 35488, 35489, 35490, 35491, 35492, 35493, 35494, 35495, - 35496, 35497, 35498, 35499, 35500, 35501, 35502, 35503, 35504, 35505, - 35506, 35507, 35508, 35509, 35510, 35511, 35512, 35513, 35514, 35515, - 35516, 35517, 35518, 35519, 35520, 35521, 35522, 35523, 35524, 35525, - 35526, 35527, 35528, 35529, 35530, 35531, 35532, 35533, 35534, 35535, - 35536, 35537, 35538, 35539, 35540, 35541, 35542, 35543, 35544, 35545, - 35546, 35547, 35548, 35549, 35550, 35551, 35552, 35553, 35554, 35555, - 38113, 38392, 30504, 26629, 27048, 21643, 20045, 28856, 35784, 25688, - 25995, 23429, 31364, 20538, 23528, 30651, 27617, 35449, 31896, 27838, - 30415, 26025, 36759, 23853, 23637, 34360, 26632, 21344, 25112, 31449, - 28251, 32509, 27167, 31456, 24432, 28467, 24352, 25484, 28072, 26454, - 19976, 24080, 36134, 20183, 32960, 30260, 38556, 25307, 26157, 25214, - 27836, 36213, 29031, 32617, 20806, 32903, 21484, 36974, 25240, 21746, - 34544, 36761, 32773, 38167, 34071, 36825, 27993, 29645, 26015, 30495, - 29956, 30759, 33275, 36126, 38024, 20390, 26517, 30137, 35786, 38663, - 25391, 38215, 38453, 33976, 25379, 30529, 24449, 29424, 20105, 24596, - 25972, 25327, 27491, 25919, 35556, 35557, 35558, 35559, 35560, 35561, - 35562, 35563, 35564, 35565, 35566, 35567, 35568, 35569, 35570, 35571, - 35572, 35573, 35574, 35575, 35576, 35577, 35578, 35579, 35580, 35581, - 35582, 35583, 35584, 35585, 35586, 35587, 35588, 35589, 35590, 35592, - 35593, 35594, 35595, 35596, 35597, 35598, 35599, 35600, 35601, 35602, - 35603, 35604, 35605, 35606, 35607, 35608, 35609, 35610, 35611, 35612, - 35613, 35614, 35615, 35616, 35617, 35618, 35619, 35620, 35621, 35623, - 35624, 35625, 35626, 35627, 35628, 35629, 35630, 35631, 35632, 35633, - 35634, 35635, 35636, 35637, 35638, 35639, 35640, 35641, 35642, 35643, - 35644, 35645, 35646, 35647, 35648, 35649, 35650, 35651, 35652, 35653, - 24103, 30151, 37073, 35777, 33437, 26525, 25903, 21553, 34584, 30693, - 32930, 33026, 27713, 20043, 32455, 32844, 30452, 26893, 27542, 25191, - 20540, 20356, 22336, 25351, 27490, 36286, 21482, 26088, 32440, 24535, - 25370, 25527, 33267, 33268, 32622, 24092, 23769, 21046, 26234, 31209, - 31258, 36136, 28825, 30164, 28382, 27835, 31378, 20013, 30405, 24544, - 38047, 34935, 32456, 31181, 32959, 37325, 20210, 20247, 33311, 21608, - 24030, 27954, 35788, 31909, 36724, 32920, 24090, 21650, 30385, 23449, - 26172, 39588, 29664, 26666, 34523, 26417, 29482, 35832, 35803, 36880, - 31481, 28891, 29038, 25284, 30633, 22065, 20027, 33879, 26609, 21161, - 34496, 36142, 38136, 31569, 35654, 35655, 35656, 35657, 35658, 35659, - 35660, 35661, 35662, 35663, 35664, 35665, 35666, 35667, 35668, 35669, - 35670, 35671, 35672, 35673, 35674, 35675, 35676, 35677, 35678, 35679, - 35680, 35681, 35682, 35683, 35684, 35685, 35687, 35688, 35689, 35690, - 35691, 35693, 35694, 35695, 35696, 35697, 35698, 35699, 35700, 35701, - 35702, 35703, 35704, 35705, 35706, 35707, 35708, 35709, 35710, 35711, - 35712, 35713, 35714, 35715, 35716, 35717, 35718, 35719, 35720, 35721, - 35722, 35723, 35724, 35725, 35726, 35727, 35728, 35729, 35730, 35731, - 35732, 35733, 35734, 35735, 35736, 35737, 35738, 35739, 35740, 35741, - 35742, 35743, 35756, 35761, 35771, 35783, 35792, 35818, 35849, 35870, - 20303, 27880, 31069, 39547, 25235, 29226, 25341, 19987, 30742, 36716, - 25776, 36186, 31686, 26729, 24196, 35013, 22918, 25758, 22766, 29366, - 26894, 38181, 36861, 36184, 22368, 32512, 35846, 20934, 25417, 25305, - 21331, 26700, 29730, 33537, 37196, 21828, 30528, 28796, 27978, 20857, - 21672, 36164, 23039, 28363, 28100, 23388, 32043, 20180, 31869, 28371, - 23376, 33258, 28173, 23383, 39683, 26837, 36394, 23447, 32508, 24635, - 32437, 37049, 36208, 22863, 25549, 31199, 36275, 21330, 26063, 31062, - 35781, 38459, 32452, 38075, 32386, 22068, 37257, 26368, 32618, 23562, - 36981, 26152, 24038, 20304, 26590, 20570, 20316, 22352, 24231, 65535, - 65535, 65535, 65535, 65535, 35896, 35897, 35898, 35899, 35900, 35901, - 35902, 35903, 35904, 35906, 35907, 35908, 35909, 35912, 35914, 35915, - 35917, 35918, 35919, 35920, 35921, 35922, 35923, 35924, 35926, 35927, - 35928, 35929, 35931, 35932, 35933, 35934, 35935, 35936, 35939, 35940, - 35941, 35942, 35943, 35944, 35945, 35948, 35949, 35950, 35951, 35952, - 35953, 35954, 35956, 35957, 35958, 35959, 35963, 35964, 35965, 35966, - 35967, 35968, 35969, 35971, 35972, 35974, 35975, 35976, 35979, 35981, - 35982, 35983, 35984, 35985, 35986, 35987, 35989, 35990, 35991, 35993, - 35994, 35995, 35996, 35997, 35998, 35999, 36000, 36001, 36002, 36003, - 36004, 36005, 36006, 36007, 36008, 36009, 36010, 36011, 36012, 36013, - 20109, 19980, 20800, 19984, 24319, 21317, 19989, 20120, 19998, 39730, - 23404, 22121, 20008, 31162, 20031, 21269, 20039, 22829, 29243, 21358, - 27664, 22239, 32996, 39319, 27603, 30590, 40727, 20022, 20127, 40720, - 20060, 20073, 20115, 33416, 23387, 21868, 22031, 20164, 21389, 21405, - 21411, 21413, 21422, 38757, 36189, 21274, 21493, 21286, 21294, 21310, - 36188, 21350, 21347, 20994, 21000, 21006, 21037, 21043, 21055, 21056, - 21068, 21086, 21089, 21084, 33967, 21117, 21122, 21121, 21136, 21139, - 20866, 32596, 20155, 20163, 20169, 20162, 20200, 20193, 20203, 20190, - 20251, 20211, 20258, 20324, 20213, 20261, 20263, 20233, 20267, 20318, - 20327, 25912, 20314, 20317, 36014, 36015, 36016, 36017, 36018, 36019, - 36020, 36021, 36022, 36023, 36024, 36025, 36026, 36027, 36028, 36029, - 36030, 36031, 36032, 36033, 36034, 36035, 36036, 36037, 36038, 36039, - 36040, 36041, 36042, 36043, 36044, 36045, 36046, 36047, 36048, 36049, - 36050, 36051, 36052, 36053, 36054, 36055, 36056, 36057, 36058, 36059, - 36060, 36061, 36062, 36063, 36064, 36065, 36066, 36067, 36068, 36069, - 36070, 36071, 36072, 36073, 36074, 36075, 36076, 36077, 36078, 36079, - 36080, 36081, 36082, 36083, 36084, 36085, 36086, 36087, 36088, 36089, - 36090, 36091, 36092, 36093, 36094, 36095, 36096, 36097, 36098, 36099, - 36100, 36101, 36102, 36103, 36104, 36105, 36106, 36107, 36108, 36109, - 20319, 20311, 20274, 20285, 20342, 20340, 20369, 20361, 20355, 20367, - 20350, 20347, 20394, 20348, 20396, 20372, 20454, 20456, 20458, 20421, - 20442, 20451, 20444, 20433, 20447, 20472, 20521, 20556, 20467, 20524, - 20495, 20526, 20525, 20478, 20508, 20492, 20517, 20520, 20606, 20547, - 20565, 20552, 20558, 20588, 20603, 20645, 20647, 20649, 20666, 20694, - 20742, 20717, 20716, 20710, 20718, 20743, 20747, 20189, 27709, 20312, - 20325, 20430, 40864, 27718, 31860, 20846, 24061, 40649, 39320, 20865, - 22804, 21241, 21261, 35335, 21264, 20971, 22809, 20821, 20128, 20822, - 20147, 34926, 34980, 20149, 33044, 35026, 31104, 23348, 34819, 32696, - 20907, 20913, 20925, 20924, 36110, 36111, 36112, 36113, 36114, 36115, - 36116, 36117, 36118, 36119, 36120, 36121, 36122, 36123, 36124, 36128, - 36177, 36178, 36183, 36191, 36197, 36200, 36201, 36202, 36204, 36206, - 36207, 36209, 36210, 36216, 36217, 36218, 36219, 36220, 36221, 36222, - 36223, 36224, 36226, 36227, 36230, 36231, 36232, 36233, 36236, 36237, - 36238, 36239, 36240, 36242, 36243, 36245, 36246, 36247, 36248, 36249, - 36250, 36251, 36252, 36253, 36254, 36256, 36257, 36258, 36260, 36261, - 36262, 36263, 36264, 36265, 36266, 36267, 36268, 36269, 36270, 36271, - 36272, 36274, 36278, 36279, 36281, 36283, 36285, 36288, 36289, 36290, - 36293, 36295, 36296, 36297, 36298, 36301, 36304, 36306, 36307, 36308, - 20935, 20886, 20898, 20901, 35744, 35750, 35751, 35754, 35764, 35765, - 35767, 35778, 35779, 35787, 35791, 35790, 35794, 35795, 35796, 35798, - 35800, 35801, 35804, 35807, 35808, 35812, 35816, 35817, 35822, 35824, - 35827, 35830, 35833, 35836, 35839, 35840, 35842, 35844, 35847, 35852, - 35855, 35857, 35858, 35860, 35861, 35862, 35865, 35867, 35864, 35869, - 35871, 35872, 35873, 35877, 35879, 35882, 35883, 35886, 35887, 35890, - 35891, 35893, 35894, 21353, 21370, 38429, 38434, 38433, 38449, 38442, - 38461, 38460, 38466, 38473, 38484, 38495, 38503, 38508, 38514, 38516, - 38536, 38541, 38551, 38576, 37015, 37019, 37021, 37017, 37036, 37025, - 37044, 37043, 37046, 37050, 36309, 36312, 36313, 36316, 36320, 36321, - 36322, 36325, 36326, 36327, 36329, 36333, 36334, 36336, 36337, 36338, - 36340, 36342, 36348, 36350, 36351, 36352, 36353, 36354, 36355, 36356, - 36358, 36359, 36360, 36363, 36365, 36366, 36368, 36369, 36370, 36371, - 36373, 36374, 36375, 36376, 36377, 36378, 36379, 36380, 36384, 36385, - 36388, 36389, 36390, 36391, 36392, 36395, 36397, 36400, 36402, 36403, - 36404, 36406, 36407, 36408, 36411, 36412, 36414, 36415, 36419, 36421, - 36422, 36428, 36429, 36430, 36431, 36432, 36435, 36436, 36437, 36438, - 36439, 36440, 36442, 36443, 36444, 36445, 36446, 36447, 36448, 36449, - 36450, 36451, 36452, 36453, 36455, 36456, 36458, 36459, 36462, 36465, - 37048, 37040, 37071, 37061, 37054, 37072, 37060, 37063, 37075, 37094, - 37090, 37084, 37079, 37083, 37099, 37103, 37118, 37124, 37154, 37150, - 37155, 37169, 37167, 37177, 37187, 37190, 21005, 22850, 21154, 21164, - 21165, 21182, 21759, 21200, 21206, 21232, 21471, 29166, 30669, 24308, - 20981, 20988, 39727, 21430, 24321, 30042, 24047, 22348, 22441, 22433, - 22654, 22716, 22725, 22737, 22313, 22316, 22314, 22323, 22329, 22318, - 22319, 22364, 22331, 22338, 22377, 22405, 22379, 22406, 22396, 22395, - 22376, 22381, 22390, 22387, 22445, 22436, 22412, 22450, 22479, 22439, - 22452, 22419, 22432, 22485, 22488, 22490, 22489, 22482, 22456, 22516, - 22511, 22520, 22500, 22493, 36467, 36469, 36471, 36472, 36473, 36474, - 36475, 36477, 36478, 36480, 36482, 36483, 36484, 36486, 36488, 36489, - 36490, 36491, 36492, 36493, 36494, 36497, 36498, 36499, 36501, 36502, - 36503, 36504, 36505, 36506, 36507, 36509, 36511, 36512, 36513, 36514, - 36515, 36516, 36517, 36518, 36519, 36520, 36521, 36522, 36525, 36526, - 36528, 36529, 36531, 36532, 36533, 36534, 36535, 36536, 36537, 36539, - 36540, 36541, 36542, 36543, 36544, 36545, 36546, 36547, 36548, 36549, - 36550, 36551, 36552, 36553, 36554, 36555, 36556, 36557, 36559, 36560, - 36561, 36562, 36563, 36564, 36565, 36566, 36567, 36568, 36569, 36570, - 36571, 36572, 36573, 36574, 36575, 36576, 36577, 36578, 36579, 36580, - 22539, 22541, 22525, 22509, 22528, 22558, 22553, 22596, 22560, 22629, - 22636, 22657, 22665, 22682, 22656, 39336, 40729, 25087, 33401, 33405, - 33407, 33423, 33418, 33448, 33412, 33422, 33425, 33431, 33433, 33451, - 33464, 33470, 33456, 33480, 33482, 33507, 33432, 33463, 33454, 33483, - 33484, 33473, 33449, 33460, 33441, 33450, 33439, 33476, 33486, 33444, - 33505, 33545, 33527, 33508, 33551, 33543, 33500, 33524, 33490, 33496, - 33548, 33531, 33491, 33553, 33562, 33542, 33556, 33557, 33504, 33493, - 33564, 33617, 33627, 33628, 33544, 33682, 33596, 33588, 33585, 33691, - 33630, 33583, 33615, 33607, 33603, 33631, 33600, 33559, 33632, 33581, - 33594, 33587, 33638, 33637, 36581, 36582, 36583, 36584, 36585, 36586, - 36587, 36588, 36589, 36590, 36591, 36592, 36593, 36594, 36595, 36596, - 36597, 36598, 36599, 36600, 36601, 36602, 36603, 36604, 36605, 36606, - 36607, 36608, 36609, 36610, 36611, 36612, 36613, 36614, 36615, 36616, - 36617, 36618, 36619, 36620, 36621, 36622, 36623, 36624, 36625, 36626, - 36627, 36628, 36629, 36630, 36631, 36632, 36633, 36634, 36635, 36636, - 36637, 36638, 36639, 36640, 36641, 36642, 36643, 36644, 36645, 36646, - 36647, 36648, 36649, 36650, 36651, 36652, 36653, 36654, 36655, 36656, - 36657, 36658, 36659, 36660, 36661, 36662, 36663, 36664, 36665, 36666, - 36667, 36668, 36669, 36670, 36671, 36672, 36673, 36674, 36675, 36676, - 33640, 33563, 33641, 33644, 33642, 33645, 33646, 33712, 33656, 33715, - 33716, 33696, 33706, 33683, 33692, 33669, 33660, 33718, 33705, 33661, - 33720, 33659, 33688, 33694, 33704, 33722, 33724, 33729, 33793, 33765, - 33752, 22535, 33816, 33803, 33757, 33789, 33750, 33820, 33848, 33809, - 33798, 33748, 33759, 33807, 33795, 33784, 33785, 33770, 33733, 33728, - 33830, 33776, 33761, 33884, 33873, 33882, 33881, 33907, 33927, 33928, - 33914, 33929, 33912, 33852, 33862, 33897, 33910, 33932, 33934, 33841, - 33901, 33985, 33997, 34000, 34022, 33981, 34003, 33994, 33983, 33978, - 34016, 33953, 33977, 33972, 33943, 34021, 34019, 34060, 29965, 34104, - 34032, 34105, 34079, 34106, 36677, 36678, 36679, 36680, 36681, 36682, - 36683, 36684, 36685, 36686, 36687, 36688, 36689, 36690, 36691, 36692, - 36693, 36694, 36695, 36696, 36697, 36698, 36699, 36700, 36701, 36702, - 36703, 36704, 36705, 36706, 36707, 36708, 36709, 36714, 36736, 36748, - 36754, 36765, 36768, 36769, 36770, 36772, 36773, 36774, 36775, 36778, - 36780, 36781, 36782, 36783, 36786, 36787, 36788, 36789, 36791, 36792, - 36794, 36795, 36796, 36799, 36800, 36803, 36806, 36809, 36810, 36811, - 36812, 36813, 36815, 36818, 36822, 36823, 36826, 36832, 36833, 36835, - 36839, 36844, 36847, 36849, 36850, 36852, 36853, 36854, 36858, 36859, - 36860, 36862, 36863, 36871, 36872, 36876, 36878, 36883, 36885, 36888, - 34134, 34107, 34047, 34044, 34137, 34120, 34152, 34148, 34142, 34170, - 30626, 34115, 34162, 34171, 34212, 34216, 34183, 34191, 34169, 34222, - 34204, 34181, 34233, 34231, 34224, 34259, 34241, 34268, 34303, 34343, - 34309, 34345, 34326, 34364, 24318, 24328, 22844, 22849, 32823, 22869, - 22874, 22872, 21263, 23586, 23589, 23596, 23604, 25164, 25194, 25247, - 25275, 25290, 25306, 25303, 25326, 25378, 25334, 25401, 25419, 25411, - 25517, 25590, 25457, 25466, 25486, 25524, 25453, 25516, 25482, 25449, - 25518, 25532, 25586, 25592, 25568, 25599, 25540, 25566, 25550, 25682, - 25542, 25534, 25669, 25665, 25611, 25627, 25632, 25612, 25638, 25633, - 25694, 25732, 25709, 25750, 36889, 36892, 36899, 36900, 36901, 36903, - 36904, 36905, 36906, 36907, 36908, 36912, 36913, 36914, 36915, 36916, - 36919, 36921, 36922, 36925, 36927, 36928, 36931, 36933, 36934, 36936, - 36937, 36938, 36939, 36940, 36942, 36948, 36949, 36950, 36953, 36954, - 36956, 36957, 36958, 36959, 36960, 36961, 36964, 36966, 36967, 36969, - 36970, 36971, 36972, 36975, 36976, 36977, 36978, 36979, 36982, 36983, - 36984, 36985, 36986, 36987, 36988, 36990, 36993, 36996, 36997, 36998, - 36999, 37001, 37002, 37004, 37005, 37006, 37007, 37008, 37010, 37012, - 37014, 37016, 37018, 37020, 37022, 37023, 37024, 37028, 37029, 37031, - 37032, 37033, 37035, 37037, 37042, 37047, 37052, 37053, 37055, 37056, - 25722, 25783, 25784, 25753, 25786, 25792, 25808, 25815, 25828, 25826, - 25865, 25893, 25902, 24331, 24530, 29977, 24337, 21343, 21489, 21501, - 21481, 21480, 21499, 21522, 21526, 21510, 21579, 21586, 21587, 21588, - 21590, 21571, 21537, 21591, 21593, 21539, 21554, 21634, 21652, 21623, - 21617, 21604, 21658, 21659, 21636, 21622, 21606, 21661, 21712, 21677, - 21698, 21684, 21714, 21671, 21670, 21715, 21716, 21618, 21667, 21717, - 21691, 21695, 21708, 21721, 21722, 21724, 21673, 21674, 21668, 21725, - 21711, 21726, 21787, 21735, 21792, 21757, 21780, 21747, 21794, 21795, - 21775, 21777, 21799, 21802, 21863, 21903, 21941, 21833, 21869, 21825, - 21845, 21823, 21840, 21820, 37058, 37059, 37062, 37064, 37065, 37067, - 37068, 37069, 37074, 37076, 37077, 37078, 37080, 37081, 37082, 37086, - 37087, 37088, 37091, 37092, 37093, 37097, 37098, 37100, 37102, 37104, - 37105, 37106, 37107, 37109, 37110, 37111, 37113, 37114, 37115, 37116, - 37119, 37120, 37121, 37123, 37125, 37126, 37127, 37128, 37129, 37130, - 37131, 37132, 37133, 37134, 37135, 37136, 37137, 37138, 37139, 37140, - 37141, 37142, 37143, 37144, 37146, 37147, 37148, 37149, 37151, 37152, - 37153, 37156, 37157, 37158, 37159, 37160, 37161, 37162, 37163, 37164, - 37165, 37166, 37168, 37170, 37171, 37172, 37173, 37174, 37175, 37176, - 37178, 37179, 37180, 37181, 37182, 37183, 37184, 37185, 37186, 37188, - 21815, 21846, 21877, 21878, 21879, 21811, 21808, 21852, 21899, 21970, - 21891, 21937, 21945, 21896, 21889, 21919, 21886, 21974, 21905, 21883, - 21983, 21949, 21950, 21908, 21913, 21994, 22007, 21961, 22047, 21969, - 21995, 21996, 21972, 21990, 21981, 21956, 21999, 21989, 22002, 22003, - 21964, 21965, 21992, 22005, 21988, 36756, 22046, 22024, 22028, 22017, - 22052, 22051, 22014, 22016, 22055, 22061, 22104, 22073, 22103, 22060, - 22093, 22114, 22105, 22108, 22092, 22100, 22150, 22116, 22129, 22123, - 22139, 22140, 22149, 22163, 22191, 22228, 22231, 22237, 22241, 22261, - 22251, 22265, 22271, 22276, 22282, 22281, 22300, 24079, 24089, 24084, - 24081, 24113, 24123, 24124, 37189, 37191, 37192, 37201, 37203, 37204, - 37205, 37206, 37208, 37209, 37211, 37212, 37215, 37216, 37222, 37223, - 37224, 37227, 37229, 37235, 37242, 37243, 37244, 37248, 37249, 37250, - 37251, 37252, 37254, 37256, 37258, 37262, 37263, 37267, 37268, 37269, - 37270, 37271, 37272, 37273, 37276, 37277, 37278, 37279, 37280, 37281, - 37284, 37285, 37286, 37287, 37288, 37289, 37291, 37292, 37296, 37297, - 37298, 37299, 37302, 37303, 37304, 37305, 37307, 37308, 37309, 37310, - 37311, 37312, 37313, 37314, 37315, 37316, 37317, 37318, 37320, 37323, - 37328, 37330, 37331, 37332, 37333, 37334, 37335, 37336, 37337, 37338, - 37339, 37341, 37342, 37343, 37344, 37345, 37346, 37347, 37348, 37349, - 24119, 24132, 24148, 24155, 24158, 24161, 23692, 23674, 23693, 23696, - 23702, 23688, 23704, 23705, 23697, 23706, 23708, 23733, 23714, 23741, - 23724, 23723, 23729, 23715, 23745, 23735, 23748, 23762, 23780, 23755, - 23781, 23810, 23811, 23847, 23846, 23854, 23844, 23838, 23814, 23835, - 23896, 23870, 23860, 23869, 23916, 23899, 23919, 23901, 23915, 23883, - 23882, 23913, 23924, 23938, 23961, 23965, 35955, 23991, 24005, 24435, - 24439, 24450, 24455, 24457, 24460, 24469, 24473, 24476, 24488, 24493, - 24501, 24508, 34914, 24417, 29357, 29360, 29364, 29367, 29368, 29379, - 29377, 29390, 29389, 29394, 29416, 29423, 29417, 29426, 29428, 29431, - 29441, 29427, 29443, 29434, 37350, 37351, 37352, 37353, 37354, 37355, - 37356, 37357, 37358, 37359, 37360, 37361, 37362, 37363, 37364, 37365, - 37366, 37367, 37368, 37369, 37370, 37371, 37372, 37373, 37374, 37375, - 37376, 37377, 37378, 37379, 37380, 37381, 37382, 37383, 37384, 37385, - 37386, 37387, 37388, 37389, 37390, 37391, 37392, 37393, 37394, 37395, - 37396, 37397, 37398, 37399, 37400, 37401, 37402, 37403, 37404, 37405, - 37406, 37407, 37408, 37409, 37410, 37411, 37412, 37413, 37414, 37415, - 37416, 37417, 37418, 37419, 37420, 37421, 37422, 37423, 37424, 37425, - 37426, 37427, 37428, 37429, 37430, 37431, 37432, 37433, 37434, 37435, - 37436, 37437, 37438, 37439, 37440, 37441, 37442, 37443, 37444, 37445, - 29435, 29463, 29459, 29473, 29450, 29470, 29469, 29461, 29474, 29497, - 29477, 29484, 29496, 29489, 29520, 29517, 29527, 29536, 29548, 29551, - 29566, 33307, 22821, 39143, 22820, 22786, 39267, 39271, 39272, 39273, - 39274, 39275, 39276, 39284, 39287, 39293, 39296, 39300, 39303, 39306, - 39309, 39312, 39313, 39315, 39316, 39317, 24192, 24209, 24203, 24214, - 24229, 24224, 24249, 24245, 24254, 24243, 36179, 24274, 24273, 24283, - 24296, 24298, 33210, 24516, 24521, 24534, 24527, 24579, 24558, 24580, - 24545, 24548, 24574, 24581, 24582, 24554, 24557, 24568, 24601, 24629, - 24614, 24603, 24591, 24589, 24617, 24619, 24586, 24639, 24609, 24696, - 24697, 24699, 24698, 24642, 37446, 37447, 37448, 37449, 37450, 37451, - 37452, 37453, 37454, 37455, 37456, 37457, 37458, 37459, 37460, 37461, - 37462, 37463, 37464, 37465, 37466, 37467, 37468, 37469, 37470, 37471, - 37472, 37473, 37474, 37475, 37476, 37477, 37478, 37479, 37480, 37481, - 37482, 37483, 37484, 37485, 37486, 37487, 37488, 37489, 37490, 37491, - 37493, 37494, 37495, 37496, 37497, 37498, 37499, 37500, 37501, 37502, - 37503, 37504, 37505, 37506, 37507, 37508, 37509, 37510, 37511, 37512, - 37513, 37514, 37515, 37516, 37517, 37519, 37520, 37521, 37522, 37523, - 37524, 37525, 37526, 37527, 37528, 37529, 37530, 37531, 37532, 37533, - 37534, 37535, 37536, 37537, 37538, 37539, 37540, 37541, 37542, 37543, - 24682, 24701, 24726, 24730, 24749, 24733, 24707, 24722, 24716, 24731, - 24812, 24763, 24753, 24797, 24792, 24774, 24794, 24756, 24864, 24870, - 24853, 24867, 24820, 24832, 24846, 24875, 24906, 24949, 25004, 24980, - 24999, 25015, 25044, 25077, 24541, 38579, 38377, 38379, 38385, 38387, - 38389, 38390, 38396, 38398, 38403, 38404, 38406, 38408, 38410, 38411, - 38412, 38413, 38415, 38418, 38421, 38422, 38423, 38425, 38426, 20012, - 29247, 25109, 27701, 27732, 27740, 27722, 27811, 27781, 27792, 27796, - 27788, 27752, 27753, 27764, 27766, 27782, 27817, 27856, 27860, 27821, - 27895, 27896, 27889, 27863, 27826, 27872, 27862, 27898, 27883, 27886, - 27825, 27859, 27887, 27902, 37544, 37545, 37546, 37547, 37548, 37549, - 37551, 37552, 37553, 37554, 37555, 37556, 37557, 37558, 37559, 37560, - 37561, 37562, 37563, 37564, 37565, 37566, 37567, 37568, 37569, 37570, - 37571, 37572, 37573, 37574, 37575, 37577, 37578, 37579, 37580, 37581, - 37582, 37583, 37584, 37585, 37586, 37587, 37588, 37589, 37590, 37591, - 37592, 37593, 37594, 37595, 37596, 37597, 37598, 37599, 37600, 37601, - 37602, 37603, 37604, 37605, 37606, 37607, 37608, 37609, 37610, 37611, - 37612, 37613, 37614, 37615, 37616, 37617, 37618, 37619, 37620, 37621, - 37622, 37623, 37624, 37625, 37626, 37627, 37628, 37629, 37630, 37631, - 37632, 37633, 37634, 37635, 37636, 37637, 37638, 37639, 37640, 37641, - 27961, 27943, 27916, 27971, 27976, 27911, 27908, 27929, 27918, 27947, - 27981, 27950, 27957, 27930, 27983, 27986, 27988, 27955, 28049, 28015, - 28062, 28064, 27998, 28051, 28052, 27996, 28000, 28028, 28003, 28186, - 28103, 28101, 28126, 28174, 28095, 28128, 28177, 28134, 28125, 28121, - 28182, 28075, 28172, 28078, 28203, 28270, 28238, 28267, 28338, 28255, - 28294, 28243, 28244, 28210, 28197, 28228, 28383, 28337, 28312, 28384, - 28461, 28386, 28325, 28327, 28349, 28347, 28343, 28375, 28340, 28367, - 28303, 28354, 28319, 28514, 28486, 28487, 28452, 28437, 28409, 28463, - 28470, 28491, 28532, 28458, 28425, 28457, 28553, 28557, 28556, 28536, - 28530, 28540, 28538, 28625, 37642, 37643, 37644, 37645, 37646, 37647, - 37648, 37649, 37650, 37651, 37652, 37653, 37654, 37655, 37656, 37657, - 37658, 37659, 37660, 37661, 37662, 37663, 37664, 37665, 37666, 37667, - 37668, 37669, 37670, 37671, 37672, 37673, 37674, 37675, 37676, 37677, - 37678, 37679, 37680, 37681, 37682, 37683, 37684, 37685, 37686, 37687, - 37688, 37689, 37690, 37691, 37692, 37693, 37695, 37696, 37697, 37698, - 37699, 37700, 37701, 37702, 37703, 37704, 37705, 37706, 37707, 37708, - 37709, 37710, 37711, 37712, 37713, 37714, 37715, 37716, 37717, 37718, - 37719, 37720, 37721, 37722, 37723, 37724, 37725, 37726, 37727, 37728, - 37729, 37730, 37731, 37732, 37733, 37734, 37735, 37736, 37737, 37739, - 28617, 28583, 28601, 28598, 28610, 28641, 28654, 28638, 28640, 28655, - 28698, 28707, 28699, 28729, 28725, 28751, 28766, 23424, 23428, 23445, - 23443, 23461, 23480, 29999, 39582, 25652, 23524, 23534, 35120, 23536, - 36423, 35591, 36790, 36819, 36821, 36837, 36846, 36836, 36841, 36838, - 36851, 36840, 36869, 36868, 36875, 36902, 36881, 36877, 36886, 36897, - 36917, 36918, 36909, 36911, 36932, 36945, 36946, 36944, 36968, 36952, - 36962, 36955, 26297, 36980, 36989, 36994, 37000, 36995, 37003, 24400, - 24407, 24406, 24408, 23611, 21675, 23632, 23641, 23409, 23651, 23654, - 32700, 24362, 24361, 24365, 33396, 24380, 39739, 23662, 22913, 22915, - 22925, 22953, 22954, 22947, 37740, 37741, 37742, 37743, 37744, 37745, - 37746, 37747, 37748, 37749, 37750, 37751, 37752, 37753, 37754, 37755, - 37756, 37757, 37758, 37759, 37760, 37761, 37762, 37763, 37764, 37765, - 37766, 37767, 37768, 37769, 37770, 37771, 37772, 37773, 37774, 37776, - 37777, 37778, 37779, 37780, 37781, 37782, 37783, 37784, 37785, 37786, - 37787, 37788, 37789, 37790, 37791, 37792, 37793, 37794, 37795, 37796, - 37797, 37798, 37799, 37800, 37801, 37802, 37803, 37804, 37805, 37806, - 37807, 37808, 37809, 37810, 37811, 37812, 37813, 37814, 37815, 37816, - 37817, 37818, 37819, 37820, 37821, 37822, 37823, 37824, 37825, 37826, - 37827, 37828, 37829, 37830, 37831, 37832, 37833, 37835, 37836, 37837, - 22935, 22986, 22955, 22942, 22948, 22994, 22962, 22959, 22999, 22974, - 23045, 23046, 23005, 23048, 23011, 23000, 23033, 23052, 23049, 23090, - 23092, 23057, 23075, 23059, 23104, 23143, 23114, 23125, 23100, 23138, - 23157, 33004, 23210, 23195, 23159, 23162, 23230, 23275, 23218, 23250, - 23252, 23224, 23264, 23267, 23281, 23254, 23270, 23256, 23260, 23305, - 23319, 23318, 23346, 23351, 23360, 23573, 23580, 23386, 23397, 23411, - 23377, 23379, 23394, 39541, 39543, 39544, 39546, 39551, 39549, 39552, - 39553, 39557, 39560, 39562, 39568, 39570, 39571, 39574, 39576, 39579, - 39580, 39581, 39583, 39584, 39586, 39587, 39589, 39591, 32415, 32417, - 32419, 32421, 32424, 32425, 37838, 37839, 37840, 37841, 37842, 37843, - 37844, 37845, 37847, 37848, 37849, 37850, 37851, 37852, 37853, 37854, - 37855, 37856, 37857, 37858, 37859, 37860, 37861, 37862, 37863, 37864, - 37865, 37866, 37867, 37868, 37869, 37870, 37871, 37872, 37873, 37874, - 37875, 37876, 37877, 37878, 37879, 37880, 37881, 37882, 37883, 37884, - 37885, 37886, 37887, 37888, 37889, 37890, 37891, 37892, 37893, 37894, - 37895, 37896, 37897, 37898, 37899, 37900, 37901, 37902, 37903, 37904, - 37905, 37906, 37907, 37908, 37909, 37910, 37911, 37912, 37913, 37914, - 37915, 37916, 37917, 37918, 37919, 37920, 37921, 37922, 37923, 37924, - 37925, 37926, 37927, 37928, 37929, 37930, 37931, 37932, 37933, 37934, - 32429, 32432, 32446, 32448, 32449, 32450, 32457, 32459, 32460, 32464, - 32468, 32471, 32475, 32480, 32481, 32488, 32491, 32494, 32495, 32497, - 32498, 32525, 32502, 32506, 32507, 32510, 32513, 32514, 32515, 32519, - 32520, 32523, 32524, 32527, 32529, 32530, 32535, 32537, 32540, 32539, - 32543, 32545, 32546, 32547, 32548, 32549, 32550, 32551, 32554, 32555, - 32556, 32557, 32559, 32560, 32561, 32562, 32563, 32565, 24186, 30079, - 24027, 30014, 37013, 29582, 29585, 29614, 29602, 29599, 29647, 29634, - 29649, 29623, 29619, 29632, 29641, 29640, 29669, 29657, 39036, 29706, - 29673, 29671, 29662, 29626, 29682, 29711, 29738, 29787, 29734, 29733, - 29736, 29744, 29742, 29740, 37935, 37936, 37937, 37938, 37939, 37940, - 37941, 37942, 37943, 37944, 37945, 37946, 37947, 37948, 37949, 37951, - 37952, 37953, 37954, 37955, 37956, 37957, 37958, 37959, 37960, 37961, - 37962, 37963, 37964, 37965, 37966, 37967, 37968, 37969, 37970, 37971, - 37972, 37973, 37974, 37975, 37976, 37977, 37978, 37979, 37980, 37981, - 37982, 37983, 37984, 37985, 37986, 37987, 37988, 37989, 37990, 37991, - 37992, 37993, 37994, 37996, 37997, 37998, 37999, 38000, 38001, 38002, - 38003, 38004, 38005, 38006, 38007, 38008, 38009, 38010, 38011, 38012, - 38013, 38014, 38015, 38016, 38017, 38018, 38019, 38020, 38033, 38038, - 38040, 38087, 38095, 38099, 38100, 38106, 38118, 38139, 38172, 38176, - 29723, 29722, 29761, 29788, 29783, 29781, 29785, 29815, 29805, 29822, - 29852, 29838, 29824, 29825, 29831, 29835, 29854, 29864, 29865, 29840, - 29863, 29906, 29882, 38890, 38891, 38892, 26444, 26451, 26462, 26440, - 26473, 26533, 26503, 26474, 26483, 26520, 26535, 26485, 26536, 26526, - 26541, 26507, 26487, 26492, 26608, 26633, 26584, 26634, 26601, 26544, - 26636, 26585, 26549, 26586, 26547, 26589, 26624, 26563, 26552, 26594, - 26638, 26561, 26621, 26674, 26675, 26720, 26721, 26702, 26722, 26692, - 26724, 26755, 26653, 26709, 26726, 26689, 26727, 26688, 26686, 26698, - 26697, 26665, 26805, 26767, 26740, 26743, 26771, 26731, 26818, 26990, - 26876, 26911, 26912, 26873, 38183, 38195, 38205, 38211, 38216, 38219, - 38229, 38234, 38240, 38254, 38260, 38261, 38263, 38264, 38265, 38266, - 38267, 38268, 38269, 38270, 38272, 38273, 38274, 38275, 38276, 38277, - 38278, 38279, 38280, 38281, 38282, 38283, 38284, 38285, 38286, 38287, - 38288, 38289, 38290, 38291, 38292, 38293, 38294, 38295, 38296, 38297, - 38298, 38299, 38300, 38301, 38302, 38303, 38304, 38305, 38306, 38307, - 38308, 38309, 38310, 38311, 38312, 38313, 38314, 38315, 38316, 38317, - 38318, 38319, 38320, 38321, 38322, 38323, 38324, 38325, 38326, 38327, - 38328, 38329, 38330, 38331, 38332, 38333, 38334, 38335, 38336, 38337, - 38338, 38339, 38340, 38341, 38342, 38343, 38344, 38345, 38346, 38347, - 26916, 26864, 26891, 26881, 26967, 26851, 26896, 26993, 26937, 26976, - 26946, 26973, 27012, 26987, 27008, 27032, 27000, 26932, 27084, 27015, - 27016, 27086, 27017, 26982, 26979, 27001, 27035, 27047, 27067, 27051, - 27053, 27092, 27057, 27073, 27082, 27103, 27029, 27104, 27021, 27135, - 27183, 27117, 27159, 27160, 27237, 27122, 27204, 27198, 27296, 27216, - 27227, 27189, 27278, 27257, 27197, 27176, 27224, 27260, 27281, 27280, - 27305, 27287, 27307, 29495, 29522, 27521, 27522, 27527, 27524, 27538, - 27539, 27533, 27546, 27547, 27553, 27562, 36715, 36717, 36721, 36722, - 36723, 36725, 36726, 36728, 36727, 36729, 36730, 36732, 36734, 36737, - 36738, 36740, 36743, 36747, 38348, 38349, 38350, 38351, 38352, 38353, - 38354, 38355, 38356, 38357, 38358, 38359, 38360, 38361, 38362, 38363, - 38364, 38365, 38366, 38367, 38368, 38369, 38370, 38371, 38372, 38373, - 38374, 38375, 38380, 38399, 38407, 38419, 38424, 38427, 38430, 38432, - 38435, 38436, 38437, 38438, 38439, 38440, 38441, 38443, 38444, 38445, - 38447, 38448, 38455, 38456, 38457, 38458, 38462, 38465, 38467, 38474, - 38478, 38479, 38481, 38482, 38483, 38486, 38487, 38488, 38489, 38490, - 38492, 38493, 38494, 38496, 38499, 38501, 38502, 38507, 38509, 38510, - 38511, 38512, 38513, 38515, 38520, 38521, 38522, 38523, 38524, 38525, - 38526, 38527, 38528, 38529, 38530, 38531, 38532, 38535, 38537, 38538, - 36749, 36750, 36751, 36760, 36762, 36558, 25099, 25111, 25115, 25119, - 25122, 25121, 25125, 25124, 25132, 33255, 29935, 29940, 29951, 29967, - 29969, 29971, 25908, 26094, 26095, 26096, 26122, 26137, 26482, 26115, - 26133, 26112, 28805, 26359, 26141, 26164, 26161, 26166, 26165, 32774, - 26207, 26196, 26177, 26191, 26198, 26209, 26199, 26231, 26244, 26252, - 26279, 26269, 26302, 26331, 26332, 26342, 26345, 36146, 36147, 36150, - 36155, 36157, 36160, 36165, 36166, 36168, 36169, 36167, 36173, 36181, - 36185, 35271, 35274, 35275, 35276, 35278, 35279, 35280, 35281, 29294, - 29343, 29277, 29286, 29295, 29310, 29311, 29316, 29323, 29325, 29327, - 29330, 25352, 25394, 25520, 38540, 38542, 38545, 38546, 38547, 38549, - 38550, 38554, 38555, 38557, 38558, 38559, 38560, 38561, 38562, 38563, - 38564, 38565, 38566, 38568, 38569, 38570, 38571, 38572, 38573, 38574, - 38575, 38577, 38578, 38580, 38581, 38583, 38584, 38586, 38587, 38591, - 38594, 38595, 38600, 38602, 38603, 38608, 38609, 38611, 38612, 38614, - 38615, 38616, 38617, 38618, 38619, 38620, 38621, 38622, 38623, 38625, - 38626, 38627, 38628, 38629, 38630, 38631, 38635, 38636, 38637, 38638, - 38640, 38641, 38642, 38644, 38645, 38648, 38650, 38651, 38652, 38653, - 38655, 38658, 38659, 38661, 38666, 38667, 38668, 38672, 38673, 38674, - 38676, 38677, 38679, 38680, 38681, 38682, 38683, 38685, 38687, 38688, - 25663, 25816, 32772, 27626, 27635, 27645, 27637, 27641, 27653, 27655, - 27654, 27661, 27669, 27672, 27673, 27674, 27681, 27689, 27684, 27690, - 27698, 25909, 25941, 25963, 29261, 29266, 29270, 29232, 34402, 21014, - 32927, 32924, 32915, 32956, 26378, 32957, 32945, 32939, 32941, 32948, - 32951, 32999, 33000, 33001, 33002, 32987, 32962, 32964, 32985, 32973, - 32983, 26384, 32989, 33003, 33009, 33012, 33005, 33037, 33038, 33010, - 33020, 26389, 33042, 35930, 33078, 33054, 33068, 33048, 33074, 33096, - 33100, 33107, 33140, 33113, 33114, 33137, 33120, 33129, 33148, 33149, - 33133, 33127, 22605, 23221, 33160, 33154, 33169, 28373, 33187, 33194, - 33228, 26406, 33226, 33211, 38689, 38690, 38691, 38692, 38693, 38694, - 38695, 38696, 38697, 38699, 38700, 38702, 38703, 38705, 38707, 38708, - 38709, 38710, 38711, 38714, 38715, 38716, 38717, 38719, 38720, 38721, - 38722, 38723, 38724, 38725, 38726, 38727, 38728, 38729, 38730, 38731, - 38732, 38733, 38734, 38735, 38736, 38737, 38740, 38741, 38743, 38744, - 38746, 38748, 38749, 38751, 38755, 38756, 38758, 38759, 38760, 38762, - 38763, 38764, 38765, 38766, 38767, 38768, 38769, 38770, 38773, 38775, - 38776, 38777, 38778, 38779, 38781, 38782, 38783, 38784, 38785, 38786, - 38787, 38788, 38790, 38791, 38792, 38793, 38794, 38796, 38798, 38799, - 38800, 38803, 38805, 38806, 38807, 38809, 38810, 38811, 38812, 38813, - 33217, 33190, 27428, 27447, 27449, 27459, 27462, 27481, 39121, 39122, - 39123, 39125, 39129, 39130, 27571, 24384, 27586, 35315, 26000, 40785, - 26003, 26044, 26054, 26052, 26051, 26060, 26062, 26066, 26070, 28800, - 28828, 28822, 28829, 28859, 28864, 28855, 28843, 28849, 28904, 28874, - 28944, 28947, 28950, 28975, 28977, 29043, 29020, 29032, 28997, 29042, - 29002, 29048, 29050, 29080, 29107, 29109, 29096, 29088, 29152, 29140, - 29159, 29177, 29213, 29224, 28780, 28952, 29030, 29113, 25150, 25149, - 25155, 25160, 25161, 31035, 31040, 31046, 31049, 31067, 31068, 31059, - 31066, 31074, 31063, 31072, 31087, 31079, 31098, 31109, 31114, 31130, - 31143, 31155, 24529, 24528, 38814, 38815, 38817, 38818, 38820, 38821, - 38822, 38823, 38824, 38825, 38826, 38828, 38830, 38832, 38833, 38835, - 38837, 38838, 38839, 38840, 38841, 38842, 38843, 38844, 38845, 38846, - 38847, 38848, 38849, 38850, 38851, 38852, 38853, 38854, 38855, 38856, - 38857, 38858, 38859, 38860, 38861, 38862, 38863, 38864, 38865, 38866, - 38867, 38868, 38869, 38870, 38871, 38872, 38873, 38874, 38875, 38876, - 38877, 38878, 38879, 38880, 38881, 38882, 38883, 38884, 38885, 38888, - 38894, 38895, 38896, 38897, 38898, 38900, 38903, 38904, 38905, 38906, - 38907, 38908, 38909, 38910, 38911, 38912, 38913, 38914, 38915, 38916, - 38917, 38918, 38919, 38920, 38921, 38922, 38923, 38924, 38925, 38926, - 24636, 24669, 24666, 24679, 24641, 24665, 24675, 24747, 24838, 24845, - 24925, 25001, 24989, 25035, 25041, 25094, 32896, 32895, 27795, 27894, - 28156, 30710, 30712, 30720, 30729, 30743, 30744, 30737, 26027, 30765, - 30748, 30749, 30777, 30778, 30779, 30751, 30780, 30757, 30764, 30755, - 30761, 30798, 30829, 30806, 30807, 30758, 30800, 30791, 30796, 30826, - 30875, 30867, 30874, 30855, 30876, 30881, 30883, 30898, 30905, 30885, - 30932, 30937, 30921, 30956, 30962, 30981, 30964, 30995, 31012, 31006, - 31028, 40859, 40697, 40699, 40700, 30449, 30468, 30477, 30457, 30471, - 30472, 30490, 30498, 30489, 30509, 30502, 30517, 30520, 30544, 30545, - 30535, 30531, 30554, 30568, 38927, 38928, 38929, 38930, 38931, 38932, - 38933, 38934, 38935, 38936, 38937, 38938, 38939, 38940, 38941, 38942, - 38943, 38944, 38945, 38946, 38947, 38948, 38949, 38950, 38951, 38952, - 38953, 38954, 38955, 38956, 38957, 38958, 38959, 38960, 38961, 38962, - 38963, 38964, 38965, 38966, 38967, 38968, 38969, 38970, 38971, 38972, - 38973, 38974, 38975, 38976, 38977, 38978, 38979, 38980, 38981, 38982, - 38983, 38984, 38985, 38986, 38987, 38988, 38989, 38990, 38991, 38992, - 38993, 38994, 38995, 38996, 38997, 38998, 38999, 39000, 39001, 39002, - 39003, 39004, 39005, 39006, 39007, 39008, 39009, 39010, 39011, 39012, - 39013, 39014, 39015, 39016, 39017, 39018, 39019, 39020, 39021, 39022, - 30562, 30565, 30591, 30605, 30589, 30592, 30604, 30609, 30623, 30624, - 30640, 30645, 30653, 30010, 30016, 30030, 30027, 30024, 30043, 30066, - 30073, 30083, 32600, 32609, 32607, 35400, 32616, 32628, 32625, 32633, - 32641, 32638, 30413, 30437, 34866, 38021, 38022, 38023, 38027, 38026, - 38028, 38029, 38031, 38032, 38036, 38039, 38037, 38042, 38043, 38044, - 38051, 38052, 38059, 38058, 38061, 38060, 38063, 38064, 38066, 38068, - 38070, 38071, 38072, 38073, 38074, 38076, 38077, 38079, 38084, 38088, - 38089, 38090, 38091, 38092, 38093, 38094, 38096, 38097, 38098, 38101, - 38102, 38103, 38105, 38104, 38107, 38110, 38111, 38112, 38114, 38116, - 38117, 38119, 38120, 38122, 39023, 39024, 39025, 39026, 39027, 39028, - 39051, 39054, 39058, 39061, 39065, 39075, 39080, 39081, 39082, 39083, - 39084, 39085, 39086, 39087, 39088, 39089, 39090, 39091, 39092, 39093, - 39094, 39095, 39096, 39097, 39098, 39099, 39100, 39101, 39102, 39103, - 39104, 39105, 39106, 39107, 39108, 39109, 39110, 39111, 39112, 39113, - 39114, 39115, 39116, 39117, 39119, 39120, 39124, 39126, 39127, 39131, - 39132, 39133, 39136, 39137, 39138, 39139, 39140, 39141, 39142, 39145, - 39146, 39147, 39148, 39149, 39150, 39151, 39152, 39153, 39154, 39155, - 39156, 39157, 39158, 39159, 39160, 39161, 39162, 39163, 39164, 39165, - 39166, 39167, 39168, 39169, 39170, 39171, 39172, 39173, 39174, 39175, - 38121, 38123, 38126, 38127, 38131, 38132, 38133, 38135, 38137, 38140, - 38141, 38143, 38147, 38146, 38150, 38151, 38153, 38154, 38157, 38158, - 38159, 38162, 38163, 38164, 38165, 38166, 38168, 38171, 38173, 38174, - 38175, 38178, 38186, 38187, 38185, 38188, 38193, 38194, 38196, 38198, - 38199, 38200, 38204, 38206, 38207, 38210, 38197, 38212, 38213, 38214, - 38217, 38220, 38222, 38223, 38226, 38227, 38228, 38230, 38231, 38232, - 38233, 38235, 38238, 38239, 38237, 38241, 38242, 38244, 38245, 38246, - 38247, 38248, 38249, 38250, 38251, 38252, 38255, 38257, 38258, 38259, - 38202, 30695, 30700, 38601, 31189, 31213, 31203, 31211, 31238, 23879, - 31235, 31234, 31262, 31252, 39176, 39177, 39178, 39179, 39180, 39182, - 39183, 39185, 39186, 39187, 39188, 39189, 39190, 39191, 39192, 39193, - 39194, 39195, 39196, 39197, 39198, 39199, 39200, 39201, 39202, 39203, - 39204, 39205, 39206, 39207, 39208, 39209, 39210, 39211, 39212, 39213, - 39215, 39216, 39217, 39218, 39219, 39220, 39221, 39222, 39223, 39224, - 39225, 39226, 39227, 39228, 39229, 39230, 39231, 39232, 39233, 39234, - 39235, 39236, 39237, 39238, 39239, 39240, 39241, 39242, 39243, 39244, - 39245, 39246, 39247, 39248, 39249, 39250, 39251, 39254, 39255, 39256, - 39257, 39258, 39259, 39260, 39261, 39262, 39263, 39264, 39265, 39266, - 39268, 39270, 39283, 39288, 39289, 39291, 39294, 39298, 39299, 39305, - 31289, 31287, 31313, 40655, 39333, 31344, 30344, 30350, 30355, 30361, - 30372, 29918, 29920, 29996, 40480, 40482, 40488, 40489, 40490, 40491, - 40492, 40498, 40497, 40502, 40504, 40503, 40505, 40506, 40510, 40513, - 40514, 40516, 40518, 40519, 40520, 40521, 40523, 40524, 40526, 40529, - 40533, 40535, 40538, 40539, 40540, 40542, 40547, 40550, 40551, 40552, - 40553, 40554, 40555, 40556, 40561, 40557, 40563, 30098, 30100, 30102, - 30112, 30109, 30124, 30115, 30131, 30132, 30136, 30148, 30129, 30128, - 30147, 30146, 30166, 30157, 30179, 30184, 30182, 30180, 30187, 30183, - 30211, 30193, 30204, 30207, 30224, 30208, 30213, 30220, 30231, 30218, - 30245, 30232, 30229, 30233, 39308, 39310, 39322, 39323, 39324, 39325, - 39326, 39327, 39328, 39329, 39330, 39331, 39332, 39334, 39335, 39337, - 39338, 39339, 39340, 39341, 39342, 39343, 39344, 39345, 39346, 39347, - 39348, 39349, 39350, 39351, 39352, 39353, 39354, 39355, 39356, 39357, - 39358, 39359, 39360, 39361, 39362, 39363, 39364, 39365, 39366, 39367, - 39368, 39369, 39370, 39371, 39372, 39373, 39374, 39375, 39376, 39377, - 39378, 39379, 39380, 39381, 39382, 39383, 39384, 39385, 39386, 39387, - 39388, 39389, 39390, 39391, 39392, 39393, 39394, 39395, 39396, 39397, - 39398, 39399, 39400, 39401, 39402, 39403, 39404, 39405, 39406, 39407, - 39408, 39409, 39410, 39411, 39412, 39413, 39414, 39415, 39416, 39417, - 30235, 30268, 30242, 30240, 30272, 30253, 30256, 30271, 30261, 30275, - 30270, 30259, 30285, 30302, 30292, 30300, 30294, 30315, 30319, 32714, - 31462, 31352, 31353, 31360, 31366, 31368, 31381, 31398, 31392, 31404, - 31400, 31405, 31411, 34916, 34921, 34930, 34941, 34943, 34946, 34978, - 35014, 34999, 35004, 35017, 35042, 35022, 35043, 35045, 35057, 35098, - 35068, 35048, 35070, 35056, 35105, 35097, 35091, 35099, 35082, 35124, - 35115, 35126, 35137, 35174, 35195, 30091, 32997, 30386, 30388, 30684, - 32786, 32788, 32790, 32796, 32800, 32802, 32805, 32806, 32807, 32809, - 32808, 32817, 32779, 32821, 32835, 32838, 32845, 32850, 32873, 32881, - 35203, 39032, 39040, 39043, 39418, 39419, 39420, 39421, 39422, 39423, - 39424, 39425, 39426, 39427, 39428, 39429, 39430, 39431, 39432, 39433, - 39434, 39435, 39436, 39437, 39438, 39439, 39440, 39441, 39442, 39443, - 39444, 39445, 39446, 39447, 39448, 39449, 39450, 39451, 39452, 39453, - 39454, 39455, 39456, 39457, 39458, 39459, 39460, 39461, 39462, 39463, - 39464, 39465, 39466, 39467, 39468, 39469, 39470, 39471, 39472, 39473, - 39474, 39475, 39476, 39477, 39478, 39479, 39480, 39481, 39482, 39483, - 39484, 39485, 39486, 39487, 39488, 39489, 39490, 39491, 39492, 39493, - 39494, 39495, 39496, 39497, 39498, 39499, 39500, 39501, 39502, 39503, - 39504, 39505, 39506, 39507, 39508, 39509, 39510, 39511, 39512, 39513, - 39049, 39052, 39053, 39055, 39060, 39066, 39067, 39070, 39071, 39073, - 39074, 39077, 39078, 34381, 34388, 34412, 34414, 34431, 34426, 34428, - 34427, 34472, 34445, 34443, 34476, 34461, 34471, 34467, 34474, 34451, - 34473, 34486, 34500, 34485, 34510, 34480, 34490, 34481, 34479, 34505, - 34511, 34484, 34537, 34545, 34546, 34541, 34547, 34512, 34579, 34526, - 34548, 34527, 34520, 34513, 34563, 34567, 34552, 34568, 34570, 34573, - 34569, 34595, 34619, 34590, 34597, 34606, 34586, 34622, 34632, 34612, - 34609, 34601, 34615, 34623, 34690, 34594, 34685, 34686, 34683, 34656, - 34672, 34636, 34670, 34699, 34643, 34659, 34684, 34660, 34649, 34661, - 34707, 34735, 34728, 34770, 39514, 39515, 39516, 39517, 39518, 39519, - 39520, 39521, 39522, 39523, 39524, 39525, 39526, 39527, 39528, 39529, - 39530, 39531, 39538, 39555, 39561, 39565, 39566, 39572, 39573, 39577, - 39590, 39593, 39594, 39595, 39596, 39597, 39598, 39599, 39602, 39603, - 39604, 39605, 39609, 39611, 39613, 39614, 39615, 39619, 39620, 39622, - 39623, 39624, 39625, 39626, 39629, 39630, 39631, 39632, 39634, 39636, - 39637, 39638, 39639, 39641, 39642, 39643, 39644, 39645, 39646, 39648, - 39650, 39651, 39652, 39653, 39655, 39656, 39657, 39658, 39660, 39662, - 39664, 39665, 39666, 39667, 39668, 39669, 39670, 39671, 39672, 39674, - 39676, 39677, 39678, 39679, 39680, 39681, 39682, 39684, 39685, 39686, - 34758, 34696, 34693, 34733, 34711, 34691, 34731, 34789, 34732, 34741, - 34739, 34763, 34771, 34749, 34769, 34752, 34762, 34779, 34794, 34784, - 34798, 34838, 34835, 34814, 34826, 34843, 34849, 34873, 34876, 32566, - 32578, 32580, 32581, 33296, 31482, 31485, 31496, 31491, 31492, 31509, - 31498, 31531, 31503, 31559, 31544, 31530, 31513, 31534, 31537, 31520, - 31525, 31524, 31539, 31550, 31518, 31576, 31578, 31557, 31605, 31564, - 31581, 31584, 31598, 31611, 31586, 31602, 31601, 31632, 31654, 31655, - 31672, 31660, 31645, 31656, 31621, 31658, 31644, 31650, 31659, 31668, - 31697, 31681, 31692, 31709, 31706, 31717, 31718, 31722, 31756, 31742, - 31740, 31759, 31766, 31755, 39687, 39689, 39690, 39691, 39692, 39693, - 39694, 39696, 39697, 39698, 39700, 39701, 39702, 39703, 39704, 39705, - 39706, 39707, 39708, 39709, 39710, 39712, 39713, 39714, 39716, 39717, - 39718, 39719, 39720, 39721, 39722, 39723, 39724, 39725, 39726, 39728, - 39729, 39731, 39732, 39733, 39734, 39735, 39736, 39737, 39738, 39741, - 39742, 39743, 39744, 39750, 39754, 39755, 39756, 39758, 39760, 39762, - 39763, 39765, 39766, 39767, 39768, 39769, 39770, 39771, 39772, 39773, - 39774, 39775, 39776, 39777, 39778, 39779, 39780, 39781, 39782, 39783, - 39784, 39785, 39786, 39787, 39788, 39789, 39790, 39791, 39792, 39793, - 39794, 39795, 39796, 39797, 39798, 39799, 39800, 39801, 39802, 39803, - 31775, 31786, 31782, 31800, 31809, 31808, 33278, 33281, 33282, 33284, - 33260, 34884, 33313, 33314, 33315, 33325, 33327, 33320, 33323, 33336, - 33339, 33331, 33332, 33342, 33348, 33353, 33355, 33359, 33370, 33375, - 33384, 34942, 34949, 34952, 35032, 35039, 35166, 32669, 32671, 32679, - 32687, 32688, 32690, 31868, 25929, 31889, 31901, 31900, 31902, 31906, - 31922, 31932, 31933, 31937, 31943, 31948, 31949, 31944, 31941, 31959, - 31976, 33390, 26280, 32703, 32718, 32725, 32741, 32737, 32742, 32745, - 32750, 32755, 31992, 32119, 32166, 32174, 32327, 32411, 40632, 40628, - 36211, 36228, 36244, 36241, 36273, 36199, 36205, 35911, 35913, 37194, - 37200, 37198, 37199, 37220, 39804, 39805, 39806, 39807, 39808, 39809, - 39810, 39811, 39812, 39813, 39814, 39815, 39816, 39817, 39818, 39819, - 39820, 39821, 39822, 39823, 39824, 39825, 39826, 39827, 39828, 39829, - 39830, 39831, 39832, 39833, 39834, 39835, 39836, 39837, 39838, 39839, - 39840, 39841, 39842, 39843, 39844, 39845, 39846, 39847, 39848, 39849, - 39850, 39851, 39852, 39853, 39854, 39855, 39856, 39857, 39858, 39859, - 39860, 39861, 39862, 39863, 39864, 39865, 39866, 39867, 39868, 39869, - 39870, 39871, 39872, 39873, 39874, 39875, 39876, 39877, 39878, 39879, - 39880, 39881, 39882, 39883, 39884, 39885, 39886, 39887, 39888, 39889, - 39890, 39891, 39892, 39893, 39894, 39895, 39896, 39897, 39898, 39899, - 37218, 37217, 37232, 37225, 37231, 37245, 37246, 37234, 37236, 37241, - 37260, 37253, 37264, 37261, 37265, 37282, 37283, 37290, 37293, 37294, - 37295, 37301, 37300, 37306, 35925, 40574, 36280, 36331, 36357, 36441, - 36457, 36277, 36287, 36284, 36282, 36292, 36310, 36311, 36314, 36318, - 36302, 36303, 36315, 36294, 36332, 36343, 36344, 36323, 36345, 36347, - 36324, 36361, 36349, 36372, 36381, 36383, 36396, 36398, 36387, 36399, - 36410, 36416, 36409, 36405, 36413, 36401, 36425, 36417, 36418, 36433, - 36434, 36426, 36464, 36470, 36476, 36463, 36468, 36485, 36495, 36500, - 36496, 36508, 36510, 35960, 35970, 35978, 35973, 35992, 35988, 26011, - 35286, 35294, 35290, 35292, 39900, 39901, 39902, 39903, 39904, 39905, - 39906, 39907, 39908, 39909, 39910, 39911, 39912, 39913, 39914, 39915, - 39916, 39917, 39918, 39919, 39920, 39921, 39922, 39923, 39924, 39925, - 39926, 39927, 39928, 39929, 39930, 39931, 39932, 39933, 39934, 39935, - 39936, 39937, 39938, 39939, 39940, 39941, 39942, 39943, 39944, 39945, - 39946, 39947, 39948, 39949, 39950, 39951, 39952, 39953, 39954, 39955, - 39956, 39957, 39958, 39959, 39960, 39961, 39962, 39963, 39964, 39965, - 39966, 39967, 39968, 39969, 39970, 39971, 39972, 39973, 39974, 39975, - 39976, 39977, 39978, 39979, 39980, 39981, 39982, 39983, 39984, 39985, - 39986, 39987, 39988, 39989, 39990, 39991, 39992, 39993, 39994, 39995, - 35301, 35307, 35311, 35390, 35622, 38739, 38633, 38643, 38639, 38662, - 38657, 38664, 38671, 38670, 38698, 38701, 38704, 38718, 40832, 40835, - 40837, 40838, 40839, 40840, 40841, 40842, 40844, 40702, 40715, 40717, - 38585, 38588, 38589, 38606, 38610, 30655, 38624, 37518, 37550, 37576, - 37694, 37738, 37834, 37775, 37950, 37995, 40063, 40066, 40069, 40070, - 40071, 40072, 31267, 40075, 40078, 40080, 40081, 40082, 40084, 40085, - 40090, 40091, 40094, 40095, 40096, 40097, 40098, 40099, 40101, 40102, - 40103, 40104, 40105, 40107, 40109, 40110, 40112, 40113, 40114, 40115, - 40116, 40117, 40118, 40119, 40122, 40123, 40124, 40125, 40132, 40133, - 40134, 40135, 40138, 40139, 39996, 39997, 39998, 39999, 40000, 40001, - 40002, 40003, 40004, 40005, 40006, 40007, 40008, 40009, 40010, 40011, - 40012, 40013, 40014, 40015, 40016, 40017, 40018, 40019, 40020, 40021, - 40022, 40023, 40024, 40025, 40026, 40027, 40028, 40029, 40030, 40031, - 40032, 40033, 40034, 40035, 40036, 40037, 40038, 40039, 40040, 40041, - 40042, 40043, 40044, 40045, 40046, 40047, 40048, 40049, 40050, 40051, - 40052, 40053, 40054, 40055, 40056, 40057, 40058, 40059, 40061, 40062, - 40064, 40067, 40068, 40073, 40074, 40076, 40079, 40083, 40086, 40087, - 40088, 40089, 40093, 40106, 40108, 40111, 40121, 40126, 40127, 40128, - 40129, 40130, 40136, 40137, 40145, 40146, 40154, 40155, 40160, 40161, - 40140, 40141, 40142, 40143, 40144, 40147, 40148, 40149, 40151, 40152, - 40153, 40156, 40157, 40159, 40162, 38780, 38789, 38801, 38802, 38804, - 38831, 38827, 38819, 38834, 38836, 39601, 39600, 39607, 40536, 39606, - 39610, 39612, 39617, 39616, 39621, 39618, 39627, 39628, 39633, 39749, - 39747, 39751, 39753, 39752, 39757, 39761, 39144, 39181, 39214, 39253, - 39252, 39647, 39649, 39654, 39663, 39659, 39675, 39661, 39673, 39688, - 39695, 39699, 39711, 39715, 40637, 40638, 32315, 40578, 40583, 40584, - 40587, 40594, 37846, 40605, 40607, 40667, 40668, 40669, 40672, 40671, - 40674, 40681, 40679, 40677, 40682, 40687, 40738, 40748, 40751, 40761, - 40759, 40765, 40766, 40772, 40163, 40164, 40165, 40166, 40167, 40168, - 40169, 40170, 40171, 40172, 40173, 40174, 40175, 40176, 40177, 40178, - 40179, 40180, 40181, 40182, 40183, 40184, 40185, 40186, 40187, 40188, - 40189, 40190, 40191, 40192, 40193, 40194, 40195, 40196, 40197, 40198, - 40199, 40200, 40201, 40202, 40203, 40204, 40205, 40206, 40207, 40208, - 40209, 40210, 40211, 40212, 40213, 40214, 40215, 40216, 40217, 40218, - 40219, 40220, 40221, 40222, 40223, 40224, 40225, 40226, 40227, 40228, - 40229, 40230, 40231, 40232, 40233, 40234, 40235, 40236, 40237, 40238, - 40239, 40240, 40241, 40242, 40243, 40244, 40245, 40246, 40247, 40248, - 40249, 40250, 40251, 40252, 40253, 40254, 40255, 40256, 40257, 40258, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 40259, 40260, 40261, 40262, 40263, 40264, - 40265, 40266, 40267, 40268, 40269, 40270, 40271, 40272, 40273, 40274, - 40275, 40276, 40277, 40278, 40279, 40280, 40281, 40282, 40283, 40284, - 40285, 40286, 40287, 40288, 40289, 40290, 40291, 40292, 40293, 40294, - 40295, 40296, 40297, 40298, 40299, 40300, 40301, 40302, 40303, 40304, - 40305, 40306, 40307, 40308, 40309, 40310, 40311, 40312, 40313, 40314, - 40315, 40316, 40317, 40318, 40319, 40320, 40321, 40322, 40323, 40324, - 40325, 40326, 40327, 40328, 40329, 40330, 40331, 40332, 40333, 40334, - 40335, 40336, 40337, 40338, 40339, 40340, 40341, 40342, 40343, 40344, - 40345, 40346, 40347, 40348, 40349, 40350, 40351, 40352, 40353, 40354, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 40355, 40356, 40357, 40358, 40359, 40360, - 40361, 40362, 40363, 40364, 40365, 40366, 40367, 40368, 40369, 40370, - 40371, 40372, 40373, 40374, 40375, 40376, 40377, 40378, 40379, 40380, - 40381, 40382, 40383, 40384, 40385, 40386, 40387, 40388, 40389, 40390, - 40391, 40392, 40393, 40394, 40395, 40396, 40397, 40398, 40399, 40400, - 40401, 40402, 40403, 40404, 40405, 40406, 40407, 40408, 40409, 40410, - 40411, 40412, 40413, 40414, 40415, 40416, 40417, 40418, 40419, 40420, - 40421, 40422, 40423, 40424, 40425, 40426, 40427, 40428, 40429, 40430, - 40431, 40432, 40433, 40434, 40435, 40436, 40437, 40438, 40439, 40440, - 40441, 40442, 40443, 40444, 40445, 40446, 40447, 40448, 40449, 40450, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 40451, 40452, 40453, 40454, 40455, 40456, - 40457, 40458, 40459, 40460, 40461, 40462, 40463, 40464, 40465, 40466, - 40467, 40468, 40469, 40470, 40471, 40472, 40473, 40474, 40475, 40476, - 40477, 40478, 40484, 40487, 40494, 40496, 40500, 40507, 40508, 40512, - 40525, 40528, 40530, 40531, 40532, 40534, 40537, 40541, 40543, 40544, - 40545, 40546, 40549, 40558, 40559, 40562, 40564, 40565, 40566, 40567, - 40568, 40569, 40570, 40571, 40572, 40573, 40576, 40577, 40579, 40580, - 40581, 40582, 40585, 40586, 40588, 40589, 40590, 40591, 40592, 40593, - 40596, 40597, 40598, 40599, 40600, 40601, 40602, 40603, 40604, 40606, - 40608, 40609, 40610, 40611, 40612, 40613, 40615, 40616, 40617, 40618, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 40619, 40620, 40621, 40622, 40623, 40624, - 40625, 40626, 40627, 40629, 40630, 40631, 40633, 40634, 40636, 40639, - 40640, 40641, 40642, 40643, 40645, 40646, 40647, 40648, 40650, 40651, - 40652, 40656, 40658, 40659, 40661, 40662, 40663, 40665, 40666, 40670, - 40673, 40675, 40676, 40678, 40680, 40683, 40684, 40685, 40686, 40688, - 40689, 40690, 40691, 40692, 40693, 40694, 40695, 40696, 40698, 40701, - 40703, 40704, 40705, 40706, 40707, 40708, 40709, 40710, 40711, 40712, - 40713, 40714, 40716, 40719, 40721, 40722, 40724, 40725, 40726, 40728, - 40730, 40731, 40732, 40733, 40734, 40735, 40737, 40739, 40740, 40741, - 40742, 40743, 40744, 40745, 40746, 40747, 40749, 40750, 40752, 40753, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 40754, 40755, 40756, 40757, 40758, 40760, - 40762, 40764, 40767, 40768, 40769, 40770, 40771, 40773, 40774, 40775, - 40776, 40777, 40778, 40779, 40780, 40781, 40782, 40783, 40786, 40787, - 40788, 40789, 40790, 40791, 40792, 40793, 40794, 40795, 40796, 40797, - 40798, 40799, 40800, 40801, 40802, 40803, 40804, 40805, 40806, 40807, - 40808, 40809, 40810, 40811, 40812, 40813, 40814, 40815, 40816, 40817, - 40818, 40819, 40820, 40821, 40822, 40823, 40824, 40825, 40826, 40827, - 40828, 40829, 40830, 40833, 40834, 40845, 40846, 40847, 40848, 40849, - 40850, 40851, 40852, 40853, 40854, 40855, 40856, 40860, 40861, 40862, - 40865, 40866, 40867, 40868, 40869, 63788, 63865, 63893, 63975, 63985, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 64012, 64013, 64014, 64015, 64017, 64019, - 64020, 64024, 64031, 64032, 64033, 64035, 64036, 64039, 64040, 64041, - 11905, 65535, 65535, 65535, 11908, 13427, 13383, 11912, 11915, 65535, - 13726, 13850, 13838, 11916, 11927, 14702, 14616, 65535, 14799, 14815, - 14963, 14800, 65535, 65535, 15182, 15470, 15584, 11943, 65535, 65535, - 11946, 16470, 16735, 11950, 17207, 11955, 11958, 11959, 65535, 17329, - 17324, 11963, 17373, 17622, 18017, 17996, 65535, 18211, 18217, 18300, - 18317, 11978, 18759, 18810, 18813, 18818, 18819, 18821, 18822, 18847, - 18843, 18871, 18870, 65535, 65535, 19619, 19615, 19616, 19617, 19575, - 19618, 19731, 19732, 19733, 19734, 19735, 19736, 19737, 19886, -]; - -#[inline] -pub fn forward(code: u16) -> u32 { - let code = code as uint; - if code < 23845 { - FORWARD_TABLE[code] as u32 - } else { - 0xffff - } -} - -static BACKWARD_TABLE_LOWER: &'static [u16] = &[ - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 6247, 65535, 65535, 6251, 6182, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6242, 6207, 65535, 65535, - 65535, 65535, 65535, 6179, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 6208, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 7509, 7507, 65535, 65535, 65535, 65535, 65535, 65535, 7513, - 7511, 7531, 65535, 7517, 7515, 65535, 65535, 65535, 65535, 7521, 7519, - 65535, 65535, 65535, 6209, 65535, 7525, 7523, 65535, 7530, 65535, 65535, - 65535, 65535, 7506, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7510, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 7512, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 7514, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 7534, 65535, 65535, 65535, 7535, 65535, - 65535, 65535, 65535, 7518, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 7522, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 7508, 65535, 7516, 65535, 7520, - 65535, 7524, 65535, 7526, 65535, 7527, 65535, 7528, 65535, 7529, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7536, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7532, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 7537, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 6181, 65535, 6180, 7410, 7411, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7412, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 7126, 7127, 7128, 7129, 7130, 7131, 7132, 7133, 7134, 7135, - 7136, 7137, 7138, 7139, 7140, 7141, 7142, 65535, 7143, 7144, 7145, 7146, - 7147, 7148, 7149, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7158, - 7159, 7160, 7161, 7162, 7163, 7164, 7165, 7166, 7167, 7168, 7169, 7170, - 7171, 7172, 7173, 7174, 65535, 7175, 7176, 7177, 7178, 7179, 7180, 7181, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 7322, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7316, 7317, 7318, 7319, - 7320, 7321, 7323, 7324, 7325, 7326, 7327, 7328, 7329, 7330, 7331, 7332, - 7333, 7334, 7335, 7336, 7337, 7338, 7339, 7340, 7341, 7342, 7343, 7344, - 7345, 7346, 7347, 7348, 7364, 7365, 7366, 7367, 7368, 7369, 7371, 7372, - 7373, 7374, 7375, 7376, 7377, 7378, 7379, 7380, 7381, 7382, 7383, 7384, - 7385, 7386, 7387, 7388, 7389, 7390, 7391, 7392, 7393, 7394, 7395, 7396, - 65535, 7370, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 7628, 65535, 65535, 7413, 6185, 7414, 6187, 65535, 6189, 6190, - 65535, 65535, 6191, 6192, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 7415, 6188, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 6250, 65535, 6243, 6244, 65535, 7416, 65535, 65535, 65535, 65535, 65535, - 6264, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 6432, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6245, 65535, 7417, - 65535, 65535, 65535, 7418, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 6252, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 7625, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 6446, 6447, 6448, 6449, 6450, 6451, - 6452, 6453, 6454, 6455, 6456, 6457, 65535, 65535, 65535, 65535, 6366, 6367, - 6368, 6369, 6370, 6371, 6372, 6373, 6374, 6375, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6266, 6267, 6265, - 6268, 65535, 65535, 7419, 7420, 7421, 7422, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6217, - 65535, 65535, 65535, 65535, 65535, 65535, 6214, 65535, 6213, 65535, 65535, - 65535, 7423, 65535, 65535, 65535, 65535, 6219, 65535, 65535, 6231, 6237, - 7424, 6222, 65535, 65535, 7425, 65535, 6221, 65535, 6211, 6212, 6216, 6215, - 6225, 65535, 65535, 6226, 65535, 65535, 65535, 65535, 65535, 6239, 6238, - 6210, 6218, 65535, 65535, 65535, 65535, 65535, 6230, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6229, 65535, 65535, 65535, - 6228, 65535, 65535, 65535, 65535, 65535, 7426, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6232, 6227, - 65535, 65535, 6235, 6236, 7427, 7428, 65535, 65535, 65535, 65535, 65535, - 65535, 6233, 6234, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7491, 65535, - 65535, 65535, 6224, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 6220, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7429, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 6223, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6422, 6423, - 6424, 6425, 6426, 6427, 6428, 6429, 6430, 6431, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 6402, 6403, 6404, 6405, 6406, - 6407, 6408, 6409, 6410, 6411, 6412, 6413, 6414, 6415, 6416, 6417, 6418, - 6419, 6420, 6421, 6382, 6383, 6384, 6385, 6386, 6387, 6388, 6389, 6390, - 6391, 6392, 6393, 6394, 6395, 6396, 6397, 6398, 6399, 6400, 6401, 65535, - 65535, 65535, 65535, 7699, 7700, 7701, 7702, 7703, 7704, 7705, 7706, 7707, - 7708, 7709, 7710, 7711, 7712, 7713, 7714, 7715, 7716, 7717, 7718, 7719, - 7720, 7721, 7722, 7723, 7724, 7725, 7726, 7727, 7728, 7729, 7730, 7731, - 7732, 7733, 7734, 7735, 7736, 7737, 7738, 7739, 7740, 7741, 7742, 7743, - 7744, 7745, 7746, 7747, 7748, 7749, 7750, 7751, 7752, 7753, 7754, 7755, - 7756, 7757, 7758, 7759, 7760, 7761, 7762, 7763, 7764, 7765, 7766, 7767, - 7768, 7769, 7770, 7771, 7772, 7773, 7774, 65535, 65535, 65535, 65535, 7430, - 7431, 7432, 7433, 7434, 7435, 7436, 7437, 7438, 7439, 7440, 7441, 7442, - 7443, 7444, 7445, 7446, 7447, 7448, 7449, 7450, 7451, 7452, 7453, 7454, - 7455, 7456, 7457, 7458, 7459, 7460, 7461, 7462, 7463, 7464, 7465, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 7466, 7467, 7468, 7469, 7470, 7471, 7472, 7473, 7474, 7475, - 7476, 7477, 7478, 7479, 7480, 65535, 65535, 65535, 7481, 7482, 7483, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6261, 6260, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 6263, 6262, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 7484, 7485, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 6259, 6258, 65535, 65535, 65535, 6255, 65535, - 65535, 6257, 6256, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7486, - 7487, 7488, 7489, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 6254, 6253, 65535, 65535, 7490, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6241, 65535, - 6240, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 23766, 65535, 65535, 23770, 65535, 65535, 65535, 23773, 65535, 65535, - 23774, 23779, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 23780, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23793, 65535, - 65535, 23796, 65535, 65535, 65535, 23799, 65535, 65535, 65535, 65535, - 23801, 65535, 65535, 23802, 23803, 65535, 65535, 65535, 23807, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 23817, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 7673, 7674, 7675, 7676, 7677, 7678, 7679, 7680, 7681, 7682, 7683, - 7684, 65535, 65535, 65535, 65535, 6176, 6177, 6178, 6183, 65535, 6184, - 7637, 7685, 6195, 6196, 6197, 6198, 6199, 6200, 6201, 6202, 6205, 6206, - 7492, 6269, 6193, 6194, 6203, 6204, 65535, 65535, 65535, 65535, 65535, - 7493, 7494, 65535, 65535, 7600, 7601, 7602, 7603, 7604, 7605, 7606, 7607, - 7608, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7672, - 65535, 65535, 6746, 6747, 6748, 6749, 6750, 6751, 6752, 6753, 6754, 6755, - 6756, 6757, 6758, 6759, 6760, 6761, 6762, 6763, 6764, 6765, 6766, 6767, - 6768, 6769, 6770, 6771, 6772, 6773, 6774, 6775, 6776, 6777, 6778, 6779, - 6780, 6781, 6782, 6783, 6784, 6785, 6786, 6787, 6788, 6789, 6790, 6791, - 6792, 6793, 6794, 6795, 6796, 6797, 6798, 6799, 6800, 6801, 6802, 6803, - 6804, 6805, 6806, 6807, 6808, 6809, 6810, 6811, 6812, 6813, 6814, 6815, - 6816, 6817, 6818, 6819, 6820, 6821, 6822, 6823, 6824, 6825, 6826, 6827, - 6828, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 7633, 7634, 7638, - 7639, 65535, 65535, 6936, 6937, 6938, 6939, 6940, 6941, 6942, 6943, 6944, - 6945, 6946, 6947, 6948, 6949, 6950, 6951, 6952, 6953, 6954, 6955, 6956, - 6957, 6958, 6959, 6960, 6961, 6962, 6963, 6964, 6965, 6966, 6967, 6968, - 6969, 6970, 6971, 6972, 6973, 6974, 6975, 6976, 6977, 6978, 6979, 6980, - 6981, 6982, 6983, 6984, 6985, 6986, 6987, 6988, 6989, 6990, 6991, 6992, - 6993, 6994, 6995, 6996, 6997, 6998, 6999, 7000, 7001, 7002, 7003, 7004, - 7005, 7006, 7007, 7008, 7009, 7010, 7011, 7012, 7013, 7014, 7015, 7016, - 7017, 7018, 7019, 7020, 7021, 65535, 65535, 65535, 65535, 65535, 7632, - 7635, 7636, 65535, 65535, 65535, 65535, 65535, 65535, 7542, 7543, 7544, - 7545, 7546, 7547, 7548, 7549, 7550, 7551, 7552, 7553, 7554, 7555, 7556, - 7557, 7558, 7559, 7560, 7561, 7562, 7563, 7564, 7565, 7566, 7567, 7568, - 7569, 7570, 7571, 7572, 7573, 7574, 7575, 7576, 7577, 7578, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6434, - 6435, 6436, 6437, 6438, 6439, 6440, 6441, 6442, 6443, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 7626, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 7609, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 7610, 7611, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 7612, 7613, 7614, 65535, 65535, - 7615, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 7616, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 7617, 65535, 65535, 7618, 7619, 65535, 65535, 7620, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23772, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 23771, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 23776, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 23778, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 23777, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 23782, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 23781, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23784, 23787, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 23785, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 23786, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 23790, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 23791, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 23792, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 23797, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 23798, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23800, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 23806, 65535, 65535, 65535, 65535, 23805, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23808, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 23809, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 23811, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23810, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 23813, 65535, 65535, 65535, 65535, 65535, 23814, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23815, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 23816, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 23818, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 23819, 65535, 65535, 23820, 65535, 65535, 65535, 65535, - 23821, 23822, 65535, 23823, 23824, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 23826, 65535, 65535, 65535, 23825, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 23828, 23827, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 23835, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 23832, 23833, 23834, 23836, 23831, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23837, 23838, 23839, - 23840, 23841, 23842, 23843, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 23844, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 15512, 10166, 0, 13268, 1, 2, 3, 14617, 16096, 13678, 13822, - 14949, 16627, 9432, 15750, 4, 16629, 9678, 5, 16443, 13445, 16632, 13997, - 6, 13475, 9306, 15506, 9837, 10176, 14186, 16634, 7, 8, 9, 10175, 10, - 12284, 15342, 11, 13780, 16638, 12, 10631, 15325, 18775, 16293, 13, 14, - 10420, 15, 9799, 16, 12312, 17, 16653, 18, 14607, 9979, 14735, 16332, 19, - 12151, 11742, 16640, 20, 21, 22, 12868, 23, 11720, 24, 16642, 12655, 15554, - 25, 16259, 14783, 16062, 11010, 10361, 12119, 26, 13230, 13065, 13434, 27, - 10787, 28, 9638, 15535, 29, 30, 16656, 11722, 13287, 15503, 14931, 14986, - 31, 32, 33, 34, 14038, 35, 36, 16657, 37, 38, 39, 40, 41, 42, 12527, 12495, - 43, 13658, 44, 45, 46, 47, 48, 49, 50, 51, 52, 53, 13407, 54, 55, 56, 57, - 58, 59, 60, 12298, 61, 15747, 16144, 62, 13999, 10259, 16626, 15733, 11962, - 63, 15903, 11120, 16658, 14794, 11699, 64, 65, 16633, 66, 15334, 15114, 67, - 68, 69, 16654, 16894, 14621, 11901, 70, 11522, 10930, 15549, 9495, 10989, - 12847, 71, 14992, 11694, 14539, 12288, 72, 73, 74, 13450, 16896, 75, 16899, - 76, 77, 78, 79, 13628, 16698, 80, 81, 82, 15543, 13983, 13627, 16701, - 16699, 16663, 11581, 13250, 9675, 83, 16700, 11576, 11568, 84, 13637, 9836, - 85, 86, 12501, 87, 9459, 16483, 14008, 14246, 16099, 10567, 14956, 88, 89, - 90, 16873, 16705, 13405, 91, 16703, 92, 9875, 12333, 15537, 93, 94, 16702, - 95, 15524, 16704, 12674, 96, 97, 98, 15381, 99, 16302, 16707, 100, 16710, - 11399, 11364, 101, 102, 103, 13631, 104, 10416, 105, 10389, 106, 13288, - 107, 108, 109, 110, 111, 112, 113, 16713, 15518, 114, 115, 14798, 11336, - 10447, 10360, 15166, 116, 117, 118, 119, 120, 16303, 15712, 11194, 11180, - 16706, 121, 122, 13776, 14741, 9796, 123, 16708, 124, 13818, 16711, 12500, - 16712, 125, 126, 14742, 16714, 127, 128, 129, 9419, 10767, 130, 16818, 131, - 9098, 132, 12325, 133, 13851, 134, 14192, 135, 14193, 16819, 136, 137, 138, - 139, 140, 10047, 141, 142, 9986, 143, 144, 145, 146, 147, 148, 14752, - 10020, 16436, 16519, 15726, 149, 14414, 150, 10971, 151, 16817, 16875, - 15739, 16718, 10435, 16522, 16719, 16715, 16816, 12892, 152, 153, 15697, - 16709, 16876, 154, 16716, 155, 13084, 156, 157, 12113, 158, 159, 15375, - 9084, 160, 161, 11354, 16821, 162, 16820, 163, 164, 165, 166, 16827, 16829, - 167, 16826, 13990, 168, 169, 170, 16824, 16267, 171, 172, 173, 9657, 16823, - 174, 12158, 175, 14009, 176, 16825, 177, 16822, 178, 179, 16831, 180, 181, - 10182, 182, 183, 184, 10744, 185, 15517, 186, 187, 14947, 188, 189, 12479, - 190, 11531, 16131, 9469, 13435, 11950, 16828, 191, 16830, 192, 14799, - 11003, 193, 194, 195, 196, 197, 13449, 198, 199, 200, 201, 202, 203, 204, - 205, 206, 9282, 207, 208, 209, 9842, 10242, 16835, 210, 211, 212, 213, - 11876, 214, 215, 216, 16877, 13441, 12159, 16839, 217, 218, 219, 220, 221, - 14210, 10448, 222, 16836, 223, 16838, 9218, 15740, 16840, 224, 15142, 225, - 16837, 226, 227, 16832, 228, 16833, 12264, 16834, 229, 230, 11388, 15167, - 10554, 231, 11752, 232, 16844, 233, 234, 235, 236, 16841, 237, 9044, 238, - 239, 240, 16849, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, - 252, 253, 16851, 9237, 254, 16846, 255, 256, 10000, 257, 11768, 258, 259, - 260, 14385, 11007, 15533, 261, 16850, 262, 263, 11567, 264, 9606, 265, 266, - 267, 16852, 11760, 268, 16853, 16842, 12888, 269, 16845, 16848, 16847, 270, - 271, 272, 273, 274, 275, 276, 277, 278, 279, 280, 16069, 281, 16266, 282, - 13462, 283, 284, 285, 286, 16855, 287, 288, 289, 11362, 16857, 290, 291, - 292, 16843, 293, 16858, 13216, 294, 295, 296, 297, 298, 16856, 299, 300, - 301, 302, 16521, 303, 14538, 304, 305, 306, 307, 308, 309, 310, 311, 11496, - 312, 313, 314, 315, 316, 317, 16859, 318, 319, 320, 321, 322, 323, 324, - 325, 326, 13043, 14556, 327, 328, 329, 16860, 330, 331, 16854, 9600, 11969, - 332, 333, 334, 335, 10566, 336, 337, 12157, 338, 339, 340, 341, 9113, 342, - 343, 344, 345, 346, 347, 348, 349, 350, 351, 352, 353, 354, 355, 356, 357, - 358, 359, 360, 361, 362, 9871, 363, 16861, 364, 16862, 9787, 16863, 365, - 366, 9848, 367, 368, 369, 370, 371, 9058, 372, 373, 374, 375, 376, 377, - 378, 16864, 13796, 379, 380, 381, 382, 383, 384, 385, 386, 387, 388, 389, - 390, 391, 392, 393, 394, 395, 396, 397, 14996, 398, 399, 400, 401, 402, - 403, 16865, 404, 405, 406, 12292, 407, 408, 409, 410, 411, 412, 413, 414, - 415, 416, 417, 16869, 13789, 418, 419, 420, 421, 16868, 16867, 16870, 422, - 423, 424, 425, 14214, 426, 11504, 427, 428, 429, 430, 431, 13212, 432, 433, - 434, 435, 436, 437, 438, 439, 440, 441, 16866, 16871, 442, 443, 444, 16872, - 445, 446, 447, 448, 449, 450, 13654, 451, 452, 453, 454, 455, 456, 457, - 458, 459, 460, 461, 462, 463, 464, 12125, 465, 466, 467, 468, 469, 470, - 471, 472, 473, 474, 475, 476, 477, 478, 479, 480, 481, 482, 483, 484, 485, - 486, 487, 488, 489, 490, 491, 492, 493, 10254, 16628, 15907, 494, 15875, - 15159, 9663, 16110, 495, 14955, 10801, 496, 11918, 497, 12701, 498, 499, - 500, 10215, 501, 502, 14570, 16893, 16895, 503, 504, 505, 9994, 506, 10186, - 507, 508, 509, 510, 511, 11689, 512, 513, 13660, 514, 515, 13596, 516, 517, - 9068, 10746, 12344, 16881, 518, 12093, 10753, 519, 10791, 15148, 9303, - 13273, 11748, 10043, 16475, 520, 15383, 11375, 14027, 521, 522, 11334, - 16885, 16696, 523, 524, 12883, 525, 526, 10597, 13614, 527, 528, 9470, - 15922, 529, 530, 531, 532, 12651, 533, 534, 12700, 17007, 13648, 535, - 15125, 536, 11777, 13024, 537, 538, 539, 10793, 540, 17008, 541, 15874, - 17009, 542, 543, 544, 545, 546, 16906, 10177, 547, 548, 10430, 9304, 16907, - 9664, 11771, 549, 11961, 15502, 12133, 550, 551, 552, 10184, 16909, 16908, - 553, 554, 11712, 555, 556, 557, 13269, 558, 16463, 17006, 559, 12280, 560, - 10057, 12327, 561, 562, 11390, 563, 9838, 564, 565, 566, 567, 568, 569, - 570, 571, 572, 12316, 573, 12918, 574, 575, 11329, 10373, 576, 577, 10434, - 578, 579, 580, 581, 582, 583, 16891, 584, 13235, 585, 11888, 11158, 586, - 587, 10017, 588, 17236, 15160, 589, 14560, 9053, 9681, 11202, 17237, 10940, - 590, 15933, 9997, 10058, 16679, 13633, 591, 592, 10409, 13443, 16680, 593, - 11890, 594, 595, 17222, 16681, 596, 597, 15149, 11129, 598, 599, 600, - 20265, 12303, 12340, 15947, 10598, 9805, 601, 9680, 602, 603, 13805, 604, - 605, 606, 13063, 607, 608, 609, 13072, 12156, 610, 9295, 611, 16682, 10781, - 612, 10004, 613, 614, 16683, 615, 616, 16283, 14157, 13600, 13793, 9829, - 11919, 617, 10819, 618, 16684, 16685, 10236, 11338, 14419, 619, 620, 621, - 622, 623, 624, 15002, 625, 16686, 13411, 626, 627, 10783, 11498, 628, 629, - 14407, 630, 13247, 631, 632, 633, 634, 635, 16689, 636, 16687, 637, 638, - 16688, 639, 640, 641, 9119, 642, 11756, 643, 13968, 11389, 644, 645, 646, - 647, 10562, 648, 649, 10623, 650, 651, 652, 653, 654, 655, 656, 657, 658, - 659, 16691, 660, 11538, 661, 16693, 16692, 662, 663, 664, 665, 666, 13107, - 667, 668, 669, 670, 671, 672, 673, 16694, 674, 675, 16695, 676, 677, 678, - 679, 680, 681, 682, 12261, 683, 13601, 9101, 10741, 11356, 14806, 17224, - 12306, 684, 685, 686, 687, 10180, 16335, 13027, 11552, 17225, 17226, 688, - 689, 690, 12153, 11687, 12110, 691, 692, 693, 694, 695, 696, 697, 698, 699, - 700, 17227, 14003, 701, 702, 703, 9415, 704, 705, 706, 15709, 707, 12702, - 708, 15306, 709, 710, 711, 712, 17229, 713, 12118, 714, 715, 716, 17230, - 717, 11892, 718, 719, 720, 721, 722, 723, 12853, 724, 725, 726, 727, 13453, - 728, 729, 730, 731, 732, 733, 734, 735, 736, 737, 738, 17231, 739, 740, - 741, 742, 743, 744, 745, 746, 16887, 13830, 747, 748, 749, 10755, 14805, - 15905, 750, 751, 752, 753, 9117, 9835, 754, 15162, 755, 756, 757, 758, - 16888, 759, 17808, 16890, 760, 761, 762, 763, 16641, 11130, 9232, 764, - 9650, 16671, 765, 766, 15914, 767, 768, 11514, 11954, 769, 14942, 770, 771, - 16673, 772, 773, 774, 10398, 775, 776, 777, 16674, 778, 779, 780, 781, 782, - 783, 784, 785, 786, 787, 13210, 13483, 15514, 788, 789, 16675, 12893, 790, - 13979, 791, 13402, 792, 16631, 793, 13868, 14796, 11175, 9100, 794, 795, - 796, 11125, 15118, 797, 9231, 16503, 16466, 798, 9980, 12529, 12872, 799, - 800, 9414, 801, 9428, 802, 9284, 17973, 16083, 11883, 12457, 16678, 12462, - 803, 16677, 14777, 804, 17069, 805, 14757, 806, 807, 16645, 12649, 15676, - 14728, 808, 11325, 13605, 12494, 809, 11762, 15127, 810, 17070, 811, 812, - 813, 814, 13463, 815, 816, 9602, 817, 10247, 14437, 12155, 818, 819, 12152, - 820, 15320, 15360, 16664, 821, 822, 823, 824, 825, 826, 827, 9467, 828, - 829, 12134, 830, 11006, 831, 832, 16665, 833, 15878, 834, 835, 14980, - 16666, 836, 16667, 14950, 837, 9683, 11724, 838, 839, 840, 841, 16668, 842, - 843, 844, 845, 846, 847, 848, 17239, 849, 850, 851, 852, 13590, 853, 854, - 855, 14971, 856, 13679, 9451, 857, 858, 859, 860, 861, 15729, 9475, 11321, - 15724, 14166, 10375, 862, 863, 864, 10357, 865, 866, 14034, 867, 13586, - 14025, 9283, 15185, 868, 13064, 869, 870, 871, 17232, 10069, 872, 873, - 11933, 10772, 11753, 12332, 874, 17977, 17976, 16272, 11543, 16112, 9065, - 10168, 11916, 14353, 17974, 13988, 15725, 875, 16672, 15507, 10962, 14185, - 14375, 876, 17978, 10055, 17975, 877, 878, 879, 15760, 880, 9647, 10632, - 881, 17981, 882, 10972, 11315, 10060, 883, 14547, 12726, 11008, 12149, - 14569, 14997, 17979, 14952, 884, 12477, 17980, 12525, 885, 886, 887, 11778, - 888, 12318, 14579, 15572, 10400, 17988, 889, 17991, 890, 891, 10436, 9066, - 10219, 10407, 892, 10937, 14438, 11927, 14172, 13289, 893, 16253, 17992, - 894, 14791, 9614, 895, 896, 14817, 9806, 897, 14764, 11005, 898, 14790, - 899, 15324, 900, 901, 17987, 902, 903, 9869, 904, 9637, 905, 10615, 17982, - 906, 907, 908, 909, 12862, 910, 17983, 17984, 17985, 13042, 17986, 17989, - 15882, 17990, 911, 13421, 14781, 912, 913, 914, 915, 916, 12881, 917, - 17997, 918, 18002, 919, 16305, 920, 921, 922, 923, 924, 925, 926, 927, - 17996, 18013, 14747, 928, 10964, 18001, 17995, 13077, 929, 930, 13850, - 11009, 12727, 931, 932, 11740, 933, 17993, 934, 18000, 935, 13071, 936, - 937, 938, 939, 16061, 10970, 940, 11729, 15704, 10577, 941, 16313, 942, - 17994, 10765, 11882, 943, 944, 12347, 17998, 17999, 945, 18003, 946, 947, - 948, 949, 950, 18014, 18024, 951, 18010, 18009, 16476, 18022, 18023, 19170, - 15492, 18005, 952, 11884, 953, 15924, 954, 11915, 18007, 955, 956, 957, - 14959, 958, 959, 18016, 960, 15337, 961, 18017, 9032, 13228, 18006, 962, - 10994, 963, 10228, 14594, 10829, 15918, 964, 965, 18018, 14991, 9030, - 18026, 18004, 15333, 18008, 18011, 18012, 18015, 966, 11124, 967, 18019, - 18020, 968, 18021, 18025, 18027, 15695, 969, 970, 971, 972, 973, 10616, - 13037, 18029, 13833, 12263, 12861, 974, 975, 11937, 15003, 976, 977, 978, - 16115, 18033, 979, 980, 981, 982, 983, 984, 9429, 985, 10988, 18031, 986, - 17228, 987, 15363, 988, 989, 990, 991, 14239, 9814, 992, 9031, 993, 994, - 995, 996, 997, 18036, 14383, 18037, 998, 999, 18032, 1000, 1001, 1002, - 1003, 1004, 1005, 18028, 1006, 1007, 1008, 1009, 18030, 1010, 18034, 18035, - 11144, 1011, 1012, 18038, 1013, 1014, 18039, 1015, 11118, 1016, 14024, - 14733, 18152, 9605, 1017, 18151, 1018, 1019, 1020, 18146, 1021, 1022, 1023, - 1024, 18049, 1025, 14592, 18047, 1026, 18045, 1027, 11923, 16471, 1028, - 13819, 1029, 1030, 18043, 9026, 1031, 1032, 1033, 1034, 1035, 18048, 1036, - 1037, 1038, 1039, 18046, 18147, 1040, 1041, 1042, 1043, 1044, 18153, 1045, - 1046, 1047, 1048, 10395, 1049, 1050, 13206, 13797, 12083, 18040, 1051, - 1052, 13045, 1053, 16661, 18044, 12911, 1054, 1055, 1056, 1057, 1058, 1059, - 18148, 18149, 18150, 15110, 1060, 1061, 18165, 14413, 1062, 18162, 1063, - 11881, 18160, 14750, 18156, 13813, 1064, 1065, 12079, 18159, 11002, 10941, - 18154, 1066, 1067, 1068, 18041, 1069, 18164, 1070, 1071, 18169, 1072, 1073, - 1074, 9798, 18170, 1075, 1076, 14933, 10965, 1077, 18161, 1078, 1079, 1080, - 1081, 1082, 1083, 1084, 15195, 1085, 1086, 1087, 1088, 1089, 1090, 1091, - 1092, 1093, 18157, 1094, 15956, 1095, 18042, 1096, 13086, 1097, 18158, - 1098, 15762, 1099, 18167, 18168, 1100, 1101, 1102, 1103, 1104, 18181, - 15170, 1105, 1106, 1107, 18173, 1108, 1109, 18186, 18187, 1110, 1111, 1112, - 18175, 18155, 13779, 18178, 1113, 18163, 1114, 1115, 1116, 1117, 1118, - 14005, 18180, 1119, 18166, 1120, 14768, 1121, 14190, 18190, 18183, 18179, - 1122, 18188, 1123, 18171, 18176, 18177, 1124, 1125, 18182, 1126, 1127, - 18184, 18185, 1128, 18189, 1129, 18172, 1130, 1131, 1132, 1133, 1134, - 14207, 18198, 1135, 18199, 18195, 1136, 1137, 1138, 1139, 1140, 1141, - 18193, 11351, 1142, 1143, 18194, 1144, 10579, 16662, 1145, 1146, 1147, - 1148, 1149, 1150, 1151, 1152, 15179, 1153, 1154, 12524, 1155, 1156, 18192, - 18174, 1157, 1158, 1159, 18197, 18196, 1160, 1161, 18200, 1162, 1163, 1164, - 1165, 18205, 18201, 1166, 1167, 1168, 16331, 9611, 1169, 16511, 1170, - 14182, 1171, 1172, 18203, 1173, 14816, 1174, 1175, 1176, 10982, 1177, 1178, - 1179, 1180, 1181, 1182, 1183, 1184, 1185, 1186, 1187, 1188, 18210, 18206, - 15498, 1189, 1190, 1191, 1192, 1193, 18211, 1194, 1195, 18204, 18202, - 18208, 1196, 1197, 18209, 1198, 1199, 1200, 1201, 1202, 18207, 1203, 18213, - 1204, 1205, 1206, 13292, 16637, 15940, 18215, 14006, 1207, 1208, 1209, - 1210, 18214, 1211, 1212, 1213, 1214, 10578, 1215, 1216, 1217, 1218, 18216, - 18217, 1219, 1220, 1221, 1222, 1223, 1224, 1225, 1226, 18218, 18212, 1227, - 1228, 1229, 1230, 1231, 1232, 1233, 10956, 14416, 1234, 1235, 1236, 18219, - 1237, 1238, 1239, 1240, 1241, 1242, 1243, 1244, 1245, 1246, 1247, 1248, - 1249, 1250, 1251, 15004, 1252, 1253, 1254, 1255, 1256, 1257, 1258, 1259, - 1260, 1261, 1262, 18220, 1263, 1264, 1265, 1266, 1267, 1268, 1269, 13619, - 1270, 1271, 1272, 1273, 11527, 1274, 1275, 1276, 1277, 1278, 1279, 1280, - 1281, 1282, 1283, 1284, 1285, 1286, 12875, 1287, 1288, 1289, 1290, 1291, - 1292, 1293, 1294, 1295, 18221, 1296, 1297, 18222, 1298, 1299, 13479, 14191, - 1300, 18223, 11171, 16647, 15567, 18224, 14572, 1301, 10223, 1302, 1303, - 1304, 1305, 1306, 1307, 18226, 1308, 15881, 1309, 1310, 12072, 9834, 1311, - 1312, 14732, 18225, 1313, 1314, 1315, 18227, 10779, 1316, 1317, 10825, - 14563, 18228, 1318, 1319, 1320, 13257, 18229, 1321, 15883, 1322, 13591, - 18231, 18230, 1323, 1324, 1325, 1326, 1327, 1328, 1329, 1330, 1331, 1332, - 1333, 1334, 1335, 1336, 1337, 1338, 1339, 18232, 1340, 1341, 14568, 1342, - 1343, 1344, 13970, 1345, 1346, 1347, 1348, 15923, 17250, 17252, 1349, - 17251, 10806, 17255, 17256, 10031, 1350, 1351, 17253, 1352, 1353, 1354, - 1355, 1356, 17254, 9596, 17258, 1357, 1358, 11203, 1359, 16268, 1360, - 17259, 1361, 1362, 1363, 1364, 11774, 1365, 1366, 10382, 1367, 17243, - 14359, 11893, 11136, 16523, 11926, 1368, 1369, 1370, 1371, 1372, 11948, - 1373, 1374, 11370, 14364, 17257, 9076, 14800, 10411, 16460, 13239, 1375, - 1376, 12069, 1377, 14370, 1378, 17266, 17260, 13231, 17262, 1379, 17267, - 1380, 13102, 1381, 1382, 1383, 17269, 1384, 1385, 17268, 11907, 1386, 1387, - 1388, 17265, 17264, 1389, 1390, 1391, 1392, 1393, 9810, 12077, 12447, - 17261, 17263, 1394, 1395, 1396, 1397, 15150, 17272, 1398, 1399, 1400, 1401, - 1402, 12126, 17277, 1403, 1404, 1405, 1406, 1407, 1408, 1409, 10231, 1410, - 1411, 1412, 1413, 17278, 17245, 10759, 15876, 17271, 1414, 11924, 17275, - 1415, 17244, 1416, 10045, 1417, 17270, 11944, 1418, 1419, 1420, 17273, - 1421, 17276, 1422, 1423, 1424, 17284, 1425, 1426, 1427, 1428, 1429, 1430, - 1431, 1432, 1433, 10736, 9028, 1434, 1435, 1436, 1437, 1438, 1439, 1440, - 12526, 1441, 1442, 9634, 17274, 1443, 1444, 17283, 1445, 13255, 17279, - 1446, 1447, 17280, 17282, 17281, 1448, 1449, 17289, 1450, 15757, 9431, - 1451, 1452, 1453, 17288, 1454, 1455, 1456, 1457, 1458, 1459, 1460, 1461, - 17389, 1462, 17286, 1463, 1464, 1465, 1466, 17285, 1467, 1468, 1469, 17287, - 13079, 11204, 1470, 1471, 17388, 1472, 1473, 17390, 1474, 14380, 1475, - 1476, 1477, 10214, 17607, 1478, 1479, 1480, 17386, 1481, 17387, 1482, 1483, - 1484, 13416, 1485, 1486, 1487, 10238, 1488, 1489, 1490, 17392, 1491, 1492, - 1493, 1494, 17391, 1495, 17394, 9219, 1496, 1497, 10019, 1498, 1499, 1500, - 1501, 1502, 11891, 1503, 1504, 1505, 1506, 1507, 15358, 1508, 1509, 1510, - 1511, 10199, 1512, 1513, 1514, 1515, 1516, 1517, 1518, 1519, 1520, 1521, - 1522, 1523, 1524, 1525, 17393, 1526, 1527, 1528, 1529, 1530, 1531, 1532, - 14245, 20318, 1533, 1534, 1535, 14215, 1536, 1537, 14249, 1538, 1539, 1540, - 14378, 1541, 1542, 1543, 1544, 1545, 13676, 1546, 1547, 1548, 1549, 1550, - 1551, 17395, 1552, 1553, 1554, 1555, 1556, 14423, 17396, 1557, 1558, 1559, - 1560, 1561, 1562, 1563, 1564, 1565, 1566, 1567, 1568, 1569, 1570, 1571, - 1572, 1573, 17246, 1574, 17400, 17397, 1575, 11704, 1576, 14056, 1577, - 1578, 1579, 17398, 1580, 1581, 1582, 1583, 1584, 1585, 1586, 1587, 13817, - 12850, 1588, 1589, 1590, 1591, 1592, 13424, 17399, 1593, 1594, 1595, 15951, - 15175, 1596, 1597, 1598, 1599, 1600, 1601, 1602, 1603, 12836, 10218, 1604, - 1605, 1606, 1607, 1608, 1609, 1610, 1611, 1612, 1613, 1614, 1615, 1616, - 1617, 1618, 1619, 1620, 1621, 17247, 1622, 1623, 1624, 1625, 9273, 1626, - 1627, 1628, 17248, 1629, 1630, 1631, 1632, 1633, 1634, 1635, 1636, 1637, - 1638, 1639, 17249, 1640, 1641, 1642, 10955, 1643, 1644, 1645, 1646, 1647, - 1648, 1649, 1650, 1651, 1652, 1653, 1654, 1655, 1656, 13617, 1657, 1658, - 1659, 1660, 1661, 1662, 13996, 13626, 1663, 16454, 1664, 13864, 1665, 1666, - 11914, 1667, 1668, 11013, 1669, 1670, 15513, 1671, 1672, 1673, 1674, 1675, - 1676, 1677, 1678, 18551, 1679, 9791, 1680, 1681, 9239, 1682, 1683, 1684, - 1685, 1686, 10565, 1687, 14951, 1688, 1689, 1690, 1691, 16886, 14921, - 14601, 1692, 1693, 16892, 10229, 1694, 15510, 1695, 1696, 10762, 1697, - 1698, 1699, 1700, 18550, 18548, 1701, 9868, 1702, 14421, 14356, 10437, - 1703, 16643, 15370, 10952, 1704, 13972, 1705, 1706, 14558, 1707, 1708, - 15521, 11943, 11353, 10230, 1709, 17802, 1710, 1711, 1712, 1713, 17803, - 17223, 1714, 15352, 1715, 1716, 13275, 12871, 10433, 1717, 10415, 1718, - 1719, 11967, 16499, 1720, 13290, 1721, 1722, 9243, 17805, 11512, 14400, - 17807, 1723, 17806, 1724, 1725, 1726, 1727, 1728, 10051, 1729, 13836, 1730, - 1731, 9059, 1732, 1733, 1734, 1735, 1736, 1737, 1738, 1739, 1740, 1741, - 1742, 1743, 1744, 13029, 13026, 1745, 12869, 1746, 11378, 14248, 1747, - 1748, 1749, 10960, 1750, 1751, 1752, 19184, 13656, 19185, 14628, 1753, - 16452, 10575, 12517, 1754, 13634, 1755, 1756, 19186, 1757, 1758, 1759, - 1760, 10207, 11348, 1761, 1762, 15388, 19286, 1763, 12713, 1764, 1765, - 1766, 1767, 19289, 1768, 1769, 1770, 1771, 19189, 19290, 14590, 1772, 1773, - 10388, 19187, 19188, 19288, 1774, 1775, 12886, 19293, 1776, 1777, 19292, - 1778, 1779, 1780, 1781, 1782, 1783, 12670, 1784, 13267, 1785, 1786, 19295, - 1787, 1788, 1789, 1790, 1791, 1792, 1793, 12848, 1794, 1795, 1796, 19287, - 13993, 1797, 1798, 1799, 1800, 11562, 10770, 19291, 15158, 14740, 1801, - 1802, 19294, 19301, 1803, 15491, 1804, 11505, 19298, 1805, 1806, 1807, - 1808, 1809, 19300, 1810, 12114, 1811, 1812, 15529, 1813, 1814, 1815, 11312, - 1816, 1817, 1818, 1819, 1820, 1821, 1822, 1823, 1824, 1825, 1826, 1827, - 19302, 1828, 15571, 1829, 1830, 1831, 16478, 1832, 14629, 1833, 14597, - 12451, 19296, 19297, 11526, 19299, 19304, 1834, 1835, 19303, 1836, 1837, - 1838, 1839, 19307, 1840, 19309, 1841, 1842, 1843, 1844, 12904, 1845, 1846, - 1847, 12865, 1848, 1849, 11759, 13854, 1850, 1851, 19308, 1852, 10245, - 1853, 1854, 1855, 12703, 1856, 1857, 1858, 1859, 1860, 1861, 1862, 15748, - 19305, 1863, 19306, 1864, 13587, 1865, 1866, 1867, 1868, 1869, 19314, 1870, - 1871, 1872, 19310, 1873, 1874, 1875, 1876, 1877, 13242, 1878, 1879, 14616, - 19312, 1880, 1881, 1882, 1883, 1884, 1885, 1886, 1887, 1888, 1889, 19313, - 1890, 1891, 1892, 1893, 11188, 1894, 1895, 1896, 1897, 1898, 1899, 1900, - 19315, 1901, 1902, 1903, 1904, 19311, 1905, 1906, 12088, 1907, 1908, 1909, - 1910, 1911, 1912, 1913, 1914, 1915, 15679, 19316, 13859, 19320, 1916, 1917, - 19321, 1918, 1919, 1920, 1921, 15191, 1922, 1923, 1924, 1925, 1926, 1927, - 1928, 1929, 1930, 1931, 1932, 1933, 1934, 1935, 1936, 1937, 1938, 1939, - 12664, 1940, 1941, 1942, 1943, 1944, 1945, 1946, 12671, 19319, 1947, 1948, - 1949, 1950, 1951, 1952, 1953, 1954, 1955, 1956, 1957, 1958, 1959, 1960, - 19318, 1961, 1962, 1963, 1964, 1965, 1966, 1967, 19324, 14932, 1968, 20319, - 1969, 1970, 19327, 1971, 1972, 1973, 1974, 1975, 19322, 1976, 1977, 11367, - 13784, 1978, 1979, 1980, 1981, 1982, 1983, 11326, 1984, 1985, 14966, 1986, - 1987, 1988, 1989, 1990, 19325, 1991, 19326, 1992, 19331, 1993, 19333, 1994, - 1995, 1996, 19334, 1997, 1998, 1999, 19328, 10028, 2000, 19329, 2001, 2002, - 19332, 2003, 2004, 12884, 2005, 19323, 2006, 2007, 2008, 2009, 2010, 19330, - 2011, 2012, 2013, 2014, 2015, 2016, 2017, 2018, 2019, 2020, 2021, 2022, - 2023, 2024, 2025, 2026, 2027, 2028, 2029, 2030, 2031, 2032, 2033, 19335, - 2034, 2035, 2036, 2037, 2038, 2039, 2040, 2041, 2042, 2043, 2044, 2045, - 19337, 19336, 2046, 2047, 2048, 2049, 2050, 2051, 2052, 2053, 2054, 2055, - 2056, 2057, 2058, 2059, 2060, 2061, 2062, 2063, 2064, 2065, 2066, 2067, - 2068, 2069, 2070, 2071, 19338, 2072, 16903, 2073, 2074, 19339, 2075, 2076, - 2077, 2078, 2079, 2080, 2081, 2082, 19340, 2083, 2084, 2085, 2086, 2087, - 2088, 2089, 2090, 2091, 2092, 2093, 2094, 2095, 2096, 2097, 16486, 19346, - 2098, 19347, 11930, 15913, 2099, 16489, 9855, 14234, 19343, 16660, 16481, - 15107, 2100, 12682, 2101, 2102, 19348, 11335, 10769, 19344, 15302, 2103, - 2104, 10927, 12492, 2105, 16636, 2106, 2107, 2108, 14040, 19173, 2109, - 19345, 2110, 10440, 2111, 2112, 2113, 2114, 13655, 2115, 2116, 12910, 2117, - 2118, 19113, 12919, 2119, 14247, 19114, 16067, 2120, 15753, 14021, 9043, - 2121, 14201, 14609, 2122, 2123, 10999, 2124, 2125, 2126, 19116, 2127, - 19115, 2128, 16493, 10792, 16315, 10173, 14615, 15528, 9221, 13986, 2129, - 9667, 13858, 11920, 15196, 14015, 19117, 11149, 2130, 2131, 2132, 14975, - 10747, 2133, 2134, 2135, 2136, 15920, 2137, 2138, 10931, 15366, 15007, - 11355, 2139, 19118, 13646, 2140, 2141, 2142, 11952, 9301, 14217, 2143, - 2144, 11342, 2145, 11341, 15575, 12695, 11935, 2146, 2147, 2148, 2149, - 10572, 2150, 2151, 2152, 12669, 2153, 10939, 15867, 2154, 2155, 2156, 2157, - 2158, 2159, 2160, 2161, 2162, 13457, 12840, 9481, 2163, 10784, 2164, 2165, - 19122, 12295, 2166, 2167, 16070, 2168, 2169, 2170, 2171, 2172, 19123, 2173, - 19125, 2174, 2175, 2176, 2177, 2178, 2179, 2180, 9856, 10217, 14189, 15311, - 10003, 2181, 2182, 14022, 2183, 10421, 2184, 2185, 13843, 2186, 11506, - 2187, 2188, 14755, 16515, 2189, 2190, 2191, 2192, 15106, 2193, 13832, 2194, - 2195, 10256, 19341, 11371, 2196, 9625, 2197, 13823, 2198, 19342, 9597, - 2199, 2200, 2201, 2202, 17809, 2203, 15715, 17810, 2204, 15487, 2205, 2206, - 2207, 2208, 17811, 2209, 2210, 2211, 2212, 11730, 2213, 2214, 17812, 2215, - 2216, 2217, 13977, 15577, 9658, 19169, 12890, 11686, 14743, 12907, 11739, - 13213, 9472, 2218, 2219, 11736, 2220, 2221, 13487, 14420, 11571, 14786, - 2222, 2223, 13991, 13238, 19171, 15133, 2224, 2225, 2226, 16080, 2227, - 2228, 2229, 19172, 2230, 2231, 2232, 2233, 14049, 2234, 14567, 12482, 2235, - 19174, 2236, 12481, 19175, 2237, 2238, 2239, 2240, 2241, 2242, 2243, 19183, - 14580, 2244, 13804, 2245, 2246, 2247, 2248, 2249, 2250, 2251, 15542, 18343, - 2252, 2253, 2254, 2255, 15751, 2256, 14229, 13286, 2257, 2258, 2259, 2260, - 2261, 18347, 2262, 2263, 2264, 18342, 18344, 2265, 2266, 18345, 18350, - 2267, 2268, 9482, 2269, 18346, 10603, 18348, 18349, 18351, 10001, 18352, - 2270, 2271, 2272, 2273, 2274, 18354, 18359, 2275, 2276, 2277, 2278, 2279, - 15345, 2280, 18357, 18356, 12330, 2281, 2282, 2283, 18358, 2284, 15897, - 2285, 18353, 2286, 18361, 9047, 2287, 2288, 2289, 2290, 18355, 2291, 11964, - 2292, 18360, 2293, 2294, 18362, 2295, 2296, 2297, 2298, 2299, 2300, 18365, - 2301, 2302, 2303, 2304, 2305, 2306, 18363, 2307, 2308, 2309, 2310, 2311, - 2312, 16282, 2313, 2314, 2315, 2316, 2317, 2318, 2319, 14946, 2320, 2321, - 18364, 18366, 12490, 2322, 10240, 2323, 15763, 2324, 2325, 13440, 2326, - 2327, 10424, 2328, 2329, 2330, 2331, 2332, 2333, 2334, 2335, 2336, 2337, - 11779, 2338, 2339, 2340, 2341, 2342, 2343, 18367, 18368, 2344, 2345, 18374, - 9666, 2346, 2347, 2348, 2349, 2350, 2351, 13278, 2352, 2353, 2354, 2355, - 2356, 9847, 2357, 15329, 2358, 2359, 2360, 2361, 18375, 2362, 2363, 18373, - 2364, 2365, 2366, 2367, 2368, 18372, 2369, 18370, 18369, 2370, 9247, 2371, - 2372, 2373, 16079, 18371, 2374, 2375, 2376, 2377, 2378, 18378, 2379, 2380, - 2381, 2382, 2383, 2384, 2385, 2386, 18379, 18377, 2387, 2388, 2389, 2390, - 2391, 2392, 2393, 2394, 21085, 2395, 2396, 18386, 18385, 13417, 2397, 2398, - 2399, 2400, 2401, 2402, 2403, 2404, 2405, 2406, 2407, 18376, 2408, 2409, - 18381, 2410, 18383, 2411, 2412, 2413, 2414, 2415, 2416, 2417, 2418, 2419, - 2420, 2421, 18387, 2422, 18384, 18380, 2423, 2424, 18382, 2425, 2426, 2427, - 2428, 18388, 2429, 2430, 2431, 2432, 2433, 2434, 2435, 2436, 2437, 2438, - 2439, 2440, 2441, 18389, 2442, 2443, 2444, 2445, 2446, 2447, 2448, 2449, - 2450, 2451, 2452, 2453, 2454, 2455, 2456, 2457, 2458, 2459, 2460, 2461, - 2462, 2463, 18390, 2464, 2465, 2466, 18391, 2467, 2468, 2469, 2470, 2471, - 2472, 2473, 2474, 2475, 2476, 2477, 2478, 2479, 2480, 2481, 2482, 2483, - 2484, 2485, 2486, 2487, 2488, 2489, 2490, 2491, 18393, 2492, 2493, 2494, - 2495, 2496, 2497, 2498, 2499, 2500, 2501, 2502, 2503, 2504, 18394, 2505, - 2506, 2507, 2508, 2509, 2510, 2511, 14726, 2512, 2513, 2514, 2515, 2516, - 2517, 2518, 2519, 2520, 2521, 2522, 2523, 2524, 19536, 2525, 9793, 16306, - 2526, 2527, 15313, 9613, 2528, 2529, 10739, 16518, 13436, 11747, 10749, - 2530, 14780, 2531, 2532, 9483, 17242, 2533, 11331, 15534, 14195, 9070, - 2534, 2535, 14994, 2536, 2537, 2538, 2539, 2540, 16882, 11572, 2541, 2542, - 9265, 14013, 9433, 2543, 14162, 10366, 2544, 13971, 2545, 2546, 2547, - 14918, 2548, 2549, 18233, 16097, 18236, 2550, 2551, 18235, 13048, 14436, - 2552, 12272, 18234, 16312, 9420, 16281, 10034, 2553, 2554, 2555, 2556, - 2557, 2558, 2559, 2560, 9873, 16246, 2561, 2562, 2563, 2564, 2565, 14930, - 9104, 2566, 2567, 18237, 2568, 2569, 2570, 2571, 2572, 18336, 9598, 2573, - 2574, 18238, 18239, 12652, 2575, 2576, 2577, 2578, 12696, 2579, 18337, - 10444, 2580, 2581, 2582, 2583, 2584, 2585, 11162, 2586, 2587, 2588, 2589, - 2590, 2591, 2592, 18338, 12852, 2593, 2594, 2595, 2596, 2597, 18339, 2598, - 2599, 18340, 2600, 2601, 18341, 9802, 2602, 2603, 2604, 2605, 2606, 2607, - 2608, 2609, 2610, 2611, 2612, 2613, 2614, 2615, 2616, 10586, 13234, 12899, - 2617, 9407, 2618, 15155, 2619, 19534, 11150, 15730, 15711, 2620, 10802, - 18572, 2621, 2622, 2623, 16450, 2624, 13471, 9266, 2625, 2626, 9803, 18574, - 2627, 2628, 2629, 15187, 12459, 18573, 2630, 11941, 15681, 10030, 18575, - 10049, 2631, 12712, 10638, 2632, 10559, 2633, 13066, 10402, 18577, 2634, - 2635, 2636, 2637, 18576, 10205, 16524, 2638, 2639, 2640, 2641, 2642, 14540, - 2643, 2644, 2645, 2646, 2647, 18581, 2648, 18579, 14057, 11896, 15700, - 18578, 2649, 2650, 2651, 2652, 18580, 2653, 2654, 2655, 2656, 2657, 2658, - 2659, 2660, 2661, 2662, 12269, 12105, 2663, 2664, 2665, 2666, 2667, 2668, - 18584, 18583, 12075, 2669, 2670, 12301, 2671, 2672, 2673, 2674, 18585, - 2675, 2676, 2677, 2678, 2679, 2680, 2681, 2682, 2683, 2684, 2685, 2686, - 18586, 2687, 18587, 2688, 2689, 2690, 2691, 2692, 2693, 2694, 2695, 2696, - 17235, 2697, 15346, 14537, 2698, 2699, 11503, 2700, 2701, 2702, 17800, - 16630, 11885, 17240, 15561, 13295, 13025, 2703, 2704, 2705, 17801, 2706, - 9270, 17969, 2707, 2708, 2709, 13994, 2710, 17972, 2711, 10748, 2712, - 15578, 2713, 10550, 11000, 2714, 2715, 9653, 2716, 2717, 2718, 10035, - 16092, 2719, 2720, 2721, 2722, 12689, 14965, 11116, 2723, 19178, 19177, - 2724, 2725, 19179, 2726, 14603, 2727, 13670, 2728, 2729, 2730, 2731, 2732, - 2733, 2734, 9990, 13426, 2735, 19181, 2736, 2737, 2738, 20441, 2739, 2740, - 2741, 2742, 2743, 2744, 2745, 2746, 2747, 2748, 2749, 2750, 2751, 2752, - 2753, 19165, 2754, 10808, 9992, 2755, 12473, 19167, 19166, 19168, 2756, - 2757, 2758, 2759, 15530, 2760, 2761, 2762, 18409, 15151, 2763, 14549, 2764, - 15364, 2765, 2766, 9447, 9290, 2767, 9297, 13092, 2768, 2769, 16090, 15691, - 2770, 18395, 2771, 2772, 2773, 18396, 2774, 15544, 2775, 9620, 9258, 2776, - 2777, 2778, 14624, 16142, 18397, 2779, 11707, 9878, 2780, 18398, 10985, - 18399, 11133, 12486, 18400, 2781, 2782, 2783, 15181, 2784, 14564, 2785, - 2786, 18401, 2787, 10010, 13054, 18402, 2788, 2789, 18403, 2790, 2791, - 2792, 2793, 15764, 2794, 2795, 2796, 2797, 2798, 2799, 18404, 2800, 15308, - 2801, 2802, 18405, 14727, 2803, 2804, 2805, 2806, 2807, 2808, 18406, 2809, - 10009, 2810, 2811, 2812, 2813, 18407, 11168, 2814, 2815, 2816, 2817, 2818, - 15141, 18589, 9271, 15553, 2819, 2820, 18590, 2821, 2822, 11346, 13629, - 2823, 18592, 20519, 20518, 17970, 2824, 2825, 2826, 18591, 16275, 14627, - 12641, 2827, 2828, 2829, 18750, 2830, 2831, 16295, 18596, 2832, 2833, - 18597, 2834, 2835, 15714, 2836, 2837, 18601, 11951, 2838, 18602, 18594, - 2839, 2840, 9627, 2841, 2842, 2843, 12903, 2844, 2845, 18603, 2846, 2847, - 15140, 2848, 11011, 18598, 10417, 11134, 14357, 14198, 18593, 18595, 18599, - 18600, 2849, 2850, 2851, 18612, 2852, 2853, 18609, 15950, 18608, 2854, - 2855, 13028, 2856, 16145, 13049, 9437, 2857, 2858, 18604, 2859, 18607, - 12270, 14183, 2860, 2861, 9976, 18614, 2862, 2863, 2864, 11322, 18606, - 15157, 15890, 18610, 10789, 18611, 2865, 2866, 2867, 13446, 2868, 2869, - 2870, 2871, 2872, 18605, 2873, 2874, 2875, 2876, 2877, 16495, 20616, 2878, - 2879, 18613, 2880, 20620, 18619, 14014, 2881, 2882, 2883, 2884, 2885, 2886, - 2887, 12276, 2888, 11163, 2889, 2890, 11929, 2891, 10992, 2892, 2893, - 14156, 2894, 2895, 2896, 20621, 20618, 2897, 2898, 20617, 2899, 2900, 2901, - 2902, 11169, 20622, 15189, 2903, 2904, 20619, 10987, 10252, 18716, 10183, - 14426, 10742, 2905, 14917, 13396, 2906, 2907, 11925, 2908, 2909, 10246, - 2910, 18615, 18616, 18618, 18617, 12878, 18717, 2911, 15708, 2912, 2913, - 2914, 18722, 13431, 2915, 2916, 2917, 2918, 14919, 2919, 2920, 18724, - 10948, 2921, 2922, 2923, 2924, 18723, 2925, 11173, 2926, 18718, 2927, 2928, - 2929, 18719, 18725, 2930, 18721, 2931, 14807, 15713, 2932, 2933, 11143, - 2934, 2935, 15900, 2936, 12915, 2937, 2938, 20623, 15197, 18720, 2939, - 12720, 2940, 18728, 9230, 2941, 18733, 2942, 2943, 2944, 11339, 2945, 2946, - 18727, 10006, 2947, 2948, 2949, 2950, 2951, 2952, 2953, 2954, 13468, 18731, - 2955, 2956, 2957, 11695, 14614, 2958, 2959, 2960, 2961, 2962, 11198, 2963, - 2964, 2965, 14417, 2966, 2967, 18730, 2968, 18732, 2969, 14922, 18729, - 2970, 14734, 11176, 2971, 2972, 2973, 2974, 2975, 10050, 11754, 9455, 9640, - 2976, 9240, 18726, 9454, 9987, 10798, 10237, 2977, 2978, 14990, 18738, - 2979, 11159, 2980, 2981, 13624, 15147, 2982, 2983, 2984, 2985, 2986, 18739, - 9673, 2987, 2988, 2989, 2990, 20624, 2991, 15765, 15743, 2992, 2993, 2994, - 20625, 18740, 15551, 2995, 2996, 2997, 2998, 2999, 18736, 3000, 3001, 3002, - 3003, 15737, 3004, 3005, 3006, 3007, 10593, 18734, 3008, 3009, 18737, - 10418, 3010, 18735, 12067, 3011, 3012, 3013, 18741, 3014, 3015, 3016, 3017, - 3018, 3019, 3020, 3021, 3022, 3023, 3024, 3025, 3026, 3027, 3028, 3029, - 3030, 3031, 3032, 15889, 3033, 3034, 3035, 3036, 3037, 3038, 3039, 3040, - 9825, 3041, 18742, 3042, 11152, 3043, 13862, 3044, 3045, 13844, 3046, 3047, - 3048, 12854, 3049, 3050, 3051, 3052, 3053, 3054, 3055, 20626, 3056, 3057, - 3058, 3059, 12538, 3060, 3061, 3062, 3063, 11174, 11889, 3064, 3065, 3066, - 3067, 3068, 3069, 3070, 14756, 3071, 3072, 3073, 3074, 18743, 3075, 11897, - 3076, 3077, 3078, 3079, 3080, 3081, 3082, 3083, 3084, 3085, 3086, 3087, - 3088, 3089, 3090, 3091, 3092, 3093, 3094, 9294, 3095, 3096, 15952, 3097, - 3098, 3099, 3100, 3101, 18745, 3102, 3103, 3104, 3105, 3106, 3107, 3108, - 3109, 20628, 3110, 3111, 3112, 3113, 3114, 3115, 3116, 3117, 3118, 18746, - 10934, 20627, 3119, 3120, 18744, 3121, 3122, 3123, 3124, 3125, 3126, 3127, - 3128, 3129, 3130, 18747, 3131, 3132, 3133, 3134, 3135, 3136, 10947, 3137, - 3138, 3139, 10179, 3140, 3141, 3142, 3143, 3144, 15129, 3145, 9060, 20629, - 3146, 3147, 3148, 3149, 3150, 20630, 12098, 3151, 18748, 3152, 3153, 3154, - 3155, 3156, 3157, 3158, 3159, 3160, 3161, 3162, 3163, 3164, 3165, 3166, - 3167, 3168, 13034, 3169, 3170, 3171, 3172, 3173, 3174, 3175, 3176, 3177, - 3178, 3179, 3180, 3181, 3182, 18749, 3183, 3184, 3185, 3186, 3187, 3188, - 3189, 3190, 3191, 17403, 3192, 3193, 3194, 3195, 3196, 3197, 20631, 3198, - 10619, 3199, 14801, 20052, 15176, 14054, 13639, 14938, 9636, 14775, 11563, - 3200, 3201, 18777, 11197, 20053, 16084, 3202, 13266, 20054, 3203, 3204, - 3205, 20055, 3206, 20057, 20056, 3207, 20059, 20058, 3208, 3209, 3210, - 3211, 11551, 3212, 20060, 3213, 12475, 3214, 3215, 3216, 3217, 9818, 9872, - 3218, 3219, 11122, 3220, 3221, 3222, 3223, 3224, 20495, 20494, 10386, - 14244, 9281, 3225, 20496, 3226, 3227, 3228, 13815, 20497, 20498, 3229, - 14019, 17813, 9442, 15955, 3230, 3231, 13248, 9064, 9867, 13636, 3232, - 3233, 3234, 14583, 3235, 3236, 11899, 3237, 3238, 3239, 3240, 3241, 3242, - 3243, 11934, 3244, 3245, 13399, 16265, 3246, 12074, 17814, 13783, 15374, - 13019, 9096, 9617, 13622, 3247, 3248, 9091, 3249, 3250, 10441, 3251, 3252, - 13105, 3253, 3254, 10248, 3255, 16105, 9643, 11333, 3256, 3257, 3258, 9608, - 3259, 3260, 3261, 3262, 11766, 9074, 3263, 3264, 3265, 3266, 3267, 3268, - 15539, 14032, 16440, 3269, 14557, 10187, 11900, 16114, 3270, 10552, 13070, - 3271, 3272, 3273, 17815, 11932, 12498, 13427, 3274, 11119, 9223, 3275, - 3276, 13089, 3277, 3278, 13106, 14352, 3279, 3280, 3281, 3282, 9222, 3283, - 3284, 3285, 10029, 3286, 3287, 3288, 12833, 3289, 17816, 15321, 9668, 3290, - 12717, 3291, 3292, 10442, 3293, 16329, 9978, 9485, 12845, 12898, 12078, - 17817, 3294, 9097, 13051, 12319, 3295, 10788, 3296, 11745, 14591, 9071, - 3297, 14582, 17819, 11733, 16465, 17818, 16103, 9086, 3298, 3299, 12891, - 3300, 3301, 12448, 11385, 3302, 15696, 12090, 13016, 9411, 15946, 3303, - 3304, 12073, 14000, 17820, 16147, 3305, 10751, 3306, 13598, 14164, 3307, - 17822, 11904, 3308, 3309, 3310, 3311, 13225, 16442, 13981, 12860, 3312, - 9649, 10785, 3313, 3314, 3315, 3316, 16269, 20137, 9045, 3317, 3318, 3319, - 3320, 11945, 3321, 3322, 14429, 3323, 3324, 3325, 3326, 14593, 3327, 3328, - 3329, 16276, 12491, 3330, 14771, 14347, 15119, 12876, 9993, 17821, 16140, - 11328, 11166, 3331, 3332, 9029, 3333, 13033, 9861, 3334, 3335, 3336, 16136, - 3337, 3338, 20138, 3339, 3340, 3341, 3342, 3343, 3344, 17823, 14541, 3345, - 3346, 14611, 3347, 3348, 3349, 3350, 14795, 17825, 3351, 14552, 12071, - 3352, 3353, 16464, 3354, 17824, 9063, 10945, 13826, 12908, 11757, 3355, - 3356, 3357, 3358, 9427, 3359, 3360, 3361, 3362, 3363, 3364, 3365, 3366, - 12109, 14235, 3367, 11386, 11142, 9998, 3368, 3369, 3370, 13100, 3371, - 17835, 3372, 3373, 3374, 17832, 11746, 3375, 3376, 17828, 3377, 3378, 3379, - 3380, 9808, 11556, 3381, 3382, 17829, 12902, 3383, 3384, 3385, 3386, 14953, - 3387, 10039, 3388, 3389, 3390, 3391, 10227, 14023, 10059, 17834, 3392, - 16093, 3393, 17830, 14390, 13299, 3394, 13052, 3395, 3396, 3397, 15505, - 3398, 11767, 3399, 3400, 3401, 3402, 3403, 3404, 3405, 12496, 3406, 14374, - 9619, 3407, 11546, 3408, 11931, 14573, 15353, 9860, 3409, 17833, 17826, - 17836, 3410, 20139, 3411, 3412, 12461, 17831, 3413, 3414, 16277, 9982, - 3415, 9489, 3416, 17837, 3417, 17847, 3418, 3419, 3420, 3421, 3422, 17842, - 3423, 17846, 3424, 3425, 13649, 3426, 3427, 3428, 16500, 17844, 12707, - 14410, 3429, 9474, 3430, 3431, 3432, 15515, 3433, 3434, 3435, 3436, 3437, - 3438, 3439, 17843, 3440, 17840, 14778, 3441, 9792, 3442, 3443, 3444, 3445, - 3446, 11886, 11715, 3447, 3448, 11545, 3449, 3450, 3451, 3452, 17838, 3453, - 15879, 3454, 17827, 3455, 17839, 3456, 3457, 3458, 3459, 12096, 3460, - 17841, 9488, 10618, 12452, 3461, 3462, 11528, 3463, 3464, 3465, 3466, 3467, - 17850, 17853, 3468, 3469, 9416, 9789, 3470, 3471, 9859, 13781, 3472, 3473, - 3474, 3475, 3476, 3477, 17851, 14204, 3478, 10612, 3479, 17852, 17855, - 3480, 3481, 3482, 3483, 17854, 3484, 3485, 3486, 14379, 3487, 9090, 9863, - 3488, 3489, 3490, 3491, 3492, 3493, 19121, 3494, 3495, 3496, 3497, 3498, - 15120, 3499, 3500, 9480, 3501, 20236, 3502, 17849, 3503, 3504, 13842, - 17848, 9083, 15486, 9302, 3505, 14360, 3506, 3507, 3508, 3509, 3510, 3511, - 3512, 17845, 3513, 14159, 3514, 3515, 3516, 16065, 3517, 3518, 3519, 3520, - 3521, 17856, 3522, 3523, 3524, 3525, 3526, 3527, 3528, 3529, 9846, 3530, - 12831, 3531, 3532, 3533, 17858, 3534, 3535, 3536, 3537, 3538, 3539, 3540, - 3541, 3542, 3543, 12729, 12826, 17956, 3544, 3545, 3546, 3547, 3548, 3549, - 3550, 12299, 3551, 17857, 11764, 3552, 13223, 3553, 3554, 3555, 3556, 3557, - 3558, 3559, 3560, 3561, 9632, 13671, 3562, 3563, 14181, 17859, 3564, 3565, - 17959, 3566, 3567, 3568, 3569, 16453, 3570, 3571, 3572, 3573, 3574, 9618, - 3575, 3576, 3577, 3578, 12290, 3579, 3580, 13438, 9410, 9858, 3581, 16446, - 3582, 3583, 3584, 3585, 12901, 3586, 17957, 17958, 3587, 17960, 3588, - 10944, 3589, 3590, 3591, 17961, 3592, 12127, 3593, 3594, 13810, 3595, 3596, - 3597, 3598, 3599, 3600, 3601, 9462, 13465, 3602, 17962, 3603, 13455, 3604, - 3605, 3606, 3607, 17963, 20237, 3608, 3609, 3610, 3611, 3612, 14206, 3613, - 3614, 3615, 17965, 3616, 17964, 3617, 9438, 3618, 3619, 3620, 3621, 3622, - 3623, 3624, 3625, 3626, 3627, 3628, 3629, 3630, 3631, 3632, 3633, 3634, - 3635, 3636, 3637, 3638, 3639, 3640, 3641, 3642, 13057, 3643, 3644, 3645, - 3646, 3647, 3648, 3649, 3650, 17966, 3651, 3652, 3653, 3654, 3655, 3656, - 3657, 3658, 15925, 3659, 3660, 3661, 3662, 3663, 13618, 3664, 3665, 3666, - 3667, 3668, 3669, 3670, 3671, 3672, 3673, 3674, 3675, 17967, 3676, 3677, - 3678, 3679, 3680, 11765, 3681, 3682, 17968, 16252, 3683, 3684, 3685, 3686, - 20068, 20257, 14018, 3687, 16717, 10581, 3688, 10740, 3689, 3690, 10392, - 16149, 3691, 3692, 3693, 3694, 3695, 10777, 3696, 3697, 15112, 21990, 3698, - 3699, 10023, 3700, 3701, 12719, 3702, 11725, 3703, 3704, 3705, 20258, 9054, - 3706, 3707, 11539, 3708, 12273, 3709, 9269, 9603, 3710, 3711, 3712, 10595, - 13777, 3713, 3714, 10221, 3715, 3716, 3717, 3718, 20259, 11705, 3719, 3720, - 3721, 14058, 3722, 13430, 3723, 16146, 3724, 3725, 10438, 3726, 3727, 3728, - 3729, 3730, 3731, 3732, 3733, 3734, 3735, 3736, 3737, 3738, 3739, 3740, - 14761, 3741, 3742, 3743, 16066, 9298, 3744, 3745, 3746, 20444, 9088, 3747, - 20446, 3748, 3749, 3750, 10188, 3751, 12302, 3752, 22225, 15122, 3753, - 3754, 16124, 3755, 14776, 3756, 3757, 11574, 9661, 3758, 10556, 3759, - 16077, 3760, 20644, 3761, 10212, 3762, 14180, 15139, 3763, 3764, 3765, - 3766, 3767, 3768, 3769, 3770, 10384, 3771, 3772, 20447, 13974, 3773, 3774, - 3775, 13067, 3776, 20450, 20449, 12480, 20448, 3777, 3778, 3779, 3780, - 15198, 20451, 3781, 20452, 16504, 3782, 3783, 20453, 3784, 3785, 3786, - 20454, 13281, 3787, 3788, 3789, 3790, 3791, 3792, 3793, 3794, 14787, 3795, - 11345, 3796, 3797, 13638, 9984, 11726, 16273, 15936, 3798, 3799, 15309, - 15186, 20069, 20070, 20071, 10946, 3800, 3801, 3802, 3803, 13982, 11960, - 3804, 3805, 14625, 3806, 3807, 3808, 3809, 3810, 20077, 3811, 9051, 20075, - 3812, 3813, 12070, 3814, 3815, 3816, 20072, 3817, 9498, 3818, 12722, 11187, - 3819, 3820, 3821, 15540, 14809, 20076, 3822, 3823, 3824, 20073, 3825, 3826, - 3827, 20080, 3828, 15144, 15694, 3829, 3830, 3831, 3832, 9811, 3833, 12668, - 16517, 3834, 3835, 3836, 3837, 16104, 3838, 14004, 3839, 20082, 3840, 3841, - 20081, 20084, 20083, 3842, 3843, 3844, 3845, 3846, 16316, 3847, 14967, - 3848, 3849, 20088, 3850, 11161, 3851, 3852, 3853, 3854, 3855, 3856, 3857, - 11585, 13821, 3858, 3859, 20089, 3860, 3861, 13800, 15009, 20087, 15911, - 20090, 20092, 3862, 3863, 14612, 3864, 3865, 3866, 3867, 20086, 3868, - 20091, 3869, 3870, 14803, 3871, 11177, 3872, 9626, 3873, 3874, 3875, 3876, - 3877, 13258, 11701, 14815, 3878, 3879, 3880, 13466, 3881, 11692, 20093, - 3882, 3883, 16284, 3884, 3885, 3886, 12287, 3887, 3888, 3889, 15926, 3890, - 20094, 3891, 3892, 14945, 3893, 3894, 3895, 3896, 20095, 3897, 3898, 3899, - 3900, 14043, 3901, 3902, 3903, 3904, 13030, 9046, 3905, 3906, 3907, 3908, - 3909, 20097, 3910, 3911, 3912, 3913, 3914, 3915, 3916, 3917, 3918, 20096, - 22008, 3919, 3920, 3921, 3922, 3923, 12851, 3924, 3925, 3926, 3927, 3928, - 9224, 3929, 3930, 3931, 3932, 19158, 3933, 3934, 3935, 3936, 20098, 3937, - 3938, 3939, 3940, 3941, 3942, 3943, 3944, 3945, 3946, 3947, 3948, 3949, - 3950, 3951, 3952, 3953, 3954, 3955, 3956, 3957, 3958, 3959, 3960, 3961, - 3962, 14044, 3963, 20099, 20100, 13261, 3964, 3965, 3966, 3967, 3968, 3969, - 3970, 3971, 20101, 3972, 3973, 20102, 3974, 3975, 3976, 3977, 3978, 3979, - 15892, 3980, 13485, 15508, 10637, 3981, 3982, 20079, 3983, 9465, 3984, - 3985, 12537, 3986, 15953, 14415, 16513, 3987, 3988, 3989, 3990, 3991, 3992, - 3993, 15899, 15723, 20270, 13098, 3994, 10449, 3995, 3996, 20287, 3997, - 3998, 3999, 14178, 20297, 4000, 12107, 4001, 4002, 4003, 14626, 4004, 9610, - 4005, 13263, 4006, 4007, 4008, 4009, 4010, 4011, 20327, 4012, 12855, 4013, - 14745, 12834, 9245, 15958, 4014, 14050, 4015, 16321, 4016, 4017, 13256, - 10233, 4018, 4019, 4020, 4021, 11205, 4022, 4023, 15169, 4024, 4025, 13792, - 4026, 15916, 13593, 4027, 4028, 10588, 4029, 19695, 13803, 4030, 4031, - 19692, 4032, 12143, 15156, 9441, 9854, 4033, 19693, 4034, 4035, 16095, - 4036, 4037, 4038, 4039, 4040, 10202, 4041, 19694, 14053, 10605, 14430, - 4042, 4043, 4044, 12085, 4045, 4046, 15373, 19696, 19699, 4047, 4048, - 10953, 4049, 9228, 11555, 4050, 20074, 19700, 4051, 19703, 4052, 19708, - 4053, 4054, 4055, 4056, 19709, 4057, 14196, 9094, 4058, 11316, 4059, 4060, - 10760, 4061, 4062, 19698, 4063, 14622, 4064, 19707, 4065, 4066, 4067, 4068, - 14811, 4069, 4070, 4071, 4072, 16132, 4073, 12309, 19701, 4074, 12657, - 4075, 10826, 16251, 19705, 4076, 4077, 4078, 14029, 15935, 4079, 19697, - 4080, 19702, 19704, 4081, 13420, 10422, 4082, 19706, 4083, 11936, 19715, - 4084, 4085, 19720, 4086, 19718, 11365, 11352, 19724, 4087, 4088, 4089, - 4090, 4091, 4092, 4093, 4094, 19727, 4095, 19723, 9305, 4096, 4097, 4098, - 4099, 4100, 4101, 4102, 4103, 4104, 4105, 9081, 12844, 10589, 13271, 13615, - 13650, 4106, 4107, 4108, 19712, 19717, 19719, 4109, 10816, 19721, 16520, - 4110, 12916, 4111, 19725, 4112, 4113, 9478, 4114, 4115, 4116, 19714, 4117, - 4118, 11382, 4119, 4120, 11909, 19710, 16334, 4121, 12343, 9486, 4122, - 4123, 4124, 4125, 4126, 4127, 4128, 4129, 19728, 4130, 13998, 19722, 4131, - 4132, 4133, 4134, 16059, 4135, 9289, 16082, 19711, 19713, 10181, 19716, - 4136, 19726, 12089, 4137, 14052, 4138, 14163, 4139, 4140, 13265, 12150, - 4141, 4142, 4143, 4144, 4145, 19738, 4146, 4147, 4148, 15108, 4149, 4150, - 4151, 4152, 4153, 4154, 4155, 19747, 16319, 4156, 4157, 4158, 4159, 4160, - 4161, 4162, 19729, 19730, 4163, 4164, 4165, 15384, 10968, 10634, 4166, - 4167, 10626, 15917, 19744, 4168, 19743, 19741, 10815, 14395, 19735, 14731, - 11957, 4169, 9049, 19746, 19745, 4170, 16467, 4171, 19733, 4172, 14544, - 13778, 4173, 11139, 11554, 19739, 4174, 4175, 4176, 4177, 4178, 4179, 4180, - 4181, 4182, 4183, 19731, 19732, 19734, 9996, 19736, 13432, 19740, 19742, - 11511, 16449, 4184, 19753, 4185, 4186, 4187, 4188, 4189, 4190, 4191, 4192, - 19750, 4193, 14551, 19751, 4194, 4195, 4196, 4197, 4198, 4199, 4200, 4201, - 4202, 12281, 4203, 19737, 4204, 12658, 9105, 4205, 4206, 4207, 4208, 4209, - 4210, 4211, 4212, 19749, 4213, 4214, 4215, 19752, 4216, 4217, 4218, 10738, - 4219, 4220, 4221, 4222, 4223, 4224, 4225, 4226, 4227, 4228, 13825, 4229, - 4230, 4231, 12681, 14789, 12135, 4232, 4233, 4234, 4235, 14238, 4236, - 14406, 15126, 4237, 4238, 14030, 4239, 19748, 4240, 4241, 4242, 4243, 4244, - 4245, 4246, 4247, 4248, 4249, 11381, 4250, 19754, 4251, 4252, 4253, 4254, - 4255, 4256, 12697, 4257, 13274, 4258, 10822, 4259, 4260, 4261, 4262, 9109, - 4263, 4264, 16491, 4265, 4266, 11317, 4267, 13094, 4268, 4269, 4270, 4271, - 4272, 14381, 4273, 4274, 19861, 4275, 4276, 4277, 4278, 4279, 4280, 4281, - 4282, 4283, 4284, 13788, 4285, 19857, 12131, 4286, 4287, 4288, 11910, 4289, - 4290, 4291, 19759, 10790, 4292, 19756, 4293, 4294, 4295, 4296, 19859, 4297, - 4298, 4299, 15531, 4300, 4301, 4302, 4303, 4304, 19858, 4305, 16263, 16456, - 4306, 19862, 4307, 11518, 4308, 4309, 4310, 4311, 4312, 4313, 4314, 4315, - 4316, 4317, 4318, 4319, 19757, 19758, 4320, 4321, 4322, 19856, 4323, 4324, - 4325, 4326, 4327, 4328, 4329, 4330, 14589, 4331, 4332, 15497, 4333, 4334, - 4335, 19873, 4336, 4337, 4338, 4339, 19864, 4340, 4341, 4342, 9795, 4343, - 9812, 4344, 4345, 19866, 4346, 4347, 4348, 4349, 4350, 4351, 4352, 4353, - 4354, 4355, 4356, 4357, 4358, 4359, 4360, 4361, 4362, 15113, 4363, 4364, - 19860, 4365, 4366, 9689, 4367, 4368, 19867, 12132, 4369, 19865, 4370, 4371, - 19880, 4372, 4373, 19879, 4374, 4375, 4376, 4377, 19869, 4378, 4379, 19755, - 4380, 4381, 19863, 4382, 4383, 4384, 4385, 4386, 11887, 19872, 19881, 4387, - 4388, 12450, 4389, 4390, 4391, 19870, 4392, 10582, 4393, 19868, 4394, - 15735, 19875, 19876, 19878, 4395, 4396, 4397, 19894, 4398, 4399, 4400, - 4401, 4402, 4403, 12103, 19892, 4404, 4405, 19871, 4406, 4407, 19882, 9106, - 4408, 4409, 4410, 4411, 4412, 4413, 4414, 4415, 4416, 4417, 19883, 16060, - 4418, 4419, 19885, 4420, 19886, 4421, 4422, 4423, 19888, 4424, 4425, 12336, - 4426, 4427, 13607, 4428, 4429, 4430, 19884, 4431, 4432, 4433, 4434, 4435, - 19889, 4436, 4437, 4438, 4439, 4440, 4441, 4442, 4443, 19890, 4444, 19874, - 4445, 19877, 4446, 11132, 4447, 4448, 4449, 19887, 4450, 4451, 4452, 4453, - 4454, 4455, 11392, 4456, 4457, 4458, 19891, 19893, 4459, 4460, 4461, 4462, - 4463, 4464, 4465, 4466, 4467, 4468, 4469, 4470, 19897, 4471, 4472, 4473, - 4474, 19901, 4475, 4476, 4477, 4478, 4479, 4480, 4481, 4482, 4483, 4484, - 9464, 4485, 19895, 4486, 4487, 4488, 4489, 4490, 4491, 4492, 4493, 4494, - 4495, 10369, 4496, 4497, 4498, 4499, 4500, 4501, 4502, 4503, 4504, 4505, - 4506, 4507, 19898, 19899, 4508, 4509, 4510, 4511, 4512, 4513, 16088, 4514, - 12828, 4515, 4516, 4517, 4518, 4519, 4520, 19911, 4521, 10990, 4522, 4523, - 4524, 4525, 19896, 4526, 15678, 4527, 4528, 4529, 19907, 4530, 4531, 4532, - 4533, 4534, 4535, 4536, 19910, 19903, 4537, 4538, 4539, 4540, 4541, 19902, - 4542, 4543, 13428, 4544, 4545, 4546, 4547, 4548, 4549, 4550, 4551, 19905, - 4552, 4553, 4554, 4555, 4556, 4557, 4558, 19912, 9635, 4559, 19906, 4560, - 4561, 4562, 4563, 4564, 14995, 4565, 4566, 4567, 19900, 4568, 4569, 4570, - 4571, 4572, 4573, 4574, 4575, 4576, 4577, 4578, 9682, 4579, 4580, 4581, - 4582, 4583, 4584, 4585, 19909, 4586, 4587, 19913, 4588, 4589, 4590, 14365, - 4591, 4592, 4593, 14928, 4594, 4595, 4596, 4597, 4598, 4599, 4600, 4601, - 4602, 19908, 4603, 19915, 19914, 4604, 4605, 4606, 4607, 4608, 19917, 4609, - 4610, 4611, 4612, 4613, 4614, 4615, 4616, 19904, 4617, 4618, 4619, 4620, - 4621, 4622, 4623, 4624, 19916, 4625, 19918, 12677, 4626, 4627, 4628, 4629, - 4630, 4631, 4632, 4633, 4634, 4635, 4636, 4637, 4638, 4639, 4640, 4641, - 4642, 4643, 4644, 4645, 4646, 4647, 4648, 4649, 4650, 4651, 4652, 4653, - 4654, 4655, 4656, 4657, 4658, 4659, 4660, 4661, 4662, 4663, 4664, 4665, - 4666, 4667, 4668, 4669, 4670, 4671, 4672, 4673, 4674, 4675, 4676, 4677, - 4678, 4679, 4680, 4681, 4682, 4683, 4684, 4685, 4686, 4687, 4688, 4689, - 4690, 4691, 4692, 4693, 4694, 4695, 4696, 4697, 4698, 4699, 4700, 4701, - 4702, 4703, 4704, 4705, 4706, 4707, 4708, 4709, 4710, 4711, 4712, 4713, - 4714, 4715, 4716, 4717, 4718, 4719, 4720, 4721, 4722, 4723, 4724, 4725, - 4726, 4727, 4728, 4729, 4730, 4731, 4732, 4733, 4734, 4735, 4736, 4737, - 4738, 4739, 4740, 13418, 9831, 11137, 15137, 20428, 4741, 4742, 13038, - 4743, 4744, 4745, 4746, 4747, 4748, 4749, 4750, 4751, 4752, 15766, 4753, - 4754, 4755, 4756, 20429, 4757, 20430, 13264, 4758, 4759, 4760, 11953, 4761, - 4762, 4763, 4764, 20431, 4765, 4766, 20432, 15115, 4767, 13419, 4768, 4769, - 10617, 4770, 4771, 4772, 4773, 4774, 4775, 4776, 4777, 4778, 4779, 4780, - 4781, 20433, 4782, 4783, 4784, 4785, 4786, 4787, 4788, 4789, 16270, 16148, - 9828, 9434, 14793, 13276, 4790, 4791, 14600, 4792, 4793, 4794, 4795, 4796, - 4797, 4798, 4799, 4800, 4801, 4802, 4803, 4804, 4805, 9870, 4806, 14187, - 11368, 4807, 4808, 4809, 4810, 19921, 19922, 15369, 19924, 4811, 9874, - 19923, 4812, 15314, 14031, 9453, 4813, 19927, 4814, 4815, 4816, 4817, - 19925, 19926, 4818, 4819, 16264, 4820, 4821, 4822, 19928, 19929, 4823, - 4824, 4825, 4826, 4827, 19930, 4828, 4829, 4830, 4831, 4832, 4833, 4834, - 4835, 19931, 4836, 4837, 4838, 4839, 4840, 4841, 4842, 4843, 20440, 13040, - 10211, 4844, 15568, 4845, 4846, 4847, 4848, 4849, 4850, 4851, 10053, 4852, - 11172, 20442, 4853, 4854, 15552, 4855, 4856, 4857, 4858, 4859, 14792, 4860, - 12849, 4861, 12666, 4862, 4863, 10195, 16650, 9255, 9262, 9264, 13109, - 4864, 9263, 4865, 12646, 4866, 4867, 4868, 4869, 4870, 16072, 4871, 4872, - 4873, 4874, 4875, 4876, 4877, 4878, 20239, 10958, 4879, 4880, 4881, 14371, - 4882, 4883, 4884, 20240, 4885, 20242, 4886, 4887, 4888, 20243, 4889, 4890, - 4891, 20241, 4892, 4893, 4894, 4895, 4896, 4897, 4898, 20244, 20246, 20245, - 4899, 4900, 4901, 4902, 4903, 20247, 4904, 14012, 16646, 12716, 4905, - 12640, 13293, 20248, 12867, 4906, 20249, 20250, 20251, 10408, 4907, 4908, - 4909, 10445, 4910, 20252, 13461, 4911, 20254, 4912, 10929, 15380, 9042, - 20253, 20255, 4913, 4914, 4915, 9985, 12485, 13467, 4916, 20256, 4917, - 14169, 18778, 4918, 4919, 15707, 4920, 4921, 4922, 4923, 16874, 4924, 4925, - 14536, 16258, 13478, 4926, 4927, 4928, 16879, 11182, 4929, 10951, 18781, - 4930, 4931, 4932, 4933, 4934, 14926, 4935, 4936, 4937, 18779, 13814, 4938, - 10950, 4939, 4940, 4941, 15315, 18780, 13659, 10750, 11508, 9651, 14784, - 4942, 4943, 14377, 4944, 4945, 4946, 18787, 18788, 14619, 4947, 4948, 4949, - 4950, 4951, 14358, 4952, 11324, 4953, 18789, 4954, 18790, 4955, 4956, - 15163, 4957, 4958, 4959, 13296, 10413, 4960, 4961, 13458, 15527, 14779, - 4962, 18783, 18791, 4963, 13857, 9628, 4964, 4965, 18786, 4966, 4967, - 13272, 18784, 4968, 4969, 20634, 18785, 4970, 4971, 4972, 4973, 13794, - 4974, 13085, 4975, 4976, 4977, 10756, 4978, 12662, 4979, 18782, 13044, - 12259, 12502, 9460, 4980, 18792, 11121, 12838, 4981, 18795, 11743, 4982, - 4983, 18806, 18800, 10976, 4984, 4985, 4986, 4987, 10403, 15720, 4988, - 16291, 16106, 10768, 16075, 15351, 4989, 4990, 4991, 4992, 15130, 13481, - 4993, 4994, 4995, 13595, 9425, 4996, 12693, 4997, 4998, 4999, 18793, 5000, - 5001, 18807, 18794, 10363, 18802, 18799, 5002, 5003, 5004, 10381, 5005, - 5006, 13017, 5007, 18801, 13076, 9413, 13297, 5008, 12889, 5009, 5010, - 16437, 5011, 12130, 18804, 5012, 5013, 18805, 18808, 14354, 18798, 5014, - 15705, 5015, 9250, 20635, 18796, 18797, 5016, 18803, 15131, 13240, 15948, - 18809, 5017, 5018, 11559, 5019, 5020, 18912, 5021, 5022, 18911, 5023, 5024, - 5025, 15378, 18908, 5026, 18914, 5027, 5028, 5029, 13672, 5030, 5031, 5032, - 5033, 14935, 5034, 18913, 18919, 12514, 5035, 5036, 10185, 5037, 5038, - 5039, 5040, 5041, 5042, 11577, 5043, 18907, 5044, 5045, 10998, 18915, 5046, - 5047, 18917, 5048, 5049, 10258, 16307, 18923, 5050, 18918, 5051, 5052, - 5053, 18906, 5054, 11193, 14596, 13397, 13056, 5055, 5056, 12342, 5057, - 18909, 5058, 13414, 11507, 11524, 18910, 5059, 16474, 9471, 5060, 18916, - 11340, 18920, 5061, 11190, 18921, 13023, 18922, 5062, 5063, 5064, 5065, - 16122, 11878, 5066, 18931, 5067, 18928, 5068, 18932, 5069, 5070, 18934, - 5071, 5072, 13259, 5073, 5074, 10963, 12108, 5075, 5076, 5077, 10546, - 18925, 5078, 5079, 5080, 5081, 15866, 5082, 5083, 10928, 11589, 5084, 5085, - 5086, 18933, 5087, 5088, 5089, 5090, 5091, 14566, 5092, 5093, 12914, 5094, - 5095, 15006, 13845, 5096, 5097, 15706, 5098, 14964, 5099, 5100, 18924, - 5101, 18929, 18930, 14418, 5102, 5103, 5104, 5105, 5106, 14391, 5107, - 12117, 18926, 12271, 18927, 14773, 5108, 11148, 10026, 5109, 13668, 11502, - 16094, 13787, 10547, 18947, 5110, 5111, 18949, 15331, 5112, 5113, 15511, - 5114, 5115, 10938, 5116, 5117, 10977, 5118, 5119, 5120, 5121, 5122, 5123, - 18940, 10052, 5124, 5125, 5126, 16480, 18937, 15008, 18936, 5127, 5128, - 5129, 12315, 14387, 5130, 5131, 5132, 5133, 14036, 5134, 5135, 5136, 5137, - 12880, 5138, 14397, 18945, 5139, 5140, 5141, 18944, 18938, 5142, 18941, - 9988, 5143, 5144, 15732, 5145, 18943, 5146, 5147, 5148, 5149, 15574, 9852, - 5150, 11135, 5151, 5152, 13853, 5153, 9815, 5154, 5155, 5156, 11191, 5157, - 15340, 5158, 14422, 20636, 5159, 5160, 5161, 5162, 5163, 5164, 5165, 5166, - 13464, 5167, 5168, 5169, 5170, 15873, 5171, 18948, 16488, 18939, 5172, - 11500, 18942, 5173, 5174, 15745, 5175, 18946, 13863, 5176, 5177, 18935, - 5178, 5179, 15744, 5180, 5181, 13489, 10206, 5182, 15957, 9424, 18960, - 5183, 5184, 5185, 14759, 5186, 18950, 5187, 14753, 5188, 10604, 5189, 5190, - 18959, 5191, 11917, 5192, 5193, 5194, 15721, 5195, 12711, 5196, 5197, 5198, - 5199, 5200, 5201, 5202, 5203, 13055, 18961, 5204, 5205, 5206, 5207, 5208, - 5209, 5210, 5211, 14571, 18952, 5212, 5213, 5214, 5215, 18957, 18958, 5216, - 11019, 5217, 14985, 5218, 5219, 16086, 5220, 5221, 5222, 18955, 5223, 5224, - 5225, 5226, 5227, 5228, 5229, 5230, 5231, 5232, 5233, 18953, 5234, 5235, - 18951, 5236, 5237, 5238, 5239, 5240, 5241, 5242, 5243, 5244, 5245, 5246, - 5247, 5248, 5249, 5250, 14604, 13975, 5251, 5252, 5253, 12068, 5254, 11501, - 18956, 5255, 5256, 10585, 5257, 5258, 5259, 5260, 5261, 18976, 15885, 5262, - 5263, 5264, 5265, 5266, 5267, 5268, 18964, 5269, 5270, 5271, 12334, 5272, - 5273, 18978, 5274, 5275, 15556, 5276, 5277, 18968, 5278, 18969, 5279, 5280, - 14925, 5281, 5282, 5283, 5284, 14216, 5285, 18963, 18954, 5286, 18974, - 5287, 13645, 18972, 5288, 5289, 12896, 18971, 5290, 18970, 5291, 5292, - 5293, 9687, 18977, 5294, 5295, 5296, 5297, 10040, 5298, 5299, 5300, 16479, - 5301, 5302, 5303, 18975, 5304, 11127, 5305, 16485, 14392, 20323, 5306, - 18973, 5307, 5308, 10821, 5309, 5310, 5311, 16290, 18962, 18965, 12535, - 18967, 5312, 12488, 12101, 12493, 5313, 9300, 14363, 5314, 5315, 5316, - 5317, 5318, 5319, 5320, 5321, 5322, 5323, 10021, 5324, 5325, 5326, 5327, - 18984, 5328, 5329, 5330, 5331, 5332, 5333, 5334, 5335, 13220, 5336, 5337, - 5338, 13270, 5339, 5340, 18990, 5341, 5342, 5343, 5344, 5345, 12454, 5346, - 5347, 5348, 12141, 15356, 18983, 5349, 5350, 5351, 5352, 5353, 5354, 5355, - 5356, 5357, 5358, 12839, 5359, 5360, 5361, 18982, 5362, 5363, 5364, 5365, - 18991, 18989, 12539, 5366, 18966, 5367, 18985, 5368, 14059, 5369, 16091, - 5370, 5371, 18986, 5372, 5373, 5374, 5375, 5376, 5377, 5378, 15385, 5379, - 5380, 5381, 5382, 5383, 5384, 5385, 18980, 18981, 5386, 5387, 5388, 18987, - 5389, 14736, 5390, 5391, 5392, 5393, 5394, 5395, 5396, 5397, 5398, 5399, - 13058, 5400, 5401, 5402, 13412, 5403, 12471, 5404, 5405, 5406, 18979, 5407, - 5408, 5409, 12297, 5410, 5411, 5412, 5413, 5414, 5415, 14367, 9612, 5416, - 5417, 5418, 18996, 5419, 18988, 5420, 5421, 5422, 18995, 5423, 18998, 5424, - 18997, 5425, 5426, 5427, 5428, 5429, 5430, 5431, 9641, 5432, 5433, 5434, - 9621, 18992, 5435, 5436, 18994, 18993, 13091, 5437, 5438, 5439, 5440, 5441, - 5442, 5443, 5444, 5445, 5446, 5447, 5448, 5449, 12094, 5450, 5451, 5452, - 5453, 15937, 5454, 5455, 5456, 5457, 5458, 19097, 5459, 5460, 5461, 5462, - 5463, 5464, 5465, 5466, 5467, 5468, 5469, 9061, 5470, 5471, 19099, 5472, - 5473, 19098, 5474, 5475, 5476, 5477, 5478, 5479, 11309, 5480, 19100, 5481, - 5482, 5483, 5484, 5485, 5486, 19096, 5487, 5488, 5489, 5490, 5491, 5492, - 5493, 18999, 9299, 5494, 5495, 5496, 5497, 5498, 5499, 5500, 5501, 5502, - 5503, 5504, 19103, 5505, 19104, 19101, 5506, 5507, 5508, 5509, 5510, 5511, - 5512, 5513, 5514, 5515, 5516, 5517, 19102, 19105, 5518, 5519, 5520, 5521, - 5522, 5523, 5524, 5525, 5526, 5527, 5528, 5529, 5530, 5531, 5532, 5533, - 5534, 5535, 5536, 5537, 5538, 5539, 5540, 5541, 5542, 5543, 5544, 5545, - 5546, 5547, 5548, 5549, 5550, 13262, 5551, 5552, 5553, 5554, 5555, 5556, - 5557, 5558, 19106, 19108, 5559, 5560, 5561, 5562, 5563, 5564, 5565, 19107, - 5566, 5567, 5568, 5569, 5570, 5571, 5572, 5573, 5574, 5575, 5576, 5577, - 5578, 5579, 5580, 5581, 5582, 19110, 5583, 5584, 5585, 19109, 5586, 5587, - 5588, 5589, 5590, 5591, 5592, 5593, 5594, 5595, 5596, 5597, 5598, 5599, - 5600, 5601, 5602, 5603, 10799, 5604, 5605, 19111, 5606, 5607, 5608, 5609, - 5610, 5611, 5612, 5613, 5614, 5615, 5616, 5617, 5618, 5619, 19112, 5620, - 5621, 5622, 5623, 5624, 5625, 5626, 5627, 5628, 5629, 5630, 5631, 11195, - 20490, 12715, 5632, 10013, 11165, 5633, 5634, 5635, 5636, 12328, 15943, - 5637, 11721, 5638, 5639, 5640, 16473, 5641, 15919, 9456, 20455, 5642, 5643, - 5644, 5645, 20078, 5646, 5647, 5648, 12460, 9807, 5649, 5650, 5651, 15350, - 5652, 5653, 5654, 9615, 5655, 13603, 11902, 20457, 5656, 5657, 16288, 5658, - 5659, 20456, 20458, 5660, 5661, 5662, 5663, 5664, 5665, 5666, 5667, 5668, - 5669, 5670, 5671, 5672, 20462, 11755, 14376, 13073, 11713, 5673, 20463, - 5674, 9309, 5675, 5676, 5677, 20461, 16063, 10042, 5678, 20459, 12277, - 9662, 5679, 5680, 20460, 14179, 12100, 14439, 5681, 5682, 5683, 5684, - 12305, 5685, 20465, 5686, 5687, 5688, 5689, 5690, 5691, 5692, 5693, 5694, - 5695, 5696, 5697, 5698, 10995, 12116, 5699, 16327, 5700, 5701, 5702, 15339, - 5703, 5704, 5705, 5706, 11905, 5707, 10374, 13828, 20464, 11181, 5708, - 14389, 11588, 13625, 5709, 14924, 5710, 5711, 5712, 5713, 5714, 5715, 5716, - 14608, 5717, 13090, 5718, 5719, 5720, 10428, 5721, 5722, 5723, 5724, 5725, - 5726, 5727, 5728, 5729, 5730, 5731, 15336, 10949, 5732, 5733, 5734, 5735, - 5736, 20466, 5737, 5738, 20467, 5739, 11147, 20468, 5740, 20491, 9241, - 10412, 5741, 5742, 5743, 5744, 5745, 5746, 5747, 5748, 5749, 5750, 5751, - 11520, 5752, 5753, 5754, 5755, 5756, 5757, 5758, 5759, 20469, 15365, 20470, - 5760, 5761, 5762, 5763, 13612, 5764, 5765, 5766, 5767, 5768, 5769, 5770, - 5771, 5772, 5773, 5774, 5775, 5776, 5777, 20474, 5778, 5779, 5780, 5781, - 20476, 5782, 11160, 5783, 11374, 5784, 5785, 5786, 5787, 5788, 5789, 5790, - 5791, 5792, 5793, 5794, 5795, 5796, 20472, 5797, 13798, 5798, 5799, 5800, - 5801, 5802, 12661, 5803, 20492, 16108, 20473, 5804, 5805, 5806, 5807, 5808, - 16328, 5809, 5810, 5811, 20475, 20471, 5812, 5813, 5814, 5815, 20477, 5816, - 20478, 5817, 5818, 13806, 5819, 5820, 5821, 5822, 5823, 5824, 14923, 5825, - 5826, 5827, 5828, 5829, 15165, 5830, 5831, 5832, 5833, 15307, 5834, 5835, - 5836, 5837, 13644, 5838, 5839, 5840, 20479, 14810, 5841, 5842, 5843, 5844, - 5845, 14041, 20483, 5846, 5847, 5848, 5849, 5850, 5851, 5852, 20482, 5853, - 5854, 5855, 9055, 5856, 5857, 5858, 5859, 5860, 5861, 20480, 5862, 20481, - 5863, 5864, 5865, 20493, 5866, 5867, 5868, 5869, 5870, 5871, 5872, 5873, - 5874, 13613, 5875, 5876, 5877, 5878, 5879, 5880, 5881, 5882, 5883, 5884, - 12294, 5885, 5886, 5887, 5888, 5889, 20485, 15359, 5890, 5891, 5892, 5893, - 5894, 5895, 5896, 5897, 5898, 5899, 20484, 5900, 5901, 5902, 5903, 15944, - 5904, 20486, 5905, 5906, 5907, 5908, 5909, 5910, 17233, 5911, 5912, 5913, - 5914, 5915, 5916, 5917, 5918, 5919, 5920, 20487, 5921, 5922, 5923, 5924, - 5925, 5926, 5927, 5928, 5929, 5930, 5931, 5932, 9227, 5933, 5934, 5935, - 5936, 5937, 5938, 5939, 5940, 5941, 5942, 5943, 5944, 5945, 5946, 5947, - 5948, 5949, 5950, 5951, 5952, 5953, 5954, 20488, 5955, 5956, 5957, 5958, - 5959, 5960, 5961, 5962, 5963, 5964, 20489, 5965, 16441, 5966, 13047, 5967, - 5968, 5969, 20263, 9039, 5970, 5971, 5972, 11769, 10569, 15500, 9079, - 10064, 5973, 16644, 5974, 14167, 5975, 18776, 5976, 5977, 5978, 5979, 5980, - 5981, 5982, 13217, 9095, 5983, 5984, 5985, 13053, 20260, 5986, 5987, 5988, - 5989, 20261, 5990, 5991, 5992, 20262, 5993, 5994, 15327, 5995, 13018, 5996, - 20127, 5997, 12843, 5998, 12846, 12111, 5999, 6000, 6001, 20128, 12858, - 6002, 14804, 6003, 6004, 6005, 6006, 20125, 20129, 6007, 6008, 13867, 6009, - 6010, 13398, 6011, 6012, 6013, 14401, 14819, 6014, 6015, 6016, 20130, - 20131, 14927, 12136, 6017, 6018, 20132, 6019, 6020, 6021, 6022, 6023, - 10196, 20133, 6024, 20134, 6025, 20135, 6026, 6027, 20136, 6028, 6029, - 6030, 6031, 6032, 6033, 6034, 6035, 6036, 6037, 6038, 6039, 20126, 6040, - 6041, 6042, 6043, 6044, 6045, 6046, 6047, 6048, 6049, 6050, 6051, 13599, - 18410, 6052, 10379, 18411, 6053, 6054, 6055, 18412, 6056, 16455, 18413, - 18414, 15719, 6057, 6058, 6059, 6060, 6061, 6062, 6063, 18416, 11956, - 18415, 10025, 6064, 6065, 6066, 9238, 6067, 6068, 6069, 6070, 18418, 18417, - 6071, 11017, 6072, 18419, 6073, 6074, 6075, 6076, 10758, 6077, 11734, 6078, - 6079, 7790, 7791, 12917, 7792, 10986, 11533, 7793, 7794, 7795, 7796, 7797, - 7798, 18420, 18422, 7799, 7800, 10197, 14948, 13973, 18421, 16143, 15767, - 18423, 18427, 18424, 7801, 7802, 18425, 12139, 7803, 18429, 18526, 12104, - 7804, 7805, 7806, 7807, 18426, 7808, 18428, 7809, 7810, 7811, 7812, 7813, - 7814, 18530, 7815, 7816, 7817, 12307, 7818, 7819, 7820, 7821, 18528, 7822, - 18533, 9499, 18527, 7823, 7824, 7825, 12680, 9439, 18532, 18531, 7826, - 7827, 18529, 18534, 7828, 7829, 18536, 7830, 7831, 7832, 15146, 16322, - 12643, 18537, 7833, 14970, 7834, 7835, 18539, 7836, 7837, 11004, 7838, - 7839, 19919, 18538, 18535, 7840, 7841, 7842, 7843, 11126, 15884, 7844, - 7845, 7846, 7847, 7848, 7849, 7850, 7851, 7852, 7853, 7854, 7855, 7856, - 18541, 7857, 7858, 18540, 7859, 19920, 7860, 7861, 7862, 7863, 18542, 7864, - 7865, 7866, 7867, 7868, 7869, 7870, 7871, 18543, 7872, 7873, 7874, 7875, - 7876, 7877, 7878, 7879, 7880, 7881, 7882, 18544, 14346, 7883, 18545, 7884, - 7885, 7980, 7981, 7982, 7983, 7984, 7985, 7986, 7987, 7988, 7989, 7990, - 7991, 18546, 7992, 7993, 7994, 7995, 7996, 15199, 7997, 7998, 12487, 7999, - 15756, 8000, 14620, 8001, 8002, 19539, 8003, 8004, 19540, 8005, 8006, 8007, - 8008, 11718, 8009, 8010, 8011, 8012, 12519, 8013, 8014, 8015, 19543, 8016, - 8017, 19542, 8018, 8019, 8020, 8021, 8022, 8023, 14605, 8024, 12656, 8025, - 8026, 19541, 11138, 14969, 8027, 12320, 19548, 8028, 8029, 8030, 19547, - 8031, 8032, 19559, 9408, 8033, 8034, 8035, 8036, 19549, 8037, 19545, 8038, - 8039, 8040, 8041, 8042, 19551, 19550, 13801, 8043, 8044, 16123, 8045, - 19544, 10364, 19546, 8046, 8047, 8048, 8049, 8050, 8051, 8052, 19553, 8053, - 8054, 8055, 8056, 19558, 8057, 16318, 8058, 8059, 8060, 8061, 19552, 8062, - 19557, 8063, 19556, 8064, 8065, 8066, 9089, 8067, 8068, 8069, 8070, 19560, - 8071, 8072, 8073, 8074, 8075, 8170, 8171, 8172, 8173, 8174, 8175, 8176, - 8177, 8178, 8179, 8180, 13477, 8181, 12102, 12142, 8182, 8183, 12335, - 19555, 8184, 8185, 8186, 8187, 19561, 14241, 8188, 8189, 8190, 8191, 8192, - 8193, 8194, 8195, 8196, 19667, 19666, 8197, 8198, 8199, 8200, 8201, 8202, - 16468, 8203, 8204, 19565, 19564, 8205, 19566, 8206, 19562, 8207, 19569, - 8208, 19568, 8209, 19567, 8210, 8211, 12308, 13452, 13108, 13050, 8212, - 8213, 8214, 8215, 8216, 13472, 8217, 8218, 8219, 8220, 19668, 8221, 8222, - 8223, 8224, 8225, 8226, 8227, 8228, 8229, 8230, 8231, 8232, 8233, 8234, - 8235, 8236, 8237, 8238, 8239, 19671, 8240, 19670, 8241, 19672, 11012, - 19563, 19669, 8242, 13665, 13785, 8243, 8244, 8245, 8246, 8247, 8248, 8249, - 8250, 8251, 8252, 8253, 8254, 8255, 19674, 8256, 8257, 10804, 8258, 8259, - 8260, 8261, 8262, 15389, 19673, 8263, 8264, 8265, 8360, 8361, 8362, 19675, - 8363, 19678, 19679, 8364, 12262, 8365, 8366, 8367, 19680, 8368, 8369, 8370, - 19681, 8371, 8372, 19677, 8373, 19685, 8374, 8375, 8376, 8377, 8378, 8379, - 8380, 8381, 8382, 8383, 8384, 19676, 8385, 19682, 8386, 8387, 8388, 8389, - 8390, 8391, 8392, 8393, 19686, 19683, 19684, 8394, 8395, 8396, 8397, 8398, - 8399, 8400, 8401, 8402, 8403, 8404, 8405, 8406, 8407, 8408, 8409, 19688, - 8410, 8411, 8412, 8413, 8414, 8415, 8416, 8417, 8418, 8419, 8420, 8421, - 8422, 8423, 8424, 8425, 8426, 8427, 8428, 8429, 8430, 8431, 8432, 19687, - 8433, 8434, 8435, 8436, 8437, 8438, 8439, 8440, 8441, 10782, 8442, 21197, - 8443, 21198, 8444, 13221, 9099, 13616, 8445, 14598, 8446, 8447, 8448, 8449, - 8450, 8451, 8452, 14770, 20062, 8453, 8454, 8455, 8550, 20063, 8551, 13236, - 9826, 8552, 8553, 8554, 8555, 8556, 8557, 8558, 20064, 8559, 8560, 8561, - 8562, 16126, 8563, 8564, 8565, 8566, 8567, 8568, 8569, 8570, 17664, 8571, - 20065, 8572, 20066, 8573, 20067, 8574, 8575, 8576, 8577, 10587, 17971, - 13860, 8578, 14425, 8579, 8580, 13865, 8581, 8582, 8583, 8584, 8585, 13866, - 8586, 8587, 15710, 14161, 8588, 10551, 21199, 9249, 8589, 19119, 14424, - 15716, 11360, 13849, 8590, 10046, 8591, 12873, 10048, 8592, 20819, 11128, - 8593, 8594, 19537, 8595, 20820, 8596, 8597, 8598, 8599, 9604, 8600, 8601, - 20823, 8602, 8603, 20822, 11566, 8604, 20821, 14748, 8605, 8606, 8607, - 8608, 13062, 8609, 8610, 8611, 8612, 12339, 17241, 20824, 15188, 8613, - 8614, 8615, 8616, 8617, 8618, 8619, 8620, 12497, 13277, 8621, 8622, 8623, - 10367, 8624, 8625, 8626, 8627, 8628, 8629, 8630, 20825, 8631, 9670, 8632, - 8633, 8634, 11206, 20826, 8635, 8636, 8637, 8638, 8639, 19535, 8640, 8641, - 8642, 20827, 8643, 8644, 11509, 8645, 8740, 8741, 8742, 21441, 8743, 8744, - 8745, 14037, 8746, 15526, 21243, 8747, 21244, 8748, 21245, 12293, 8749, - 10622, 11731, 8750, 8751, 21247, 8752, 13032, 21246, 15376, 8753, 21249, - 9069, 11569, 8754, 8755, 8756, 8757, 8758, 15548, 21248, 8759, 9800, 10427, - 21255, 21254, 13208, 21250, 21251, 9820, 8760, 8761, 21252, 16133, 8762, - 8763, 14404, 11735, 11323, 8764, 8765, 8766, 21257, 21256, 21253, 9406, - 8767, 16247, 15699, 11708, 13597, 8768, 8769, 21259, 8770, 8771, 8772, - 8773, 15382, 8774, 16289, 10984, 21258, 8775, 10192, 8776, 8777, 14555, - 8778, 8779, 13211, 8780, 8781, 8782, 12256, 21260, 21263, 8783, 21262, - 21265, 21261, 8784, 11145, 21264, 8785, 8786, 8787, 8788, 14366, 21267, - 8789, 8790, 9648, 8791, 8792, 8793, 8794, 9267, 8795, 8796, 21268, 8797, - 8798, 21269, 21271, 9850, 8799, 21266, 8800, 21272, 8801, 8802, 8803, 8804, - 21275, 8805, 21273, 8806, 8807, 8808, 21270, 8809, 8810, 8811, 8812, 21278, - 8813, 21274, 21277, 21279, 8814, 21376, 8815, 8816, 8817, 14758, 21379, - 8818, 21378, 8819, 12341, 21276, 14026, 8820, 8821, 9866, 9296, 14362, - 8822, 21381, 8823, 8824, 21382, 8825, 8826, 21387, 16101, 21384, 8827, - 8828, 13604, 8829, 8830, 8831, 21377, 8832, 21386, 21383, 21380, 8833, - 8834, 21385, 8835, 8930, 8931, 8932, 8933, 8934, 8935, 8936, 9034, 21388, - 8937, 8938, 8939, 8940, 8941, 8942, 21390, 8943, 21392, 8944, 8945, 8946, - 8947, 8948, 21391, 8949, 21389, 8950, 8951, 8952, 8953, 15297, 8954, 8955, - 8956, 8957, 8958, 8959, 8960, 21393, 8961, 8962, 8963, 21394, 8964, 8965, - 8966, 8967, 8968, 8969, 8970, 8971, 10814, 8972, 8973, 10014, 8974, 9080, - 9082, 8975, 8976, 8977, 15942, 8978, 10011, 8979, 11547, 11157, 21192, - 8980, 8981, 10607, 8982, 8983, 21193, 8984, 8985, 9033, 8986, 21194, 8987, - 8988, 14613, 8989, 8990, 21195, 8991, 8992, 8993, 8994, 8995, 8996, 8997, - 8998, 8999, 9000, 21196, 9001, 9002, 9003, 9004, 9005, 9006, 9007, 9008, - 9009, 13209, 9010, 9011, 16314, 21443, 9012, 21444, 9013, 9014, 9015, 9016, - 9017, 9018, 9019, 9020, 9021, 9022, 12718, 9023, 9024, 15734, 9025, 9120, - 16294, 13087, 9121, 15690, 9122, 15555, 9123, 9124, 20838, 9052, 16076, - 15341, 11369, 10973, 9125, 11963, 9126, 10584, 10008, 13059, 9127, 9128, - 13967, 9129, 9130, 9131, 12678, 9132, 9133, 9134, 9135, 9136, 20839, 9137, - 9138, 9139, 9140, 9141, 9142, 9143, 9144, 12856, 10167, 9145, 20691, 12639, - 9146, 16262, 9147, 9148, 9149, 14979, 20694, 9150, 9151, 13061, 9152, - 10225, 9153, 9154, 13966, 9155, 9156, 20692, 9157, 9158, 20695, 20696, - 12663, 9159, 11895, 9160, 20693, 9161, 9162, 9163, 9164, 9165, 9166, 9167, - 9168, 9169, 9170, 9171, 20699, 20697, 9172, 9173, 9174, 9175, 16125, 12698, - 9176, 20698, 9177, 9178, 9179, 20701, 9180, 16058, 15298, 9181, 9182, 9183, - 20700, 9184, 12683, 9185, 9186, 9187, 9188, 9189, 20702, 11959, 11761, - 20703, 9190, 14432, 9191, 15354, 9192, 9193, 9194, 16472, 16141, 9195, - 20707, 9196, 9197, 9198, 20706, 9199, 9200, 9201, 9202, 9203, 9204, 9205, - 9206, 20704, 20705, 9207, 9208, 9209, 9210, 9211, 9212, 9213, 9214, 20708, - 11691, 9215, 9310, 9311, 9312, 9313, 14170, 20806, 10194, 9314, 20807, - 12857, 9315, 20709, 9316, 9317, 11557, 9444, 9318, 9319, 9320, 9321, 9322, - 9323, 9324, 9325, 9326, 9327, 9328, 9329, 10200, 9330, 9331, 9332, 20810, - 16651, 20808, 20811, 9333, 9334, 9335, 12708, 9677, 9336, 9337, 9338, 9339, - 9340, 9341, 20812, 20809, 14940, 9342, 9343, 20813, 12532, 9344, 9345, - 9346, 9347, 9348, 9349, 9350, 9351, 9352, 9353, 9354, 9355, 20814, 20815, - 9356, 17776, 9357, 9358, 13224, 9359, 13433, 9360, 16330, 10016, 9361, - 14173, 9362, 9363, 9364, 20816, 9365, 9366, 14546, 9367, 20817, 9368, 9369, - 9370, 9371, 9372, 16071, 9373, 20818, 9374, 22361, 9375, 9376, 9377, 9378, - 9379, 9380, 9381, 9382, 9383, 9384, 9385, 9386, 9387, 17234, 9388, 9389, - 9390, 9391, 9392, 9393, 9394, 9395, 9396, 9788, 9397, 9398, 9399, 12647, - 21445, 9400, 9401, 9402, 9403, 9404, 13989, 15536, 9405, 16255, 9500, - 21077, 9501, 11741, 9502, 11530, 21078, 10209, 9036, 9503, 9504, 9505, - 9506, 13980, 9507, 9508, 20637, 9509, 20638, 9510, 9511, 9512, 9513, 14814, - 10370, 11958, 20639, 12520, 13791, 9514, 9515, 9516, 9517, 9518, 9519, - 20640, 9520, 9521, 13291, 11894, 9522, 9523, 9524, 20643, 13103, 9525, - 15343, 9526, 16444, 20641, 20642, 9527, 15361, 9528, 20646, 20647, 9529, - 20651, 9530, 9531, 9532, 20655, 9533, 20653, 20661, 16127, 9534, 20656, - 9535, 9536, 20654, 20645, 9537, 9538, 13088, 9539, 9540, 9541, 13243, 9542, - 9543, 13848, 15915, 20648, 20649, 20650, 20652, 9544, 12154, 9545, 9786, - 9546, 9547, 9548, 9549, 10807, 9550, 20663, 9551, 9552, 9553, 9554, 20664, - 9555, 20657, 9556, 20662, 9557, 14813, 9558, 9559, 14177, 20659, 20660, - 9560, 9561, 9562, 9563, 9564, 15000, 9565, 9566, 9567, 9568, 9569, 9570, - 9571, 9572, 9573, 9574, 9575, 9576, 20665, 12337, 15693, 20658, 13608, - 9577, 9578, 9579, 9580, 9581, 9582, 9583, 9584, 11384, 9585, 9586, 9587, - 9588, 13095, 9589, 9590, 9591, 9592, 9593, 9594, 9595, 9690, 9691, 9692, - 20669, 9693, 10054, 9694, 9695, 12466, 9038, 14228, 9696, 9697, 9229, 9698, - 20667, 9699, 9700, 9701, 14610, 10041, 9702, 20668, 20666, 20670, 9703, - 9704, 10065, 9705, 20671, 9706, 20672, 9707, 20675, 9708, 9259, 9709, 9710, - 9711, 9712, 9713, 9714, 9715, 9716, 13101, 11383, 20673, 14373, 9479, 9717, - 9718, 9719, 9720, 20674, 9721, 9722, 9723, 9724, 12900, 9725, 9726, 9822, - 9727, 9728, 9729, 9110, 9730, 9731, 9732, 20678, 12123, 9857, 9733, 9734, - 9735, 9736, 13060, 9737, 9738, 9739, 20676, 11911, 9740, 9741, 9742, 20677, - 9743, 9744, 9745, 9746, 9747, 9748, 9749, 9750, 9751, 9752, 9753, 9754, - 9755, 9756, 12830, 9757, 9758, 9759, 20679, 9760, 9761, 9762, 9763, 9764, - 20680, 9765, 20682, 9766, 9767, 12310, 9768, 9769, 11154, 9770, 9771, 9772, - 9773, 9774, 9775, 11519, 9776, 9777, 9778, 20681, 9779, 9780, 9781, 9782, - 9783, 9784, 9785, 9880, 9881, 9882, 9883, 9884, 9885, 20683, 9886, 9887, - 9888, 9889, 9890, 9891, 9892, 9893, 9894, 9895, 20685, 9896, 9897, 9898, - 9899, 9900, 20684, 9901, 9902, 9903, 9904, 9905, 9906, 9907, 9908, 9909, - 9910, 9911, 9912, 9913, 9914, 9915, 20686, 9916, 9917, 9918, 9919, 9920, - 13995, 20499, 12146, 9921, 13846, 9922, 20500, 13283, 9923, 9924, 9925, - 9926, 20501, 9927, 13282, 20502, 9928, 9929, 9930, 9931, 9932, 9933, 9934, - 9935, 9936, 20505, 9937, 9938, 16505, 20508, 9939, 9940, 20506, 20503, - 20504, 16438, 13856, 14233, 20509, 9941, 20507, 9942, 9943, 14988, 9944, - 20511, 13222, 9945, 9946, 9947, 9948, 11337, 9949, 20510, 9950, 9951, 9952, - 9953, 9954, 9955, 9956, 10002, 11201, 9957, 20512, 9958, 9959, 9960, 9961, - 9962, 16902, 11586, 9963, 9964, 12472, 20513, 9965, 9966, 9967, 9968, - 20514, 9969, 9970, 9971, 9972, 10548, 9973, 9974, 9975, 10070, 10071, - 10072, 10073, 10074, 10075, 10076, 20515, 10077, 10078, 10079, 10080, - 10081, 10082, 10083, 10084, 10085, 10086, 10087, 10088, 20516, 10089, - 10090, 10091, 10092, 10093, 10094, 10095, 10096, 10097, 10098, 10099, - 20517, 10100, 10101, 10102, 10103, 10104, 15752, 16639, 12140, 10105, - 13456, 10969, 10106, 15172, 14184, 10107, 14561, 10108, 10109, 10594, - 10110, 10111, 9307, 10112, 13474, 10113, 16299, 10114, 10115, 10116, 11913, - 12710, 10117, 10118, 21080, 10119, 10120, 12691, 10121, 10122, 10123, - 10124, 10125, 10126, 16501, 10127, 10128, 10129, 21082, 9646, 10130, 13451, - 15372, 10131, 16285, 10132, 21083, 10133, 21081, 10134, 11208, 9633, 10135, - 10136, 10137, 10138, 10139, 10140, 10141, 11548, 10142, 10143, 15523, - 10144, 11179, 10145, 10146, 14916, 10147, 21087, 21086, 10148, 10149, - 21084, 10150, 10151, 10152, 10153, 9639, 10154, 13827, 14171, 10155, 10156, - 10157, 10158, 10159, 21089, 10160, 10161, 9087, 10162, 10163, 16286, 10164, - 10165, 10260, 21088, 10261, 9672, 10262, 10263, 22378, 10264, 10265, 10266, - 10267, 10268, 10269, 10270, 10271, 10272, 10273, 10274, 10275, 10276, - 10277, 10278, 14765, 10279, 10280, 10281, 21187, 10282, 21186, 10283, - 10005, 11363, 11207, 10284, 10614, 10285, 10286, 10287, 10288, 10289, - 10290, 12859, 10291, 10292, 10293, 10294, 10295, 10296, 10297, 10298, - 10299, 10300, 21188, 10301, 10302, 10303, 10304, 10305, 14230, 10306, - 10307, 10308, 10309, 10310, 10311, 10312, 10313, 10314, 10315, 10316, - 10317, 10318, 10319, 10320, 10321, 10322, 10323, 10324, 10325, 10326, - 10327, 10328, 10329, 21191, 10330, 10331, 10332, 15303, 10333, 11716, - 13473, 21397, 21398, 11928, 10334, 10335, 10336, 10337, 9794, 21399, 14562, - 10338, 13447, 16068, 10339, 21400, 10340, 21401, 10341, 10342, 10343, - 10344, 13442, 10345, 10346, 10347, 15489, 16292, 10348, 10349, 21402, - 11544, 9801, 11714, 10350, 10351, 10352, 9845, 14774, 10353, 11938, 21404, - 10354, 10355, 10450, 10451, 11965, 21403, 10452, 21406, 10453, 10454, - 10455, 21405, 21407, 10456, 10457, 10458, 10459, 10460, 21408, 10461, - 10462, 10463, 10464, 10465, 10466, 10467, 10468, 10469, 10470, 10471, - 12349, 10472, 10473, 10474, 10475, 10476, 10477, 10478, 10479, 10480, - 10481, 10482, 12257, 10483, 10484, 10485, 10486, 10487, 10488, 10489, - 10490, 10491, 10492, 14055, 10493, 10494, 16085, 10495, 10496, 10497, - 10498, 11711, 11710, 16089, 10499, 10500, 11877, 10501, 14550, 21396, - 10502, 10503, 10504, 10505, 10506, 10507, 11558, 10508, 10208, 10509, - 10510, 10511, 10512, 10513, 10514, 10515, 10516, 10517, 16326, 21790, - 10518, 10519, 21791, 10520, 10590, 10521, 10522, 10523, 21793, 21794, - 10524, 9067, 10525, 21792, 10526, 21796, 14236, 10527, 10528, 10529, 21798, - 10530, 15111, 10531, 10532, 9257, 21795, 10533, 10534, 10535, 21802, 10536, - 10024, 10537, 10538, 21810, 10539, 21805, 10540, 10541, 10542, 21807, - 21806, 10446, 10543, 9246, 10544, 21801, 21797, 10033, 10545, 21803, 10640, - 10641, 21804, 10642, 21808, 10643, 10644, 10645, 10646, 21800, 10647, - 11372, 10648, 12348, 10649, 21809, 10650, 10651, 10652, 10653, 10654, - 10655, 21813, 10656, 21799, 10657, 10015, 10658, 11573, 21815, 10659, - 10660, 10359, 11955, 16339, 14553, 10661, 9865, 10662, 9468, 10663, 21811, - 10664, 21812, 13799, 10665, 21816, 10666, 10667, 21817, 10668, 21820, - 10669, 10670, 10671, 10672, 10673, 10674, 10675, 10676, 10677, 10678, - 10679, 21818, 10680, 10681, 21822, 21821, 10682, 10683, 21814, 10684, - 11949, 10685, 9674, 10686, 21819, 10687, 10688, 13404, 10689, 11387, 10690, - 10691, 10692, 10693, 21830, 10694, 10695, 10696, 10697, 10698, 10699, - 10700, 10766, 10701, 10702, 21823, 10703, 10704, 10705, 9418, 11209, 10706, - 14222, 10707, 10708, 10709, 10710, 21832, 21828, 10711, 10712, 10713, - 10795, 21833, 10714, 10715, 10716, 21824, 21825, 21829, 12510, 21831, - 21834, 21827, 11398, 10717, 10718, 10719, 14983, 10720, 10721, 21835, - 10722, 10723, 10724, 21826, 10725, 10726, 10727, 10728, 10729, 10730, - 10731, 10732, 21837, 10733, 10734, 10735, 10830, 16448, 13215, 10831, - 10832, 10833, 10834, 21838, 10835, 10836, 10837, 10838, 21836, 10839, - 12453, 10840, 10841, 10842, 10843, 10844, 10606, 21840, 10845, 10846, - 21839, 10847, 10848, 10849, 9844, 10850, 10851, 10852, 21841, 21842, 10853, - 10854, 10855, 21843, 10856, 10857, 10858, 12091, 10859, 10860, 12138, - 10861, 10862, 10863, 10864, 10865, 13096, 10866, 10867, 10868, 10869, - 21846, 10870, 21845, 10871, 10872, 10873, 10874, 10875, 10876, 10877, - 10878, 9841, 10879, 10880, 10881, 21849, 21844, 10882, 10883, 21847, 10884, - 10885, 10886, 10887, 10888, 10889, 21848, 10890, 10891, 10892, 10893, - 10894, 10895, 10896, 10897, 21946, 10898, 10899, 10900, 10901, 10902, - 10903, 21948, 11156, 10904, 10905, 21947, 10906, 10907, 10908, 10909, - 10910, 10911, 10912, 10913, 10914, 10915, 10916, 10917, 10918, 21949, - 10919, 10920, 10921, 10922, 10923, 10924, 9435, 21951, 21950, 10925, 11020, - 11021, 11022, 11023, 11024, 11025, 11026, 11027, 11028, 11029, 11319, - 11030, 11031, 11032, 11033, 11034, 11035, 11036, 11037, 11038, 11039, - 11040, 11041, 11042, 11043, 11044, 11045, 11046, 11047, 11048, 11049, - 11050, 11051, 11052, 11053, 11054, 11055, 11056, 11057, 11058, 11059, - 11060, 11061, 11062, 11063, 11064, 11065, 11066, 12690, 16880, 11067, - 11068, 11069, 11070, 11071, 11072, 12129, 21989, 16484, 11073, 11074, - 11075, 11076, 11077, 11078, 11079, 11080, 11081, 11082, 11083, 10414, - 11084, 11085, 11086, 11087, 11088, 11089, 11090, 21991, 12258, 11091, - 11092, 13246, 11093, 9839, 16074, 11094, 11095, 11096, 21993, 21992, 21994, - 14213, 11097, 11098, 21995, 11099, 15898, 16309, 11100, 11101, 11102, - 11103, 10419, 11104, 11105, 11106, 12279, 11107, 11108, 12282, 21996, - 11697, 11109, 11110, 11111, 11112, 11113, 9851, 11114, 11115, 21997, 21998, - 11696, 11210, 11211, 21999, 11212, 11213, 11214, 22004, 11215, 22000, - 22003, 11216, 11018, 11217, 22001, 22002, 11218, 11219, 11220, 11221, - 11222, 11223, 11224, 10611, 14384, 22005, 11225, 9463, 11226, 11227, 12686, - 11228, 11229, 15932, 11898, 11230, 11231, 11232, 11233, 11234, 11235, - 11236, 22006, 11237, 11238, 11239, 11240, 11241, 11242, 13035, 11243, - 11244, 11245, 11246, 11247, 11248, 11249, 11250, 22018, 11251, 11252, - 14936, 11253, 11254, 11255, 11256, 11257, 11258, 11259, 11260, 11261, - 11262, 11263, 11264, 11265, 11266, 14766, 11267, 11268, 11269, 11270, - 11271, 11272, 11273, 11274, 11275, 11276, 11277, 11278, 11279, 11280, - 11281, 11282, 11283, 11284, 11285, 11286, 11287, 14211, 11288, 14242, - 11289, 11290, 11291, 11292, 11579, 11293, 11294, 11295, 16482, 11296, - 11297, 11298, 12124, 11299, 11300, 11301, 11302, 11303, 11304, 11305, - 11400, 11401, 11402, 11403, 11404, 11405, 11406, 11407, 11408, 11409, - 11410, 11411, 11412, 11413, 11414, 11415, 11416, 11417, 11418, 11419, - 11420, 11421, 11422, 11423, 11424, 11425, 11426, 11427, 11428, 11429, - 11430, 11431, 11432, 11433, 11434, 11435, 11436, 11437, 11438, 11439, - 11440, 11441, 11442, 11443, 11444, 11445, 11446, 11447, 11448, 11449, - 11450, 11451, 11452, 11453, 11454, 15190, 11455, 11456, 11457, 11458, - 11459, 11460, 11461, 11462, 22019, 11463, 11464, 11465, 11466, 11467, - 11468, 11469, 11470, 11471, 11472, 11473, 11474, 11475, 11476, 11477, - 11478, 11479, 11480, 11481, 11482, 11483, 11484, 11485, 11486, 11487, - 11488, 11489, 11490, 11491, 11492, 11493, 11494, 11495, 11590, 11591, - 11592, 11593, 11594, 11595, 11596, 11597, 11598, 11599, 11600, 11601, - 11602, 22020, 11603, 11604, 11605, 11606, 11607, 11608, 11609, 22021, - 11610, 11611, 11612, 11613, 11614, 11615, 11616, 11617, 11618, 11619, - 11620, 11621, 11622, 11623, 11624, 11625, 11626, 11627, 11628, 11629, - 11630, 11631, 11632, 11633, 11634, 11635, 11636, 11637, 11638, 11639, - 11640, 11641, 11642, 11643, 11644, 11645, 11646, 11647, 11648, 11649, - 11650, 11651, 11652, 11653, 11654, 11655, 11656, 11657, 11658, 11659, - 11660, 11661, 11662, 11663, 11664, 11665, 11666, 11667, 11668, 11669, - 11670, 11671, 11672, 11673, 11674, 11675, 11676, 11677, 11678, 11679, - 11680, 11681, 11682, 11683, 11684, 11685, 11780, 11781, 11782, 11783, - 11784, 11785, 11786, 11787, 11788, 11789, 11790, 11791, 11792, 11793, - 11794, 11795, 11796, 11797, 11798, 11799, 11800, 11801, 11802, 11803, - 11804, 11805, 11806, 11807, 11808, 11809, 11810, 11811, 11812, 11813, - 11814, 11815, 11816, 11817, 11818, 11819, 11820, 11821, 11822, 11823, - 11824, 11825, 11826, 11827, 11828, 11829, 11830, 11831, 11832, 11833, - 11834, 11835, 11836, 11837, 11838, 11839, 11840, 11841, 11842, 11843, - 22582, 11844, 11845, 11846, 11847, 11848, 10372, 11849, 11850, 11851, - 11852, 11853, 22022, 11854, 11855, 11856, 11857, 11858, 11859, 11860, - 11861, 11862, 11863, 11864, 11865, 11866, 11867, 11868, 11869, 11870, - 11871, 11872, 11873, 11874, 11875, 11970, 11971, 11972, 11973, 11974, - 11975, 11976, 11977, 11978, 11979, 11980, 11981, 11982, 11983, 11984, - 11985, 11986, 11987, 11988, 11989, 11990, 11991, 11992, 11993, 11994, - 11995, 11996, 11997, 11998, 11999, 12000, 12001, 12002, 12003, 12004, - 12005, 16510, 12006, 12007, 12008, 12009, 12010, 12011, 12012, 12013, - 12014, 12015, 12016, 12017, 12018, 12019, 12020, 12021, 12022, 12023, - 12024, 12025, 12026, 12027, 12028, 12029, 22023, 12030, 12031, 12032, - 19374, 11717, 19375, 11001, 19376, 14958, 19377, 15893, 11327, 19378, - 19379, 11350, 13635, 14744, 19476, 12033, 9816, 19477, 13795, 10602, 12866, - 12034, 16496, 12503, 10410, 16274, 14763, 10391, 12035, 12036, 13021, - 19478, 14978, 19479, 19480, 19481, 12278, 16508, 13855, 14939, 16260, - 16298, 19482, 9102, 19483, 19484, 13835, 15564, 11698, 19485, 9108, 13647, - 11560, 19486, 13623, 12037, 19487, 11185, 10633, 15299, 19488, 12516, - 11773, 11537, 14554, 19489, 19490, 11763, 15174, 12038, 14226, 14393, - 11349, 19491, 11313, 15192, 19492, 12039, 15193, 19493, 19494, 9819, 19495, - 19496, 13869, 14737, 12699, 19498, 9248, 9676, 12040, 19499, 19500, 16494, - 16087, 19501, 12489, 16461, 19502, 19503, 19504, 11379, 12704, 12099, - 19505, 19506, 11314, 12041, 19507, 19508, 19497, 10213, 19509, 12042, - 19510, 19511, 11141, 10037, 12483, 9279, 19512, 15886, 19513, 10576, 19515, - 19514, 10431, 12043, 19516, 9493, 19517, 19518, 19519, 19520, 19521, 19522, - 19523, 15682, 14240, 19524, 19525, 19526, 19527, 13816, 19528, 19529, - 19530, 19531, 19532, 11536, 19533, 21785, 12044, 10600, 12045, 13602, - 12046, 12047, 12048, 12049, 12050, 12051, 12052, 21786, 12053, 21787, - 21788, 12054, 12055, 12056, 12057, 12058, 12059, 12060, 12061, 12062, - 12063, 10797, 14623, 12064, 12065, 16697, 10942, 12160, 12507, 20828, - 12161, 10358, 12162, 12163, 12164, 12165, 20830, 12166, 20829, 9078, 12167, - 12168, 12169, 12170, 12171, 20832, 16109, 16514, 12172, 12173, 12174, - 16280, 12175, 12176, 20834, 14045, 12177, 20833, 12178, 12179, 12180, - 12181, 20835, 12182, 12183, 12184, 12185, 20837, 12186, 12187, 20836, - 12188, 12189, 12190, 12191, 12192, 12193, 12194, 12195, 15377, 12196, - 13423, 12197, 12667, 12198, 12199, 12200, 12201, 12202, 10610, 12203, - 12204, 12205, 12206, 12207, 12326, 12208, 12209, 21983, 15168, 21984, - 12210, 14974, 12211, 12212, 13611, 12213, 12214, 21985, 12215, 12216, - 12217, 12218, 12219, 12220, 12221, 21986, 21987, 12222, 21988, 12223, - 12224, 12225, 12226, 12227, 16905, 10639, 12228, 12229, 19176, 15755, - 12230, 22009, 12231, 14769, 12232, 12233, 12234, 9660, 12235, 12236, 12237, - 12238, 21395, 12239, 15563, 12240, 22010, 12241, 12242, 12243, 12244, - 12245, 14987, 22011, 12246, 12247, 13439, 12248, 12249, 12250, 12251, - 12252, 12253, 10027, 9853, 22013, 12254, 12255, 12350, 22012, 22014, 12351, - 12352, 22015, 12353, 12354, 12355, 12356, 22016, 12357, 10943, 9056, 12358, - 22017, 12359, 12360, 12361, 12362, 12363, 12364, 12365, 10368, 15562, - 12366, 12367, 12368, 15496, 12112, 12369, 11903, 20238, 16118, 20085, - 12370, 12371, 12372, 12373, 21458, 10253, 14158, 12374, 12375, 12870, - 12376, 21446, 12377, 21447, 10636, 21448, 10961, 15902, 9075, 12378, 12379, - 21449, 12380, 12381, 12382, 21450, 12383, 21451, 12384, 12385, 21452, - 21453, 21454, 21456, 21455, 13068, 12386, 12387, 12388, 12389, 12390, - 12391, 21457, 12392, 10255, 12393, 21459, 15499, 17804, 14197, 12394, - 12395, 9655, 12396, 9977, 12397, 10737, 12398, 12399, 12909, 21460, 12400, - 12401, 21461, 12402, 12403, 12404, 12291, 12346, 16261, 21462, 12405, - 12406, 12407, 12408, 21463, 12409, 12265, 12410, 12411, 12412, 13229, - 12413, 11744, 12414, 12415, 12416, 12417, 12418, 12419, 12420, 12421, - 12422, 12423, 12424, 12425, 12426, 12427, 21464, 9832, 12428, 12429, 12430, - 12431, 12432, 12433, 21465, 12434, 12435, 12436, 12437, 12438, 12439, - 12440, 12441, 12442, 12443, 12444, 12445, 12540, 20633, 20632, 12541, - 12542, 14219, 15547, 12543, 14188, 16111, 12544, 13651, 12545, 12128, - 11306, 12546, 12547, 12548, 12549, 12550, 12551, 20268, 12552, 12553, - 15109, 12554, 16311, 12555, 10204, 10601, 20267, 10591, 12556, 20266, 9601, - 10776, 16256, 12557, 10439, 10397, 12558, 12559, 12560, 11376, 10385, - 20273, 12561, 20274, 9050, 11922, 12562, 20272, 15768, 12563, 20275, 12564, - 12565, 20276, 12566, 12567, 10401, 12568, 20269, 20271, 13861, 16300, - 16100, 15123, 20282, 14749, 20283, 12569, 9983, 12570, 12571, 12572, 12573, - 12574, 9234, 20285, 14350, 12575, 12576, 12577, 12578, 12579, 12580, 12581, - 13069, 20286, 12582, 20284, 13078, 20281, 13969, 20288, 9116, 12583, 12584, - 11015, 12585, 12586, 16648, 21442, 12587, 20277, 20278, 20279, 20280, - 20289, 19317, 20292, 12588, 11947, 15525, 20290, 20295, 10621, 20291, - 12589, 11521, 12590, 15161, 12591, 9048, 12592, 20296, 12885, 12593, 12594, - 12595, 12596, 16257, 12597, 12598, 12599, 9849, 12600, 12601, 12531, 11330, - 12602, 12603, 20293, 20294, 15929, 13279, 12877, 20298, 13022, 16900, - 12604, 9422, 12605, 20303, 12606, 11532, 12607, 12608, 12609, 20301, 12610, - 12611, 12612, 12613, 12614, 12615, 12616, 12617, 12618, 12619, 12620, - 12621, 12622, 20302, 12623, 12624, 10557, 12625, 14584, 20304, 12626, - 12627, 12628, 20300, 12629, 12274, 12630, 12631, 12632, 12633, 12634, - 13207, 12635, 12730, 12731, 12732, 12733, 12734, 12735, 14428, 12736, - 20305, 12737, 12081, 15509, 20306, 12738, 12739, 12740, 10560, 10558, - 12741, 20307, 13422, 14618, 12742, 12743, 12744, 20309, 20310, 12745, - 12746, 12747, 12748, 12749, 20312, 12750, 12751, 12752, 12753, 15145, - 12754, 20317, 12755, 20313, 12756, 12757, 12758, 20316, 13674, 12759, - 15387, 20311, 12760, 12761, 20308, 12762, 12763, 12764, 12765, 10570, - 14972, 12894, 20314, 20315, 14403, 14575, 9107, 12766, 20321, 12767, 12768, - 12769, 12770, 12771, 20320, 12772, 9423, 12773, 12774, 12775, 12776, 10609, - 12777, 20322, 12778, 12779, 12780, 12781, 12782, 12783, 9291, 12784, 12785, - 14382, 12829, 14920, 12786, 12787, 12788, 12789, 12790, 20324, 12791, - 12792, 20427, 12793, 13097, 12794, 20325, 12795, 12796, 12797, 12798, - 12799, 12800, 12801, 12802, 13812, 12803, 12804, 12805, 12806, 12807, - 12808, 18588, 20329, 12809, 12810, 12811, 12812, 14581, 20426, 9274, 15698, - 12813, 12814, 15545, 12815, 12816, 12817, 20328, 12818, 20326, 12819, - 12820, 12821, 12822, 12823, 12824, 12825, 12920, 12921, 12922, 12923, - 12924, 12925, 12926, 12927, 12928, 12929, 12930, 12931, 12932, 12933, - 12934, 9623, 12935, 12936, 12937, 20061, 12938, 12939, 16487, 12940, 21956, - 9679, 12941, 12942, 12943, 12944, 12945, 16278, 16279, 12946, 12947, 12948, - 12949, 12950, 12951, 16128, 11727, 12952, 21952, 12953, 15493, 21953, - 21954, 12954, 21955, 11728, 15738, 12955, 12956, 12957, 12958, 12959, - 13839, 13840, 12960, 12961, 21789, 12962, 14035, 12963, 14427, 12964, - 12965, 12966, 12967, 12968, 12969, 18547, 14175, 12970, 14797, 16304, - 12971, 21958, 21959, 21960, 12972, 12973, 12974, 12975, 21963, 12976, - 10954, 21964, 9092, 21961, 12977, 21962, 11497, 9458, 12978, 21967, 21968, - 10235, 9421, 14962, 21965, 9797, 12979, 21966, 12980, 12981, 21969, 12982, - 12983, 12984, 12985, 12986, 21970, 12987, 12988, 14542, 12989, 21971, - 12990, 21972, 12991, 12992, 12993, 21973, 12994, 12995, 12996, 12997, - 12998, 12999, 13000, 13001, 14205, 13002, 21974, 13003, 13004, 13005, - 13006, 21975, 13007, 13008, 13009, 13010, 13011, 13012, 13013, 13014, - 21976, 13015, 13110, 13111, 13112, 13113, 22007, 12283, 11377, 13114, - 13786, 15357, 19180, 13115, 13116, 13117, 13118, 17404, 15538, 13119, - 13120, 17405, 9037, 17406, 13121, 13122, 11553, 13123, 17410, 13124, 13125, - 13126, 16659, 13127, 17408, 15758, 13128, 13829, 17411, 17407, 13129, - 17412, 12637, 13130, 13131, 13132, 13133, 17413, 17422, 17414, 13134, - 13135, 14788, 16250, 13136, 17432, 13137, 17430, 13138, 13139, 17435, - 11565, 12456, 13140, 17409, 17428, 17431, 17415, 10405, 9062, 17424, 15135, - 17418, 11123, 13141, 10383, 17429, 13142, 13143, 17423, 17416, 13454, - 13144, 13145, 13146, 15326, 17417, 13147, 13148, 17427, 13149, 13150, - 17433, 13151, 13152, 14738, 17419, 13153, 17420, 17425, 17426, 9457, 17434, - 14208, 13154, 15888, 17444, 17448, 14351, 17455, 13155, 12706, 17445, - 13156, 13157, 11908, 17442, 13158, 9115, 10757, 17454, 17436, 13159, 17421, - 17439, 13669, 11939, 13160, 13161, 13162, 13163, 13802, 13164, 13165, - 13166, 9244, 13167, 15677, 13168, 13169, 17443, 13170, 13171, 17438, 13172, - 13232, 13173, 17447, 13174, 13175, 13176, 13177, 13178, 16469, 12650, - 10377, 13444, 12644, 17451, 17441, 17460, 17437, 13179, 13180, 17446, - 13181, 11690, 17440, 13182, 17449, 13183, 13184, 17452, 17453, 13185, - 17473, 13186, 13187, 17450, 17577, 17456, 13188, 13189, 13190, 13191, - 13192, 13193, 13194, 13195, 13196, 13197, 11380, 9821, 13198, 13199, 12638, - 9476, 17475, 13200, 17467, 13201, 17464, 13202, 17477, 17463, 15565, 9477, - 13203, 13640, 13652, 17476, 13204, 17462, 13205, 13300, 13301, 17472, - 13302, 13303, 17470, 13304, 13305, 11688, 17469, 13306, 9466, 13307, 13308, - 13309, 13310, 13311, 17468, 11391, 17457, 11151, 13312, 12148, 13313, - 13314, 13315, 13316, 13317, 11357, 17458, 17459, 13318, 17466, 17471, - 17474, 9995, 13319, 13642, 11186, 17479, 17478, 15686, 17576, 17578, 17580, - 15566, 17579, 17581, 17582, 15494, 13320, 13321, 13322, 13323, 13324, - 13325, 13326, 10966, 17584, 13327, 13328, 17597, 17592, 17595, 13329, - 13330, 13331, 13332, 13333, 13334, 13335, 17591, 13251, 13336, 13337, - 12147, 13338, 13339, 13340, 13341, 13790, 13342, 13343, 13344, 17461, - 17589, 13345, 13346, 13347, 13348, 17598, 13349, 13350, 17465, 17590, - 13351, 17599, 13352, 17587, 13353, 13354, 13355, 13356, 13357, 13358, - 13359, 17600, 17594, 17588, 12835, 13360, 13361, 13362, 13363, 17583, - 12084, 12266, 17585, 17586, 13364, 17593, 11196, 17596, 15683, 17601, - 13365, 17602, 12642, 13366, 13367, 17625, 17603, 13368, 13369, 13370, - 17624, 13371, 10764, 13372, 13373, 11738, 13374, 11775, 13375, 13376, - 10967, 13377, 13378, 13379, 13380, 17617, 13381, 17612, 13382, 17606, - 13383, 13384, 13385, 9448, 17610, 13386, 17618, 9409, 17628, 13387, 13388, - 13389, 17605, 13390, 13391, 13392, 13253, 17623, 13393, 13394, 13395, - 13490, 13491, 17627, 12321, 10393, 13492, 13493, 13494, 13495, 13496, - 17621, 17622, 13497, 13498, 13499, 17611, 13500, 13501, 13502, 17604, - 13503, 17620, 14394, 13504, 17616, 13505, 13506, 13507, 13508, 17609, - 12675, 13233, 14739, 17619, 13509, 17615, 13510, 13511, 13512, 13513, - 13514, 13515, 17608, 13516, 13517, 13518, 17613, 12505, 13519, 13520, - 13521, 13522, 13523, 13524, 15684, 15685, 17626, 14999, 13673, 13525, - 13526, 13527, 13528, 13529, 13530, 13531, 13532, 17645, 13533, 13534, - 13535, 13536, 13537, 13538, 17614, 13539, 13540, 13541, 17639, 12513, - 13542, 13543, 13544, 13545, 13546, 13547, 13548, 13549, 17640, 13550, - 13551, 13552, 13553, 13554, 13555, 13556, 13557, 13558, 13559, 17630, - 13560, 13561, 13562, 13563, 13564, 16333, 13565, 17632, 17631, 10625, - 17629, 13566, 13567, 13568, 13569, 13252, 13570, 10178, 13571, 13572, - 13573, 13574, 13575, 17641, 13576, 11014, 15930, 17646, 13577, 13578, - 13579, 9833, 13580, 17633, 13581, 11966, 17642, 13582, 17638, 13583, 17636, - 13584, 13585, 13680, 13681, 13682, 13683, 13684, 10032, 13685, 13686, - 13687, 13688, 17634, 17635, 17637, 13689, 11510, 17643, 13690, 17644, - 13691, 13692, 13693, 13694, 13695, 13696, 13697, 13698, 17660, 13699, - 12676, 13700, 13701, 14221, 13702, 13703, 13704, 13705, 17657, 13706, - 13707, 13708, 13709, 13710, 13711, 13712, 13713, 13714, 13715, 13716, - 13717, 13718, 16690, 13719, 13720, 13254, 13721, 17659, 13722, 13723, - 13724, 16139, 17658, 17655, 13725, 13726, 17651, 13727, 17654, 13728, - 17647, 13729, 13730, 15183, 13731, 13732, 13733, 13734, 13641, 17653, - 13735, 13736, 17648, 13737, 13738, 17649, 14237, 13739, 17652, 13740, - 13741, 9260, 13742, 13743, 13744, 13745, 13746, 13747, 12087, 13748, 11332, - 17656, 13749, 13750, 17662, 13751, 17661, 17650, 13752, 13753, 13754, - 13755, 13756, 13093, 13757, 13758, 13759, 17666, 13760, 13761, 13762, - 13763, 13764, 13765, 13766, 13767, 13768, 13769, 13770, 17769, 13771, - 13772, 17768, 13773, 13774, 13775, 13870, 13871, 13872, 13873, 13874, - 13875, 13876, 13877, 13878, 17663, 13879, 13880, 13881, 13882, 12714, - 13883, 12536, 13884, 13885, 13886, 16120, 13887, 13888, 14746, 13889, - 13890, 13891, 13892, 17668, 13893, 9449, 13894, 13895, 13896, 13897, 13898, - 13899, 13900, 13901, 13902, 12897, 14028, 13903, 13904, 13905, 13906, - 13907, 13908, 13909, 13910, 13911, 13912, 13425, 17665, 17667, 17669, - 17767, 9035, 9261, 13913, 13914, 13915, 13916, 13917, 17777, 13918, 13919, - 13920, 13921, 17771, 11517, 13664, 13922, 13923, 13924, 13925, 13926, - 13927, 13928, 13929, 13930, 13931, 13932, 17766, 13933, 13934, 17770, - 13935, 13936, 13937, 13938, 17774, 13939, 13940, 13941, 13942, 13943, - 17773, 13944, 13945, 13946, 17772, 13947, 13948, 13949, 13950, 13951, - 13952, 13953, 13954, 13955, 17778, 13956, 15909, 13957, 13958, 13959, - 13960, 17784, 17775, 17779, 13961, 13962, 12122, 13963, 13964, 13965, - 14060, 14061, 9216, 17787, 14062, 17782, 14063, 14064, 14065, 14066, 14067, - 14068, 14069, 17783, 14070, 14071, 14072, 14073, 14074, 14075, 14076, - 14077, 14078, 14079, 14080, 15301, 17786, 14081, 14082, 14083, 14084, - 14085, 14086, 14087, 17780, 14088, 14089, 14090, 17781, 14091, 15134, - 14092, 14093, 14094, 17785, 14042, 17790, 14095, 14096, 14097, 14098, - 14099, 14100, 17789, 14101, 17788, 14102, 14103, 14104, 14105, 14106, - 14107, 14108, 17792, 14109, 14110, 14111, 14112, 14113, 14114, 14115, - 11564, 14116, 14117, 14118, 14119, 14120, 9461, 12709, 14121, 14122, 17791, - 14123, 13041, 14124, 14125, 14126, 14127, 14128, 14129, 17793, 14130, - 14131, 14132, 14133, 14134, 14135, 14136, 14402, 14137, 14138, 14139, - 14140, 10365, 14141, 14142, 14143, 14144, 14145, 14146, 14147, 14148, - 14149, 14150, 14151, 14152, 14153, 14154, 14155, 14250, 14251, 15934, - 14252, 14253, 14254, 17794, 14255, 14256, 14257, 14258, 14259, 17796, - 14260, 14261, 14262, 14263, 14264, 14265, 14266, 14267, 14268, 14269, - 14270, 12827, 14271, 14272, 14273, 14274, 17798, 14275, 14276, 14277, - 14278, 14279, 14280, 14281, 14282, 14283, 14284, 14285, 14286, 14287, - 14288, 14289, 14290, 17795, 14291, 17797, 14292, 14293, 14294, 14295, - 14296, 14297, 14298, 14299, 14300, 14301, 14302, 14303, 14304, 14305, - 16081, 14306, 14307, 14308, 17799, 14309, 14310, 14311, 14312, 14313, - 14314, 14315, 14316, 14317, 14318, 14319, 14320, 14321, 14322, 14323, - 14324, 21579, 11117, 12463, 13031, 12484, 14325, 14326, 21580, 14327, - 14328, 14329, 14330, 14331, 15178, 14332, 14333, 14334, 15736, 14335, - 14336, 14337, 20264, 14338, 14339, 14340, 14341, 14342, 14343, 14344, - 14345, 9665, 21581, 14440, 21582, 14441, 14442, 13978, 14443, 14444, 14445, - 14446, 14447, 14448, 14449, 10996, 21584, 21586, 21585, 14223, 14941, - 21583, 13985, 15532, 12521, 14450, 14451, 14452, 14453, 14454, 14455, - 14456, 14760, 21589, 9111, 21588, 14457, 14458, 14459, 14460, 14461, 21595, - 14462, 9452, 14463, 14464, 14465, 14466, 14467, 14468, 15328, 21591, 14469, - 14470, 14471, 14472, 14473, 21593, 15938, 14474, 14475, 21592, 21587, - 21596, 21594, 14476, 21590, 14477, 14478, 21604, 21601, 21603, 14479, - 14480, 21607, 21599, 21597, 14481, 14482, 14483, 21602, 14484, 14485, - 14486, 14487, 14488, 16336, 14489, 14490, 14491, 21598, 14492, 13484, - 13838, 14493, 21605, 10773, 9991, 14494, 14495, 21600, 21606, 21613, 21619, - 14496, 14497, 11170, 14498, 14499, 14500, 21618, 14595, 14501, 16320, - 14502, 14503, 21615, 21617, 14504, 14505, 14506, 14507, 10627, 14508, - 14509, 14510, 14511, 21608, 14512, 14513, 14514, 21611, 12534, 14515, - 16116, 21609, 21610, 21612, 21616, 14516, 14517, 14518, 21622, 15703, - 14519, 14520, 14521, 14522, 10239, 14523, 14046, 14524, 10423, 21620, - 14525, 14526, 14527, 21621, 21623, 21626, 21624, 14528, 14529, 21625, - 14530, 14531, 14532, 14533, 15344, 21614, 14534, 14576, 14535, 14772, - 16254, 14630, 21632, 14631, 12694, 14632, 21629, 14633, 14634, 12080, - 21641, 21627, 14635, 21630, 14636, 14637, 14638, 21637, 14639, 14640, - 14641, 14642, 21631, 14643, 14644, 21636, 14645, 14646, 21635, 14647, - 14648, 21638, 14649, 14650, 14651, 21628, 14652, 14653, 21633, 21639, - 14654, 14655, 14656, 14657, 14658, 14659, 14660, 15687, 21634, 9490, 14661, - 14662, 21647, 14663, 15116, 14664, 14665, 14666, 14667, 21650, 14668, - 14669, 14670, 11155, 14671, 21654, 14672, 14673, 14674, 14675, 14676, - 14677, 21645, 14678, 14679, 21651, 21653, 21655, 14680, 14681, 14682, - 14683, 14684, 14685, 14686, 14687, 21648, 14688, 21646, 14689, 14690, - 14691, 11016, 14692, 10066, 14693, 14694, 14695, 14696, 21644, 21652, - 21642, 21643, 14697, 14698, 14699, 21640, 21761, 14700, 21758, 14701, - 14702, 21757, 14703, 14704, 21649, 14705, 13643, 14706, 14707, 14708, - 14709, 14710, 21656, 14711, 14712, 14713, 21760, 14714, 14715, 14716, - 14717, 14718, 14719, 14720, 12723, 14721, 14722, 14723, 14724, 14725, - 14820, 14821, 14822, 21658, 14823, 14824, 21762, 21764, 21759, 14825, - 21657, 14826, 14827, 14828, 21766, 14829, 21765, 14830, 14831, 14832, - 14833, 12506, 14834, 14835, 21769, 14836, 14837, 21771, 14838, 14839, - 14840, 14841, 14842, 21756, 14843, 14844, 14845, 21772, 21767, 14846, - 14847, 14848, 14849, 14850, 21770, 21659, 21768, 14851, 14852, 14853, - 14854, 14855, 14856, 14857, 21773, 14858, 14859, 14860, 14861, 21775, - 14862, 14863, 14864, 14865, 21763, 14866, 14867, 14868, 14869, 21774, - 14870, 14871, 14872, 21776, 14873, 14874, 14875, 14876, 14877, 14878, - 14879, 14880, 14881, 14882, 15128, 14883, 14884, 14885, 14886, 21779, - 14887, 14888, 14889, 14890, 16904, 14891, 14892, 14893, 14894, 14895, - 14896, 21780, 14897, 14898, 14899, 14900, 14901, 14902, 14903, 14904, - 21778, 14905, 13653, 21777, 14906, 14907, 14908, 14909, 21781, 14910, - 14911, 14912, 14913, 14914, 21782, 9817, 14915, 15010, 15011, 15012, 15013, - 15014, 15015, 15016, 15017, 15018, 15019, 15020, 15021, 15022, 15023, - 20840, 15024, 15025, 15026, 15027, 15028, 15029, 21783, 15030, 15031, - 21784, 15032, 15033, 15034, 15305, 15035, 15036, 15037, 21957, 15143, - 15038, 15039, 15040, 15041, 15042, 15043, 15153, 15355, 15044, 15045, - 15046, 15047, 15048, 15049, 14961, 15050, 15051, 11549, 15052, 15330, - 15053, 15054, 15055, 15056, 15057, 15058, 15059, 10991, 18408, 15519, - 21409, 9430, 15060, 15061, 9292, 21410, 15062, 13807, 9631, 15063, 16897, - 15064, 14160, 15065, 21411, 15066, 15067, 15068, 15069, 16297, 15070, - 15071, 15072, 15073, 15074, 21412, 21977, 21413, 15075, 15877, 21414, - 15076, 9057, 21978, 15077, 15078, 21979, 15079, 15080, 9877, 15081, 13074, - 15082, 15083, 15084, 15085, 14372, 15086, 15087, 15088, 15173, 15089, - 15090, 15091, 15092, 15093, 14599, 15094, 15095, 15096, 15097, 15098, - 21415, 15099, 16898, 15100, 15101, 15102, 15103, 15104, 15105, 9242, 15200, - 14929, 15201, 15202, 15203, 10549, 15204, 15205, 15206, 15207, 15208, - 21417, 15209, 15210, 15211, 15212, 21418, 15213, 15214, 15215, 15216, 9440, - 12304, 15217, 15218, 16451, 21416, 15219, 15220, 21419, 15221, 15222, - 15223, 15224, 21421, 15225, 15226, 15227, 16901, 15228, 15550, 15868, - 15229, 15230, 21980, 13610, 15231, 15232, 15233, 15234, 15235, 21981, - 15236, 15237, 21420, 21422, 11942, 21423, 15238, 15239, 21427, 15240, - 15241, 15242, 15243, 15244, 15245, 15246, 21429, 21424, 15247, 13824, - 13080, 15248, 15249, 15250, 12512, 10827, 15251, 15252, 21426, 15253, - 21428, 15254, 15255, 15256, 10786, 15257, 15258, 15259, 15260, 15261, - 15262, 15263, 21434, 15264, 15265, 15266, 15267, 15268, 10979, 15269, 9118, - 21432, 15270, 15271, 15272, 15273, 15274, 21431, 21425, 21433, 15275, - 15276, 15277, 15278, 15279, 21430, 15280, 15281, 15282, 13661, 15283, - 15284, 15285, 15286, 14577, 21436, 15287, 15288, 15289, 15290, 19124, - 15291, 15292, 15293, 21435, 15294, 21437, 15295, 15390, 15391, 15392, - 15393, 15394, 15395, 15396, 15397, 15398, 21438, 15399, 15400, 14984, - 15401, 15402, 15403, 15404, 15405, 15406, 15407, 15408, 15409, 15410, - 15411, 15412, 15413, 15414, 15415, 15416, 15417, 15418, 15419, 15420, - 15421, 15422, 15423, 15424, 15425, 21982, 11578, 15426, 15427, 15428, - 15429, 15430, 15431, 21439, 15432, 15433, 15434, 15435, 15436, 15437, - 15438, 15439, 15440, 15441, 15442, 15443, 15444, 15445, 15446, 15447, - 15448, 15449, 15450, 15451, 21440, 15452, 15453, 15454, 14812, 15455, - 15495, 15456, 21466, 15457, 15458, 10563, 15459, 15460, 15461, 15462, - 15463, 15464, 15465, 15466, 15467, 15468, 15469, 15470, 15471, 15472, - 15473, 15474, 15475, 15476, 15477, 15478, 15479, 15480, 15481, 15482, - 15483, 15484, 15485, 15580, 15581, 15582, 15583, 15584, 15585, 15586, - 15587, 15588, 15589, 15590, 15591, 15592, 15593, 15594, 15595, 15596, - 15597, 15598, 15599, 15600, 15601, 15602, 15603, 15604, 15605, 15606, - 15607, 15608, 15609, 15610, 11396, 10794, 15611, 10805, 12692, 14016, - 20117, 12097, 11770, 20118, 20119, 20120, 15612, 20121, 20122, 20123, - 20124, 11534, 15613, 15614, 15615, 22226, 15616, 15617, 15618, 22228, - 15619, 22229, 15620, 22227, 15621, 15622, 15623, 15624, 11561, 15625, - 22326, 9790, 15626, 15627, 15628, 15629, 22327, 15630, 15631, 15632, 22328, - 15633, 15634, 15635, 20443, 15636, 15637, 15638, 15639, 15640, 15641, - 15642, 15643, 15644, 15645, 15646, 15647, 15347, 15648, 15649, 15650, - 15651, 15652, 15653, 16889, 15654, 15655, 15656, 15657, 15658, 15659, - 15660, 15661, 15662, 15663, 15664, 15665, 15666, 15667, 15668, 15669, - 15670, 15671, 15672, 15673, 15674, 15675, 15770, 15771, 15772, 15773, - 15774, 15775, 15776, 15777, 15778, 15779, 15780, 15781, 15782, 15783, - 15784, 15785, 15786, 15787, 15788, 15789, 15790, 15791, 15792, 15793, - 15794, 15795, 15796, 15797, 15798, 15799, 15800, 15801, 22329, 15802, - 15803, 15804, 15805, 15806, 15807, 15808, 15809, 15810, 20831, 15811, - 15812, 15813, 15814, 15815, 15816, 15817, 15818, 15819, 15820, 15821, - 15822, 15823, 15824, 15825, 15826, 15827, 15828, 15829, 15830, 15831, - 15832, 15833, 15834, 15835, 15836, 15837, 15838, 15839, 15840, 15841, - 15842, 15843, 15844, 15845, 15846, 15847, 15848, 15849, 15850, 15851, - 15852, 15853, 15854, 15855, 15856, 15857, 15858, 16073, 15859, 15860, - 15861, 15862, 15863, 15864, 15865, 15960, 15961, 15962, 15963, 15964, - 15965, 15966, 15967, 15769, 14405, 15968, 15969, 15970, 15971, 15972, - 15973, 15974, 15975, 14001, 15976, 15977, 15978, 15979, 15980, 15981, - 15982, 15983, 15984, 15985, 15986, 15987, 15988, 15989, 15990, 15991, - 15992, 15993, 15994, 15995, 15996, 15997, 15998, 15999, 16000, 16001, - 16002, 16003, 16004, 16005, 16006, 16007, 16008, 16009, 16010, 16011, - 16012, 16013, 16014, 16015, 16016, 16017, 16018, 16019, 16020, 16021, - 16022, 16023, 16024, 16025, 16026, 16027, 16028, 16029, 16030, 16031, - 16032, 16033, 16034, 16035, 16036, 16037, 16038, 16039, 16040, 16041, - 16042, 16043, 16044, 16045, 16046, 16047, 16048, 16049, 16050, 16051, - 16052, 16053, 16054, 16055, 16150, 16151, 16152, 16153, 16154, 16155, - 16156, 16157, 16158, 16159, 16160, 16161, 16162, 16163, 16164, 16165, - 16166, 16167, 16168, 16169, 16170, 16171, 16172, 16173, 16174, 16175, - 16176, 16177, 16178, 16179, 16180, 16181, 16182, 16183, 16184, 19127, - 16185, 16186, 16187, 16188, 16189, 16190, 16191, 16192, 16193, 16194, - 16195, 16196, 16197, 16198, 16199, 16200, 16201, 16202, 16203, 16204, - 16205, 16206, 16207, 16208, 16209, 16210, 16211, 16212, 16213, 16214, - 22330, 16215, 16216, 16217, 16218, 16219, 16220, 16221, 16222, 16223, - 16224, 16225, 16226, 16227, 16228, 16229, 16230, 16231, 16232, 16233, - 16234, 16235, 16236, 16237, 16238, 16239, 16240, 16241, 16242, 16243, - 16244, 16245, 16340, 16341, 16342, 16343, 16344, 16345, 16346, 16347, - 16348, 16349, 16350, 16351, 16352, 16353, 16354, 16355, 16356, 16357, - 16358, 16359, 16360, 16361, 16362, 16363, 16364, 16365, 16366, 16367, - 16368, 16369, 16370, 16371, 11700, 16372, 16373, 16374, 16375, 16376, - 13214, 16377, 16378, 16379, 16380, 16381, 16382, 16383, 16384, 16385, - 16386, 16387, 16388, 16389, 16390, 16391, 16392, 16393, 16394, 16395, - 16396, 16397, 16398, 16399, 16400, 16401, 16402, 16403, 16404, 16405, - 16406, 16407, 16408, 16409, 16410, 16411, 16412, 16413, 16414, 16415, - 16416, 16417, 16418, 16419, 16420, 16421, 16422, 16423, 16424, 16425, - 16426, 16427, 17010, 11343, 10174, 10573, 13632, 11310, 17011, 17012, - 14399, 13620, 17013, 13298, 16428, 15316, 15558, 15317, 11344, 16429, - 11513, 11183, 17014, 17015, 15335, 17016, 15182, 10244, 12504, 16430, - 14202, 10432, 13847, 10390, 11772, 16249, 17017, 17018, 13237, 16506, - 13987, 16431, 16064, 14218, 16134, 17019, 16308, 9827, 17021, 17020, 16432, - 15560, 17022, 17023, 17024, 14017, 17025, 13976, 17026, 17027, 9642, 16324, - 17028, 11131, 9989, 17029, 17030, 10813, 15310, 15557, 17031, 10580, 14989, - 9484, 17032, 17033, 16433, 11570, 14785, 15754, 17034, 14808, 17035, 15728, - 11184, 17036, 14176, 14203, 17037, 13470, 16323, 17038, 13036, 10198, - 17039, 10399, 11921, 17040, 17041, 14168, 17042, 10062, 17043, 12289, - 16462, 17044, 14369, 16434, 15559, 12842, 17045, 10068, 11164, 17046, - 15124, 17047, 17048, 14754, 17049, 17050, 17051, 9492, 17054, 17052, 15367, - 17053, 12688, 17055, 16435, 17056, 17057, 17058, 15132, 15490, 9114, 17059, - 13406, 17060, 11582, 12636, 17061, 17062, 12728, 14368, 17063, 17064, - 12095, 13260, 17065, 17066, 13415, 17067, 17068, 10775, 16530, 16531, - 16532, 16533, 16534, 16535, 16536, 16537, 16538, 11192, 16539, 16540, - 16541, 16542, 10190, 22033, 16543, 22034, 16544, 16545, 14602, 16546, - 16547, 16548, 16549, 16550, 16551, 16552, 16553, 22160, 16554, 16555, - 16556, 16557, 20299, 16558, 16559, 16560, 16561, 16562, 16563, 14998, - 11146, 16564, 16565, 16566, 16567, 16568, 16569, 16570, 10957, 15870, - 16571, 16572, 16573, 16574, 16575, 16576, 16577, 18392, 16578, 16579, - 16580, 16581, 22219, 9225, 9487, 16582, 16583, 16584, 16585, 16586, 16587, - 16588, 22220, 16589, 16590, 22222, 16591, 16592, 16593, 10974, 22221, - 16594, 12653, 16595, 16596, 16597, 16598, 16599, 16600, 16601, 22224, - 16602, 16603, 16604, 22223, 16605, 16606, 16607, 16608, 16609, 16610, - 16611, 16612, 16613, 16614, 16615, 16616, 16617, 16618, 16619, 16620, - 16621, 16622, 16623, 16624, 16625, 16720, 16721, 16722, 16723, 16724, - 16725, 16726, 16727, 16728, 16729, 16730, 16731, 16732, 16733, 16734, - 16735, 16736, 16737, 16738, 16739, 16740, 16741, 16742, 16743, 16744, - 16745, 16746, 16747, 16748, 16749, 16750, 16751, 16752, 16753, 16754, - 16755, 16756, 16757, 16758, 16759, 16760, 16761, 16762, 16763, 16764, - 16765, 16766, 16767, 16768, 16769, 16770, 16771, 16772, 16773, 16774, - 16775, 16776, 16777, 16778, 16779, 16780, 16781, 16782, 16783, 16784, - 16785, 16786, 16787, 16788, 16789, 16790, 16791, 16792, 16793, 16794, - 16795, 16796, 16797, 16798, 16799, 16800, 16801, 16802, 16803, 16804, - 16805, 16806, 16807, 16808, 16809, 16810, 16811, 16812, 16813, 16814, - 16815, 16910, 16911, 16912, 16913, 16914, 16915, 16916, 16917, 16918, - 16919, 16920, 16921, 16922, 16923, 16924, 9235, 16129, 10571, 16925, 10752, - 9443, 15945, 14960, 9085, 16098, 11200, 16287, 10378, 14361, 13227, 9280, - 10761, 16337, 10800, 10356, 11395, 20103, 20104, 14434, 10818, 20105, 9876, - 12654, 10404, 10981, 20106, 15949, 20107, 11359, 11178, 20108, 12317, - 12469, 15928, 16477, 20109, 20110, 20113, 20111, 20112, 13837, 10564, - 10201, 20114, 14039, 13820, 9830, 16926, 16927, 18582, 13081, 20115, 12086, - 16928, 16459, 20116, 16447, 13677, 16676, 16670, 15927, 16929, 15954, - 13811, 15689, 10596, 9659, 16930, 13841, 22031, 16931, 16932, 16933, 10978, - 16934, 22032, 16935, 16936, 16498, 16937, 16938, 22026, 10561, 16107, - 10592, 13285, 16939, 16940, 16941, 16942, 16943, 16944, 16945, 16946, - 16947, 9630, 16948, 16949, 22027, 9607, 16950, 16951, 16952, 16953, 15894, - 13482, 16954, 16955, 16956, 16957, 16958, 22029, 16959, 16960, 22028, - 16961, 16962, 16963, 16964, 16965, 16966, 16967, 16968, 16969, 16970, - 14388, 16971, 16972, 16973, 13589, 16974, 16975, 16976, 16977, 16978, - 16979, 16980, 16981, 16982, 16983, 16984, 16985, 16986, 22030, 16987, - 16502, 13046, 22167, 16988, 16989, 22162, 16990, 22170, 16991, 22169, - 16992, 16271, 22168, 16993, 16994, 16995, 15895, 22171, 16996, 22179, - 16997, 16998, 16999, 17000, 9072, 10063, 17001, 22176, 22177, 17002, 13075, - 17003, 17004, 17005, 17100, 22172, 22173, 17101, 17102, 22174, 22178, - 17103, 11749, 22175, 10635, 17104, 17105, 17106, 22183, 22186, 17107, - 17108, 17109, 11946, 17110, 10817, 22163, 22180, 17111, 17112, 12468, - 17113, 17114, 17115, 14433, 17116, 11394, 17117, 22181, 22182, 22184, - 10234, 22185, 17118, 22188, 17119, 17120, 17121, 17122, 17123, 17124, - 17125, 22164, 17126, 17127, 17128, 22187, 15702, 17129, 9671, 17130, 17131, - 14349, 17132, 17133, 17134, 17135, 22189, 17136, 17137, 17138, 17139, - 17140, 17141, 17142, 17143, 22190, 11750, 22191, 17144, 17145, 14408, - 22194, 17146, 17147, 17148, 17149, 17150, 9445, 16492, 17151, 22192, 17152, - 22193, 22195, 17153, 22201, 17154, 17155, 17156, 22199, 17157, 17158, - 17159, 22198, 22196, 17160, 17161, 22200, 17162, 17163, 22197, 22203, - 22204, 17164, 14412, 17165, 17166, 19126, 9999, 22202, 22207, 14348, 17167, - 17168, 17169, 17170, 17171, 22205, 22206, 17172, 17173, 17174, 17175, - 17176, 17177, 22165, 17178, 17179, 17180, 17181, 17182, 17183, 17184, - 17185, 17186, 17187, 17188, 17189, 9251, 17190, 17191, 22166, 17192, 17193, - 10012, 9473, 17194, 22211, 22208, 17195, 10220, 17290, 22212, 17291, 22209, - 17292, 17293, 17294, 17295, 17296, 22210, 17297, 17298, 9843, 17299, 15939, - 17300, 17301, 17302, 22213, 17303, 9684, 17304, 17305, 17306, 17307, 17308, - 17309, 17310, 22214, 22216, 17311, 17312, 17313, 22215, 17314, 17315, - 17316, 17317, 17318, 17319, 17320, 22217, 17321, 22218, 17322, 17323, - 17324, 17325, 17326, 17327, 17328, 17329, 17330, 17331, 17332, 17333, - 13852, 10745, 17334, 17335, 13486, 17336, 17337, 10232, 17338, 17339, - 17340, 17341, 17342, 17343, 17344, 14386, 17345, 17346, 17347, 17348, - 17349, 17350, 17351, 17352, 17353, 17354, 17355, 17356, 17357, 17358, - 17359, 17360, 17361, 17362, 17363, 20051, 17364, 17365, 17366, 17367, - 17368, 17369, 17370, 17371, 17372, 17373, 17374, 17375, 17376, 17377, - 17378, 17379, 17380, 17381, 17382, 17383, 17384, 17385, 17480, 17481, - 17482, 17483, 17484, 17485, 17486, 17487, 17488, 17489, 17490, 17491, - 17492, 17493, 17494, 17495, 17496, 17497, 17498, 17499, 17500, 17501, - 17502, 17503, 17504, 17505, 17506, 17507, 17508, 17509, 17510, 17511, - 17512, 17513, 17514, 17515, 17516, 17517, 17518, 17519, 17520, 17521, - 17522, 17523, 17524, 17525, 17526, 17527, 17528, 17529, 17530, 17531, - 17532, 17533, 17534, 17535, 17536, 17537, 17538, 17539, 17540, 17541, - 17542, 17543, 17544, 17545, 17546, 17547, 17548, 17549, 17550, 17551, - 17552, 17553, 17554, 17555, 17556, 17557, 17558, 17559, 17560, 17561, - 17562, 17563, 17564, 17565, 17566, 17567, 17568, 17569, 17570, 17571, - 17572, 17573, 17574, 17575, 17670, 17671, 17672, 17673, 17674, 17675, - 17676, 17677, 17678, 17679, 17680, 17681, 17682, 17683, 17684, 17685, - 17686, 17687, 17688, 17689, 17690, 17691, 17692, 17693, 17694, 17695, - 17696, 17697, 17698, 17699, 17700, 17701, 17702, 9616, 15959, 10811, 15194, - 17703, 19932, 16445, 19933, 12499, 13662, 10993, 19934, 19935, 19936, - 16310, 19937, 19938, 19940, 19939, 19941, 19942, 13460, 19943, 15921, - 19944, 11541, 17704, 19945, 19946, 11542, 19947, 10553, 12285, 19948, 9233, - 11167, 10820, 19949, 17705, 20046, 20047, 20048, 10443, 11318, 17706, - 14033, 18191, 15880, 14944, 16078, 20049, 16117, 20050, 15138, 10763, - 17707, 9824, 9272, 17708, 17709, 17710, 12082, 17711, 17712, 17713, 17714, - 9285, 9286, 17715, 9287, 17716, 17717, 17718, 17719, 9624, 13657, 17720, - 17721, 17722, 17723, 19128, 17724, 17725, 9278, 17726, 17727, 17728, 12296, - 9864, 17729, 17730, 13403, 15731, 17731, 13294, 15319, 17732, 10828, 12530, - 17733, 17734, 17735, 17736, 17737, 15688, 17738, 15908, 11587, 17739, - 19129, 10376, 19130, 17740, 17741, 11140, 16121, 17742, 11583, 15887, - 14730, 12267, 9652, 17743, 17744, 14431, 17745, 19133, 19131, 19135, 17746, - 19137, 19134, 10022, 13245, 17747, 10067, 19132, 17748, 14051, 17749, - 17750, 19136, 17751, 17752, 17753, 12687, 9252, 11308, 17754, 17755, 17756, - 16458, 17757, 17758, 14578, 14200, 14007, 14396, 19139, 19138, 12895, - 17759, 17760, 15296, 15318, 19140, 17761, 19143, 17762, 14559, 16325, - 19142, 10036, 17763, 14565, 17764, 19144, 10191, 17765, 17860, 14543, - 10803, 17861, 14002, 9644, 14212, 15941, 19145, 10429, 17862, 17863, 17864, - 19141, 17865, 17866, 17867, 17868, 17869, 17870, 19148, 9879, 19149, 17871, - 17872, 17873, 17874, 17875, 19146, 19147, 17876, 15546, 17877, 17878, - 12508, 9253, 17879, 15741, 17880, 17881, 10226, 14231, 17882, 19150, 17883, - 17884, 15761, 17885, 17886, 17887, 17888, 17889, 9288, 17890, 10249, 19153, - 19151, 19152, 10007, 17891, 17892, 17893, 15522, 19155, 17894, 17895, - 19157, 17896, 17897, 17898, 17899, 17900, 17901, 19156, 13413, 17902, - 15488, 17903, 17904, 19154, 17905, 17906, 17907, 17908, 15931, 16113, - 17909, 17910, 17911, 17912, 17913, 19159, 16516, 17914, 17915, 17916, - 17917, 17918, 17919, 17920, 19160, 17921, 9275, 15386, 17922, 19161, 19163, - 17923, 17924, 17925, 17926, 19162, 17927, 17928, 19164, 17929, 17930, - 17931, 17932, 17933, 15541, 17934, 10018, 17935, 19538, 17936, 17090, - 17937, 17093, 17938, 17091, 17939, 17092, 17940, 17941, 17942, 17095, - 15152, 12864, 17943, 17944, 9103, 17945, 17946, 17947, 15121, 17948, 17094, - 17949, 15717, 10935, 17197, 13476, 17950, 17097, 17096, 13834, 17098, - 17951, 17196, 16497, 17099, 12313, 17952, 17953, 17200, 17954, 17955, - 15759, 18050, 18051, 17202, 17199, 18052, 17203, 18053, 18054, 11523, - 18055, 18056, 18057, 12106, 17198, 17201, 16248, 18058, 17204, 18059, - 18060, 18061, 17208, 18062, 18063, 18064, 17209, 17207, 10959, 18065, - 18066, 18067, 11879, 17206, 18068, 18069, 18070, 17205, 15904, 9436, 18071, - 18072, 17210, 18073, 10824, 18074, 17211, 18075, 18076, 18077, 18078, 9622, - 18079, 18080, 18081, 9981, 18082, 18083, 18084, 18085, 10193, 17212, 18086, - 18087, 18088, 10250, 18089, 17213, 18090, 18091, 18092, 18093, 18094, - 18095, 18096, 18097, 18098, 18099, 18100, 18101, 18102, 18103, 18104, - 18105, 18106, 18107, 18108, 18109, 9256, 18110, 18111, 18112, 18113, 17215, - 18114, 18115, 18116, 17214, 17216, 18117, 18118, 18119, 18120, 18121, - 18122, 18123, 18124, 18125, 18126, 18127, 17218, 18128, 17217, 18129, - 18130, 18131, 18132, 18133, 18134, 18135, 17219, 18136, 18137, 18138, - 18139, 18140, 18141, 18142, 18143, 18144, 17220, 18145, 18240, 17221, - 18241, 18242, 15722, 22035, 13480, 16470, 13083, 22037, 22038, 22036, - 18243, 11723, 18244, 18245, 18246, 18247, 15184, 18248, 18249, 10406, - 18250, 18251, 15910, 14355, 18252, 18253, 22137, 22136, 10933, 22039, - 14209, 18254, 18255, 18256, 22139, 12115, 18257, 9669, 18258, 14545, 22140, - 22138, 11515, 22143, 18259, 22144, 11540, 12659, 11940, 14220, 22145, - 18260, 18261, 18262, 22141, 22142, 12905, 18263, 18264, 18265, 18266, - 18267, 22147, 18268, 9813, 18269, 16512, 18270, 9840, 22146, 22149, 18271, - 18272, 22148, 22150, 15154, 18273, 18274, 18275, 18276, 18277, 18278, - 18279, 12684, 13594, 18280, 18281, 18282, 18283, 18284, 18285, 22151, - 22152, 18286, 18287, 18288, 18289, 18290, 18291, 22153, 18292, 18293, - 22154, 22155, 22156, 18294, 18295, 18296, 18297, 22158, 22157, 18298, - 18299, 18300, 18301, 22159, 18302, 18303, 18304, 18305, 18306, 18307, - 18308, 18309, 18310, 18311, 18312, 18313, 9446, 18314, 15727, 14010, 18315, - 12144, 16301, 15501, 12286, 18316, 11575, 18317, 18318, 18319, 18320, - 18321, 18322, 18323, 18324, 18325, 18326, 10555, 18327, 18328, 18329, - 18330, 18331, 18332, 18333, 18334, 18335, 18430, 18431, 18432, 18433, - 18434, 18435, 18436, 18437, 18438, 18439, 18440, 18441, 18442, 18443, - 18444, 18445, 18446, 18447, 18448, 18449, 18450, 18451, 18452, 18453, - 18454, 18455, 18456, 18457, 18458, 18459, 18460, 18461, 18462, 18463, - 18464, 18465, 18466, 18467, 18468, 18469, 18470, 18471, 18472, 18473, - 18474, 18475, 18476, 18477, 18478, 18479, 18480, 18481, 18482, 18483, - 18484, 18485, 18486, 18487, 18488, 18489, 18490, 18491, 18492, 18493, - 18494, 18495, 18496, 18497, 18498, 18499, 18500, 18501, 18502, 18503, - 18504, 18505, 18506, 18507, 18508, 18509, 18510, 18511, 18512, 18513, - 18514, 18515, 18516, 18517, 18518, 18519, 18520, 18521, 18522, 18523, - 18524, 18525, 18620, 18621, 18622, 18623, 18624, 18625, 18626, 18627, - 18628, 18629, 18630, 18631, 18632, 18633, 18634, 18635, 18636, 18637, - 18638, 18639, 18640, 18641, 18642, 18643, 18644, 18645, 18646, 18647, - 18648, 18649, 18650, 18651, 18652, 18653, 18654, 18655, 18656, 18657, - 18658, 18659, 18660, 18661, 18662, 18663, 18664, 18665, 11393, 18666, - 18667, 18668, 18669, 18670, 18671, 18672, 18673, 18674, 18675, 18676, - 18677, 18678, 18679, 18680, 18681, 18682, 18683, 18684, 18685, 18686, - 18687, 18688, 18689, 18690, 22363, 18691, 18692, 18693, 18694, 18695, - 18696, 18697, 18698, 18699, 18700, 18701, 18702, 18703, 18704, 18705, - 18706, 18707, 18708, 18709, 18710, 18711, 18712, 18713, 18714, 18715, - 18810, 18811, 18812, 18813, 18814, 18815, 22364, 18816, 18817, 18818, - 18819, 18820, 18821, 18822, 18823, 18824, 18825, 18826, 18827, 18828, - 18829, 18830, 18831, 18832, 18833, 18834, 18835, 18836, 18837, 18838, - 18839, 18840, 22365, 18841, 18842, 18843, 18844, 18845, 18846, 18847, - 18848, 18849, 18850, 18851, 18852, 18853, 18854, 18855, 18856, 18857, - 18858, 18859, 18860, 18861, 18862, 18863, 18864, 18865, 18866, 18867, - 18868, 18869, 18870, 18871, 18872, 18873, 18874, 18875, 18876, 18877, - 18878, 18879, 18880, 18881, 18882, 18883, 18884, 18885, 18886, 18887, - 18888, 18889, 18890, 18891, 18892, 18893, 18894, 18895, 18896, 18897, - 18898, 18899, 18900, 18901, 18902, 18903, 18904, 18905, 19000, 19001, - 19002, 19003, 19004, 19005, 19006, 19007, 19008, 19009, 19010, 19011, - 19012, 19013, 19014, 19015, 19016, 19017, 19018, 19019, 19020, 19021, - 19022, 19023, 19024, 19025, 19026, 19027, 19028, 19029, 19030, 19031, - 19032, 19033, 19034, 19035, 19036, 19037, 19038, 19039, 19040, 19041, - 19042, 19043, 19044, 19045, 19046, 19047, 19048, 19049, 19050, 19051, - 22366, 19052, 19053, 19054, 19055, 19056, 19057, 19058, 19059, 19060, - 19061, 19062, 19063, 19064, 19065, 19066, 19067, 19068, 19069, 19070, - 19071, 19072, 19073, 19074, 19075, 19076, 19077, 19078, 19079, 19080, - 19081, 19082, 19083, 19084, 19085, 19086, 19087, 19088, 19089, 19090, - 19091, 19092, 19093, 19094, 22367, 19095, 19190, 19191, 19192, 19193, - 19194, 19195, 19196, 19197, 19198, 19199, 19200, 19201, 19202, 19203, - 19204, 19205, 19206, 19207, 19208, 19209, 19210, 19211, 19212, 19213, - 19214, 19215, 19216, 19217, 19218, 19219, 19220, 19221, 19222, 19223, - 19224, 22369, 19225, 19226, 19227, 19228, 19229, 19230, 19231, 19232, - 19233, 19234, 19235, 19236, 19237, 19238, 19239, 19240, 19241, 19242, - 19243, 19244, 19245, 19246, 19247, 19248, 19249, 19250, 19251, 19252, - 19253, 19254, 19255, 19256, 19257, 19258, 19259, 19260, 19261, 19262, - 19263, 19264, 19265, 19266, 19267, 19268, 19269, 19270, 19271, 19272, - 19273, 19274, 19275, 19276, 19277, 19278, 19279, 19280, 19281, 19282, - 22368, 19283, 19284, 19285, 19380, 19381, 19382, 19383, 19384, 19385, - 19386, 19387, 22588, 19388, 19389, 19390, 19391, 19392, 19393, 19394, - 19395, 19396, 19397, 19398, 19399, 19400, 19401, 19402, 19403, 19404, - 19405, 19406, 19407, 19408, 19409, 19410, 19411, 19412, 19413, 19414, - 19415, 19416, 19417, 19418, 19419, 19420, 19421, 19422, 19423, 19424, - 19425, 19426, 19427, 19428, 19429, 19430, 19431, 19432, 19433, 19434, - 19435, 19436, 19437, 19438, 19439, 19440, 19441, 19442, 19443, 19444, - 19445, 19446, 19447, 19448, 19449, 19450, 19451, 19452, 19453, 19454, - 19455, 19456, 19457, 19458, 19459, 19460, 19461, 19462, 19463, 19464, - 19465, 19466, 19467, 19468, 19469, 19470, 19471, 19472, 19473, 19474, - 19475, 19570, 19571, 19572, 19573, 19574, 19575, 19576, 19577, 19578, - 19579, 19580, 19581, 19582, 19583, 19584, 22370, 19585, 19586, 19587, - 19588, 19589, 19590, 19591, 19592, 19593, 19594, 19595, 19596, 19597, - 19598, 19599, 19600, 19601, 19602, 19603, 19604, 19605, 19606, 19607, - 19608, 19609, 19610, 19611, 19612, 19613, 19614, 19615, 19616, 19617, - 19618, 19619, 19620, 19621, 19622, 19623, 19624, 19625, 19626, 19627, - 19628, 22371, 19629, 19630, 19631, 19632, 19633, 19634, 19635, 19636, - 19637, 19638, 19639, 19640, 19641, 19642, 19643, 19644, 19645, 19646, - 19647, 19648, 19649, 19650, 19651, 19652, 19653, 20841, 20842, 20843, - 16130, 10169, 20845, 20844, 20846, 20847, 13400, 20848, 20849, 19654, - 10371, 10061, 20850, 20852, 19655, 20851, 19656, 10583, 20853, 20854, - 20855, 10224, 9609, 16296, 12863, 9236, 10599, 20856, 20857, 15896, 13448, - 11776, 14782, 10754, 20859, 20858, 20861, 20860, 13020, 20862, 20863, - 13409, 20864, 13410, 20865, 9412, 20866, 20867, 20868, 20869, 20870, 16509, - 20871, 20872, 11361, 20873, 15718, 14435, 9417, 12324, 20874, 13401, 12648, - 19657, 20875, 20876, 20877, 20878, 20879, 20880, 20881, 19658, 20882, - 20883, 20884, 19659, 19660, 20885, 20886, 20887, 20889, 20888, 19661, - 20890, 14548, 12478, 20891, 20892, 20893, 16056, 20894, 14934, 20895, - 20896, 19662, 20897, 20898, 20996, 20899, 20997, 10630, 12725, 20998, - 20999, 11529, 15516, 9494, 21000, 21001, 21002, 15573, 21003, 16338, 21004, - 13249, 19663, 21005, 21006, 12275, 21007, 15005, 14243, 21009, 21008, 9685, - 10823, 21010, 21011, 15171, 21012, 21013, 10425, 15136, 21014, 21015, - 21016, 13666, 14409, 21017, 21018, 21019, 21020, 21021, 16119, 21022, 9862, - 12645, 21023, 19664, 21024, 21025, 21026, 19665, 14818, 21027, 12509, 9809, - 16457, 11580, 19760, 14954, 21030, 21028, 21029, 21031, 10172, 11397, - 11751, 12679, 21032, 21033, 19761, 21034, 21042, 21035, 21036, 21037, - 13429, 21076, 10210, 21038, 19762, 21039, 21040, 10203, 12665, 21041, - 19763, 21043, 21044, 21045, 16137, 19764, 21046, 12912, 19765, 21047, - 12913, 21048, 21049, 10613, 9112, 21050, 21051, 21052, 19766, 21053, 21054, - 21055, 21056, 19767, 21057, 11706, 21060, 21058, 21059, 19768, 21061, - 21062, 12300, 21063, 21064, 21065, 21066, 21067, 21068, 21069, 21070, - 21071, 12121, 19769, 21072, 12268, 21073, 21074, 21075, 19770, 19771, - 14981, 19772, 19773, 19774, 19775, 19776, 19777, 19778, 19779, 9599, 19780, - 19781, 19782, 19783, 19784, 19785, 19786, 19787, 19788, 19789, 19790, - 19791, 19792, 19793, 19794, 19795, 19796, 19797, 19798, 19799, 19800, - 19801, 19802, 19803, 19804, 19805, 19806, 19807, 19808, 19809, 19810, - 19811, 19812, 19813, 19814, 19815, 19816, 19817, 19818, 19819, 19820, - 19821, 19822, 19823, 19824, 19825, 19826, 19827, 19828, 19829, 19830, - 19831, 19832, 19833, 19834, 19835, 19836, 19837, 19838, 19839, 19840, - 19841, 19842, 19843, 19844, 19845, 19846, 19847, 19848, 19849, 19850, - 19851, 19852, 19853, 19854, 19855, 19950, 19951, 19952, 19953, 19954, - 19955, 19956, 19957, 19958, 19959, 19960, 19961, 19962, 19963, 19964, - 19965, 19966, 19967, 19968, 19969, 19970, 19971, 19972, 19973, 19974, - 19975, 19976, 19977, 12672, 18752, 13808, 18753, 19978, 9268, 14767, 9804, - 13667, 18754, 14963, 18755, 11373, 18756, 18757, 12673, 16057, 12879, - 10810, 14762, 18758, 12721, 18759, 19979, 10362, 10628, 10975, 18760, - 18761, 15901, 18762, 19980, 18763, 15338, 18764, 18765, 18766, 18767, - 15349, 18768, 9496, 12092, 18769, 19981, 12076, 18770, 18771, 18772, 19982, - 18773, 18774, 19983, 10568, 17071, 19984, 10216, 19985, 17073, 17072, - 19986, 19987, 19988, 19989, 19990, 19991, 19992, 17075, 19993, 19994, - 19995, 13663, 19996, 19997, 17074, 10387, 15379, 15570, 16138, 11550, - 19998, 19999, 20000, 20001, 16507, 17077, 17076, 20002, 9027, 14586, 20003, - 17078, 20004, 10574, 11347, 12474, 12449, 9629, 17079, 20005, 12455, 12841, - 11516, 20006, 20007, 14977, 20008, 20009, 20010, 17080, 13809, 20011, - 20012, 20013, 20014, 20015, 9276, 20016, 20017, 20018, 17081, 20019, 10189, - 15891, 20020, 9688, 20021, 20022, 17082, 15906, 14968, 13082, 20023, 17083, - 20024, 20025, 20026, 20027, 20028, 17084, 20029, 17085, 12329, 14398, - 14976, 20030, 20031, 20032, 20033, 20034, 20035, 20036, 20037, 20038, - 20039, 20040, 20041, 20042, 15746, 12446, 20043, 17086, 20044, 20045, - 14224, 20140, 17087, 20141, 14225, 15579, 20142, 20143, 20144, 10629, - 20145, 20146, 17088, 9040, 14937, 20147, 20148, 16102, 20149, 20150, 20151, - 20152, 20153, 20154, 20155, 20156, 20157, 20158, 14232, 20159, 20160, - 20161, 20162, 20163, 20164, 20165, 20166, 17089, 20167, 20168, 18751, - 20169, 20170, 12260, 20171, 20172, 22356, 20173, 20174, 22357, 22358, - 12874, 20175, 13609, 15362, 20176, 20177, 15164, 15332, 11320, 10780, - 20178, 21079, 20179, 20180, 9823, 15701, 22359, 9686, 20181, 20182, 22360, - 20183, 20184, 10056, 20185, 20186, 20187, 20188, 20189, 20190, 20191, - 20192, 20193, 20194, 22362, 20195, 20196, 20197, 20198, 20199, 20200, - 20201, 15749, 22332, 15304, 20202, 20203, 20204, 20205, 22334, 20206, - 20207, 20208, 22333, 20209, 20210, 12322, 12120, 20211, 9217, 20212, 20213, - 20214, 20215, 14802, 20216, 15177, 22336, 20217, 20218, 15001, 20219, - 22335, 16135, 22337, 12660, 20220, 20221, 20222, 11199, 22339, 22338, - 20223, 20224, 20225, 12887, 20226, 20227, 12311, 20228, 20229, 20230, - 20231, 20232, 14165, 20233, 14943, 20234, 20235, 20330, 20331, 20332, - 20333, 20334, 20335, 20336, 20337, 20338, 22340, 20339, 20340, 22341, - 20341, 20342, 22342, 20343, 12467, 20344, 20345, 20346, 20347, 20348, 9077, - 13104, 20349, 20350, 20351, 20352, 22343, 20353, 20354, 20355, 20356, - 20357, 20358, 20359, 20360, 20361, 20362, 20363, 20364, 20365, 20366, - 20367, 20368, 20369, 20370, 20371, 13459, 22331, 20372, 20373, 11709, - 20374, 20375, 11703, 20376, 10044, 20377, 20378, 10394, 20379, 11906, - 12685, 12705, 20380, 20381, 16669, 20382, 20383, 20384, 10624, 20385, - 20386, 20387, 20388, 20389, 20390, 20391, 20392, 20393, 11584, 15300, - 20394, 9073, 20395, 20396, 20397, 20398, 20399, 22531, 20400, 20401, 20402, - 20403, 20404, 20405, 20406, 20407, 22532, 20408, 20409, 20410, 20411, - 20412, 15117, 20413, 9041, 20414, 20415, 20416, 22533, 22534, 20417, 22535, - 20418, 20419, 20420, 13437, 20421, 20422, 20423, 20424, 20425, 20520, - 20521, 11732, 20522, 20523, 22538, 20524, 20525, 20526, 20527, 20528, - 20529, 20530, 22537, 20531, 9277, 20532, 22536, 20533, 20534, 22539, 20535, - 22540, 20536, 20537, 20538, 20539, 20540, 20541, 20542, 20543, 20544, - 20545, 20546, 20547, 20548, 20549, 20550, 20551, 20552, 20553, 20554, - 20555, 20556, 20557, 20558, 20559, 20560, 20561, 20562, 20563, 20564, - 20565, 20566, 20567, 20568, 20569, 20570, 20571, 20572, 20573, 20574, - 20575, 20576, 20577, 20578, 20579, 20580, 20581, 20582, 20583, 20584, - 14729, 13630, 20585, 10936, 19689, 19690, 19691, 11719, 20586, 20587, - 20588, 20589, 20590, 15569, 20591, 15912, 13831, 20592, 20593, 20594, - 20595, 20596, 20597, 20598, 20599, 20600, 20601, 20602, 20603, 20604, - 20605, 20606, 20607, 20608, 20609, 20610, 20611, 20612, 20613, 20614, - 20615, 20710, 20711, 20712, 20713, 20714, 20715, 20716, 20717, 20718, - 20719, 20720, 20721, 20722, 20723, 20724, 20725, 20726, 20727, 20728, - 20729, 20730, 20731, 20732, 20733, 20734, 20735, 20736, 20737, 20738, - 20739, 20740, 20741, 20742, 20743, 20744, 20745, 20746, 20747, 20748, - 20749, 20750, 20751, 20752, 20753, 20754, 20755, 20756, 20757, 20758, - 20759, 20760, 20761, 20762, 20763, 20764, 20765, 20766, 20767, 20768, - 20769, 20770, 20771, 20772, 20773, 20774, 20775, 20776, 20777, 20778, - 20779, 20780, 20781, 20782, 20783, 20784, 20785, 20786, 20787, 20788, - 20789, 20790, 20791, 20792, 20793, 20794, 20795, 20796, 20797, 20798, - 20799, 20800, 20801, 20802, 20803, 20804, 20805, 20900, 20901, 20902, - 20903, 20904, 20905, 15504, 10170, 13469, 21467, 14993, 14174, 15180, - 19554, 14606, 10778, 10222, 21468, 9093, 14199, 21469, 15869, 12458, 12331, - 13241, 11702, 21566, 11358, 20906, 21567, 21568, 20907, 21569, 15520, - 13226, 20908, 14574, 21570, 20909, 15692, 11912, 14411, 20910, 21571, - 21572, 15348, 10243, 21573, 21574, 10038, 21575, 21576, 20911, 9497, 21577, - 21578, 13592, 20912, 20913, 20914, 20915, 20916, 20917, 20918, 20919, - 20920, 20921, 20922, 20923, 20924, 20925, 20926, 20927, 20928, 20929, - 20930, 20931, 20932, 20933, 20934, 20935, 20936, 20937, 20938, 20939, - 20940, 20941, 20942, 20943, 20944, 20945, 20946, 20947, 20948, 20949, - 10426, 20950, 20951, 20434, 20435, 20436, 20952, 20437, 20953, 20954, - 13219, 20438, 20439, 20955, 20956, 20957, 10396, 13984, 20958, 20959, - 20960, 20961, 20962, 20963, 20964, 18549, 22562, 20965, 20966, 20967, - 20968, 20969, 20970, 20971, 20972, 20973, 20974, 20975, 20976, 20977, - 20978, 20979, 20980, 20981, 20982, 20983, 20984, 20985, 20986, 20987, - 20988, 20989, 20990, 20991, 20992, 20993, 20994, 20995, 21090, 21091, - 21092, 21093, 21094, 22563, 21095, 21096, 9450, 21097, 21098, 21099, 21100, - 21101, 21102, 21103, 21104, 21105, 21106, 21107, 21108, 21109, 21110, - 21111, 21112, 21113, 21114, 21115, 21116, 21117, 21118, 21119, 21120, - 21121, 21122, 21123, 21124, 21125, 22564, 21126, 21127, 21128, 21129, - 21130, 21131, 21132, 21133, 21134, 21135, 21136, 21137, 21138, 21139, - 21140, 21141, 21142, 21143, 21144, 21145, 21146, 21147, 21148, 21149, - 21150, 21151, 21152, 21153, 21154, 21155, 21156, 21157, 21158, 21159, - 21160, 21161, 21162, 22566, 22565, 21163, 21164, 21165, 21166, 21167, - 21168, 21169, 21170, 21171, 21172, 21173, 21174, 21175, 18552, 21176, - 11307, 21177, 18553, 18554, 18555, 18556, 18557, 18558, 10380, 15576, - 11499, 14011, 9220, 14194, 21178, 18559, 10257, 13621, 18560, 21179, 21180, - 11535, 21181, 9308, 18561, 21182, 10251, 18562, 12882, 21183, 21184, 18563, - 14973, 10796, 18564, 12066, 21185, 18565, 9491, 21280, 18566, 21281, 12338, - 18567, 18568, 12533, 18569, 18570, 18571, 14020, 16649, 16884, 14982, - 21282, 21283, 21284, 21285, 21286, 21287, 21288, 21289, 21290, 21291, - 21292, 21190, 21293, 21294, 17401, 21295, 21296, 21297, 21298, 21299, - 21300, 21301, 21302, 21303, 21304, 21305, 21306, 21307, 21308, 21309, - 21310, 21311, 21312, 21313, 21314, 21315, 21316, 21317, 21318, 21319, - 21320, 21321, 21322, 21323, 21324, 21325, 21326, 21327, 21328, 21329, - 21330, 21331, 21332, 21333, 21334, 21335, 21336, 21337, 21338, 21339, - 21340, 21341, 21342, 21343, 21344, 21345, 21346, 21347, 21348, 21349, - 21350, 21351, 21352, 21353, 21354, 21355, 21356, 21357, 21358, 21359, - 21360, 21361, 21362, 21363, 21364, 21365, 21366, 21367, 21368, 21369, - 21370, 21371, 21372, 21373, 21374, 21375, 21470, 21471, 21472, 21473, - 21474, 21475, 21476, 21477, 21478, 21479, 21480, 21481, 21482, 21483, - 21484, 21485, 21486, 21487, 21488, 21489, 21490, 21491, 21492, 21493, - 21494, 21495, 21496, 21497, 21498, 21499, 21500, 21501, 21502, 21503, - 21504, 21505, 21506, 21507, 21508, 21509, 21510, 21511, 21512, 21513, - 21514, 21515, 21516, 21517, 21518, 21519, 21520, 21521, 21522, 21523, - 21524, 21525, 21526, 21527, 21528, 21529, 21530, 21531, 21532, 21533, - 21534, 21535, 21536, 21537, 21538, 21539, 21540, 21541, 21542, 21543, - 21544, 21545, 21546, 21547, 21548, 21549, 21550, 21551, 21552, 21553, - 21554, 21555, 21556, 21557, 21558, 21559, 21560, 21561, 21562, 21563, - 21564, 21565, 21660, 21661, 21662, 21663, 21664, 21665, 21666, 21667, - 21668, 21669, 21670, 21671, 21672, 21673, 21674, 21675, 21676, 21677, - 12522, 15871, 14587, 15312, 9654, 13488, 21678, 9426, 12476, 19349, 13992, - 19350, 19351, 11737, 19352, 16439, 14588, 19354, 11366, 19353, 19355, - 19356, 12523, 21679, 11525, 19357, 12515, 10932, 19358, 21680, 19359, 9645, - 15368, 21681, 21682, 11880, 19360, 13284, 19361, 19362, 21683, 21684, - 19363, 13218, 19364, 21685, 13782, 19365, 19366, 19367, 19120, 19368, - 19369, 12511, 19370, 19371, 16317, 19372, 21686, 19373, 10774, 21687, - 21688, 21689, 21690, 21691, 21692, 21693, 22542, 22541, 21694, 21695, - 21696, 21697, 22545, 22543, 10926, 21698, 22546, 21699, 22547, 21700, - 21701, 21702, 22549, 22548, 22551, 21703, 21704, 22550, 21705, 21706, - 21707, 21708, 21709, 22552, 22553, 21710, 21711, 21712, 21713, 22554, - 21714, 14227, 21715, 21716, 21717, 21718, 10608, 21719, 21720, 21721, - 21722, 21723, 21724, 22567, 21725, 22568, 21726, 21727, 21728, 21729, - 22569, 21730, 21731, 21732, 21733, 22571, 21734, 22573, 21735, 22570, - 21736, 21737, 21738, 21739, 21740, 21741, 21742, 21743, 21744, 22574, - 21745, 22572, 21746, 21747, 21748, 21749, 21750, 21751, 21752, 16490, - 21753, 21754, 21755, 21850, 22575, 21851, 21852, 21853, 21854, 21855, - 21856, 22576, 21857, 21858, 21859, 22577, 21860, 21861, 21862, 21863, - 21864, 21865, 21866, 21867, 21868, 21869, 21870, 22578, 21871, 21872, - 21873, 22579, 21874, 21875, 21876, 21877, 21878, 21879, 21880, 21881, - 21882, 21883, 21884, 17238, 21885, 21886, 16635, 21887, 21888, 21889, - 21890, 21891, 21892, 21893, 21894, 19182, 10812, 21895, 21896, 21897, - 21898, 11968, 11189, 22556, 13244, 22555, 21899, 22557, 22559, 22558, - 21900, 21901, 21902, 22560, 21903, 14751, 21904, 22561, 21905, 21906, - 12832, 21907, 21908, 21909, 21910, 21911, 21912, 21913, 21914, 21915, - 21916, 21917, 21918, 21919, 21920, 21921, 21922, 21923, 21924, 21925, - 21926, 21927, 21928, 21929, 21930, 21931, 21932, 21933, 21934, 21935, - 21936, 21937, 21938, 21939, 21940, 21941, 21942, 21943, 21944, 21945, - 22040, 22041, 22042, 22043, 22044, 22045, 22046, 22047, 22048, 22049, - 22050, 22051, 22052, 22053, 22054, 22055, 22056, 22057, 22058, 22059, - 22060, 22061, 22062, 22063, 22064, 22065, 22066, 22067, 22068, 22069, - 22070, 22071, 22072, 22073, 22074, 22075, 22076, 22077, 22078, 22079, - 22080, 22081, 22082, 22083, 22084, 22085, 22086, 22087, 22088, 22089, - 22090, 22091, 22092, 22093, 22094, 22095, 22096, 22097, 22098, 22099, - 22100, 22101, 22102, 22103, 22104, 22105, 22106, 22107, 22108, 22109, - 22110, 22111, 22112, 22113, 22114, 22115, 22116, 22117, 22118, 22119, - 22120, 22121, 22122, 22123, 22124, 22125, 22126, 22127, 22128, 22129, - 22130, 22131, 22132, 22133, 22134, 22135, 22230, 22231, 22232, 22233, - 22234, 22235, 22236, 22237, 22238, 22239, 22240, 22241, 22242, 22243, - 22244, 22245, 22246, 22247, 22248, 22249, 22250, 22251, 22252, 22253, - 22254, 22255, 22256, 22257, 22258, 22259, 22260, 22261, 22262, 22263, - 22264, 22265, 22266, 22267, 22268, 22269, 22270, 22271, 22272, 22273, - 22274, 22275, 22276, 22277, 22278, 22279, 22280, 22281, 22282, 22283, - 22284, 22285, 22286, 22287, 22288, 22289, 22290, 22291, 22292, 22293, - 22294, 22295, 22296, 22297, 22298, 22299, 22300, 22301, 22302, 22303, - 22304, 22305, 22306, 22307, 22308, 22309, 22310, 22311, 22312, 22313, - 22314, 22315, 22316, 22317, 22318, 22319, 22320, 22321, 22322, 22323, - 22324, 22325, 22420, 22421, 22422, 22423, 22424, 22425, 22426, 22427, - 22428, 22429, 22430, 22431, 22432, 22433, 22434, 22435, 22436, 22437, - 22438, 22439, 22440, 22441, 22442, 22443, 22444, 22445, 22446, 22447, - 22448, 22449, 22450, 22451, 22452, 22453, 22454, 22455, 22456, 22457, - 22458, 22459, 22460, 22461, 22462, 22463, 22464, 22465, 22466, 22467, - 22468, 22469, 22470, 22471, 22472, 22473, 22474, 22475, 22476, 22477, - 22478, 22479, 22480, 22481, 22482, 22483, 15742, 22484, 22485, 22372, - 22486, 12464, 22373, 22487, 22488, 22374, 22375, 22376, 22377, 22489, - 22490, 22379, 22491, 9226, 22380, 22492, 22381, 22382, 22383, 22493, 22384, - 22385, 22494, 22495, 22496, 22497, 22386, 22387, 14957, 22498, 22388, - 22389, 22390, 22391, 22392, 22393, 12145, 22394, 22395, 22396, 22397, - 22398, 22499, 22399, 22500, 22400, 22401, 22501, 22402, 22403, 22404, - 22405, 22406, 22407, 22408, 22409, 11693, 22502, 22410, 22411, 22412, - 22413, 22503, 22504, 22505, 22506, 22507, 13675, 22414, 22415, 22416, - 22417, 22508, 22509, 22418, 22419, 22516, 22517, 22518, 22519, 22520, - 22510, 22511, 22521, 22522, 22523, 9293, 22524, 22525, 22526, 22512, 22513, - 22527, 22528, 12314, 22529, 22514, 22515, 22530, 22610, 22611, 22612, - 22613, 22614, 22615, 22616, 22617, 22618, 22619, 22620, 22621, 22622, - 22623, 22624, 22625, 22626, 22627, 22628, 22629, 22630, 22631, 22632, - 22633, 22634, 22635, 22636, 22637, 22638, 22639, 22640, 22641, 22642, - 22643, 22644, 22645, 22646, 22647, 22648, 22649, 22650, 22651, 22652, - 22653, 22654, 22655, 22656, 22657, 22658, 22659, 22660, 22661, 22662, - 22663, 22664, 22665, 22666, 22667, 22668, 22669, 22670, 22671, 22672, - 22673, 22674, 22675, 22676, 22677, 22678, 22679, 22680, 22681, 22682, - 22683, 22684, 22685, 22686, 22687, 22688, 22689, 22690, 22691, 22692, - 22693, 22694, 22695, 22696, 22697, 22698, 22699, 22700, 22701, 22702, - 22703, 22704, 22705, 22800, 22801, 22802, 22803, 22804, 22805, 22806, - 22807, 22808, 22809, 22810, 22811, 22812, 22813, 22814, 22815, 22816, - 22817, 22818, 22819, 22820, 22821, 22822, 22823, 22824, 22825, 22826, - 22827, 22828, 22829, 22830, 22831, 22832, 22833, 22834, 22835, 22836, - 22837, 22838, 22839, 22840, 22841, 22842, 22843, 22844, 22845, 22846, - 22847, 22848, 22849, 22850, 22851, 22852, 22853, 22854, 22855, 22856, - 22857, 22858, 22859, 22860, 22861, 22862, 22863, 22864, 22865, 22866, - 22867, 22868, 22869, 22870, 22871, 22872, 22873, 22874, 22875, 22876, - 22877, 22878, 22879, 22880, 22881, 22882, 22883, 22884, 22885, 22886, - 22887, 22888, 22889, 22890, 22891, 22892, 22893, 22894, 22895, 22990, - 22991, 22992, 22993, 22994, 22995, 22996, 22997, 22998, 22999, 23000, - 23001, 23002, 23003, 23004, 23005, 23006, 23007, 23008, 23009, 23010, - 23011, 23012, 23013, 23014, 23015, 23016, 23017, 23018, 23019, 23020, - 23021, 23022, 23023, 23024, 23025, 23026, 23027, 23028, 23029, 23030, - 23031, 23032, 23033, 23034, 23035, 23036, 23037, 23038, 23039, 23040, - 23041, 23042, 23043, 23044, 23045, 23046, 23047, 23048, 23049, 23050, - 23051, 23052, 23053, 23054, 23055, 23056, 23057, 23058, 23059, 23060, - 23061, 23062, 23063, 23064, 23065, 23066, 23067, 23068, 23069, 23070, - 23071, 23072, 23073, 23074, 23075, 23076, 23077, 23078, 23079, 23080, - 23081, 23082, 23083, 23084, 23085, 23180, 23181, 23182, 23183, 23184, - 23185, 23186, 23187, 23188, 23189, 23190, 23191, 23192, 23193, 23194, - 23195, 23196, 23197, 23198, 23199, 23200, 23201, 23202, 23203, 23204, - 23205, 23206, 23207, 12906, 21200, 11311, 21201, 12724, 23208, 13039, - 15322, 23209, 21202, 21203, 21204, 21205, 21206, 15323, 23210, 15371, - 23211, 21208, 21207, 15872, 23212, 14585, 21209, 21211, 21210, 21212, - 21213, 23213, 23214, 10620, 21214, 10997, 23215, 21215, 21216, 11758, - 21217, 10241, 21218, 21219, 21220, 21221, 13606, 21222, 21223, 23216, - 21224, 13099, 23217, 21225, 23218, 23219, 23220, 21226, 23221, 21227, - 22544, 23222, 21228, 21229, 21230, 23223, 21231, 23224, 23225, 23226, - 23227, 21232, 10980, 23228, 21233, 21234, 21235, 21236, 21237, 21238, - 21239, 21241, 23229, 23230, 15680, 21240, 23231, 21242, 23232, 23233, - 23234, 23235, 23236, 23237, 23238, 23239, 23240, 23241, 22161, 12470, - 23242, 23243, 22583, 23244, 23245, 23246, 23247, 22584, 22585, 23248, - 23249, 22586, 23250, 23251, 23252, 23253, 23254, 23255, 22587, 12465, - 23256, 23257, 23258, 23259, 23260, 23261, 23262, 23263, 23264, 22589, - 23265, 22590, 23266, 23267, 23268, 23269, 23270, 23271, 12528, 23272, - 23273, 23274, 23275, 23370, 23371, 23372, 23373, 23374, 23375, 23376, - 23377, 23378, 22025, 23379, 23380, 23381, 22024, 23382, 23383, 12518, - 23384, 22580, 22581, 23385, 23386, 23387, 23388, 23389, 11153, 23390, - 23391, 23392, 23393, 16883, 23394, 23395, 23396, 14047, 12137, 21189, - 23397, 10983, 23398, 23399, 13408, 23400, 23401, 23402, 12837, 23403, - 23404, 22591, 22592, 22593, 23405, 22595, 22594, 23406, 22596, 23407, - 23408, 22599, 23409, 22598, 23410, 22597, 22600, 23411, 23412, 23413, - 23414, 22601, 23415, 23416, 23417, 23418, 23419, 23420, 23421, 23422, - 23423, 20688, 23424, 20689, 20690, 23425, 22353, 23426, 23427, 23428, - 23429, 23430, 23431, 23432, 23433, 23434, 23435, 23436, 23437, 22354, - 23438, 22355, 10171, 23439, 16655, 23440, 23441, 10771, 23442, 23443, - 23444, 16652, 23445, 17402, 23446, 23447, 23448, 23449, 23450, 23451, - 14048, 23452, 22602, 23453, 23454, 23455, 23456, 23457, 23458, 23459, - 23460, 23461, 22603, 23462, 23463, 22604, 23464, 23465, 23560, 23561, - 23562, 23563, 23564, 22606, 23565, 22605, 23566, 9254, 23567, 22607, 22608, - 23568, 23569, 23570, 23571, 23572, 22609, 23573, 23574, 23575, 23576, - 23577, 23578, 23579, 23580, 23581, 23582, 23583, 13280, 20445, 23584, - 23585, 23586, 23587, 23588, 23589, 23590, 23591, 23592, 23593, 23594, - 23595, 23596, 23597, 23598, 23599, 23600, 23601, 23602, 23603, 23604, - 23605, 23606, 23607, 23608, 23609, 23610, 23611, 23612, 23613, 23614, - 23615, 23616, 23617, 23618, 23619, 23620, 23621, 23622, 23623, 23624, - 23625, 23626, 23627, 23628, 9656, 22344, 23629, 23630, 22345, 12323, 22346, - 22347, 22348, 22349, 22350, 22351, 13588, 22352, 23631, 23632, 23633, - 23634, 23635, 23636, 23637, 23638, 23639, 23640, 23641, 23642, 12345, - 10743, 20687, 23643, 23644, 23645, 10809, 16878, 23646, 23647, 23648, - 23649, 23650, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 23651, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 23652, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 23653, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 23654, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 23655, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 23750, 23751, - 23752, 23753, 65535, 23754, 65535, 23755, 23756, 65535, 65535, 65535, - 23757, 65535, 65535, 65535, 65535, 65535, 65535, 23758, 23759, 23760, - 65535, 23761, 23762, 65535, 65535, 23763, 23764, 23765, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 7621, 7207, 65535, 7209, 7210, - 7189, 7190, 7205, 7206, 7191, 7192, 7203, 7204, 7195, 7196, 7193, 7194, - 7197, 7198, 7199, 7200, 65535, 65535, 65535, 65535, 7640, 7641, 7642, 7643, - 7644, 7645, 7646, 7647, 7648, 7649, 65535, 7650, 7651, 7652, 7653, 65535, - 7654, 7655, 7656, 7657, 7658, 7659, 7660, 7661, 7662, 7663, 7664, 7665, - 7666, 7667, 65535, 7668, 7669, 7670, 7671, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 6556, 6557, 6558, 6246, - 6560, 6561, 6562, 6563, 6564, 6565, 6566, 6567, 6568, 6569, 6570, 6571, - 6572, 6573, 6574, 6575, 6576, 6577, 6578, 6579, 6580, 6581, 6582, 6583, - 6584, 6585, 6586, 6587, 6588, 6589, 6590, 6591, 6592, 6593, 6594, 6595, - 6596, 6597, 6598, 6599, 6600, 6601, 6602, 6603, 6604, 6605, 6606, 6607, - 6608, 6609, 6610, 6611, 6612, 6613, 6614, 6615, 6616, 6617, 6618, 6619, - 6620, 6621, 6622, 6623, 6624, 6625, 6626, 6627, 6628, 6629, 6630, 6631, - 6632, 6633, 6634, 6635, 6636, 6637, 6638, 6639, 6640, 6641, 6642, 6643, - 6644, 6645, 6646, 6647, 6648, 6186, 65535, 6248, 6249, 7622, 6649, 7623, - 6559, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, - 65535, 65535, 65535, 65535, 65535, 65535, -]; - -static BACKWARD_TABLE_UPPER: &'static [u16] = &[ - 0, 0, 0, 0, 0, 32, 64, 96, 128, 160, 192, 224, 0, 0, 256, 288, 0, 0, 320, - 352, 0, 0, 384, 0, 0, 0, 0, 0, 416, 448, 480, 0, 512, 544, 576, 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, 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, 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, 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, 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, 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, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 608, 640, 0, 0, 0, 672, - 0, 0, 704, 736, 0, 768, 800, 0, 0, 0, 832, 864, 896, 928, 960, 992, 0, 0, - 1024, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 1056, 1088, 0, 0, 0, 1120, 1152, 1184, - 1216, 1248, 1280, 1312, 1344, 1376, 0, 1408, 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, 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, 1440, 1472, 1504, 0, 0, 0, 0, 0, 0, 0, 0, 1536, 1568, 1600, - 1632, 1664, 1696, 1728, 1760, 1792, 1824, 1856, 0, 0, 0, 0, 0, 0, 0, 1888, - 0, 0, 0, 1920, 0, 0, 0, 0, 0, 0, 1952, 1984, 2016, 0, 0, 0, 2048, 2080, 0, - 0, 0, 0, 0, 0, 0, 0, 2112, 0, 0, 0, 2144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2176, 0, 0, 2208, 0, 0, 2240, 0, 0, 0, - 0, 2272, 0, 0, 0, 0, 0, 0, 2304, 0, 0, 0, 0, 0, 0, 0, 0, 2336, 0, 0, 0, - 2368, 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, 2400, 0, 0, 0, 0, 0, 0, 0, 2432, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 2464, 0, 0, 0, 2496, 2528, 0, 0, 0, 0, 0, 0, 0, 2560, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 2592, 2624, 0, 0, 0, 0, 0, 2656, 0, 2688, 2720, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2752, 2784, 2816, 2848, 0, 0, 0, 0, 0, 0, - 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 2880, 2912, 2944, 0, 0, 2976, - 0, 0, 0, 0, 3008, 0, 0, 3040, 3072, 3104, 3136, 3168, 3200, 3232, 3264, - 3296, 3328, 3360, 3392, 3424, 3456, 3488, 3520, 3552, 3584, 3616, 3648, - 3680, 3712, 3744, 3776, 3808, 3840, 3872, 3904, 3936, 3968, 4000, 4032, - 4064, 4096, 4128, 4160, 4192, 4224, 4256, 4288, 4320, 4352, 4384, 4416, - 4448, 4480, 4512, 4544, 4576, 4608, 4640, 4672, 4704, 4736, 4768, 4800, - 4832, 4864, 4896, 4928, 4960, 4992, 5024, 5056, 5088, 5120, 5152, 5184, - 5216, 5248, 5280, 5312, 5344, 5376, 5408, 5440, 5472, 5504, 5536, 5568, - 5600, 5632, 5664, 5696, 5728, 5760, 5792, 5824, 5856, 5888, 5920, 5952, - 5984, 6016, 6048, 6080, 6112, 6144, 6176, 6208, 6240, 6272, 6304, 6336, - 6368, 6400, 6432, 6464, 6496, 6528, 6560, 6592, 6624, 6656, 6688, 6720, - 6752, 6784, 6816, 6848, 6880, 6912, 6944, 6976, 7008, 7040, 7072, 7104, - 7136, 7168, 7200, 7232, 7264, 7296, 7328, 7360, 7392, 7424, 7456, 7488, - 7520, 7552, 7584, 7616, 7648, 7680, 7712, 7744, 7776, 7808, 7840, 7872, - 7904, 7936, 7968, 8000, 8032, 8064, 8096, 8128, 8160, 8192, 8224, 8256, - 8288, 8320, 8352, 8384, 8416, 8448, 8480, 8512, 8544, 8576, 8608, 8640, - 8672, 8704, 8736, 8768, 8800, 8832, 8864, 8896, 8928, 8960, 8992, 9024, - 9056, 9088, 9120, 9152, 9184, 9216, 9248, 9280, 9312, 9344, 9376, 9408, - 9440, 9472, 9504, 9536, 9568, 9600, 9632, 9664, 9696, 9728, 9760, 9792, - 9824, 9856, 9888, 9920, 9952, 9984, 10016, 10048, 10080, 10112, 10144, - 10176, 10208, 10240, 10272, 10304, 10336, 10368, 10400, 10432, 10464, - 10496, 10528, 10560, 10592, 10624, 10656, 10688, 10720, 10752, 10784, - 10816, 10848, 10880, 10912, 10944, 10976, 11008, 11040, 11072, 11104, - 11136, 11168, 11200, 11232, 11264, 11296, 11328, 11360, 11392, 11424, - 11456, 11488, 11520, 11552, 11584, 11616, 11648, 11680, 11712, 11744, - 11776, 11808, 11840, 11872, 11904, 11936, 11968, 12000, 12032, 12064, - 12096, 12128, 12160, 12192, 12224, 12256, 12288, 12320, 12352, 12384, - 12416, 12448, 12480, 12512, 12544, 12576, 12608, 12640, 12672, 12704, - 12736, 12768, 12800, 12832, 12864, 12896, 12928, 12960, 12992, 13024, - 13056, 13088, 13120, 13152, 13184, 13216, 13248, 13280, 13312, 13344, - 13376, 13408, 13440, 13472, 13504, 13536, 13568, 13600, 13632, 13664, - 13696, 13728, 13760, 13792, 13824, 13856, 13888, 13920, 13952, 13984, - 14016, 14048, 14080, 14112, 14144, 14176, 14208, 14240, 14272, 14304, - 14336, 14368, 14400, 14432, 14464, 14496, 14528, 14560, 14592, 14624, - 14656, 14688, 14720, 14752, 14784, 14816, 14848, 14880, 14912, 14944, - 14976, 15008, 15040, 15072, 15104, 15136, 15168, 15200, 15232, 15264, - 15296, 15328, 15360, 15392, 15424, 15456, 15488, 15520, 15552, 15584, - 15616, 15648, 15680, 15712, 15744, 15776, 15808, 15840, 15872, 15904, - 15936, 15968, 16000, 16032, 16064, 16096, 16128, 16160, 16192, 16224, - 16256, 16288, 16320, 16352, 16384, 16416, 16448, 16480, 16512, 16544, - 16576, 16608, 16640, 16672, 16704, 16736, 16768, 16800, 16832, 16864, - 16896, 16928, 16960, 16992, 17024, 17056, 17088, 17120, 17152, 17184, - 17216, 17248, 17280, 17312, 17344, 17376, 17408, 17440, 17472, 17504, - 17536, 17568, 17600, 17632, 17664, 17696, 17728, 17760, 17792, 17824, - 17856, 17888, 17920, 17952, 17984, 18016, 18048, 18080, 18112, 18144, - 18176, 18208, 18240, 18272, 18304, 18336, 18368, 18400, 18432, 18464, - 18496, 18528, 18560, 18592, 18624, 18656, 18688, 18720, 18752, 18784, - 18816, 18848, 18880, 18912, 18944, 18976, 19008, 19040, 19072, 19104, - 19136, 19168, 19200, 19232, 19264, 19296, 19328, 19360, 19392, 19424, - 19456, 19488, 19520, 19552, 19584, 19616, 19648, 19680, 19712, 19744, - 19776, 19808, 19840, 19872, 19904, 19936, 19968, 20000, 20032, 20064, - 20096, 20128, 20160, 20192, 20224, 20256, 20288, 20320, 20352, 20384, - 20416, 20448, 20480, 20512, 20544, 20576, 20608, 20640, 20672, 20704, - 20736, 20768, 20800, 20832, 20864, 20896, 20928, 20960, 20992, 21024, - 21056, 21088, 21120, 21152, 21184, 21216, 21248, 21280, 21312, 21344, - 21376, 21408, 21440, 21472, 21504, 21536, 21568, 21600, 21632, 21664, - 21696, 21728, 21760, 21792, 21824, 21856, 21888, 21920, 21952, 21984, - 22016, 22048, 22080, 22112, 22144, 22176, 22208, 22240, 22272, 22304, - 22336, 22368, 22400, 22432, 22464, 22496, 22528, 22560, 22592, 22624, - 22656, 22688, 22720, 22752, 22784, 22816, 22848, 22880, 22912, 22944, - 22976, 23008, 23040, 23072, 23104, 23136, 23168, 23200, 23232, 23264, - 23296, 23328, 23360, 23392, 23424, 23456, 23488, 23520, 23552, 23584, - 23616, 23648, 23680, 23712, 23744, 23776, 23808, 23840, 23872, 23904, - 23936, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 0, 23968, 0, 24000, 24032, - 0, 0, 24064, 24096, 24128, 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, 24160, 24192, 24224, 0, 0, 0, - 0, 24256, 24288, 24320, 0, 0, 0, 0, 24352, -]; - -#[inline] -pub fn backward(code: u32) -> u16 { - let offset = (code >> 5) as uint; - let offset = if offset < 2048 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; - BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] -} - -#[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(0u32, 0x10000) { - let i = i as u16; - if i == 6555 { continue; } - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} diff --git a/src/encoding/index/gen_index.py b/src/encoding/index/gen_index.py index c6d85f1..c88ea6e 100644 --- a/src/encoding/index/gen_index.py +++ b/src/encoding/index/gen_index.py @@ -232,7 +232,7 @@ def generate_multi_byte_range_lbound_index(name): print >>f, 'pub fn forward(code: u32) -> u32 {' if minkey > 0: print >>f, ' if code < %d { return 0xffffffff; }' % minkey - if name == 'gb18030': # has "invalid" region inside + if name == 'gb18030-ranges': # has "invalid" region inside print >>f, ' if (code > 39419 && code < 189000) || code > 1237575 { return 0xffffffff; }' print >>f, ' let mut i = if code >= BACKWARD_TABLE[%d] {%d} else {0};' % \ (2**maxlog2 - 1, len(data) - 2**maxlog2 + 1) @@ -313,11 +313,11 @@ def generate_multi_byte_range_lbound_index(name): 'big5': generate_multi_byte_index, 'euc-kr': generate_multi_byte_index, - 'gbk': generate_multi_byte_index, + 'gb18030': generate_multi_byte_index, 'jis0208': generate_multi_byte_index, 'jis0212': generate_multi_byte_index, - 'gb18030': generate_multi_byte_range_lbound_index, + 'gb18030-ranges': generate_multi_byte_range_lbound_index, } if __name__ == '__main__': diff --git a/src/encoding/label.rs b/src/encoding/label.rs index d560cb2..723e043 100644 --- a/src/encoding/label.rs +++ b/src/encoding/label.rs @@ -216,14 +216,13 @@ pub fn encoding_from_whatwg_label(label: &str) -> Option { "chinese" | "csgb2312" | "csiso58gb231280" | + "gb18030" | "gb2312" | "gb_2312" | "gb_2312-80" | "gbk" | "iso-ir-58" | "x-gbk" => - Some(all::GBK18030 as EncodingRef), - "gb18030" => Some(all::GB18030 as EncodingRef), /* "hz-gb-2312" => @@ -311,8 +310,7 @@ pub fn encoding_from_windows_code_page(cp: uint) -> Option { 1257 => Some(all::WINDOWS_1257 as EncodingRef), 1258 => Some(all::WINDOWS_1258 as EncodingRef), 1259 => Some(all::X_MAC_CYRILLIC as EncodingRef), - 936 => Some(all::GBK18030 as EncodingRef), - 54936 => Some(all::GB18030 as EncodingRef), + 936 | 54936 => Some(all::GB18030 as EncodingRef), // XXX technically wrong /* 52936 => Some(all::HZ_GB_2312 as EncodingRef), */ diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index 61920ad..48eebc6 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -58,8 +58,8 @@ pub mod index { pub mod x_mac_cyrillic; pub mod big5; pub mod euc_kr; - pub mod gbk; pub mod gb18030; + pub mod gb18030_ranges; pub mod jis0208; pub mod jis0212; } diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 0bb145f..ae11135 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -99,3 +99,35 @@ pub static JAPANESE_TEXT: &'static str = 日本人や日系人、日本がかつて統治した地域の一部の住民など、約1億3千万人以上と考えられる。\ 統計によって前後する可能性はあるが、この数は世界の母語話者数で上位10位以内に入る人数である。"; +/// Some simplified Chinese text to test. +// +// the first paragraphs of the article "Chinese Language" from Chinese Wikipedia. +// https://zh.wikipedia.org/w/index.php?title=%E6%B1%89%E8%AF%AD&variant=zh-cn&oldid=31224104 +pub static SIMPLIFIED_CHINESE_TEXT: &'static str = + "汉语,又称中文、华语(东南亚)、国语(中华民国国语)、中国语(日本、韩国等),\ + 其他名称有汉文(通常指文言文)、华文、唐文、唐话、中国话等,是属汉藏语系的分析语,具有声调。\ + 汉语的文字系统——汉字是一种意音文字,表意的同时也具一定的表音功能。\ + 汉语包含书面语以及口语两部分,古代书面汉语称为文言文,现代书面汉语一般指使用现代标准汉语语法,\ + 词汇的中文通行文体。目前全球有六分之一人口使用汉语作为母语。现代汉语书面语高度统一,\ + 口语则有官话、粤语、吴语、湘语、赣语、客家语、闽语等七种主要汉语言\ + (也有人认为晋语和(或)徽语和(或)平话(广西平话)也应为独立汉语言,\ + 也有其他人认为闽语其实是一个语族,下辖闽南语、闽东语、闽中语以及莆仙语,\ + 国际标准化组织即持此观点,部分资料将其中的一至六种也算成单独的汉语言,\ + 这就是八至十三种汉语言的由来)。"; + +/// Some traditional Chinese text to test. +// +// the first paragraphs of the article "Chinese Language" from Chinese Wikipedia. +// https://zh.wikipedia.org/w/index.php?title=%E6%B1%89%E8%AF%AD&variant=zh-tw&oldid=31224104 +pub static TRADITIONAL_CHINESE_TEXT: &'static str = + "漢語,又稱中文、華語(東南亞)、國語(中華民國國語)、中國語(日本、韓國等),\ + 其他名稱有漢文(通常指文言文)、華文、唐文、唐話、中國話等,是屬漢藏語系的分析語,具有聲調。\ + 漢語的文字系統——漢字是一種意音文字,表意的同時也具一定的表音功能。\ + 漢語包含書面語以及口語兩部分,古代書面漢語稱為文言文,現代書面漢語一般指使用現代標準漢語語法,\ + 詞彙的中文通行文體。目前全球有六分之一人口使用漢語作為母語。現代漢語書面語高度統一,\ + 口語則有官話、粵語、吳語、湘語、贛語、客家語、閩語等七種主要漢語言\ + (也有人認為晉語和(或)徽語和(或)平話(廣西平話)也應為獨立漢語言,\ + 也有其他人認為閩語其實是一個語族,下轄閩南語、閩東語、閩中語以及莆仙語,\ + 國際標準化組織即持此觀點,部分資料將其中的一至六種也算成單獨的漢語言,\ + 這就是八至十三種漢語言的由來)。"; + diff --git a/src/encoding/util.rs b/src/encoding/util.rs index 57992e5..c2c2036 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -75,6 +75,13 @@ impl<'a, State: Default> StatefulDecoderHelper<'a, State> { Ok(Default::default()) } + /// Writes a Unicode string to the output and resets back to the initial state. + #[inline(always)] + pub fn emit_str(&mut self, s: &str) -> Result { + self.output.write_str(s); + Ok(Default::default()) + } + /// Issues a codec error with given message at the current position. #[inline(always)] pub fn err(&self, msg: &'static str) -> Result { From 375a880295090c4de34275cfa4fd3c6a5fa8d413 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sun, 11 May 2014 01:53:01 +0900 Subject: [PATCH 04/29] bumped the copyright year for substantially changed files. --- src/encoding/codec/japanese.rs | 2 +- src/encoding/codec/korean.rs | 2 +- src/encoding/codec/simpchinese.rs | 2 +- src/encoding/codec/tradchinese.rs | 2 +- src/encoding/index/gen_index.py | 2 +- src/encoding/label.rs | 2 +- src/encoding/testutils.rs | 2 +- src/encoding/util.rs | 2 +- 8 files changed, 8 insertions(+), 8 deletions(-) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index 8cf3a5d..e63dccc 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. //! Legacy Japanese encodings based on JIS X 0208 and JIS X 0212. diff --git a/src/encoding/codec/korean.rs b/src/encoding/codec/korean.rs index 77b59e5..d6de3f5 100644 --- a/src/encoding/codec/korean.rs +++ b/src/encoding/codec/korean.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. //! Legacy Korean encodings based on KS X 1001. diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index 279c76f..b658c9e 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. //! Legacy simplified Chinese encodings based on GB 2312 and GB 18030. diff --git a/src/encoding/codec/tradchinese.rs b/src/encoding/codec/tradchinese.rs index ad82d7d..44eedd8 100644 --- a/src/encoding/codec/tradchinese.rs +++ b/src/encoding/codec/tradchinese.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. //! Legacy traditional Chinese encodings. diff --git a/src/encoding/index/gen_index.py b/src/encoding/index/gen_index.py index c88ea6e..e3557f1 100644 --- a/src/encoding/index/gen_index.py +++ b/src/encoding/index/gen_index.py @@ -1,5 +1,5 @@ # This is a part of rust-encoding. -# Copyright (c) 2013, Kang Seonghoon. +# Copyright (c) 2013-2014, Kang Seonghoon. # See README.md and LICENSE.txt for details. import urllib diff --git a/src/encoding/label.rs b/src/encoding/label.rs index 723e043..4d0d37f 100644 --- a/src/encoding/label.rs +++ b/src/encoding/label.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. //! An interface for retrieving an encoding (or a set of encodings) from a string/numeric label. diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index ae11135..5d07802 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. //! Macros and utilities for testing. diff --git a/src/encoding/util.rs b/src/encoding/util.rs index c2c2036..ebc86cc 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. //! Internal utilities. From 626b88cb02b41db7d56735710cbd09590fe184d6 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Mon, 12 May 2014 00:10:35 +0900 Subject: [PATCH 05/29] reencoding trap now depends on the *current* encoder state. previously it didn't depend on the encoder state at all, resulting in the incorrect output when the encoder has a complex state. this directly affects ISO 2022 encodings in the development. --- README.md | 2 +- src/encoding/lib.rs | 2 +- src/encoding/types.rs | 103 ++++++++++++++++++++++++++++++++++++++---- 3 files changed, 96 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index e2ca270..62b0c12 100644 --- a/README.md +++ b/README.md @@ -47,7 +47,7 @@ A practical example of custom encoder traps: ~~~~ {.rust} // hexadecimal numeric character reference replacement -fn hex_ncr_escape(_encoder: &Encoder, input: &str, output: &mut ByteWriter) -> bool { +fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { let escapes: Vec<~str> = input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); let escapes = escapes.concat(); diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index 48eebc6..b515981 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -108,7 +108,7 @@ mod tests { #[test] fn test_readme_hex_ncr_escape() { // hexadecimal numeric character reference replacement - fn hex_ncr_escape(_encoder: &Encoder, input: &str, output: &mut ByteWriter) -> bool { + fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { let escapes: Vec<~str> = input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); let escapes = escapes.concat(); diff --git a/src/encoding/types.rs b/src/encoding/types.rs index d4e98ab..9d7d700 100644 --- a/src/encoding/types.rs +++ b/src/encoding/types.rs @@ -1,5 +1,5 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. /*! @@ -341,11 +341,11 @@ pub trait Encoding { /// A type of the bare function in `EncoderTrap` values. pub type EncoderTrapFunc = - extern "Rust" fn(encoder: &Encoder, input: &str, output: &mut ByteWriter) -> bool; + extern "Rust" fn(encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool; /// A type of the bare function in `DecoderTrap` values. pub type DecoderTrapFunc = - extern "Rust" fn(decoder: &Decoder, input: &[u8], output: &mut StringWriter) -> bool; + extern "Rust" fn(decoder: &mut Decoder, input: &[u8], output: &mut StringWriter) -> bool; /// Trap, which handles decoder errors. pub enum DecoderTrap { @@ -366,7 +366,7 @@ pub enum DecoderTrap { impl DecoderTrap { /// Handles a decoder error. May write to the output writer. /// Returns true only when it is fine to keep going. - fn trap(&self, decoder: &Decoder, input: &[u8], output: &mut StringWriter) -> bool { + fn trap(&self, decoder: &mut Decoder, input: &[u8], output: &mut StringWriter) -> bool { match *self { DecodeStrict => false, DecodeReplace => { output.write_char('\ufffd'); true }, @@ -399,15 +399,14 @@ pub enum EncoderTrap { impl EncoderTrap { /// Handles an encoder error. May write to the output writer. /// Returns true only when it is fine to keep going. - fn trap(&self, encoder: &Encoder, input: &str, output: &mut ByteWriter) -> bool { - fn reencode(encoder: &Encoder, input: &str, output: &mut ByteWriter, + fn trap(&self, encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { + fn reencode(encoder: &mut Encoder, input: &str, output: &mut ByteWriter, trapname: &str) -> bool { if encoder.is_ascii_compatible() { // optimization! output.write_bytes(input.as_bytes()); } else { - let mut e = encoder.from_self(); - let (_, err) = e.raw_feed(input, output); - if err.is_some() || e.raw_finish(output).is_some() { + let (_, err) = encoder.raw_feed(input, output); + if err.is_some() { fail!("{:s} cannot reencode a replacement string", trapname); } } @@ -445,3 +444,89 @@ pub fn decode(input: &[u8], trap: DecoderTrap, fallback_encoding: EncodingRef) (fallback_encoding.decode(input, trap), fallback_encoding) } } + +#[cfg(test)] +mod tests { + use super::*; + use util::StrCharIndex; + + // a contrived encoding example: same as ASCII, but inserts `prepend` between each character + // within two "e"s (so that `widespread` becomes `wide*s*p*r*ead` and `eeeeasel` becomes + // `e*ee*ease*l` where `*` is substituted by `prepend`) and prohibits `prohibit` character. + struct MyEncoder { flag: bool, prohibit: char, prepend: &'static str, toggle: bool } + impl Encoder for MyEncoder { + fn from_self(&self) -> Box { + box MyEncoder { flag: self.flag, + prohibit: self.prohibit, + prepend: self.prepend, + toggle: false } as Box + } + fn is_ascii_compatible(&self) -> bool { self.flag } + fn raw_feed(&mut self, input: &str, + output: &mut ByteWriter) -> (uint, Option) { + for ((i,j), ch) in input.index_iter() { + if ch <= '\u007f' && ch != self.prohibit { + if self.toggle && !self.prepend.is_empty() { + output.write_bytes(self.prepend.as_bytes()); + } + output.write_byte(ch as u8); + if ch == 'e' { + self.toggle = !self.toggle; + } + } else { + return (i, Some(CodecError { upto: j, cause: "!!!".into_maybe_owned() })); + } + } + (input.len(), None) + } + fn raw_finish(&mut self, _output: &mut ByteWriter) -> Option { None } + } + + struct MyEncoding { flag: bool, prohibit: char, prepend: &'static str } + impl Encoding for MyEncoding { + fn name(&self) -> &'static str { "my encoding" } + fn encoder(&'static self) -> Box { + box MyEncoder { flag: self.flag, + prohibit: self.prohibit, + prepend: self.prepend, + toggle: false } as Box + } + fn decoder(&'static self) -> Box { fail!("not supported") } + } + + #[test] + fn test_reencoding_trap_with_ascii_compatible_encoding() { + static COMPAT: &'static MyEncoding = + &MyEncoding { flag: true, prohibit: '\u0080', prepend: "" }; + static INCOMPAT: &'static MyEncoding = + &MyEncoding { flag: false, prohibit: '\u0080', prepend: "" }; + + assert_eq!(COMPAT.encode("Hello\u203d I'm fine.", EncodeNcrEscape), + Ok(Vec::from_slice(bytes!("Hello‽ I'm fine.")))); + assert_eq!(INCOMPAT.encode("Hello\u203d I'm fine.", EncodeNcrEscape), + Ok(Vec::from_slice(bytes!("Hello‽ I'm fine.")))); + } + + #[test] + fn test_reencoding_trap_with_ascii_incompatible_encoding() { + static COMPAT: &'static MyEncoding = + &MyEncoding { flag: true, prohibit: '\u0080', prepend: "*" }; + static INCOMPAT: &'static MyEncoding = + &MyEncoding { flag: false, prohibit: '\u0080', prepend: "*" }; + + // this should behave incorrectly as the encoding broke the assumption. + assert_eq!(COMPAT.encode("Hello\u203d I'm fine.", EncodeNcrEscape), + Ok(Vec::from_slice(bytes!("He*l*l*o‽* *I*'*m* *f*i*n*e.")))); + assert_eq!(INCOMPAT.encode("Hello\u203d I'm fine.", EncodeNcrEscape), + Ok(Vec::from_slice(bytes!("He*l*l*o*&*#*8*2*5*3*;* *I*'*m* *f*i*n*e.")))); + } + + #[test] + #[should_fail] + fn test_reencoding_trap_can_fail() { + static FAIL: &'static MyEncoding = &MyEncoding { flag: false, prohibit: '&', prepend: "" }; + + // this should fail as this contrived encoding does not support `&` at all + let _ = FAIL.encode("Hello\u203d I'm fine.", EncodeNcrEscape); + } +} From 634a0fda6ea9b195dc81fc13797b61db704a9c42 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Tue, 13 May 2014 00:47:24 +0900 Subject: [PATCH 06/29] language changes: std::cast is merged to std::mem. --- src/encoding/codec/utf_8.rs | 6 +++--- src/encoding/util.rs | 6 +++--- 2 files changed, 6 insertions(+), 6 deletions(-) diff --git a/src/encoding/codec/utf_8.rs b/src/encoding/codec/utf_8.rs index 33db969..e490682 100644 --- a/src/encoding/codec/utf_8.rs +++ b/src/encoding/codec/utf_8.rs @@ -24,7 +24,7 @@ //! UTF-8, the universal encoding. -use std::{str, cast}; +use std::{str, mem}; use types::*; /** @@ -66,7 +66,7 @@ impl Encoder for UTF8Encoder { fn raw_feed(&mut self, input: &str, output: &mut ByteWriter) -> (uint, Option) { unsafe { - let input: &[u8] = cast::transmute(input); + let input: &[u8] = mem::transmute(input); assert!(str::is_utf8(input)); output.write_bytes(input); } @@ -146,7 +146,7 @@ impl Decoder for UTF8Decoder { output.writer_hint(input.len()); fn write_bytes(output: &mut StringWriter, bytes: &[u8]) { - output.write_str(unsafe {cast::transmute(bytes)}); + output.write_str(unsafe {mem::transmute(bytes)}); } let mut state = self.state; diff --git a/src/encoding/util.rs b/src/encoding/util.rs index ebc86cc..550e037 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -6,13 +6,13 @@ #![macro_escape] -use std::{str, cast}; +use std::{str, mem}; use std::default::Default; use types; /// Unchecked conversion to `char`. pub fn as_char(ch: T) -> char { - unsafe { cast::transmute(ch.to_u32().unwrap()) } + unsafe { mem::transmute(ch.to_u32().unwrap()) } } /// External iterator for a string's characters with its corresponding byte offset range. @@ -71,7 +71,7 @@ impl<'a, State: Default> StatefulDecoderHelper<'a, State> { /// There is intentionally no check for `c`, so the caller should ensure that it's valid. #[inline(always)] pub fn emit(&mut self, c: u32) -> Result { - self.output.write_char(unsafe {cast::transmute(c)}); + self.output.write_char(unsafe {mem::transmute(c)}); Ok(Default::default()) } From 7cd56ddabd746ac4a921814b8857c2fb445d7234 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sun, 11 May 2014 04:10:02 +0900 Subject: [PATCH 07/29] generalized the stateful decoder DSL to support non-ASCII-compatible decoders. --- src/encoding/util.rs | 80 ++++++++++++++++++++++++++++++++++---------- 1 file changed, 63 insertions(+), 17 deletions(-) diff --git a/src/encoding/util.rs b/src/encoding/util.rs index 550e037..52d2ece 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -48,7 +48,7 @@ impl<'r> StrCharIndex<'r> for &'r str { } /// A helper struct for the stateful decoder DSL. -pub struct StatefulDecoderHelper<'a, State> { +pub struct StatefulDecoderHelper<'a> { /// The current buffer. pub buf: &'a [u8], /// The current index to the buffer. @@ -57,7 +57,7 @@ pub struct StatefulDecoderHelper<'a, State> { pub output: &'a mut types::StringWriter, } -impl<'a, State: Default> StatefulDecoderHelper<'a, State> { +impl<'a> StatefulDecoderHelper<'a> { /// Reads one byte from the buffer if any. #[inline(always)] pub fn read(&mut self) -> Option { @@ -67,24 +67,30 @@ impl<'a, State: Default> StatefulDecoderHelper<'a, State> { } } + /// Resets back to the initial state. + #[inline(always)] + pub fn reset(&self) -> Result { + Ok(Default::default()) + } + /// Writes one Unicode scalar value to the output and resets back to the initial state. /// There is intentionally no check for `c`, so the caller should ensure that it's valid. #[inline(always)] - pub fn emit(&mut self, c: u32) -> Result { + pub fn emit(&mut self, c: u32) -> Result { self.output.write_char(unsafe {mem::transmute(c)}); Ok(Default::default()) } /// Writes a Unicode string to the output and resets back to the initial state. #[inline(always)] - pub fn emit_str(&mut self, s: &str) -> Result { + pub fn emit_str(&mut self, s: &str) -> Result { self.output.write_str(s); Ok(Default::default()) } /// Issues a codec error with given message at the current position. #[inline(always)] - pub fn err(&self, msg: &'static str) -> Result { + pub fn err(&self, msg: &'static str) -> Result { Err(types::CodecError { upto: self.pos, cause: msg.into_maybe_owned() }) } @@ -92,26 +98,29 @@ impl<'a, State: Default> StatefulDecoderHelper<'a, State> { /// This should be used to implement "prepending byte to the stream" in the Encoding spec, /// which corresponds to `ctx.backup_and_err(1, ...)`. #[inline(always)] - pub fn backup_and_err(&self, backup: uint, - msg: &'static str) -> Result { + pub fn backup_and_err(&self, backup: uint, + msg: &'static str) -> Result { // XXX we should eventually handle a negative `upto` let upto = if self.pos < backup {0} else {self.pos - backup}; Err(types::CodecError { upto: upto, cause: msg.into_maybe_owned() }) } } -/// Defines an ASCII-compatible stateful decoder from given state machine. -macro_rules! ascii_compatible_stateful_decoder( +/// Defines a stateful decoder from given state machine. +macro_rules! stateful_decoder( ( $(#[$decmeta:meta])* struct $dec:ident; module $stmod:ident; // should be unique from other existing identifiers + ascii_compatible $asciicompat:expr; $(internal $item:item)* // will only be visible from state functions initial state $inist:ident($inictx:ident) { $(case $($inilhs:pat)|+ => $inirhs:expr;)+ + final => $inifin:expr; } $(state $st:ident($ctx:ident $(, $arg:ident: $ty:ty)*) { $(case $($lhs:pat)|+ => $rhs:expr;)+ + final => $fin:expr; })* ) => ( $(#[$decmeta])* @@ -139,13 +148,13 @@ macro_rules! ascii_compatible_stateful_decoder( impl Decoder for $dec { fn from_self(&self) -> Box { $dec::new() } - fn is_ascii_compatible(&self) -> bool { true } + fn is_ascii_compatible(&self) -> bool { $asciicompat } fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { output.writer_hint(input.len()); - type Context<'a> = ::util::StatefulDecoderHelper<'a, $stmod::State>; + type Context<'a> = ::util::StatefulDecoderHelper<'a>; $($item)* @@ -192,14 +201,51 @@ macro_rules! ascii_compatible_stateful_decoder( (processed, None) } - fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { - match ::std::mem::replace(&mut self.st, $stmod::$inist) { - $stmod::$inist => None, - _ => Some(CodecError { upto: 0, - cause: "incomplete sequence".into_maybe_owned() }), - } + fn raw_finish(&mut self, output: &mut StringWriter) -> Option { + #![allow(unused_mut, unused_variable)] + let mut ctx = ::util::StatefulDecoderHelper { buf: &[], pos: 0, output: output }; + let st_or_err: Result<(),CodecError> = + match ::std::mem::replace(&mut self.st, $stmod::$inist) { + $stmod::$inist => { let mut $inictx = ctx; $inifin }, + $( + $stmod::$st(() $(, $arg)*) => { let mut $ctx = ctx; $fin }, + )* + }; + st_or_err.err() } } ) ) +/// Defines an ASCII-compatible stateful decoder from given state machine. +macro_rules! ascii_compatible_stateful_decoder( + ( + $(#[$decmeta:meta])* + struct $dec:ident; + module $stmod:ident; // should be unique from other existing identifiers + $(internal $item:item)* // will only be visible from state functions + initial state $inist:ident($inictx:ident) { + $(case $($inilhs:pat)|+ => $inirhs:expr;)+ + } + $(state $st:ident($ctx:ident $(, $arg:ident: $ty:ty)*) { + $(case $($lhs:pat)|+ => $rhs:expr;)+ + })* + ) => ( + stateful_decoder!( + $(#[$decmeta])* + struct $dec; + module $stmod; + ascii_compatible true; + $(internal $item)* + initial state $inist($inictx) { + $(case $($inilhs)|+ => $inirhs;)+ + final => $inictx.reset::<(),CodecError>(); + } + $(state $st($ctx $(, $arg: $ty)*) { + $(case $($lhs)|+ => $rhs;)+ + final => $ctx.err("incomplete sequence"); + })* + ) + ) +) + From f980815854a2ab667e9d73bb9e52330f7ef7ddfb Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sun, 11 May 2014 14:39:51 +0900 Subject: [PATCH 08/29] more DSL support for generalized stateful decoders. --- src/encoding/codec/japanese.rs | 25 ++++--- src/encoding/codec/korean.rs | 10 +-- src/encoding/codec/simpchinese.rs | 19 ++--- src/encoding/codec/tradchinese.rs | 10 +-- src/encoding/util.rs | 114 +++++++++++++++++++++++------- 5 files changed, 127 insertions(+), 51 deletions(-) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index e63dccc..6604477 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -5,8 +5,7 @@ //! Legacy Japanese encodings based on JIS X 0208 and JIS X 0212. use util::StrCharIndex; -use index0208 = index::jis0208; -use index0212 = index::jis0212; +use index; use types::*; /** @@ -59,7 +58,7 @@ impl Encoder for EUCJPEncoder { output.write_byte((ch as uint - 0xff61 + 0xa1) as u8); } _ => { - let ptr = index0208::backward(ch as u32); + let ptr = index::jis0208::backward(ch as u32); if ptr == 0xffff { return (i, Some(CodecError { upto: j, cause: "unrepresentable character".into_maybe_owned() @@ -88,24 +87,28 @@ ascii_compatible_stateful_decoder! { module eucjp; - internal fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + internal pub fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + use index; + let lead = lead as uint; let trail = trail as uint; let index = match (lead, trail) { (0xa1..0xfe, 0xa1..0xfe) => (lead - 0xa1) * 94 + trail - 0xa1, _ => 0xffff, }; - index0208::forward(index as u16) + index::jis0208::forward(index as u16) } - internal fn map_two_0212_bytes(lead: u8, trail: u8) -> u32 { + internal pub fn map_two_0212_bytes(lead: u8, trail: u8) -> u32 { + use index; + let lead = lead as uint; let trail = trail as uint; let index = match (lead, trail) { (0xa1..0xfe, 0xa1..0xfe) => (lead - 0xa1) * 94 + trail - 0xa1, _ => 0xffff, }; - index0212::forward(index as u16) + index::jis0212::forward(index as u16) } // euc-jp lead = 0x00 @@ -277,7 +280,7 @@ impl Encoder for Windows31JEncoder { '\u203e' => { output.write_byte(0x7e); } '\uff61'..'\uff9f' => { output.write_byte((ch as uint - 0xff61 + 0xa1) as u8); } _ => { - let ptr = index0208::backward(ch as u32); + let ptr = index::jis0208::backward(ch as u32); if ptr == 0xffff { return (i, Some(CodecError { upto: j, cause: "unrepresentable character".into_maybe_owned(), @@ -308,7 +311,9 @@ ascii_compatible_stateful_decoder! { module windows31j; - internal fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + internal pub fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + use index; + let lead = lead as uint; let trail = trail as uint; let leadoffset = if lead < 0xa0 {0x81} else {0xc1}; @@ -323,7 +328,7 @@ ascii_compatible_stateful_decoder! { (lead - leadoffset) * 188 + trail - trailoffset, _ => 0xffff, }; - index0208::forward(index as u16) + index::jis0208::forward(index as u16) } // shift_jis lead = 0x00 diff --git a/src/encoding/codec/korean.rs b/src/encoding/codec/korean.rs index d6de3f5..7254a36 100644 --- a/src/encoding/codec/korean.rs +++ b/src/encoding/codec/korean.rs @@ -5,7 +5,7 @@ //! Legacy Korean encodings based on KS X 1001. use util::StrCharIndex; -use index = index::euc_kr; +use index; use types::*; /** @@ -48,7 +48,7 @@ impl Encoder for Windows949Encoder { if ch <= '\u007f' { output.write_byte(ch as u8); } else { - let ptr = index::backward(ch as u32); + let ptr = index::euc_kr::backward(ch as u32); if ptr == 0xffff { return (i, Some(CodecError { upto: j, cause: "unrepresentable character".into_maybe_owned() @@ -83,7 +83,9 @@ ascii_compatible_stateful_decoder! { module windows949; - internal fn map_two_bytes(lead: u8, trail: u8) -> u32 { + internal pub fn map_two_bytes(lead: u8, trail: u8) -> u32 { + use index; + let lead = lead as uint; let trail = trail as uint; let index = match (lead, trail) { @@ -97,7 +99,7 @@ ascii_compatible_stateful_decoder! { (26 + 26 + 126) * (0xc7 - 0x81) + (lead - 0xc7) * 94 + trail - 0xa1, (_, _) => 0xffff, }; - index::forward(index as u16) + index::euc_kr::forward(index as u16) } // euc-kr lead = 0x00 diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index b658c9e..a9e12a0 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -4,8 +4,7 @@ //! Legacy simplified Chinese encodings based on GB 2312 and GB 18030. -use index = index::gb18030; -use ranges_index = index::gb18030_ranges; +use index; use types::*; /** @@ -60,9 +59,9 @@ impl Encoder for GB18030Encoder { if ch < '\u0080' { output.write_byte(ch as u8); } else { - let ptr = index::backward(ch as u32); + let ptr = index::gb18030::backward(ch as u32); if ptr == 0xffff { - let ptr = ranges_index::backward(ch as u32); + let ptr = index::gb18030_ranges::backward(ch as u32); assert!(ptr != 0xffffffff); let (ptr, byte4) = (ptr / 10, ptr % 10); let (ptr, byte3) = (ptr / 126, ptr % 126); @@ -95,7 +94,9 @@ ascii_compatible_stateful_decoder! { module gb18030; - internal fn map_two_bytes(lead: u8, trail: u8) -> u32 { + internal pub fn map_two_bytes(lead: u8, trail: u8) -> u32 { + use index; + let lead = lead as uint; let trail = trail as uint; let index = match (lead, trail) { @@ -105,14 +106,16 @@ ascii_compatible_stateful_decoder! { } _ => 0xffff, }; - index::forward(index as u16) + index::gb18030::forward(index as u16) } - internal fn map_four_bytes(b1: u8, b2: u8, b3: u8, b4: u8) -> u32 { + internal pub fn map_four_bytes(b1: u8, b2: u8, b3: u8, b4: u8) -> u32 { + use index; + // no range check here, caller should have done all checks let index = (b1 as uint - 0x81) * 12600 + (b2 as uint - 0x30) * 1260 + (b3 as uint - 0x81) * 10 + (b4 as uint - 0x30); - ranges_index::forward(index as u32) + index::gb18030_ranges::forward(index as u32) } // gb18030 first = 0x00, gb18030 second = 0x00, gb18030 third = 0x00 diff --git a/src/encoding/codec/tradchinese.rs b/src/encoding/codec/tradchinese.rs index 44eedd8..5557df0 100644 --- a/src/encoding/codec/tradchinese.rs +++ b/src/encoding/codec/tradchinese.rs @@ -5,7 +5,7 @@ //! Legacy traditional Chinese encodings. use util::StrCharIndex; -use index = index::big5; +use index; use types::*; /** @@ -51,7 +51,7 @@ impl Encoder for BigFive2003Encoder { if ch < '\u0080' { output.write_byte(ch as u8); } else { - let ptr = index::backward(ch as u32); + let ptr = index::big5::backward(ch as u32); if ptr == 0xffff || ptr < (0xa1 - 0x81) * 157 { // no HKSCS extension (XXX doesn't HKSCS include 0xFA40..0xFEFE?) return (i, Some(CodecError { @@ -80,7 +80,9 @@ ascii_compatible_stateful_decoder! { module bigfive2003; - internal fn map_two_bytes(lead: u8, trail: u8) -> u32 { + internal pub fn map_two_bytes(lead: u8, trail: u8) -> u32 { + use index; + let lead = lead as uint; let trail = trail as uint; let index = match (lead, trail) { @@ -90,7 +92,7 @@ ascii_compatible_stateful_decoder! { } _ => 0xffff, }; - index::forward(index as u16) // may return two-letter replacements 0..3 + index::big5::forward(index as u16) // may return two-letter replacements 0..3 } // big5 lead = 0x00 diff --git a/src/encoding/util.rs b/src/encoding/util.rs index 52d2ece..8a20f8c 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -118,6 +118,10 @@ macro_rules! stateful_decoder( $(case $($inilhs:pat)|+ => $inirhs:expr;)+ final => $inifin:expr; } + $(checkpoint state $ckst:ident($ckctx:ident $(, $ckarg:ident: $ckty:ty)*) { + $(case $($cklhs:pat)|+ => $ckrhs:expr;)+ + final => $ckfin:expr; + })* $(state $st:ident($ctx:ident $(, $arg:ident: $ty:ty)*) { $(case $($lhs:pat)|+ => $rhs:expr;)+ final => $fin:expr; @@ -132,6 +136,9 @@ macro_rules! stateful_decoder( #[deriving(Eq,Clone)] pub enum State { $inist, + $( + $ckst(() $(, $ckty)*), + )* $( $st(() $(, $ty)*), )* @@ -140,64 +147,121 @@ macro_rules! stateful_decoder( impl ::std::default::Default for State { fn default() -> State { $inist } } - } - - impl $dec { - pub fn new() -> Box { box $dec { st: $stmod::$inist } as Box } - } - - impl Decoder for $dec { - fn from_self(&self) -> Box { $dec::new() } - fn is_ascii_compatible(&self) -> bool { $asciicompat } - - fn raw_feed(&mut self, input: &[u8], - output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); - - type Context<'a> = ::util::StatefulDecoderHelper<'a>; + pub mod internal { $($item)* + } + + pub mod start { + #[allow(unused_imports)] use super::internal::*; + $( + #[allow(unused_imports)] use super::transient::$st; + )* #[inline(always)] - fn $inist($inictx: &mut Context) -> Result<$stmod::State,CodecError> { + pub fn $inist($inictx: &mut ::util::StatefulDecoderHelper) + -> Result { match $inictx.read() { - None => Ok($stmod::$inist), + None => Ok(super::$inist), Some(c) => match c { $($($inilhs)|+ => $inirhs,)+ }, } } $( #[inline(always)] - fn $st($ctx: &mut Context $(, $arg: $ty)*) -> Result<$stmod::State,CodecError> { + pub fn $ckst($ckctx: &mut ::util::StatefulDecoderHelper $(, $ckarg: $ckty)*) + -> Result { + match $ckctx.read() { + None => Ok(super::$ckst(() $(, $ckarg)*)), + Some(c) => match c { $($($cklhs)|+ => $ckrhs,)+ }, + } + } + )* + } + + pub mod transient { + #[allow(unused_imports)] use super::internal::*; + + #[inline(always)] + #[allow(dead_code)] + pub fn $inist(_: &mut ::util::StatefulDecoderHelper) + -> Result { + Ok(super::$inist) // do not recurse further + } + + $( + #[inline(always)] + #[allow(dead_code)] + pub fn $ckst(_: &mut ::util::StatefulDecoderHelper $(, $ckarg: $ckty)*) + -> Result { + Ok(super::$ckst(() $(, $ckarg)*)) // do not recurse further + } + )* + + $( + #[inline(always)] + pub fn $st($ctx: &mut ::util::StatefulDecoderHelper $(, $arg: $ty)*) + -> Result { match $inictx.read() { - None => Ok($stmod::$st(() $(, $arg)*)), + None => Ok(super::$st(() $(, $arg)*)), Some(c) => match c { $($($lhs)|+ => $rhs,)+ }, } } )* + } + } + + impl $dec { + pub fn new() -> Box { box $dec { st: $stmod::$inist } as Box } + } + + impl Decoder for $dec { + fn from_self(&self) -> Box { $dec::new() } + fn is_ascii_compatible(&self) -> bool { $asciicompat } + + fn raw_feed(&mut self, input: &[u8], + output: &mut StringWriter) -> (uint, Option) { + use self::$stmod::{start, transient}; + + output.writer_hint(input.len()); let mut ctx = ::util::StatefulDecoderHelper { buf: input, pos: 0, output: output }; let mut processed = 0; + let mut st = self.st; - let st_or_err = match ::std::mem::replace(&mut self.st, $stmod::$inist) { + let st_or_err = match st { $stmod::$inist => Ok($stmod::$inist), $( - $stmod::$st(() $(, $arg)*) => $st(&mut ctx $(, $arg)*), + $stmod::$ckst(() $(, $ckarg)*) => start::$ckst(&mut ctx $(, $ckarg)*), + )* + $( + $stmod::$st(() $(, $arg)*) => transient::$st(&mut ctx $(, $arg)*), )* }; match st_or_err { - Ok($stmod::$inist) => { processed = ctx.pos; } + Ok(st_ @ $stmod::$inist) + $(| Ok(st_ @ $stmod::$ckst(..)))* => { st = st_; processed = ctx.pos; } Ok(st) => { self.st = st; return (processed, None); } Err(err) => { self.st = $stmod::$inist; return (processed, Some(err)); } } while ctx.pos < ctx.buf.len() { - match $inist(&mut ctx) { - Ok($stmod::$inist) => { processed = ctx.pos; } + let st_or_err = match st { + $stmod::$inist => start::$inist(&mut ctx), + $( + $stmod::$ckst(() $(, $ckarg)*) => start::$ckst(&mut ctx $(, $ckarg)*), + )* + _ => unreachable!(), + }; + match st_or_err { + Ok(st_ @ $stmod::$inist) + $(| Ok(st_ @ $stmod::$ckst(..)))* => { st = st_; processed = ctx.pos; } Ok(st) => { self.st = st; return (processed, None); } Err(err) => { self.st = $stmod::$inist; return (processed, Some(err)); } } } + + self.st = st; (processed, None) } @@ -239,7 +303,7 @@ macro_rules! ascii_compatible_stateful_decoder( $(internal $item)* initial state $inist($inictx) { $(case $($inilhs)|+ => $inirhs;)+ - final => $inictx.reset::<(),CodecError>(); + final => $inictx.reset(); } $(state $st($ctx $(, $arg: $ty)*) { $(case $($lhs)|+ => $rhs;)+ From 5bb98ae9d34d1d89d1d87617f270b670c6e5760a Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Mon, 12 May 2014 21:37:08 +0900 Subject: [PATCH 09/29] further DSL tweak. - the last codec error is now stored in the intermediate context, so the state machine can use a code like `ctx.err(..), S1(ctx)`. - fixed a performance regression due to the decoder generalization. the decoder performance should be on par with hand-written one (less than 10% difference) with `--opt-level=3 -Z lto` rustc flags. --- src/encoding/util.rs | 152 ++++++++++++++++++++++++------------------- 1 file changed, 84 insertions(+), 68 deletions(-) diff --git a/src/encoding/util.rs b/src/encoding/util.rs index 8a20f8c..cb2ce89 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -55,6 +55,8 @@ pub struct StatefulDecoderHelper<'a> { pub pos: uint, /// The output buffer. pub output: &'a mut types::StringWriter, + /// The last codec error. The caller will later collect this. + pub err: Option, } impl<'a> StatefulDecoderHelper<'a> { @@ -68,41 +70,48 @@ impl<'a> StatefulDecoderHelper<'a> { } /// Resets back to the initial state. + /// This should be the last expr in the rules. #[inline(always)] - pub fn reset(&self) -> Result { - Ok(Default::default()) + pub fn reset(&self) -> St { + Default::default() } - /// Writes one Unicode scalar value to the output and resets back to the initial state. + /// Writes one Unicode scalar value to the output. /// There is intentionally no check for `c`, so the caller should ensure that it's valid. + /// If this is the last expr in the rules, also resets back to the initial state. #[inline(always)] - pub fn emit(&mut self, c: u32) -> Result { + pub fn emit(&mut self, c: u32) -> St { self.output.write_char(unsafe {mem::transmute(c)}); - Ok(Default::default()) + Default::default() } - /// Writes a Unicode string to the output and resets back to the initial state. + /// Writes a Unicode string to the output. + /// If this is the last expr in the rules, also resets back to the initial state. #[inline(always)] - pub fn emit_str(&mut self, s: &str) -> Result { + pub fn emit_str(&mut self, s: &str) -> St { self.output.write_str(s); - Ok(Default::default()) + Default::default() } /// Issues a codec error with given message at the current position. + /// If this is the last expr in the rules, also resets back to the initial state. #[inline(always)] - pub fn err(&self, msg: &'static str) -> Result { - Err(types::CodecError { upto: self.pos, cause: msg.into_maybe_owned() }) + pub fn err(&mut self, msg: &'static str) -> St { + self.err = Some(types::CodecError { upto: self.pos, cause: msg.into_maybe_owned() }); + Default::default() } /// Issues a codec error with given message at the current position minus `backup` bytes. + /// If this is the last expr in the rules, also resets back to the initial state. + /// /// This should be used to implement "prepending byte to the stream" in the Encoding spec, /// which corresponds to `ctx.backup_and_err(1, ...)`. #[inline(always)] - pub fn backup_and_err(&self, backup: uint, - msg: &'static str) -> Result { + pub fn backup_and_err(&mut self, backup: uint, msg: &'static str) -> St { // XXX we should eventually handle a negative `upto` let upto = if self.pos < backup {0} else {self.pos - backup}; - Err(types::CodecError { upto: upto, cause: msg.into_maybe_owned() }) + self.err = Some(types::CodecError { upto: upto, cause: msg.into_maybe_owned() }); + Default::default() } } @@ -115,16 +124,16 @@ macro_rules! stateful_decoder( ascii_compatible $asciicompat:expr; $(internal $item:item)* // will only be visible from state functions initial state $inist:ident($inictx:ident) { - $(case $($inilhs:pat)|+ => $inirhs:expr;)+ - final => $inifin:expr; + $(case $($inilhs:pat)|+ => $($inirhs:expr),+;)+ + final => $($inifin:expr),+; } $(checkpoint state $ckst:ident($ckctx:ident $(, $ckarg:ident: $ckty:ty)*) { - $(case $($cklhs:pat)|+ => $ckrhs:expr;)+ - final => $ckfin:expr; + $(case $($cklhs:pat)|+ => $($ckrhs:expr),+;)+ + final => $($ckfin:expr),+; })* $(state $st:ident($ctx:ident $(, $arg:ident: $ty:ty)*) { - $(case $($lhs:pat)|+ => $rhs:expr;)+ - final => $fin:expr; + $(case $($lhs:pat)|+ => $($rhs:expr),+;)+ + final => $($fin:expr),+; })* ) => ( $(#[$decmeta])* @@ -145,7 +154,7 @@ macro_rules! stateful_decoder( } impl ::std::default::Default for State { - fn default() -> State { $inist } + #[inline(always)] fn default() -> State { $inist } } pub mod internal { @@ -154,26 +163,26 @@ macro_rules! stateful_decoder( pub mod start { #[allow(unused_imports)] use super::internal::*; - $( - #[allow(unused_imports)] use super::transient::$st; - )* #[inline(always)] - pub fn $inist($inictx: &mut ::util::StatefulDecoderHelper) - -> Result { + pub fn $inist($inictx: &mut ::util::StatefulDecoderHelper) -> super::State { + // prohibits all kind of recursions, including self-recursions + #[allow(unused_imports)] use super::transient::*; match $inictx.read() { - None => Ok(super::$inist), - Some(c) => match c { $($($inilhs)|+ => $inirhs,)+ }, + None => super::$inist, + Some(c) => match c { $($($inilhs)|+ => { $($inirhs);+ })+ }, } } $( #[inline(always)] - pub fn $ckst($ckctx: &mut ::util::StatefulDecoderHelper $(, $ckarg: $ckty)*) - -> Result { + pub fn $ckst($ckctx: &mut ::util::StatefulDecoderHelper + $(, $ckarg: $ckty)*) -> super::State { + // prohibits all kind of recursions, including self-recursions + #[allow(unused_imports)] use super::transient::*; match $ckctx.read() { - None => Ok(super::$ckst(() $(, $ckarg)*)), - Some(c) => match c { $($($cklhs)|+ => $ckrhs,)+ }, + None => super::$ckst(() $(, $ckarg)*), + Some(c) => match c { $($($cklhs)|+ => { $($ckrhs);+ })+ }, } } )* @@ -184,27 +193,26 @@ macro_rules! stateful_decoder( #[inline(always)] #[allow(dead_code)] - pub fn $inist(_: &mut ::util::StatefulDecoderHelper) - -> Result { - Ok(super::$inist) // do not recurse further + pub fn $inist(_: &mut ::util::StatefulDecoderHelper) -> super::State { + super::$inist // do not recurse further } $( #[inline(always)] #[allow(dead_code)] - pub fn $ckst(_: &mut ::util::StatefulDecoderHelper $(, $ckarg: $ckty)*) - -> Result { - Ok(super::$ckst(() $(, $ckarg)*)) // do not recurse further + pub fn $ckst(_: &mut ::util::StatefulDecoderHelper + $(, $ckarg: $ckty)*) -> super::State { + super::$ckst(() $(, $ckarg)*) // do not recurse further } )* $( #[inline(always)] - pub fn $st($ctx: &mut ::util::StatefulDecoderHelper $(, $arg: $ty)*) - -> Result { + pub fn $st($ctx: &mut ::util::StatefulDecoderHelper + $(, $arg: $ty)*) -> super::State { match $inictx.read() { - None => Ok(super::$st(() $(, $arg)*)), - Some(c) => match c { $($($lhs)|+ => $rhs,)+ }, + None => super::$st(() $(, $arg)*), + Some(c) => match c { $($($lhs)|+ => { $($rhs);+ })+ }, } } )* @@ -225,12 +233,14 @@ macro_rules! stateful_decoder( output.writer_hint(input.len()); - let mut ctx = ::util::StatefulDecoderHelper { buf: input, pos: 0, output: output }; + let mut ctx = ::util::StatefulDecoderHelper { + buf: input, pos: 0, output: output, err: None + }; let mut processed = 0; let mut st = self.st; - let st_or_err = match st { - $stmod::$inist => Ok($stmod::$inist), + let st_ = match st { + $stmod::$inist => $stmod::$inist, $( $stmod::$ckst(() $(, $ckarg)*) => start::$ckst(&mut ctx $(, $ckarg)*), )* @@ -238,26 +248,28 @@ macro_rules! stateful_decoder( $stmod::$st(() $(, $arg)*) => transient::$st(&mut ctx $(, $arg)*), )* }; - match st_or_err { - Ok(st_ @ $stmod::$inist) - $(| Ok(st_ @ $stmod::$ckst(..)))* => { st = st_; processed = ctx.pos; } - Ok(st) => { self.st = st; return (processed, None); } - Err(err) => { self.st = $stmod::$inist; return (processed, Some(err)); } + match (ctx.err.take(), st_) { + (None, $stmod::$inist) $(| (None, $stmod::$ckst(..)))* => + { st = st_; processed = ctx.pos; } + // XXX splitting the match case improves the performance somehow, but why? + (None, _) => { self.st = st_; return (processed, None); } + (Some(err), _) => { self.st = st_; return (processed, Some(err)); } } while ctx.pos < ctx.buf.len() { - let st_or_err = match st { + let st_ = match st { $stmod::$inist => start::$inist(&mut ctx), $( $stmod::$ckst(() $(, $ckarg)*) => start::$ckst(&mut ctx $(, $ckarg)*), )* _ => unreachable!(), }; - match st_or_err { - Ok(st_ @ $stmod::$inist) - $(| Ok(st_ @ $stmod::$ckst(..)))* => { st = st_; processed = ctx.pos; } - Ok(st) => { self.st = st; return (processed, None); } - Err(err) => { self.st = $stmod::$inist; return (processed, Some(err)); } + match (ctx.err.take(), st_) { + (None, $stmod::$inist) $(| (None, $stmod::$ckst(..)))* => + { st = st_; processed = ctx.pos; } + // XXX splitting the match case improves the performance somehow, but why? + (None, _) => { self.st = st_; return (processed, None); } + (Some(err), _) => { self.st = st_; return (processed, Some(err)); } } } @@ -267,15 +279,19 @@ macro_rules! stateful_decoder( fn raw_finish(&mut self, output: &mut StringWriter) -> Option { #![allow(unused_mut, unused_variable)] - let mut ctx = ::util::StatefulDecoderHelper { buf: &[], pos: 0, output: output }; - let st_or_err: Result<(),CodecError> = - match ::std::mem::replace(&mut self.st, $stmod::$inist) { - $stmod::$inist => { let mut $inictx = ctx; $inifin }, - $( - $stmod::$st(() $(, $arg)*) => { let mut $ctx = ctx; $fin }, - )* - }; - st_or_err.err() + let mut ctx = ::util::StatefulDecoderHelper { + buf: &[], pos: 0, output: output, err: None + }; + self.st = match ::std::mem::replace(&mut self.st, $stmod::$inist) { + $stmod::$inist => { let $inictx = &mut ctx; $($inifin);+ }, + $( + $stmod::$ckst(() $(, $ckarg)*) => { let $ckctx = &mut ctx; $($ckfin);+ }, + )* + $( + $stmod::$st(() $(, $arg)*) => { let $ctx = &mut ctx; $($fin);+ }, + )* + }; + ctx.err.take() } } ) @@ -289,10 +305,10 @@ macro_rules! ascii_compatible_stateful_decoder( module $stmod:ident; // should be unique from other existing identifiers $(internal $item:item)* // will only be visible from state functions initial state $inist:ident($inictx:ident) { - $(case $($inilhs:pat)|+ => $inirhs:expr;)+ + $(case $($inilhs:pat)|+ => $($inirhs:expr),+;)+ } $(state $st:ident($ctx:ident $(, $arg:ident: $ty:ty)*) { - $(case $($lhs:pat)|+ => $rhs:expr;)+ + $(case $($lhs:pat)|+ => $($rhs:expr),+;)+ })* ) => ( stateful_decoder!( @@ -302,11 +318,11 @@ macro_rules! ascii_compatible_stateful_decoder( ascii_compatible true; $(internal $item)* initial state $inist($inictx) { - $(case $($inilhs)|+ => $inirhs;)+ + $(case $($inilhs)|+ => $($inirhs),+;)+ final => $inictx.reset(); } $(state $st($ctx $(, $arg: $ty)*) { - $(case $($lhs)|+ => $rhs;)+ + $(case $($lhs)|+ => $($rhs),+;)+ final => $ctx.err("incomplete sequence"); })* ) From fff2b39ffd65f170ef7d6328efd4eede6e299ef0 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Tue, 13 May 2014 02:45:43 +0900 Subject: [PATCH 10/29] generic context methods are no longer necessary; eliminated them. --- src/encoding/codec/japanese.rs | 34 ++++++++++--------------------- src/encoding/codec/korean.rs | 10 +++------ src/encoding/codec/simpchinese.rs | 20 ++++++------------ src/encoding/codec/tradchinese.rs | 22 +++++++++----------- src/encoding/util.rs | 33 +++++++++++++++--------------- 5 files changed, 46 insertions(+), 73 deletions(-) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index 6604477..a59b70b 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -137,14 +137,10 @@ ascii_compatible_stateful_decoder! { // euc-jp lead != 0x00, euc-jp jis0212 flag = unset // JIS X 0208 two-byte sequence state S3(ctx, lead: u8) { - case b @ 0xa1..0xfe => { - let ch = map_two_0208_bytes(lead, b); - if ch == 0xffff { - // do NOT backup, we only backup for out-of-range trails. - ctx.err("invalid sequence") - } else { - ctx.emit(ch as u32) - } + case b @ 0xa1..0xfe => match map_two_0208_bytes(lead, b) { + // do NOT backup, we only backup for out-of-range trails. + 0xffff => ctx.err("invalid sequence"), + ch => ctx.emit(ch as u32) }; case _ => ctx.backup_and_err(1, "invalid sequence"); } @@ -152,14 +148,10 @@ ascii_compatible_stateful_decoder! { // euc-jp lead != 0x00, euc-jp jis0212 flag = set // JIS X 0212 three-byte sequence state S4(ctx, lead: u8) { - case b @ 0xa1..0xfe => { - let ch = map_two_0212_bytes(lead, b); - if ch == 0xffff { - // do NOT backup, we only backup for out-of-range trails. - ctx.err("invalid sequence") - } else { - ctx.emit(ch as u32) - } + case b @ 0xa1..0xfe => match map_two_0212_bytes(lead, b) { + // do NOT backup, we only backup for out-of-range trails. + 0xffff => ctx.err("invalid sequence"), + ch => ctx.emit(ch as u32) }; case _ => ctx.backup_and_err(1, "invalid sequence"); } @@ -341,13 +333,9 @@ ascii_compatible_stateful_decoder! { // shift_jis lead != 0x00 state S1(ctx, lead: u8) { - case b => { - let ch = map_two_0208_bytes(lead, b); - if ch == 0xffff { - ctx.backup_and_err(1, "invalid sequence") // unconditional - } else { - ctx.emit(ch) - } + case b => match map_two_0208_bytes(lead, b) { + 0xffff => ctx.backup_and_err(1, "invalid sequence"), // unconditional + ch => ctx.emit(ch) }; } } diff --git a/src/encoding/codec/korean.rs b/src/encoding/codec/korean.rs index 7254a36..e4546a6 100644 --- a/src/encoding/codec/korean.rs +++ b/src/encoding/codec/korean.rs @@ -111,13 +111,9 @@ ascii_compatible_stateful_decoder! { // euc-kr lead != 0x00 state S1(ctx, lead: u8) { - case b => { - let ch = map_two_bytes(lead, b); - if ch == 0xffff { - ctx.backup_and_err(1, "invalid sequence") // unconditional - } else { - ctx.emit(ch as u32) - } + case b => match map_two_bytes(lead, b) { + 0xffff => ctx.backup_and_err(1, "invalid sequence"), // unconditional + ch => ctx.emit(ch as u32) }; } } diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index a9e12a0..14e2de9 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -129,13 +129,9 @@ ascii_compatible_stateful_decoder! { // gb18030 first != 0x00, gb18030 second = 0x00, gb18030 third = 0x00 state S1(ctx, first: u8) { case b @ 0x30..0x39 => S2(ctx, first, b); - case b => { - let ch = map_two_bytes(first, b); - if ch == 0xffff { - ctx.backup_and_err(1, "invalid sequence") // unconditional - } else { - ctx.emit(ch) - } + case b => match map_two_bytes(first, b) { + 0xffff => ctx.backup_and_err(1, "invalid sequence"), // unconditional + ch => ctx.emit(ch) }; } @@ -147,13 +143,9 @@ ascii_compatible_stateful_decoder! { // gb18030 first != 0x00, gb18030 second != 0x00, gb18030 third != 0x00 state S3(ctx, first: u8, second: u8, third: u8) { - case b @ 0x30..0x39 => { - let ch = map_four_bytes(first, second, third, b); - if ch == 0xffffffff { - ctx.backup_and_err(3, "invalid sequence") // unconditional - } else { - ctx.emit(ch) - } + case b @ 0x30..0x39 => match map_four_bytes(first, second, third, b) { + 0xffffffff => ctx.backup_and_err(3, "invalid sequence"), // unconditional + ch => ctx.emit(ch) }; case _ => ctx.backup_and_err(3, "invalid sequence"); } diff --git a/src/encoding/codec/tradchinese.rs b/src/encoding/codec/tradchinese.rs index 5557df0..68d4e2e 100644 --- a/src/encoding/codec/tradchinese.rs +++ b/src/encoding/codec/tradchinese.rs @@ -104,18 +104,16 @@ ascii_compatible_stateful_decoder! { // big5 lead != 0x00 state S1(ctx, lead: u8) { - case b => { - match map_two_bytes(lead, b) { - 0xffff => { - let backup = if b < 0x80 {1} else {0}; - ctx.backup_and_err(backup, "invalid sequence") - }, - 0 /*index=1133*/ => ctx.emit_str("\u00ca\u0304"), - 1 /*index=1135*/ => ctx.emit_str("\u00ca\u030c"), - 2 /*index=1164*/ => ctx.emit_str("\u00ea\u0304"), - 3 /*index=1166*/ => ctx.emit_str("\u00ea\u030c"), - ch => ctx.emit(ch), - } + case b => match map_two_bytes(lead, b) { + 0xffff => { + let backup = if b < 0x80 {1} else {0}; + ctx.backup_and_err(backup, "invalid sequence") + }, + 0 /*index=1133*/ => ctx.emit_str("\u00ca\u0304"), + 1 /*index=1135*/ => ctx.emit_str("\u00ca\u030c"), + 2 /*index=1164*/ => ctx.emit_str("\u00ea\u0304"), + 3 /*index=1166*/ => ctx.emit_str("\u00ea\u030c"), + ch => ctx.emit(ch), }; } } diff --git a/src/encoding/util.rs b/src/encoding/util.rs index cb2ce89..a64eaa4 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -48,7 +48,7 @@ impl<'r> StrCharIndex<'r> for &'r str { } /// A helper struct for the stateful decoder DSL. -pub struct StatefulDecoderHelper<'a> { +pub struct StatefulDecoderHelper<'a, St> { /// The current buffer. pub buf: &'a [u8], /// The current index to the buffer. @@ -59,7 +59,7 @@ pub struct StatefulDecoderHelper<'a> { pub err: Option, } -impl<'a> StatefulDecoderHelper<'a> { +impl<'a, St:Default> StatefulDecoderHelper<'a, St> { /// Reads one byte from the buffer if any. #[inline(always)] pub fn read(&mut self) -> Option { @@ -72,7 +72,7 @@ impl<'a> StatefulDecoderHelper<'a> { /// Resets back to the initial state. /// This should be the last expr in the rules. #[inline(always)] - pub fn reset(&self) -> St { + pub fn reset(&self) -> St { Default::default() } @@ -80,7 +80,7 @@ impl<'a> StatefulDecoderHelper<'a> { /// There is intentionally no check for `c`, so the caller should ensure that it's valid. /// If this is the last expr in the rules, also resets back to the initial state. #[inline(always)] - pub fn emit(&mut self, c: u32) -> St { + pub fn emit(&mut self, c: u32) -> St { self.output.write_char(unsafe {mem::transmute(c)}); Default::default() } @@ -88,7 +88,7 @@ impl<'a> StatefulDecoderHelper<'a> { /// Writes a Unicode string to the output. /// If this is the last expr in the rules, also resets back to the initial state. #[inline(always)] - pub fn emit_str(&mut self, s: &str) -> St { + pub fn emit_str(&mut self, s: &str) -> St { self.output.write_str(s); Default::default() } @@ -96,7 +96,7 @@ impl<'a> StatefulDecoderHelper<'a> { /// Issues a codec error with given message at the current position. /// If this is the last expr in the rules, also resets back to the initial state. #[inline(always)] - pub fn err(&mut self, msg: &'static str) -> St { + pub fn err(&mut self, msg: &'static str) -> St { self.err = Some(types::CodecError { upto: self.pos, cause: msg.into_maybe_owned() }); Default::default() } @@ -107,7 +107,7 @@ impl<'a> StatefulDecoderHelper<'a> { /// This should be used to implement "prepending byte to the stream" in the Encoding spec, /// which corresponds to `ctx.backup_and_err(1, ...)`. #[inline(always)] - pub fn backup_and_err(&mut self, backup: uint, msg: &'static str) -> St { + pub fn backup_and_err(&mut self, backup: uint, msg: &'static str) -> St { // XXX we should eventually handle a negative `upto` let upto = if self.pos < backup {0} else {self.pos - backup}; self.err = Some(types::CodecError { upto: upto, cause: msg.into_maybe_owned() }); @@ -158,14 +158,16 @@ macro_rules! stateful_decoder( } pub mod internal { + pub type Context<'a> = ::util::StatefulDecoderHelper<'a, super::State>; + $($item)* } pub mod start { - #[allow(unused_imports)] use super::internal::*; + use super::internal::*; #[inline(always)] - pub fn $inist($inictx: &mut ::util::StatefulDecoderHelper) -> super::State { + pub fn $inist($inictx: &mut Context) -> super::State { // prohibits all kind of recursions, including self-recursions #[allow(unused_imports)] use super::transient::*; match $inictx.read() { @@ -176,8 +178,7 @@ macro_rules! stateful_decoder( $( #[inline(always)] - pub fn $ckst($ckctx: &mut ::util::StatefulDecoderHelper - $(, $ckarg: $ckty)*) -> super::State { + pub fn $ckst($ckctx: &mut Context $(, $ckarg: $ckty)*) -> super::State { // prohibits all kind of recursions, including self-recursions #[allow(unused_imports)] use super::transient::*; match $ckctx.read() { @@ -189,27 +190,25 @@ macro_rules! stateful_decoder( } pub mod transient { - #[allow(unused_imports)] use super::internal::*; + use super::internal::*; #[inline(always)] #[allow(dead_code)] - pub fn $inist(_: &mut ::util::StatefulDecoderHelper) -> super::State { + pub fn $inist(_: &mut Context) -> super::State { super::$inist // do not recurse further } $( #[inline(always)] #[allow(dead_code)] - pub fn $ckst(_: &mut ::util::StatefulDecoderHelper - $(, $ckarg: $ckty)*) -> super::State { + pub fn $ckst(_: &mut Context $(, $ckarg: $ckty)*) -> super::State { super::$ckst(() $(, $ckarg)*) // do not recurse further } )* $( #[inline(always)] - pub fn $st($ctx: &mut ::util::StatefulDecoderHelper - $(, $arg: $ty)*) -> super::State { + pub fn $st($ctx: &mut Context $(, $arg: $ty)*) -> super::State { match $inictx.read() { None => super::$st(() $(, $arg)*), Some(c) => match c { $($($lhs)|+ => { $($rhs);+ })+ }, From f6b2ab9cda2b0f10def9c414024071504f98b94e Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Tue, 13 May 2014 02:48:22 +0900 Subject: [PATCH 11/29] added ISO-2022-JP support. --- README.md | 3 +- src/encoding/all.rs | 1 + src/encoding/codec/japanese.rs | 356 +++++++++++++++++++++++++++++++++ src/encoding/label.rs | 4 - 4 files changed, 359 insertions(+), 5 deletions(-) diff --git a/README.md b/README.md index 62b0c12..cb1570c 100644 --- a/README.md +++ b/README.md @@ -94,7 +94,8 @@ Rust-encoding is a work in progress and this list will certainly be updated. * Windows code page 949 (`euc-kr`, since the strict EUC-KR is hardly used) * EUC-JP and Windows code page 932 (`shift_jis`, since it's the most widespread extension to Shift_JIS) - * GB 18030 and its GBK subset + * ISO-2022-JP with asymmetric JIS X 0212 support + * GB 18030 * Big5-2003 with HKSCS-2008 extensions * ISO 8859-1 (distinct from Windows code page 1252) diff --git a/src/encoding/all.rs b/src/encoding/all.rs index adbee69..408fb1e 100644 --- a/src/encoding/all.rs +++ b/src/encoding/all.rs @@ -67,6 +67,7 @@ unique!(var=UTF_16BE, mod=codec::utf_16, val=UTF16BEEncoding) unique!(var=WINDOWS_949, mod=codec::korean, val=Windows949Encoding) unique!(var=EUC_JP, mod=codec::japanese, val=EUCJPEncoding) unique!(var=WINDOWS_31J, mod=codec::japanese, val=Windows31JEncoding) +unique!(var=ISO_2022_JP, mod=codec::japanese, val=ISO2022JPEncoding) unique!(var=GB18030, mod=codec::simpchinese, val=GB18030Encoding) unique!(var=BIG5_2003, mod=codec::tradchinese, val=BigFive2003Encoding) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index a59b70b..dd368c1 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -426,3 +426,359 @@ mod windows31j_tests { } } +/** + * ISO-2022-JP. + * + * This version of ISO-2022-JP does not correspond to any standardized repertoire of character sets + * due to the widespread implementation differences. The following character sets are supported: + * + * - JIS X 0201-1976 roman (`ESC ( J` or `ESC ( B`; the latter is originally allocated to ASCII + * but willfully violated) + * - JIS X 0201-1976 kana (`ESC ( I`) + * - JIS X 0208-1983 (`ESC $ B` or `ESC $ @`; the latter is originally allocated to JIS X 0208-1978 + * but willfully violated) + * - JIS X 0212-1990 (`ESC $ ( D`, XXX asymmetric support) + */ +#[deriving(Clone)] +pub struct ISO2022JPEncoding; + +impl Encoding for ISO2022JPEncoding { + fn name(&self) -> &'static str { "iso-2022-jp" } + fn whatwg_name(&self) -> Option<&'static str> { Some("iso-2022-jp") } + fn encoder(&self) -> Box { ISO2022JPEncoder::new() } + fn decoder(&self) -> Box { ISO2022JPDecoder::new() } +} + +#[deriving(Eq,Clone)] +enum ISO2022JPState { + ASCII, // U+0000..007F, U+00A5, U+203E + Katakana, // JIS X 0201: U+FF61..FF9F + Lead, // JIS X 0208 +} + +/// An encoder for ISO-2022-JP without JIS X 0212/0213 support. +#[deriving(Clone)] +pub struct ISO2022JPEncoder { + st: ISO2022JPState +} + +impl ISO2022JPEncoder { + pub fn new() -> Box { box ISO2022JPEncoder { st: ASCII } as Box } +} + +impl Encoder for ISO2022JPEncoder { + fn from_self(&self) -> Box { ISO2022JPEncoder::new() } + fn is_ascii_compatible(&self) -> bool { true } + + fn raw_feed(&mut self, input: &str, output: &mut ByteWriter) -> (uint, Option) { + output.writer_hint(input.len()); + + let mut st = self.st; + macro_rules! ensure_ASCII( + () => (if st != ASCII { output.write_bytes(bytes!("\x1b(B")); st = ASCII; }) + ) + macro_rules! ensure_Katakana( + () => (if st != Katakana { output.write_bytes(bytes!("\x1b(I")); st = Katakana; }) + ) + macro_rules! ensure_Lead( + () => (if st != Lead { output.write_bytes(bytes!("\x1b$B")); st = Lead; }) + ) + + for ((i,j), ch) in input.index_iter() { + match ch { + '\u0000'..'\u007f' => { ensure_ASCII!(); output.write_byte(ch as u8); } + '\u00a5' => { ensure_ASCII!(); output.write_byte(0x5c); } + '\u203e' => { ensure_ASCII!(); output.write_byte(0x7e); } + '\uff61'..'\uff9f' => { + ensure_Katakana!(); + output.write_byte((ch as uint - 0xff61 + 0x21) as u8); + } + _ => { + let ptr = index::jis0208::backward(ch as u32); + if ptr == 0xffff { + self.st = st; // do NOT reset the state! + return (i, Some(CodecError { + upto: j, cause: "unrepresentable character".into_maybe_owned() + })); + } else { + ensure_Lead!(); + let lead = ptr / 94 + 0x21; + let trail = ptr % 94 + 0x21; + output.write_byte(lead as u8); + output.write_byte(trail as u8); + } + } + } + } + + self.st = st; + (input.len(), None) + } + + fn raw_finish(&mut self, _output: &mut ByteWriter) -> Option { + None + } +} + +stateful_decoder! { + #[doc="A decoder for ISO-2022-JP with JIS X 0212 support."] + #[deriving(Clone)] + struct ISO2022JPDecoder; + + module iso2022jp; + + ascii_compatible false; + + internal pub fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + use index; + + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0x21..0x7e, 0x21..0x7e) => (lead - 0x21) * 94 + trail - 0x21, + _ => 0xffff, + }; + index::jis0208::forward(index as u16) + } + + internal pub fn map_two_0212_bytes(lead: u8, trail: u8) -> u32 { + use index; + + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0x21..0x7e, 0x21..0x7e) => (lead - 0x21) * 94 + trail - 0x21, + _ => 0xffff, + }; + index::jis0212::forward(index as u16) + } + + // iso-2022-jp state = ASCII, iso-2022-jp jis0212 flag = unset, iso-2022-jp lead = 0x00 + initial state ASCII(ctx) { + case 0x1b => EscapeStart(ctx); + case b @ 0x00..0x7f => ctx.emit(b as u32), ASCII(ctx); + case _ => ctx.err("invalid sequence"), ASCII(ctx); + final => ctx.reset(); + } + + // iso-2022-jp state = Lead, iso-2022-jp jis0212 flag = unset + checkpoint state Lead0208(ctx) { + case 0x0a => ctx.emit(0x000a); // return to ASCII + case 0x1b => EscapeStart(ctx); + case b => Trail0208(ctx, b); + final => ctx.reset(); + } + + // iso-2022-jp state = Lead, iso-2022-jp jis0212 flag = set + checkpoint state Lead0212(ctx) { + case 0x0a => ctx.emit(0x000a); // return to ASCII + case 0x1b => EscapeStart(ctx); + case b => Trail0212(ctx, b); + final => ctx.reset(); + } + + // iso-2022-jp state = Katakana + checkpoint state Katakana(ctx) { + case 0x1b => EscapeStart(ctx); + case b @ 0x21..0x5f => ctx.emit(0xff61 + b as u32 - 0x21), Katakana(ctx); + case _ => ctx.err("invalid sequence"), Katakana(ctx); + final => ctx.reset(); + } + + // iso-2022-jp state = EscapeStart + // ESC + state EscapeStart(ctx) { + case 0x24 => EscapeMiddle24(ctx); // ESC $ + case 0x28 => EscapeMiddle28(ctx); // ESC ( + case _ => ctx.backup_and_err(1, "invalid sequence"); + final => ctx.err("incomplete sequence"); + } + + // iso-2022-jp state = EscapeMiddle, iso-2022-jp lead = 0x24 + // ESC $ + state EscapeMiddle24(ctx) { + case 0x40 | 0x42 => Lead0208(ctx); // ESC $ @ (JIS X 0208-1978) or ESC $ B (-1983) + case 0x28 => EscapeFinal(ctx); // ESC $ ( + case _ => ctx.backup_and_err(2, "invalid sequence"); + final => ctx.err("incomplete sequence"); + } + + // iso-2022-jp state = EscapeMiddle, iso-2022-jp lead = 0x28 + // ESC ( + state EscapeMiddle28(ctx) { + case 0x42 | 0x4a => ctx.reset(); // ESC ( B (ASCII) or ESC ( J (JIS X 0201-1976 roman) + case 0x49 => Katakana(ctx); // ESC ( I (JIS X 0201-1976 kana) + case _ => ctx.backup_and_err(2, "invalid sequence"); + final => ctx.err("incomplete sequence"); + } + + // iso-2022-jp state = EscapeFinal + // ESC $ ( + state EscapeFinal(ctx) { + case 0x44 => Lead0212(ctx); // ESC $ ( D (JIS X 0212-1990) + case _ => ctx.backup_and_err(3, "invalid sequence"); + final => ctx.backup_and_err(1, "incomplete sequence"); + } + + // iso-2022-jp state = Trail, iso-2022-jp jis0212 flag = unset + state Trail0208(ctx, lead: u8) { + case b => + match map_two_0208_bytes(lead, b) { + 0xffff => ctx.err("invalid sequence"), + ch => ctx.emit(ch as u32) + }, + Lead0208(ctx); + final => ctx.err("incomplete sequence"); + } + + // iso-2022-jp state = Trail, iso-2022-jp jis0212 flag = set + state Trail0212(ctx, lead: u8) { + case b => + match map_two_0212_bytes(lead, b) { + 0xffff => ctx.err("invalid sequence"), + ch => ctx.emit(ch as u32) + }, + Lead0212(ctx); + final => ctx.err("incomplete sequence"); + } +} + +#[cfg(test)] +mod iso2022jp_tests { + extern crate test; + use super::ISO2022JPEncoding; + use testutils; + use types::*; + + #[test] + fn test_encoder_valid() { + let mut e = ISO2022JPEncoding.encoder(); + assert_feed_ok!(e, "A", "", [0x41]); + assert_feed_ok!(e, "BC", "", [0x42, 0x43]); + assert_feed_ok!(e, "", "", []); + assert_feed_ok!(e, "\u00a5", "", [0x5c]); + assert_feed_ok!(e, "\u203e", "", [0x7e]); + assert_feed_ok!(e, "\u306b\u307b\u3093", "", [0x1b, 0x24, 0x42, + 0x24, 0x4b, 0x24, 0x5b, 0x24, 0x73]); + assert_feed_ok!(e, "\u65e5\u672c", "", [0x46, 0x7c, 0x4b, 0x5c]); + assert_feed_ok!(e, "\uff86\uff8e\uff9d", "", [0x1b, 0x28, 0x49, + 0x46, 0x4e, 0x5d]); + assert_feed_ok!(e, "XYZ", "", [0x1b, 0x28, 0x42, + 0x58, 0x59, 0x5a]); + assert_finish_ok!(e, []); + + // one ASCII character and two similarly looking characters: + // - A: U+0020 SPACE (requires ASCII state) + // - B: U+30CD KATAKANA LETTER NE (requires JIS X 0208 Lead state) + // - C: U+FF88 HALFWIDTH KATAKANA LETTER NE (requires Katakana state) + // - D is omitted as the encoder does not support JIS X 0212. + // a (3,2) De Bruijn near-sequence "ABCACBA" is used to test all possible cases. + static Ad: &'static str = "\x20"; + static Bd: &'static str = "\u30cd"; + static Cd: &'static str = "\uff88"; + static Ae: &'static [u8] = &[0x1b, 0x28, 0x42, 0x20]; + static Be: &'static [u8] = &[0x1b, 0x24, 0x42, 0x25, 0x4d]; + static Ce: &'static [u8] = &[0x1b, 0x28, 0x49, 0x48]; + let mut e = ISO2022JPEncoding.encoder(); + let decoded = [ "\x20", Bd, Cd, Ad, Cd, Bd, Ad].concat(); + let encoded = [&[0x20], Be, Ce, Ae, Ce, Be, Ae].concat_vec(); + assert_feed_ok!(e, decoded.as_slice(), "", encoded.as_slice()); + assert_finish_ok!(e, []); + } + + #[test] + fn test_encoder_invalid() { + let mut e = ISO2022JPEncoding.encoder(); + assert_feed_err!(e, "", "\uffff", "", []); + assert_feed_err!(e, "?", "\uffff", "!", [0x3f]); + // JIS X 0212 is not supported in the encoder + assert_feed_err!(e, "", "\u736c", "\u8c78", []); + assert_finish_ok!(e, []); + } + + #[test] + fn test_decoder_valid() { + let mut d = ISO2022JPEncoding.decoder(); + assert_feed_ok!(d, [0x41], [], "A"); + assert_feed_ok!(d, [0x42, 0x43], [], "BC"); + assert_feed_ok!(d, [0x1b, 0x28, 0x4a, + 0x44, 0x45, 0x46], [], "DEF"); + assert_feed_ok!(d, [], [], ""); + assert_feed_ok!(d, [0x5c], [], "\\"); + assert_feed_ok!(d, [0x7e], [], "~"); + assert_feed_ok!(d, [0x1b, 0x24, 0x42, + 0x24, 0x4b, + 0x1b, 0x24, 0x42, + 0x24, 0x5b, 0x24, 0x73], [], "\u306b\u307b\u3093"); + assert_feed_ok!(d, [0x46, 0x7c, 0x4b, 0x5c], [], "\u65e5\u672c"); + assert_feed_ok!(d, [0x1b, 0x28, 0x49, + 0x46, 0x4e, 0x5d], [], "\uff86\uff8e\uff9d"); + assert_feed_ok!(d, [0x1b, 0x24, 0x28, 0x44, + 0x4b, 0x46, + 0x1b, 0x24, 0x40, + 0x6c, 0x38], [], "\u736c\u8c78"); + assert_feed_ok!(d, [0x1b, 0x28, 0x42, + 0x58, 0x59, 0x5a], [], "XYZ"); + assert_finish_ok!(d, ""); + + let mut d = ISO2022JPEncoding.decoder(); + assert_feed_ok!(d, [0x1b, 0x24, 0x42, + 0x24, 0x4b, 0x24, 0x5b, 0x24, 0x73], [], "\u306b\u307b\u3093"); + assert_finish_ok!(d, ""); + + let mut d = ISO2022JPEncoding.decoder(); + assert_feed_ok!(d, [0x1b, 0x28, 0x49, + 0x46, 0x4e, 0x5d], [], "\uff86\uff8e\uff9d"); + assert_finish_ok!(d, ""); + + let mut d = ISO2022JPEncoding.decoder(); + assert_feed_ok!(d, [0x1b, 0x24, 0x28, 0x44, + 0x4b, 0x46], [], "\u736c"); + assert_finish_ok!(d, ""); + + // one ASCII character and three similarly looking characters: + // - A: U+0020 SPACE (requires ASCII state) + // - B: U+30CD KATAKANA LETTER NE (requires JIS X 0208 Lead state) + // - C: U+FF88 HALFWIDTH KATAKANA LETTER NE (requires Katakana state) + // - D: U+793B CJK UNIFIED IDEOGRAPH-793B (requires JIS X 0212 Lead state) + // a (4,2) De Bruijn sequence "AABBCCACBADDBDCDA" is used to test all possible cases. + static Ad: &'static str = "\x20"; + static Bd: &'static str = "\u30cd"; + static Cd: &'static str = "\uff88"; + static Dd: &'static str = "\u793b"; + static Ae: &'static [u8] = &[0x1b, 0x28, 0x42, 0x20]; + static Be: &'static [u8] = &[0x1b, 0x24, 0x42, 0x25, 0x4d]; + static Ce: &'static [u8] = &[0x1b, 0x28, 0x49, 0x48]; + static De: &'static [u8] = &[0x1b, 0x24, 0x28, 0x44, 0x50, 0x4b]; + let mut d = ISO2022JPEncoding.decoder(); + let decoded = [ "\x20",Ad,Bd,Bd,Cd,Cd,Ad,Cd,Bd,Ad,Dd,Dd,Bd,Dd,Cd,Dd,Ad].concat(); + let encoded = [&[0x20],Ae,Be,Be,Ce,Ce,Ae,Ce,Be,Ae,De,De,Be,De,Ce,De,Ae].concat_vec(); + assert_feed_ok!(d, encoded.as_slice(), [], decoded.as_slice()); + assert_finish_ok!(d, ""); + } + + // TODO more tests + + #[test] + fn test_decoder_feed_after_finish() { + let mut d = ISO2022JPEncoding.decoder(); + assert_feed_ok!(d, [0x24, 0x22, + 0x1b, 0x24, 0x42, + 0x24, 0x22], [0x24], "\x24\x22\u3042"); + assert_finish_err!(d, ""); + assert_feed_ok!(d, [0x24, 0x22, + 0x1b, 0x24, 0x42, + 0x24, 0x22], [], "\x24\x22\u3042"); + assert_finish_ok!(d, ""); + } + + #[bench] + fn bench_decode_short_text(bencher: &mut test::Bencher) { + static Encoding: ISO2022JPEncoding = ISO2022JPEncoding; + let s = Encoding.encode(testutils::JAPANESE_TEXT, EncodeStrict).ok().unwrap(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); + }) + } +} diff --git a/src/encoding/label.rs b/src/encoding/label.rs index 4d0d37f..0dc6a31 100644 --- a/src/encoding/label.rs +++ b/src/encoding/label.rs @@ -238,11 +238,9 @@ pub fn encoding_from_whatwg_label(label: &str) -> Option { "euc-jp" | "x-euc-jp" => Some(all::EUC_JP as EncodingRef), - /* "csiso2022jp" | "iso-2022-jp" => Some(all::ISO_2022_JP as EncodingRef), - */ "csshiftjis" | "ms_kanji" | "shift-jis" | @@ -316,9 +314,7 @@ pub fn encoding_from_windows_code_page(cp: uint) -> Option { */ 950 => Some(all::BIG5_2003 as EncodingRef), 20932 => Some(all::EUC_JP as EncodingRef), - /* 50220 => Some(all::ISO_2022_JP as EncodingRef), - */ 932 => Some(all::WINDOWS_31J as EncodingRef), 949 => Some(all::WINDOWS_949 as EncodingRef), 1201 => Some(all::UTF_16BE as EncodingRef), From b5bdc62d2582388f043600bb07efc75280146260 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Tue, 13 May 2014 13:39:45 +0900 Subject: [PATCH 12/29] added HZ encoding. this completes support for all WHATWG encodings. --- README.md | 3 +- src/encoding/all.rs | 1 + src/encoding/codec/simpchinese.rs | 227 ++++++++++++++++++++++++++++++ src/encoding/label.rs | 8 +- 4 files changed, 232 insertions(+), 7 deletions(-) diff --git a/README.md b/README.md index cb1570c..4ad6992 100644 --- a/README.md +++ b/README.md @@ -90,12 +90,13 @@ Rust-encoding is a work in progress and this list will certainly be updated. * MacRoman (`macintosh`), Macintosh Cyrillic encoding (`x-mac-cyrillic`) * Windows code page 874, 1250, 1251, 1252 (instead of ISO-8859-1), 1253, 1254 (instead of ISO-8859-9), 1255, 1256, 1257, 1258 -* Multi byte encodings in WHATWG Encoding Standard: +* All multi byte encodings in WHATWG Encoding Standard: * Windows code page 949 (`euc-kr`, since the strict EUC-KR is hardly used) * EUC-JP and Windows code page 932 (`shift_jis`, since it's the most widespread extension to Shift_JIS) * ISO-2022-JP with asymmetric JIS X 0212 support * GB 18030 + * HZ * Big5-2003 with HKSCS-2008 extensions * ISO 8859-1 (distinct from Windows code page 1252) diff --git a/src/encoding/all.rs b/src/encoding/all.rs index 408fb1e..e9271ab 100644 --- a/src/encoding/all.rs +++ b/src/encoding/all.rs @@ -69,6 +69,7 @@ unique!(var=EUC_JP, mod=codec::japanese, val=EUCJPEncoding) unique!(var=WINDOWS_31J, mod=codec::japanese, val=Windows31JEncoding) unique!(var=ISO_2022_JP, mod=codec::japanese, val=ISO2022JPEncoding) unique!(var=GB18030, mod=codec::simpchinese, val=GB18030Encoding) +unique!(var=HZ, mod=codec::simpchinese, val=HZEncoding) unique!(var=BIG5_2003, mod=codec::tradchinese, val=BigFive2003Encoding) pub mod whatwg { diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index 14e2de9..3e3f4f0 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -4,6 +4,7 @@ //! Legacy simplified Chinese encodings based on GB 2312 and GB 18030. +use util::StrCharIndex; use index; use types::*; @@ -249,3 +250,229 @@ mod gb18030_tests { } } +/** + * HZ. (RFC 1843) + * + * This is a simplified Chinese encoding based on GB 2312. + * It bears a resemblance to ISO 2022 encodings in such that the printable escape sequences `~{` + * and `~}` are used to delimit a sequence of 7-bit-safe GB 2312 sequences. For the comparison, + * they are equivalent to ISO-2022-CN escape sequences `ESC $ ) A` and `ESC ( B`. + * Additional escape sequences `~~` (for a literal `~`) and `~\n` (ignored) are also supported. + */ +#[deriving(Clone)] +pub struct HZEncoding; + +impl Encoding for HZEncoding { + fn name(&self) -> &'static str { "hz" } + fn whatwg_name(&self) -> Option<&'static str> { Some("hz-gb-2312") } + fn encoder(&self) -> Box { HZEncoder::new() } + fn decoder(&self) -> Box { HZDecoder::new() } +} + +/// An encoder for HZ. +#[deriving(Clone)] +pub struct HZEncoder { + escaped: bool, +} + +impl HZEncoder { + pub fn new() -> Box { box HZEncoder { escaped: false } as Box } +} + +impl Encoder for HZEncoder { + fn from_self(&self) -> Box { HZEncoder::new() } + fn is_ascii_compatible(&self) -> bool { false } + + fn raw_feed(&mut self, input: &str, output: &mut ByteWriter) -> (uint, Option) { + output.writer_hint(input.len()); + + let mut escaped = self.escaped; + macro_rules! ensure_escaped( + () => (if !escaped { output.write_bytes(bytes!("~{")); escaped = true; }) + ) + macro_rules! ensure_unescaped( + () => (if escaped { output.write_bytes(bytes!("~}")); escaped = false; }) + ) + + for ((i,j), ch) in input.index_iter() { + if ch < '\u0080' { + ensure_unescaped!(); + output.write_byte(ch as u8); + if ch == '~' { output.write_byte('~' as u8); } + } else { + let ptr = index::gb18030::backward(ch as u32); + if ptr == 0xffff { + self.escaped = escaped; // do NOT reset the state! + return (i, Some(CodecError { + upto: j, cause: "unrepresentable character".into_maybe_owned() + })); + } else { + let lead = ptr / 190; + let trail = ptr % 190; + if lead < 0x21 - 1 || trail < 0x21 + 0x3f { // GBK extension, ignored + self.escaped = escaped; // do NOT reset the state! + return (i, Some(CodecError { + upto: j, cause: "unrepresentable character".into_maybe_owned() + })); + } else { + ensure_escaped!(); + output.write_byte((lead + 1) as u8); + output.write_byte((trail - 0x3f) as u8); + } + } + } + } + + self.escaped = escaped; + (input.len(), None) + } + + fn raw_finish(&mut self, _output: &mut ByteWriter) -> Option { + None + } +} + +stateful_decoder! { + #[doc="A decoder for HZ."] + #[deriving(Clone)] + struct HZDecoder; + + module hz; + + ascii_compatible false; + + internal pub fn map_two_bytes(lead: u8, trail: u8) -> u32 { + use index; + + let lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0x20..0x7f, 0x21..0x7e) => (lead - 1) * 190 + (trail + 0x3f), + _ => 0xffff, + }; + index::gb18030::forward(index as u16) + } + + // hz-gb-2312 flag = unset, hz-gb-2312 lead = 0x00 + initial state A0(ctx) { + case 0x7e => A1(ctx); + case b @ 0x00..0x7f => ctx.emit(b as u32); + case _ => ctx.err("invalid sequence"); + final => ctx.reset(); + } + + // hz-gb-2312 flag = set, hz-gb-2312 lead = 0x00 + checkpoint state B0(ctx) { + case 0x7e => B1(ctx); + case b @ 0x20..0x7f => B2(ctx, b); + case 0x0a => A0(ctx); + case _ => ctx.err("invalid sequence"); + final => ctx.reset(); + } + + // hz-gb-2312 flag = unset, hz-gb-2312 lead = 0x7e + state A1(ctx) { + case 0x7b => B0(ctx); + case 0x7d => A0(ctx); + case 0x7e => ctx.emit(0x7e), A0(ctx); + case 0x0a => A0(ctx); + case _ => ctx.backup_and_err(1, "invalid sequence"); + final => ctx.err("incomplete sequence"); + } + + // hz-gb-2312 flag = set, hz-gb-2312 lead = 0x7e + state B1(ctx) { + case 0x7b => B0(ctx); + case 0x7d => A0(ctx); + case 0x7e => ctx.emit(0x7e), B0(ctx); + case 0x0a => A0(ctx); + case _ => ctx.backup_and_err(1, "invalid sequence"); + final => ctx.err("incomplete sequence"); + } + + // hz-gb-2312 flag = set, hz-gb-2312 lead != 0 & != 0x7e + state B2(ctx, lead: u8) { + case 0x0a => ctx.err("invalid sequence"), A0(ctx); // should reset the state! + case b => + match map_two_bytes(lead, b) { + 0xffff => ctx.err("invalid sequence"), + ch => ctx.emit(ch) + }, + B0(ctx); + final => ctx.err("incomplete sequence"); + } +} + +#[cfg(test)] +mod hz_tests { + extern crate test; + use super::HZEncoding; + use testutils; + use types::*; + + #[test] + fn test_encoder_valid() { + let mut e = HZEncoding.encoder(); + assert_feed_ok!(e, "A", "", bytes!("A")); + assert_feed_ok!(e, "BC", "", bytes!("BC")); + assert_feed_ok!(e, "", "", bytes!("")); + assert_feed_ok!(e, "\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd", "", + bytes!("~{VP;*HKCq92:M9z")); + assert_feed_ok!(e, "\uff21\uff22\uff23", "", bytes!("#A#B#C")); + assert_feed_ok!(e, "1\u20ac/m", "", bytes!("~}1~{\"c~}/m")); + assert_feed_ok!(e, "~<\u00a4~\u00a4>~", "", bytes!("~~<~{!h~}~~~{!h~}>~~")); + assert_finish_ok!(e, []); + } + + #[test] + fn test_encoder_invalid() { + let mut e = HZEncoding.encoder(); + assert_feed_err!(e, "", "\uffff", "", []); + assert_feed_err!(e, "?", "\uffff", "!", [0x3f]); + // no support for GBK extension + assert_feed_err!(e, "", "\u3007", "", []); + assert_finish_ok!(e, []); + } + + #[test] + fn test_decoder_valid() { + let mut d = HZEncoding.decoder(); + assert_feed_ok!(d, bytes!("A"), bytes!(""), "A"); + assert_feed_ok!(d, bytes!("BC"), bytes!(""), "BC"); + assert_feed_ok!(d, bytes!("D~~E"), bytes!("~"), "D~E"); + assert_feed_ok!(d, bytes!("~F~\nG"), bytes!("~"), "~FG"); + assert_feed_ok!(d, bytes!(""), bytes!(""), ""); + assert_feed_ok!(d, bytes!("\nH"), bytes!("~"), "H"); + assert_feed_ok!(d, bytes!("{VP~}~{;*HKCq92:M9z"), bytes!(""), + "\u4e2d\u534e\u4eba\u6c11\u5171\u548c\u56fd"); + assert_feed_ok!(d, bytes!(""), bytes!("#"), ""); + assert_feed_ok!(d, bytes!("A"), bytes!("~"), "\uff21"); + assert_feed_ok!(d, bytes!("~#B~~#C"), bytes!("~"), "~\uff22~\uff23"); + assert_feed_ok!(d, bytes!(""), bytes!(""), ""); + assert_feed_ok!(d, bytes!("\n#D~{#E~\n#F~{#G"), bytes!("~"), "#D\uff25#F\uff27"); + assert_feed_ok!(d, bytes!("}X~}YZ"), bytes!(""), "XYZ"); + assert_finish_ok!(d, ""); + } + + // TODO more tests + + #[test] + fn test_decoder_feed_after_finish() { + let mut d = HZEncoding.decoder(); + assert_feed_ok!(d, bytes!("R;~{R;"), bytes!("R"), "R;\u4e00"); + assert_finish_err!(d, ""); + assert_feed_ok!(d, bytes!("R;~{R;"), bytes!(""), "R;\u4e00"); + assert_finish_ok!(d, ""); + } + + #[bench] + fn bench_decode_short_text(bencher: &mut test::Bencher) { + static Encoding: HZEncoding = HZEncoding; + let s = Encoding.encode(testutils::SIMPLIFIED_CHINESE_TEXT, EncodeStrict).ok().unwrap(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); + }) + } +} + diff --git a/src/encoding/label.rs b/src/encoding/label.rs index 0dc6a31..bb226b0 100644 --- a/src/encoding/label.rs +++ b/src/encoding/label.rs @@ -224,10 +224,8 @@ pub fn encoding_from_whatwg_label(label: &str) -> Option { "iso-ir-58" | "x-gbk" => Some(all::GB18030 as EncodingRef), - /* "hz-gb-2312" => - Some(all::HZ_GB_2312 as EncodingRef), - */ + Some(all::HZ as EncodingRef), "big5" | "big5-hkscs" | "cn-big5" | @@ -309,9 +307,7 @@ pub fn encoding_from_windows_code_page(cp: uint) -> Option { 1258 => Some(all::WINDOWS_1258 as EncodingRef), 1259 => Some(all::X_MAC_CYRILLIC as EncodingRef), 936 | 54936 => Some(all::GB18030 as EncodingRef), // XXX technically wrong - /* - 52936 => Some(all::HZ_GB_2312 as EncodingRef), - */ + 52936 => Some(all::HZ as EncodingRef), 950 => Some(all::BIG5_2003 as EncodingRef), 20932 => Some(all::EUC_JP as EncodingRef), 50220 => Some(all::ISO_2022_JP as EncodingRef), From 67e462adb622f884340f586fc21b7cfae315ea24 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Wed, 14 May 2014 04:09:50 +0900 Subject: [PATCH 13/29] fixed Shift_JIS encoder not to return unexpected EUDC codes. --- src/encoding/codec/japanese.rs | 23 +++++++-- src/encoding/index/gen_index.py | 62 +++++++++++++++++++++++- src/encoding/index/jis0208.rs | 85 ++++++++++++++++++++++++++++++++- 3 files changed, 165 insertions(+), 5 deletions(-) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index dd368c1..2e00416 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -178,6 +178,15 @@ mod eucjp_tests { assert_finish_ok!(e, []); } + #[test] + fn test_encoder_double_mapped() { + // these characters are double-mapped to both EUDC area and Shift_JIS extension area + // but only the former should be used. (note that U+FFE2 is triple-mapped!) + let mut e = EUCJPEncoding.encoder(); + assert_feed_ok!(e, "\u9ed1\u2170\uffe2", "", [0xfc, 0xee, 0xfc, 0xf1, 0xa2, 0xcc]); + assert_finish_ok!(e, []); + } + #[test] fn test_encoder_invalid() { let mut e = EUCJPEncoding.encoder(); @@ -272,7 +281,8 @@ impl Encoder for Windows31JEncoder { '\u203e' => { output.write_byte(0x7e); } '\uff61'..'\uff9f' => { output.write_byte((ch as uint - 0xff61 + 0xa1) as u8); } _ => { - let ptr = index::jis0208::backward(ch as u32); + // corresponds to the "index shift_jis pointer" in the WHATWG spec + let ptr = index::jis0208::backward_remapped(ch as u32); if ptr == 0xffff { return (i, Some(CodecError { upto: j, cause: "unrepresentable character".into_maybe_owned(), @@ -311,8 +321,6 @@ ascii_compatible_stateful_decoder! { let leadoffset = if lead < 0xa0 {0x81} else {0xc1}; let trailoffset = if trail < 0x7f {0x40} else {0x41}; let index = match (lead, trail) { - // XXX the Encoding spec seems to be incorrect in this regard, see Bug 25649. - // INCORRECT: (0xf0..0xf9, _) => (0xf0..0xf9, 0x40..0x7e) | (0xf0..0xf9, 0x80..0xfc) => return (0xe000 + (lead - 0xf0) * 188 + trail - trailoffset) as u32, (0x81..0x9f, 0x40..0x7e) | (0x81..0x9f, 0x80..0xfc) | @@ -370,6 +378,15 @@ mod windows31j_tests { assert_finish_ok!(e, []); } + #[test] + fn test_encoder_double_mapped() { + // these characters are double-mapped to both EUDC area and Shift_JIS extension area + // but only the latter should be used. (note that U+FFE2 is triple-mapped!) + let mut e = Windows31JEncoding.encoder(); + assert_feed_ok!(e, "\u9ed1\u2170\uffe2", "", [0xfc, 0x4b, 0xfa, 0x40, 0x81, 0xca]); + assert_finish_ok!(e, []); + } + #[test] fn test_encoder_invalid() { let mut e = Windows31JEncoding.encoder(); diff --git a/src/encoding/index/gen_index.py b/src/encoding/index/gen_index.py index e3557f1..3795f31 100644 --- a/src/encoding/index/gen_index.py +++ b/src/encoding/index/gen_index.py @@ -122,6 +122,32 @@ def generate_multi_byte_index(name): best = len(lower) + len(upper) besttrie = (triebits, lower, upper) + # JIS X 0208 index has two ranges [8272,8836) and [8836,11280) to support two slightly + # different encodings EUC-JP and Shift_JIS; the default backward function would favor + # the former, so we need a separate mapping for the latter. + # + # fortunately for us, all allocated codes in [8272,8836) have counterparts in others, + # so we only need a smaller remapping from [8272,8836) to other counterparts. + remap = None + if name == 'jis0208': + REMAP_MIN = 8272 + REMAP_MAX = 8836 + + invdataminusremap = {} + for key, value in data.items(): + if value not in invdataminusremap and not REMAP_MIN <= key < REMAP_MAX: + invdataminusremap[value] = key + + remap = [] + for i in xrange(REMAP_MIN, REMAP_MAX): + if i in data: + assert data[i] in invdataminusremap + value = invdataminusremap[data[i]] + assert value < 0x10000 + remap.append(value) + else: + remap.append(0xffff) + minkey = min(data) maxkey = max(data) + 1 triebits, lower, upper = besttrie @@ -171,6 +197,11 @@ def generate_multi_byte_index(name): print >>f, "static BACKWARD_TABLE_UPPER: &'static [u16] = &[" write_comma_separated(f, ' ', ['%d, ' % v for v in upper]) print >>f, '];' + if remap: + print >>f + print >>f, "static BACKWARD_TABLE_REMAPPED: &'static [u16] = &[" + write_comma_separated(f, ' ', ['%d, ' % v for v in remap]) + print >>f, '];' print >>f print >>f, '#[inline]' print >>f, 'pub fn backward(code: u32) -> u16 {' @@ -178,10 +209,24 @@ def generate_multi_byte_index(name): print >>f, ' let offset = if offset < %d {BACKWARD_TABLE_UPPER[offset] as uint} else {0};' % len(upper) print >>f, ' BACKWARD_TABLE_LOWER[offset + ((code & %d) as uint)]' % ((1<>f, '}' + if remap: + print >>f + print >>f, '#[inline]' + print >>f, 'pub fn backward_remapped(code: u32) -> u16 {' + print >>f, ' let value = backward(code);' + print >>f, ' if %d <= value && value < %d {' % (REMAP_MIN, REMAP_MAX) + print >>f, ' BACKWARD_TABLE_REMAPPED[(value - %d) as uint]' % REMAP_MIN + print >>f, ' } else {' + print >>f, ' value' + print >>f, ' }' + print >>f, '}' print >>f print >>f, '#[cfg(test)]' print >>f, 'mod tests {' - print >>f, ' use super::{forward, backward};' + if remap: + print >>f, ' use super::{forward, backward, backward_remapped};' + else: + print >>f, ' use super::{forward, backward};' print >>f print >>f, ' #[test]' print >>f, ' fn test_correct_table() {' @@ -193,10 +238,25 @@ def generate_multi_byte_index(name): print >>f, ' if j != 0xffff { assert_eq!(backward(j), i); }' print >>f, ' }' print >>f, ' }' + if remap: + print >>f + print >>f, ' #[test]' + print >>f, ' fn test_correct_remapping() {' + print >>f, ' for i in range(%du16, %d) {' % (REMAP_MIN, REMAP_MAX) + print >>f, ' let j = forward(i);' + print >>f, ' if j != 0xffff {' + print >>f, ' let ii = backward_remapped(j);' + print >>f, ' assert!(ii != i && ii != 0xffff);' + print >>f, ' let jj = forward(ii);' + print >>f, ' assert_eq!(j, jj);' + print >>f, ' }' + print >>f, ' }' + print >>f, ' }' print >>f, '}' tablesz = 2 * (maxkey - minkey) + 2 * len(lower) + 2 * len(upper) if morebits: tablesz += 4 * ((maxkey - minkey + 31) // 32) + if remap: tablesz += 2 * len(remap) return tablesz def generate_multi_byte_range_lbound_index(name): diff --git a/src/encoding/index/jis0208.rs b/src/encoding/index/jis0208.rs index bee731d..09ed435 100644 --- a/src/encoding/index/jis0208.rs +++ b/src/encoding/index/jis0208.rs @@ -3240,6 +3240,66 @@ static BACKWARD_TABLE_UPPER: &'static [u16] = &[ 0, 0, 0, 0, 21888, 21920, 21952, 0, 0, 0, 0, 21984, ]; +static BACKWARD_TABLE_REMAPPED: &'static [u16] = &[ + 10744, 10745, 10746, 10747, 10748, 10749, 10750, 10751, 10752, 10753, + 10754, 10755, 10756, 10757, 10758, 10759, 10760, 10761, 10762, 10763, + 10764, 10765, 10766, 10767, 10768, 10769, 10770, 10771, 10772, 10773, + 10774, 10775, 10776, 10777, 10778, 10779, 10780, 10781, 10782, 10783, + 10784, 10785, 10786, 10787, 10788, 10789, 10790, 10791, 10792, 10793, + 10794, 10795, 10796, 10797, 10798, 10799, 10800, 10801, 10802, 10803, + 10804, 10805, 10806, 10807, 10808, 10809, 10810, 10811, 10812, 10813, + 10814, 10815, 10816, 10817, 10818, 10819, 10820, 10821, 10822, 10823, + 10824, 10825, 10826, 10827, 10828, 10829, 10830, 10831, 10832, 10833, + 10834, 10835, 10836, 10837, 10838, 10839, 10840, 10841, 10842, 10843, + 10844, 10845, 10846, 10847, 10848, 10849, 10850, 10851, 10852, 10853, + 10854, 10855, 10856, 10857, 10858, 10859, 10860, 10861, 10862, 10863, + 10864, 10865, 10866, 10867, 10868, 10869, 10870, 10871, 10872, 10873, + 10874, 10875, 10876, 10877, 10878, 10879, 10880, 10881, 10882, 10883, + 10884, 10885, 10886, 10887, 10888, 10889, 10890, 10891, 10892, 10893, + 10894, 10895, 10896, 10897, 10898, 10899, 10900, 10901, 10902, 10903, + 10904, 10905, 10906, 10907, 10908, 10909, 10910, 10911, 10912, 10913, + 10914, 10915, 10916, 10917, 10918, 10919, 10920, 10921, 10922, 10923, + 10924, 10925, 10926, 10927, 10928, 10929, 10930, 10931, 10932, 10933, + 10934, 10935, 10936, 10937, 10938, 10939, 10940, 10941, 10942, 10943, + 10944, 10945, 10946, 10947, 10948, 10949, 10950, 10951, 10952, 10953, + 10954, 10955, 10956, 10957, 10958, 10959, 10960, 10961, 10962, 10963, + 10964, 10965, 10966, 10967, 10968, 10969, 10970, 10971, 10972, 10973, + 10974, 10975, 10976, 10977, 10978, 10979, 10980, 10981, 10982, 10983, + 10984, 10985, 10986, 10987, 10988, 10989, 10990, 10991, 10992, 10993, + 10994, 10995, 10996, 10997, 10998, 10999, 11000, 11001, 11002, 11003, + 11004, 11005, 11006, 11007, 11008, 11009, 11010, 11011, 11012, 11013, + 11014, 11015, 11016, 11017, 11018, 11019, 11020, 11021, 11022, 11023, + 11024, 11025, 11026, 11027, 11028, 11029, 11030, 11031, 11032, 11033, + 11034, 11035, 11036, 11037, 11038, 11039, 11040, 11041, 11042, 11043, + 11044, 11045, 11046, 11047, 11048, 11049, 11050, 11051, 11052, 11053, + 11054, 11055, 11056, 11057, 11058, 11059, 11060, 11061, 11062, 11063, + 11064, 11065, 11066, 11067, 11068, 11069, 11070, 11071, 11072, 11073, + 11074, 11075, 11076, 11077, 11078, 11079, 11080, 11081, 11082, 11083, + 11084, 11085, 11086, 11087, 11088, 11089, 11090, 11091, 11092, 11093, + 11094, 11095, 11096, 11097, 11098, 11099, 11100, 11101, 11102, 11103, + 65535, 65535, 10716, 10717, 10718, 10719, 10720, 10721, 10722, 10723, + 10724, 10725, 137, 10737, 10738, 10739, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, 65535, + 65535, 65535, 65535, +]; + #[inline] pub fn backward(code: u32) -> u16 { let offset = (code >> 5) as uint; @@ -3247,9 +3307,19 @@ pub fn backward(code: u32) -> u16 { BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } +#[inline] +pub fn backward_remapped(code: u32) -> u16 { + let value = backward(code); + if 8272 <= value && value < 8836 { + BACKWARD_TABLE_REMAPPED[(value - 8272) as uint] + } else { + value + } +} + #[cfg(test)] mod tests { - use super::{forward, backward}; + use super::{forward, backward, backward_remapped}; #[test] fn test_correct_table() { @@ -3657,4 +3727,17 @@ mod tests { if j != 0xffff { assert_eq!(backward(j), i); } } } + + #[test] + fn test_correct_remapping() { + for i in range(8272u16, 8836) { + let j = forward(i); + if j != 0xffff { + let ii = backward_remapped(j); + assert!(ii != i && ii != 0xffff); + let jj = forward(ii); + assert_eq!(j, jj); + } + } + } } From 002bf657a2c8089025263f0aa32b473f6ef6dd5c Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Wed, 14 May 2014 23:46:52 +0900 Subject: [PATCH 14/29] added more benchmarks to CJK encodings and UTF-8. --- src/encoding/codec/japanese.rs | 30 + src/encoding/codec/korean.rs | 10 + src/encoding/codec/simpchinese.rs | 20 + src/encoding/codec/tradchinese.rs | 10 + src/encoding/codec/utf_8.rs | 150 +++ src/encoding/examples/UTF-8-test.txt | Bin 0 -> 20334 bytes src/encoding/examples/outer-space-treaty.html | 959 ++++++++++++++++++ src/encoding/testutils.rs | 42 + 8 files changed, 1221 insertions(+) create mode 100644 src/encoding/examples/UTF-8-test.txt create mode 100644 src/encoding/examples/outer-space-treaty.html diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index 2e00416..cc1e5cc 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -223,6 +223,16 @@ mod eucjp_tests { assert_finish_ok!(d, ""); } + #[bench] + fn bench_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: EUCJPEncoding = EUCJPEncoding; + let s = testutils::JAPANESE_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); + }) + } + #[bench] fn bench_decode_short_text(bencher: &mut test::Bencher) { static Encoding: EUCJPEncoding = EUCJPEncoding; @@ -432,6 +442,16 @@ mod windows31j_tests { assert_finish_ok!(d, ""); } + #[bench] + fn bench_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: Windows31JEncoding = Windows31JEncoding; + let s = testutils::JAPANESE_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); + }) + } + #[bench] fn bench_decode_short_text(bencher: &mut test::Bencher) { static Encoding: Windows31JEncoding = Windows31JEncoding; @@ -789,6 +809,16 @@ mod iso2022jp_tests { assert_finish_ok!(d, ""); } + #[bench] + fn bench_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: ISO2022JPEncoding = ISO2022JPEncoding; + let s = testutils::JAPANESE_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); + }) + } + #[bench] fn bench_decode_short_text(bencher: &mut test::Bencher) { static Encoding: ISO2022JPEncoding = ISO2022JPEncoding; diff --git a/src/encoding/codec/korean.rs b/src/encoding/codec/korean.rs index e4546a6..c960048 100644 --- a/src/encoding/codec/korean.rs +++ b/src/encoding/codec/korean.rs @@ -225,6 +225,16 @@ mod windows949_tests { assert_finish_ok!(d, ""); } + #[bench] + fn bench_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: Windows949Encoding = Windows949Encoding; + let s = testutils::KOREAN_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); + }) + } + #[bench] fn bench_decode_short_text(bencher: &mut test::Bencher) { static Encoding: Windows949Encoding = Windows949Encoding; diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index 3e3f4f0..e5b46dd 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -239,6 +239,16 @@ mod gb18030_tests { assert_finish_ok!(d, ""); } + #[bench] + fn bench_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: GB18030Encoding = GB18030Encoding; + let s = testutils::SIMPLIFIED_CHINESE_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); + }) + } + #[bench] fn bench_decode_short_text(bencher: &mut test::Bencher) { static Encoding: GB18030Encoding = GB18030Encoding; @@ -465,6 +475,16 @@ mod hz_tests { assert_finish_ok!(d, ""); } + #[bench] + fn bench_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: HZEncoding = HZEncoding; + let s = testutils::SIMPLIFIED_CHINESE_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); + }) + } + #[bench] fn bench_decode_short_text(bencher: &mut test::Bencher) { static Encoding: HZEncoding = HZEncoding; diff --git a/src/encoding/codec/tradchinese.rs b/src/encoding/codec/tradchinese.rs index 68d4e2e..d6157da 100644 --- a/src/encoding/codec/tradchinese.rs +++ b/src/encoding/codec/tradchinese.rs @@ -182,6 +182,16 @@ mod bigfive2003_tests { assert_finish_ok!(d, ""); } + #[bench] + fn bench_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: BigFive2003Encoding = BigFive2003Encoding; + let s = testutils::TRADITIONAL_CHINESE_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); + }) + } + #[bench] fn bench_decode_short_text(bencher: &mut test::Bencher) { static Encoding: BigFive2003Encoding = BigFive2003Encoding; diff --git a/src/encoding/codec/utf_8.rs b/src/encoding/codec/utf_8.rs index e490682..151fb02 100644 --- a/src/encoding/codec/utf_8.rs +++ b/src/encoding/codec/utf_8.rs @@ -211,6 +211,8 @@ mod tests { // stress test: . use super::UTF8Encoding; + use std::str; + use testutils; use types::*; #[test] @@ -581,5 +583,153 @@ mod tests { assert_feed_ok!(d, [0xc2, 0x80], [], "\x80"); assert_finish_ok!(d, ""); } + + mod bench_ascii { + extern crate test; + use super::super::UTF8Encoding; + use std::str; + use testutils; + use types::*; + + #[bench] + fn bench_encode(bencher: &mut test::Bencher) { + static Encoding: UTF8Encoding = UTF8Encoding; + let s = testutils::ASCII_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s, EncodeStrict).ok().unwrap(); + }) + } + + #[bench] + fn bench_decode(bencher: &mut test::Bencher) { + static Encoding: UTF8Encoding = UTF8Encoding; + let s = testutils::ASCII_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s, DecodeStrict).ok().unwrap(); + }) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8(bencher: &mut test::Bencher) { + let s = testutils::ASCII_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + str::from_utf8(s).unwrap(); + }) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { + let s = testutils::ASCII_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + str::from_utf8_lossy(s); + }) + } + } + + // why Korean? it has an excellent mix of multibyte sequences and ASCII sequences + // unlike other CJK scripts, so it reflects a practical use case a bit better. + mod bench_korean { + extern crate test; + use super::super::UTF8Encoding; + use std::str; + use testutils; + use types::*; + + #[bench] + fn bench_encode(bencher: &mut test::Bencher) { + static Encoding: UTF8Encoding = UTF8Encoding; + let s = testutils::KOREAN_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.encode(s, EncodeStrict).ok().unwrap(); + }) + } + + #[bench] + fn bench_decode(bencher: &mut test::Bencher) { + static Encoding: UTF8Encoding = UTF8Encoding; + let s = testutils::KOREAN_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s, DecodeStrict).ok().unwrap(); + }) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8(bencher: &mut test::Bencher) { + let s = testutils::KOREAN_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + str::from_utf8(s).unwrap(); + }) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { + let s = testutils::KOREAN_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + str::from_utf8_lossy(s); + }) + } + } + + mod bench_lossy_invalid { + extern crate test; + use super::super::UTF8Encoding; + use std::str; + use testutils; + use types::*; + + #[bench] + fn bench_decode_replace(bencher: &mut test::Bencher) { + static Encoding: UTF8Encoding = UTF8Encoding; + let s = testutils::INVALID_UTF8_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s, DecodeReplace).ok().unwrap(); + }) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { + let s = testutils::INVALID_UTF8_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| { + str::from_utf8_lossy(s); + }) + } + } + + mod bench_lossy_external { + extern crate test; + use super::super::UTF8Encoding; + use std::str; + use testutils; + use types::*; + + #[bench] + fn bench_decode_replace(bencher: &mut test::Bencher) { + static Encoding: UTF8Encoding = UTF8Encoding; + let s = testutils::get_external_bench_data(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + Encoding.decode(s.as_slice(), DecodeReplace).ok().unwrap(); + }) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { + let s = testutils::get_external_bench_data(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + str::from_utf8_lossy(s.as_slice()); + }) + } + } } diff --git a/src/encoding/examples/UTF-8-test.txt b/src/encoding/examples/UTF-8-test.txt new file mode 100644 index 0000000000000000000000000000000000000000..abd16f7253bf7254ad1ae04cb5bee8d8c47e407a GIT binary patch literal 20334 zcmdU1X>%Ocb-l=P@_l?QkaQ+KqMb=kWH&#~HSJo~$&h?IO#*?-m zc%Ubgju-S~81=~ARry~yhNh5G^057n(4B1 z-Jl)CU9Yt)Q7lo~@#2A>c;bht2ToHz+%uR?;yu;(!lswhMM+X>Kw223()HXhl{Auu zCoaH4V!C)(1yz@8sk9={!DoAbZN`2Bgt*~QdTyNh&3@ow^nTimx?SUnX>wt*17rPAz z)GE5+b=(6;DHb=Cgmm-*H)9tx`CZcBhe_(WATM%qC1CJyU)%=BH>6_>9koDo+V zLQs$lfz)-uJLDAvP==4s@nApfCw(`-P`!Q%VP8G$d9hE)gDPo5PL>ZR?SRy7gyGtL zoTMwMPwDl+c&u6;Glm2YL9lou@LaqSg&uTj?4lP(5Cu4-)I2{fgff(VLK{#CQ{{D9 zq|vJcu)PF24`6-G=m6dVA%rbA9?}L{K3PgiHa2NV;wCcif`C6WiwuSWR^fTA%#?Gp zqik-3KEK1mEzjviFjCkwg^)nkK}$j?9(L4hLW|&qrl@wFVP*6`)WpXvfwh*ek+1J39Sl`y({PyUv>iuXYRwo~Fm!U$wRSqC&$svCdeo15fXJl* zDAN*bHU{fXI|Ba=#F8QyxBDb2@b=tbJhqjLR|9PLK+X9_%WELc>HrMiEx+An zd`GTfTxa@1{9y!DbA#~0HbP7kBCx!TkqH*o@tV-ypyR+x5smqBvafgZ2u0L{Bu0Fm~gU2Wn0TThEIHF!8 zzGf+Cnr4)EG$9vi)68YFWHWY?4r34!B#VxQCTZ)OSr~Q$L^vh}r|BX}2=X}f-1K5< z`5{<}$s9@rByf31d8rq$fI*bvyH4BlTIY;;w@jjedU9Y7iedni z+NcJPIc$18vh~)RzPp+g1|5eS9F9dx>?kmdP#0`5x@!@kpZ= zvO3BFgbO!-LxpgI1L)2qDg;pa8|a%JQ1cS1vlvFr{0fW!#_b9mtBur7r)kn4RG~}s zX>g_mU*e~Ib+<$-$WoPf4i5x<9TX(w@kYorUT>iuXt8K(3_&}{D#fha9c^Nrk>zr; zF;T@>4W=6K@x3ANow5%u(~3jH0u7cL&grU|38{rZiq0b}o3)-+qlYmhm*vFQ$T{(= zGhZAzYa&mw%Cbevv?*#tUSS3FcF7H_+Z z_tB%OfFlLm5ZRaj+#VzF_A_%LZi;M+b;O9E6T*>$Ja7J5ctctfCfR-EtP@4TGFv-dnpR^Zv4`)+pq6mU(aO zmhoP`Srt$PSf4g;%=pTHcW=&#IBDK%1S}(d^5(pd6Xw04h-Ju60dh_<$ITl;)T^YK zPZM(v(9;_9`1{ljbn^u2hnXuo<4@oJx3e(s4Vt$JvO5r3Q5pRg-$@VJ$0r3;nqfH4BQZ$HA@D34`z($LRcW=H>)m=)6uy7)-taQ^BX8G(@Zw}*M27&(yPV>4zK^MI6| zJp=mG5|Wf4|$s(|46qmHsjG*=iRngNcV_d9%P^7C!>6 ztZ>=QUZWXPJ=SwRR%D|=Shvqr{keF45gDivQ+rM+Lsk#BS1(JgYV82~GnJht`)TC@ zuh9lx)p&C@{K7}pr)k5yuXa?GuuNfwUqqRWd*M};oB=d=2r--Y#G8vkgNFoq;of-j zP-yVBSZ_|*ijm*Z&3R;K@U}&^j>D@?;n~>BCCtI?1_f6wuz+@PvnXY!B_T`nn-v;+ zQKnGCi>D8uwWBZpil^W4m0$JFcYXEOeC^kL{WrYZ*wRVR0nJ4SU^is?An&s2FC}l@Y|Wt$9T`x<&AZ-A)2LK zSoZpguFTn$2TaUY51X{(RvYX3Gp?LIUEwp!a>#+YHzZ*03>rubnn_9oO<>T@<^0)GL z^7rx&@{jUQ^3U=w@~`r5az{QPcmLn@fqH}b*q&6!<_vYTsgCy6YRsw%Dji*%rH>}{(Rx$s<8}G;0(3#0oP|CRt!%Z6ZA)$s>;Cstl`CBzI~CY-KIU3H zeKZsnDcZTEO)c2G!zLd#6m8j3o}p_`LOw0ewp0s(XU)$|kAZIJTO{smX)_P|WTrYI z3OMK^-wD=@U@j)0uHx1rmK0L7Q0b-oCODBBD+0bUz3ym8M980r?iCSV zo3U|XAQ81D0#rrF*Jo|U7);F6D{IDV!I?dU+RL*AiJ5w3%_tt%Nik)`a_ekBOw}uE zh6}I6Q$TDb%tplIy0T_gR*MaV8g~+AL&D1{Yi6aipHS0{glWv&9T###O~V`?MyC(f z4%x9`dNh1AbWTLFq{@Jcj}eTq3|Ww)jj0-L;p<$c$;f6m78)+fF%mBnohFv{QQq3Y zUMD7ue6h6BoY3OfpNr=g$hBLyj}ScQ?dqN{-@OTorHRe72}?`WpNpqiHzKZe^Zitl z6RXlQ`P|~^yAJy)n*Z2LW++5wqxN<7dLFt>k@oV&P}>2RYTM;Fg^Q;T@?#!sd)!=l zW76lxN5B7X^yv$nceiz4=`)MLLmC8q{MXKa-+1FQC&FI5{1CyOK%1L39Tq|2{*s#g z#Nz22x4(iy+xT6?DYUs2eeMip~*h@CpAcUnBI^x(SXYT-MHE98BRk z4((Le#$`6N2keSR?n3d}79MMuumwuOUL!rzffZ5P4od<3vQm zGmWv@9cl>30HKdalAfNE(K8td4tQX^tdA4rHLB{1+k#3ps(CMnKv%ZCQDm7 zn|hK0^7NZLGlbP%YzXGp$kDcc5ZM^=6b@Dz*q+JuQ8a97=eC(pQ21H5Y(5{T%Pu}0 zyG9O=)bOYfPgrCnqHUvRqbZ^U1iSR;?m0Bx=@}2m1{6Vn+Qbj@D+7+Ss~5?<&jU;u zRs02co`)7z4_9$^fYU5!0ZsPk5H+x9_~!(y#HzxM&;%OM(2aIoZGJU0aVh?6bbJY8aFncccZGiC43nemQ<500s#YGe<=* zr^QJqYC;W)1)6t=lO33(=GWrm^Cq+JRUFL2+}+OQb7Chnl9O@Io5j=jMO^rRXo^^y zN!v8gLr>IkQQ@@NcbzjZNodJlikL!xNlp{2wRB{ucD{yQYI9l(c4w3c-?A6|mxp>v z<@UIOmsPRynbPSus|+vtg|twiQ@^Sd=Cmy7T$Wkave8v2)JGVdfF3I#suK) zqj?cG3dFYUGRi@Lh&ju=keemQ?W|=By-Nlakema}i+Q1h*(@*(EHHIWH4o_gCUV>x z)DDXC$J|4|+wT@`S|o+z-k$z$@#c6%PlxJs8ji-u(80+S9!;@_IZ-k7`3({lYDANV zaR3TO#u%|VkqUD{M@}AzEQ>7C$~jBjpX2NyaG^}ikFsbE%g#huK$IWsYRZqT>X{j4 zkZCVR*5LAihQp$kv#~4#969BnHc^?52eNV&vgAztT)aMDFHBIT9g#QK?V}Q&(x%qf|3aJy!XH#mf)+Rd+TA5jEW-Ht! zXA5Z3eHjygx2Ja_$|&V~gGhI_h?hPs+neOMrq&w%B$Kv(DrQj#c#x7|>;}oXpakPi^i83Q4o{qac6Z%Z}+QES~ zI2c!1bT$BAyYozCN6U$ZhnP0)8xQVW(b|TH=-bmoeCOFpSvW`IjX~7-wR1&-01@>> z2x)xoq%>;y+PR{Y2obepAmZ~UrBQ>|&cjxYja-iJJ1LFWw1pgZE!Xf{69wa!?h1Q=rx^sWU zE6*n1Tg+TJ1!iuWz`Vbr3})sr@WC-U)fLC+eD-E#Iy0X!m<63VW==W9D=MvkIN3 zcEK?K+R;XK`q2I@mD3bGXOX?K;v2HN%Iu{ALzqNFyL=9%@8$v a&2b9W0wR0mw+p!$IoY3(SqK`l>;D0Y6_gYJ literal 0 HcmV?d00001 diff --git a/src/encoding/examples/outer-space-treaty.html b/src/encoding/examples/outer-space-treaty.html new file mode 100644 index 0000000..b835deb --- /dev/null +++ b/src/encoding/examples/outer-space-treaty.html @@ -0,0 +1,959 @@ + + + + + +Treaty on Principles Governing the Activities of States +in the Exploration and Use of Outer Space, including +the Moon and Other Celestial Bodies + + + +

معاهدة المبادئ المنظمة لأنشطة الدول في ميدان +
استكشاف واستخدام الفضاء الخارجي، بما في ذلك +
القمر والأجرام السماوية الأخرى

+

  

+

  

+

إن الدول الأطراف في هذه المعاهدة

+

،إذ تستلهم الآفاق الواسعة التي فتحها أمام الانسانية ولوج الانسان الفضاء الخارجي

+

وإذ تدرك المصلحة المشتركة التي تعود على جميع الانسانية من التقد م في ميدان +
،استكشاف الفضاء الخارجي واستخدامه للأغراض السلمية  

+

وإذ تعتقد ان استكشاف الفضاء الخارجي واستخدامه يجب أن يباشرا لتحقيق فائدة +
،جميع الشعوب أيا كانت درجة نمائها الاقتصادي أو العلمي  

+

وإذ تود الاسهام في تعاون دولي واسع يتناول النواحي العلمية إلى جانب النواحي +
،القانونية من استكشاف الفضاء الخارجي واستخدامه للأغراض السلمية  

+

وإذ تعتقد ان هذا التعاون سيسهم في انماء التفاهم المتبادل وفي توثيق العلاقات الودية +
،بين الأمم والشعوب  

+

وإذ تشير إلى القرار ١٩٦٢ (د- ١٨ ) ذي العنوان التالي "اعلان المبادئ القانونية +
المنظمة لأنشطة الدول في ميدان استكشاف الفضاء الخارجي واستخدامه "، وهو القرار الذي +
،اتخذته الجمعية العامة للأمم المتحدة بالاجماع في ١٣ كانون الأول/ديسمبر ١٩٦٣  

+

وإذ تشير إلى القرار ١٨٨٤ (د- ١٨ ) الذي يدعو الدول إلى الامتناع عن وضع أية +
أجسام، تحمل أية أسلحة نووية أو أي نوع آخر من أسلحة التدمير الشامل، في أي مدار حول +
الأرض، أو عن وضع مثل هذه الأسلحة على أية أجرام سماوية، وهو القرار الذي اتخذته +
،الجمعية العامة للأمم المتحدة بالاجماع في ١٧ تشرين الأول/أكتوبر ١٩٦٣

+

وإذ تراعي القرار ١١٠ (د- ٢) الذي اتخذته الجمعية العامة للأ مم المتحدة في ٣ +
تشرين الثاني /نوفمبر ١٩٤٧ ، وشجبت فيه الدعاية الرامية أو المؤدية إلى إثارة أو تشجيع أي +
ﺗﻬديد أو خرق للسلم أو أي عمل عدواني، وإذ ترى ان القرار السالف الذكر يسري على +
،الفضاء الخارجي

+

واقتناعا منها بأن عقد معاهدة تتضمن المبادئ المنظمة لأنشطة الد ول في ميدان +
استكشاف واستخدام الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى، من +
،شأنه تعزيز مقاصد ميثاق الأمم المتحدة ومبادئه

+

:قد اتفقت على ما يلي

+

+ 

+

المادة الأولى

+

يباشر استكشاف واستخدام الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية +
،الأخرى، لتحقيق فائدة ومصالح جميع البلدان، أيا كانت درجة نمائها الاقتصادي أو العلمي +
.ويكونان ميدانا للبشرية قاطبة

+

وتكون لجميع الدول حرية استكشاف واستخدام الفضاء الخارجي، بما في ذلك القمر +
والأجرام السماوية الأخرى دون تمييز وعلى قدم المساواة وفقا للقانون الدولي، ويكون حرا +
.الوصول إلى جميع مناطق الأجرام السماوية

+

ويكون حرا اجراء الأبحاث العلمية في الفضاء الخارجي، بما في ذلك القمر والأجرام +
.السماوية الأخرى، وتراعي الدول تيسير وتشجيع التعاون الدولي في مثل هذه الأبحاث

+

+ 

+

المادة الثانية

+

لا يجوز التملك القومي للفضاء الخ ارجي، بما في ذلك القمر والأجرام السماوية +
.الأخرى، بدعوى السيادة أو بطريق الاستخدام أو الاحتلال أو بأية وسيلة أخرى

+

+ 

+

المادة الثالثة

+

تلتزم الدول الأطراف في المعاهدة، في مباشرة أنشطتها في ميدان استكشاف +
واستخدام الفضاء الخارجي، بما في ذلك القمر والأجرام السما وية الأخرى، مراعاة القانون +
الدولي، بما في ذلك ميثاق الأمم المتحدة، بغية صيانة السلم والأمن الدوليين وتعزيز التعاون +
.والتفاهم الدوليين

+

+ 

+

المادة الرابعة

+

تتعهد الدول الأطراف في المعاهدة بعدم وضع أية أجسام تحمل أية أسلحة نووية أو +
أي نوع آخر من أسلحة التدمير ا لشامل في أي مدار حول الأرض، أو وضع مثل هذه +
.الأسلحة على أية أجرام سماوية أو في الفضاء الخارجي بأية طريقة أخرى

+

وتراعي جميع الدول الأطراف في المعاهدة قصر استخدامها للقمر والأجرام السماوية +
الأخرى على الأغراض السلمية . ويحظر انشاء أية قواعد أو منشآت أو تحصينات عسكرية +
وتجريب أي نوع من الأسلحة واجراء أية مناورات عسكرية في الأجرام السماوية . ولا يحظر +
استخدام الملاكات العسكرية لأغراض البحث العلمي أو لأية أغراض سلمية أخرى . وكذلك +
لا يحظر استخدام أية معدات أو مرافق تكون لازمة للاستكشاف السلمي للقمر وللأجرام +
.السماوية الأخرى

+

+ 

+

المادة الخامسة

+

تراعي الدول الأطراف في المعاهدة اعتبار الملاحين الفضائيين بمثابة مبعوثي الانسانية +
في الفضاء الخارجي وتزويدهم بكل مساعدة ممكنة عند حصول أي حادث أو محنة أو هبوط +
اضطراري في اقليم أية دولة من الدول الأطراف أو في أعالي البحار . ويبادر، في حالة هبوط +
.الملاحين الفضائيين اضطرارا، إلى اعادﺗﻬم سالمين إلى الدولة المسجلة فيها مركبتهم الفضائية

+

ويراعي الملاحون الفضائيون التابعون لأية دولة من الدول الأطراف تقديم كل +
مساعدة ممكنة، عند مباشرة أية نشاطات في الفضاء الخارجي أو الأجرام السماوية، إلى +
.الملاحين الفضائيين التابعين للدول الأطراف الأخرى

+

وتلتزم الدول المعنية الأطراف في المعاهدة القيام فورا باعلام الدول الأخرى الأطراف +
في المعاهدة أو الأمين العام للأمم المتحدة بأية ظاهرة تكتشفها في الفضاء الخارجي، بما في ذلك +
القمر والأجرام السماوية الأخرى، ويكون من شأﻧﻬا تعريض حياة الملاحين الفضائيين أو +
.صحتهم للخطر

+

+ 

+

المادة السادسة

+

تترتب على الدول الأطراف في المعاهدة مسؤولية دولية عن الأنشطة القومية المباشرة +
في الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى، سواء باشرﺗﻬا الهيئات +
الحكومية أو غير الحكوم ية، وعن تأمين مباشرة الأنشطة القومية وفقا للمباد ئ المقررة في هذه +
المعاهدة. وتراعي الدولة المعنية الطرف في المعاهدة فرض الاجازة والإشراف المستمر على +
أنشطة الهيئات غير الحكومية في الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية +
الأخرى، وفي حالة صدور الأنش طة المباشرة في الفضاء الخارجي، بما في ذلك القمر والأجرام +
السماوية الأخرى، عن احدى المنظمات الدولية، تكون هذه المنظمة، مع الدول التي تكون +
.مشتركة فيها وأطرافا في المعاهدة، هي صاحبة المسؤولية عن التزام أحكام المعاهدة

+

+ 

+

المادة السابعة

+

تترتب على كل دولة من الدو ل الأطراف في المعاهدة تطلق أو تتيح اطلاق أي جسم +
في الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى، وعلى كل دولة من الدول +
الأطراف يطلق أي جسم من اقليمها أو من منشآﺗﻬا، المسؤولية الدولية عن الأضرار التي تلحق +
أية دولة أخرى من الدول الأطراف في المعا هدة أي شخص من أشخاصها الطبيعيين أو +
،القانونيين بسبب ذلك الجسم أجزائه فوق الأرض أو في الفضاء الجوي أو في الفضاء الخارجي +
.بما في ذلك القمر والأجرام السماوية الأخرى

+

+ 

+

المادة الثامنة

+

تحتفظ الدولة الطرف في المعاهدة والمقيد في سجلها أي جسم مطلق في الفضاء +
الخارجي بالولاية والمراقبة على ذلك الجسم وعلى أي أشخاص يحملهم أثناء وجوده +
ووجودهم في الفضاء الخارجي أو على أي جرم سماوي، ولا تتأثر ملكية الأجسام المطلقة في +
الفضاء الخارجي، بما في ذلك الأجسام الهابطة أو المنشأة على أي جرم سماوي، ولا ملكية +
أجزائها، بوجودها في الفض اء الخارجي أو على جرم سماوي أو بعودﺗﻬا إلى الأرض . وترد إلى +
دولة السجل التي تكون طرفا في المعاهدة أية أجسام مقيدة في سجلها أو أية أجزاء منها يعثر +
عليها خارج حدودها، على أن تقوم تلك الدولة قبل الرد بتقديم البيانات الثبوتية اللازمة عند +
.طلبها

+

+ 

+

المادة التاسعة

+

تلتزم الدول الأطراف في المعاهدة، في استكشاف واستخدام الفضاء الخارجي، بما في +
ذلك القمر والأجرام السماوية الأخرى، الاسترشاد بمبدأ التعاون والتساعد المتبادل، والمراعاة +
،الحقة في مباشرة أنشطتها في الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى +
للمصالح المقابلة التي تكون لجميع الدول الأخرى الأطراف في المعاهدة . وتلتزم الدول الأطراف +
في المعاهدة، في دراسة واستكشاف الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية +
الأخرى، تفادي إحداث أي تلويث ضار لها وكذلك أية تغييرات ضارة في البيئة الأرضية +
.يسببها إدخا ل أية مواد غير أرضية، والقيام عند الاقتضاء باتخاذ التدابير المناسبة لهذا الغرض +
ويجب على كل دولة من الدول الأطراف في المعاهدة، يكون لديها من الأسباب ما يحملها +
على الاعتقاد بأن ثمة نشاطا تجريبيا مزمعا منها أو من مواطنيها في الفضاء الخارجي، بما في +
ذلك القمر والأجرام السماوية الأخرى، قد يتسبب في عرقلة، محتملة الإضرار، لأنشطة الدول +
الأطراف الأخرى في ميدان استكشاف واستخدام الفضاء الخارجي، بما في ذلك القمر +
والأجرام السماوية الأخرى، للأغراض السلمية، اجراء المشاورات الدولية المناسبة قبل الشروع +
في ذلك النشاط أو التج ريب. ويجوز لكل دولة من الدول الأطراف في المعاهدة يكون لديها +
من الأسباب ما يحملها على الاعتقاد بأن ثمة نشاطا أو تجريبا مزمعا من أية دولة أخرى من +
الدول الأطراف في الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى، قد +
يتسبب في عرقلة، محتملة الإضرار، ل لأنشطة المباشرة في ميدان استكشاف واستخدام الفضاء +
الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى، للأغراض السلمية، طلب اجراء +
.المشاورات اللازمة بشأن ذلك النشاط التجريبي

+

+ 

+

المادة العاشرة

+

تراعي الدول الأطراف في المعاهدة والمطلقة لأية أجسام فضائية، تعزيز ا للتعاون +
الدولي في ميدان استكشاف واستخدام الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية +
الأخرى، ووفقا لمقاصد هذه المعاهدة، النظر على قدم المساواة في أية طلبات من الدول +
الأخرى الأطراف في المعاهدة تطلب اليها فيها توفير التسهيلات اللازمة لها لمراقبة طير ان +
.الأجسام الفضائية المطلقة منها

+

ويجري، بالاتفاق بين الدول المعنية، تحديد طبيعة تلك التسهيلات اللازمة للمراقبة +
.وتعيين الشروط المناسبة لتوفيرها

+

+ 

+

المادة الحادية عشرة

+

توافق الدول الأطراف في المعاهدة والمباشرة لأية أنشطة في الفضاء الخارجي، بما في +
ذلك القم ر والأجرام السماوية الأخرى، تعزيزا للتعاون الدولي في ميدان استكشاف الفضاء +
الخارجي واستخدامه، على القيام، في أوسع نطاق عملي ممكن، بموافاة الأمين العام للأمم +
المتحدة، وكذلك الجمهور واﻟﻤﺠتمع العلمي الدولي، بالمعلومات اللازمة عن طبيعة تلك الأنشطة +
ومباشرﺗﻬا وأم اكنها ونتائجها، ويجب على الأمين العام للأمم المتحدة أن يكون مستعدا، عند +
.تلقي المعلومات المذكورة، لإذاعتها ونشرها فورا بالطريقة الفعالة

+

+ 

+

المادة الثانية عشرة

+

تتاح لممثلي الدول الأخرى الأطراف في المعاهدة، وعلى أساس التبادل، زيارة جميع +
المحطات والمنشآت والم عدات والمركبات الفضائية التي تكون موجودة على القمر أو على +
الأجرام السماوية الأخرى . ويراعي الممثلون المذكورون إرسال اعلان مسبق بزيارﺗﻬم المزمعة +
لاتاحة اجراء المشاورات المناسبة وتيسير اتخاذ الاحتياطات القصوى اللازمة لكفالة السلامة +
.ولتفادي عرقلة السير الطبيعية للعمليات المعتادة في المرفق المزمعة زيارته

+

+ 

+

المادة الثالثة عشرة

+

تسري أحكام هذه المعاهدة على الأنشطة التي تباشرها الدول الأطراف فيها في ميدان +
استكشاف واستخدام الفضاء الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى، سواء +
كانت تلك الأنشطة مباشرة من اح دى الدول الأطراف في المعاهدة على سبيل الانفراد أو +
بالاشتراك مع الدول الأخرى، بما في ذلك الحالات التي تكون فيها تلك الأنشطة مباشرة ضمن +
.اطار المنظمات الحكومية الدولية

+

وتتولى الدول الأطراف في المعاهدة، بالنسبة إلى أية مسائل عملية تنشأ بصدد +
الأنشطة المباشرة من المنظمات الحكومية الدولية في ميدان استكشاف واستخدام الفضاء +
الخارجي، بما في ذلك القمر والأجرام السماوية الأخرى، التماس الحلول اللازمة لتلك المسائل +
إما مع المنظمة الدولية المختصة وإما مع واحدة أو أكثر من الدول الأعضاء في تلك المنظمة +
.والتي تكون أطرافا في هذه المعاهدة

+

+ 

+

المادة الرابعة عشرة

+

١- تعرض هذه المعاهدة لتوقيع جميع الدول . ويجوز الانضمام إلى هذه المعاهدة +
في أي وقت لأية دولة لم توقعها قبل بدء نفاذها وفقا للفقرة ٣ من هذه +
.المادة

+

٢- تخضع هذه المعاهدة لتصديق الدول الموقعة لها وتودع وثائق التصديق ووثائق +
الانضمام لدى حكومات اتحاد الجمهوريات الاشتراكية السوفياتية والمملكة +
،المتحدة لبريطانيا العظمى وايرلندا الشمالية والولايات المتحدة الأمريكية +
.المعنية بحكم هذه المعاهدة باعتبارها الحكومات الوديعة

+

٣- يبدأ نفاذ هذه المعاهدة بإيداع وثائق تصديق خمس حكومات تكون من +
.بينها الحكومات المعنية بحكم هذه المعاهدة باعتبارها الحكومات الوديعة

+

٤- يبدأ نفاذ هذه المعاهدة، بالنسبة إلى الدول التي تكون قد أودعت وثائق +
تصديقها عليها أو انضمامها اليها بعد بدء نفاذها، ابتداء من تاريخ ايداع +
.تلك الدول لوثائق تصديقها أو انضمامها

+

٥- تنهي الحكومات الوديعة، على وجه السرعة، إلى جميع الدول الموقعة لهذه +
المعاهدة أو المنضمة اليها، تاريخ كل توقيع لها، وتاريخ ايداع كل وثيقة +
تصديق عليها أو انضمام اليها، وتاريخ بدء نفاذها، وأية اعلانات أخرى +
.تتصل ﺑﻬا

+

٦- تقوم الحكومات الوديعة بتسجيل هذه المعاهدة وفقا للمادة ١٠٢ من ميثاق +
.الأمم المتحدة

+

+ 

+

المادة الخامسة عشرة

+

يجوز لأية دولة من الدول الأطراف في المعاهدة اقتراح ادخال التعديلات عليها +
وتصبح التعديلات نافذة، بالنسبة إلى كل دولة تقبلها من الدول الأطراف في المعاهدة، فور +
نيلها قبول أغلبية الدول الأطراف في المعاهدة، وتنفذ بعد ذلك بالنسبة إلى كل دولة أخرى من +
.الدول الأطراف في المعاهدة، ابتداء من تاريخ قبول هذه الدولة لها

+

+ 

+

المادة السادسة عشرة

+

يجوز لكل دولة من الدول الأطراف في المعاهدة، بعد سنة من نفاذها، تخطر +
بانسحاﺑﻬا منها باعلان كتابي ترسله إلى الحكومات ال وديعة، ويسري الانسحاب بعد سنة من +
.ورود هذا الاعلان

+

+ 

+

المادة السابعة عشرة

+

حررت هذه المعاهدة بخمس لغات رسمية متساوية الحجية هي الاسبانية والانكليزية +
والروسية والصينية والفرنسية، وتودع في محفوظات الحكومات الوديعة . وتقوم الحكومات +
الوديعة بارسال نسخ مصدقة من ه ذه المعاهدة إلى حكومات الدول الموقعة لها أو المنضمة +
.اليها

+

واثباتا لما تقدم ، قام الموقعون أدناه، المفوضون بذلك حسب الأصول، بتوقيع هذه +
.المعاهدة

+

حررت بثلاث نسخ في مدن لندن وموسكو وواشنطن العاصمة في اليوم السابع +
.والعشرين من شهر كانون الثاني/يناير عام ألف وتسعمائة وسبعة وستين

+

 

+
+

关于各国探索和利用外层空间包括月球与其他天体活动所应遵守原则的条约

+

 

+

本条约各缔约国,

+

受到由于人类进入外层空间而在人类面前展现的伟大前景的鼓舞,

+

承认为和平目的而探索和利用外层空间所取得的进展关系到全人类共同的利益,

+

相信外层空间的探索和利用应造福于各国人民,不论他们的经济或科学发展的程度如何,

+

愿意在为和平目的而探索和利用外层空间的科学以及法律方面的广泛国际合作作出贡献,

+

相信这种合作将有助于促进各国和各国人民之间的相互谅解并加强他们之间的友好关系,

+

回顾联合国大会1963 年12 月13 日一致通过的题为"关于各国探索和利用外层空间活动的法律原则宣言"的第1962(XVIII)号决议,

+

回顾联合国大会1963 年10 月17 日一致通过的第1881(XVIII)号决议,要求各国不要将任何载有核武器或任何其他种类大规模毁灭性武器的物体放置在环绕地球的轨道上,也不要在天体上装置这种武器,

+

考虑到联合国大会1947 年11 月3 日第110(II)号决议,谴责旨在或可能煽动或鼓励任何威胁和平、破坏和平或侵略行为的宣传,并认为上述决议也适用于外层空间,

+

深信缔结关于各国探索和利用外层空间包括月球与其他天体活动所应遵守原则的条约,将促进联合国宪章的宗旨和原则,

+

议定条款如下:

+

+    +

+

第一条

+

探索和利用外层空间,包括月球与其他天体在内,应本着为所有国家谋福利与利益的精神,不论其经济或科学发展的程度如何,这种探索和利用应是全人类的事情。

+

外层空间,包括月球与其他天体在内,应由各国在平等基础上并按国际法自由探索和利用,不得有任何歧视,天体的所有地区均得自由进入。

+

对外层空间,包括月球与其他天体在内,应有科学调查的自由,各国应在这类调查方面便利并鼓励国际合作。

+

+    +

+

第二条

+

外层空间,包括月球与其他天体在内,不得由国家通过提出主权主张,通过使用或占领,或以任何其他方法,据为己有。

+

+    +

+

第三条

+

本条约各缔约国探索和利用外层空间,包括月球与其他天体在内的活动,应按照国际法,包括联合国宪章,并为了维护国际和平与安全及增进国际合作与谅解而进行。

+

+    +

+

第四条

+

本条约各缔约国承诺不在环绕地球的轨道上放置任何载有核武器或任何其他种类大规模毁灭性武器的物体,不在天体上装置这种武器,也不以任何其他方式在外层空间设置这种武器。

+

本条约所有缔约国应专为和平目的使用月球和其他天体。禁止在天体上建立军事基地、军事设施和工事,试验任何类型的武器和进行军事演习。不禁止为了科学研究或任何其他和平目的而使用军事人员。为和平探索月球与其他天体所必需的任何装置或设备,也不在禁止之列。

+

+    +

+

第五条

+

本条约各缔约国应把航天员视为人类在外层空间的使者,航天员如遇意外事故、危难或在另一缔约国领土上或公海上紧急降落时,应给予他们一切可能的协助。航天员降落后,应将他们安全和迅速地送回航天器的登记国。

+

在外层空间及天体上进行活动时,任一缔约国的航天员应给予其他缔约国的航天员一切可能的协助。

+

本条约各缔约国如发现在包括月球与其他天体在内的外层空间有对航天员的生命或健康可能构成危险的任何现象,应立即通知本条约其他缔约国或联合国秘书长。

+

+    +

+

第六条

+

本条约各缔约国对本国在外层空间,包括月球与其他天体在内的活动应负国际责任,不论这类活动是由政府机构或是由非政府团体进行的。它并应负国际责任保证本国的活动符合本条约的规定。非政府团体在外层空间,包括月球与其他天体在内的活动,应经本条约有关缔约国批准并受其不断的监督。一个国际组织在外层空间,包括月球与其他天体在内进行活动时,遵守本条约的责任应由该国际组织和参加该国际组织的本条约各缔约国共同承担。

+

+    +

+

第七条

+

凡发射或促使发射物体进入外层空间,包括月球与其他天体在内的缔约国,以及以其领土或设备供发射物体用的缔约国,对于这种物体或其组成部分在地球上、在大气空间或在外层空间,包括月球与其他天体在内,使另一缔约国或其自然人或法人遭受损害时,应负国际责任。

+

+    +

+

第八条

+

凡本条约缔约国为射入外层空间物体的登记国者,对于该物体及其所载人员,当其在外层空间或在某一天体上时,应保有管辖权和控制权。向外层空间发射的物体,包括在某一天体上着陆或建筑的物体及其组成部分的所有权,不因其在外层空间或在某一天体上或因其返回地球而受影响。这类物体或组成部分如果在其所登记的缔约国境外发现,应交还该缔约国,如经请求,该缔约国应在交还前提供认证资料。

+

+    +

+

第九条

+

本条约各缔约国探索和利用外层空间,包括月球与其他天体在内,应以合作和互助的原则为指导,其在外层空间,包括月球与其他天体在内进行的各种活动,应充分注意本条约所有其他缔约国的相应利益。本条约各缔约国对外层空间,包括月球与其他天体在内进行的研究和探索,应避免使它们受到有害污染以及将地球外物质带入而使地球环境发生不利变化,并应在必要时为此目的采取适当措施。如果本条约某一缔约国有理由认为,该国或其国民在外层空间,包括月球与其他天体在内计划进行的活动或实验可能对其他缔约国和平探索和利用外层空间,包括月球与其他天体在内的活动产生有害干扰时,则该缔约国在开始进行任何这种活动或实验之前,应进行适当的国际磋商。如果本条约某一缔约国有理由认为,另一缔约国在外层空间,包括月球与其他天体在内计划进行的活动或实验,可能对和平探索和利用外层空间,包括月球与其他天体在内的活动产生有害干扰时,则该缔约国可请求就该活动或实验进行磋商。

+

+    +

+

第十条

+

为了按照本条约的宗旨促进在探索和利用外层空间,包括月球与其他天体在内的国际合作,本条约各缔约国应在平等基础上,考虑本条约其他缔约国就提供机会对其发射的外层空间物体的飞行进行观察所提出的任何要求。

+

这种观察机会的性质和提供这种机会的条件,应由有关国家议定。

+

+    +

+

第十一条

+

为了促进在和平探索和利用外层空间方面的国际合作,在外层空间,包括月球与其他天体在内进行活动的本条约各缔约国同意,在最大可能和实际可行的范围内,将这类活动的性质、进行情况、地点和结果通知联合国秘书长,并通告公众和国际科学界。联合国秘书长在接到上述情报后,应准备立即作有效传播。

+

+    +

+

第十二条

+

在月球与其他天体上的一切站所、设施、装备和航天器,应在对等的基础上对本条约其他缔约国的代表开放。这些代表应将所计划的参观,在合理的时间内提前通知,以便进行适当的磋商和采取最大限度的预防措施,以保证安全并避免干扰所要参观的设备的正常运行。

+

+    +

+

第十三条

+

本条约的规定应适用于本条约各缔约国探索和利用外层空间,包括月球与其他天体在内的活动,不论这类活动是由某一缔约国单独进行还是与其他国家联合进行,包括在国际政府间组织的范围内进行的活动在内。

+

国际政府间组织在进行探索和利用外层空间,包括月球与其他天体在内的活动时所产生的任何实际问题,应由本条约各缔约国与有关国际组织或与该国际组织内本条约一个或一个以上的缔约国成员解决。

+

+    +

+

第十四条

+

1. 本条约应开放供所有国家签署。未在本条约按照本条第三款生效之前签署的任何国家,得随时加入本条约。

+

2. 本条约须经签署国批准。批准书和加入书应交苏维埃社会主义共和国联盟、大不列颠及北爱尔兰联合王国和美利坚合众国三国政府保存,该三国政府经指定为保存国政府。

+

3. 本条约应自包括经指定为本条约保存国政府的三国政府在内的五国政府交存批准书起生效。

+

4. 对于在本条约生效后交存批准书或加入书的国家,本条约应自其批准书或加入书交存之日起生效。

+

5. 保存国政府应将每一签字的日期、本条约每份批准书和加入书的交存日期和本条约生效日期以及其他通知事项,迅速告知所有签署国和加入国。

+

6. 本条约应由保存国政府遵照联合国宪章第一百零二条办理登记。

+

+    +

+

第十五条

+

本条约任何缔约国得对本条约提出修正案。修正案应自本条约多数缔约国接受之日起,对接受修正案的各缔约国生效,其后,对其余各缔约国则应自其接受之日起生效。

+

+    +

+

第十六条

+

本条约任何缔约国得在条约生效一年后用书面通知保存国政府退出本条约。这种退出应自接到通知一年后生效。

+

+    +

+

第十七条

+

本条约的中文、英文、法文、西班牙文和俄文五种文本具有同等效力;本条约应保存在保存国政府的档案库内。本条约经正式核证的副本应由保存国政府分送签署国和加入国政府。

+

下列签署人,经正式授权,在本条约上签字,以资证明。

+

一九六七年一月二十七日订于伦敦、莫斯科和华盛顿,一式三份。

+
+

RESOLUTION ADOPTED BY THE GENERAL ASSEMBLY

+

+2222 (XXI). Treaty on Principles Governing the Activities of States in the Exploration and Use of Outer Space, including the Moon and Other Celestial Bodies

+

The General Assembly,

+

+Having considered the report of the Committee on the Peaceful Uses of Outer Space covering its work during 1966, + + 1 + and in particular the work accomplished by the Legal Subcommittee during its fifth session, held at Geneva from 12 July to 4 August and at New York from 12 September to 16 September,

+

+Noting further the progress achieved through subsequent consultations among States Members of the United Nations,

+

+Reaffirming the importance of international cooperation in the field of activities in the peaceful exploration and use of outer space, including the Moon and other celestial bodies, and the importance of developing the rule of law in this new area of human endeavour,

+

1.     +Commends the Treaty on Principles Governing the Activities of States in the Exploration and Use of Outer Space, including the Moon and Other Celestial Bodies, the text of which is annexed to the present resolution;

+

2.     +Requests the Depositary Governments to open the Treaty for signature and ratification at the earliest possible date;

+

3.     +Expresses its hope for the widest possible adherence to this Treaty;

+

4.     +Requests the Committee on the Peaceful Uses of Outer Space:

+
+

(a) To continue to work on the elaboration of an agreement on liability for damages caused by the launching of objects into outer space and an agreement on assistance to and return of astronauts and space vehicles, which are on the agenda of the Committee;

+

(b) To begin at the same time the study of questions relative to the definition of outer space and the utilization of outer space and celestial bodies, including the various implications of space communications;

+

(c) To report on the progress of its work to the General Assembly at its twenty-second session.

+
+

 

+

 

+

+ 1499th plenary meeting, +
+ 19 December 1966. +

+  +

ANNEX

+

Treaty on Principles Governing the Activities of States +
in the Exploration and Use of Outer Space, including +
the Moon and Other Celestial Bodies

+

 

+

     +The States Parties to this Treaty,

+

     +Inspired by the great prospects opening up before mankind as a result of man's entry into outer space,

+

     +Recognizing the common interest of all mankind in the progress of the exploration and use of outer space for peaceful purposes,

+

     +Believing that the exploration and use of outer space should be carried on for the benefit of all peoples irrespective of the degree of their economic or scientific development,

+

     +Desiring to contribute to broad international co-operation in the scientific as well as the legal aspects of the exploration and use of outer space for peaceful purposes,

+

     +Believing that such co-operation will contribute to the development of mutual understanding and to the strengthening of friendly relations between States and peoples,

+

     +Recalling resolution 1962 (XVIII), entitled "Declaration of Legal Principles Governing the Activities of States in the Exploration and Use of Outer Space",which was adopted unanimously by the United Nations General Assembly on 13 December 1963,

+

     +Recalling resolution 1884 (XVIII), calling upon States to refrain from placing in orbit around the earth any objects carrying nuclear weapons or any other kinds of weapons of mass destruction or from installing such weapons on celestial bodies, which was adopted unanimously by the United Nations General Assembly on 17 October 1963,

+

     +Taking account of United Nations General Assembly resolution 110 (II) of 3 November 1947, which condemned propaganda designed or likely to provoke or encourage any threat to the peace, breach of the peace or act of aggression, and considering that the aforementioned resolution is applicable to outer space,

+

     +Convinced that a Treaty on Principles Governing the Activities of States in the Exploration and Use of Outer Space, including the Moon and Other Celestial Bodies, will further the purposes and principles of the Charter of the United Nations,

+

     +Have agreed on the following:

+

 

+
+

+ Article I +

+
+

    The exploration and use of outer space, including the moon and other celestial bodies, shall be carried out for the benefit and in the interests of all countries, irrespective of their degree of economic or scientific development, and shall be the province of all mankind.

+

    Outer space, including the moon and other celestial bodies, shall be free for exploration and use by all States without discrimination of any kind, on a basis of equality and in accordance with international law, and there shall be free access to all areas of celestial bodies.

+

    There shall be freedom of scientific investigation in outer space, including the moon and other celestial bodies, and States shall facilitate and encourage international co-operation in such investigation.

+

 

+
+

+ Article II +

+
+

    Outer space, including the moon and other celestial bodies, is not subject to national appropriation by claim of sovereignty, by means of use or occupation, or by any other means.

+

 

+
+

+ Article III +

+
+

    States Parties to the Treaty shall carry on activities in the exploration and use of outer space, including the moon and other celestial bodies, in accordance with international law, including the Charter of the United Nations, in the interest of maintaining international peace and security and promoting international co-operation and understanding.

+

 

+
+

+ Article IV +

+
+

    States Parties to the Treaty undertake not to place in orbit around the earth any objects carrying nuclear weapons or any other kinds of weapons of mass destruction, install such weapons on celestial bodies, or station such weapons in outer space in any other manner.

+

    The moon and other celestial bodies shall be used by all States Parties to the Treaty exclusively for peaceful purposes. The establishment of military bases, installations and fortifications, the testing of any type of weapons and the conduct of military manoeuvres on celestial bodies shall be forbidden. The use of military personnel for scientific research or for any other peaceful purposes shall not be prohibited. The use of any equipment or facility necessary for peaceful exploration of the moon and other celestial bodies shall also not be prohibited.

+
+

+ +

+
+

Article V

+

    States Parties to the Treaty shall regard astronauts as envoys of mankind in outer space and shall render to them all possible assistance in the event of accident, distress, or emergency landing on the territory of another State Party or on the high seas. When astronauts make such a landing, they shall be safely and promptly returned to the State of registry of their space vehicle.

+

    In carrying on activities in outer space and on celestial bodies, the astronauts of one State Party shall render all possible assistance to the astronauts of other States Parties.

+

    States Parties to the Treaty shall immediately inform the other States Parties to the Treaty or the Secretary-General of the United Nations of any phenomena they discover in outer space, including the moon and other celestial bodies, which could constitute a danger to the life or health of astronauts.

+

 

+
+

+ Article VI +

+
+

    States Parties to the Treaty shall bear international responsibility for national activities in outer space, including the moon and other celestial bodies, whether such activities are carried on by governmental agencies or by non-governmental entities, and for assuring that national activities are carried out in conformity with the provisions set forth in the present Treaty. The activities of non-governmental entities in outer space, including the moon and other celestial bodies, shall require authorization and continuing supervision by the appropriate State Party to the Treaty. When activities are carried on in outer space, including the moon and other celestial bodies, by an international organization, responsibility for compliance with this Treaty shall be borne both by the international organization and by the States Parties to the Treaty participating in such organization.

+

 

+
+

+ Article VII +

+
+

    Each State Party to the Treaty that launches or procures the launching of an object into outer space, including the moon and other celestial bodies, and each State Party from whose territory or facility an object is launched, is internationally liable for damage to another State Party to the Treaty or to its natural or juridical persons by such object or its component parts on the Earth, in air or in outer space, including the moon and other celestial bodies.

+
+

+ Article VIII +

+
+

    A State Party to the Treaty on whose registry an object launched into outer space is carried shall retain jurisdiction and control over such object, and over any personnel thereof, while in outer space or on a celestial body. Ownership of objects launched into outer space, including objects landed or constructed on a celestial body, and of their component parts, is not affected by their presence in outer space or on a celestial body or by their return to the Earth. Such objects or component parts found beyond the limits of the State Party to the Treaty on whose registry they are carried shall be returned to that State Party, which shall, upon request, furnish identifying data prior to their return.

+

 

+

Article IX

+

    In the exploration and use of outer space, including the moon and other celestial bodies, States Parties to the Treaty shall be guided by the principle of co-operation and mutual assistance and shall conduct all their activities in outer space, including the moon and other celestial bodies, with due regard to the corresponding interests of all other States Parties to the Treaty. States Parties to the Treaty shall pursue studies of outer space, including the moon and other celestial bodies, and conduct exploration of them so as to avoid their harmful contamination and also adverse changes in the environment of the Earth resulting from the introduction of extraterrestrial matter and, where necessary, shall adopt appropriate measures for this purpose. If a State Party to the Treaty has reason to believe that an activity or experiment planned by it or its nationals in outer space, including the moon and other celestial bodies, would cause potentially harmful interference with activities of other States Parties in the peaceful exploration and use of outer space, including the moon and other celestial bodies, it shall undertake appropriate international consultations before proceeding with any such activity or experiment. A State Party to the Treaty which has reason to believe that an activity or experiment planned by another State Party in outer space, including the moon and other celestial bodies, would cause potentially harmful interference with activities in the peaceful exploration and use of outer space, including the moon and other celestial bodies, may request consultation concerning the activity or experiment.

+

 

+

+ Article X +

+

    In order to promote international co-operation in the exploration and use of outer space, including the moon and other celestial bodies, in conformity with the purposes of this Treaty, the States Parties to the Treaty shall consider on a basis of equality any requests by other States Parties to the Treaty to be afforded an opportunity to observe the flight of space objects launched by those States. The nature of such an opportunity for observation and the conditions under which it could be afforded shall be determined by agreement between the States concerned.

+

  

+

+ Article XI +

+

    In order to promote international co-operation in the peaceful exploration and use of outer space, States Parties to the Treaty conducting activities in outer space, including the moon and other celestial bodies, agree to inform the Secretary-General of the United Nations as well as the public and the international scientific community, to the greatest extent feasible and practicable, of the nature, conduct, locations and results of such activities. On receiving the said information, the Secretary-General of the United Nations should be prepared to disseminate it immediately and effectively.

+

 

+

+ Article XII +

+

    All stations, installations, equipment and space vehicles on the moon and other celestial bodies shall be open to representatives of other States Parties to the Treaty on a basis of reciprocity. Such representatives shall give reasonable advance notice of a projected visit, in order that appropriate consultations may be held and that maximum precautions may betaken to assure safety and to avoid interference with normal operations in the facility to be visited.

+

 

+

+ Article XIII +

+

    The provisions of this Treaty shall apply to the activities of States Parties to the Treaty in the exploration and use of outer space, including the moon and other celestial bodies, whether such activities are carried on by a single State Party to the Treaty or jointly with other States, including cases where they are carried on within the framework of international intergovernmental organizations.

+

    Any practical questions arising in connection with activities carried on by international intergovernmental organizations in the exploration and use of outer space, including the moon and other celestial bodies, shall be resolved by the States Parties to the Treaty either with the appropriate international organization or with one or more States members of that international organization, which are Parties to this Treaty.

+

 

+

+ Article XIV +

+

+ 1.   This Treaty shall be open to all States for signature. Any State which does not sign this Treaty before its entry into force in accordance with paragraph 3 of this article may accede to it at anytime. +

+

+ 2.  This Treaty shall be subject to ratification by signatory States. Instruments of ratification and instruments of accession shall be deposited with the Governments of the United Kingdom of Great Britain and Northern Ireland, the Union of Soviet Socialist Republics and the United States of America, which are hereby designated the Depositary Governments. +

+

+ 3.  This Treaty shall enter into force upon the deposit of instruments of ratification by five Governments including the Governments designated as Depositary Governments under this Treaty. +

+

+ 4.  For States whose instruments of ratification or accession are deposited subsequent to the entry into force of this Treaty, it shall enter into force on the date of the deposit of their instruments of ratification or accession. +

+

+ 5.  The Depositary Governments shall promptly inform all signatory and acceding States of the date of each signature, the date of deposit of each instrument of ratification of and accession to this Treaty, the date of its entry into force and other notices. +

+

+ 6.  This Treaty shall be registered by the Depositary Governments pursuant to Article 102 of the Charter of the United Nations. +

+

  

+

+ Article XV +

+

    Any State Party to the Treaty may propose amendments to this Treaty. Amendments shall enter into force for each State Party to the Treaty accepting the amendments upon their acceptance by a majority of the States Parties to the Treaty and thereafter for each remaining State Party to the Treaty on the date of acceptance by it.

+

 

+

+ Article XVI +

+

    Any State Party to the Treaty may give notice of its withdrawal from the Treaty one year after its entry into force by written notification to the Depositary Governments. Such withdrawal shall take effect one year from the date of receipt of this notification.

+

 

+ +
+

Article XVII

+
+

    This Treaty, of which the English, Russian, French, Spanish and Chinese texts are equally authentic, shall be deposited in the archives of the Depositary Governments. Duly certified copies of this Treaty shall be transmitted by the Depositary Governments to the Governments of the signatory and acceding States.

+

    IN WITNESS WHEREOF the undersigned, duly authorized, have signed this Treaty.

+

DONE in triplicate, at the cities of London, Moscow and Washington, the twenty-seventh day of January, one thousand nine hundred and sixty-seven.

+
+
+

 

+

Note

+
+

+1.    +Official Records of the General Assembly, Twenty-first Session, agenda items 30, 89 and 91, document A/6431.

+

+ Back +

+
+
+

 

+
  +
+

2222 (XXI). Traité sur les principes régissant les activités des États en matière d'exploration et d'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes

+

+ L'Assemblée générale, +

+

+Ayant examiné le rapport du Comité des utilisations pacifiques de l'espace extra-atmosphérique sur ses travaux de l'année + + 1 + , et en particulier l'œuvre accomplie par le Sous-Comité juridique à sa cinquième session, tenue à Genève du 12 juillet au 4 août et à New York du 12 au 16 septembre,

+

+Notant en outre les progrès accomplis grâce à des consultations ultérieures entre les États Membres de l'Organisation des Nations Unies,

+

+Réaffirmant l'importance de la coopération internationale dans le domaine des activités touchant l'exploration et l'utilisation pacifques de l'espace extra-atmopshérique, y compris la Lune et les autres célestes, et l'importance qu'il y a à promouvoir le règne du droit dans ce nouveau domaine de l'effort humain,

+

1.     +Se félicite du Traité sur les principes régissant les activités des États en matière d'exploration et d'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, dont le texte est joint en annexe à la présente résolution;

+

2.     +Prie les gouvernements dépositaires d'ouvrir le Traité aussitôt à la signature et à la ratification;

+

3.     +Exprime l'espoir d'une adhésion aussi large que possible audit Traité;

+

4.     +Prie le Comité des utilisations pacifique de l'espace extra-atmopshérique:

+
+

(a) De poursuivre ses travaux concernant l'élaboration d'un accord sur la responsibilité pour les dommages causés par des objets lancés dans l'espace extra-atmopshérique et d'un accord sur l'assistance aux astronautes et aux vehicules spatiaux, le retour des astronautes et la restitution des véhicules spatiaux, qui sont à l'ordre du jour du Comité;

+

(b) D'entreprendre en même temps l'étude de questions relatives à la définition de l'espace extra-atmopshérique et des corps célestes, y compris les diverses conséquences des communications spatiales;

+

(c) De rendre compte de la marche de ses travaux à l'Assemblée générale lors de la vingt-deuxième session.

+
+

+ 1499 + e séance plénière, +
19 décembre 1966
+

+

  

+

  

+

ANNEXE

+

Traité sur les principes régissant les activités des États +
en matière d'exploration et d'utilisation de l'espace +
extra-atmosphérique, y compris la Lune et les +
autres corps célestes

+

 

+

+Les États parties au présent Traité

+

+S'inspirant des vastes perspectives qui s'offrent à l'humanité du fait de la découverte de l'espace extra-atmosphérique par l'homme,

+

+Reconnaissant l'intérêt que présente pour l'humanité tout entière le progrès de l'exploration et de l'utilisation de l'espace extra-atmosphérique à des fins pacifiques,

+

+Estimant que l'exploration et l'utilisation de l'espace extra-atmosphérique devraient s'effectuer pour le bien de tous les peuples, quel que soit le stade de leur +
développement économique ou scientifique,

+

+Désireux de contribuer au développement d'une large coopération internationale en ce qui concerne les aspects scientifiques aussi bien que juridiques de l'exploration et de l'utilisation de l'espace extra-atmosphérique à des fins pacifiques,

+

+Estimant que cette coopération contribuera à développer la compréhension mutuelle et à consolider les relations amicales entre les États et entre les peuples,

+

+Rappelant la résolution 1962 (XVIII), intitulée "Déclaration des principes juridiques régissant les activités des États en matière d'exploration et d'utilisation de l'espace extra-atmosphérique", que l'Assemblée générale des Nations Unies a adoptée à l'unanimité le 13 décembre 1963,

+

+Rappelant la résolution 1884 (XVIII), qui engage les États à s'abstenir de mettre sur orbite autour de la Terre tous objets porteurs d'armes nucléaires ou de tout autre type d'armes de destruction massive et d'installer de telles armes sur des corps célestes, résolution que l'Assemblée générale des Nations Unies a adoptée à l'unanimité le 17 octobre 1963,

+

+Tenant comptede la résolution 110 (II) de l'Assemblée générale des Nations Unies en date du 3 novembre 1947, résolution qui condamne la propagande destinée ou de nature à provoquer ou à encourager toute menace à la paix, toute rupture de la paix ou tout acte d'agression, et considérant que ladite résolution est applicable à l'espace extra-atmosphérique,

+

+Convaincus que le Traité sur les principes régissant les activités des États en matière d'exploration et d'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, contribuera à la réalisation des buts et principes de la Charte des Nations Unies,

+

+Sont convenus de ce qui suit:

+

+    +

+

Article premier

+

L'exploration et l'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, doivent se faire pour le bien et dans l'intérêt de tous les pays, quel que soit le stade de leur développement économique ou scientifique; elles sont l'apanage de l'humanité tout entière.

+

L'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, peut être exploré et utilisé librement par tous les États sans aucune discrimination, dans des conditions d'égalité et conformément au droit international, toutes les régions des corps célestes devant être librement accessibles.

+

Les recherches scientifiques sont libres dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, et les États doivent faciliter et encourager la coopération internationale dans ces recherches.

+

+    +

+

Article II

+

L'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, ne peut faire l'objet d'appropriation nationale par proclamation de souveraineté, ni par voie d'utilisation ou d'occupation, ni par aucun autre moyen.

+

+    +

+

Article III

+

Les activités des États parties au Traité relatives à l'exploration et à l'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, doivent s'effectuer conformément au droit international, y compris la Charte des Nations Unies, en vue de maintenir la paix et la sécurité internationales et de favoriser la coopération et la compréhension internationales.

+

+    +

+

Article IV

+

Les États parties au Traité s'engagent à ne mettre sur orbite autour de la Terre aucun objet porteur d'armes nucléaires ou de tout autre type d'armes de destruction massive, à ne pas installer de telles armes sur des corps célestes et à ne pas placer de telles armes, de toute autre manière, dans l'espace extra-atmosphérique.

+

Tous les États parties au Traité utiliseront la Lune et les autres corps célestes exclusivement à des fins pacifiques. Sont interdits sur les corps célestes l'aménagement de bases et installations militaires et de fortifications, les essais d'armes de tous types et l'exécution de manoeuvres militaires. N'est pas interdite l'utilisation de personnel militaire à des fins de recherche scientifique ou à toute autre fin pacifique. N'est pas interdite non plus l'utilisation de tout équipement ou installation nécessaire à l'exploration pacifique de la Lune et des autres corps célestes.

+

+    +

+

Article V

+

Les États parties au Traité considéreront les astronautes comme des envoyés de l'humanité dans l'espace extra-atmosphérique et leur prêteront toute l'assistance possible en cas d'accident, de détresse ou d'atterrissage forcé sur le territoire d'un autre État partie au Traité ou d'amerrissage en haute mer. En cas d'un tel atterrissage ou amerrissage, le retour des astronautes à l'État d'immatriculation de leur véhicule spatial devra être effectué promptement et en toute sécurité.

+

Lorsqu'ils poursuivront des activités dans l'espace extra-atmosphérique et sur les corps célestes, les astronautes d'un État partie au Traité prêteront toute l'assistance possible aux astronautes des autres États parties au Traité.

+

Les États parties au Traité porteront immédiatement à la connaissance des autres États parties au Traité ou du Secrétaire général de l'Organisation des Nations Unies tout phénomène découvert par eux dans l'espace extra-atmosphérique, y compris la Lune et les corps célestes, qui pourrait présenter un danger pour la vie ou la santé des astronautes.

+

+    +

+

Article VI

+

Les États parties au Traité ont la responsabilité internationale des activités nationales dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, qu'elles soient entreprises par des organismes gouvernementaux ou par des entités non gouvernementales, et de veiller à ce que les activités nationales soient poursuivies conformément aux dispositions énoncées dans le présent Traité. Les activités des entités non gouvernementales dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, doivent faire l'objet d'une autorisation et d'une surveillance continue de la part de l'État approprié partie au Traité. En cas d'activités poursuivies par une organisation internationale dans l'espace extraatmosphérique, y compris la Lune et les autres corps célestes, la responsabilité du respect des dispositions du présent Traité incombera à cette organisation internationale et aux États parties au Traité qui font partie de ladite organisation.

+

+    +

+

Article VII

+

Tout État partie au Traité qui procède ou fait procéder au lancement d'un objet dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, et tout État partie dont le territoire ou les installations servent au lancement d'un objet, est responsable du point de vue international des dommages causés par ledit objet ou par ses éléments constitutifs, sur la Terre, dans l'atmosphère ou dans l'espace extraatmosphérique, y compris la Lune et les autres corps célestes, à un autre État partie au Traité ou aux personnes physiques ou morales qui relèvent de cet autre État.

+

+    +

+

Article VIII

+

L'État partie au Traité sur le registre duquel est inscrit un objet lancé dans l'espace extra-atmosphérique conservera sous sa juridiction et son contrôle ledit objet et tout le personnel dudit objet, alors qu'ils se trouvent dans l'espace extraatmosphérique ou sur un corps céleste. Les droits de propriété sur les objets lancés dans l'espace extra-atmosphérique, y compris les objets amenés ou construits sur un corps céleste, ainsi que sur leurs éléments constitutifs, demeurent entiers lorsque ces objets ou éléments se trouvent dans l'espace extra-atmosphérique ou sur un corps céleste, et lorsqu'ils reviennent sur la Terre. Les objets ou éléments constitutifs d'objets trouvés au-delà des limites de l'État partie au Traité sur le registre duquel ils sont inscrits doivent être restitués à cet État partie au Traité, celui-ci étant tenu de fournir, sur demande, des données d'identification avant la restitution.

+

+    +

+

Article IX

+

En ce qui concerne l'exploration et l'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, les États parties au Traité devront se fonder sur les principes de la coopération et de l'assistance mutuelle et poursuivront toutes leurs activités dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, en tenant dûment compte des intérêts correspondants de tous les autres États parties au Traité. Les États parties au Traité effectueront l'étude de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, et procéderont à leur exploration de manière à éviter les effets préjudiciables de leur contamination ainsi que les modifications nocives du milieu terrestre résultant de l'introduction de substances extraterrestres et, en cas de besoin, ils prendront les mesures appropriées à cette fin. Si un État partie au Traité a lieu de croire qu'une activité ou expérience envisagée par lui-même ou par ses ressortissants dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, causerait une gêne potentiellement nuisible aux activités d'autres États parties au Traité en matière d'exploration et d'utilisation pacifiques de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, il devra engager les consultations internationales appropriées avant d'entreprendre ladite activité ou expérience. Tout État partie au Traité ayant lieu de croire qu'une activité ou expérience envisagée par un autre État partie au Traité dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, causerait une gêne potentiellement nuisible aux activités poursuivies en matière d'exploration et d'utilisation pacifiques de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, peut demander que des consultations soient ouvertes au sujet de ladite activité ou expérience.

+

+    +

+

Article X

+

Pour favoriser la coopération en matière d'exploration et d'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, conformément aux buts du présent Traité, les États parties au Traité examineront dans des conditions d'égalité les demandes des autres États parties au Traité tendant à obtenir des facilités pour l'observation du vol des objets spatiaux lancés par ces États.

+

La nature de telles facilités d'observation et les conditions dans lesquelles elles pourraient être consenties seront déterminées d'un commun accord par les États intéressés.

+

+    +

+

Article XI

+

Pour favoriser la coopération internationale en matière d'exploration et d'utilisation pacifiques de l'espace extra-atmosphérique, les États parties au Traité qui mènent des activités dans l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, conviennent, dans toute la mesure où cela est possible et réalisable, d'informer le Secrétaire général de l'Organisation des Nations Unies, ainsi que le public et la communauté scientifique internationale, de la nature et de la conduite de ces activités, des lieux où elles sont poursuivies et de leurs résultats. Le Secrétaire général de l'Organisation des Nations Unies devra être prêt à assurer, aussitôt après les avoir reçus, la diffusion effective de ces renseignements.

+

+    +

+

Article XII

+

Toutes les stations et installations, tout le matériel et tous les véhicules spatiaux se trouvant sur la Lune ou sur d'autres corps célestes seront accessibles, dans des conditions de réciprocité, aux représentants des autres États au Traité. Ces représentants notifieront au préalable toute visite projetée, de façon que les consultations voulues puissent avoir lieu et que le maximum de précautions puissent être prises pour assurer la sécurité et éviter de gêner les opérations normales sur les lieux de l'installation à visiter.

+

+    +

+

Article XIII

+

Les dispositions du présent Traité s'appliquent aux activités poursuivies par les États parties au Traité en matière d'exploration et d'utilisation de l'espace extraatmosphérique, y compris la Lune et les autres corps célestes, que ces activités soient menées par un État partie au Traité seul ou en commun avec d'autres États, notamment dans le cadre d'organisations intergouvernementales internationales.

+

Toutes questions pratiques se posant à l'occasion des activités poursuivies par des organisations intergouvernementales internationales en matière d'exploration et d'utilisation de l'espace extra-atmosphérique, y compris la Lune et les autres corps célestes, seront réglées par les États parties au Traité soit avec l'organisation internationale compétente, soit avec un ou plusieurs des États membres de ladite organisation qui sont parties au Traité.

+

+    +

+

Article XIV

+

1. Le présent Traité est ouvert à la signature de tous les États. Tout État qui n'aura pas signé le présent Traité avant son entrée en vigueur conformément au paragraphe 3 du présent article pourra y adhérer à tout moment.

+

2. Le présent Traité sera soumis à la ratification des États signataires. Les instruments de ratification et les instruments d'adhésion seront déposés auprès des Gouvernements des États-Unis d'Amérique, du Royaume-Uni de Grande-Bretagne et d'Irlande du Nord et de l'Union des Républiques socialistes soviétiques, qui sont, dans le présent Traité, désignés comme étant les gouvernements dépositaires.

+

3. Le présent Traité entrera en vigueur lorsque cinq gouvernements, y compris ceux qui sont désignés comme étant les gouvernements dépositaires aux termes du présent Traité, auront déposé leurs instruments de ratification.

+

4. Pour les États dont les instruments de ratification ou d'adhésion seront déposés après l'entrée en vigueur du présent Traité, celui-ci entrera en vigueur à la date du dépôt de leurs instruments de ratification ou d'adhésion.

+

5. Les gouvernements dépositaires informeront sans délai tous les États qui auront signé le présent Traité ou y auront adhéré de la date de chaque signature, de la date du dépôt de chaque instrument de ratification du présent Traité ou d'adhésion au présent Traité, de la date d'entrée en vigueur du Traité ainsi que de toute autre communication.

+

6. Le présent Traité sera enregistré par les gouvernements dépositaires conformément à l'Article 102 de la Charte des Nations Unies.

+

+    +

+

Article XV

+

Tout État partie au présent Traité peut proposer des amendements au Traité. Les amendements prendront effet à l'égard de chaque État partie au Traité acceptant les amendements dès qu'ils auront été acceptés par la majorité des États parties au Traité et, par la suite, pour chacun des autres États parties au Traité, à la date de son acceptation desdits amendements.

+

+    +

+

Article XVI

+

Tout État partie au présent Traité peut, un an après l'entrée en vigueur du Traité, communiquer son intention de cesser d'y être partie par voie de notification écrite adressée aux gouvernements dépositaires. Cette notification prendra effet un an après la date à laquelle elle aura été reçue.

+

+    +

+

Article XVII

+

Le présent Traité, dont les textes anglais, chinois, espagnol, français et russe font également foi, sera déposé dans les archives des gouvernements dépositaires. Des copies dûment certifiées du présent Traité seront adressées par les gouvernements dépositaires aux gouvernements des États qui auront signé le Traité ou qui y auront adhéré.

+

EN FOI DE QUOI les soussignés, dûment habilités à cet effet, ont signé le présent Traité.

+

FAIT en trois exemplaires, à Londres, Moscou et Washington, le vingt-sept janvier mil neuf cent soixante-sept.

+
+

2222 (XXI). Договор о принципах деятельности государств по исследованию и использованию космического пространства, включая Луну и другие небесные тела

+

 

+

+Государства - участники настоящего Договора,

+

+воодушевленные великими перспективами, открывающимися перед человечеством в результате проникновения человека в космос,

+

+признавая общую заинтересованность всего человечества в прогрессе исследования и использования космического пространства в мирных целях,

+

+полагая, что исследование и использование космического пространства должны быть направлены на благо всех народов, независимо от степени их экономического или научного развития,

+

+желая содействовать развитию широкого международного сотруд-ничества как в научных, так и в юридических аспектах исследования и использования космического пространства в мирных целях,

+

+полагая, что такое сотрудничество будет содействовать развитию взаимопонимания и укреплению дружественных отношений между госу-дарствами и народами,

+

+напоминая резолюцию 1962 (XVIII), озаглавленную "Декларация правовых принципов в деятельности государств по исследованию и использованию космического пространства", единодушно принятую Гене-ральной Ассамблеей Организации Объединенных Наций 13 декабря 1963 года,

+

+напоминая резолюцию 1884 (XVIII), призывающую государства воз-держиваться от вывода на орбиту вокруг Земли любых объектов с ядерным оружием или любыми другими видами оружия массового уничтожения или от установки такого оружия на небесных телах, едино-душно принятую Генеральной Ассамблеей Организации Объединенных Наций 17 октября 1963 года,

+

+принимая во внимание резолюцию Генеральной Ассамблеи Организации Объединенных Наций 110 (II) от 3 ноября 1947 года, которая осуждает пропаганду, имеющую целью или способную создать или усилить угрозу миру, нарушение мира или акты агрессии, и считая, что указанная резолюция применима к космическому пространству,

+

+будучи убежденными, что Договор о принципах деятельности государств по исследованию и использованию космического пространства, включая Луну и другие небесные тела, будет способствовать осуществлению целей и принципов Устава Организации Объединенных Наций,

+

+согласились о нижеследующем:

+

+    +

+

Статья I

+

Исследование и использование космического пространства, включая Луну и другие небесные тела, осуществляются на благо и в интересах всех стран, независимо от степени их экономического или научного развития, и являются достоянием всего человечества.

+

Космическое пространство, включая Луну и другие небесные тела, открыто для исследования и использования всеми государствами без какой бы то ни было дискриминации на основе равенства и в соответствии с международным правом, при свободном доступе во все районы небесных тел.

+

Космическое пространство, включая Луну и другие небесные тела, свободно для научных исследований, и государства содействуют и поощряют международное сотрудничество в таких исследованиях.

+

+    +

+

Статья II

+

Космическое пространство, включая Луну и другие небесные тела, не подлежит национальному присвоению ни путем провозглашения на них суверенитета, ни путем использования или оккупации, ни любыми другими средствами.

+

+    +

+

Статья III

+

Государства - участники Договора осуществляют деятельность по исследованию и использованию космического пространства, в том числе Луны и других небесных тел, в соответствии с международным правом, включая Устав Организации Объединенных Наций, в интересах поддержания международного мира и безопасности и развития международного сотрудничества и взаимопонимания.

+

+    +

+

Статья IV

+

Государства - участники Договора обязуются не выводить на орбиту вокруг Земли любые объекты с ядерным оружием или любыми другими видами оружия массового уничтожения, не устанавливать такое оружие на небесных телах и не размещать такое оружие в космическом пространстве каким-либо иным образом.

+

Луна и другие небесные тела используются всеми государствами - участниками Договора исключительно в мирных целях. Запрещается создание на небесных телах военных баз, сооружений и укреплений, испытание любых типов оружия и проведение военных маневров. Использование военного персонала для научных исследований или каких- либо иных мирных целей не запрещается. Не запрещается также использование любого оборудования или средств, необходимых для мирного исследования Луны и других небесных тел.

+

+    +

+

Статья V

+

Государства - участники Договора рассматривают космонавтов как посланцев человечества в космос и оказывают им всемерную помощь в случае аварии, бедствия или вынужденной посадки на территории другого государства - участника Договора или в открытом море. Космонавты, которые совершают такую вынужденную посадку, должны быть в безопасности и незамедлительно возвращены государству, в регистр которого занесен их космический корабль.

+

При осуществлении деятельности в космическом пространстве, в том числе и на небесных телах, космонавты одного государства - участника Договора оказывают возможную помощь космонавтам других государств - участников Договора.

+

Государства - участники Договора незамедлительно информируют другие государства - участники Договора или Генерального секретаря Организации Объединенных Наций об установленных ими явлениях в космическом пространстве, включая Луну и другие небесные тела, которые могли бы представить опасность для жизни или здоровья космонавтов.

+

+    +

+

Статья VI

+

Государства - участники Договора несут международную ответствен- ность за национальную деятельность в космическом пространстве, включая Луну и другие небесные тела, независимо от того, осуществляется ли она правительственными органами или неправительственными юридическими лицами, и за обеспечение того, чтобы национальная деятельность проводилась в соответствии с положениями, содержащимися в настоящем Договоре. Деятельность неправительственных юридических лиц в космическом пространстве, включая Луну и другие небесные тела, должна проводиться с разрешения и под постоянным наблюдением соответ- ствующего государства - участника Договора. В случае деятельности в космическом пространстве, включая Луну и другие небесные тела, международной организации, ответственность за выполнение настоящего Договора несут, наряду с международной организацией, также и участвующие в ней государства - участники Договора.

+

+    +

+

Статья VII

+

Каждое государство - участник Договора, которое осуществляет или организует запуск объекта в космическое пространство, включая Луну и другие небесные тела, а также каждое государство - участник Договора, с территории или установок которого производится запуск объекта, несет международную ответственность за ущерб, причиненный такими объектами или их составными частями на Земле, в воздушном или в космическом пространстве, включая Луну и другие небесные тела, другому государству - участнику Договора, его физическим или юридическим лицам.

+

+    +

+

Статья VIII

+

Государство - участник Договора, в регистр которого занесен объект, запущенный в космическое пространство, сохраняет юридисдикцию и контроль над таким объектом и над любым экипажем этого объекта во время их нахождения в космическом пространстве, в том числе и на небесном теле. Права собственности на космические объекты, запущенные в космическое пространство, включая объекты, доставленные или сооруженные на небесном теле, и на их составные части остаются незатронутыми во время их нахождения в космическом пространстве или на небесном теле, или по возвращении на Землю. Такие объекты или их составные части, обнару- женные за пределами государства - участника Договора, в регистр которого они занесены, должны быть возвращены этому государству - участнику Договора; при этом такое государство должно по требованию представить до возвращения опознавательные данные.

+

+    +

+

Статья IX

+

При исследовании и использовании космического пространства, включая Луну и другие небесные тела, государства - участники Договора должны руководствоваться принципом сотрудничества и взаимной помощи и должны осуществлять всю свою деятельность в космическом пространстве, включая Луну и другие небесные тела, с должным учетом соответствующих интересов всех других государства - участников Договора. Государства - участники Договора осуществляют изучение и исследование космического пространства, включая Луну и другие небесные тела, таким образом, чтобы избегать их вредного загрязнения, а также неблагоприятных изменений земной среды вследствие доставки внеземного вещества, и с этой целью, в случае необходимости, принимают соответствующие меры. Если какое-либо государство - участник Договора имеет основания полагать, что деятельность или эксперимент, запланированные этим государством - участником Дого- вора или гражданами этого государства - участника Договора в космическом пространстве, включая Луну и другие небесные тела, создадут потенциально вредные помехи деятельности других государств - участников Договора в деле мирного исследования и использования космического пространства, включая Луну и другие небесные тела, то оно должно провести соот- ветствующие международные консультации, прежде чем приступить к такой деятельности или эксперименту. Государство - участник Договора, имеющее основание полагать, что деятельность или эксперимент, запланированные другим государством - участником Договора в космическом пространстве, включая Луну и другие небесные тела, создадут потенциально вредные помехи деятельности в деле мирного исследования и использования космического пространства, включая Луну и другие небесные тела, может запросить проведения консультаций относительно такой деятельности или эксперимента.

+

+    +

+

Статья X

+

Для содействия международному сотрудничеству в исследовании и использовании космического пространства, включая Луну и другие небесные тела, в соответствии с целями настоящего Договора, государства - участники Договора будут на равных основаниях рассматривать просьбы других государств - участников Договора о предоставлении им возможности для наблюдения за полетом запускаемых этими государствами космических объектов.

+

Характер и условия предоставления упомянутой выше возможности определяются по соглашению между заинтересованными государствами.

+

+    +

+

Статья XI

+

Для содействия международному сотрудничеству в мирном исследовании и использовании космического пространства государства - участники Договора, осуществляющие деятельность в космическом пространстве, включая Луну и другие небесные тела, соглашаются в максимально возможной и практически осуществимой степени инфор- мировать Генерального секретаря Организации Объединенных Наций, а также общественность и международное научное сообщество о характера, ходе, местах и результатах такой деятельности. По получении указанной выше информации Генеральный секретарь Организации Объединенных Наций должен быть готов к ее немедленному и эффективному распространению.

+

+    +

+

Статья XII

+

Все станции, установки, оборудование и космические корабли на Луне и на других небесных телах открыты для представителей других государств - участников настоящего Договора на основе взаимности. Эти представители заблаговременно сообщают о проектируемом посещении, чтобы позволить провести соответствующие консультации и принять меры максимальной предосторожности для обеспечения безопасности и во избежание помех для нормальных операций на установке, подлежащей посещению.

+

+    +

+

Статья XIII

+

Положения настоящего Договора применяются в отношении деятель- ности государств - участников Договора по исследованию и использованию космического пространства, включая Луну и другие небесные тела, независимо от того, осуществляется ли такая деятельность одним госу- дарством - участником Договора или совместно с другими государствами, в том числе в рамках международных межправительственных организаций.

+

Практические вопросы, которые могут возникать в связи с осуществлением международными межправительственными организациями деятельности по исследованию и использованию космического пространства, включая Луну и другие небесные тела, решаются государствами - участниками Договора либо с соответствующей международной организацией, либо с одним или несколькими государствами - членами этой международной организации, являющимися участниками настоящего Договора.

+

+    +

+

Статья XIV

+

1. Настоящий Договор будет открыт для подписания его всеми государствами. Любое государство, которое не подпишет настоящей Договор до вступления его в силу в соответствии с пунктом 3 данной статьи, может присоединиться к нему в любое время.

+

2. Настоящий Договор подлежит ратификации государствами, подписавшими его. Ратификационные грамоты и документы о присоединении должны быть сданы на хранение правительствам Союза Советских Социалистических Республик, Соединенного Королевства Великобритании и Северной Ирландии и Соединенных Штатов Америки, которые настоящим назначаются в качестве правительств- депозитариев.

+

3. Настоящий Договор вступает в силу после сдачи на хранение ратификационных грамот пятью правительствами, включая прави- тельства, назначенные в качестве правительств - депозитариев настоящего Договора.

+

4. Для государств, ратификационные грамоты или документы о присоединении которых будут сданы на хранение после вступления в силу настоящего Договора, он вступит в силу в день сдачи на хранение их ратификационных грамот или документов о присоединении.

+

5. Правительства-депозитарии незамедлительно уведомляют все подписавшие и присоединившиеся к настоящему Договору государства о дате каждого подписания, о дате сдачи на хранение каждой ратификационной грамоты и документа о присоединении, о дате вступления в силу настоящего Договора, а также о других уведомлениях.

+

6. Настоящий Договор будет зарегистрирован правительствами- депозитариями в соответствии со статьей 102 Устава Организации Объединенных Наций.

+

+    +

+

Статья XV

+

Любое государство - участник Договора может предлагать поправки к настоящему Договору. Поправки вступают в силу для каждого государства - участника Договора, принимающего эти поправки, после принятия их большинством государств - участников Договора, а впоследствии для каждого оставшегося государства - участника Договора в день принятия им этих поправок.

+

+    +

+

Статья XVI

+

Любое государство - участник Договора может уведомить о своем выходе из Договора через год после вступления его в силу путем письменного уведомления правительств-депозитариев, Такой выход приобретает силу по истечении одного года со дня получения этого уведомления.

+

+    +

+

Статья XVII

+

+    +

+

Статья XVII

+

Настоящий Договор, английский, испанский, китайский, русский и французский тексты которого являются равно аутентичными, будет сдан на хранение в архивы правительств-депозитариев. Должным образом заве- ренные копии настоящего Договора будут препровождены правительствами- депозитариями правительствам государств, подписавших Договор и присоединившихся к нему.

+

В УДОСТОВЕРЕНИЕ ЧЕГО нижеподписавшиеся, должным образом на то уполномоченные, подписали настоящий Договор.

+

СОВЕРШЕНО в трех экземплярах в городах Вашингтоне, О.К., Лондоне и Москве января месяца двадцать седьмого дня тысяча девятьсот шестьдесят седьмого года.

+
+

2222 (XVI): Tratado sobre los principios que deben regir las actividades de los Estados en la exploración y utilización del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes

+

 

+

+ Los Estados Partes en este Tratado, +

+

+Inspirándose en las grandes perspectivas que se ofrecen a la humanidad como consecuencia de la entrada del hombre en el espacio ultraterrestre,

+

+Reconociendo el interés general de toda la humanidad en el proceso de la exploración y utilización del espacio ultraterrestre con fines pacíficos,

+

+Estimando que la exploración y la utilización del espacio ultraterrestre se debe efectuar en bien de todos los pueblos, sea cual fuere su grado de desarrollo económico y científico,

+

+Deseando contribuir a una amplia cooperación internacional en lo que se refiere a los aspectos científicos y jurídicos de la exploración y utilización del espacio ultraterrestre con fines pacíficos,

+

+Estimando que tal cooperación contribuirá al desarrollo de la comprensión mutua y al afianzamiento de las relaciones amistosas entre los Estados y pueblos,

+

+Recordando la resolución 1962 (XVIII), titulada "Declaración de los principios jurídicos que deben regir las actividades de los Estados en la exploración y utilización del espacio ultraterrestre", que fue aprobada unánimemente por la Asamblea General de las Naciones Unidas el 13 de diciembre de 1963,

+

+Recordando la resolución 1884 (XVIII), en que se insta a los Estados a no poner en órbita alrededor de la Tierra ningún objeto portador de armas nucleares u otras clases de armas de destrucción en masa, ni a emplazar tales armas en los cuerpos celestes, que fue aprobada unánimemente por la Asamblea General de las Naciones Unidas el 17 de octubre de 1963,

+

+Tomando nota de la resolución 110 (II), aprobada por la Asamblea General el 3 de noviembre de 1947, que condena la propaganda destinada a provocar o alentar, o susceptible de provocar o alentar cualquier amenaza de la paz, quebrantamiento de la paz o acto de agresión, y considerando que dicha resolución es aplicable al espacio ultraterrestre,

+

+Convencidos de que un Tratado sobre los principios que deben regir las actividades de los Estados en la exploración y utilización del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, promoverá los propósitos y principios de la Carta de las Naciones Unidas,

+

+Han convenido en lo siguiente:

+

+    +

+

Artículo I

+

La exploración y utilización del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, deberán hacerse en provecho y en interés de todos los países, sea cual fuere su grado de desarrollo económico y científico, e incumben a toda la humanidad.

+

El espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, estará abierto para su exploración y utilización a todos los Estados sin discriminación alguna en condiciones de igualdad y en conformidad con el derecho internacional, y habrá libertad de acceso a todas las regiones de los cuerpos celestes.

+

El espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, estarán abiertos a la investigación científica, y los Estados facilitarán y fomentarán la cooperación internacional en dichas investigaciones.

+

+    +

+

Artículo II

+

El espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, no podrá ser objeto de apropiación nacional por reivindicación de soberanía, uso u ocupación, ni de ninguna otra manera.

+

+    +

+

Artículo III

+

Los Estados Partes en el Tratado deberán realizar sus actividades de exploración y utilización del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, de conformidad con el derecho internacional, incluida la Carta de las Naciones Unidas, en interés del mantenimiento de la paz y la seguridad internacionales y del fomento de la cooperación y la comprensión internacionales.

+

+    +

+

Artículo IV

+

Los Estados Partes en el Tratado se comprometen a no colocar en órbita alrededor de la Tierra ningún objeto portador de armas nucleares ni de ningún otro tipo de armas de destrucción en masa, a no emplazar tales armas en los cuerpos celestes y a no colocar tales armas en el espacio ultraterrestre en ninguna otra forma.

+

La Luna y los demás cuerpos celestes se utilizarán exclusivamente con fines pacíficos por todos los Estados Partes en el Tratado. Queda prohibido establecer en los cuerpos celestes bases, instalaciones y fortificaciones militares, efectuar ensayos con cualquier tipo de armas y realizar maniobras militares. No se prohíbe la utilización de personal militar para investigaciones científicas ni para cualquier otro objetivo pacífico. Tampoco se prohíbe la utilización de cualquier equipo o medios necesarios para la exploración de la Luna y de otros cuerpos celestes con fines pacíficos.

+

+    +

+

Artículo V

+

Los Estados Partes en el Tratado considerarán a todos los astronautas como enviados de la humanidad en el espacio ultraterrestre, y les prestarán toda la ayuda posible en caso de accidente, peligro o aterrizaje forzoso en el territorio de otro Estado Parte o en alta mar. Cuando los astronautas hagan tal aterrizaje serán devueltos con seguridad y sin demora al Estado de registro de su vehículo espacial.

+

Al realizar actividades en el espacio ultraterrestre, así como en los cuerpos celestes, los astronautas de un Estado Parte en el Tratado deberán prestar toda la ayuda posible a los astronautas de los demás Estados Partes en el Tratado.

+

Los Estados Partes en el Tratado tendrán que informar inmediatamente a los demás Estados Partes en el Tratado o al Secretario General de las Naciones Unidas sobre los fenómenos por ellos observados en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, que podrían constituir un peligro para la vida o la salud de los astronautas.

+

+    +

+

Artículo VI

+

Los Estados Partes en el Tratado serán responsables internacionalmente de las actividades nacionales que realicen en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, los organismos gubernamentales o las entidades no gubernamentales, y deberán asegurar que dichas actividades se efectúen en conformidad con las disposiciones del presente Tratado. Las actividades de las entidades no gubernamentales en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, deberán ser autorizadas y fiscalizadas constantemente por el pertinente Estado Parte en el Tratado. Cuando se trate de actividades que realiza en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, una organización internacional, la responsable en cuanto al presente Tratado corresponderá a esa organización internacional y a los Estados Partes en el Tratado que pertenecen a ella.

+

+    +

+

Artículo VII

+

Todo Estado Parte en el Tratado que lance o promueva el lanzamiento de un objeto al espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, y todo Estado Parte en el Tratado, desde cuyo territorio o cuyas instalaciones se lance un objeto, será responsable internacionalmente de los daños causados a otro Estado Parte en el Tratado o a sus personas naturales o jurídicas por dicho objeto o sus partes componentes en la Tierra, en el espacio aéreo o en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes.

+

+    +

+

Artículo VIII

+

El Estado Parte en el Tratado, en cuyo registro figura el objeto lanzado al espacio ultraterrestre, retendrá su jurisdicción y control sobre tal objeto, así como sobre todo el personal que vaya en él, mientras se encuentre en el espacio ultraterrestre o en un cuerpo celeste. El derecho de propiedad de los objetos lanzados al espacio ultraterrestre, incluso de los objetos que hayan descendido o se construyan en un cuerpo celeste, y de sus partes componentes, no sufrirá ninguna alteración mientras estén en el espacio ultraterrestre, incluso en un cuerpo celeste, ni en su retorno a la Tierra. Cuando esos objetos o esas partes componentes sean hallados fuera de los límites del Estado Parte en el Tratado en cuyo registro figuran, deberán ser devueltos a ese Estado Parte, el que deberá proporcionar los datos de identificación que se le soliciten antes de efectuarse la restitución.

+

+    +

+

Artículo IX

+

En la exploración y utilización del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, los Estados Partes en el Tratado deberán guiarse por el principio de la cooperación y la asistencia mutua, y en todas sus actividades en el espacio ultraterrestre, incluso en la Luna y otros cuerpos celestes, deberán tener debidamente en cuenta los intereses correspondientes de los demás Estados Partes en el Tratado. Los Estados Partes en el Tratado harán los estudios e investigaciones del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, y procederán a su exploración de tal forma que no se produzca una contaminación nociva ni cambios desfavorables en el medio ambiente de la Tierra como consecuencia de la introducción en él de materias extraterrestres, y cuando sea necesario adoptarán las medidas pertinentes a tal efecto. Si un Estado Parte en el Tratado tiene motivos para creer que una actividad o un experimento en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, proyectado por él o por sus nacionales, crearía un obstáculo capaz de perjudicar las actividades de otros Estados Partes en el Tratado en la exploración y utilización del espacio ultraterrestre con fines pacíficos, incluso en la Luna y otros cuerpos celestes, deberá celebrar las consultas internacionales oportunas antes de iniciar esa actividad o ese experimento. Si un Estado Parte en el Tratado tiene motivos para creer que una actividad o un experimento en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, proyectado por otro Estado Parte en el Tratado, crearía un obstáculo capaz de perjudicar las actividades de exploración y utilización del espacio ultraterrestre con fines pacíficos, incluso en la Luna y otros cuerpos celestes, podrá pedir que se celebren consultas sobre dicha actividad o experimento.

+

+    +

+

Artículo X

+

A fin de contribuir a la cooperación internacional en la exploración y la utilización del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, conforme a los objetivos del presente Tratado, los Estados Partes en él examinarán, en condiciones de igualdad, las solicitudes formuladas por otros Estados Partes en el Tratado para que se les brinde la oportunidad a fin de observar el vuelo de los objetos espaciales lanzados por dichos Estados.

+

La naturaleza de tal oportunidad y las condiciones en que podría ser concedida se determinarán por acuerdo entre los Estados interesados.

+

+    +

+

Artículo XI

+

A fin de fomentar la cooperación internacional en la exploración y utilización del espacio ultraterrestre con fines pacíficos, los Estados Partes en el Tratado que desarrollan actividades en el espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, convienen en informar, en la mayor medida posible dentro de lo viable y factible, al Secretario General de las Naciones Unidas, así como al público y a la comunidad científica internacional, acerca de la naturaleza, marcha, localización y resultados de dichas actividades. El Secretario General de las Naciones Unidas debe estar en condiciones de difundir eficazmente tal información, inmediatamente después de recibirla.

+

+    +

+

Artículo XII

+

Todas las estaciones, instalaciones, equipo y vehículos espaciales situados en la Luna y otros cuerpos celestes serán accesibles a los representantes de otros Estados Parte en el presente Tratado, sobre la base de reciprocidad. Dichos representantes notificarán con antelación razonable su intención de hacer una visita, a fin de permitir celebrar las consultas que procedan y adoptar un máximo de precauciones para velar por la seguridad y evitar toda perturbación del funcionamiento normal de la instalación visitada.

+

+    +

+

Artículo XIII

+

Las disposiciones del presente Tratado se aplicarán a las actividades de exploración y utilización de espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, que realicen los Estados Partes en el Tratado, tanto en el caso de que esas actividades las lleve a cabo un Estado Parte en el Tratado por sí solo o junto con otros Estados, incluso cuando se efectúen dentro del marco de organizaciones intergubernamentales internacionales.

+

Los Estados Partes en el Tratado resolverán los problemas prácticos que puedan surgir en relación con las actividades que desarrollen las organizaciones intergubernamentales internacionales en la exploración y utilización del espacio ultraterrestre, incluso la Luna y otros cuerpos celestes, con la organización internacional pertinente o con uno o varios Estados miembros de dicha organización internacional que sean Partes en el presente Tratado.

+

+    +

+

Artículo XIV

+

1. Este Tratado estará abierto a la firma de todos los Estados. El Estado que firmare este Tratado antes de su entrada en vigor, de conformidad con párrafo 3 de este artículo, podrá adherirse a él en cualquier momento.

+

2. Este Tratado estará sujeto a ratificación por los Estados signatarios. Los instrumentos de ratificación y los instrumentos de adhesión se depositarán en los archivos de los Gobiernos de los Estados Unidos de América, del Reino Unido de Gran Bretaña e Irlanda del Norte y de la Unión de Repúblicas Socialistas Soviéticas, a los que por el presente se designa como Gobiernos depositarios.

+

3. Este Tratado entrará en vigor cuando hayan depositado los instrumentos de ratificación cinco gobiernos, incluidos los designados como Gobiernos depositarios en virtud del presente Tratado.

+

4. Para los Estados cuyos instrumentos de ratificación o de adhesión se depositaren después de la entrada en vigor de este Tratado, el Tratado entrará en vigor en la fecha del depósito de sus instrumentos de ratificación o adhesión.

+

5. Los Gobiernos depositarios informarán sin tardanza a todos los Estados signatarios y a todos los Estados que se hayan adherido a este Tratado, de la fecha de cada firma, de la fecha de depósito de cada instrumento de ratificación y de adhesión a este Tratado, de la fecha de su entrada en vigor y de cualquier otra notificación.

+

6. Este Tratado será registrado por los Gobiernos depositarios, de conformidad con el Artículo 102 de la Carta de las Naciones Unidas.

+

+    +

+

Artículo XV

+

Cualquier Estado Parte en el Tratado podrá proponer enmiendas al mismo. Las enmiendas entrarán en vigor para cada Estado Parte en el Tratado que las acepte cuando éstas hayan sido aceptadas por la mayoría de los Estados Partes en el Tratado, y en lo sucesivo para cada Estado restante que sea Parte en el Tratado en la fecha en que las acepte.

+

+    +

+

Artículo XVI

+

Todo Estado Parte podrá comunicar su retiro de este Tratado al cabo de un año de su entrada en vigor, mediante notificación por escrito dirigida a los Gobiernos depositarios. Tal retiro surtirá efecto un año después de la fecha en que se reciba la notificación.

+

+    +

+

Artículo XVII

+

Este Tratado, cuyos textos en chino, español, francés, inglés y ruso son igualmente auténticos, se depositará en los archivos de los Gobiernos depositarios. Los Gobiernos depositarios remitirán copias debidamente certificadas de este Tratado a los gobiernos de los Estados signatarios y de los Estados que se adhieran al Tratado.

+

EN TESTIMONIO DE LO CUAL, los infrascritos, debidamente autorizados, firman este Tratado.

+

HECHO en tres ejemplares, en las ciudades de Londres, Moscú y Washington D.C., el día veintisiete de enero de mil novecientos sesenta y siete.

+ + diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 5d07802..6046965 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -72,6 +72,20 @@ macro_rules! assert_finish_err( }) ) +/// Some ASCII-only text to test. +// +// the first paragraphs of the article "English Language" from English Wikipedia. +// https://en.wikipedia.org/w/index.php?title=English_language&oldid=608500518 +pub static ASCII_TEXT: &'static str = + "English is a West Germanic language that was first spoken in early medieval England \ + and is now a global lingua franca. It is spoken as a first language by \ + the majority populations of several sovereign states, including the United Kingdom, \ + the United States, Canada, Australia, Ireland, New Zealand and a number of Caribbean nations; \ + and it is an official language of almost 60 sovereign states. It is the third-most-common \ + native language in the world, after Mandarin Chinese and Spanish. It is widely learned as \ + a second language and is an official language of the European Union, many Commonwealth \ + countries and the United Nations, as well as in many world organisations."; + /// Some Korean text to test. // // the first paragraphs of the article "Korean Language" from Korean Wikipedia. @@ -131,3 +145,31 @@ pub static TRADITIONAL_CHINESE_TEXT: &'static str = 國際標準化組織即持此觀點,部分資料將其中的一至六種也算成單獨的漢語言,\ 這就是八至十三種漢語言的由來)。"; +/// Some text with various invalid UTF-8 sequences. +// +// Markus Kuhn's UTF-8 decoder capability and stress test. +// http://www.cl.cam.ac.uk/~mgk25/ucs/examples/UTF-8-test.txt +pub static INVALID_UTF8_TEXT: &'static [u8] = include_bin!("examples/UTF-8-test.txt"); + +/// Returns a longer text used for external data benchmarks. +/// This can be overriden with an environment variable `EXTERNAL_BENCH_DATA`, +/// or it will use a built-in sample data (of about 100KB). +pub fn get_external_bench_data() -> Vec { + use std::{io, os}; + + // An HTML file derived from the Outer Space Treaty of 1967, in six available languages. + // http://www.unoosa.org/oosa/SpaceLaw/outerspt.html + static LONGER_TEXT: &'static [u8] = include_bin!("examples/outer-space-treaty.html"); + + match os::getenv("EXTERNAL_BENCH_DATA") { + Some(path) => { + let path = Path::new(path); + let mut file = io::File::open(&path).ok().expect("cannot read an external bench data"); + file.read_to_end().ok().expect("cannot read an external bench data") + } + None => { + Vec::from_slice(LONGER_TEXT) + } + } +} + From 9edc42d3fdbd8aa809550aee552e428164b84889 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Wed, 14 May 2014 23:49:10 +0900 Subject: [PATCH 15/29] applied some optimizations to UTF-8 decoder. --- src/encoding/codec/utf_8.rs | 142 ++++++++++++++++++++++++++---------- 1 file changed, 105 insertions(+), 37 deletions(-) diff --git a/src/encoding/codec/utf_8.rs b/src/encoding/codec/utf_8.rs index 151fb02..eefbef7 100644 --- a/src/encoding/codec/utf_8.rs +++ b/src/encoding/codec/utf_8.rs @@ -121,22 +121,28 @@ static CHAR_CATEGORY: [u8, ..256] = [ 10,3,3,3,3,3,3,3,3,3,3,3,3,4,3,3, 11,6,6,6,5,8,8,8,8,8,8,8,8,8,8,8, ]; -static STATE_TRANSITIONS: [u8, ..108] = [ - 0,12,24,36,60,96,84,12,12,12,48,72, // 0: '?? - 13,13,13,13,13,13,13,13,13,13,13,13, // 12: xx '.. / 13: .. xx '.. - 13, 0,13,13,13,13,13, 0,13, 0,13,13, // 24: .. 'cc - 13,24,13,13,13,13,13,24,13,24,13,13, // 36: .. 'cc cc - 13,13,13,13,13,13,13,24,13,13,13,13, // 48: .. 'cc(A0-BF) cc - 13,24,13,13,13,13,13,13,13,24,13,13, // 60: .. 'cc(80-9F) cc - 13,13,13,13,13,13,13,36,13,36,13,13, // 72: .. 'cc(90-BF) cc cc - 13,36,13,13,13,13,13,36,13,36,13,13, // 84: .. 'cc cc cc - 13,36,13,13,13,13,13,13,13,13,13,13, // 96: .. 'cc(80-8F) cc cc +static STATE_TRANSITIONS: [u8, ..110] = [ + 0,98,12,24,48,84,72,98,98,98,36,60, // 0: '?? + 86, 0,86,86,86,86,86, 0,86, 0,86,86, // 12: .. 'cc + 86,12,86,86,86,86,86,12,86,12,86,86, // 24: .. 'cc cc + 86,86,86,86,86,86,86,12,86,86,86,86, // 36: .. 'cc(A0-BF) cc + 86,12,86,86,86,86,86,86,86,12,86,86, // 48: .. 'cc(80-9F) cc + 86,86,86,86,86,86,86,24,86,24,86,86, // 60: .. 'cc(90-BF) cc cc + 86,24,86,86,86,86,86,24,86,24,86,86, // 72: .. 'cc cc cc + 86,24,86,86,86,86,86,86,86,86,86,86,86,86, // 84: .. 'cc(80-8F) cc cc + // 86,86,86,86,86,86,86,86,86,86,86,86, // 86: .. xx '.. + 98,98,98,98,98,98,98,98,98,98,98,98, // 98: xx '.. ]; static INITIAL_STATE: u8 = 0; static ACCEPT_STATE: u8 = 0; -static REJECT_STATE: u8 = 12; -static REJECT_STATE_WITH_BACKUP: u8 = REJECT_STATE | 1; +static REJECT_STATE: u8 = 98; +static REJECT_STATE_WITH_BACKUP: u8 = 86; + +macro_rules! is_reject_state(($state:expr) => ($state >= REJECT_STATE_WITH_BACKUP)) +macro_rules! next_state(($state:expr, $ch:expr) => ( + STATE_TRANSITIONS[($state + CHAR_CATEGORY[$ch as uint]) as uint] +)) impl Decoder for UTF8Decoder { fn from_self(&self) -> Box { UTF8Decoder::new() } @@ -150,28 +156,31 @@ impl Decoder for UTF8Decoder { } let mut state = self.state; - let mut i = 0; let mut processed = 0; - let len = input.len(); - while i < len { - let ch = input[i]; - state = STATE_TRANSITIONS[(state + CHAR_CATEGORY[ch as uint]) as uint]; - i += 1; - match state { - ACCEPT_STATE => { processed = i; } - REJECT_STATE | REJECT_STATE_WITH_BACKUP => { - let upto = i - (state & 1) as uint; - self.state = INITIAL_STATE; - if processed > 0 && self.queuelen > 0 { // flush `queue` outside the problem - write_bytes(output, self.queue.slice(0, self.queuelen)); - } - self.queuelen = 0; - write_bytes(output, input.slice(0, processed)); - return (processed, Some(CodecError { - upto: upto, cause: "invalid sequence".into_maybe_owned() - })); + let mut offset = 0; + + // optimization: if we are in the initial state, quickly skip to the first non-MSB-set byte. + if state == INITIAL_STATE { + let first_msb = input.iter().position(|&ch| ch >= 0x80).unwrap_or(input.len()); + offset += first_msb; + processed += first_msb; + } + + for (i, &ch) in input.slice_from(offset).iter().enumerate() { + state = next_state!(state, ch); + if state == ACCEPT_STATE { + processed = i + offset + 1; + } else if is_reject_state!(state) { + let upto = if state == REJECT_STATE {i + offset + 1} else {i + offset}; + self.state = INITIAL_STATE; + if processed > 0 && self.queuelen > 0 { // flush `queue` outside the problem + write_bytes(output, self.queue.slice(0, self.queuelen)); } - _ => {} + self.queuelen = 0; + write_bytes(output, input.slice(0, processed)); + return (processed, Some(CodecError { + upto: upto, cause: "invalid sequence".into_maybe_owned() + })); } } @@ -181,8 +190,8 @@ impl Decoder for UTF8Decoder { self.queuelen = 0; } write_bytes(output, input.slice(0, processed)); - if processed < len { - let morequeuelen = len - processed; + if processed < input.len() { + let morequeuelen = input.len() - processed; for i in range(0, morequeuelen) { self.queue[self.queuelen + i] = input[processed + i]; } @@ -205,12 +214,41 @@ impl Decoder for UTF8Decoder { } } +/// Equivalent to `std::str::from_utf8`. +/// This function is provided for the fair benchmark against the stdlib's UTF-8 conversion +/// functions, as rust-encoding always allocates a new string. +pub fn from_utf8<'a>(input: &'a [u8]) -> Option<&'a str> { + let mut iter = input.iter(); + let mut state; + + // optimization: if we are in the initial state, quickly skip to the first non-MSB-set byte. + loop { + match iter.next() { + Some(&ch) if ch < 0x80 => {} + Some(&ch) => { + state = next_state!(INITIAL_STATE, ch); + break; + } + None => { return Some(unsafe {mem::transmute(input)}); } + } + } + + for &ch in iter { + state = next_state!(state, ch); + } + if state == ACCEPT_STATE { + Some(unsafe {mem::transmute(input)}) + } else { + None + } +} + #[cfg(test)] mod tests { // portions of these tests are adopted from Markus Kuhn's UTF-8 decoder capability and // stress test: . - use super::UTF8Encoding; + use super::{UTF8Encoding, from_utf8}; use std::str; use testutils; use types::*; @@ -584,9 +622,21 @@ mod tests { assert_finish_ok!(d, ""); } + #[test] + fn test_correct_from_utf8() { + let s = testutils::ASCII_TEXT.as_bytes(); + assert_eq!(from_utf8(s), str::from_utf8(s)); + + let s = testutils::KOREAN_TEXT.as_bytes(); + assert_eq!(from_utf8(s), str::from_utf8(s)); + + let s = testutils::INVALID_UTF8_TEXT; + assert_eq!(from_utf8(s), str::from_utf8(s)); + } + mod bench_ascii { extern crate test; - use super::super::UTF8Encoding; + use super::super::{UTF8Encoding, from_utf8}; use std::str; use testutils; use types::*; @@ -611,6 +661,15 @@ mod tests { }) } + #[bench] + fn bench_from_utf8(bencher: &mut test::Bencher) { + let s = testutils::ASCII_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + from_utf8(s).unwrap(); + }) + } + #[bench] // for the comparison fn bench_stdlib_from_utf8(bencher: &mut test::Bencher) { let s = testutils::ASCII_TEXT.as_bytes(); @@ -634,7 +693,7 @@ mod tests { // unlike other CJK scripts, so it reflects a practical use case a bit better. mod bench_korean { extern crate test; - use super::super::UTF8Encoding; + use super::super::{UTF8Encoding, from_utf8}; use std::str; use testutils; use types::*; @@ -659,6 +718,15 @@ mod tests { }) } + #[bench] + fn bench_from_utf8(bencher: &mut test::Bencher) { + let s = testutils::KOREAN_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| { + from_utf8(s).unwrap(); + }) + } + #[bench] // for the comparison fn bench_stdlib_from_utf8(bencher: &mut test::Bencher) { let s = testutils::KOREAN_TEXT.as_bytes(); From 59a6fa2dee46f403e1e8be3ce2421ffc488184f2 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Thu, 15 May 2014 02:02:31 +0900 Subject: [PATCH 16/29] from_utf8 reimplementation now returns as soon as error is found. this also tries to fix a possible interference issue between the benchmark and aggressive optimization passes. --- src/encoding/codec/japanese.rs | 36 ++++---- src/encoding/codec/korean.rs | 12 +-- src/encoding/codec/simpchinese.rs | 24 +++--- src/encoding/codec/tradchinese.rs | 12 +-- src/encoding/codec/utf_8.rs | 132 +++++++++++++++++++----------- src/encoding/label.rs | 6 +- 6 files changed, 128 insertions(+), 94 deletions(-) diff --git a/src/encoding/codec/japanese.rs b/src/encoding/codec/japanese.rs index cc1e5cc..81d3535 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -228,9 +228,9 @@ mod eucjp_tests { static Encoding: EUCJPEncoding = EUCJPEncoding; let s = testutils::JAPANESE_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) } #[bench] @@ -238,9 +238,9 @@ mod eucjp_tests { static Encoding: EUCJPEncoding = EUCJPEncoding; let s = Encoding.encode(testutils::JAPANESE_TEXT, EncodeStrict).ok().unwrap(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) } } @@ -447,9 +447,9 @@ mod windows31j_tests { static Encoding: Windows31JEncoding = Windows31JEncoding; let s = testutils::JAPANESE_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) } #[bench] @@ -457,9 +457,9 @@ mod windows31j_tests { static Encoding: Windows31JEncoding = Windows31JEncoding; let s = Encoding.encode(testutils::JAPANESE_TEXT, EncodeStrict).ok().unwrap(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) } } @@ -814,9 +814,9 @@ mod iso2022jp_tests { static Encoding: ISO2022JPEncoding = ISO2022JPEncoding; let s = testutils::JAPANESE_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) } #[bench] @@ -824,8 +824,8 @@ mod iso2022jp_tests { static Encoding: ISO2022JPEncoding = ISO2022JPEncoding; let s = Encoding.encode(testutils::JAPANESE_TEXT, EncodeStrict).ok().unwrap(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) } } diff --git a/src/encoding/codec/korean.rs b/src/encoding/codec/korean.rs index c960048..80d8f2c 100644 --- a/src/encoding/codec/korean.rs +++ b/src/encoding/codec/korean.rs @@ -230,9 +230,9 @@ mod windows949_tests { static Encoding: Windows949Encoding = Windows949Encoding; let s = testutils::KOREAN_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) } #[bench] @@ -240,9 +240,9 @@ mod windows949_tests { static Encoding: Windows949Encoding = Windows949Encoding; let s = Encoding.encode(testutils::KOREAN_TEXT, EncodeStrict).ok().unwrap(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) } } diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index e5b46dd..adbf0c2 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -244,9 +244,9 @@ mod gb18030_tests { static Encoding: GB18030Encoding = GB18030Encoding; let s = testutils::SIMPLIFIED_CHINESE_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) } #[bench] @@ -254,9 +254,9 @@ mod gb18030_tests { static Encoding: GB18030Encoding = GB18030Encoding; let s = Encoding.encode(testutils::SIMPLIFIED_CHINESE_TEXT, EncodeStrict).ok().unwrap(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) } } @@ -480,9 +480,9 @@ mod hz_tests { static Encoding: HZEncoding = HZEncoding; let s = testutils::SIMPLIFIED_CHINESE_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) } #[bench] @@ -490,9 +490,9 @@ mod hz_tests { static Encoding: HZEncoding = HZEncoding; let s = Encoding.encode(testutils::SIMPLIFIED_CHINESE_TEXT, EncodeStrict).ok().unwrap(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) } } diff --git a/src/encoding/codec/tradchinese.rs b/src/encoding/codec/tradchinese.rs index d6157da..fa7d756 100644 --- a/src/encoding/codec/tradchinese.rs +++ b/src/encoding/codec/tradchinese.rs @@ -187,9 +187,9 @@ mod bigfive2003_tests { static Encoding: BigFive2003Encoding = BigFive2003Encoding; let s = testutils::TRADITIONAL_CHINESE_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s.as_slice(), EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) } #[bench] @@ -197,9 +197,9 @@ mod bigfive2003_tests { static Encoding: BigFive2003Encoding = BigFive2003Encoding; let s = Encoding.encode(testutils::TRADITIONAL_CHINESE_TEXT, EncodeStrict).ok().unwrap(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) } } diff --git a/src/encoding/codec/utf_8.rs b/src/encoding/codec/utf_8.rs index eefbef7..1b0956a 100644 --- a/src/encoding/codec/utf_8.rs +++ b/src/encoding/codec/utf_8.rs @@ -235,12 +235,10 @@ pub fn from_utf8<'a>(input: &'a [u8]) -> Option<&'a str> { for &ch in iter { state = next_state!(state, ch); + if is_reject_state!(state) { return None; } } - if state == ACCEPT_STATE { - Some(unsafe {mem::transmute(input)}) - } else { - None - } + if state != ACCEPT_STATE { return None; } + Some(unsafe {mem::transmute(input)}) } #[cfg(test)] @@ -646,9 +644,9 @@ mod tests { static Encoding: UTF8Encoding = UTF8Encoding; let s = testutils::ASCII_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s, EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s, EncodeStrict) + })) } #[bench] @@ -656,36 +654,36 @@ mod tests { static Encoding: UTF8Encoding = UTF8Encoding; let s = testutils::ASCII_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s, DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s, DecodeStrict) + })) } #[bench] fn bench_from_utf8(bencher: &mut test::Bencher) { let s = testutils::ASCII_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - from_utf8(s).unwrap(); - }) + bencher.iter(|| test::black_box({ + from_utf8(s) + })) } #[bench] // for the comparison fn bench_stdlib_from_utf8(bencher: &mut test::Bencher) { let s = testutils::ASCII_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - str::from_utf8(s).unwrap(); - }) + bencher.iter(|| test::black_box({ + str::from_utf8(s) + })) } #[bench] // for the comparison fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { let s = testutils::ASCII_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - str::from_utf8_lossy(s); - }) + bencher.iter(|| test::black_box({ + str::from_utf8_lossy(s) + })) } } @@ -703,9 +701,9 @@ mod tests { static Encoding: UTF8Encoding = UTF8Encoding; let s = testutils::KOREAN_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.encode(s, EncodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.encode(s, EncodeStrict) + })) } #[bench] @@ -713,42 +711,42 @@ mod tests { static Encoding: UTF8Encoding = UTF8Encoding; let s = testutils::KOREAN_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s, DecodeStrict).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s, DecodeStrict) + })) } #[bench] fn bench_from_utf8(bencher: &mut test::Bencher) { let s = testutils::KOREAN_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - from_utf8(s).unwrap(); - }) + bencher.iter(|| test::black_box({ + from_utf8(s) + })) } #[bench] // for the comparison fn bench_stdlib_from_utf8(bencher: &mut test::Bencher) { let s = testutils::KOREAN_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - str::from_utf8(s).unwrap(); - }) + bencher.iter(|| test::black_box({ + str::from_utf8(s) + })) } #[bench] // for the comparison fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { let s = testutils::KOREAN_TEXT.as_bytes(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - str::from_utf8_lossy(s); - }) + bencher.iter(|| test::black_box({ + str::from_utf8_lossy(s) + })) } } mod bench_lossy_invalid { extern crate test; - use super::super::UTF8Encoding; + use super::super::{UTF8Encoding, from_utf8}; use std::str; use testutils; use types::*; @@ -758,24 +756,42 @@ mod tests { static Encoding: UTF8Encoding = UTF8Encoding; let s = testutils::INVALID_UTF8_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s, DecodeReplace).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s, DecodeReplace) + })) + } + + #[bench] // for the comparison + fn bench_from_utf8_failing(bencher: &mut test::Bencher) { + let s = testutils::INVALID_UTF8_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + from_utf8(s) + })) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8_failing(bencher: &mut test::Bencher) { + let s = testutils::INVALID_UTF8_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + str::from_utf8(s) + })) } #[bench] // for the comparison fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { let s = testutils::INVALID_UTF8_TEXT; bencher.bytes = s.len() as u64; - bencher.iter(|| { - str::from_utf8_lossy(s); - }) + bencher.iter(|| test::black_box({ + str::from_utf8_lossy(s) + })) } } mod bench_lossy_external { extern crate test; - use super::super::UTF8Encoding; + use super::super::{UTF8Encoding, from_utf8}; use std::str; use testutils; use types::*; @@ -785,18 +801,36 @@ mod tests { static Encoding: UTF8Encoding = UTF8Encoding; let s = testutils::get_external_bench_data(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - Encoding.decode(s.as_slice(), DecodeReplace).ok().unwrap(); - }) + bencher.iter(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeReplace) + })) + } + + #[bench] // for the comparison + fn bench_from_utf8_failing(bencher: &mut test::Bencher) { + let s = testutils::get_external_bench_data(); + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + from_utf8(s.as_slice()) + })) + } + + #[bench] // for the comparison + fn bench_stdlib_from_utf8_failing(bencher: &mut test::Bencher) { + let s = testutils::get_external_bench_data(); + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + str::from_utf8(s.as_slice()) + })) } #[bench] // for the comparison fn bench_stdlib_from_utf8_lossy(bencher: &mut test::Bencher) { let s = testutils::get_external_bench_data(); bencher.bytes = s.len() as u64; - bencher.iter(|| { - str::from_utf8_lossy(s.as_slice()); - }) + bencher.iter(|| test::black_box({ + str::from_utf8_lossy(s.as_slice()) + })) } } } diff --git a/src/encoding/label.rs b/src/encoding/label.rs index bb226b0..b7e7af0 100644 --- a/src/encoding/label.rs +++ b/src/encoding/label.rs @@ -338,9 +338,9 @@ mod tests { #[bench] fn bench_encoding_from_whatwg_label(bencher: &mut test::Bencher) { - bencher.iter(|| { - encoding_from_whatwg_label("iso-8859-bazinga"); - }) + bencher.iter(|| test::black_box({ + encoding_from_whatwg_label("iso-8859-bazinga") + })) } } From a4f65e38fb1b638641a74b455ac23fa587d638cc Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Thu, 15 May 2014 16:34:42 +0900 Subject: [PATCH 17/29] applied optimizations to ASCII; refactored unsafe portions of UTF-8 impls. --- src/encoding/codec/ascii.rs | 93 ++++++++++++++++++++++++++++--------- src/encoding/codec/utf_8.rs | 14 +++--- 2 files changed, 78 insertions(+), 29 deletions(-) diff --git a/src/encoding/codec/ascii.rs b/src/encoding/codec/ascii.rs index 8935265..daf2b49 100644 --- a/src/encoding/codec/ascii.rs +++ b/src/encoding/codec/ascii.rs @@ -4,7 +4,7 @@ //! 7-bit ASCII encoding. -use util::StrCharIndex; +use std::{str, mem}; use types::*; /** @@ -37,16 +37,19 @@ impl Encoder for ASCIIEncoder { fn raw_feed(&mut self, input: &str, output: &mut ByteWriter) -> (uint, Option) { output.writer_hint(input.len()); - for ((i,j), ch) in input.index_iter() { - if ch <= '\u007f' { - output.write_byte(ch as u8); - } else { - return (i, Some(CodecError { - upto: j, cause: "unrepresentable character".into_maybe_owned() - })); + match input.as_bytes().iter().position(|&ch| ch >= 0x80) { + Some(first_error) => { + output.write_bytes(input.as_bytes().slice_to(first_error)); + let str::CharRange {ch: _, next} = input.char_range_at(first_error); + (first_error, Some(CodecError { + upto: next, cause: "unrepresentable character".into_maybe_owned() + })) + } + None => { + output.write_bytes(input.as_bytes()); + (input.len(), None) } } - (input.len(), None) } fn raw_finish(&mut self, _output: &mut ByteWriter) -> Option { @@ -68,20 +71,23 @@ impl Decoder for ASCIIDecoder { fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { output.writer_hint(input.len()); - - let mut i = 0; - let len = input.len(); - while i < len { - if input[i] <= 0x7f { - output.write_char(input[i] as char); - } else { - return (i, Some(CodecError { - upto: i+1, cause: "invalid sequence".into_maybe_owned() - })); + + fn write_ascii_bytes(output: &mut StringWriter, buf: &[u8]) { + output.write_str(unsafe {mem::transmute(buf)}); + } + + match input.iter().position(|&ch| ch >= 0x80) { + Some(first_error) => { + write_ascii_bytes(output, input.slice_to(first_error)); + (first_error, Some(CodecError { + upto: first_error+1, cause: "invalid sequence".into_maybe_owned() + })) + } + None => { + write_ascii_bytes(output, input); + (input.len(), None) } - i += 1; } - (i, None) } fn raw_finish(&mut self, _output: &mut StringWriter) -> Option { @@ -91,7 +97,9 @@ impl Decoder for ASCIIDecoder { #[cfg(test)] mod tests { + extern crate test; use super::ASCIIEncoding; + use testutils; use types::*; #[test] @@ -101,6 +109,7 @@ mod tests { assert_feed_ok!(e, "BC", "", [0x42, 0x43]); assert_feed_ok!(e, "", "", []); assert_feed_err!(e, "", "\xa0", "", []); + assert_feed_err!(e, "X", "\xa0", "Z", [0x58]); assert_finish_ok!(e, []); } @@ -111,7 +120,47 @@ mod tests { assert_feed_ok!(d, [0x42, 0x43], [], "BC"); assert_feed_ok!(d, [], [], ""); assert_feed_err!(d, [], [0xa0], [], ""); + assert_feed_err!(d, [0x58], [0xa0], [0x5a], "X"); assert_finish_ok!(d, ""); } -} + #[bench] + fn bench_encode(bencher: &mut test::Bencher) { + static Encoding: ASCIIEncoding = ASCIIEncoding; + let s = testutils::ASCII_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + Encoding.encode(s, EncodeStrict) + })) + } + + #[bench] + fn bench_decode(bencher: &mut test::Bencher) { + static Encoding: ASCIIEncoding = ASCIIEncoding; + let s = testutils::ASCII_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + Encoding.decode(s, DecodeStrict) + })) + } + + #[bench] + fn bench_encode_replace(bencher: &mut test::Bencher) { + static Encoding: ASCIIEncoding = ASCIIEncoding; + let s = testutils::KOREAN_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + Encoding.encode(s, EncodeReplace) + })) + } + + #[bench] + fn bench_decode_replace(bencher: &mut test::Bencher) { + static Encoding: ASCIIEncoding = ASCIIEncoding; + let s = testutils::KOREAN_TEXT.as_bytes(); + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + Encoding.decode(s, DecodeReplace) + })) + } +} diff --git a/src/encoding/codec/utf_8.rs b/src/encoding/codec/utf_8.rs index 1b0956a..877d97e 100644 --- a/src/encoding/codec/utf_8.rs +++ b/src/encoding/codec/utf_8.rs @@ -65,11 +65,9 @@ impl Encoder for UTF8Encoder { fn is_ascii_compatible(&self) -> bool { true } fn raw_feed(&mut self, input: &str, output: &mut ByteWriter) -> (uint, Option) { - unsafe { - let input: &[u8] = mem::transmute(input); - assert!(str::is_utf8(input)); - output.write_bytes(input); - } + let input: &[u8] = input.as_bytes(); + assert!(str::is_utf8(input)); + output.write_bytes(input); (input.len(), None) } @@ -221,6 +219,8 @@ pub fn from_utf8<'a>(input: &'a [u8]) -> Option<&'a str> { let mut iter = input.iter(); let mut state; + macro_rules! return_as_whole(() => (return Some(unsafe {mem::transmute(input)}))) + // optimization: if we are in the initial state, quickly skip to the first non-MSB-set byte. loop { match iter.next() { @@ -229,7 +229,7 @@ pub fn from_utf8<'a>(input: &'a [u8]) -> Option<&'a str> { state = next_state!(INITIAL_STATE, ch); break; } - None => { return Some(unsafe {mem::transmute(input)}); } + None => { return_as_whole!(); } } } @@ -238,7 +238,7 @@ pub fn from_utf8<'a>(input: &'a [u8]) -> Option<&'a str> { if is_reject_state!(state) { return None; } } if state != ACCEPT_STATE { return None; } - Some(unsafe {mem::transmute(input)}) + return_as_whole!(); } #[cfg(test)] From b58377d4c8f59bf8e4149aa2ccd9541e246efaa1 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Thu, 15 May 2014 18:39:33 +0900 Subject: [PATCH 18/29] moved generated tests for indices to testutils. --- src/encoding/index/big5.rs | 130 +------- src/encoding/index/euc_kr.rs | 15 +- src/encoding/index/gb18030.rs | 18 +- src/encoding/index/gb18030_ranges.rs | 28 +- src/encoding/index/gen_index.py | 86 +---- src/encoding/index/ibm866.rs | 13 +- src/encoding/index/iso_8859_10.rs | 13 +- src/encoding/index/iso_8859_13.rs | 13 +- src/encoding/index/iso_8859_14.rs | 13 +- src/encoding/index/iso_8859_15.rs | 13 +- src/encoding/index/iso_8859_16.rs | 13 +- src/encoding/index/iso_8859_2.rs | 13 +- src/encoding/index/iso_8859_3.rs | 13 +- src/encoding/index/iso_8859_4.rs | 13 +- src/encoding/index/iso_8859_5.rs | 13 +- src/encoding/index/iso_8859_6.rs | 13 +- src/encoding/index/iso_8859_7.rs | 13 +- src/encoding/index/iso_8859_8.rs | 13 +- src/encoding/index/jis0208.rs | 470 +++------------------------ src/encoding/index/jis0212.rs | 15 +- src/encoding/index/koi8_r.rs | 13 +- src/encoding/index/koi8_u.rs | 13 +- src/encoding/index/macintosh.rs | 13 +- src/encoding/index/windows_1250.rs | 13 +- src/encoding/index/windows_1251.rs | 13 +- src/encoding/index/windows_1252.rs | 13 +- src/encoding/index/windows_1253.rs | 13 +- src/encoding/index/windows_1254.rs | 13 +- src/encoding/index/windows_1255.rs | 13 +- src/encoding/index/windows_1256.rs | 13 +- src/encoding/index/windows_1257.rs | 13 +- src/encoding/index/windows_1258.rs | 13 +- src/encoding/index/windows_874.rs | 13 +- src/encoding/index/x_mac_cyrillic.rs | 13 +- src/encoding/lib.rs | 2 + src/encoding/testutils.rs | 101 ++++++ 36 files changed, 222 insertions(+), 994 deletions(-) diff --git a/src/encoding/index/big5.rs b/src/encoding/index/big5.rs index 4b1557b..95fa385 100644 --- a/src/encoding/index/big5.rs +++ b/src/encoding/index/big5.rs @@ -6580,119 +6580,17 @@ pub fn backward(code: u32) -> u16 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(0u32, 0x10000) { - let i = i as u16; - if i == 1133 { continue; } - if i == 1135 { continue; } - if i == 1164 { continue; } - if i == 1166 { continue; } - if i == 2673 { continue; } - if i == 3437 { continue; } - if i == 4369 { continue; } - if i == 4748 { continue; } - if i == 4828 { continue; } - if i == 4898 { continue; } - if i == 4902 { continue; } - if i == 4981 { continue; } - if i == 4982 { continue; } - if i == 4997 { continue; } - if i == 5206 { continue; } - if i == 5207 { continue; } - if i == 5208 { continue; } - if i == 5209 { continue; } - if i == 5214 { continue; } - if i == 5512 { continue; } - if i == 5599 { continue; } - if i == 6410 { continue; } - if i == 6422 { continue; } - if i == 6543 { continue; } - if i == 6732 { continue; } - if i == 7300 { continue; } - if i == 7410 { continue; } - if i == 7915 { continue; } - if i == 8240 { continue; } - if i == 8281 { continue; } - if i == 8870 { continue; } - if i == 9081 { continue; } - if i == 9103 { continue; } - if i == 9741 { continue; } - if i == 9802 { continue; } - if i == 9810 { continue; } - if i == 9840 { continue; } - if i == 9909 { continue; } - if i == 10024 { continue; } - if i == 10696 { continue; } - if i == 10825 { continue; } - if i == 10950 { continue; } - if i == 10957 { continue; } - if i == 11332 { continue; } - if i == 11345 { continue; } - if i == 11458 { continue; } - if i == 11479 { continue; } - if i == 12065 { continue; } - if i == 12497 { continue; } - if i == 12739 { continue; } - if i == 13142 { continue; } - if i == 14159 { continue; } - if i == 14187 { continue; } - if i == 14305 { continue; } - if i == 14651 { continue; } - if i == 14708 { continue; } - if i == 14975 { continue; } - if i == 15488 { continue; } - if i == 15930 { continue; } - if i == 15967 { continue; } - if i == 16278 { continue; } - if i == 16353 { continue; } - if i == 16745 { continue; } - if i == 17060 { continue; } - if i == 17421 { continue; } - if i == 17713 { continue; } - if i == 18346 { continue; } - if i == 18728 { continue; } - if i == 18938 { continue; } - if i == 18957 { continue; } - if i == 18975 { continue; } - if i == 18976 { continue; } - if i == 18977 { continue; } - if i == 18991 { continue; } - if i == 18992 { continue; } - if i == 18993 { continue; } - if i == 18994 { continue; } - if i == 18995 { continue; } - if i == 19028 { continue; } - if i == 19035 { continue; } - if i == 19088 { continue; } - if i == 19096 { continue; } - if i == 19112 { continue; } - if i == 19162 { continue; } - if i == 19240 { continue; } - if i == 19299 { continue; } - if i == 19305 { continue; } - if i == 19309 { continue; } - if i == 19326 { continue; } - if i == 19355 { continue; } - if i == 19398 { continue; } - if i == 19424 { continue; } - if i == 19439 { continue; } - if i == 19454 { continue; } - if i == 19504 { continue; } - if i == 19553 { continue; } - if i == 19554 { continue; } - if i == 19557 { continue; } - if i == 19611 { continue; } - if i == 19643 { continue; } - if i == 19672 { continue; } - if i == 19697 { continue; } - if i == 19720 { continue; } - if i == 19748 { continue; } - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +multi_byte_tests!( + dups = [ + 1133, 1135, 1164, 1166, 2673, 3437, 4369, 4748, 4828, 4898, 4902, 4981, + 4982, 4997, 5206, 5207, 5208, 5209, 5214, 5512, 5599, 6410, 6422, 6543, + 6732, 7300, 7410, 7915, 8240, 8281, 8870, 9081, 9103, 9741, 9802, 9810, + 9840, 9909, 10024, 10696, 10825, 10950, 10957, 11332, 11345, 11458, + 11479, 12065, 12497, 12739, 13142, 14159, 14187, 14305, 14651, 14708, + 14975, 15488, 15930, 15967, 16278, 16353, 16745, 17060, 17421, 17713, + 18346, 18728, 18938, 18957, 18975, 18976, 18977, 18991, 18992, 18993, + 18994, 18995, 19028, 19035, 19088, 19096, 19112, 19162, 19240, 19299, + 19305, 19309, 19326, 19355, 19398, 19424, 19439, 19454, 19504, 19553, + 19554, 19557, 19611, 19643, 19672, 19697, 19720, 19748, + ] +) diff --git a/src/encoding/index/euc_kr.rs b/src/encoding/index/euc_kr.rs index 9f9011d..a6f2670 100644 --- a/src/encoding/index/euc_kr.rs +++ b/src/encoding/index/euc_kr.rs @@ -5092,15 +5092,6 @@ pub fn backward(code: u32) -> u16 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(0u32, 0x10000) { - let i = i as u16; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +multi_byte_tests!( + dups = [] +) diff --git a/src/encoding/index/gb18030.rs b/src/encoding/index/gb18030.rs index 5fbfdda..c0619b0 100644 --- a/src/encoding/index/gb18030.rs +++ b/src/encoding/index/gb18030.rs @@ -4970,16 +4970,8 @@ pub fn backward(code: u32) -> u16 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(0u32, 0x10000) { - let i = i as u16; - if i == 6555 { continue; } - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +multi_byte_tests!( + dups = [ + 6555, + ] +) diff --git a/src/encoding/index/gb18030_ranges.rs b/src/encoding/index/gb18030_ranges.rs index c4005e1..123aae1 100644 --- a/src/encoding/index/gb18030_ranges.rs +++ b/src/encoding/index/gb18030_ranges.rs @@ -79,27 +79,7 @@ pub fn backward(code: u32) -> u32 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_no_failure() { - for i in range(0u32, 189002) { - forward(i); - } - for j in range(127u32, 65538) { - backward(j); - } - } - - #[test] - fn test_correct_table() { - for i in range(0u32, 189002) { - let j = forward(i); - if j == 0xffffffff { continue; } - let i_ = backward(j); - if i_ == 0xffffffff { continue; } - assert!(i_ == i, "backward(forward({})) = backward({}) = {} != {}", i, j, i_, i); - } - } -} +multi_byte_range_tests!( + key = 0 .. 189000, + value = 128 .. 65536 +) diff --git a/src/encoding/index/gen_index.py b/src/encoding/index/gen_index.py index 3795f31..a150c5c 100644 --- a/src/encoding/index/gen_index.py +++ b/src/encoding/index/gen_index.py @@ -61,18 +61,7 @@ def generate_single_byte_index(name): print >>f, '}' print >>f print >>f, '#[cfg(test)]' - print >>f, 'mod tests {' - print >>f, ' use super::{forward, backward};' - print >>f - print >>f, ' #[test]' - print >>f, ' fn test_correct_table() {' - print >>f, ' for i in range(128, 256) {' - print >>f, ' let i = i as u8;' - print >>f, ' let j = forward(i);' - print >>f, ' if j != 0xffff { assert_eq!(backward(j), i); }' - print >>f, ' }' - print >>f, ' }' - print >>f, '}' + print >>f, 'single_byte_tests!()' return 2 * len(data) @@ -131,15 +120,15 @@ def generate_multi_byte_index(name): remap = None if name == 'jis0208': REMAP_MIN = 8272 - REMAP_MAX = 8836 + REMAP_MAX = 8835 invdataminusremap = {} for key, value in data.items(): - if value not in invdataminusremap and not REMAP_MIN <= key < REMAP_MAX: + if value not in invdataminusremap and not REMAP_MIN <= key <= REMAP_MAX: invdataminusremap[value] = key remap = [] - for i in xrange(REMAP_MIN, REMAP_MAX): + for i in xrange(REMAP_MIN, REMAP_MAX+1): if i in data: assert data[i] in invdataminusremap value = invdataminusremap[data[i]] @@ -214,7 +203,7 @@ def generate_multi_byte_index(name): print >>f, '#[inline]' print >>f, 'pub fn backward_remapped(code: u32) -> u16 {' print >>f, ' let value = backward(code);' - print >>f, ' if %d <= value && value < %d {' % (REMAP_MIN, REMAP_MAX) + print >>f, ' if %d <= value && value <= %d {' % (REMAP_MIN, REMAP_MAX) print >>f, ' BACKWARD_TABLE_REMAPPED[(value - %d) as uint]' % REMAP_MIN print >>f, ' } else {' print >>f, ' value' @@ -222,37 +211,16 @@ def generate_multi_byte_index(name): print >>f, '}' print >>f print >>f, '#[cfg(test)]' - print >>f, 'mod tests {' + print >>f, 'multi_byte_tests!(' if remap: - print >>f, ' use super::{forward, backward, backward_remapped};' + print >>f, ' remap = %d .. %d,' % (REMAP_MIN, REMAP_MAX) + if dups: + print >>f, ' dups = [' + write_comma_separated(f, ' ', ['%d, ' % v for v in sorted(dups)]) + print >>f, ' ]' else: - print >>f, ' use super::{forward, backward};' - print >>f - print >>f, ' #[test]' - print >>f, ' fn test_correct_table() {' - print >>f, ' for i in range(0u32, 0x10000) {' - print >>f, ' let i = i as u16;' - for i in sorted(dups): - print >>f, ' if i == %d { continue; }' % i - print >>f, ' let j = forward(i);' - print >>f, ' if j != 0xffff { assert_eq!(backward(j), i); }' - print >>f, ' }' - print >>f, ' }' - if remap: - print >>f - print >>f, ' #[test]' - print >>f, ' fn test_correct_remapping() {' - print >>f, ' for i in range(%du16, %d) {' % (REMAP_MIN, REMAP_MAX) - print >>f, ' let j = forward(i);' - print >>f, ' if j != 0xffff {' - print >>f, ' let ii = backward_remapped(j);' - print >>f, ' assert!(ii != i && ii != 0xffff);' - print >>f, ' let jj = forward(ii);' - print >>f, ' assert_eq!(j, jj);' - print >>f, ' }' - print >>f, ' }' - print >>f, ' }' - print >>f, '}' + print >>f, ' dups = []' + print >>f, ')' tablesz = 2 * (maxkey - minkey) + 2 * len(lower) + 2 * len(upper) if morebits: tablesz += 4 * ((maxkey - minkey + 31) // 32) @@ -315,30 +283,10 @@ def generate_multi_byte_range_lbound_index(name): print >>f, '}' print >>f print >>f, '#[cfg(test)]' - print >>f, 'mod tests {' - print >>f, ' use super::{forward, backward};' - print >>f - print >>f, ' #[test]' - print >>f, ' fn test_no_failure() {' - print >>f, ' for i in range(%du32, %d) {' % (max(0,minkey-1), maxkey+2) - print >>f, ' forward(i);' - print >>f, ' }' - print >>f, ' for j in range(%du32, %d) {' % (max(0,minvalue-1), maxvalue+2) - print >>f, ' backward(j);' - print >>f, ' }' - print >>f, ' }' - print >>f - print >>f, ' #[test]' - print >>f, ' fn test_correct_table() {' - print >>f, ' for i in range(%du32, %d) {' % (minkey, maxkey+2) - print >>f, ' let j = forward(i);' - print >>f, ' if j == 0xffffffff { continue; }' - print >>f, ' let i_ = backward(j);' - print >>f, ' if i_ == 0xffffffff { continue; }' - print >>f, ' assert!(i_ == i, "backward(forward({})) = backward({}) = {} != {}", i, j, i_, i);' - print >>f, ' }' - print >>f, ' }' - print >>f, '}' + print >>f, 'multi_byte_range_tests!(' + print >>f, ' key = %d .. %d,' % (minkey, maxkey) + print >>f, ' value = %d .. %d' % (minvalue, maxvalue) + print >>f, ')' return 8 * len(data) diff --git a/src/encoding/index/ibm866.rs b/src/encoding/index/ibm866.rs index 0d6b9eb..8046385 100644 --- a/src/encoding/index/ibm866.rs +++ b/src/encoding/index/ibm866.rs @@ -57,15 +57,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_10.rs b/src/encoding/index/iso_8859_10.rs index c086b5d..f59dde1 100644 --- a/src/encoding/index/iso_8859_10.rs +++ b/src/encoding/index/iso_8859_10.rs @@ -51,15 +51,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_13.rs b/src/encoding/index/iso_8859_13.rs index edd1517..dd8d523 100644 --- a/src/encoding/index/iso_8859_13.rs +++ b/src/encoding/index/iso_8859_13.rs @@ -51,15 +51,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_14.rs b/src/encoding/index/iso_8859_14.rs index 7a9fbc5..dbce107 100644 --- a/src/encoding/index/iso_8859_14.rs +++ b/src/encoding/index/iso_8859_14.rs @@ -52,15 +52,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_15.rs b/src/encoding/index/iso_8859_15.rs index dea50ec..4fa136e 100644 --- a/src/encoding/index/iso_8859_15.rs +++ b/src/encoding/index/iso_8859_15.rs @@ -51,15 +51,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_16.rs b/src/encoding/index/iso_8859_16.rs index 9c689e9..2235e76 100644 --- a/src/encoding/index/iso_8859_16.rs +++ b/src/encoding/index/iso_8859_16.rs @@ -51,15 +51,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_2.rs b/src/encoding/index/iso_8859_2.rs index a07f795..eaf6524 100644 --- a/src/encoding/index/iso_8859_2.rs +++ b/src/encoding/index/iso_8859_2.rs @@ -51,15 +51,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_3.rs b/src/encoding/index/iso_8859_3.rs index 962e32a..09c53ef 100644 --- a/src/encoding/index/iso_8859_3.rs +++ b/src/encoding/index/iso_8859_3.rs @@ -50,15 +50,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_4.rs b/src/encoding/index/iso_8859_4.rs index 8eafce7..852f15a 100644 --- a/src/encoding/index/iso_8859_4.rs +++ b/src/encoding/index/iso_8859_4.rs @@ -51,15 +51,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_5.rs b/src/encoding/index/iso_8859_5.rs index 57ba54c..f711619 100644 --- a/src/encoding/index/iso_8859_5.rs +++ b/src/encoding/index/iso_8859_5.rs @@ -56,15 +56,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_6.rs b/src/encoding/index/iso_8859_6.rs index 2b00c6c..c2ab3f1 100644 --- a/src/encoding/index/iso_8859_6.rs +++ b/src/encoding/index/iso_8859_6.rs @@ -47,15 +47,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_7.rs b/src/encoding/index/iso_8859_7.rs index c54bb00..8d05926 100644 --- a/src/encoding/index/iso_8859_7.rs +++ b/src/encoding/index/iso_8859_7.rs @@ -51,15 +51,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_8.rs b/src/encoding/index/iso_8859_8.rs index 40ee436..bf8b977 100644 --- a/src/encoding/index/iso_8859_8.rs +++ b/src/encoding/index/iso_8859_8.rs @@ -48,15 +48,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/jis0208.rs b/src/encoding/index/jis0208.rs index 09ed435..0ddb874 100644 --- a/src/encoding/index/jis0208.rs +++ b/src/encoding/index/jis0208.rs @@ -3310,7 +3310,7 @@ pub fn backward(code: u32) -> u16 { #[inline] pub fn backward_remapped(code: u32) -> u16 { let value = backward(code); - if 8272 <= value && value < 8836 { + if 8272 <= value && value <= 8835 { BACKWARD_TABLE_REMAPPED[(value - 8272) as uint] } else { value @@ -3318,426 +3318,48 @@ pub fn backward_remapped(code: u32) -> u16 { } #[cfg(test)] -mod tests { - use super::{forward, backward, backward_remapped}; - - #[test] - fn test_correct_table() { - for i in range(0u32, 0x10000) { - let i = i as u16; - if i == 1207 { continue; } - if i == 1208 { continue; } - if i == 1209 { continue; } - if i == 1212 { continue; } - if i == 1213 { continue; } - if i == 1214 { continue; } - if i == 1217 { continue; } - if i == 1218 { continue; } - if i == 1219 { continue; } - if i == 8644 { continue; } - if i == 10716 { continue; } - if i == 10717 { continue; } - if i == 10718 { continue; } - if i == 10719 { continue; } - if i == 10720 { continue; } - if i == 10721 { continue; } - if i == 10722 { continue; } - if i == 10723 { continue; } - if i == 10724 { continue; } - if i == 10725 { continue; } - if i == 10726 { continue; } - if i == 10727 { continue; } - if i == 10728 { continue; } - if i == 10729 { continue; } - if i == 10730 { continue; } - if i == 10731 { continue; } - if i == 10732 { continue; } - if i == 10733 { continue; } - if i == 10734 { continue; } - if i == 10735 { continue; } - if i == 10736 { continue; } - if i == 10737 { continue; } - if i == 10738 { continue; } - if i == 10739 { continue; } - if i == 10740 { continue; } - if i == 10741 { continue; } - if i == 10742 { continue; } - if i == 10743 { continue; } - if i == 10744 { continue; } - if i == 10745 { continue; } - if i == 10746 { continue; } - if i == 10747 { continue; } - if i == 10748 { continue; } - if i == 10749 { continue; } - if i == 10750 { continue; } - if i == 10751 { continue; } - if i == 10752 { continue; } - if i == 10753 { continue; } - if i == 10754 { continue; } - if i == 10755 { continue; } - if i == 10756 { continue; } - if i == 10757 { continue; } - if i == 10758 { continue; } - if i == 10759 { continue; } - if i == 10760 { continue; } - if i == 10761 { continue; } - if i == 10762 { continue; } - if i == 10763 { continue; } - if i == 10764 { continue; } - if i == 10765 { continue; } - if i == 10766 { continue; } - if i == 10767 { continue; } - if i == 10768 { continue; } - if i == 10769 { continue; } - if i == 10770 { continue; } - if i == 10771 { continue; } - if i == 10772 { continue; } - if i == 10773 { continue; } - if i == 10774 { continue; } - if i == 10775 { continue; } - if i == 10776 { continue; } - if i == 10777 { continue; } - if i == 10778 { continue; } - if i == 10779 { continue; } - if i == 10780 { continue; } - if i == 10781 { continue; } - if i == 10782 { continue; } - if i == 10783 { continue; } - if i == 10784 { continue; } - if i == 10785 { continue; } - if i == 10786 { continue; } - if i == 10787 { continue; } - if i == 10788 { continue; } - if i == 10789 { continue; } - if i == 10790 { continue; } - if i == 10791 { continue; } - if i == 10792 { continue; } - if i == 10793 { continue; } - if i == 10794 { continue; } - if i == 10795 { continue; } - if i == 10796 { continue; } - if i == 10797 { continue; } - if i == 10798 { continue; } - if i == 10799 { continue; } - if i == 10800 { continue; } - if i == 10801 { continue; } - if i == 10802 { continue; } - if i == 10803 { continue; } - if i == 10804 { continue; } - if i == 10805 { continue; } - if i == 10806 { continue; } - if i == 10807 { continue; } - if i == 10808 { continue; } - if i == 10809 { continue; } - if i == 10810 { continue; } - if i == 10811 { continue; } - if i == 10812 { continue; } - if i == 10813 { continue; } - if i == 10814 { continue; } - if i == 10815 { continue; } - if i == 10816 { continue; } - if i == 10817 { continue; } - if i == 10818 { continue; } - if i == 10819 { continue; } - if i == 10820 { continue; } - if i == 10821 { continue; } - if i == 10822 { continue; } - if i == 10823 { continue; } - if i == 10824 { continue; } - if i == 10825 { continue; } - if i == 10826 { continue; } - if i == 10827 { continue; } - if i == 10828 { continue; } - if i == 10829 { continue; } - if i == 10830 { continue; } - if i == 10831 { continue; } - if i == 10832 { continue; } - if i == 10833 { continue; } - if i == 10834 { continue; } - if i == 10835 { continue; } - if i == 10836 { continue; } - if i == 10837 { continue; } - if i == 10838 { continue; } - if i == 10839 { continue; } - if i == 10840 { continue; } - if i == 10841 { continue; } - if i == 10842 { continue; } - if i == 10843 { continue; } - if i == 10844 { continue; } - if i == 10845 { continue; } - if i == 10846 { continue; } - if i == 10847 { continue; } - if i == 10848 { continue; } - if i == 10849 { continue; } - if i == 10850 { continue; } - if i == 10851 { continue; } - if i == 10852 { continue; } - if i == 10853 { continue; } - if i == 10854 { continue; } - if i == 10855 { continue; } - if i == 10856 { continue; } - if i == 10857 { continue; } - if i == 10858 { continue; } - if i == 10859 { continue; } - if i == 10860 { continue; } - if i == 10861 { continue; } - if i == 10862 { continue; } - if i == 10863 { continue; } - if i == 10864 { continue; } - if i == 10865 { continue; } - if i == 10866 { continue; } - if i == 10867 { continue; } - if i == 10868 { continue; } - if i == 10869 { continue; } - if i == 10870 { continue; } - if i == 10871 { continue; } - if i == 10872 { continue; } - if i == 10873 { continue; } - if i == 10874 { continue; } - if i == 10875 { continue; } - if i == 10876 { continue; } - if i == 10877 { continue; } - if i == 10878 { continue; } - if i == 10879 { continue; } - if i == 10880 { continue; } - if i == 10881 { continue; } - if i == 10882 { continue; } - if i == 10883 { continue; } - if i == 10884 { continue; } - if i == 10885 { continue; } - if i == 10886 { continue; } - if i == 10887 { continue; } - if i == 10888 { continue; } - if i == 10889 { continue; } - if i == 10890 { continue; } - if i == 10891 { continue; } - if i == 10892 { continue; } - if i == 10893 { continue; } - if i == 10894 { continue; } - if i == 10895 { continue; } - if i == 10896 { continue; } - if i == 10897 { continue; } - if i == 10898 { continue; } - if i == 10899 { continue; } - if i == 10900 { continue; } - if i == 10901 { continue; } - if i == 10902 { continue; } - if i == 10903 { continue; } - if i == 10904 { continue; } - if i == 10905 { continue; } - if i == 10906 { continue; } - if i == 10907 { continue; } - if i == 10908 { continue; } - if i == 10909 { continue; } - if i == 10910 { continue; } - if i == 10911 { continue; } - if i == 10912 { continue; } - if i == 10913 { continue; } - if i == 10914 { continue; } - if i == 10915 { continue; } - if i == 10916 { continue; } - if i == 10917 { continue; } - if i == 10918 { continue; } - if i == 10919 { continue; } - if i == 10920 { continue; } - if i == 10921 { continue; } - if i == 10922 { continue; } - if i == 10923 { continue; } - if i == 10924 { continue; } - if i == 10925 { continue; } - if i == 10926 { continue; } - if i == 10927 { continue; } - if i == 10928 { continue; } - if i == 10929 { continue; } - if i == 10930 { continue; } - if i == 10931 { continue; } - if i == 10932 { continue; } - if i == 10933 { continue; } - if i == 10934 { continue; } - if i == 10935 { continue; } - if i == 10936 { continue; } - if i == 10937 { continue; } - if i == 10938 { continue; } - if i == 10939 { continue; } - if i == 10940 { continue; } - if i == 10941 { continue; } - if i == 10942 { continue; } - if i == 10943 { continue; } - if i == 10944 { continue; } - if i == 10945 { continue; } - if i == 10946 { continue; } - if i == 10947 { continue; } - if i == 10948 { continue; } - if i == 10949 { continue; } - if i == 10950 { continue; } - if i == 10951 { continue; } - if i == 10952 { continue; } - if i == 10953 { continue; } - if i == 10954 { continue; } - if i == 10955 { continue; } - if i == 10956 { continue; } - if i == 10957 { continue; } - if i == 10958 { continue; } - if i == 10959 { continue; } - if i == 10960 { continue; } - if i == 10961 { continue; } - if i == 10962 { continue; } - if i == 10963 { continue; } - if i == 10964 { continue; } - if i == 10965 { continue; } - if i == 10966 { continue; } - if i == 10967 { continue; } - if i == 10968 { continue; } - if i == 10969 { continue; } - if i == 10970 { continue; } - if i == 10971 { continue; } - if i == 10972 { continue; } - if i == 10973 { continue; } - if i == 10974 { continue; } - if i == 10975 { continue; } - if i == 10976 { continue; } - if i == 10977 { continue; } - if i == 10978 { continue; } - if i == 10979 { continue; } - if i == 10980 { continue; } - if i == 10981 { continue; } - if i == 10982 { continue; } - if i == 10983 { continue; } - if i == 10984 { continue; } - if i == 10985 { continue; } - if i == 10986 { continue; } - if i == 10987 { continue; } - if i == 10988 { continue; } - if i == 10989 { continue; } - if i == 10990 { continue; } - if i == 10991 { continue; } - if i == 10992 { continue; } - if i == 10993 { continue; } - if i == 10994 { continue; } - if i == 10995 { continue; } - if i == 10996 { continue; } - if i == 10997 { continue; } - if i == 10998 { continue; } - if i == 10999 { continue; } - if i == 11000 { continue; } - if i == 11001 { continue; } - if i == 11002 { continue; } - if i == 11003 { continue; } - if i == 11004 { continue; } - if i == 11005 { continue; } - if i == 11006 { continue; } - if i == 11007 { continue; } - if i == 11008 { continue; } - if i == 11009 { continue; } - if i == 11010 { continue; } - if i == 11011 { continue; } - if i == 11012 { continue; } - if i == 11013 { continue; } - if i == 11014 { continue; } - if i == 11015 { continue; } - if i == 11016 { continue; } - if i == 11017 { continue; } - if i == 11018 { continue; } - if i == 11019 { continue; } - if i == 11020 { continue; } - if i == 11021 { continue; } - if i == 11022 { continue; } - if i == 11023 { continue; } - if i == 11024 { continue; } - if i == 11025 { continue; } - if i == 11026 { continue; } - if i == 11027 { continue; } - if i == 11028 { continue; } - if i == 11029 { continue; } - if i == 11030 { continue; } - if i == 11031 { continue; } - if i == 11032 { continue; } - if i == 11033 { continue; } - if i == 11034 { continue; } - if i == 11035 { continue; } - if i == 11036 { continue; } - if i == 11037 { continue; } - if i == 11038 { continue; } - if i == 11039 { continue; } - if i == 11040 { continue; } - if i == 11041 { continue; } - if i == 11042 { continue; } - if i == 11043 { continue; } - if i == 11044 { continue; } - if i == 11045 { continue; } - if i == 11046 { continue; } - if i == 11047 { continue; } - if i == 11048 { continue; } - if i == 11049 { continue; } - if i == 11050 { continue; } - if i == 11051 { continue; } - if i == 11052 { continue; } - if i == 11053 { continue; } - if i == 11054 { continue; } - if i == 11055 { continue; } - if i == 11056 { continue; } - if i == 11057 { continue; } - if i == 11058 { continue; } - if i == 11059 { continue; } - if i == 11060 { continue; } - if i == 11061 { continue; } - if i == 11062 { continue; } - if i == 11063 { continue; } - if i == 11064 { continue; } - if i == 11065 { continue; } - if i == 11066 { continue; } - if i == 11067 { continue; } - if i == 11068 { continue; } - if i == 11069 { continue; } - if i == 11070 { continue; } - if i == 11071 { continue; } - if i == 11072 { continue; } - if i == 11073 { continue; } - if i == 11074 { continue; } - if i == 11075 { continue; } - if i == 11076 { continue; } - if i == 11077 { continue; } - if i == 11078 { continue; } - if i == 11079 { continue; } - if i == 11080 { continue; } - if i == 11081 { continue; } - if i == 11082 { continue; } - if i == 11083 { continue; } - if i == 11084 { continue; } - if i == 11085 { continue; } - if i == 11086 { continue; } - if i == 11087 { continue; } - if i == 11088 { continue; } - if i == 11089 { continue; } - if i == 11090 { continue; } - if i == 11091 { continue; } - if i == 11092 { continue; } - if i == 11093 { continue; } - if i == 11094 { continue; } - if i == 11095 { continue; } - if i == 11096 { continue; } - if i == 11097 { continue; } - if i == 11098 { continue; } - if i == 11099 { continue; } - if i == 11100 { continue; } - if i == 11101 { continue; } - if i == 11102 { continue; } - if i == 11103 { continue; } - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } - - #[test] - fn test_correct_remapping() { - for i in range(8272u16, 8836) { - let j = forward(i); - if j != 0xffff { - let ii = backward_remapped(j); - assert!(ii != i && ii != 0xffff); - let jj = forward(ii); - assert_eq!(j, jj); - } - } - } -} +multi_byte_tests!( + remap = 8272 .. 8835, + dups = [ + 1207, 1208, 1209, 1212, 1213, 1214, 1217, 1218, 1219, 8644, 10716, + 10717, 10718, 10719, 10720, 10721, 10722, 10723, 10724, 10725, 10726, + 10727, 10728, 10729, 10730, 10731, 10732, 10733, 10734, 10735, 10736, + 10737, 10738, 10739, 10740, 10741, 10742, 10743, 10744, 10745, 10746, + 10747, 10748, 10749, 10750, 10751, 10752, 10753, 10754, 10755, 10756, + 10757, 10758, 10759, 10760, 10761, 10762, 10763, 10764, 10765, 10766, + 10767, 10768, 10769, 10770, 10771, 10772, 10773, 10774, 10775, 10776, + 10777, 10778, 10779, 10780, 10781, 10782, 10783, 10784, 10785, 10786, + 10787, 10788, 10789, 10790, 10791, 10792, 10793, 10794, 10795, 10796, + 10797, 10798, 10799, 10800, 10801, 10802, 10803, 10804, 10805, 10806, + 10807, 10808, 10809, 10810, 10811, 10812, 10813, 10814, 10815, 10816, + 10817, 10818, 10819, 10820, 10821, 10822, 10823, 10824, 10825, 10826, + 10827, 10828, 10829, 10830, 10831, 10832, 10833, 10834, 10835, 10836, + 10837, 10838, 10839, 10840, 10841, 10842, 10843, 10844, 10845, 10846, + 10847, 10848, 10849, 10850, 10851, 10852, 10853, 10854, 10855, 10856, + 10857, 10858, 10859, 10860, 10861, 10862, 10863, 10864, 10865, 10866, + 10867, 10868, 10869, 10870, 10871, 10872, 10873, 10874, 10875, 10876, + 10877, 10878, 10879, 10880, 10881, 10882, 10883, 10884, 10885, 10886, + 10887, 10888, 10889, 10890, 10891, 10892, 10893, 10894, 10895, 10896, + 10897, 10898, 10899, 10900, 10901, 10902, 10903, 10904, 10905, 10906, + 10907, 10908, 10909, 10910, 10911, 10912, 10913, 10914, 10915, 10916, + 10917, 10918, 10919, 10920, 10921, 10922, 10923, 10924, 10925, 10926, + 10927, 10928, 10929, 10930, 10931, 10932, 10933, 10934, 10935, 10936, + 10937, 10938, 10939, 10940, 10941, 10942, 10943, 10944, 10945, 10946, + 10947, 10948, 10949, 10950, 10951, 10952, 10953, 10954, 10955, 10956, + 10957, 10958, 10959, 10960, 10961, 10962, 10963, 10964, 10965, 10966, + 10967, 10968, 10969, 10970, 10971, 10972, 10973, 10974, 10975, 10976, + 10977, 10978, 10979, 10980, 10981, 10982, 10983, 10984, 10985, 10986, + 10987, 10988, 10989, 10990, 10991, 10992, 10993, 10994, 10995, 10996, + 10997, 10998, 10999, 11000, 11001, 11002, 11003, 11004, 11005, 11006, + 11007, 11008, 11009, 11010, 11011, 11012, 11013, 11014, 11015, 11016, + 11017, 11018, 11019, 11020, 11021, 11022, 11023, 11024, 11025, 11026, + 11027, 11028, 11029, 11030, 11031, 11032, 11033, 11034, 11035, 11036, + 11037, 11038, 11039, 11040, 11041, 11042, 11043, 11044, 11045, 11046, + 11047, 11048, 11049, 11050, 11051, 11052, 11053, 11054, 11055, 11056, + 11057, 11058, 11059, 11060, 11061, 11062, 11063, 11064, 11065, 11066, + 11067, 11068, 11069, 11070, 11071, 11072, 11073, 11074, 11075, 11076, + 11077, 11078, 11079, 11080, 11081, 11082, 11083, 11084, 11085, 11086, + 11087, 11088, 11089, 11090, 11091, 11092, 11093, 11094, 11095, 11096, + 11097, 11098, 11099, 11100, 11101, 11102, 11103, + ] +) diff --git a/src/encoding/index/jis0212.rs b/src/encoding/index/jis0212.rs index cef1c10..1260141 100644 --- a/src/encoding/index/jis0212.rs +++ b/src/encoding/index/jis0212.rs @@ -2753,15 +2753,6 @@ pub fn backward(code: u32) -> u16 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(0u32, 0x10000) { - let i = i as u16; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +multi_byte_tests!( + dups = [] +) diff --git a/src/encoding/index/koi8_r.rs b/src/encoding/index/koi8_r.rs index 84f42de..03f4fea 100644 --- a/src/encoding/index/koi8_r.rs +++ b/src/encoding/index/koi8_r.rs @@ -57,15 +57,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/koi8_u.rs b/src/encoding/index/koi8_u.rs index 9c0c12f..dbb5f79 100644 --- a/src/encoding/index/koi8_u.rs +++ b/src/encoding/index/koi8_u.rs @@ -57,15 +57,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/macintosh.rs b/src/encoding/index/macintosh.rs index 338f1c6..31bc9bd 100644 --- a/src/encoding/index/macintosh.rs +++ b/src/encoding/index/macintosh.rs @@ -54,15 +54,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1250.rs b/src/encoding/index/windows_1250.rs index 4d1997a..bd87093 100644 --- a/src/encoding/index/windows_1250.rs +++ b/src/encoding/index/windows_1250.rs @@ -52,15 +52,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1251.rs b/src/encoding/index/windows_1251.rs index bacad39..d665b4f 100644 --- a/src/encoding/index/windows_1251.rs +++ b/src/encoding/index/windows_1251.rs @@ -57,15 +57,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1252.rs b/src/encoding/index/windows_1252.rs index 1810aab..897e03c 100644 --- a/src/encoding/index/windows_1252.rs +++ b/src/encoding/index/windows_1252.rs @@ -52,15 +52,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1253.rs b/src/encoding/index/windows_1253.rs index 38d3e3b..801444a 100644 --- a/src/encoding/index/windows_1253.rs +++ b/src/encoding/index/windows_1253.rs @@ -52,15 +52,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1254.rs b/src/encoding/index/windows_1254.rs index 2b8e6d6..4e7a045 100644 --- a/src/encoding/index/windows_1254.rs +++ b/src/encoding/index/windows_1254.rs @@ -52,15 +52,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1255.rs b/src/encoding/index/windows_1255.rs index 4f6fb90..eca74dd 100644 --- a/src/encoding/index/windows_1255.rs +++ b/src/encoding/index/windows_1255.rs @@ -53,15 +53,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1256.rs b/src/encoding/index/windows_1256.rs index eb4ecc8..95d312c 100644 --- a/src/encoding/index/windows_1256.rs +++ b/src/encoding/index/windows_1256.rs @@ -55,15 +55,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1257.rs b/src/encoding/index/windows_1257.rs index a0f5fc5..c060d96 100644 --- a/src/encoding/index/windows_1257.rs +++ b/src/encoding/index/windows_1257.rs @@ -52,15 +52,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_1258.rs b/src/encoding/index/windows_1258.rs index fcd3a73..53a2413 100644 --- a/src/encoding/index/windows_1258.rs +++ b/src/encoding/index/windows_1258.rs @@ -52,15 +52,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/windows_874.rs b/src/encoding/index/windows_874.rs index 2661765..f2e28fb 100644 --- a/src/encoding/index/windows_874.rs +++ b/src/encoding/index/windows_874.rs @@ -55,15 +55,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/index/x_mac_cyrillic.rs b/src/encoding/index/x_mac_cyrillic.rs index 16104b8..45959a3 100644 --- a/src/encoding/index/x_mac_cyrillic.rs +++ b/src/encoding/index/x_mac_cyrillic.rs @@ -57,15 +57,4 @@ pub fn backward(code: u16) -> u8 { } #[cfg(test)] -mod tests { - use super::{forward, backward}; - - #[test] - fn test_correct_table() { - for i in range(128, 256) { - let i = i as u8; - let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } - } - } -} +single_byte_tests!() diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index b515981..4a212c7 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -15,6 +15,8 @@ #![feature(globs, macro_rules)] +#[cfg(test)] extern crate test; + pub use self::types::{CodecError, ByteWriter, StringWriter, Encoder, Decoder, EncodingRef, Encoding, EncoderTrapFunc, DecoderTrapFunc, DecoderTrap, diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 6046965..33aeb98 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -173,3 +173,104 @@ pub fn get_external_bench_data() -> Vec { } } +/// Makes a common test suite for single-byte indices. +macro_rules! single_byte_tests( + () => ( + mod tests { + use super::{forward, backward}; + + #[test] + fn test_correct_table() { + for i in range(128, 256) { + let i = i as u8; + let j = forward(i); + if j != 0xffff { assert_eq!(backward(j), i); } + } + } + } + ); +) + +/// Makes a common test suite for multi-byte indices. +macro_rules! multi_byte_tests( + (make shared tests with dups = $dups:expr) => ( // internal macro + #[test] + fn test_correct_table() { + static DUPS: &'static [u16] = &$dups; + for i in range(0u32, 0x10000) { + let i = i as u16; + if DUPS.contains(&i) { continue; } + let j = forward(i); + if j != 0xffff { assert_eq!(backward(j), i); } + } + } + ); + + ( + dups = $dups:expr + ) => ( + mod tests { + use super::{forward, backward}; + + multi_byte_tests!(make shared tests with dups = $dups) + } + ); + + ( + remap = $remap_min:expr .. $remap_max:expr, + dups = $dups:expr + ) => ( + mod tests { + use super::{forward, backward, backward_remapped}; + + multi_byte_tests!(make shared tests with dups = $dups) + + #[test] + fn test_correct_remapping() { + for i in range::($remap_min, $remap_max+1) { + let j = forward(i); + if j != 0xffff { + let ii = backward_remapped(j); + assert!(ii != i && ii != 0xffff); + let jj = forward(ii); + assert_eq!(j, jj); + } + } + } + } + ); +) + +/// Makes a common test suite for multi-byte range indices. +macro_rules! multi_byte_range_tests( + ( + key = $minkey:expr .. $maxkey:expr, + value = $minvalue:expr .. $maxvalue:expr + ) => ( + mod tests { + use super::{forward, backward}; + + #[test] + fn test_no_failure() { + for i in range::(if $minkey>0 {$minkey-1} else {0}, $maxkey+2) { + forward(i); + } + for j in range::(if $minvalue>0 {$minvalue-1} else {0}, $maxvalue+2) { + backward(j); + } + } + + #[test] + fn test_correct_table() { + for i in range::($minkey, $maxkey+2) { + let j = forward(i); + if j == 0xffffffff { continue; } + let i_ = backward(j); + if i_ == 0xffffffff { continue; } + assert!(i_ == i, "backward(forward({})) = backward({}) = {} != {}", i, j, i_, i); + } + } + } + ); +) + From 2458f742b2b2e7433bf26a91b2c08577613e6cb7 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Thu, 15 May 2014 18:42:45 +0900 Subject: [PATCH 19/29] added benches to indices. --- src/encoding/index/gb18030_ranges.rs | 4 +- src/encoding/index/gen_index.py | 11 +++- src/encoding/testutils.rs | 93 ++++++++++++++++++++++++++-- 3 files changed, 99 insertions(+), 9 deletions(-) diff --git a/src/encoding/index/gb18030_ranges.rs b/src/encoding/index/gb18030_ranges.rs index 123aae1..cd51e7d 100644 --- a/src/encoding/index/gb18030_ranges.rs +++ b/src/encoding/index/gb18030_ranges.rs @@ -80,6 +80,6 @@ pub fn backward(code: u32) -> u32 { #[cfg(test)] multi_byte_range_tests!( - key = 0 .. 189000, - value = 128 .. 65536 + key = 0 .. 189000, key < 1114112, + value = 128 .. 65536, value < 1587600 ) diff --git a/src/encoding/index/gen_index.py b/src/encoding/index/gen_index.py index a150c5c..35a5757 100644 --- a/src/encoding/index/gen_index.py +++ b/src/encoding/index/gen_index.py @@ -242,6 +242,13 @@ def generate_multi_byte_range_lbound_index(name): while 2**(maxlog2 + 1) <= len(data): maxlog2 += 1 + if name == 'gb18030-ranges': + keyubound = 0x110000 + valueubound = 126 * 10 * 126 * 10 + else: + keyubound = maxkey + 1 + valueubound = maxvalue + 1 + with open('%s.rs' % name.replace('-', '_'), 'wb') as f: print >>f, '// AUTOGENERATED FROM index-%s.txt, ORIGINAL COMMENT FOLLOWS:' % name print >>f, '//' @@ -284,8 +291,8 @@ def generate_multi_byte_range_lbound_index(name): print >>f print >>f, '#[cfg(test)]' print >>f, 'multi_byte_range_tests!(' - print >>f, ' key = %d .. %d,' % (minkey, maxkey) - print >>f, ' value = %d .. %d' % (minvalue, maxvalue) + print >>f, ' key = %d .. %d, key < %d,' % (minkey, maxkey, keyubound) + print >>f, ' value = %d .. %d, value < %d' % (minvalue, maxvalue, valueubound) print >>f, ')' return 8 * len(data) diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 33aeb98..05ed569 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -178,6 +178,7 @@ macro_rules! single_byte_tests( () => ( mod tests { use super::{forward, backward}; + use test; #[test] fn test_correct_table() { @@ -187,13 +188,33 @@ macro_rules! single_byte_tests( if j != 0xffff { assert_eq!(backward(j), i); } } } + + #[bench] + fn bench_forward_sequential_128(bencher: &mut test::Bencher) { + bencher.iter(|| { + for i in range(0x80, 0x100) { + test::black_box(forward(i as u8)); + } + }) + } + + #[bench] + fn bench_backward_sequential_128(bencher: &mut test::Bencher) { + let mut start: u32 = 0; + bencher.iter(|| { + for i in range(start, start + 0x80) { + test::black_box(backward(i as u16)); + } + start += 0x80; + }) + } } ); ) /// Makes a common test suite for multi-byte indices. macro_rules! multi_byte_tests( - (make shared tests with dups = $dups:expr) => ( // internal macro + (make shared tests and benches with dups = $dups:expr) => ( // internal macro #[test] fn test_correct_table() { static DUPS: &'static [u16] = &$dups; @@ -204,6 +225,29 @@ macro_rules! multi_byte_tests( if j != 0xffff { assert_eq!(backward(j), i); } } } + + #[bench] + fn bench_forward_sequential_128(bencher: &mut test::Bencher) { + let mut start: u32 = 0; + bencher.iter(|| { + for i in range(start, start + 0x80) { + test::black_box(forward(i as u16)); + } + start += 0x80; + }) + } + + #[bench] + fn bench_backward_sequential_128(bencher: &mut test::Bencher) { + let mut start: u32 = 0; + bencher.iter(|| { + for i in range(start, start + 0x80) { + test::black_box(backward(i)); + } + start += 0x80; + if start >= 0x110000 { start = 0; } + }) + } ); ( @@ -211,8 +255,9 @@ macro_rules! multi_byte_tests( ) => ( mod tests { use super::{forward, backward}; + use test; - multi_byte_tests!(make shared tests with dups = $dups) + multi_byte_tests!(make shared tests and benches with dups = $dups) } ); @@ -222,8 +267,9 @@ macro_rules! multi_byte_tests( ) => ( mod tests { use super::{forward, backward, backward_remapped}; + use test; - multi_byte_tests!(make shared tests with dups = $dups) + multi_byte_tests!(make shared tests and benches with dups = $dups) #[test] fn test_correct_remapping() { @@ -237,6 +283,18 @@ macro_rules! multi_byte_tests( } } } + + #[bench] + fn bench_backward_remapped_sequential_128(bencher: &mut test::Bencher) { + let mut start: u32 = 0; + bencher.iter(|| { + for i in range(start, start + 0x80) { + test::black_box(backward_remapped(i)); + } + start += 0x80; + if start >= 0x110000 { start = 0; } + }) + } } ); ) @@ -244,11 +302,12 @@ macro_rules! multi_byte_tests( /// Makes a common test suite for multi-byte range indices. macro_rules! multi_byte_range_tests( ( - key = $minkey:expr .. $maxkey:expr, - value = $minvalue:expr .. $maxvalue:expr + key = $minkey:expr .. $maxkey:expr, key < $keyubound:expr, + value = $minvalue:expr .. $maxvalue:expr, value < $valueubound:expr ) => ( mod tests { use super::{forward, backward}; + use test; #[test] fn test_no_failure() { @@ -270,6 +329,30 @@ macro_rules! multi_byte_range_tests( assert!(i_ == i, "backward(forward({})) = backward({}) = {} != {}", i, j, i_, i); } } + + #[bench] + fn bench_forward_sequential_128(bencher: &mut test::Bencher) { + let mut start: u32 = 0; + bencher.iter(|| { + for i in range(start, start + 0x80) { + test::black_box(forward(i)); + } + start += 0x80; + if start >= $keyubound { start = 0; } + }) + } + + #[bench] + fn bench_backward_sequential_128(bencher: &mut test::Bencher) { + let mut start: u32 = 0; + bencher.iter(|| { + for i in range(start, start + 0x80) { + test::black_box(backward(i)); + } + start += 0x80; + if start >= $valueubound { start = 0; } + }) + } } ); ) From c75b37b4f0a6815726f15d440088f721cb4197e6 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Thu, 15 May 2014 19:37:08 +0900 Subject: [PATCH 20/29] single-byte indices switched to the tries. this greatly improves backward mapping performance, with improvements ranging from 50% to 400%. this also allows for the exact accounting of the binary size overhead. --- src/encoding/codec/singlebyte.rs | 21 +++-- src/encoding/codec/whatwg.rs | 2 +- src/encoding/index/gen_index.py | 71 +++++++++------ src/encoding/index/ibm866.rs | 74 +++++++++------ src/encoding/index/iso_8859_10.rs | 61 +++++++------ src/encoding/index/iso_8859_13.rs | 61 +++++++------ src/encoding/index/iso_8859_14.rs | 69 ++++++++------ src/encoding/index/iso_8859_15.rs | 59 ++++++------ src/encoding/index/iso_8859_16.rs | 65 ++++++++------ src/encoding/index/iso_8859_2.rs | 55 ++++++------ src/encoding/index/iso_8859_3.rs | 52 ++++++----- src/encoding/index/iso_8859_4.rs | 55 ++++++------ src/encoding/index/iso_8859_5.rs | 62 +++++++------ src/encoding/index/iso_8859_6.rs | 43 +++++---- src/encoding/index/iso_8859_7.rs | 62 +++++++------ src/encoding/index/iso_8859_8.rs | 53 ++++++----- src/encoding/index/koi8_r.rs | 78 ++++++++++------ src/encoding/index/koi8_u.rs | 79 ++++++++++------ src/encoding/index/macintosh.rs | 129 +++++++++++++++++++++------ src/encoding/index/windows_1250.rs | 70 +++++++++------ src/encoding/index/windows_1251.rs | 70 +++++++++------ src/encoding/index/windows_1252.rs | 69 ++++++++------ src/encoding/index/windows_1253.rs | 66 ++++++++------ src/encoding/index/windows_1254.rs | 71 +++++++++------ src/encoding/index/windows_1255.rs | 70 +++++++++------ src/encoding/index/windows_1256.rs | 78 ++++++++++------ src/encoding/index/windows_1257.rs | 70 +++++++++------ src/encoding/index/windows_1258.rs | 75 ++++++++++------ src/encoding/index/windows_874.rs | 63 +++++++------ src/encoding/index/x_mac_cyrillic.rs | 77 ++++++++++------ src/encoding/testutils.rs | 4 +- 31 files changed, 1191 insertions(+), 743 deletions(-) diff --git a/src/encoding/codec/singlebyte.rs b/src/encoding/codec/singlebyte.rs index 3761a60..258b50b 100644 --- a/src/encoding/codec/singlebyte.rs +++ b/src/encoding/codec/singlebyte.rs @@ -12,7 +12,7 @@ pub struct SingleByteEncoding { pub name: &'static str, pub whatwg_name: Option<&'static str>, pub index_forward: extern "Rust" fn(u8) -> u16, - pub index_backward: extern "Rust" fn(u16) -> u8, + pub index_backward: extern "Rust" fn(u32) -> u8, } impl Encoding for SingleByteEncoding { @@ -25,11 +25,11 @@ impl Encoding for SingleByteEncoding { /// An encoder for single-byte encodings based on ASCII. #[deriving(Clone)] pub struct SingleByteEncoder { - index_backward: extern "Rust" fn(u16) -> u8, + index_backward: extern "Rust" fn(u32) -> u8, } impl SingleByteEncoder { - pub fn new(index_backward: extern "Rust" fn(u16) -> u8) -> Box { + pub fn new(index_backward: extern "Rust" fn(u32) -> u8) -> Box { box SingleByteEncoder { index_backward: index_backward } as Box } } @@ -45,17 +45,16 @@ impl Encoder for SingleByteEncoder { if ch <= '\u007f' { output.write_byte(ch as u8); continue; - } - if ch <= '\uffff' { - let index = (self.index_backward)(ch as u16); + } else { + let index = (self.index_backward)(ch as u32); if index != 0 { output.write_byte(index); - continue; + } else { + return (i, Some(CodecError { + upto: j, cause: "unrepresentable character".into_maybe_owned() + })); } } - return (i, Some(CodecError { - upto: j, cause: "unrepresentable character".into_maybe_owned() - })); } (input.len(), None) } @@ -112,7 +111,7 @@ impl Decoder for SingleByteDecoder { /// Algorithmic mapping for ISO 8859-1. pub mod iso_8859_1 { #[inline] pub fn forward(code: u8) -> u16 { code as u16 } - #[inline] pub fn backward(code: u16) -> u8 { if (code & !0x7f) == 0x80 {code as u8} else {0} } + #[inline] pub fn backward(code: u32) -> u8 { if (code & !0x7f) == 0x80 {code as u8} else {0} } } #[cfg(test)] diff --git a/src/encoding/codec/whatwg.rs b/src/encoding/codec/whatwg.rs index 4ac2f2c..13a5b3b 100644 --- a/src/encoding/codec/whatwg.rs +++ b/src/encoding/codec/whatwg.rs @@ -27,7 +27,7 @@ pub mod x_user_defined { } #[inline] - pub fn backward(code: u16) -> u8 { + pub fn backward(code: u32) -> u8 { if (code & !0x7f) == 0xf780 {(code & 0xff) as u8} else {0} } } diff --git a/src/encoding/index/gen_index.py b/src/encoding/index/gen_index.py index 35a5757..e5ecf59 100644 --- a/src/encoding/index/gen_index.py +++ b/src/encoding/index/gen_index.py @@ -29,12 +29,38 @@ def write_comma_separated(f, prefix, l, width=80): if buffered: print >>f, prefix + buffered.rstrip() +def make_minimal_trie(invdata, lowerlimit=0x10000): + maxvalue = max(invdata.keys()) + 1 + best = 0xffffffff + besttrie = None + for triebits in xrange(21): + lower = [None] * (1<= len(lower) + len(upper): + best = len(lower) + len(upper) + besttrie = (triebits, lower, upper) + return besttrie + def generate_single_byte_index(name): data = [None] * 128 + invdata = {} comments = [] for key, value in whatwg_index(name, comments): - assert 0 <= key < 128 and 0 <= value < 0xffff and data[key] is None + assert 0 <= key < 128 and 0 <= value < 0xffff and data[key] is None and value not in invdata data[key] = value + invdata[value] = key + + # generate a trie with a minimal amount of data + triebits, lower, upper = make_minimal_trie(invdata, lowerlimit=0x10000) with open('%s.rs' % name.replace('-', '_'), 'wb') as f: print >>f, '// AUTOGENERATED FROM index-%s.txt, ORIGINAL COMMENT FOLLOWS:' % name @@ -52,18 +78,25 @@ def generate_single_byte_index(name): print >>f, ' FORWARD_TABLE[(code - 0x80) as uint]' print >>f, '}' print >>f - print >>f, 'pub fn backward(code: u16) -> u8 {' - print >>f, ' match code {' - write_comma_separated(f, ' ', - ['%d => %d, ' % (value, i+128) for i, value in enumerate(data) if value is not None] + - ['_ => 0']) - print >>f, ' }' + print >>f, "static BACKWARD_TABLE_LOWER: &'static [u8] = &[" + write_comma_separated(f, ' ', ['%d, ' % (0 if v is None else v+0x80) for v in lower]) + print >>f, '];' + print >>f + print >>f, "static BACKWARD_TABLE_UPPER: &'static [u16] = &[" + write_comma_separated(f, ' ', ['%d, ' % v for v in upper]) + print >>f, '];' + print >>f + print >>f, '#[inline]' + print >>f, 'pub fn backward(code: u32) -> u8 {' + print >>f, ' let offset = (code >> %d) as uint;' % triebits + print >>f, ' let offset = if offset < %d {BACKWARD_TABLE_UPPER[offset] as uint} else {0};' % len(upper) + print >>f, ' BACKWARD_TABLE_LOWER[offset + ((code & %d) as uint)]' % ((1<>f, '}' print >>f print >>f, '#[cfg(test)]' print >>f, 'single_byte_tests!()' - return 2 * len(data) + return 2 * len(data) + len(lower) + 2 * len(upper) def generate_multi_byte_index(name): data = {} @@ -92,24 +125,7 @@ def generate_multi_byte_index(name): dups.append(key) # no consistency testing for them # generate a trie with a minimal amount of data - maxvalue = max(data.values()) + 1 - best = 0xffffffff - besttrie = None - for triebits in xrange(21): - lower = [0xffff] * (1<= len(lower) + len(upper): - best = len(lower) + len(upper) - besttrie = (triebits, lower, upper) + triebits, lower, upper = make_minimal_trie(invdata, lowerlimit=0x10000) # JIS X 0208 index has two ranges [8272,8836) and [8836,11280) to support two slightly # different encodings EUC-JP and Shift_JIS; the default backward function would favor @@ -139,7 +155,6 @@ def generate_multi_byte_index(name): minkey = min(data) maxkey = max(data) + 1 - triebits, lower, upper = besttrie with open('%s.rs' % name.replace('-', '_'), 'wb') as f: print >>f, '// AUTOGENERATED FROM index-%s.txt, ORIGINAL COMMENT FOLLOWS:' % name print >>f, '//' @@ -180,7 +195,7 @@ def generate_multi_byte_index(name): print >>f, '}' print >>f print >>f, "static BACKWARD_TABLE_LOWER: &'static [u16] = &[" - write_comma_separated(f, ' ', ['%d, ' % v for v in lower]) + write_comma_separated(f, ' ', ['%d, ' % (0xffff if v is None else v) for v in lower]) print >>f, '];' print >>f print >>f, "static BACKWARD_TABLE_UPPER: &'static [u16] = &[" diff --git a/src/encoding/index/ibm866.rs b/src/encoding/index/ibm866.rs index 8046385..dc29515 100644 --- a/src/encoding/index/ibm866.rs +++ b/src/encoding/index/ibm866.rs @@ -25,35 +25,51 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 1040 => 128, 1041 => 129, 1042 => 130, 1043 => 131, 1044 => 132, - 1045 => 133, 1046 => 134, 1047 => 135, 1048 => 136, 1049 => 137, - 1050 => 138, 1051 => 139, 1052 => 140, 1053 => 141, 1054 => 142, - 1055 => 143, 1056 => 144, 1057 => 145, 1058 => 146, 1059 => 147, - 1060 => 148, 1061 => 149, 1062 => 150, 1063 => 151, 1064 => 152, - 1065 => 153, 1066 => 154, 1067 => 155, 1068 => 156, 1069 => 157, - 1070 => 158, 1071 => 159, 1072 => 160, 1073 => 161, 1074 => 162, - 1075 => 163, 1076 => 164, 1077 => 165, 1078 => 166, 1079 => 167, - 1080 => 168, 1081 => 169, 1082 => 170, 1083 => 171, 1084 => 172, - 1085 => 173, 1086 => 174, 1087 => 175, 9617 => 176, 9618 => 177, - 9619 => 178, 9474 => 179, 9508 => 180, 9569 => 181, 9570 => 182, - 9558 => 183, 9557 => 184, 9571 => 185, 9553 => 186, 9559 => 187, - 9565 => 188, 9564 => 189, 9563 => 190, 9488 => 191, 9492 => 192, - 9524 => 193, 9516 => 194, 9500 => 195, 9472 => 196, 9532 => 197, - 9566 => 198, 9567 => 199, 9562 => 200, 9556 => 201, 9577 => 202, - 9574 => 203, 9568 => 204, 9552 => 205, 9580 => 206, 9575 => 207, - 9576 => 208, 9572 => 209, 9573 => 210, 9561 => 211, 9560 => 212, - 9554 => 213, 9555 => 214, 9579 => 215, 9578 => 216, 9496 => 217, - 9484 => 218, 9608 => 219, 9604 => 220, 9612 => 221, 9616 => 222, - 9600 => 223, 1088 => 224, 1089 => 225, 1090 => 226, 1091 => 227, - 1092 => 228, 1093 => 229, 1094 => 230, 1095 => 231, 1096 => 232, - 1097 => 233, 1098 => 234, 1099 => 235, 1100 => 236, 1101 => 237, - 1102 => 238, 1103 => 239, 1025 => 240, 1105 => 241, 1028 => 242, - 1108 => 243, 1031 => 244, 1111 => 245, 1038 => 246, 1118 => 247, - 176 => 248, 8729 => 249, 183 => 250, 8730 => 251, 8470 => 252, - 164 => 253, 9632 => 254, 160 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 255, 0, 0, 0, 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 248, 0, 0, 0, 0, 0, 0, 250, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 0, 0, 242, 0, + 0, 244, 0, 0, 0, 0, 0, 0, 246, 0, 128, 129, 130, 131, 132, 133, 134, 135, + 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, + 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, 164, 165, + 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 0, 241, 0, 0, 243, + 0, 0, 245, 0, 0, 0, 0, 0, 0, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 252, 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, 249, 251, 0, 0, + 0, 0, 0, 196, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 0, 0, 0, 191, 0, 0, + 0, 192, 0, 0, 0, 217, 0, 0, 0, 195, 0, 0, 0, 0, 0, 0, 0, 180, 0, 0, 0, 0, + 0, 0, 0, 194, 0, 0, 0, 0, 0, 0, 0, 193, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 205, 186, 213, 214, 201, + 184, 183, 187, 212, 211, 200, 190, 189, 188, 198, 199, 204, 181, 182, 185, + 209, 210, 203, 207, 208, 202, 216, 215, 206, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 223, 0, 0, 0, 220, 0, 0, 0, 219, 0, 0, 0, 221, + 0, 0, 0, 222, 176, 177, 178, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 254, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 32, 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, 64, 96, 128, 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, 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, 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, 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, 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, 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, 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, 160, 0, 0, 0, 0, 0, 0, 0, 192, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, + 256, 288, 320, 352, 384, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 302 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_10.rs b/src/encoding/index/iso_8859_10.rs index f59dde1..441db49 100644 --- a/src/encoding/index/iso_8859_10.rs +++ b/src/encoding/index/iso_8859_10.rs @@ -23,31 +23,42 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 260 => 161, 274 => 162, 290 => 163, - 298 => 164, 296 => 165, 310 => 166, 167 => 167, 315 => 168, 272 => 169, - 352 => 170, 358 => 171, 381 => 172, 173 => 173, 362 => 174, 330 => 175, - 176 => 176, 261 => 177, 275 => 178, 291 => 179, 299 => 180, 297 => 181, - 311 => 182, 183 => 183, 316 => 184, 273 => 185, 353 => 186, 359 => 187, - 382 => 188, 8213 => 189, 363 => 190, 331 => 191, 256 => 192, - 193 => 193, 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, - 302 => 199, 268 => 200, 201 => 201, 280 => 202, 203 => 203, 278 => 204, - 205 => 205, 206 => 206, 207 => 207, 208 => 208, 325 => 209, 332 => 210, - 211 => 211, 212 => 212, 213 => 213, 214 => 214, 360 => 215, 216 => 216, - 370 => 217, 218 => 218, 219 => 219, 220 => 220, 221 => 221, 222 => 222, - 223 => 223, 257 => 224, 225 => 225, 226 => 226, 227 => 227, 228 => 228, - 229 => 229, 230 => 230, 303 => 231, 269 => 232, 233 => 233, 281 => 234, - 235 => 235, 279 => 236, 237 => 237, 238 => 238, 239 => 239, 240 => 240, - 326 => 241, 333 => 242, 243 => 243, 244 => 244, 245 => 245, 246 => 246, - 361 => 247, 248 => 248, 371 => 249, 250 => 250, 251 => 251, 252 => 252, - 253 => 253, 254 => 254, 312 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 0, 0, 0, 0, 0, + 0, 167, 0, 0, 0, 0, 0, 173, 0, 0, 176, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 193, 194, 195, 196, 197, 198, 0, 0, 201, 0, 203, 0, 205, + 206, 207, 208, 0, 0, 211, 212, 213, 214, 0, 216, 0, 218, 219, 220, 221, + 222, 223, 0, 225, 226, 227, 228, 229, 230, 0, 0, 233, 0, 235, 0, 237, 238, + 239, 240, 0, 0, 243, 244, 245, 246, 0, 248, 0, 250, 251, 252, 253, 254, 0, + 192, 224, 0, 0, 161, 177, 0, 0, 0, 0, 0, 0, 200, 232, 0, 0, 169, 185, 162, + 178, 0, 0, 204, 236, 202, 234, 0, 0, 0, 0, 0, 0, 0, 0, 163, 179, 0, 0, 0, + 0, 165, 181, 164, 180, 0, 0, 199, 231, 0, 0, 0, 0, 0, 0, 166, 182, 255, 0, + 0, 168, 184, 0, 0, 0, 0, 0, 0, 0, 0, 209, 241, 0, 0, 0, 175, 191, 210, 242, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 186, 0, 0, 0, 0, + 171, 187, 215, 247, 174, 190, 0, 0, 0, 0, 0, 0, 217, 249, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 172, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 189, 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, 0, 0, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 128, 192, 256, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 320, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 129 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_13.rs b/src/encoding/index/iso_8859_13.rs index dd8d523..ba5597a 100644 --- a/src/encoding/index/iso_8859_13.rs +++ b/src/encoding/index/iso_8859_13.rs @@ -23,31 +23,42 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 8221 => 161, 162 => 162, - 163 => 163, 164 => 164, 8222 => 165, 166 => 166, 167 => 167, - 216 => 168, 169 => 169, 342 => 170, 171 => 171, 172 => 172, 173 => 173, - 174 => 174, 198 => 175, 176 => 176, 177 => 177, 178 => 178, 179 => 179, - 8220 => 180, 181 => 181, 182 => 182, 183 => 183, 248 => 184, - 185 => 185, 343 => 186, 187 => 187, 188 => 188, 189 => 189, 190 => 190, - 230 => 191, 260 => 192, 302 => 193, 256 => 194, 262 => 195, 196 => 196, - 197 => 197, 280 => 198, 274 => 199, 268 => 200, 201 => 201, 377 => 202, - 278 => 203, 290 => 204, 310 => 205, 298 => 206, 315 => 207, 352 => 208, - 323 => 209, 325 => 210, 211 => 211, 332 => 212, 213 => 213, 214 => 214, - 215 => 215, 370 => 216, 321 => 217, 346 => 218, 362 => 219, 220 => 220, - 379 => 221, 381 => 222, 223 => 223, 261 => 224, 303 => 225, 257 => 226, - 263 => 227, 228 => 228, 229 => 229, 281 => 230, 275 => 231, 269 => 232, - 233 => 233, 378 => 234, 279 => 235, 291 => 236, 311 => 237, 299 => 238, - 316 => 239, 353 => 240, 324 => 241, 326 => 242, 243 => 243, 333 => 244, - 245 => 245, 246 => 246, 247 => 247, 371 => 248, 322 => 249, 347 => 250, - 363 => 251, 252 => 252, 380 => 253, 382 => 254, 8217 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 0, 162, 163, + 164, 0, 166, 167, 0, 169, 0, 171, 172, 173, 174, 0, 176, 177, 178, 179, 0, + 181, 182, 183, 0, 185, 0, 187, 188, 189, 190, 0, 0, 0, 0, 0, 196, 197, 175, + 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, 211, 0, 213, 214, 215, 168, 0, 0, 0, + 220, 0, 0, 223, 0, 0, 0, 0, 228, 229, 191, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 243, 0, 245, 246, 247, 184, 0, 0, 0, 252, 0, 0, 0, 194, 226, 0, 0, + 192, 224, 195, 227, 0, 0, 0, 0, 200, 232, 0, 0, 0, 0, 199, 231, 0, 0, 203, + 235, 198, 230, 0, 0, 0, 0, 0, 0, 0, 0, 204, 236, 0, 0, 0, 0, 0, 0, 206, + 238, 0, 0, 193, 225, 0, 0, 0, 0, 0, 0, 205, 237, 0, 0, 0, 207, 239, 0, 0, + 0, 0, 217, 249, 209, 241, 210, 242, 0, 0, 0, 0, 0, 212, 244, 0, 0, 0, 0, 0, + 0, 0, 0, 170, 186, 0, 0, 218, 250, 0, 0, 0, 0, 208, 240, 0, 0, 0, 0, 0, 0, + 0, 0, 219, 251, 0, 0, 0, 0, 0, 0, 216, 248, 0, 0, 0, 0, 0, 202, 234, 221, + 253, 222, 254, 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, 255, 0, 0, 180, 161, 165, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 128, 192, 256, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 320, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 129 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_14.rs b/src/encoding/index/iso_8859_14.rs index dbce107..2069f8a 100644 --- a/src/encoding/index/iso_8859_14.rs +++ b/src/encoding/index/iso_8859_14.rs @@ -23,32 +23,49 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 7682 => 161, 7683 => 162, - 163 => 163, 266 => 164, 267 => 165, 7690 => 166, 167 => 167, - 7808 => 168, 169 => 169, 7810 => 170, 7691 => 171, 7922 => 172, - 173 => 173, 174 => 174, 376 => 175, 7710 => 176, 7711 => 177, - 288 => 178, 289 => 179, 7744 => 180, 7745 => 181, 182 => 182, - 7766 => 183, 7809 => 184, 7767 => 185, 7811 => 186, 7776 => 187, - 7923 => 188, 7812 => 189, 7813 => 190, 7777 => 191, 192 => 192, - 193 => 193, 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, - 199 => 199, 200 => 200, 201 => 201, 202 => 202, 203 => 203, 204 => 204, - 205 => 205, 206 => 206, 207 => 207, 372 => 208, 209 => 209, 210 => 210, - 211 => 211, 212 => 212, 213 => 213, 214 => 214, 7786 => 215, - 216 => 216, 217 => 217, 218 => 218, 219 => 219, 220 => 220, 221 => 221, - 374 => 222, 223 => 223, 224 => 224, 225 => 225, 226 => 226, 227 => 227, - 228 => 228, 229 => 229, 230 => 230, 231 => 231, 232 => 232, 233 => 233, - 234 => 234, 235 => 235, 236 => 236, 237 => 237, 238 => 238, 239 => 239, - 373 => 240, 241 => 241, 242 => 242, 243 => 243, 244 => 244, 245 => 245, - 246 => 246, 7787 => 247, 248 => 248, 249 => 249, 250 => 250, - 251 => 251, 252 => 252, 253 => 253, 375 => 254, 255 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 0, 0, 163, 0, 0, 0, 167, 0, 169, 0, 0, + 0, 173, 174, 0, 0, 0, 0, 0, 0, 0, 182, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 0, + 209, 210, 211, 212, 213, 214, 0, 216, 217, 218, 219, 220, 221, 0, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 0, 241, 242, 243, 244, 245, 246, 0, 248, 249, 250, 251, 252, 253, 0, 255, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 178, 179, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 240, 222, 254, 175, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 161, 162, 0, 0, 0, 0, 0, 0, 166, 171, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 176, 177, 180, 181, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 183, 185, 0, 0, 0, 0, 0, 0, 0, 0, 187, + 191, 0, 0, 0, 0, 0, 0, 0, 0, 215, 247, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 168, 184, 170, 186, 189, 190, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 172, 188, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 96, 128, 160, 192, 0, 224, 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, + 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 0, 288, 320, + 352, 0, 0, 384, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 248 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_15.rs b/src/encoding/index/iso_8859_15.rs index 4fa136e..15fe1cf 100644 --- a/src/encoding/index/iso_8859_15.rs +++ b/src/encoding/index/iso_8859_15.rs @@ -23,31 +23,40 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 161 => 161, 162 => 162, 163 => 163, - 8364 => 164, 165 => 165, 352 => 166, 167 => 167, 353 => 168, - 169 => 169, 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, - 175 => 175, 176 => 176, 177 => 177, 178 => 178, 179 => 179, 381 => 180, - 181 => 181, 182 => 182, 183 => 183, 382 => 184, 185 => 185, 186 => 186, - 187 => 187, 338 => 188, 339 => 189, 376 => 190, 191 => 191, 192 => 192, - 193 => 193, 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, - 199 => 199, 200 => 200, 201 => 201, 202 => 202, 203 => 203, 204 => 204, - 205 => 205, 206 => 206, 207 => 207, 208 => 208, 209 => 209, 210 => 210, - 211 => 211, 212 => 212, 213 => 213, 214 => 214, 215 => 215, 216 => 216, - 217 => 217, 218 => 218, 219 => 219, 220 => 220, 221 => 221, 222 => 222, - 223 => 223, 224 => 224, 225 => 225, 226 => 226, 227 => 227, 228 => 228, - 229 => 229, 230 => 230, 231 => 231, 232 => 232, 233 => 233, 234 => 234, - 235 => 235, 236 => 236, 237 => 237, 238 => 238, 239 => 239, 240 => 240, - 241 => 241, 242 => 242, 243 => 243, 244 => 244, 245 => 245, 246 => 246, - 247 => 247, 248 => 248, 249 => 249, 250 => 250, 251 => 251, 252 => 252, - 253 => 253, 254 => 254, 255 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 161, 162, 163, + 0, 165, 0, 167, 0, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 179, + 0, 181, 182, 183, 0, 185, 186, 187, 0, 0, 0, 191, 192, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, + 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, + 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 188, 189, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 166, 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 190, 0, 0, 0, 0, 180, 184, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 128, 0, 192, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 256, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 131 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_16.rs b/src/encoding/index/iso_8859_16.rs index 2235e76..1a8a040 100644 --- a/src/encoding/index/iso_8859_16.rs +++ b/src/encoding/index/iso_8859_16.rs @@ -23,31 +23,46 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 260 => 161, 261 => 162, 321 => 163, - 8364 => 164, 8222 => 165, 352 => 166, 167 => 167, 353 => 168, - 169 => 169, 536 => 170, 171 => 171, 377 => 172, 173 => 173, 378 => 174, - 379 => 175, 176 => 176, 177 => 177, 268 => 178, 322 => 179, 381 => 180, - 8221 => 181, 182 => 182, 183 => 183, 382 => 184, 269 => 185, - 537 => 186, 187 => 187, 338 => 188, 339 => 189, 376 => 190, 380 => 191, - 192 => 192, 193 => 193, 194 => 194, 258 => 195, 196 => 196, 262 => 197, - 198 => 198, 199 => 199, 200 => 200, 201 => 201, 202 => 202, 203 => 203, - 204 => 204, 205 => 205, 206 => 206, 207 => 207, 272 => 208, 323 => 209, - 210 => 210, 211 => 211, 212 => 212, 336 => 213, 214 => 214, 346 => 215, - 368 => 216, 217 => 217, 218 => 218, 219 => 219, 220 => 220, 280 => 221, - 538 => 222, 223 => 223, 224 => 224, 225 => 225, 226 => 226, 259 => 227, - 228 => 228, 263 => 229, 230 => 230, 231 => 231, 232 => 232, 233 => 233, - 234 => 234, 235 => 235, 236 => 236, 237 => 237, 238 => 238, 239 => 239, - 273 => 240, 324 => 241, 242 => 242, 243 => 243, 244 => 244, 337 => 245, - 246 => 246, 347 => 247, 369 => 248, 249 => 249, 250 => 250, 251 => 251, - 252 => 252, 281 => 253, 539 => 254, 255 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 0, 0, 0, 0, 0, 0, 167, 0, 169, 0, 171, + 0, 173, 0, 0, 176, 177, 0, 0, 0, 0, 182, 183, 0, 0, 0, 187, 0, 0, 0, 0, + 192, 193, 194, 0, 196, 0, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 0, 0, 210, 211, 212, 0, 214, 0, 0, 217, 218, 219, 220, 0, 0, 223, 224, 225, + 226, 0, 228, 0, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 0, 0, + 242, 243, 244, 0, 246, 0, 0, 249, 250, 251, 252, 0, 0, 255, 0, 0, 195, 227, + 161, 162, 197, 229, 0, 0, 0, 0, 178, 185, 0, 0, 208, 240, 0, 0, 0, 0, 0, 0, + 221, 253, 0, 0, 0, 0, 0, 0, 0, 163, 179, 209, 241, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 213, 245, 188, 189, 0, 0, 0, 0, 0, 0, 215, 247, 0, 0, 0, 0, 166, + 168, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 216, 248, 0, 0, 0, 0, 0, 0, + 190, 172, 174, 175, 191, 180, 184, 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, 170, 186, 222, 254, 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, 181, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 96, 128, 160, 0, 192, 224, 0, 0, 0, 0, 256, 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, 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, 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, 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, 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, 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, + 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, 0, 288, 0, 0, 0, 0, 320, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 262 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_2.rs b/src/encoding/index/iso_8859_2.rs index eaf6524..ddb844f 100644 --- a/src/encoding/index/iso_8859_2.rs +++ b/src/encoding/index/iso_8859_2.rs @@ -23,31 +23,36 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 260 => 161, 728 => 162, 321 => 163, - 164 => 164, 317 => 165, 346 => 166, 167 => 167, 168 => 168, 352 => 169, - 350 => 170, 356 => 171, 377 => 172, 173 => 173, 381 => 174, 379 => 175, - 176 => 176, 261 => 177, 731 => 178, 322 => 179, 180 => 180, 318 => 181, - 347 => 182, 711 => 183, 184 => 184, 353 => 185, 351 => 186, 357 => 187, - 378 => 188, 733 => 189, 382 => 190, 380 => 191, 340 => 192, 193 => 193, - 194 => 194, 258 => 195, 196 => 196, 313 => 197, 262 => 198, 199 => 199, - 268 => 200, 201 => 201, 280 => 202, 203 => 203, 282 => 204, 205 => 205, - 206 => 206, 270 => 207, 272 => 208, 323 => 209, 327 => 210, 211 => 211, - 212 => 212, 336 => 213, 214 => 214, 215 => 215, 344 => 216, 366 => 217, - 218 => 218, 368 => 219, 220 => 220, 221 => 221, 354 => 222, 223 => 223, - 341 => 224, 225 => 225, 226 => 226, 259 => 227, 228 => 228, 314 => 229, - 263 => 230, 231 => 231, 269 => 232, 233 => 233, 281 => 234, 235 => 235, - 283 => 236, 237 => 237, 238 => 238, 271 => 239, 273 => 240, 324 => 241, - 328 => 242, 243 => 243, 244 => 244, 337 => 245, 246 => 246, 247 => 247, - 345 => 248, 367 => 249, 250 => 250, 369 => 251, 252 => 252, 253 => 253, - 355 => 254, 729 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 130, 131, 132, + 133, 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, + 148, 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 0, 0, 0, + 164, 0, 0, 167, 168, 0, 0, 0, 0, 173, 0, 0, 176, 0, 0, 0, 180, 0, 0, 0, + 184, 0, 0, 0, 0, 0, 0, 0, 0, 193, 194, 0, 196, 0, 0, 199, 0, 201, 0, 203, + 0, 205, 206, 0, 0, 0, 0, 211, 212, 0, 214, 215, 0, 0, 218, 0, 220, 221, 0, + 223, 0, 225, 226, 0, 228, 0, 0, 231, 0, 233, 0, 235, 0, 237, 238, 0, 0, 0, + 0, 243, 244, 0, 246, 247, 0, 0, 250, 0, 252, 253, 0, 0, 0, 0, 195, 227, + 161, 177, 198, 230, 0, 0, 0, 0, 200, 232, 207, 239, 208, 240, 0, 0, 0, 0, + 0, 0, 202, 234, 204, 236, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 229, + 0, 0, 165, 181, 0, 0, 163, 179, 209, 241, 0, 0, 210, 242, 0, 0, 0, 0, 0, 0, + 0, 213, 245, 0, 0, 192, 224, 0, 0, 216, 248, 166, 182, 0, 0, 170, 186, 169, + 185, 222, 254, 171, 187, 0, 0, 0, 0, 0, 0, 0, 0, 217, 249, 219, 251, 0, 0, + 0, 0, 0, 0, 0, 172, 188, 175, 191, 174, 190, 0, 0, 0, 0, 0, 0, 0, 0, 183, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 255, 0, 178, 0, 189, + 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 0, 0, 0, 16, 32, 48, 64, 80, 96, 112, 128, 144, 160, 0, 176, + 192, 208, 224, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 256, 272, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 4) as uint; + let offset = if offset < 46 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 15) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_3.rs b/src/encoding/index/iso_8859_3.rs index 09c53ef..46fe5ef 100644 --- a/src/encoding/index/iso_8859_3.rs +++ b/src/encoding/index/iso_8859_3.rs @@ -23,30 +23,34 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 294 => 161, 728 => 162, 163 => 163, - 164 => 164, 292 => 166, 167 => 167, 168 => 168, 304 => 169, 350 => 170, - 286 => 171, 308 => 172, 173 => 173, 379 => 175, 176 => 176, 295 => 177, - 178 => 178, 179 => 179, 180 => 180, 181 => 181, 293 => 182, 183 => 183, - 184 => 184, 305 => 185, 351 => 186, 287 => 187, 309 => 188, 189 => 189, - 380 => 191, 192 => 192, 193 => 193, 194 => 194, 196 => 196, 266 => 197, - 264 => 198, 199 => 199, 200 => 200, 201 => 201, 202 => 202, 203 => 203, - 204 => 204, 205 => 205, 206 => 206, 207 => 207, 209 => 209, 210 => 210, - 211 => 211, 212 => 212, 288 => 213, 214 => 214, 215 => 215, 284 => 216, - 217 => 217, 218 => 218, 219 => 219, 220 => 220, 364 => 221, 348 => 222, - 223 => 223, 224 => 224, 225 => 225, 226 => 226, 228 => 228, 267 => 229, - 265 => 230, 231 => 231, 232 => 232, 233 => 233, 234 => 234, 235 => 235, - 236 => 236, 237 => 237, 238 => 238, 239 => 239, 241 => 241, 242 => 242, - 243 => 243, 244 => 244, 289 => 245, 246 => 246, 247 => 247, 285 => 248, - 249 => 249, 250 => 250, 251 => 251, 252 => 252, 365 => 253, 349 => 254, - 729 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 0, 0, 0, 0, 0, 0, 0, 0, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, + 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 0, 0, 163, 164, 0, 0, 167, 168, 0, + 0, 0, 0, 173, 0, 0, 176, 0, 178, 179, 180, 181, 0, 183, 184, 0, 0, 0, 0, + 189, 0, 0, 192, 193, 194, 0, 196, 0, 0, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 0, 209, 210, 211, 212, 0, 214, 215, 0, 217, 218, 219, 220, 0, 0, + 223, 224, 225, 226, 0, 228, 0, 0, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 0, 241, 242, 243, 244, 0, 246, 247, 0, 249, 250, 251, 252, 0, 0, 0, + 198, 230, 197, 229, 0, 0, 0, 0, 0, 0, 0, 0, 216, 248, 171, 187, 213, 245, + 0, 0, 166, 182, 161, 177, 169, 185, 0, 0, 172, 188, 0, 0, 0, 0, 0, 0, 222, + 254, 170, 186, 0, 0, 0, 0, 221, 253, 0, 0, 0, 0, 0, 175, 191, 0, 0, 0, 162, + 255, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 8, 16, 24, 32, 40, 48, 56, + 64, 72, 80, 88, 96, 104, 112, 120, 128, 0, 136, 0, 144, 152, 0, 160, 0, 0, + 0, 0, 168, 0, 176, 0, 184, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 192, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 3) as uint; + let offset = if offset < 92 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 7) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_4.rs b/src/encoding/index/iso_8859_4.rs index 852f15a..f18f35e 100644 --- a/src/encoding/index/iso_8859_4.rs +++ b/src/encoding/index/iso_8859_4.rs @@ -23,31 +23,36 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 260 => 161, 312 => 162, 342 => 163, - 164 => 164, 296 => 165, 315 => 166, 167 => 167, 168 => 168, 352 => 169, - 274 => 170, 290 => 171, 358 => 172, 173 => 173, 381 => 174, 175 => 175, - 176 => 176, 261 => 177, 731 => 178, 343 => 179, 180 => 180, 297 => 181, - 316 => 182, 711 => 183, 184 => 184, 353 => 185, 275 => 186, 291 => 187, - 359 => 188, 330 => 189, 382 => 190, 331 => 191, 256 => 192, 193 => 193, - 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, 302 => 199, - 268 => 200, 201 => 201, 280 => 202, 203 => 203, 278 => 204, 205 => 205, - 206 => 206, 298 => 207, 272 => 208, 325 => 209, 332 => 210, 310 => 211, - 212 => 212, 213 => 213, 214 => 214, 215 => 215, 216 => 216, 370 => 217, - 218 => 218, 219 => 219, 220 => 220, 360 => 221, 362 => 222, 223 => 223, - 257 => 224, 225 => 225, 226 => 226, 227 => 227, 228 => 228, 229 => 229, - 230 => 230, 303 => 231, 269 => 232, 233 => 233, 281 => 234, 235 => 235, - 279 => 236, 237 => 237, 238 => 238, 299 => 239, 273 => 240, 326 => 241, - 333 => 242, 311 => 243, 244 => 244, 245 => 245, 246 => 246, 247 => 247, - 248 => 248, 371 => 249, 250 => 250, 251 => 251, 252 => 252, 361 => 253, - 363 => 254, 729 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 0, 0, 0, 164, 0, 0, 167, 168, 0, 0, 0, + 0, 173, 0, 175, 176, 0, 0, 0, 180, 0, 0, 0, 184, 0, 0, 0, 0, 0, 0, 0, 0, + 193, 194, 195, 196, 197, 198, 0, 0, 201, 0, 203, 0, 205, 206, 0, 0, 0, 0, + 0, 212, 213, 214, 215, 216, 0, 218, 219, 220, 0, 0, 223, 0, 225, 226, 227, + 228, 229, 230, 0, 0, 233, 0, 235, 0, 237, 238, 0, 0, 0, 0, 0, 244, 245, + 246, 247, 248, 0, 250, 251, 252, 0, 0, 0, 192, 224, 0, 0, 161, 177, 0, 0, + 0, 0, 0, 0, 200, 232, 0, 0, 208, 240, 170, 186, 0, 0, 204, 236, 202, 234, + 0, 0, 0, 0, 0, 0, 0, 0, 171, 187, 0, 0, 0, 0, 165, 181, 207, 239, 0, 0, + 199, 231, 0, 0, 0, 0, 0, 0, 211, 243, 162, 0, 0, 166, 182, 0, 0, 0, 0, 0, + 0, 0, 0, 209, 241, 0, 0, 0, 189, 191, 210, 242, 0, 0, 0, 0, 0, 0, 0, 0, + 163, 179, 0, 0, 0, 0, 0, 0, 0, 0, 169, 185, 0, 0, 0, 0, 172, 188, 221, 253, + 222, 254, 0, 0, 0, 0, 0, 0, 217, 249, 0, 0, 0, 0, 0, 0, 0, 0, 0, 174, 190, + 0, 0, 0, 0, 0, 0, 0, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 255, 0, 178, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 96, 128, 160, 192, 224, 256, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 288, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 23 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_5.rs b/src/encoding/index/iso_8859_5.rs index f711619..dce3c9a 100644 --- a/src/encoding/index/iso_8859_5.rs +++ b/src/encoding/index/iso_8859_5.rs @@ -25,34 +25,40 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 1025 => 161, 1026 => 162, - 1027 => 163, 1028 => 164, 1029 => 165, 1030 => 166, 1031 => 167, - 1032 => 168, 1033 => 169, 1034 => 170, 1035 => 171, 1036 => 172, - 173 => 173, 1038 => 174, 1039 => 175, 1040 => 176, 1041 => 177, - 1042 => 178, 1043 => 179, 1044 => 180, 1045 => 181, 1046 => 182, - 1047 => 183, 1048 => 184, 1049 => 185, 1050 => 186, 1051 => 187, - 1052 => 188, 1053 => 189, 1054 => 190, 1055 => 191, 1056 => 192, - 1057 => 193, 1058 => 194, 1059 => 195, 1060 => 196, 1061 => 197, - 1062 => 198, 1063 => 199, 1064 => 200, 1065 => 201, 1066 => 202, - 1067 => 203, 1068 => 204, 1069 => 205, 1070 => 206, 1071 => 207, - 1072 => 208, 1073 => 209, 1074 => 210, 1075 => 211, 1076 => 212, - 1077 => 213, 1078 => 214, 1079 => 215, 1080 => 216, 1081 => 217, - 1082 => 218, 1083 => 219, 1084 => 220, 1085 => 221, 1086 => 222, - 1087 => 223, 1088 => 224, 1089 => 225, 1090 => 226, 1091 => 227, - 1092 => 228, 1093 => 229, 1094 => 230, 1095 => 231, 1096 => 232, - 1097 => 233, 1098 => 234, 1099 => 235, 1100 => 236, 1101 => 237, - 1102 => 238, 1103 => 239, 8470 => 240, 1105 => 241, 1106 => 242, - 1107 => 243, 1108 => 244, 1109 => 245, 1110 => 246, 1111 => 247, - 1112 => 248, 1113 => 249, 1114 => 250, 1115 => 251, 1116 => 252, - 167 => 253, 1118 => 254, 1119 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 0, 0, 0, 0, 0, + 0, 253, 0, 0, 0, 0, 0, 173, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 161, 162, 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 0, + 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, + 189, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, + 204, 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, + 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, + 234, 235, 236, 237, 238, 239, 0, 241, 242, 243, 244, 245, 246, 247, 248, + 249, 250, 251, 252, 0, 254, 255, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 240, 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, 0, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 192, 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, 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, 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, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 133 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_6.rs b/src/encoding/index/iso_8859_6.rs index c2ab3f1..766a5b5 100644 --- a/src/encoding/index/iso_8859_6.rs +++ b/src/encoding/index/iso_8859_6.rs @@ -25,25 +25,30 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 164 => 164, 1548 => 172, - 173 => 173, 1563 => 187, 1567 => 191, 1569 => 193, 1570 => 194, - 1571 => 195, 1572 => 196, 1573 => 197, 1574 => 198, 1575 => 199, - 1576 => 200, 1577 => 201, 1578 => 202, 1579 => 203, 1580 => 204, - 1581 => 205, 1582 => 206, 1583 => 207, 1584 => 208, 1585 => 209, - 1586 => 210, 1587 => 211, 1588 => 212, 1589 => 213, 1590 => 214, - 1591 => 215, 1592 => 216, 1593 => 217, 1594 => 218, 1600 => 224, - 1601 => 225, 1602 => 226, 1603 => 227, 1604 => 228, 1605 => 229, - 1606 => 230, 1607 => 231, 1608 => 232, 1609 => 233, 1610 => 234, - 1611 => 235, 1612 => 236, 1613 => 237, 1614 => 238, 1615 => 239, - 1616 => 240, 1617 => 241, 1618 => 242, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 0, 0, 0, 164, 0, 0, 0, 0, 0, 0, 0, 0, + 173, 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, 172, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 187, 0, + 0, 0, 191, 0, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, + 205, 206, 207, 208, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 0, 0, + 0, 0, 0, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, + 237, 238, 239, 240, 241, 242, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 96, + 128, 160, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 51 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_7.rs b/src/encoding/index/iso_8859_7.rs index 8d05926..e7396d8 100644 --- a/src/encoding/index/iso_8859_7.rs +++ b/src/encoding/index/iso_8859_7.rs @@ -23,31 +23,43 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 8216 => 161, 8217 => 162, - 163 => 163, 8364 => 164, 8367 => 165, 166 => 166, 167 => 167, - 168 => 168, 169 => 169, 890 => 170, 171 => 171, 172 => 172, 173 => 173, - 8213 => 175, 176 => 176, 177 => 177, 178 => 178, 179 => 179, - 900 => 180, 901 => 181, 902 => 182, 183 => 183, 904 => 184, 905 => 185, - 906 => 186, 187 => 187, 908 => 188, 189 => 189, 910 => 190, 911 => 191, - 912 => 192, 913 => 193, 914 => 194, 915 => 195, 916 => 196, 917 => 197, - 918 => 198, 919 => 199, 920 => 200, 921 => 201, 922 => 202, 923 => 203, - 924 => 204, 925 => 205, 926 => 206, 927 => 207, 928 => 208, 929 => 209, - 931 => 211, 932 => 212, 933 => 213, 934 => 214, 935 => 215, 936 => 216, - 937 => 217, 938 => 218, 939 => 219, 940 => 220, 941 => 221, 942 => 222, - 943 => 223, 944 => 224, 945 => 225, 946 => 226, 947 => 227, 948 => 228, - 949 => 229, 950 => 230, 951 => 231, 952 => 232, 953 => 233, 954 => 234, - 955 => 235, 956 => 236, 957 => 237, 958 => 238, 959 => 239, 960 => 240, - 961 => 241, 962 => 242, 963 => 243, 964 => 244, 965 => 245, 966 => 246, - 967 => 247, 968 => 248, 969 => 249, 970 => 250, 971 => 251, 972 => 252, - 973 => 253, 974 => 254, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 128, 129, 130, 131, 132, 133, 134, 135, 136, 137, 138, + 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, 149, 150, 151, 152, 153, + 154, 155, 156, 157, 158, 159, 160, 0, 0, 163, 0, 0, 166, 167, 168, 169, 0, + 171, 172, 173, 0, 0, 176, 177, 178, 179, 0, 0, 0, 183, 0, 0, 0, 187, 0, + 189, 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, 170, 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 181, 182, 0, 184, 185, + 186, 0, 188, 0, 190, 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, + 202, 203, 204, 205, 206, 207, 208, 209, 0, 211, 212, 213, 214, 215, 216, + 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, + 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, + 247, 248, 249, 250, 251, 252, 253, 254, 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, 0, 0, 0, + 0, 175, 0, 0, 161, 162, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 164, 0, 0, 165, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 96, 128, 160, 192, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 0, 0, 0, 256, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 262 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/iso_8859_8.rs b/src/encoding/index/iso_8859_8.rs index bf8b977..227f685 100644 --- a/src/encoding/index/iso_8859_8.rs +++ b/src/encoding/index/iso_8859_8.rs @@ -25,26 +25,39 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 128 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, 133 => 133, - 134 => 134, 135 => 135, 136 => 136, 137 => 137, 138 => 138, 139 => 139, - 140 => 140, 141 => 141, 142 => 142, 143 => 143, 144 => 144, 145 => 145, - 146 => 146, 147 => 147, 148 => 148, 149 => 149, 150 => 150, 151 => 151, - 152 => 152, 153 => 153, 154 => 154, 155 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 162 => 162, 163 => 163, 164 => 164, - 165 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, 215 => 170, - 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175, 176 => 176, - 177 => 177, 178 => 178, 179 => 179, 180 => 180, 181 => 181, 182 => 182, - 183 => 183, 184 => 184, 185 => 185, 247 => 186, 187 => 187, 188 => 188, - 189 => 189, 190 => 190, 8215 => 223, 1488 => 224, 1489 => 225, - 1490 => 226, 1491 => 227, 1492 => 228, 1493 => 229, 1494 => 230, - 1495 => 231, 1496 => 232, 1497 => 233, 1498 => 234, 1499 => 235, - 1500 => 236, 1501 => 237, 1502 => 238, 1503 => 239, 1504 => 240, - 1505 => 241, 1506 => 242, 1507 => 243, 1508 => 244, 1509 => 245, - 1510 => 246, 1511 => 247, 1512 => 248, 1513 => 249, 1514 => 250, - 8206 => 253, 8207 => 254, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 160, 0, 162, 163, + 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 0, 187, 188, 189, 190, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 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, 186, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, + 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 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, 0, 253, 254, 0, 0, 0, 0, 0, 0, 0, 223, 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, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 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, 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, 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, 0, 0, 256, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 129 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/koi8_r.rs b/src/encoding/index/koi8_r.rs index 03f4fea..c11a611 100644 --- a/src/encoding/index/koi8_r.rs +++ b/src/encoding/index/koi8_r.rs @@ -25,35 +25,55 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 9472 => 128, 9474 => 129, 9484 => 130, 9488 => 131, 9492 => 132, - 9496 => 133, 9500 => 134, 9508 => 135, 9516 => 136, 9524 => 137, - 9532 => 138, 9600 => 139, 9604 => 140, 9608 => 141, 9612 => 142, - 9616 => 143, 9617 => 144, 9618 => 145, 9619 => 146, 8992 => 147, - 9632 => 148, 8729 => 149, 8730 => 150, 8776 => 151, 8804 => 152, - 8805 => 153, 160 => 154, 8993 => 155, 176 => 156, 178 => 157, - 183 => 158, 247 => 159, 9552 => 160, 9553 => 161, 9554 => 162, - 1105 => 163, 9555 => 164, 9556 => 165, 9557 => 166, 9558 => 167, - 9559 => 168, 9560 => 169, 9561 => 170, 9562 => 171, 9563 => 172, - 9564 => 173, 9565 => 174, 9566 => 175, 9567 => 176, 9568 => 177, - 9569 => 178, 1025 => 179, 9570 => 180, 9571 => 181, 9572 => 182, - 9573 => 183, 9574 => 184, 9575 => 185, 9576 => 186, 9577 => 187, - 9578 => 188, 9579 => 189, 9580 => 190, 169 => 191, 1102 => 192, - 1072 => 193, 1073 => 194, 1094 => 195, 1076 => 196, 1077 => 197, - 1092 => 198, 1075 => 199, 1093 => 200, 1080 => 201, 1081 => 202, - 1082 => 203, 1083 => 204, 1084 => 205, 1085 => 206, 1086 => 207, - 1087 => 208, 1103 => 209, 1088 => 210, 1089 => 211, 1090 => 212, - 1091 => 213, 1078 => 214, 1074 => 215, 1100 => 216, 1099 => 217, - 1079 => 218, 1096 => 219, 1101 => 220, 1097 => 221, 1095 => 222, - 1098 => 223, 1070 => 224, 1040 => 225, 1041 => 226, 1062 => 227, - 1044 => 228, 1045 => 229, 1060 => 230, 1043 => 231, 1061 => 232, - 1048 => 233, 1049 => 234, 1050 => 235, 1051 => 236, 1052 => 237, - 1053 => 238, 1054 => 239, 1055 => 240, 1071 => 241, 1056 => 242, - 1057 => 243, 1058 => 244, 1059 => 245, 1046 => 246, 1042 => 247, - 1068 => 248, 1067 => 249, 1047 => 250, 1064 => 251, 1069 => 252, - 1065 => 253, 1063 => 254, 1066 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 154, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, + 156, 0, 157, 0, 0, 0, 0, 158, 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, 159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 225, 226, 247, 231, + 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, 244, + 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241, 193, 194, + 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208, 210, + 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, 209, + 0, 163, 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, 0, 0, 0, 0, 0, 149, 150, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 151, 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, 152, 153, 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, 147, 155, 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, + 128, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 130, 0, 0, 0, 131, 0, 0, 0, 132, 0, + 0, 0, 133, 0, 0, 0, 134, 0, 0, 0, 0, 0, 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, + 136, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, 161, 162, 164, 165, 166, 167, + 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, 180, 181, 182, 183, + 184, 185, 186, 187, 188, 189, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, 140, 0, 0, 0, 141, 0, 0, 0, 142, 0, 0, 0, + 143, 144, 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 32, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 128, 160, 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, 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, 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, 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, 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, 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, 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, + 192, 0, 224, 256, 0, 0, 0, 0, 0, 288, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 320, 352, 384, 416, 448, 480, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 302 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/koi8_u.rs b/src/encoding/index/koi8_u.rs index dbb5f79..1fdfab8 100644 --- a/src/encoding/index/koi8_u.rs +++ b/src/encoding/index/koi8_u.rs @@ -25,35 +25,56 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 9472 => 128, 9474 => 129, 9484 => 130, 9488 => 131, 9492 => 132, - 9496 => 133, 9500 => 134, 9508 => 135, 9516 => 136, 9524 => 137, - 9532 => 138, 9600 => 139, 9604 => 140, 9608 => 141, 9612 => 142, - 9616 => 143, 9617 => 144, 9618 => 145, 9619 => 146, 8992 => 147, - 9632 => 148, 8729 => 149, 8730 => 150, 8776 => 151, 8804 => 152, - 8805 => 153, 160 => 154, 8993 => 155, 176 => 156, 178 => 157, - 183 => 158, 247 => 159, 9552 => 160, 9553 => 161, 9554 => 162, - 1105 => 163, 1108 => 164, 9556 => 165, 1110 => 166, 1111 => 167, - 9559 => 168, 9560 => 169, 9561 => 170, 9562 => 171, 9563 => 172, - 1169 => 173, 9565 => 174, 9566 => 175, 9567 => 176, 9568 => 177, - 9569 => 178, 1025 => 179, 1028 => 180, 9571 => 181, 1030 => 182, - 1031 => 183, 9574 => 184, 9575 => 185, 9576 => 186, 9577 => 187, - 9578 => 188, 1168 => 189, 9580 => 190, 169 => 191, 1102 => 192, - 1072 => 193, 1073 => 194, 1094 => 195, 1076 => 196, 1077 => 197, - 1092 => 198, 1075 => 199, 1093 => 200, 1080 => 201, 1081 => 202, - 1082 => 203, 1083 => 204, 1084 => 205, 1085 => 206, 1086 => 207, - 1087 => 208, 1103 => 209, 1088 => 210, 1089 => 211, 1090 => 212, - 1091 => 213, 1078 => 214, 1074 => 215, 1100 => 216, 1099 => 217, - 1079 => 218, 1096 => 219, 1101 => 220, 1097 => 221, 1095 => 222, - 1098 => 223, 1070 => 224, 1040 => 225, 1041 => 226, 1062 => 227, - 1044 => 228, 1045 => 229, 1060 => 230, 1043 => 231, 1061 => 232, - 1048 => 233, 1049 => 234, 1050 => 235, 1051 => 236, 1052 => 237, - 1053 => 238, 1054 => 239, 1055 => 240, 1071 => 241, 1056 => 242, - 1057 => 243, 1058 => 244, 1059 => 245, 1046 => 246, 1042 => 247, - 1068 => 248, 1067 => 249, 1047 => 250, 1064 => 251, 1069 => 252, - 1065 => 253, 1063 => 254, 1066 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 154, 0, 0, 0, 0, 0, 0, 0, 0, 191, 0, 0, 0, 0, 0, 0, + 156, 0, 157, 0, 0, 0, 0, 158, 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, 159, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 179, 0, 0, 180, 0, 182, 183, 0, 0, 0, 0, 0, 0, 0, 0, 225, 226, 247, + 231, 228, 229, 246, 250, 233, 234, 235, 236, 237, 238, 239, 240, 242, 243, + 244, 245, 230, 232, 227, 254, 251, 253, 255, 249, 248, 252, 224, 241, 193, + 194, 215, 199, 196, 197, 214, 218, 201, 202, 203, 204, 205, 206, 207, 208, + 210, 211, 212, 213, 198, 200, 195, 222, 219, 221, 223, 217, 216, 220, 192, + 209, 0, 163, 0, 0, 164, 0, 166, 167, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 189, 173, 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, 0, 0, + 0, 0, 0, 149, 150, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 151, 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, 152, + 153, 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, 147, 155, 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, 128, 0, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 130, 0, 0, 0, 131, 0, 0, 0, 132, 0, 0, 0, 133, 0, 0, 0, 134, 0, 0, 0, 0, 0, + 0, 0, 135, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, + 0, 0, 0, 138, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 160, + 161, 162, 0, 165, 0, 0, 168, 169, 170, 171, 172, 0, 174, 175, 176, 177, + 178, 0, 181, 0, 0, 184, 185, 186, 187, 188, 0, 190, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 139, 0, 0, 0, 140, 0, 0, 0, 141, 0, 0, 0, + 142, 0, 0, 0, 143, 144, 145, 146, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 148, + 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 32, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 96, 128, 160, 0, 192, 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, 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, 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, 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, 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, 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, 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, + 224, 0, 256, 288, 0, 0, 0, 0, 0, 320, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 352, 384, 416, 448, 480, 512, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 302 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/macintosh.rs b/src/encoding/index/macintosh.rs index 31bc9bd..9fc975c 100644 --- a/src/encoding/index/macintosh.rs +++ b/src/encoding/index/macintosh.rs @@ -24,33 +24,108 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 196 => 128, 197 => 129, 199 => 130, 201 => 131, 209 => 132, 214 => 133, - 220 => 134, 225 => 135, 224 => 136, 226 => 137, 228 => 138, 227 => 139, - 229 => 140, 231 => 141, 233 => 142, 232 => 143, 234 => 144, 235 => 145, - 237 => 146, 236 => 147, 238 => 148, 239 => 149, 241 => 150, 243 => 151, - 242 => 152, 244 => 153, 246 => 154, 245 => 155, 250 => 156, 249 => 157, - 251 => 158, 252 => 159, 8224 => 160, 176 => 161, 162 => 162, - 163 => 163, 167 => 164, 8226 => 165, 182 => 166, 223 => 167, - 174 => 168, 169 => 169, 8482 => 170, 180 => 171, 168 => 172, - 8800 => 173, 198 => 174, 216 => 175, 8734 => 176, 177 => 177, - 8804 => 178, 8805 => 179, 165 => 180, 181 => 181, 8706 => 182, - 8721 => 183, 8719 => 184, 960 => 185, 8747 => 186, 170 => 187, - 186 => 188, 937 => 189, 230 => 190, 248 => 191, 191 => 192, 161 => 193, - 172 => 194, 8730 => 195, 402 => 196, 8776 => 197, 8710 => 198, - 171 => 199, 187 => 200, 8230 => 201, 160 => 202, 192 => 203, - 195 => 204, 213 => 205, 338 => 206, 339 => 207, 8211 => 208, - 8212 => 209, 8220 => 210, 8221 => 211, 8216 => 212, 8217 => 213, - 247 => 214, 9674 => 215, 255 => 216, 376 => 217, 8260 => 218, - 8364 => 219, 8249 => 220, 8250 => 221, 64257 => 222, 64258 => 223, - 8225 => 224, 183 => 225, 8218 => 226, 8222 => 227, 8240 => 228, - 194 => 229, 202 => 230, 193 => 231, 203 => 232, 200 => 233, 205 => 234, - 206 => 235, 207 => 236, 204 => 237, 211 => 238, 212 => 239, - 63743 => 240, 210 => 241, 218 => 242, 219 => 243, 217 => 244, - 305 => 245, 710 => 246, 732 => 247, 175 => 248, 728 => 249, 729 => 250, - 730 => 251, 184 => 252, 733 => 253, 731 => 254, 711 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 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, 202, 193, + 162, 163, 0, 180, 0, 164, 172, 169, 187, 199, 194, 0, 168, 248, 161, 177, + 0, 0, 171, 181, 166, 225, 252, 0, 188, 200, 0, 0, 0, 192, 203, 231, 229, + 204, 128, 129, 174, 130, 233, 131, 230, 232, 237, 234, 235, 236, 0, 132, + 241, 238, 239, 205, 133, 0, 175, 244, 242, 243, 134, 0, 0, 167, 136, 135, + 137, 139, 138, 140, 190, 141, 143, 142, 144, 145, 147, 146, 148, 149, 0, + 150, 152, 151, 153, 155, 154, 214, 191, 157, 156, 158, 159, 0, 0, 216, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 245, + 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, 206, 207, 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, 0, 0, 217, 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, 196, + 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 246, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 249, 250, 251, + 254, 247, 253, 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, 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, 0, 0, + 0, 0, 0, 0, 0, 189, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 185, 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, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 209, 0, 0, 0, 212, 213, 226, 0, + 210, 211, 227, 0, 160, 224, 165, 0, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 228, 0, 0, 0, 0, 0, 0, 0, 0, 220, 221, 0, 0, 0, 0, 0, 0, 0, 0, 0, 218, 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, 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, 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, 0, 219, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 170, 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, 182, 0, 0, 0, 198, 0, 0, 0, 0, + 0, 0, 0, 0, 184, 0, 183, 0, 0, 0, 0, 0, 0, 0, 0, 195, 0, 0, 0, 176, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 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, 197, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 178, 179, 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, 0, 0, 215, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 240, 0, 222, 223, 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, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 128, 192, 256, 320, 0, 0, 0, 0, 384, 0, 0, 448, 512, 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, 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, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 576, 640, 704, 0, 768, 0, 0, 0, 832, 896, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 960, 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, 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, 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, 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, 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, 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, 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, + 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 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, 1024, 0, 0, 0, 0, 0, 0, 0, 0, 1088, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 1005 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1250.rs b/src/encoding/index/windows_1250.rs index bd87093..6b8760e 100644 --- a/src/encoding/index/windows_1250.rs +++ b/src/encoding/index/windows_1250.rs @@ -23,32 +23,50 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 8218 => 130, 131 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 136 => 136, 8240 => 137, - 352 => 138, 8249 => 139, 346 => 140, 356 => 141, 381 => 142, - 377 => 143, 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 152 => 152, - 8482 => 153, 353 => 154, 8250 => 155, 347 => 156, 357 => 157, - 382 => 158, 378 => 159, 160 => 160, 711 => 161, 728 => 162, 321 => 163, - 164 => 164, 260 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, - 350 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 379 => 175, - 176 => 176, 177 => 177, 731 => 178, 322 => 179, 180 => 180, 181 => 181, - 182 => 182, 183 => 183, 184 => 184, 261 => 185, 351 => 186, 187 => 187, - 317 => 188, 733 => 189, 318 => 190, 380 => 191, 340 => 192, 193 => 193, - 194 => 194, 258 => 195, 196 => 196, 313 => 197, 262 => 198, 199 => 199, - 268 => 200, 201 => 201, 280 => 202, 203 => 203, 282 => 204, 205 => 205, - 206 => 206, 270 => 207, 272 => 208, 323 => 209, 327 => 210, 211 => 211, - 212 => 212, 336 => 213, 214 => 214, 215 => 215, 344 => 216, 366 => 217, - 218 => 218, 368 => 219, 220 => 220, 221 => 221, 354 => 222, 223 => 223, - 341 => 224, 225 => 225, 226 => 226, 259 => 227, 228 => 228, 314 => 229, - 263 => 230, 231 => 231, 269 => 232, 233 => 233, 281 => 234, 235 => 235, - 283 => 236, 237 => 237, 238 => 238, 271 => 239, 273 => 240, 324 => 241, - 328 => 242, 243 => 243, 244 => 244, 337 => 245, 246 => 246, 247 => 247, - 345 => 248, 367 => 249, 250 => 250, 369 => 251, 252 => 252, 253 => 253, - 355 => 254, 729 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 129, 0, 131, 0, 0, 0, 0, 136, + 0, 0, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, + 160, 0, 0, 0, 164, 0, 166, 167, 168, 169, 0, 171, 172, 173, 174, 0, 176, + 177, 0, 0, 180, 181, 182, 183, 184, 0, 0, 187, 0, 0, 0, 0, 0, 193, 194, 0, + 196, 0, 0, 199, 0, 201, 0, 203, 0, 205, 206, 0, 0, 0, 0, 211, 212, 0, 214, + 215, 0, 0, 218, 0, 220, 221, 0, 223, 0, 225, 226, 0, 228, 0, 0, 231, 0, + 233, 0, 235, 0, 237, 238, 0, 0, 0, 0, 243, 244, 0, 246, 247, 0, 0, 250, 0, + 252, 253, 0, 0, 0, 0, 195, 227, 165, 185, 198, 230, 0, 0, 0, 0, 200, 232, + 207, 239, 208, 240, 0, 0, 0, 0, 0, 0, 202, 234, 204, 236, 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, 197, + 229, 0, 0, 188, 190, 0, 0, 163, 179, 209, 241, 0, 0, 210, 242, 0, 0, 0, 0, + 0, 0, 0, 213, 245, 0, 0, 192, 224, 0, 0, 216, 248, 140, 156, 0, 0, 170, + 186, 138, 154, 222, 254, 141, 157, 0, 0, 0, 0, 0, 0, 0, 0, 217, 249, 219, + 251, 0, 0, 0, 0, 0, 0, 0, 143, 159, 175, 191, 142, 158, 0, 0, 0, 0, 0, 0, + 0, 0, 161, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 255, 0, + 178, 0, 189, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 150, 151, 0, 0, 0, 145, 146, 130, 0, 147, 148, 132, 0, + 134, 135, 149, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, + 0, 0, 0, 139, 155, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 128, 192, 256, 0, 0, 0, 0, 0, 320, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 384, 0, 448, 0, 512, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 133 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1251.rs b/src/encoding/index/windows_1251.rs index d665b4f..5bde628 100644 --- a/src/encoding/index/windows_1251.rs +++ b/src/encoding/index/windows_1251.rs @@ -25,35 +25,47 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 1026 => 128, 1027 => 129, 8218 => 130, 1107 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 8364 => 136, 8240 => 137, - 1033 => 138, 8249 => 139, 1034 => 140, 1036 => 141, 1035 => 142, - 1039 => 143, 1106 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 152 => 152, - 8482 => 153, 1113 => 154, 8250 => 155, 1114 => 156, 1116 => 157, - 1115 => 158, 1119 => 159, 160 => 160, 1038 => 161, 1118 => 162, - 1032 => 163, 164 => 164, 1168 => 165, 166 => 166, 167 => 167, - 1025 => 168, 169 => 169, 1028 => 170, 171 => 171, 172 => 172, - 173 => 173, 174 => 174, 1031 => 175, 176 => 176, 177 => 177, - 1030 => 178, 1110 => 179, 1169 => 180, 181 => 181, 182 => 182, - 183 => 183, 1105 => 184, 8470 => 185, 1108 => 186, 187 => 187, - 1112 => 188, 1029 => 189, 1109 => 190, 1111 => 191, 1040 => 192, - 1041 => 193, 1042 => 194, 1043 => 195, 1044 => 196, 1045 => 197, - 1046 => 198, 1047 => 199, 1048 => 200, 1049 => 201, 1050 => 202, - 1051 => 203, 1052 => 204, 1053 => 205, 1054 => 206, 1055 => 207, - 1056 => 208, 1057 => 209, 1058 => 210, 1059 => 211, 1060 => 212, - 1061 => 213, 1062 => 214, 1063 => 215, 1064 => 216, 1065 => 217, - 1066 => 218, 1067 => 219, 1068 => 220, 1069 => 221, 1070 => 222, - 1071 => 223, 1072 => 224, 1073 => 225, 1074 => 226, 1075 => 227, - 1076 => 228, 1077 => 229, 1078 => 230, 1079 => 231, 1080 => 232, - 1081 => 233, 1082 => 234, 1083 => 235, 1084 => 236, 1085 => 237, - 1086 => 238, 1087 => 239, 1088 => 240, 1089 => 241, 1090 => 242, - 1091 => 243, 1092 => 244, 1093 => 245, 1094 => 246, 1095 => 247, - 1096 => 248, 1097 => 249, 1098 => 250, 1099 => 251, 1100 => 252, - 1101 => 253, 1102 => 254, 1103 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 160, 0, 0, + 0, 164, 0, 166, 167, 0, 169, 0, 171, 172, 173, 174, 0, 176, 177, 0, 0, 0, + 181, 182, 183, 0, 0, 0, 187, 0, 0, 0, 0, 0, 168, 128, 129, 170, 189, 178, + 175, 163, 138, 140, 142, 141, 0, 161, 143, 192, 193, 194, 195, 196, 197, + 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, 212, + 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 255, 0, 184, + 144, 131, 186, 190, 179, 191, 188, 154, 156, 158, 157, 0, 162, 159, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 165, 180, 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, 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, 150, 151, 0, 0, 0, 145, 146, 130, + 0, 147, 148, 132, 0, 134, 135, 149, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 139, 155, 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, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 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, 0, + 0, 0, 0, 0, 0, 0, 185, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 192, 256, 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, 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, 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, 0, 0, + 0, 0, 0, 0, 0, 320, 0, 384, 0, 448, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 133 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1252.rs b/src/encoding/index/windows_1252.rs index 897e03c..0edb788 100644 --- a/src/encoding/index/windows_1252.rs +++ b/src/encoding/index/windows_1252.rs @@ -23,32 +23,49 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 8218 => 130, 402 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 710 => 136, 8240 => 137, - 352 => 138, 8249 => 139, 338 => 140, 141 => 141, 381 => 142, - 143 => 143, 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 732 => 152, - 8482 => 153, 353 => 154, 8250 => 155, 339 => 156, 157 => 157, - 382 => 158, 376 => 159, 160 => 160, 161 => 161, 162 => 162, 163 => 163, - 164 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, - 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175, - 176 => 176, 177 => 177, 178 => 178, 179 => 179, 180 => 180, 181 => 181, - 182 => 182, 183 => 183, 184 => 184, 185 => 185, 186 => 186, 187 => 187, - 188 => 188, 189 => 189, 190 => 190, 191 => 191, 192 => 192, 193 => 193, - 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, 199 => 199, - 200 => 200, 201 => 201, 202 => 202, 203 => 203, 204 => 204, 205 => 205, - 206 => 206, 207 => 207, 208 => 208, 209 => 209, 210 => 210, 211 => 211, - 212 => 212, 213 => 213, 214 => 214, 215 => 215, 216 => 216, 217 => 217, - 218 => 218, 219 => 219, 220 => 220, 221 => 221, 222 => 222, 223 => 223, - 224 => 224, 225 => 225, 226 => 226, 227 => 227, 228 => 228, 229 => 229, - 230 => 230, 231 => 231, 232 => 232, 233 => 233, 234 => 234, 235 => 235, - 236 => 236, 237 => 237, 238 => 238, 239 => 239, 240 => 240, 241 => 241, - 242 => 242, 243 => 243, 244 => 244, 245 => 245, 246 => 246, 247 => 247, - 248 => 248, 249 => 249, 250 => 250, 251 => 251, 252 => 252, 253 => 253, - 254 => 254, 255 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 0, 143, + 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, 0, 0, 160, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 221, 222, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, + 254, 255, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 140, 156, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 138, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, 0, 142, 158, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 150, 151, 0, 0, 0, 145, 146, 130, 0, 147, 148, 132, + 0, 134, 135, 149, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, + 0, 0, 0, 0, 139, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 96, 128, 0, 0, 160, 192, 224, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 256, 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, 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, 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, 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, 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, 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, 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, 288, 320, 0, 0, 0, 352, 0, 0, 0, 384, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 266 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1253.rs b/src/encoding/index/windows_1253.rs index 801444a..a0df372 100644 --- a/src/encoding/index/windows_1253.rs +++ b/src/encoding/index/windows_1253.rs @@ -23,32 +23,46 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 8218 => 130, 402 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 136 => 136, 8240 => 137, - 138 => 138, 8249 => 139, 140 => 140, 141 => 141, 142 => 142, - 143 => 143, 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 152 => 152, - 8482 => 153, 154 => 154, 8250 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 901 => 161, 902 => 162, 163 => 163, - 164 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, - 171 => 171, 172 => 172, 173 => 173, 174 => 174, 8213 => 175, - 176 => 176, 177 => 177, 178 => 178, 179 => 179, 900 => 180, 181 => 181, - 182 => 182, 183 => 183, 904 => 184, 905 => 185, 906 => 186, 187 => 187, - 908 => 188, 189 => 189, 910 => 190, 911 => 191, 912 => 192, 913 => 193, - 914 => 194, 915 => 195, 916 => 196, 917 => 197, 918 => 198, 919 => 199, - 920 => 200, 921 => 201, 922 => 202, 923 => 203, 924 => 204, 925 => 205, - 926 => 206, 927 => 207, 928 => 208, 929 => 209, 931 => 211, 932 => 212, - 933 => 213, 934 => 214, 935 => 215, 936 => 216, 937 => 217, 938 => 218, - 939 => 219, 940 => 220, 941 => 221, 942 => 222, 943 => 223, 944 => 224, - 945 => 225, 946 => 226, 947 => 227, 948 => 228, 949 => 229, 950 => 230, - 951 => 231, 952 => 232, 953 => 233, 954 => 234, 955 => 235, 956 => 236, - 957 => 237, 958 => 238, 959 => 239, 960 => 240, 961 => 241, 962 => 242, - 963 => 243, 964 => 244, 965 => 245, 966 => 246, 967 => 247, 968 => 248, - 969 => 249, 970 => 250, 971 => 251, 972 => 252, 973 => 253, 974 => 254, - _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 129, 0, 0, 0, 0, 0, 0, 136, 0, 138, 0, 140, 141, + 142, 143, 144, 0, 0, 0, 0, 0, 0, 0, 152, 0, 154, 0, 156, 157, 158, 159, + 160, 0, 0, 163, 164, 165, 166, 167, 168, 169, 0, 171, 172, 173, 174, 0, + 176, 177, 178, 179, 0, 181, 182, 183, 0, 0, 0, 187, 0, 189, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 131, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 180, 161, 162, 0, 184, 185, 186, 0, 188, 0, 190, + 191, 192, 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, + 206, 207, 208, 209, 0, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, + 221, 222, 223, 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, + 236, 237, 238, 239, 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, + 251, 252, 253, 254, 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, 0, 0, 150, 151, 175, 0, 0, + 145, 146, 130, 0, 147, 148, 132, 0, 134, 135, 149, 0, 0, 0, 133, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 139, 155, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 0, 0, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 128, 160, 192, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 256, 0, 0, 0, 288, 0, 0, 0, 320, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 266 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1254.rs b/src/encoding/index/windows_1254.rs index 4e7a045..5960892 100644 --- a/src/encoding/index/windows_1254.rs +++ b/src/encoding/index/windows_1254.rs @@ -23,32 +23,51 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 8218 => 130, 402 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 710 => 136, 8240 => 137, - 352 => 138, 8249 => 139, 338 => 140, 141 => 141, 142 => 142, - 143 => 143, 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 732 => 152, - 8482 => 153, 353 => 154, 8250 => 155, 339 => 156, 157 => 157, - 158 => 158, 376 => 159, 160 => 160, 161 => 161, 162 => 162, 163 => 163, - 164 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, - 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175, - 176 => 176, 177 => 177, 178 => 178, 179 => 179, 180 => 180, 181 => 181, - 182 => 182, 183 => 183, 184 => 184, 185 => 185, 186 => 186, 187 => 187, - 188 => 188, 189 => 189, 190 => 190, 191 => 191, 192 => 192, 193 => 193, - 194 => 194, 195 => 195, 196 => 196, 197 => 197, 198 => 198, 199 => 199, - 200 => 200, 201 => 201, 202 => 202, 203 => 203, 204 => 204, 205 => 205, - 206 => 206, 207 => 207, 286 => 208, 209 => 209, 210 => 210, 211 => 211, - 212 => 212, 213 => 213, 214 => 214, 215 => 215, 216 => 216, 217 => 217, - 218 => 218, 219 => 219, 220 => 220, 304 => 221, 350 => 222, 223 => 223, - 224 => 224, 225 => 225, 226 => 226, 227 => 227, 228 => 228, 229 => 229, - 230 => 230, 231 => 231, 232 => 232, 233 => 233, 234 => 234, 235 => 235, - 236 => 236, 237 => 237, 238 => 238, 239 => 239, 287 => 240, 241 => 241, - 242 => 242, 243 => 243, 244 => 244, 245 => 245, 246 => 246, 247 => 247, - 248 => 248, 249 => 249, 250 => 250, 251 => 251, 252 => 252, 305 => 253, - 351 => 254, 255 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 129, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 141, 142, + 143, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 157, 158, 0, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, + 0, 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 219, 220, 0, 0, 223, + 224, 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, + 239, 0, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 0, 0, + 255, 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, 208, 240, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 221, 253, 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, 140, 156, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 222, 254, 138, 154, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 159, 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, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, + 151, 0, 0, 0, 145, 146, 130, 0, 147, 148, 132, 0, 134, 135, 149, 0, 0, 0, + 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 139, 155, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 96, 128, 160, 192, 224, 256, 288, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 320, 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, 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, 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, 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, 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, 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, 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, 352, 384, 0, 0, 0, 416, 0, 0, 0, 448, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 266 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1255.rs b/src/encoding/index/windows_1255.rs index eca74dd..6f1c4dc 100644 --- a/src/encoding/index/windows_1255.rs +++ b/src/encoding/index/windows_1255.rs @@ -24,32 +24,50 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 8218 => 130, 402 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 710 => 136, 8240 => 137, - 138 => 138, 8249 => 139, 140 => 140, 141 => 141, 142 => 142, - 143 => 143, 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 732 => 152, - 8482 => 153, 154 => 154, 8250 => 155, 156 => 156, 157 => 157, - 158 => 158, 159 => 159, 160 => 160, 161 => 161, 162 => 162, 163 => 163, - 8362 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, - 169 => 169, 215 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, - 175 => 175, 176 => 176, 177 => 177, 178 => 178, 179 => 179, 180 => 180, - 181 => 181, 182 => 182, 183 => 183, 184 => 184, 185 => 185, 247 => 186, - 187 => 187, 188 => 188, 189 => 189, 190 => 190, 191 => 191, - 1456 => 192, 1457 => 193, 1458 => 194, 1459 => 195, 1460 => 196, - 1461 => 197, 1462 => 198, 1463 => 199, 1464 => 200, 1465 => 201, - 1467 => 203, 1468 => 204, 1469 => 205, 1470 => 206, 1471 => 207, - 1472 => 208, 1473 => 209, 1474 => 210, 1475 => 211, 1520 => 212, - 1521 => 213, 1522 => 214, 1523 => 215, 1524 => 216, 1488 => 224, - 1489 => 225, 1490 => 226, 1491 => 227, 1492 => 228, 1493 => 229, - 1494 => 230, 1495 => 231, 1496 => 232, 1497 => 233, 1498 => 234, - 1499 => 235, 1500 => 236, 1501 => 237, 1502 => 238, 1503 => 239, - 1504 => 240, 1505 => 241, 1506 => 242, 1507 => 243, 1508 => 244, - 1509 => 245, 1510 => 246, 1511 => 247, 1512 => 248, 1513 => 249, - 1514 => 250, 8206 => 253, 8207 => 254, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 129, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 140, 141, 142, + 143, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 156, 157, 158, 159, 160, 161, + 162, 163, 0, 165, 166, 167, 168, 169, 0, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 0, 187, 188, 189, 190, 191, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 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, 186, 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, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 136, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 152, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 0, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, 225, 226, 227, 228, + 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, 243, + 244, 245, 246, 247, 248, 249, 250, 0, 0, 0, 0, 0, 212, 213, 214, 215, 216, + 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, + 253, 254, 0, 0, 0, 150, 151, 0, 0, 0, 145, 146, 130, 0, 147, 148, 132, 0, + 134, 135, 149, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, + 0, 0, 0, 139, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 164, 0, + 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 96, 128, 0, 0, 0, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 224, + 256, 288, 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, 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, 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, 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, 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, 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, 0, 0, 0, 0, 320, 352, 0, 0, 0, 384, 0, 0, 0, 416, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 266 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1256.rs b/src/encoding/index/windows_1256.rs index 95d312c..8fda016 100644 --- a/src/encoding/index/windows_1256.rs +++ b/src/encoding/index/windows_1256.rs @@ -24,34 +24,56 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 1662 => 129, 8218 => 130, 402 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 710 => 136, 8240 => 137, - 1657 => 138, 8249 => 139, 338 => 140, 1670 => 141, 1688 => 142, - 1672 => 143, 1711 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 1705 => 152, - 8482 => 153, 1681 => 154, 8250 => 155, 339 => 156, 8204 => 157, - 8205 => 158, 1722 => 159, 160 => 160, 1548 => 161, 162 => 162, - 163 => 163, 164 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, - 169 => 169, 1726 => 170, 171 => 171, 172 => 172, 173 => 173, - 174 => 174, 175 => 175, 176 => 176, 177 => 177, 178 => 178, 179 => 179, - 180 => 180, 181 => 181, 182 => 182, 183 => 183, 184 => 184, 185 => 185, - 1563 => 186, 187 => 187, 188 => 188, 189 => 189, 190 => 190, - 1567 => 191, 1729 => 192, 1569 => 193, 1570 => 194, 1571 => 195, - 1572 => 196, 1573 => 197, 1574 => 198, 1575 => 199, 1576 => 200, - 1577 => 201, 1578 => 202, 1579 => 203, 1580 => 204, 1581 => 205, - 1582 => 206, 1583 => 207, 1584 => 208, 1585 => 209, 1586 => 210, - 1587 => 211, 1588 => 212, 1589 => 213, 1590 => 214, 215 => 215, - 1591 => 216, 1592 => 217, 1593 => 218, 1594 => 219, 1600 => 220, - 1601 => 221, 1602 => 222, 1603 => 223, 224 => 224, 1604 => 225, - 226 => 226, 1605 => 227, 1606 => 228, 1607 => 229, 1608 => 230, - 231 => 231, 232 => 232, 233 => 233, 234 => 234, 235 => 235, - 1609 => 236, 1610 => 237, 238 => 238, 239 => 239, 1611 => 240, - 1612 => 241, 1613 => 242, 1614 => 243, 244 => 244, 1615 => 245, - 1616 => 246, 247 => 247, 1617 => 248, 249 => 249, 1618 => 250, - 251 => 251, 252 => 252, 8206 => 253, 8207 => 254, 1746 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 160, 0, 162, 163, 164, 165, 166, 167, 168, 169, 0, + 171, 172, 173, 174, 175, 176, 177, 178, 179, 180, 181, 182, 183, 184, 185, + 0, 187, 188, 189, 190, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 215, 0, 0, 0, 0, 0, 0, 0, 0, 224, 0, 226, 0, 0, 0, 0, + 231, 232, 233, 234, 235, 0, 0, 238, 239, 0, 0, 0, 0, 244, 0, 0, 247, 0, + 249, 0, 251, 252, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 140, 156, 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, 131, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 136, 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, 0, 0, 0, 161, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 186, 0, 0, 0, 191, 0, 193, 194, 195, 196, + 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, 209, 210, 211, + 212, 213, 214, 216, 217, 218, 219, 0, 0, 0, 0, 0, 220, 221, 222, 223, 225, + 227, 228, 229, 230, 236, 237, 240, 241, 242, 243, 245, 246, 248, 250, 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, 0, 0, 0, 0, 138, 0, 0, 0, 0, 129, 0, 0, 0, 0, 0, 0, 0, + 141, 0, 143, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, 0, 0, 0, 0, 142, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, 0, 0, 144, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 159, 0, 0, 0, 170, 0, 0, 192, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 255, 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, 157, 158, 253, 254, 0, 0, 0, 150, 151, 0, 0, 0, + 145, 146, 130, 0, 147, 148, 132, 0, 134, 135, 149, 0, 0, 0, 133, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, 139, 155, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 32, 64, 96, 0, 0, 128, 0, 160, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 192, 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, 224, 256, 288, 320, 352, 384, 416, 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, 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, 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, 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, + 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, 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, 448, 480, 0, 0, 0, 512, 0, 0, + 0, 544, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 266 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1257.rs b/src/encoding/index/windows_1257.rs index c060d96..8a4edcc 100644 --- a/src/encoding/index/windows_1257.rs +++ b/src/encoding/index/windows_1257.rs @@ -23,32 +23,50 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 8218 => 130, 131 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 136 => 136, 8240 => 137, - 138 => 138, 8249 => 139, 140 => 140, 168 => 141, 711 => 142, - 184 => 143, 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 152 => 152, - 8482 => 153, 154 => 154, 8250 => 155, 156 => 156, 175 => 157, - 731 => 158, 159 => 159, 160 => 160, 162 => 162, 163 => 163, 164 => 164, - 166 => 166, 167 => 167, 216 => 168, 169 => 169, 342 => 170, 171 => 171, - 172 => 172, 173 => 173, 174 => 174, 198 => 175, 176 => 176, 177 => 177, - 178 => 178, 179 => 179, 180 => 180, 181 => 181, 182 => 182, 183 => 183, - 248 => 184, 185 => 185, 343 => 186, 187 => 187, 188 => 188, 189 => 189, - 190 => 190, 230 => 191, 260 => 192, 302 => 193, 256 => 194, 262 => 195, - 196 => 196, 197 => 197, 280 => 198, 274 => 199, 268 => 200, 201 => 201, - 377 => 202, 278 => 203, 290 => 204, 310 => 205, 298 => 206, 315 => 207, - 352 => 208, 323 => 209, 325 => 210, 211 => 211, 332 => 212, 213 => 213, - 214 => 214, 215 => 215, 370 => 216, 321 => 217, 346 => 218, 362 => 219, - 220 => 220, 379 => 221, 381 => 222, 223 => 223, 261 => 224, 303 => 225, - 257 => 226, 263 => 227, 228 => 228, 229 => 229, 281 => 230, 275 => 231, - 269 => 232, 233 => 233, 378 => 234, 279 => 235, 291 => 236, 311 => 237, - 299 => 238, 316 => 239, 353 => 240, 324 => 241, 326 => 242, 243 => 243, - 333 => 244, 245 => 245, 246 => 246, 247 => 247, 371 => 248, 322 => 249, - 347 => 250, 363 => 251, 252 => 252, 380 => 253, 382 => 254, 729 => 255, - _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 129, 0, 131, 0, 0, 0, 0, 136, + 0, 138, 0, 140, 0, 0, 0, 144, 0, 0, 0, 0, 0, 0, 0, 152, 0, 154, 0, 156, 0, + 0, 159, 160, 0, 162, 163, 164, 0, 166, 167, 141, 169, 0, 171, 172, 173, + 174, 157, 176, 177, 178, 179, 180, 181, 182, 183, 143, 185, 0, 187, 188, + 189, 190, 0, 0, 0, 0, 0, 196, 197, 175, 0, 0, 201, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 211, 0, 213, 214, 215, 168, 0, 0, 0, 220, 0, 0, 223, 0, 0, 0, 0, 228, + 229, 191, 0, 0, 233, 0, 0, 0, 0, 0, 0, 0, 0, 0, 243, 0, 245, 246, 247, 184, + 0, 0, 0, 252, 0, 0, 0, 194, 226, 0, 0, 192, 224, 195, 227, 0, 0, 0, 0, 200, + 232, 0, 0, 0, 0, 199, 231, 0, 0, 203, 235, 198, 230, 0, 0, 0, 0, 0, 0, 0, + 0, 204, 236, 0, 0, 0, 0, 0, 0, 206, 238, 0, 0, 193, 225, 0, 0, 0, 0, 0, 0, + 205, 237, 0, 0, 0, 207, 239, 0, 0, 0, 0, 217, 249, 209, 241, 210, 242, 0, + 0, 0, 0, 0, 212, 244, 0, 0, 0, 0, 0, 0, 0, 0, 170, 186, 0, 0, 218, 250, 0, + 0, 0, 0, 208, 240, 0, 0, 0, 0, 0, 0, 0, 0, 219, 251, 0, 0, 0, 0, 0, 0, 216, + 248, 0, 0, 0, 0, 0, 202, 234, 221, 253, 222, 254, 0, 0, 0, 0, 0, 0, 0, 0, + 142, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 255, 0, 158, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 150, 151, 0, 0, 0, 145, 146, 130, 0, 147, 148, 132, 0, 134, 135, + 149, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, 137, 0, 0, 0, 0, 0, 0, 0, 0, + 139, 155, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 128, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 128, 192, 256, 0, 0, 0, 0, 0, 320, 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, 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, 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, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 384, 0, 448, 0, 512, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 133 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_1258.rs b/src/encoding/index/windows_1258.rs index 53a2413..b03e6df 100644 --- a/src/encoding/index/windows_1258.rs +++ b/src/encoding/index/windows_1258.rs @@ -23,32 +23,55 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 8218 => 130, 402 => 131, 8222 => 132, - 8230 => 133, 8224 => 134, 8225 => 135, 710 => 136, 8240 => 137, - 138 => 138, 8249 => 139, 338 => 140, 141 => 141, 142 => 142, - 143 => 143, 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, - 8221 => 148, 8226 => 149, 8211 => 150, 8212 => 151, 732 => 152, - 8482 => 153, 154 => 154, 8250 => 155, 339 => 156, 157 => 157, - 158 => 158, 376 => 159, 160 => 160, 161 => 161, 162 => 162, 163 => 163, - 164 => 164, 165 => 165, 166 => 166, 167 => 167, 168 => 168, 169 => 169, - 170 => 170, 171 => 171, 172 => 172, 173 => 173, 174 => 174, 175 => 175, - 176 => 176, 177 => 177, 178 => 178, 179 => 179, 180 => 180, 181 => 181, - 182 => 182, 183 => 183, 184 => 184, 185 => 185, 186 => 186, 187 => 187, - 188 => 188, 189 => 189, 190 => 190, 191 => 191, 192 => 192, 193 => 193, - 194 => 194, 258 => 195, 196 => 196, 197 => 197, 198 => 198, 199 => 199, - 200 => 200, 201 => 201, 202 => 202, 203 => 203, 768 => 204, 205 => 205, - 206 => 206, 207 => 207, 272 => 208, 209 => 209, 777 => 210, 211 => 211, - 212 => 212, 416 => 213, 214 => 214, 215 => 215, 216 => 216, 217 => 217, - 218 => 218, 219 => 219, 220 => 220, 431 => 221, 771 => 222, 223 => 223, - 224 => 224, 225 => 225, 226 => 226, 259 => 227, 228 => 228, 229 => 229, - 230 => 230, 231 => 231, 232 => 232, 233 => 233, 234 => 234, 235 => 235, - 769 => 236, 237 => 237, 238 => 238, 239 => 239, 273 => 240, 241 => 241, - 803 => 242, 243 => 243, 244 => 244, 417 => 245, 246 => 246, 247 => 247, - 248 => 248, 249 => 249, 250 => 250, 251 => 251, 252 => 252, 432 => 253, - 8363 => 254, 255 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 129, 0, 0, 0, 0, 0, 0, 0, 0, 138, 0, 0, 141, 142, + 143, 144, 0, 0, 0, 0, 0, 0, 0, 0, 0, 154, 0, 0, 157, 158, 0, 160, 161, 162, + 163, 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, + 178, 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, + 193, 194, 0, 196, 197, 198, 199, 200, 201, 202, 203, 0, 205, 206, 207, 0, + 209, 0, 211, 212, 0, 214, 215, 216, 217, 218, 219, 220, 0, 0, 223, 224, + 225, 226, 0, 228, 229, 230, 231, 232, 233, 234, 235, 0, 237, 238, 239, 0, + 241, 0, 243, 244, 0, 246, 247, 248, 249, 250, 251, 252, 0, 0, 255, 0, 0, + 195, 227, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 208, 240, 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, 140, 156, 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, 0, 0, 159, 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, 131, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 213, 245, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, + 253, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 136, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 152, 0, 0, 0, + 204, 236, 0, 222, 0, 0, 0, 0, 0, 210, 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, 242, 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, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 150, 151, 0, 0, 0, 145, 146, 130, 0, + 147, 148, 132, 0, 134, 135, 149, 0, 0, 0, 133, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 137, 0, 0, 0, 0, 0, 0, 0, 0, 139, 155, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 254, 128, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 153, 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 32, 64, 96, 128, 160, 0, 192, 224, 256, 288, 0, 0, 0, 0, 0, 0, + 0, 0, 320, 0, 352, 384, 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, 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, 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, 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, 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, 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, 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, 416, 448, 0, 0, 0, 480, 0, 0, 0, + 512, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 266 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/windows_874.rs b/src/encoding/index/windows_874.rs index f2e28fb..d8dc1d7 100644 --- a/src/encoding/index/windows_874.rs +++ b/src/encoding/index/windows_874.rs @@ -25,33 +25,42 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 8364 => 128, 129 => 129, 130 => 130, 131 => 131, 132 => 132, - 8230 => 133, 134 => 134, 135 => 135, 136 => 136, 137 => 137, - 138 => 138, 139 => 139, 140 => 140, 141 => 141, 142 => 142, 143 => 143, - 144 => 144, 8216 => 145, 8217 => 146, 8220 => 147, 8221 => 148, - 8226 => 149, 8211 => 150, 8212 => 151, 152 => 152, 153 => 153, - 154 => 154, 155 => 155, 156 => 156, 157 => 157, 158 => 158, 159 => 159, - 160 => 160, 3585 => 161, 3586 => 162, 3587 => 163, 3588 => 164, - 3589 => 165, 3590 => 166, 3591 => 167, 3592 => 168, 3593 => 169, - 3594 => 170, 3595 => 171, 3596 => 172, 3597 => 173, 3598 => 174, - 3599 => 175, 3600 => 176, 3601 => 177, 3602 => 178, 3603 => 179, - 3604 => 180, 3605 => 181, 3606 => 182, 3607 => 183, 3608 => 184, - 3609 => 185, 3610 => 186, 3611 => 187, 3612 => 188, 3613 => 189, - 3614 => 190, 3615 => 191, 3616 => 192, 3617 => 193, 3618 => 194, - 3619 => 195, 3620 => 196, 3621 => 197, 3622 => 198, 3623 => 199, - 3624 => 200, 3625 => 201, 3626 => 202, 3627 => 203, 3628 => 204, - 3629 => 205, 3630 => 206, 3631 => 207, 3632 => 208, 3633 => 209, - 3634 => 210, 3635 => 211, 3636 => 212, 3637 => 213, 3638 => 214, - 3639 => 215, 3640 => 216, 3641 => 217, 3642 => 218, 3647 => 223, - 3648 => 224, 3649 => 225, 3650 => 226, 3651 => 227, 3652 => 228, - 3653 => 229, 3654 => 230, 3655 => 231, 3656 => 232, 3657 => 233, - 3658 => 234, 3659 => 235, 3660 => 236, 3661 => 237, 3662 => 238, - 3663 => 239, 3664 => 240, 3665 => 241, 3666 => 242, 3667 => 243, - 3668 => 244, 3669 => 245, 3670 => 246, 3671 => 247, 3672 => 248, - 3673 => 249, 3674 => 250, 3675 => 251, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 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, 129, 130, 131, 132, 0, 134, + 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 0, 0, 0, 0, 0, 0, 0, 152, + 153, 154, 155, 156, 157, 158, 159, 160, 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, 161, 162, 163, + 164, 165, 166, 167, 168, 169, 170, 171, 172, 173, 174, 175, 176, 177, 178, + 179, 180, 181, 182, 183, 184, 185, 186, 187, 188, 189, 190, 191, 192, 193, + 194, 195, 196, 197, 198, 199, 200, 201, 202, 203, 204, 205, 206, 207, 208, + 209, 210, 211, 212, 213, 214, 215, 216, 217, 218, 0, 0, 0, 0, 223, 224, + 225, 226, 227, 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, + 240, 241, 242, 243, 244, 245, 246, 247, 248, 249, 250, 251, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 150, 151, 0, 0, 0, 145, 146, 0, 0, 147, 148, 0, 0, 0, 0, 149, 0, 0, 0, 133, + 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, 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, 0, 128, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, +]; + +static BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 64, 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, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 128, 192, 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, 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, 0, 0, 256, 0, 320, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 6) as uint; + let offset = if offset < 131 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 63) as uint)] } #[cfg(test)] diff --git a/src/encoding/index/x_mac_cyrillic.rs b/src/encoding/index/x_mac_cyrillic.rs index 45959a3..8e58740 100644 --- a/src/encoding/index/x_mac_cyrillic.rs +++ b/src/encoding/index/x_mac_cyrillic.rs @@ -25,35 +25,54 @@ pub fn forward(code: u8) -> u16 { FORWARD_TABLE[(code - 0x80) as uint] } -pub fn backward(code: u16) -> u8 { - match code { - 1040 => 128, 1041 => 129, 1042 => 130, 1043 => 131, 1044 => 132, - 1045 => 133, 1046 => 134, 1047 => 135, 1048 => 136, 1049 => 137, - 1050 => 138, 1051 => 139, 1052 => 140, 1053 => 141, 1054 => 142, - 1055 => 143, 1056 => 144, 1057 => 145, 1058 => 146, 1059 => 147, - 1060 => 148, 1061 => 149, 1062 => 150, 1063 => 151, 1064 => 152, - 1065 => 153, 1066 => 154, 1067 => 155, 1068 => 156, 1069 => 157, - 1070 => 158, 1071 => 159, 8224 => 160, 176 => 161, 1168 => 162, - 163 => 163, 167 => 164, 8226 => 165, 182 => 166, 1030 => 167, - 174 => 168, 169 => 169, 8482 => 170, 1026 => 171, 1106 => 172, - 8800 => 173, 1027 => 174, 1107 => 175, 8734 => 176, 177 => 177, - 8804 => 178, 8805 => 179, 1110 => 180, 181 => 181, 1169 => 182, - 1032 => 183, 1028 => 184, 1108 => 185, 1031 => 186, 1111 => 187, - 1033 => 188, 1113 => 189, 1034 => 190, 1114 => 191, 1112 => 192, - 1029 => 193, 172 => 194, 8730 => 195, 402 => 196, 8776 => 197, - 8710 => 198, 171 => 199, 187 => 200, 8230 => 201, 160 => 202, - 1035 => 203, 1115 => 204, 1036 => 205, 1116 => 206, 1109 => 207, - 8211 => 208, 8212 => 209, 8220 => 210, 8221 => 211, 8216 => 212, - 8217 => 213, 247 => 214, 8222 => 215, 1038 => 216, 1118 => 217, - 1039 => 218, 1119 => 219, 8470 => 220, 1025 => 221, 1105 => 222, - 1103 => 223, 1072 => 224, 1073 => 225, 1074 => 226, 1075 => 227, - 1076 => 228, 1077 => 229, 1078 => 230, 1079 => 231, 1080 => 232, - 1081 => 233, 1082 => 234, 1083 => 235, 1084 => 236, 1085 => 237, - 1086 => 238, 1087 => 239, 1088 => 240, 1089 => 241, 1090 => 242, - 1091 => 243, 1092 => 244, 1093 => 245, 1094 => 246, 1095 => 247, - 1096 => 248, 1097 => 249, 1098 => 250, 1099 => 251, 1100 => 252, - 1101 => 253, 1102 => 254, 8364 => 255, _ => 0 - } +static BACKWARD_TABLE_LOWER: &'static [u8] = &[ + 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, 202, 0, 0, 163, 0, 0, 0, 164, 0, 169, 0, 199, 194, 0, + 168, 0, 161, 177, 0, 0, 0, 181, 166, 0, 0, 0, 0, 200, 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, 214, 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, 196, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 221, 171, 174, 184, 193, 167, + 186, 183, 188, 190, 203, 205, 0, 216, 218, 128, 129, 130, 131, 132, 133, + 134, 135, 136, 137, 138, 139, 140, 141, 142, 143, 144, 145, 146, 147, 148, + 149, 150, 151, 152, 153, 154, 155, 156, 157, 158, 159, 224, 225, 226, 227, + 228, 229, 230, 231, 232, 233, 234, 235, 236, 237, 238, 239, 240, 241, 242, + 243, 244, 245, 246, 247, 248, 249, 250, 251, 252, 253, 254, 223, 0, 222, + 172, 175, 185, 207, 180, 187, 192, 189, 191, 204, 206, 0, 217, 219, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 162, 182, 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, + 208, 209, 0, 0, 0, 212, 213, 0, 0, 210, 211, 215, 0, 160, 0, 165, 0, 0, 0, + 201, 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, 0, 0, 0, 255, 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, + 0, 0, 0, 0, 0, 0, 0, 220, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 170, 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, 0, 198, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 195, 0, 0, 0, 176, 0, 0, 0, 0, 0, 0, 0, 0, 0, 197, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 173, 0, 0, 0, 178, 179, + 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 BACKWARD_TABLE_UPPER: &'static [u16] = &[ + 0, 0, 0, 0, 0, 32, 0, 64, 0, 0, 0, 0, 96, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 128, 160, 192, 0, 224, 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, + 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, 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, 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, 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, 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, 0, 0, 0, 0, 0, + 0, 0, 0, 0, 0, 0, 0, 0, 0, 0, 256, 288, 0, 0, 0, 320, 0, 0, 352, 384, 0, 0, + 0, 0, 0, 0, 416, 0, 448, 480, +]; + +#[inline] +pub fn backward(code: u32) -> u8 { + let offset = (code >> 5) as uint; + let offset = if offset < 276 {BACKWARD_TABLE_UPPER[offset] as uint} else {0}; + BACKWARD_TABLE_LOWER[offset + ((code & 31) as uint)] } #[cfg(test)] diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 05ed569..406e466 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -185,7 +185,7 @@ macro_rules! single_byte_tests( for i in range(128, 256) { let i = i as u8; let j = forward(i); - if j != 0xffff { assert_eq!(backward(j), i); } + if j != 0xffff { assert_eq!(backward(j as u32), i); } } } @@ -203,7 +203,7 @@ macro_rules! single_byte_tests( let mut start: u32 = 0; bencher.iter(|| { for i in range(start, start + 0x80) { - test::black_box(backward(i as u16)); + test::black_box(backward(i)); } start += 0x80; }) From 27a7ff5594fe1d4e98e1befefddc006ed59e499e Mon Sep 17 00:00:00 2001 From: Matt Brubeck Date: Thu, 22 May 2014 09:06:29 -0700 Subject: [PATCH 21/29] Rebuild when external dependencies change Depends on mozilla/servo#2472. --- Makefile.in | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Makefile.in b/Makefile.in index 53fd1a6..409c497 100644 --- a/Makefile.in +++ b/Makefile.in @@ -7,6 +7,7 @@ AR ?= ar RUSTC ?= rustc RUSTDOC ?= rustdoc RUSTFLAGS ?= -O +EXT_DEPS ?= LIB_RS = src/encoding/lib.rs RUST_SRC = $(shell find $(VPATH)/src/encoding/. -type f -name '*.rs') @@ -14,7 +15,7 @@ RUST_SRC = $(shell find $(VPATH)/src/encoding/. -type f -name '*.rs') .PHONY: all all: libencoding.dummy -libencoding.dummy: $(LIB_RS) $(RUST_SRC) +libencoding.dummy: $(LIB_RS) $(RUST_SRC) $(EXT_DEPS) $(RUSTC) $(RUSTFLAGS) $< --out-dir . touch $@ From c39e5b6c88438ca846cc0af2e1f19a48153688ce Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Fri, 23 May 2014 23:18:31 +0900 Subject: [PATCH 22/29] temporarily switch to the official nightly. --- .travis.yml | 11 +++++++---- 1 file changed, 7 insertions(+), 4 deletions(-) diff --git a/.travis.yml b/.travis.yml index 5c2223a..6883c15 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,11 +1,14 @@ env: global: - secure: WVwPS+infwl0FS4/zbCOzp8TZ2WOz6CgZPHgEw6+5IN4sqgabWSRH4rnxYQPDg5G1xxNlUslOmxJ9TvlFwXxaWutIg0FFfrev1qTvRVYuXsmN6pXwIQwmRP6tUKCPx/5oAefa/oQAIjzjILQ4qPVADxuxlIAycX5PCN29Jl1xIk= -before_install: - - yes | sudo add-apt-repository ppa:hansjorg/rust - - sudo apt-get update +#before_install: +# - yes | sudo add-apt-repository ppa:hansjorg/rust +# - sudo apt-get update install: - - sudo apt-get install rust-nightly + - curl -O http://static.rust-lang.org/dist/rust-nightly-x86_64-unknown-linux-gnu.tar.gz + - tar xfz rust-nightly-x86_64-unknown-linux-gnu.tar.gz + - (cd rust-nightly-x86_64-unknown-linux-gnu/ && sudo ./install.sh) +# - sudo apt-get install rust-nightly script: - ./configure - make check RUSTFLAGS= From ce76a8ff1d46ee3757c175a8ac33e48b3c87297a Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Fri, 23 May 2014 23:26:59 +0900 Subject: [PATCH 23/29] language changes: special treatments on &str and ~str are finally gone. --- README.md | 4 ++-- src/encoding/lib.rs | 4 ++-- src/encoding/types.rs | 6 ++++-- 3 files changed, 8 insertions(+), 6 deletions(-) diff --git a/README.md b/README.md index 4ad6992..eeae0d8 100644 --- a/README.md +++ b/README.md @@ -48,7 +48,7 @@ A practical example of custom encoder traps: ~~~~ {.rust} // hexadecimal numeric character reference replacement fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { - let escapes: Vec<~str> = + let escapes: Vec = input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); let escapes = escapes.concat(); output.write_bytes(escapes.as_bytes()); @@ -57,7 +57,7 @@ fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); let orig = "Hello, 世界!".to_owned(); -let encoded = all::ASCII.encode(orig, HexNcrEscape).unwrap(); +let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); all::ASCII.decode(encoded.as_slice(), DecodeStrict); // => Ok(StrBuf::from_str("Hello, 世界!")) ~~~~ diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index 4a212c7..35b7061 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -111,7 +111,7 @@ mod tests { fn test_readme_hex_ncr_escape() { // hexadecimal numeric character reference replacement fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { - let escapes: Vec<~str> = + let escapes: Vec = input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); let escapes = escapes.concat(); output.write_bytes(escapes.as_bytes()); @@ -119,7 +119,7 @@ mod tests { } static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); let orig = "Hello, 世界!".to_owned(); - let encoded = all::ASCII.encode(orig, HexNcrEscape).unwrap(); + let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); let decoded = all::ASCII.decode(encoded.as_slice(), DecodeStrict).unwrap(); assert_eq!(decoded, StrBuf::from_str("Hello, 世界!")); } diff --git a/src/encoding/types.rs b/src/encoding/types.rs index 9d7d700..ac0e44c 100644 --- a/src/encoding/types.rs +++ b/src/encoding/types.rs @@ -177,7 +177,7 @@ pub trait Encoder { /// Concatenates two input sequences into one. Internal use only. #[cfg(test)] - fn test_concat(&self, a: &str, b: &str) -> ~str { a + b } + fn test_concat(&self, a: &str, b: &str) -> StrBuf { a.to_owned().append(b) } } /// Encoder converting a byte sequence into a Unicode string. @@ -419,7 +419,9 @@ impl EncoderTrap { EncodeIgnore => true, EncodeNcrEscape => { let mut escapes = StrBuf::new(); - for ch in input.chars() { escapes.push_str(format!("&\\#{:d};", ch as int)); } + for ch in input.chars() { + escapes.push_str(format!("&\\#{:d};", ch as int).as_slice()); + } reencode(encoder, escapes.as_slice(), output, "NcrEscape") }, EncoderTrap(func) => func(encoder, input, output), From fde6c183897ff59f1be40b0824c874f9248a1a1b Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Tue, 27 May 2014 03:15:58 +0900 Subject: [PATCH 24/29] language changes: StrBuf -> String. --- README.md | 10 +++++----- src/encoding/lib.rs | 14 +++++++------- src/encoding/types.rs | 22 +++++++++++----------- 3 files changed, 23 insertions(+), 23 deletions(-) diff --git a/README.md b/README.md index eeae0d8..31772da 100644 --- a/README.md +++ b/README.md @@ -39,8 +39,8 @@ To decode a byte sequence with invalid sequences: ~~~~ {.rust} all::ISO_8859_6.decode([65,99,109,101,169], DecodeStrict); // => Err(...) -all::ISO_8859_6.decode([65,99,109,101,169], DecodeReplace); // => Ok(StrBuf::from_str("Acme\ufffd")) -all::ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore); // => Ok(StrBuf::from_str("Acme")) +all::ISO_8859_6.decode([65,99,109,101,169], DecodeReplace); // => Ok(String::from_str("Acme\ufffd")) +all::ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore); // => Ok(String::from_str("Acme")) ~~~~ A practical example of custom encoder traps: @@ -48,7 +48,7 @@ A practical example of custom encoder traps: ~~~~ {.rust} // hexadecimal numeric character reference replacement fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { - let escapes: Vec = + let escapes: Vec = input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); let escapes = escapes.concat(); output.write_bytes(escapes.as_bytes()); @@ -58,7 +58,7 @@ static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); let orig = "Hello, 世界!".to_owned(); let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); -all::ASCII.decode(encoded.as_slice(), DecodeStrict); // => Ok(StrBuf::from_str("Hello, 世界!")) +all::ASCII.decode(encoded.as_slice(), DecodeStrict); // => Ok(String::from_str("Hello, 世界!")) ~~~~ Getting the encoding from the string label, @@ -72,7 +72,7 @@ let broken = &[0xbf, 0xec, 0xbf, 0xcd, 0xff, 0xbe, 0xd3]; euckr.decode(broken, DecodeReplace); // => Ok(Strbuf::from_str("\uc6b0\uc640\ufffd\uc559")) // corresponding rust-encoding native API: -all::WINDOWS_949.decode(broken, DecodeReplace); // => Ok(StrBuf::from_str("\uc6b0\uc640\ufffd\uc559")) +all::WINDOWS_949.decode(broken, DecodeReplace); // => Ok(String::from_str("\uc6b0\uc640\ufffd\uc559")) ~~~~ Supported Encodings diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index 35b7061..8af944a 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -98,20 +98,20 @@ mod tests { Ok(vec!(65,99,109,101,38,35,49,54,57,59))); // Acme© assert_eq!(all::ISO_8859_1.decode([99,97,102,233], DecodeStrict), - Ok(StrBuf::from_str("caf\xe9"))); + Ok(String::from_str("caf\xe9"))); assert!(all::ISO_8859_6.decode([65,99,109,101,169], DecodeStrict).is_err()); assert_eq!(all::ISO_8859_6.decode([65,99,109,101,169], DecodeReplace), - Ok(StrBuf::from_str("Acme\ufffd"))); + Ok(String::from_str("Acme\ufffd"))); assert_eq!(all::ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), - Ok(StrBuf::from_str("Acme"))); + Ok(String::from_str("Acme"))); } #[test] fn test_readme_hex_ncr_escape() { // hexadecimal numeric character reference replacement fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { - let escapes: Vec = + let escapes: Vec = input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); let escapes = escapes.concat(); output.write_bytes(escapes.as_bytes()); @@ -121,7 +121,7 @@ mod tests { let orig = "Hello, 世界!".to_owned(); let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); let decoded = all::ASCII.decode(encoded.as_slice(), DecodeStrict).unwrap(); - assert_eq!(decoded, StrBuf::from_str("Hello, 世界!")); + assert_eq!(decoded, String::from_str("Hello, 世界!")); } #[test] @@ -131,11 +131,11 @@ mod tests { assert_eq!(euckr.whatwg_name(), Some("euc-kr")); // for the sake of compatibility let broken = &[0xbf, 0xec, 0xbf, 0xcd, 0xff, 0xbe, 0xd3]; assert_eq!(euckr.decode(broken, DecodeReplace), - Ok(StrBuf::from_str("\uc6b0\uc640\ufffd\uc559"))); + Ok(String::from_str("\uc6b0\uc640\ufffd\uc559"))); // corresponding rust-encoding native API: assert_eq!(all::WINDOWS_949.decode(broken, DecodeReplace), - Ok(StrBuf::from_str("\uc6b0\uc640\ufffd\uc559"))); + Ok(String::from_str("\uc6b0\uc640\ufffd\uc559"))); } diff --git a/src/encoding/types.rs b/src/encoding/types.rs index ac0e44c..15dd7a8 100644 --- a/src/encoding/types.rs +++ b/src/encoding/types.rs @@ -113,7 +113,7 @@ pub trait StringWriter { fn write_str(&mut self, s: &str); } -impl StringWriter for StrBuf { +impl StringWriter for String { fn writer_hint(&mut self, expectedlen: uint) { let newlen = self.len() + expectedlen; self.reserve(newlen); @@ -177,7 +177,7 @@ pub trait Encoder { /// Concatenates two input sequences into one. Internal use only. #[cfg(test)] - fn test_concat(&self, a: &str, b: &str) -> StrBuf { a.to_owned().append(b) } + fn test_concat(&self, a: &str, b: &str) -> String { a.to_owned().append(b) } } /// Encoder converting a byte sequence into a Unicode string. @@ -213,16 +213,16 @@ pub trait Decoder { /// A test-friendly interface to `raw_feed`. Internal use only. #[cfg(test)] - fn test_feed(&mut self, input: &[u8]) -> (uint, Option, StrBuf) { - let mut buf = StrBuf::new(); + fn test_feed(&mut self, input: &[u8]) -> (uint, Option, String) { + let mut buf = String::new(); let (nprocessed, err) = self.raw_feed(input, &mut buf); (nprocessed, err, buf) } /// A test-friendly interface to `raw_finish`. Internal use only. #[cfg(test)] - fn test_finish(&mut self) -> (Option, StrBuf) { - let mut buf = StrBuf::new(); + fn test_finish(&mut self) -> (Option, String) { + let mut buf = String::new(); let err = self.raw_finish(&mut buf); (err, buf) } @@ -265,7 +265,7 @@ pub trait Encoding { fn encode(&'static self, input: &str, trap: EncoderTrap) -> Result,SendStr> { let mut encoder = self.encoder(); let mut remaining = input; - let mut unprocessed = StrBuf::new(); + let mut unprocessed = String::new(); let mut ret = Vec::new(); loop { @@ -302,11 +302,11 @@ pub trait Encoding { /// On the decoder error `trap` is called, /// which may return a replacement string to continue processing, /// or a failure to return the error. - fn decode(&'static self, input: &[u8], trap: DecoderTrap) -> Result { + fn decode(&'static self, input: &[u8], trap: DecoderTrap) -> Result { let mut decoder = self.decoder(); let mut remaining = input; let mut unprocessed = Vec::new(); - let mut ret = StrBuf::new(); + let mut ret = String::new(); loop { let (offset, err) = decoder.raw_feed(remaining, &mut ret); @@ -418,7 +418,7 @@ impl EncoderTrap { EncodeReplace => reencode(encoder, "?", output, "Replace"), EncodeIgnore => true, EncodeNcrEscape => { - let mut escapes = StrBuf::new(); + let mut escapes = String::new(); for ch in input.chars() { escapes.push_str(format!("&\\#{:d};", ch as int).as_slice()); } @@ -434,7 +434,7 @@ impl EncoderTrap { /// and decoded a single string in memory. /// Return the result and the used encoding. pub fn decode(input: &[u8], trap: DecoderTrap, fallback_encoding: EncodingRef) - -> (Result, EncodingRef) { + -> (Result, EncodingRef) { use all::{UTF_8, UTF_16LE, UTF_16BE}; if input.starts_with([0xEF, 0xBB, 0xBF]) { (UTF_8.decode(input.slice_from(3), trap), UTF_8 as EncodingRef) From d0b348e00a77b8fbc8c3aafa873715e9b85cc819 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Fri, 30 May 2014 02:28:51 +0900 Subject: [PATCH 25/29] language changes: to_owned() on &str is being deprecated. --- README.md | 2 +- src/encoding/lib.rs | 2 +- src/encoding/testutils.rs | 16 ++++++++-------- src/encoding/types.rs | 2 +- 4 files changed, 11 insertions(+), 11 deletions(-) diff --git a/README.md b/README.md index 31772da..6d54e88 100644 --- a/README.md +++ b/README.md @@ -56,7 +56,7 @@ fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) } static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); -let orig = "Hello, 世界!".to_owned(); +let orig = "Hello, 世界!".to_string(); let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); all::ASCII.decode(encoded.as_slice(), DecodeStrict); // => Ok(String::from_str("Hello, 世界!")) ~~~~ diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index 8af944a..fd7dfaf 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -118,7 +118,7 @@ mod tests { true } static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); - let orig = "Hello, 世界!".to_owned(); + let orig = "Hello, 世界!".to_string(); let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); let decoded = all::ASCII.decode(encoded.as_slice(), DecodeStrict).unwrap(); assert_eq!(decoded, String::from_str("Hello, 世界!")); diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 406e466..017143c 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -18,10 +18,10 @@ macro_rules! assert_feed_ok( let (nprocessed, err, buf) = $this.test_feed(input.as_slice()); let upto = err.map(|e| e.upto); assert!(processed.len() == nprocessed && None == upto, - "raw_feed should return {:?}, but instead returned {:?}", + "raw_feed should return {}, but instead returned {}", (processed.len(), None::), (nprocessed, upto)); assert!(output == buf.as_slice(), - "raw_feed should push {:?}, but instead pushed {:?}", output, buf.as_slice()); + "raw_feed should push {}, but instead pushed {}", output, buf.as_slice()); }) ) @@ -39,10 +39,10 @@ macro_rules! assert_feed_err( let (nprocessed, err, buf) = $this.test_feed(input.as_slice()); let upto = err.map(|e| e.upto); assert!(processed.len() == nprocessed && Some(processed.len() + problem.len()) == upto, - "raw_feed should return {:?}, but instead returned {:?}", + "raw_feed should return {}, but instead returned {}", (processed.len(), Some(processed.len() + problem.len())), (nprocessed, upto)); assert!(output == buf.as_slice(), - "raw_feed should push {:?}, but instead pushed {:?}", output, buf.as_slice()); + "raw_feed should push {}, but instead pushed {}", output, buf.as_slice()); }) ) @@ -53,9 +53,9 @@ macro_rules! assert_finish_ok( let (err, buf) = $this.test_finish(); let upto = err.map(|e| e.upto); assert!(None == upto, - "raw_finish should return {:?}, but instead returned {:?}", None::, upto); + "raw_finish should return {}, but instead returned {}", None::, upto); assert!(output == buf.as_slice(), - "raw_finish should push {:?}, but instead pushed {:?}", output, buf.as_slice()); + "raw_finish should push {}, but instead pushed {}", output, buf.as_slice()); }) ) @@ -66,9 +66,9 @@ macro_rules! assert_finish_err( let (err, buf) = $this.test_finish(); let upto = err.map(|e| e.upto); assert!(Some(0) == upto, - "raw_finish should return {:?}, but instead returned {:?}", Some(0), upto); + "raw_finish should return {}, but instead returned {}", Some(0), upto); assert!(output == buf.as_slice(), - "raw_finish should push {:?}, but instead pushed {:?}", output, buf.as_slice()); + "raw_finish should push {}, but instead pushed {}", output, buf.as_slice()); }) ) diff --git a/src/encoding/types.rs b/src/encoding/types.rs index 15dd7a8..7c7cbb3 100644 --- a/src/encoding/types.rs +++ b/src/encoding/types.rs @@ -177,7 +177,7 @@ pub trait Encoder { /// Concatenates two input sequences into one. Internal use only. #[cfg(test)] - fn test_concat(&self, a: &str, b: &str) -> String { a.to_owned().append(b) } + fn test_concat(&self, a: &str, b: &str) -> String { a.to_string().append(b) } } /// Encoder converting a byte sequence into a Unicode string. From 8c6a8b1f92fbd5a06b5e5da903497ec259dcce11 Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sat, 31 May 2014 21:19:21 +0900 Subject: [PATCH 26/29] expanded the documentation; the initial stability assignments. this also changes names of Macintosh encodings from `encoding::all` to stay away from names assigned by WHATWG Encoding Standard. --- Makefile.in | 12 ++- README.md | 117 ++++++++++++++++----- src/encoding/all.rs | 107 ++++++++++---------- src/encoding/label.rs | 10 +- src/encoding/lib.rs | 229 +++++++++++++++++++++++++++++++----------- src/encoding/types.rs | 25 ++++- 6 files changed, 356 insertions(+), 144 deletions(-) diff --git a/Makefile.in b/Makefile.in index 409c497..e245856 100644 --- a/Makefile.in +++ b/Makefile.in @@ -16,17 +16,23 @@ RUST_SRC = $(shell find $(VPATH)/src/encoding/. -type f -name '*.rs') all: libencoding.dummy libencoding.dummy: $(LIB_RS) $(RUST_SRC) $(EXT_DEPS) - $(RUSTC) $(RUSTFLAGS) $< --out-dir . + $(RUSTC) $(RUSTFLAGS) $< --out-dir $(VPATH) touch $@ rustencoding-test: $(LIB_RS) $(RUST_SRC) $(RUSTC) $(RUSTFLAGS) $< -o $@ --test -check: rustencoding-test +.PHONY: doctest +doctest: $(LIB_RS) $(RUST_SRC) libencoding.dummy + $(RUSTDOC) $< -L $(VPATH) --test + +.PHONY: check +check: doctest rustencoding-test ./rustencoding-test +.PHONY: doc doc: $(LIB_RS) $(RUST_SRC) - $(RUSTDOC) $(LIB_RS) + $(RUSTDOC) $< .PHONY: clean clean: diff --git a/README.md b/README.md index 6d54e88..a949c6b 100644 --- a/README.md +++ b/README.md @@ -10,42 +10,62 @@ Character encoding support for Rust. It is based on [WHATWG Encoding Standard](http://encoding.spec.whatwg.org/), and also provides an advanced interface for error detection and recovery. -Usage ------ +## Simple Usage To encode a string: ~~~~ {.rust} -use encoding::*; -all::ISO_8859_1.encode("caf\xe9", EncodeStrict); // => Ok(vec!(99,97,102,233)) +use encoding::{Encoding, EncodeStrict}; +use encoding::all::ISO_8859_1; + +assert_eq!(ISO_8859_1.encode("caf\xe9", EncodeStrict), + Ok(vec!(99,97,102,233))); ~~~~ To encode a string with unrepresentable characters: ~~~~ {.rust} -all::ISO_8859_2.encode("Acme\xa9", EncodeStrict); // => Err(...) -all::ISO_8859_2.encode("Acme\xa9", EncodeReplace); // => Ok(vec!(65,99,109,101,63)) -all::ISO_8859_2.encode("Acme\xa9", EncodeIgnore); // => Ok(vec!(65,99,109,101)) -all::ISO_8859_2.encode("Acme\xa9", EncodeNcrEscape); // => Ok(vec!(65,99,109,101,38,23,50,51,51,59)) +use encoding::{Encoding, EncodeStrict, EncodeReplace, EncodeIgnore, EncodeNcrEscape}; +use encoding::all::ISO_8859_2; + +assert!(ISO_8859_2.encode("Acme\xa9", EncodeStrict).is_err()); +assert_eq!(ISO_8859_2.encode("Acme\xa9", EncodeReplace), + Ok(vec!(65,99,109,101,63))); +assert_eq!(ISO_8859_2.encode("Acme\xa9", EncodeIgnore), + Ok(vec!(65,99,109,101))); +assert_eq!(ISO_8859_2.encode("Acme\xa9", EncodeNcrEscape), + Ok(vec!(65,99,109,101,38,35,49,54,57,59))); ~~~~ To decode a byte sequence: ~~~~ {.rust} -all::ISO_8859_1.decode([99,97,102,233], DecodeStrict); // => Ok(~"caf\xe9") +use encoding::{Encoding, DecodeStrict}; +use encoding::all::ISO_8859_1; + +assert_eq!(ISO_8859_1.decode([99,97,102,233], DecodeStrict), + Ok("caf\xe9".to_string())); ~~~~ To decode a byte sequence with invalid sequences: ~~~~ {.rust} -all::ISO_8859_6.decode([65,99,109,101,169], DecodeStrict); // => Err(...) -all::ISO_8859_6.decode([65,99,109,101,169], DecodeReplace); // => Ok(String::from_str("Acme\ufffd")) -all::ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore); // => Ok(String::from_str("Acme")) +use encoding::{Encoding, DecodeStrict, DecodeReplace, DecodeIgnore}; +use encoding::all::ISO_8859_6; + +assert!(ISO_8859_6.decode([65,99,109,101,169], DecodeStrict).is_err()); +assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeReplace), + Ok(String::from_str("Acme\ufffd"))); +assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), + Ok(String::from_str("Acme"))); ~~~~ A practical example of custom encoder traps: ~~~~ {.rust} +use encoding::{Encoding, Encoder, ByteWriter, EncoderTrap, DecodeStrict}; +use encoding::all::ASCII; + // hexadecimal numeric character reference replacement fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { let escapes: Vec = @@ -57,28 +77,68 @@ fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); let orig = "Hello, 世界!".to_string(); -let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); -all::ASCII.decode(encoded.as_slice(), DecodeStrict); // => Ok(String::from_str("Hello, 世界!")) +let encoded = ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); +assert_eq!(ASCII.decode(encoded.as_slice(), DecodeStrict), + Ok("Hello, 世界!".to_string())); ~~~~ Getting the encoding from the string label, as specified in the WHATWG Encoding standard: ~~~~ {.rust} -let euckr = label::encoding_from_whatwg_label("euc-kr").unwrap(); -euckr.name(); // => "windows-949" -euckr.whatwg_name(); // => Some("euc-kr"), for the sake of compatibility +use encoding::{Encoding, DecodeReplace}; +use encoding::label::encoding_from_whatwg_label; +use encoding::all::WINDOWS_949; + +let euckr = encoding_from_whatwg_label("euc-kr").unwrap(); +assert_eq!(euckr.name(), "windows-949"); +assert_eq!(euckr.whatwg_name(), Some("euc-kr")); // for the sake of compatibility let broken = &[0xbf, 0xec, 0xbf, 0xcd, 0xff, 0xbe, 0xd3]; -euckr.decode(broken, DecodeReplace); // => Ok(Strbuf::from_str("\uc6b0\uc640\ufffd\uc559")) +assert_eq!(euckr.decode(broken, DecodeReplace), + Ok("\uc6b0\uc640\ufffd\uc559".to_string())); // corresponding rust-encoding native API: -all::WINDOWS_949.decode(broken, DecodeReplace); // => Ok(String::from_str("\uc6b0\uc640\ufffd\uc559")) +assert_eq!(WINDOWS_949.decode(broken, DecodeReplace), + Ok("\uc6b0\uc640\ufffd\uc559".to_string())); ~~~~ -Supported Encodings -------------------- +## Detailed Usage + +There are three main entry points to rust-encoding. + +**`Encoding`** is a single character encoding. +It contains `encode` and `decode` methods for converting `String` to `Vec` and vice versa. +For the error handling, they receive **traps** (`EncoderTrap` and `DecoderTrap` respectively) +which replaces any error with some string (e.g. `U+FFFD`) or sequence (e.g. `?`). +If you want to be stricter, use `EncodeStrict` and `DecodeStrict` traps to stop on an error. + +There are two ways to get `Encoding`: -Rust-encoding is a work in progress and this list will certainly be updated. +* `encoding::all` has static items for every supported encoding. + You should use them when the encoding would not change or only handful of them are required. + Combined with link-time optimization, any unused encoding would be discarded from the binary. +* `encoding::label` has functions to dynamically get an encoding from given string ("label"). + It is useful when a list of required encodings is not available in advance, + but it will result in the larger binary and missed optimization opportunities. + +**`Encoder`** is an experimental incremental encoder. +At each step of `raw_feed`, it receives a slice of string +and emits any encoded bytes to a generic `ByteWriter` (normally `Vec`). +It will stop at the first error if any, and would return a `CodecError` struct in that case. +The caller is responsible for calling `raw_finish` at the end of encoding process. + +**`Decoder`** is an experimental incremental decoder. +At each step of `raw_feed`, it receives a slice of byte sequence +and emits any decoded characters to a generic `StringWriter` (normally `String`). +Otherwise it is identical to `Encoder`s. + +One should prefer `Encoding::{encode,decode}` as a primary interface. +`Encoder` and `Decoder` is experimental and can change substantially. +See the additional documents on `encoding::types` module for more information on them. + +## Supported Encodings + +Rust-encoding covers all encodings specified by WHATWG Encoding Standard and some more. * 7-bit strict ASCII (`ascii`) * UTF-8 (`utf-8`) @@ -88,8 +148,8 @@ Rust-encoding is a work in progress and this list will certainly be updated. * ISO 8859-{2,3,4,5,6,7,8,10,13,14,15,16} * KOI8-R, KOI8-U * MacRoman (`macintosh`), Macintosh Cyrillic encoding (`x-mac-cyrillic`) - * Windows code page 874, 1250, 1251, 1252 (instead of ISO-8859-1), 1253, - 1254 (instead of ISO-8859-9), 1255, 1256, 1257, 1258 + * Windows code pages 874, 1250, 1251, 1252 (instead of ISO 8859-1), 1253, + 1254 (instead of ISO 8859-9), 1255, 1256, 1257, 1258 * All multi byte encodings in WHATWG Encoding Standard: * Windows code page 949 (`euc-kr`, since the strict EUC-KR is hardly used) * EUC-JP and Windows code page 932 (`shift_jis`, @@ -100,3 +160,12 @@ Rust-encoding is a work in progress and this list will certainly be updated. * Big5-2003 with HKSCS-2008 extensions * ISO 8859-1 (distinct from Windows code page 1252) +Parenthesized names refer to the encoding's primary name assigned by WHATWG Encoding Standard. + +Many legacy character encodings lack the proper specification, +and even those that have a specification are highly dependent of the actual implementation. +Consequently one should be careful when picking a desired character encoding. +The only standards reliable in this regard are WHATWG Encoding Standard and +[vendor-provided mappings from the Unicode consortium](http://www.unicode.org/Public/MAPPINGS/). +Whenever in doubt, look at the source code and specifications for detailed explanations. + diff --git a/src/encoding/all.rs b/src/encoding/all.rs index e9271ab..373ceb7 100644 --- a/src/encoding/all.rs +++ b/src/encoding/all.rs @@ -8,20 +8,21 @@ use index; use codec; macro_rules! unique( - (var=$var:ident, mod=$($module:ident)::+, val=$val:ident) => ( - pub static $var: &'static $($module)::+::$val = &$($module)::+::$val; + ($(#[$attr:meta])* var=$var:ident, mod=$($module:ident)::+, val=$val:ident) => ( + $(#[$attr])* pub static $var: &'static $($module)::+::$val = &$($module)::+::$val; ) ) macro_rules! singlebyte( - (var=$var:ident, mod=$($module:ident)::+, name=$name:expr) => ( - singlebyte!(var=$var, mod=$($module)::+, name=$name, whatwg=None) + ($(#[$attr:meta])* var=$var:ident, mod=$($module:ident)::+, name=$name:expr) => ( + singlebyte!($(#[$attr])* var=$var, mod=$($module)::+, name=$name, whatwg=None) ); - (var=$var:ident, mod=$($module:ident)::+, name|whatwg=$name:expr) => ( - singlebyte!(var=$var, mod=$($module)::+, name=$name, whatwg=Some($name)) + ($(#[$attr:meta])* var=$var:ident, mod=$($module:ident)::+, name|whatwg=$name:expr) => ( + singlebyte!($(#[$attr])* var=$var, mod=$($module)::+, name=$name, whatwg=Some($name)) ); - (var=$var:ident, mod=$($module:ident)::+, name=$name:expr, whatwg=$whatwg:expr) => ( - pub static $var: &'static codec::singlebyte::SingleByteEncoding = + ($(#[$attr:meta])* var=$var:ident, mod=$($module:ident)::+, + name=$name:expr, whatwg=$whatwg:expr) => ( + $(#[$attr])* pub static $var: &'static codec::singlebyte::SingleByteEncoding = &codec::singlebyte::SingleByteEncoding { name: $name, whatwg_name: $whatwg, @@ -31,54 +32,56 @@ macro_rules! singlebyte( ) ) -unique!(var=ERROR, mod=codec::error, val=ErrorEncoding) -unique!(var=ASCII, mod=codec::ascii, val=ASCIIEncoding) -singlebyte!(var=IBM866, mod=index::ibm866, name|whatwg="ibm866") -singlebyte!(var=ISO_8859_1, mod=codec::singlebyte::iso_8859_1, name="iso-8859-1") -singlebyte!(var=ISO_8859_2, mod=index::iso_8859_2, name|whatwg="iso-8859-2") -singlebyte!(var=ISO_8859_3, mod=index::iso_8859_3, name|whatwg="iso-8859-3") -singlebyte!(var=ISO_8859_4, mod=index::iso_8859_4, name|whatwg="iso-8859-4") -singlebyte!(var=ISO_8859_5, mod=index::iso_8859_5, name|whatwg="iso-8859-5") -singlebyte!(var=ISO_8859_6, mod=index::iso_8859_6, name|whatwg="iso-8859-6") -singlebyte!(var=ISO_8859_7, mod=index::iso_8859_7, name|whatwg="iso-8859-7") -singlebyte!(var=ISO_8859_8, mod=index::iso_8859_8, name|whatwg="iso-8859-8") -singlebyte!(var=ISO_8859_10, mod=index::iso_8859_10, name|whatwg="iso-8859-10") -singlebyte!(var=ISO_8859_13, mod=index::iso_8859_13, name|whatwg="iso-8859-13") -singlebyte!(var=ISO_8859_14, mod=index::iso_8859_14, name|whatwg="iso-8859-14") -singlebyte!(var=ISO_8859_15, mod=index::iso_8859_15, name|whatwg="iso-8859-15") -singlebyte!(var=ISO_8859_16, mod=index::iso_8859_16, name|whatwg="iso-8859-16") -singlebyte!(var=KOI8_R, mod=index::koi8_r, name|whatwg="koi8-r") -singlebyte!(var=KOI8_U, mod=index::koi8_u, name|whatwg="koi8-u") -singlebyte!(var=MACINTOSH, mod=index::macintosh, name|whatwg="macintosh") -singlebyte!(var=WINDOWS_874, mod=index::windows_874, name|whatwg="windows-874") -singlebyte!(var=WINDOWS_1250, mod=index::windows_1250, name|whatwg="windows-1250") -singlebyte!(var=WINDOWS_1251, mod=index::windows_1251, name|whatwg="windows-1251") -singlebyte!(var=WINDOWS_1252, mod=index::windows_1252, name|whatwg="windows-1252") -singlebyte!(var=WINDOWS_1253, mod=index::windows_1253, name|whatwg="windows-1253") -singlebyte!(var=WINDOWS_1254, mod=index::windows_1254, name|whatwg="windows-1254") -singlebyte!(var=WINDOWS_1255, mod=index::windows_1255, name|whatwg="windows-1255") -singlebyte!(var=WINDOWS_1256, mod=index::windows_1256, name|whatwg="windows-1256") -singlebyte!(var=WINDOWS_1257, mod=index::windows_1257, name|whatwg="windows-1257") -singlebyte!(var=WINDOWS_1258, mod=index::windows_1258, name|whatwg="windows-1258") -singlebyte!(var=X_MAC_CYRILLIC, mod=index::x_mac_cyrillic, name|whatwg="x-mac-cyrillic") -unique!(var=UTF_8, mod=codec::utf_8, val=UTF8Encoding) -unique!(var=UTF_16LE, mod=codec::utf_16, val=UTF16LEEncoding) -unique!(var=UTF_16BE, mod=codec::utf_16, val=UTF16BEEncoding) -unique!(var=WINDOWS_949, mod=codec::korean, val=Windows949Encoding) -unique!(var=EUC_JP, mod=codec::japanese, val=EUCJPEncoding) -unique!(var=WINDOWS_31J, mod=codec::japanese, val=Windows31JEncoding) -unique!(var=ISO_2022_JP, mod=codec::japanese, val=ISO2022JPEncoding) -unique!(var=GB18030, mod=codec::simpchinese, val=GB18030Encoding) -unique!(var=HZ, mod=codec::simpchinese, val=HZEncoding) -unique!(var=BIG5_2003, mod=codec::tradchinese, val=BigFive2003Encoding) +unique!(#[stable] var=ERROR, mod=codec::error, val=ErrorEncoding) +unique!(#[stable] var=ASCII, mod=codec::ascii, val=ASCIIEncoding) +singlebyte!(#[stable] var=IBM866, mod=index::ibm866, name|whatwg="ibm866") +singlebyte!(#[stable] var=ISO_8859_1, mod=codec::singlebyte::iso_8859_1, name="iso-8859-1") +singlebyte!(#[stable] var=ISO_8859_2, mod=index::iso_8859_2, name|whatwg="iso-8859-2") +singlebyte!(#[stable] var=ISO_8859_3, mod=index::iso_8859_3, name|whatwg="iso-8859-3") +singlebyte!(#[stable] var=ISO_8859_4, mod=index::iso_8859_4, name|whatwg="iso-8859-4") +singlebyte!(#[stable] var=ISO_8859_5, mod=index::iso_8859_5, name|whatwg="iso-8859-5") +singlebyte!(#[stable] var=ISO_8859_6, mod=index::iso_8859_6, name|whatwg="iso-8859-6") +singlebyte!(#[stable] var=ISO_8859_7, mod=index::iso_8859_7, name|whatwg="iso-8859-7") +singlebyte!(#[stable] var=ISO_8859_8, mod=index::iso_8859_8, name|whatwg="iso-8859-8") +singlebyte!(#[stable] var=ISO_8859_10, mod=index::iso_8859_10, name|whatwg="iso-8859-10") +singlebyte!(#[stable] var=ISO_8859_13, mod=index::iso_8859_13, name|whatwg="iso-8859-13") +singlebyte!(#[stable] var=ISO_8859_14, mod=index::iso_8859_14, name|whatwg="iso-8859-14") +singlebyte!(#[stable] var=ISO_8859_15, mod=index::iso_8859_15, name|whatwg="iso-8859-15") +singlebyte!(#[stable] var=ISO_8859_16, mod=index::iso_8859_16, name|whatwg="iso-8859-16") +singlebyte!(#[stable] var=KOI8_R, mod=index::koi8_r, name|whatwg="koi8-r") +singlebyte!(#[stable] var=KOI8_U, mod=index::koi8_u, name|whatwg="koi8-u") +singlebyte!(#[stable] var=MAC_ROMAN, mod=index::macintosh, + name="mac-roman", whatwg=Some("macintosh")) +singlebyte!(#[stable] var=WINDOWS_874, mod=index::windows_874, name|whatwg="windows-874") +singlebyte!(#[stable] var=WINDOWS_1250, mod=index::windows_1250, name|whatwg="windows-1250") +singlebyte!(#[stable] var=WINDOWS_1251, mod=index::windows_1251, name|whatwg="windows-1251") +singlebyte!(#[stable] var=WINDOWS_1252, mod=index::windows_1252, name|whatwg="windows-1252") +singlebyte!(#[stable] var=WINDOWS_1253, mod=index::windows_1253, name|whatwg="windows-1253") +singlebyte!(#[stable] var=WINDOWS_1254, mod=index::windows_1254, name|whatwg="windows-1254") +singlebyte!(#[stable] var=WINDOWS_1255, mod=index::windows_1255, name|whatwg="windows-1255") +singlebyte!(#[stable] var=WINDOWS_1256, mod=index::windows_1256, name|whatwg="windows-1256") +singlebyte!(#[stable] var=WINDOWS_1257, mod=index::windows_1257, name|whatwg="windows-1257") +singlebyte!(#[stable] var=WINDOWS_1258, mod=index::windows_1258, name|whatwg="windows-1258") +singlebyte!(#[stable] var=MAC_CYRILLIC, mod=index::x_mac_cyrillic, + name="mac-cyrillic", whatwg=Some("x-mac-cyrillic")) +unique!(#[stable] var=UTF_8, mod=codec::utf_8, val=UTF8Encoding) +unique!(#[stable] var=UTF_16LE, mod=codec::utf_16, val=UTF16LEEncoding) +unique!(#[stable] var=UTF_16BE, mod=codec::utf_16, val=UTF16BEEncoding) +unique!(#[stable] var=WINDOWS_949, mod=codec::korean, val=Windows949Encoding) +unique!(#[unstable] var=EUC_JP, mod=codec::japanese, val=EUCJPEncoding) +unique!(#[unstable] var=WINDOWS_31J, mod=codec::japanese, val=Windows31JEncoding) +unique!(#[unstable] var=ISO_2022_JP, mod=codec::japanese, val=ISO2022JPEncoding) +unique!(#[stable] var=GB18030, mod=codec::simpchinese, val=GB18030Encoding) +unique!(#[unstable] var=HZ, mod=codec::simpchinese, val=HZEncoding) +unique!(#[unstable] var=BIG5_2003, mod=codec::tradchinese, val=BigFive2003Encoding) pub mod whatwg { use codec; use index; - singlebyte!(var=X_USER_DEFINED, mod=codec::whatwg::x_user_defined, - name="pua-mapped-binary", whatwg=Some("x-user-defined")) - singlebyte!(var=ISO_8859_8_I, mod=index::iso_8859_8, name|whatwg="iso-8859-8-i") - unique!(var=REPLACEMENT, mod=codec::whatwg, val=EncoderOnlyUTF8Encoding) + singlebyte!(#[stable] var=X_USER_DEFINED, mod=codec::whatwg::x_user_defined, + name="pua-mapped-binary", whatwg=Some("x-user-defined")) + singlebyte!(#[stable] var=ISO_8859_8_I, mod=index::iso_8859_8, name|whatwg="iso-8859-8-i") + unique!(#[stable] var=REPLACEMENT, mod=codec::whatwg, val=EncoderOnlyUTF8Encoding) } diff --git a/src/encoding/label.rs b/src/encoding/label.rs index b7e7af0..3c1ecd6 100644 --- a/src/encoding/label.rs +++ b/src/encoding/label.rs @@ -10,6 +10,7 @@ use types::EncodingRef; /// Returns an encoding from given label, defined in the WHATWG Encoding standard, if any. /// Implements "get an encoding" algorithm: http://encoding.spec.whatwg.org/#decode +#[stable] pub fn encoding_from_whatwg_label(label: &str) -> Option { // FIXME(rust#10683): temp needed as workaround let trimmed = label.trim_chars(&[' ', '\n', '\r', '\t', '\x0C']).to_ascii_lower(); @@ -143,7 +144,7 @@ pub fn encoding_from_whatwg_label(label: &str) -> Option { "mac" | "macintosh" | "x-mac-roman" => - Some(all::MACINTOSH as EncodingRef), + Some(all::MAC_ROMAN as EncodingRef), "dos-874" | "iso-8859-11" | "iso8859-11" | @@ -212,7 +213,7 @@ pub fn encoding_from_whatwg_label(label: &str) -> Option { Some(all::WINDOWS_1258 as EncodingRef), "x-mac-cyrillic" | "x-mac-ukrainian" => - Some(all::X_MAC_CYRILLIC as EncodingRef), + Some(all::MAC_CYRILLIC as EncodingRef), "chinese" | "csgb2312" | "csiso58gb231280" | @@ -277,6 +278,7 @@ pub fn encoding_from_whatwg_label(label: &str) -> Option { /// Returns an encoding from Windows code page number. /// http://msdn.microsoft.com/en-us/library/windows/desktop/dd317756%28v=vs.85%29.aspx /// Sometimes it can return a *superset* of the requested encoding, e.g. for several CJK encodings. +#[experimental] pub fn encoding_from_windows_code_page(cp: uint) -> Option { match cp { 65001 => Some(all::UTF_8 as EncodingRef), @@ -294,7 +296,7 @@ pub fn encoding_from_windows_code_page(cp: uint) -> Option { 28605 => Some(all::ISO_8859_15 as EncodingRef), 20866 => Some(all::KOI8_R as EncodingRef), 21866 => Some(all::KOI8_U as EncodingRef), - 10000 => Some(all::MACINTOSH as EncodingRef), + 10000 => Some(all::MAC_ROMAN as EncodingRef), 874 => Some(all::WINDOWS_874 as EncodingRef), 1250 => Some(all::WINDOWS_1250 as EncodingRef), 1251 => Some(all::WINDOWS_1251 as EncodingRef), @@ -305,7 +307,7 @@ pub fn encoding_from_windows_code_page(cp: uint) -> Option { 1256 => Some(all::WINDOWS_1256 as EncodingRef), 1257 => Some(all::WINDOWS_1257 as EncodingRef), 1258 => Some(all::WINDOWS_1258 as EncodingRef), - 1259 => Some(all::X_MAC_CYRILLIC as EncodingRef), + 1259 => Some(all::MAC_CYRILLIC as EncodingRef), 936 | 54936 => Some(all::GB18030 as EncodingRef), // XXX technically wrong 52936 => Some(all::HZ as EncodingRef), 950 => Some(all::BIG5_2003 as EncodingRef), diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index fd7dfaf..fcbbcc3 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -1,12 +1,175 @@ // This is a part of rust-encoding. -// Copyright (c) 2013, Kang Seonghoon. +// Copyright (c) 2013-2014, Kang Seonghoon. // See README.md and LICENSE.txt for details. /*! - * Character encoding support for Rust. It is based on [WHATWG Encoding - * Standard](http://encoding.spec.whatwg.org/), and also provides an advanced interface for - * error detection and recovery. - */ + +# Rust-encoding + +Character encoding support for Rust. +It is based on [WHATWG Encoding Standard](http://encoding.spec.whatwg.org/), +and also provides an advanced interface for error detection and recovery. + +## Simple Usage + +To encode a string: + +~~~~ {.rust} +use encoding::{Encoding, EncodeStrict}; +use encoding::all::ISO_8859_1; + +assert_eq!(ISO_8859_1.encode("caf\xe9", EncodeStrict), + Ok(vec!(99,97,102,233))); +~~~~ + +To encode a string with unrepresentable characters: + +~~~~ {.rust} +use encoding::{Encoding, EncodeStrict, EncodeReplace, EncodeIgnore, EncodeNcrEscape}; +use encoding::all::ISO_8859_2; + +assert!(ISO_8859_2.encode("Acme\xa9", EncodeStrict).is_err()); +assert_eq!(ISO_8859_2.encode("Acme\xa9", EncodeReplace), + Ok(vec!(65,99,109,101,63))); +assert_eq!(ISO_8859_2.encode("Acme\xa9", EncodeIgnore), + Ok(vec!(65,99,109,101))); +assert_eq!(ISO_8859_2.encode("Acme\xa9", EncodeNcrEscape), + Ok(vec!(65,99,109,101,38,35,49,54,57,59))); +~~~~ + +To decode a byte sequence: + +~~~~ {.rust} +use encoding::{Encoding, DecodeStrict}; +use encoding::all::ISO_8859_1; + +assert_eq!(ISO_8859_1.decode([99,97,102,233], DecodeStrict), + Ok("caf\xe9".to_string())); +~~~~ + +To decode a byte sequence with invalid sequences: + +~~~~ {.rust} +use encoding::{Encoding, DecodeStrict, DecodeReplace, DecodeIgnore}; +use encoding::all::ISO_8859_6; + +assert!(ISO_8859_6.decode([65,99,109,101,169], DecodeStrict).is_err()); +assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeReplace), + Ok(String::from_str("Acme\ufffd"))); +assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), + Ok(String::from_str("Acme"))); +~~~~ + +A practical example of custom encoder traps: + +~~~~ {.rust} +use encoding::{Encoding, Encoder, ByteWriter, EncoderTrap, DecodeStrict}; +use encoding::all::ASCII; + +// hexadecimal numeric character reference replacement +fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { + let escapes: Vec = + input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); + let escapes = escapes.concat(); + output.write_bytes(escapes.as_bytes()); + true +} +static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); + +let orig = "Hello, 世界!".to_string(); +let encoded = ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); +assert_eq!(ASCII.decode(encoded.as_slice(), DecodeStrict), + Ok("Hello, 世界!".to_string())); +~~~~ + +Getting the encoding from the string label, +as specified in the WHATWG Encoding standard: + +~~~~ {.rust} +use encoding::{Encoding, DecodeReplace}; +use encoding::label::encoding_from_whatwg_label; +use encoding::all::WINDOWS_949; + +let euckr = encoding_from_whatwg_label("euc-kr").unwrap(); +assert_eq!(euckr.name(), "windows-949"); +assert_eq!(euckr.whatwg_name(), Some("euc-kr")); // for the sake of compatibility +let broken = &[0xbf, 0xec, 0xbf, 0xcd, 0xff, 0xbe, 0xd3]; +assert_eq!(euckr.decode(broken, DecodeReplace), + Ok("\uc6b0\uc640\ufffd\uc559".to_string())); + +// corresponding rust-encoding native API: +assert_eq!(WINDOWS_949.decode(broken, DecodeReplace), + Ok("\uc6b0\uc640\ufffd\uc559".to_string())); +~~~~ + +## Detailed Usage + +There are three main entry points to rust-encoding. + +**`Encoding`** is a single character encoding. +It contains `encode` and `decode` methods for converting `String` to `Vec` and vice versa. +For the error handling, they receive **traps** (`EncoderTrap` and `DecoderTrap` respectively) +which replaces any error with some string (e.g. `U+FFFD`) or sequence (e.g. `?`). +If you want to be stricter, use `EncodeStrict` and `DecodeStrict` traps to stop on an error. + +There are two ways to get `Encoding`: + +* `encoding::all` has static items for every supported encoding. + You should use them when the encoding would not change or only handful of them are required. + Combined with link-time optimization, any unused encoding would be discarded from the binary. +* `encoding::label` has functions to dynamically get an encoding from given string ("label"). + It is useful when a list of required encodings is not available in advance, + but it will result in the larger binary and missed optimization opportunities. + +**`Encoder`** is an experimental incremental encoder. +At each step of `raw_feed`, it receives a slice of string +and emits any encoded bytes to a generic `ByteWriter` (normally `Vec`). +It will stop at the first error if any, and would return a `CodecError` struct in that case. +The caller is responsible for calling `raw_finish` at the end of encoding process. + +**`Decoder`** is an experimental incremental decoder. +At each step of `raw_feed`, it receives a slice of byte sequence +and emits any decoded characters to a generic `StringWriter` (normally `String`). +Otherwise it is identical to `Encoder`s. + +One should prefer `Encoding::{encode,decode}` as a primary interface. +`Encoder` and `Decoder` is experimental and can change substantially. +See the additional documents on `encoding::types` module for more information on them. + +## Supported Encodings + +Rust-encoding covers all encodings specified by WHATWG Encoding Standard and some more. + +* 7-bit strict ASCII (`ascii`) +* UTF-8 (`utf-8`) +* UTF-16 in little endian (`utf-16` or `utf-16le`) and big endian (`utf-16be`) +* All single byte encoding in WHATWG Encoding Standard: + * IBM code page 866 + * ISO 8859-{2,3,4,5,6,7,8,10,13,14,15,16} + * KOI8-R, KOI8-U + * MacRoman (`macintosh`), Macintosh Cyrillic encoding (`x-mac-cyrillic`) + * Windows code pages 874, 1250, 1251, 1252 (instead of ISO 8859-1), 1253, + 1254 (instead of ISO 8859-9), 1255, 1256, 1257, 1258 +* All multi byte encodings in WHATWG Encoding Standard: + * Windows code page 949 (`euc-kr`, since the strict EUC-KR is hardly used) + * EUC-JP and Windows code page 932 (`shift_jis`, + since it's the most widespread extension to Shift_JIS) + * ISO-2022-JP with asymmetric JIS X 0212 support + * GB 18030 + * HZ + * Big5-2003 with HKSCS-2008 extensions +* ISO 8859-1 (distinct from Windows code page 1252) + +Parenthesized names refer to the encoding's primary name assigned by WHATWG Encoding Standard. + +Many legacy character encodings lack the proper specification, +and even those that have a specification are highly dependent of the actual implementation. +Consequently one should be careful when picking a desired character encoding. +The only standards reliable in this regard are WHATWG Encoding Standard and +[vendor-provided mappings from the Unicode consortium](http://www.unicode.org/Public/MAPPINGS/). +Whenever in doubt, look at the source code and specifications for detailed explanations. + +*/ #![crate_id = "encoding#0.1.0"] #![crate_type = "lib"] @@ -15,6 +178,8 @@ #![feature(globs, macro_rules)] +#![allow(experimental)] + #[cfg(test)] extern crate test; pub use self::types::{CodecError, ByteWriter, StringWriter, @@ -30,6 +195,7 @@ mod util; pub mod types; /// Indices used for character encoding implementation. Semi-internal. +#[unstable] pub mod index { pub mod ibm866; pub mod iso_8859_2; @@ -67,6 +233,7 @@ pub mod index { } /// Codec implementations. +#[unstable] pub mod codec { pub mod error; pub mod ascii; @@ -87,58 +254,6 @@ pub mod label; mod tests { use super::*; - #[test] - fn test_readme() { - assert_eq!(all::ISO_8859_1.encode("caf\xe9", EncodeStrict), Ok(vec!(99,97,102,233))); - - assert!(all::ISO_8859_2.encode("Acme\xa9", EncodeStrict).is_err()); - assert_eq!(all::ISO_8859_2.encode("Acme\xa9", EncodeReplace), Ok(vec!(65,99,109,101,63))); - assert_eq!(all::ISO_8859_2.encode("Acme\xa9", EncodeIgnore), Ok(vec!(65,99,109,101))); - assert_eq!(all::ISO_8859_2.encode("Acme\xa9", EncodeNcrEscape), - Ok(vec!(65,99,109,101,38,35,49,54,57,59))); // Acme© - - assert_eq!(all::ISO_8859_1.decode([99,97,102,233], DecodeStrict), - Ok(String::from_str("caf\xe9"))); - - assert!(all::ISO_8859_6.decode([65,99,109,101,169], DecodeStrict).is_err()); - assert_eq!(all::ISO_8859_6.decode([65,99,109,101,169], DecodeReplace), - Ok(String::from_str("Acme\ufffd"))); - assert_eq!(all::ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), - Ok(String::from_str("Acme"))); - } - - #[test] - fn test_readme_hex_ncr_escape() { - // hexadecimal numeric character reference replacement - fn hex_ncr_escape(_encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool { - let escapes: Vec = - input.chars().map(|ch| format!("&\\#x{:x};", ch as int)).collect(); - let escapes = escapes.concat(); - output.write_bytes(escapes.as_bytes()); - true - } - static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); - let orig = "Hello, 世界!".to_string(); - let encoded = all::ASCII.encode(orig.as_slice(), HexNcrEscape).unwrap(); - let decoded = all::ASCII.decode(encoded.as_slice(), DecodeStrict).unwrap(); - assert_eq!(decoded, String::from_str("Hello, 世界!")); - } - - #[test] - fn test_readme_whatwg() { - let euckr = label::encoding_from_whatwg_label("euc-kr").unwrap(); - assert_eq!(euckr.name(), "windows-949"); - assert_eq!(euckr.whatwg_name(), Some("euc-kr")); // for the sake of compatibility - let broken = &[0xbf, 0xec, 0xbf, 0xcd, 0xff, 0xbe, 0xd3]; - assert_eq!(euckr.decode(broken, DecodeReplace), - Ok(String::from_str("\uc6b0\uc640\ufffd\uc559"))); - - // corresponding rust-encoding native API: - assert_eq!(all::WINDOWS_949.decode(broken, DecodeReplace), - Ok(String::from_str("\uc6b0\uc640\ufffd\uc559"))); - } - - #[test] fn test_decode() { fn test_one(input: &[u8], expected_result: &str, expected_encoding: &str) { diff --git a/src/encoding/types.rs b/src/encoding/types.rs index 7c7cbb3..bd8efaa 100644 --- a/src/encoding/types.rs +++ b/src/encoding/types.rs @@ -20,7 +20,7 @@ * * The following figure illustrates an example of successive `raw_feed` calls: * - * ```` + * ````notrust * 1st raw_feed :2nd raw_feed :3rd raw_feed * ----------+----:---------------:--+--+--------- * | : : | | @@ -55,6 +55,7 @@ use std::str::SendStr; /// Error information from either encoder or decoder. +#[experimental] pub struct CodecError { /// The byte position of the first remaining byte, which is next to the problematic byte. /// The caller should feed the bytes starting from this point again @@ -66,6 +67,7 @@ pub struct CodecError { } /// Byte writer used by `Encoder`s. In most cases this will be an owned vector of `u8`. +#[unstable] pub trait ByteWriter { /// Hints an expected lower bound on the length (in bytes) of the output /// until the next call to `writer_hint`, @@ -97,6 +99,7 @@ impl ByteWriter for Vec { } /// String writer used by `Decoder`s. In most cases this will be an owned string. +#[unstable] pub trait StringWriter { /// Hints an expected lower bound on the length (in bytes) of the output /// until the next call to `writer_hint`, @@ -130,6 +133,7 @@ impl StringWriter for String { /// Encoder converting a Unicode string into a byte sequence. /// This is a lower level interface, and normally `Encoding::encode` should be used instead. +#[experimental] pub trait Encoder { /// Creates a fresh `Encoder` instance which parameters are same as `self`. fn from_self(&self) -> Box; @@ -182,6 +186,7 @@ pub trait Encoder { /// Encoder converting a byte sequence into a Unicode string. /// This is a lower level interface, and normally `Encoding::decode` should be used instead. +#[experimental] pub trait Decoder { /// Creates a fresh `Decoder` instance which parameters are same as `self`. fn from_self(&self) -> Box; @@ -239,29 +244,36 @@ pub trait Decoder { /// A trait object using dynamic dispatch which is a sendable reference to the encoding, /// for code where the encoding is not known at compile-time. +#[stable] pub type EncodingRef = &'static Encoding: Send; /// Character encoding. +#[stable] pub trait Encoding { /// Returns the canonical name of given encoding. /// This name is guaranteed to be unique across built-in encodings, /// but it is not normative and would be at most arbitrary. + #[stable] fn name(&self) -> &'static str; /// Returns a name of given encoding defined in the WHATWG Encoding standard, if any. /// This name often differs from `name` due to the compatibility reason. + #[unstable] fn whatwg_name(&self) -> Option<&'static str> { None } /// Creates a new encoder. + #[experimental] fn encoder(&'static self) -> Box; /// Creates a new decoder. + #[experimental] fn decoder(&'static self) -> Box; /// An easy-to-use interface to `Encoder`. /// On the encoder error `trap` is called, /// which may return a replacement sequence to continue processing, /// or a failure to return the error. + #[stable] fn encode(&'static self, input: &str, trap: EncoderTrap) -> Result,SendStr> { let mut encoder = self.encoder(); let mut remaining = input; @@ -302,6 +314,7 @@ pub trait Encoding { /// On the decoder error `trap` is called, /// which may return a replacement string to continue processing, /// or a failure to return the error. + #[stable] fn decode(&'static self, input: &[u8], trap: DecoderTrap) -> Result { let mut decoder = self.decoder(); let mut remaining = input; @@ -340,14 +353,17 @@ pub trait Encoding { } /// A type of the bare function in `EncoderTrap` values. +#[unstable] pub type EncoderTrapFunc = extern "Rust" fn(encoder: &mut Encoder, input: &str, output: &mut ByteWriter) -> bool; /// A type of the bare function in `DecoderTrap` values. +#[unstable] pub type DecoderTrapFunc = extern "Rust" fn(decoder: &mut Decoder, input: &[u8], output: &mut StringWriter) -> bool; /// Trap, which handles decoder errors. +#[stable] pub enum DecoderTrap { /// Immediately fails on errors. /// Corresponds to WHATWG "fatal" error algorithm. @@ -360,7 +376,7 @@ pub enum DecoderTrap { /// Calls given function to handle decoder errors. /// The function is given the current decoder, input and output writer, /// and should return true only when it is fine to keep going. - DecoderTrap(DecoderTrapFunc), + #[unstable] DecoderTrap(DecoderTrapFunc), } impl DecoderTrap { @@ -376,6 +392,7 @@ impl DecoderTrap { } } +#[stable] pub enum EncoderTrap { /// Immediately fails on errors. /// Corresponds to WHATWG "fatal" error algorithm. @@ -393,7 +410,7 @@ pub enum EncoderTrap { /// Calls given function to handle encoder errors. /// The function is given the current encoder, input and output writer, /// and should return true only when it is fine to keep going. - EncoderTrap(EncoderTrapFunc), + #[unstable] EncoderTrap(EncoderTrapFunc), } impl EncoderTrap { @@ -429,10 +446,10 @@ impl EncoderTrap { } } - /// Determine the encoding by looking for a Byte Order Mark (BOM) /// and decoded a single string in memory. /// Return the result and the used encoding. +#[unstable] pub fn decode(input: &[u8], trap: DecoderTrap, fallback_encoding: EncodingRef) -> (Result, EncodingRef) { use all::{UTF_8, UTF_16LE, UTF_16BE}; From 9d54272d4d29afc63c9262f7a66f2c228952918e Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sat, 31 May 2014 21:22:48 +0900 Subject: [PATCH 27/29] added a mention about EncodingRef. --- README.md | 1 + src/encoding/lib.rs | 1 + 2 files changed, 2 insertions(+) diff --git a/README.md b/README.md index a949c6b..38192d0 100644 --- a/README.md +++ b/README.md @@ -118,6 +118,7 @@ There are two ways to get `Encoding`: You should use them when the encoding would not change or only handful of them are required. Combined with link-time optimization, any unused encoding would be discarded from the binary. * `encoding::label` has functions to dynamically get an encoding from given string ("label"). + They will return a static reference to the encoding, which type is also known as `EncodingRef`. It is useful when a list of required encodings is not available in advance, but it will result in the larger binary and missed optimization opportunities. diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index fcbbcc3..99a784a 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -118,6 +118,7 @@ There are two ways to get `Encoding`: You should use them when the encoding would not change or only handful of them are required. Combined with link-time optimization, any unused encoding would be discarded from the binary. * `encoding::label` has functions to dynamically get an encoding from given string ("label"). + They will return a static reference to the encoding, which type is also known as `EncodingRef`. It is useful when a list of required encodings is not available in advance, but it will result in the larger binary and missed optimization opportunities. From aff80488dd5d9d31e1f7d6a5f582ff6d9b793f1b Mon Sep 17 00:00:00 2001 From: Kang Seonghoon Date: Sun, 1 Jun 2014 01:28:34 +0900 Subject: [PATCH 28/29] some more documentation rewriting. --- README.md | 13 ++++++------- src/encoding/lib.rs | 13 ++++++------- 2 files changed, 12 insertions(+), 14 deletions(-) diff --git a/README.md b/README.md index 38192d0..a9901c3 100644 --- a/README.md +++ b/README.md @@ -55,9 +55,9 @@ use encoding::all::ISO_8859_6; assert!(ISO_8859_6.decode([65,99,109,101,169], DecodeStrict).is_err()); assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeReplace), - Ok(String::from_str("Acme\ufffd"))); + Ok("Acme\ufffd".to_string())); assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), - Ok(String::from_str("Acme"))); + Ok("Acme".to_string())); ~~~~ A practical example of custom encoder traps: @@ -82,8 +82,7 @@ assert_eq!(ASCII.decode(encoded.as_slice(), DecodeStrict), Ok("Hello, 世界!".to_string())); ~~~~ -Getting the encoding from the string label, -as specified in the WHATWG Encoding standard: +Getting the encoding from the string label, as specified in WHATWG Encoding standard: ~~~~ {.rust} use encoding::{Encoding, DecodeReplace}; @@ -109,8 +108,8 @@ There are three main entry points to rust-encoding. **`Encoding`** is a single character encoding. It contains `encode` and `decode` methods for converting `String` to `Vec` and vice versa. For the error handling, they receive **traps** (`EncoderTrap` and `DecoderTrap` respectively) -which replaces any error with some string (e.g. `U+FFFD`) or sequence (e.g. `?`). -If you want to be stricter, use `EncodeStrict` and `DecodeStrict` traps to stop on an error. +which replace any error with some string (e.g. `U+FFFD`) or sequence (e.g. `?`). +You can also use `EncodeStrict` and `DecodeStrict` traps to stop on an error. There are two ways to get `Encoding`: @@ -139,7 +138,7 @@ See the additional documents on `encoding::types` module for more information on ## Supported Encodings -Rust-encoding covers all encodings specified by WHATWG Encoding Standard and some more. +Rust-encoding covers all encodings specified by WHATWG Encoding Standard and some more: * 7-bit strict ASCII (`ascii`) * UTF-8 (`utf-8`) diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index 99a784a..267b64a 100644 --- a/src/encoding/lib.rs +++ b/src/encoding/lib.rs @@ -55,9 +55,9 @@ use encoding::all::ISO_8859_6; assert!(ISO_8859_6.decode([65,99,109,101,169], DecodeStrict).is_err()); assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeReplace), - Ok(String::from_str("Acme\ufffd"))); + Ok("Acme\ufffd".to_string())); assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), - Ok(String::from_str("Acme"))); + Ok("Acme".to_string())); ~~~~ A practical example of custom encoder traps: @@ -82,8 +82,7 @@ assert_eq!(ASCII.decode(encoded.as_slice(), DecodeStrict), Ok("Hello, 世界!".to_string())); ~~~~ -Getting the encoding from the string label, -as specified in the WHATWG Encoding standard: +Getting the encoding from the string label, as specified in WHATWG Encoding standard: ~~~~ {.rust} use encoding::{Encoding, DecodeReplace}; @@ -109,8 +108,8 @@ There are three main entry points to rust-encoding. **`Encoding`** is a single character encoding. It contains `encode` and `decode` methods for converting `String` to `Vec` and vice versa. For the error handling, they receive **traps** (`EncoderTrap` and `DecoderTrap` respectively) -which replaces any error with some string (e.g. `U+FFFD`) or sequence (e.g. `?`). -If you want to be stricter, use `EncodeStrict` and `DecodeStrict` traps to stop on an error. +which replace any error with some string (e.g. `U+FFFD`) or sequence (e.g. `?`). +You can also use `EncodeStrict` and `DecodeStrict` traps to stop on an error. There are two ways to get `Encoding`: @@ -139,7 +138,7 @@ See the additional documents on `encoding::types` module for more information on ## Supported Encodings -Rust-encoding covers all encodings specified by WHATWG Encoding Standard and some more. +Rust-encoding covers all encodings specified by WHATWG Encoding Standard and some more: * 7-bit strict ASCII (`ascii`) * UTF-8 (`utf-8`) From 3a8b209d20d2a02f352f6668918c593922c214b5 Mon Sep 17 00:00:00 2001 From: Jack Moffitt Date: Wed, 4 Jun 2014 11:33:00 -0600 Subject: [PATCH 29/29] Fix up makefile after merge. --- Makefile.in | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/Makefile.in b/Makefile.in index e245856..afcab6a 100644 --- a/Makefile.in +++ b/Makefile.in @@ -16,7 +16,7 @@ RUST_SRC = $(shell find $(VPATH)/src/encoding/. -type f -name '*.rs') all: libencoding.dummy libencoding.dummy: $(LIB_RS) $(RUST_SRC) $(EXT_DEPS) - $(RUSTC) $(RUSTFLAGS) $< --out-dir $(VPATH) + $(RUSTC) $(RUSTFLAGS) $< --out-dir . touch $@ rustencoding-test: $(LIB_RS) $(RUST_SRC) @@ -24,7 +24,7 @@ rustencoding-test: $(LIB_RS) $(RUST_SRC) .PHONY: doctest doctest: $(LIB_RS) $(RUST_SRC) libencoding.dummy - $(RUSTDOC) $< -L $(VPATH) --test + $(RUSTDOC) $< -L . --test .PHONY: check check: doctest rustencoding-test