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= diff --git a/Makefile.in b/Makefile.in index 53fd1a6..afcab6a 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,18 +15,24 @@ 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 $@ rustencoding-test: $(LIB_RS) $(RUST_SRC) $(RUSTC) $(RUSTFLAGS) $< -o $@ --test -check: rustencoding-test +.PHONY: doctest +doctest: $(LIB_RS) $(RUST_SRC) libencoding.dummy + $(RUSTDOC) $< -L . --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 e2ca270..a9901c3 100644 --- a/README.md +++ b/README.md @@ -10,45 +10,65 @@ 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(StrBuf::from_str("Acme\ufffd")) -all::ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore); // => Ok(StrBuf::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("Acme\ufffd".to_string())); +assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), + Ok("Acme".to_string())); ~~~~ 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: &Encoder, input: &str, output: &mut ByteWriter) -> bool { - let escapes: Vec<~str> = +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()); @@ -56,29 +76,69 @@ fn hex_ncr_escape(_encoder: &Encoder, input: &str, output: &mut ByteWriter) -> b } static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); -let orig = "Hello, 世界!".to_owned(); -let encoded = all::ASCII.encode(orig, HexNcrEscape).unwrap(); -all::ASCII.decode(encoded.as_slice(), DecodeStrict); // => Ok(StrBuf::from_str("Hello, 世界!")) +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: +Getting the encoding from the string label, as specified in 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(StrBuf::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 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`: -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"). + 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. + +**`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,13 +148,24 @@ 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 -* Multi byte encodings in WHATWG Encoding Standard: + * 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) - * GB 18030 and its GBK subset + * 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. + diff --git a/src/encoding/all.rs b/src/encoding/all.rs index 5f77298..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,53 +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=GBK18030, mod=codec::simpchinese, val=GBK18030Encoding) -unique!(var=GB18030, mod=codec::simpchinese, val=GB18030Encoding) -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/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/japanese.rs b/src/encoding/codec/japanese.rs index 6fbba2c..81d3535 100644 --- a/src/encoding/codec/japanese.rs +++ b/src/encoding/codec/japanese.rs @@ -1,12 +1,11 @@ // 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. -use util::{as_char, StrCharIndex}; -use index0208 = index::jis0208; -use index0212 = index::jis0212; +use util::StrCharIndex; +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() @@ -81,170 +80,88 @@ impl Encoder for EUCJPEncoder { } } -/// A decoder for EUC-JP with JIS X 0212 in G3. -#[deriving(Clone)] -pub struct EUCJP0212Decoder { - first: u8, - second: u8, -} +ascii_compatible_stateful_decoder! { + #[doc="A decoder for EUC-JP with JIS X 0212 in G3."] + #[deriving(Clone)] + struct EUCJP0212Decoder; -impl EUCJP0212Decoder { - pub fn new() -> Box { box EUCJP0212Decoder { first: 0, second: 0 } as Box } -} + module eucjp; -impl Decoder for EUCJP0212Decoder { - fn from_self(&self) -> Box { EUCJP0212Decoder::new() } - fn is_ascii_compatible(&self) -> bool { true } + internal pub fn map_two_0208_bytes(lead: u8, trail: u8) -> u32 { + use index; - fn raw_feed(&mut self, input: &[u8], output: &mut StringWriter) -> (uint, Option) { - output.writer_hint(input.len()); + 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, + }; + index::jis0208::forward(index as u16) + } - 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) - } + internal pub fn map_two_0212_bytes(lead: u8, trail: u8) -> u32 { + use index; - 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 lead = lead as uint; + let trail = trail as uint; + let index = match (lead, trail) { + (0xa1..0xfe, 0xa1..0xfe) => (lead - 0xa1) * 94 + trail - 0xa1, + _ => 0xffff, + }; + index::jis0212::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]); - if ch == 0xffff { - self.second = 0; - return (processed, Some(CodecError { - upto: i, cause: "invalid sequence".into_maybe_owned() - })); - } - output.write_char(as_char(ch)); - i += 1; - } + // euc-jp lead != 0x00, euc-jp jis0212 flag = unset + // JIS X 0208 two-byte sequence + state S3(ctx, lead: u8) { + 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"); + } - 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) - } - - 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 => 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"); } } #[cfg(test)] mod eucjp_tests { + extern crate test; use super::EUCJPEncoding; + use testutils; use types::*; #[test] @@ -261,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(); @@ -296,6 +222,26 @@ mod eucjp_tests { assert_feed_ok!(d, [0xa4, 0xa2], [], "\u3042"); 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(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) + } + + #[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(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) + } } /** @@ -345,7 +291,8 @@ 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); + // 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(), @@ -369,106 +316,53 @@ 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(); - - if i >= len { return (processed, None); } - - if self.lead != 0 { - let ch = map_two_0208_bytes(self.lead, input[i]); - 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; - } +ascii_compatible_stateful_decoder! { + #[doc="A decoder for Shift_JIS with IBM/NEC extensions."] + #[deriving(Clone)] + struct Windows31JDecoder; + + module windows31j; + + 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}; + let trailoffset = if trail < 0x7f {0x40} else {0x41}; + let index = match (lead, trail) { + (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) | + (0xe0..0xfc, 0x40..0x7e) | (0xe0..0xfc, 0x80..0xfc) => + (lead - leadoffset) * 188 + trail - trailoffset, + _ => 0xffff, + }; + index::jis0208::forward(index as u16) + } - 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) + // 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"); } - 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 - } + // shift_jis lead != 0x00 + state S1(ctx, lead: u8) { + case b => match map_two_0208_bytes(lead, b) { + 0xffff => ctx.backup_and_err(1, "invalid sequence"), // unconditional + ch => ctx.emit(ch) + }; } } #[cfg(test)] mod windows31j_tests { + extern crate test; use super::Windows31JEncoding; + use testutils; use types::*; #[test] @@ -485,6 +379,24 @@ 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_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(); @@ -508,6 +420,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] @@ -518,5 +441,391 @@ mod windows31j_tests { assert_feed_ok!(d, [0x82, 0xa0], [], "\u3042"); 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(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) + } + + #[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(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) + } +} + +/** + * 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_encode_short_text(bencher: &mut test::Bencher) { + static Encoding: ISO2022JPEncoding = ISO2022JPEncoding; + let s = testutils::JAPANESE_TEXT; + bencher.bytes = s.len() as u64; + bencher.iter(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) + } + + #[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(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) + } +} diff --git a/src/encoding/codec/korean.rs b/src/encoding/codec/korean.rs index 199234c..80d8f2c 100644 --- a/src/encoding/codec/korean.rs +++ b/src/encoding/codec/korean.rs @@ -1,11 +1,11 @@ // 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. -use util::{as_char, StrCharIndex}; -use index = index::euc_kr; +use util::StrCharIndex; +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() @@ -76,103 +76,53 @@ 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(); - - if i >= len { return (processed, None); } - - if self.lead != 0 { - let ch = map_two_bytes(self.lead, input[i]); - 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; - } +ascii_compatible_stateful_decoder! { + #[doc="A decoder for Windows code page 949."] + #[deriving(Clone)] + struct Windows949Decoder; + + module windows949; + + 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) { + (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::euc_kr::forward(index as u16) + } - 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() - })); - } - } - i += 1; - processed = i; - } - (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"); } - 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 - } + // euc-kr lead != 0x00 + state S1(ctx, lead: u8) { + case b => match map_two_bytes(lead, b) { + 0xffff => ctx.backup_and_err(1, "invalid sequence"), // unconditional + ch => ctx.emit(ch as u32) + }; } } #[cfg(test)] mod windows949_tests { + extern crate test; use super::Windows949Encoding; + use testutils; use types::*; #[test] @@ -274,5 +224,25 @@ mod windows949_tests { assert_feed_ok!(d, [0xb0, 0xa1], [], "\uac00"); 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(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) + } + + #[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(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) + } } diff --git a/src/encoding/codec/simpchinese.rs b/src/encoding/codec/simpchinese.rs index aaa5ad4..adbf0c2 100644 --- a/src/encoding/codec/simpchinese.rs +++ b/src/encoding/codec/simpchinese.rs @@ -1,20 +1,25 @@ // 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. -use util::{as_char, StrCharIndex}; -use index2312 = index::gbk; -use index18030 = index::gb18030; +use util::StrCharIndex; +use index; 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 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": + * 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. + * + * 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::gb18030::backward(ch as u32); if ptr == 0xffff { - let ptr = index18030::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); @@ -291,189 +88,75 @@ impl Encoder for GB18030Encoder { } } -/// A decoder for GB 18030. -#[deriving(Clone)] -pub struct GB18030Decoder { - first: u8, - second: u8, - third: u8, -} +ascii_compatible_stateful_decoder! { + #[doc="A decoder for GB 18030."] + #[deriving(Clone)] + struct GB18030Decoder; -impl GB18030Decoder { - pub fn new() -> Box { - box GB18030Decoder { first: 0, second: 0, third: 0 } as Box - } -} + module gb18030; -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()); - - 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) - } - - 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) - } - - let mut i = 0; - let mut processed = 0; - let len = input.len(); + internal pub fn map_two_bytes(lead: u8, trail: u8) -> u32 { + use index; - if i >= len { return (processed, None); } - - 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)); - } + 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 } - i += 1; - if i >= len { return (processed, None); } - } + _ => 0xffff, + }; + index::gb18030::forward(index as u16) + } - 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); } - } + internal pub fn map_four_bytes(b1: u8, b2: u8, b3: u8, b4: u8) -> u32 { + use index; - if self.third != 0 { - let ch = match input[i] { - 0x30..0x39 => map_four_18030_bytes(self.first, self.second, self.third, input[i]), - _ => 0xffffffff - }; - 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; - } + // 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); + index::gb18030_ranges::forward(index as u32) + } - 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; - } + // 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"); + } - 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() - })); - } - } - i += 1; - processed = i; - } - (processed, None) + // gb18030 first != 0x00, gb18030 second = 0x00, gb18030 third = 0x00 + state S1(ctx, first: u8) { + case b @ 0x30..0x39 => S2(ctx, first, b); + case b => match map_two_bytes(first, b) { + 0xffff => ctx.backup_and_err(1, "invalid sequence"), // unconditional + ch => ctx.emit(ch) + }; } - 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 - } + // 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"); + } + + // gb18030 first != 0x00, gb18030 second != 0x00, gb18030 third != 0x00 + state S3(ctx, first: u8, second: u8, third: u8) { + 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"); } } #[cfg(test)] mod gb18030_tests { + extern crate test; use super::GB18030Encoding; + use testutils; use types::*; #[test] @@ -555,5 +238,261 @@ mod gb18030_tests { assert_feed_ok!(d, [0x98, 0x35, 0xee, 0x37], [], "\U0002a6a5"); 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(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) + } + + #[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(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) + } +} + +/** + * 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_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(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) + } + + #[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(|| test::black_box({ + Encoding.decode(s.as_slice(), DecodeStrict) + })) + } } 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/tradchinese.rs b/src/encoding/codec/tradchinese.rs index 68d4759..fa7d756 100644 --- a/src/encoding/codec/tradchinese.rs +++ b/src/encoding/codec/tradchinese.rs @@ -1,11 +1,11 @@ // 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. -use util::{as_char, StrCharIndex}; -use index = index::big5; +use util::StrCharIndex; +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 { @@ -73,111 +73,56 @@ impl Encoder for BigFive2003Encoder { } } -/// A decoder for Big5-2003 with HKSCS-2008 extension. -#[deriving(Clone)] -pub struct BigFive2003HKSCS2008Decoder { - lead: u8 -} +ascii_compatible_stateful_decoder! { + #[doc="A decoder for Big5-2003 with HKSCS-2008 extension."] + #[deriving(Clone)] + struct BigFive2003HKSCS2008Decoder; -impl BigFive2003HKSCS2008Decoder { - pub fn new() -> Box { box BigFive2003HKSCS2008Decoder { lead: 0 } as Box } -} + module bigfive2003; -impl Decoder for BigFive2003HKSCS2008Decoder { - fn from_self(&self) -> Box { BigFive2003HKSCS2008Decoder::new() } - fn is_ascii_compatible(&self) -> bool { true } + internal pub fn map_two_bytes(lead: u8, trail: u8) -> u32 { + use index; - 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 - } - - let mut i = 0; - let mut processed = 0; - let len = input.len(); - - 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)); } + 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::big5::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,25 @@ mod bigfive2003_tests { assert_feed_ok!(d, [0xa4, 0x40], [], "\u4e00"); 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(|| test::black_box({ + Encoding.encode(s.as_slice(), EncodeStrict) + })) + } + + #[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(|| 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 33db969..877d97e 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::*; /** @@ -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] = cast::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) } @@ -121,22 +119,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() } @@ -146,32 +150,35 @@ 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; - 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 +188,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 +212,43 @@ 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; + + 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() { + Some(&ch) if ch < 0x80 => {} + Some(&ch) => { + state = next_state!(INITIAL_STATE, ch); + break; + } + None => { return_as_whole!(); } + } + } + + for &ch in iter { + state = next_state!(state, ch); + if is_reject_state!(state) { return None; } + } + if state != ACCEPT_STATE { return None; } + return_as_whole!(); +} + #[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::*; #[test] @@ -581,5 +619,219 @@ mod tests { assert_feed_ok!(d, [0xc2, 0x80], [], "\x80"); 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, from_utf8}; + 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(|| test::black_box({ + Encoding.encode(s, EncodeStrict) + })) + } + + #[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(|| 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(|| 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(|| 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(|| test::black_box({ + 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, from_utf8}; + 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(|| test::black_box({ + Encoding.encode(s, EncodeStrict) + })) + } + + #[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(|| 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(|| 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(|| 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(|| test::black_box({ + str::from_utf8_lossy(s) + })) + } + } + + mod bench_lossy_invalid { + extern crate test; + use super::super::{UTF8Encoding, from_utf8}; + 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(|| 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(|| test::black_box({ + str::from_utf8_lossy(s) + })) + } + } + + mod bench_lossy_external { + extern crate test; + use super::super::{UTF8Encoding, from_utf8}; + 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(|| 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(|| test::black_box({ + str::from_utf8_lossy(s.as_slice()) + })) + } + } } 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/examples/UTF-8-test.txt b/src/encoding/examples/UTF-8-test.txt new file mode 100644 index 0000000..abd16f7 Binary files /dev/null and b/src/encoding/examples/UTF-8-test.txt differ 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/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 6478512..c0619b0 100644 --- a/src/encoding/index/gb18030.rs +++ b/src/encoding/index/gb18030.rs @@ -6,100 +6,4972 @@ // 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) { - 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_tests!( + dups = [ + 6555, + ] +) diff --git a/src/encoding/index/gb18030_ranges.rs b/src/encoding/index/gb18030_ranges.rs new file mode 100644 index 0000000..cd51e7d --- /dev/null +++ b/src/encoding/index/gb18030_ranges.rs @@ -0,0 +1,85 @@ +// 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)] +multi_byte_range_tests!( + key = 0 .. 189000, key < 1114112, + value = 128 .. 65536, value < 1587600 +) 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..e5ecf59 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 @@ -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,29 +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, '}' + 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, '#[cfg(test)]' - print >>f, 'mod tests {' - print >>f, ' use super::{forward, backward};' + print >>f, "static BACKWARD_TABLE_UPPER: &'static [u16] = &[" + write_comma_separated(f, ' ', ['%d, ' % v for v in upper]) + print >>f, '];' 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, '#[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 = {} @@ -103,28 +125,36 @@ 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 + # 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 = 8835 + + 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+1): + 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 with open('%s.rs' % name.replace('-', '_'), 'wb') as f: print >>f, '// AUTOGENERATED FROM index-%s.txt, ORIGINAL COMMENT FOLLOWS:' % name print >>f, '//' @@ -165,12 +195,17 @@ 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] = &[" 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,25 +213,33 @@ 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};' - 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, ' }' - print >>f, '}' + print >>f, 'multi_byte_tests!(' + if remap: + 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, ' dups = []' + 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): @@ -214,6 +257,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, '//' @@ -232,7 +282,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) @@ -255,30 +305,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, key < %d,' % (minkey, maxkey, keyubound) + print >>f, ' value = %d .. %d, value < %d' % (minvalue, maxvalue, valueubound) + print >>f, ')' return 8 * len(data) @@ -313,11 +343,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/index/ibm866.rs b/src/encoding/index/ibm866.rs index 0d6b9eb..dc29515 100644 --- a/src/encoding/index/ibm866.rs +++ b/src/encoding/index/ibm866.rs @@ -25,47 +25,52 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_10.rs b/src/encoding/index/iso_8859_10.rs index c086b5d..441db49 100644 --- a/src/encoding/index/iso_8859_10.rs +++ b/src/encoding/index/iso_8859_10.rs @@ -23,43 +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, 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_13.rs b/src/encoding/index/iso_8859_13.rs index edd1517..ba5597a 100644 --- a/src/encoding/index/iso_8859_13.rs +++ b/src/encoding/index/iso_8859_13.rs @@ -23,43 +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, 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_14.rs b/src/encoding/index/iso_8859_14.rs index 7a9fbc5..2069f8a 100644 --- a/src/encoding/index/iso_8859_14.rs +++ b/src/encoding/index/iso_8859_14.rs @@ -23,44 +23,50 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_15.rs b/src/encoding/index/iso_8859_15.rs index dea50ec..15fe1cf 100644 --- a/src/encoding/index/iso_8859_15.rs +++ b/src/encoding/index/iso_8859_15.rs @@ -23,43 +23,41 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_16.rs b/src/encoding/index/iso_8859_16.rs index 9c689e9..1a8a040 100644 --- a/src/encoding/index/iso_8859_16.rs +++ b/src/encoding/index/iso_8859_16.rs @@ -23,43 +23,47 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_2.rs b/src/encoding/index/iso_8859_2.rs index a07f795..ddb844f 100644 --- a/src/encoding/index/iso_8859_2.rs +++ b/src/encoding/index/iso_8859_2.rs @@ -23,43 +23,37 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_3.rs b/src/encoding/index/iso_8859_3.rs index 962e32a..46fe5ef 100644 --- a/src/encoding/index/iso_8859_3.rs +++ b/src/encoding/index/iso_8859_3.rs @@ -23,42 +23,35 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_4.rs b/src/encoding/index/iso_8859_4.rs index 8eafce7..f18f35e 100644 --- a/src/encoding/index/iso_8859_4.rs +++ b/src/encoding/index/iso_8859_4.rs @@ -23,43 +23,37 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_5.rs b/src/encoding/index/iso_8859_5.rs index 57ba54c..dce3c9a 100644 --- a/src/encoding/index/iso_8859_5.rs +++ b/src/encoding/index/iso_8859_5.rs @@ -25,46 +25,41 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_6.rs b/src/encoding/index/iso_8859_6.rs index 2b00c6c..766a5b5 100644 --- a/src/encoding/index/iso_8859_6.rs +++ b/src/encoding/index/iso_8859_6.rs @@ -25,37 +25,31 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_7.rs b/src/encoding/index/iso_8859_7.rs index c54bb00..e7396d8 100644 --- a/src/encoding/index/iso_8859_7.rs +++ b/src/encoding/index/iso_8859_7.rs @@ -23,43 +23,44 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/iso_8859_8.rs b/src/encoding/index/iso_8859_8.rs index 40ee436..227f685 100644 --- a/src/encoding/index/iso_8859_8.rs +++ b/src/encoding/index/iso_8859_8.rs @@ -25,38 +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, 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/jis0208.rs b/src/encoding/index/jis0208.rs index bee731d..0ddb874 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,414 +3307,59 @@ pub fn backward(code: u32) -> u16 { 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 == 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); } - } +#[inline] +pub fn backward_remapped(code: u32) -> u16 { + let value = backward(code); + if 8272 <= value && value <= 8835 { + BACKWARD_TABLE_REMAPPED[(value - 8272) as uint] + } else { + value } } + +#[cfg(test)] +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..c11a611 100644 --- a/src/encoding/index/koi8_r.rs +++ b/src/encoding/index/koi8_r.rs @@ -25,47 +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, 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/koi8_u.rs b/src/encoding/index/koi8_u.rs index 9c0c12f..1fdfab8 100644 --- a/src/encoding/index/koi8_u.rs +++ b/src/encoding/index/koi8_u.rs @@ -25,47 +25,57 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/macintosh.rs b/src/encoding/index/macintosh.rs index 338f1c6..9fc975c 100644 --- a/src/encoding/index/macintosh.rs +++ b/src/encoding/index/macintosh.rs @@ -24,45 +24,109 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1250.rs b/src/encoding/index/windows_1250.rs index 4d1997a..6b8760e 100644 --- a/src/encoding/index/windows_1250.rs +++ b/src/encoding/index/windows_1250.rs @@ -23,44 +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, 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1251.rs b/src/encoding/index/windows_1251.rs index bacad39..5bde628 100644 --- a/src/encoding/index/windows_1251.rs +++ b/src/encoding/index/windows_1251.rs @@ -25,47 +25,48 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1252.rs b/src/encoding/index/windows_1252.rs index 1810aab..0edb788 100644 --- a/src/encoding/index/windows_1252.rs +++ b/src/encoding/index/windows_1252.rs @@ -23,44 +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, 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1253.rs b/src/encoding/index/windows_1253.rs index 38d3e3b..a0df372 100644 --- a/src/encoding/index/windows_1253.rs +++ b/src/encoding/index/windows_1253.rs @@ -23,44 +23,47 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1254.rs b/src/encoding/index/windows_1254.rs index 2b8e6d6..5960892 100644 --- a/src/encoding/index/windows_1254.rs +++ b/src/encoding/index/windows_1254.rs @@ -23,44 +23,52 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1255.rs b/src/encoding/index/windows_1255.rs index 4f6fb90..6f1c4dc 100644 --- a/src/encoding/index/windows_1255.rs +++ b/src/encoding/index/windows_1255.rs @@ -24,44 +24,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, - 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1256.rs b/src/encoding/index/windows_1256.rs index eb4ecc8..8fda016 100644 --- a/src/encoding/index/windows_1256.rs +++ b/src/encoding/index/windows_1256.rs @@ -24,46 +24,57 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1257.rs b/src/encoding/index/windows_1257.rs index a0f5fc5..8a4edcc 100644 --- a/src/encoding/index/windows_1257.rs +++ b/src/encoding/index/windows_1257.rs @@ -23,44 +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, 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_1258.rs b/src/encoding/index/windows_1258.rs index fcd3a73..b03e6df 100644 --- a/src/encoding/index/windows_1258.rs +++ b/src/encoding/index/windows_1258.rs @@ -23,44 +23,56 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/windows_874.rs b/src/encoding/index/windows_874.rs index 2661765..d8dc1d7 100644 --- a/src/encoding/index/windows_874.rs +++ b/src/encoding/index/windows_874.rs @@ -25,45 +25,43 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/index/x_mac_cyrillic.rs b/src/encoding/index/x_mac_cyrillic.rs index 16104b8..8e58740 100644 --- a/src/encoding/index/x_mac_cyrillic.rs +++ b/src/encoding/index/x_mac_cyrillic.rs @@ -25,47 +25,55 @@ 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, +]; -#[cfg(test)] -mod tests { - use super::{forward, backward}; +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, +]; - #[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); } - } - } +#[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)] +single_byte_tests!() diff --git a/src/encoding/label.rs b/src/encoding/label.rs index d560cb2..3c1ecd6 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. @@ -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,23 +213,20 @@ 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" | + "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" => - Some(all::HZ_GB_2312 as EncodingRef), - */ + Some(all::HZ as EncodingRef), "big5" | "big5-hkscs" | "cn-big5" | @@ -239,11 +237,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" | @@ -282,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), @@ -299,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), @@ -310,17 +307,12 @@ 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), - 936 => Some(all::GBK18030 as EncodingRef), - 54936 => Some(all::GB18030 as EncodingRef), - /* - 52936 => Some(all::HZ_GB_2312 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), 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), @@ -348,9 +340,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") + })) } } diff --git a/src/encoding/lib.rs b/src/encoding/lib.rs index d65cacb..ffaffb4 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("Acme\ufffd".to_string())); +assert_eq!(ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), + Ok("Acme".to_string())); +~~~~ + +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 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 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`: + +* `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"). + 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. + +**`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"] @@ -17,6 +180,10 @@ #![feature(globs, macro_rules)] +#![allow(experimental)] + +#[cfg(test)] extern crate test; + pub use self::types::{CodecError, ByteWriter, StringWriter, Encoder, Decoder, EncodingRef, Encoding, EncoderTrapFunc, DecoderTrapFunc, DecoderTrap, @@ -30,6 +197,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; @@ -60,13 +228,14 @@ 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; } /// Codec implementations. +#[unstable] pub mod codec { pub mod error; pub mod ascii; @@ -87,58 +256,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(StrBuf::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"))); - assert_eq!(all::ISO_8859_6.decode([65,99,109,101,169], DecodeIgnore), - Ok(StrBuf::from_str("Acme"))); - } - - #[test] - fn test_readme_hex_ncr_escape() { - // hexadecimal numeric character reference replacement - fn hex_ncr_escape(_encoder: &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(); - output.write_bytes(escapes.as_bytes()); - true - } - static HexNcrEscape: EncoderTrap = EncoderTrap(hex_ncr_escape); - let orig = "Hello, 世界!".to_owned(); - let encoded = all::ASCII.encode(orig, HexNcrEscape).unwrap(); - let decoded = all::ASCII.decode(encoded.as_slice(), DecodeStrict).unwrap(); - assert_eq!(decoded, StrBuf::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(StrBuf::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"))); - } - - #[test] fn test_decode() { fn test_one(input: &[u8], expected_result: &str, expected_encoding: &str) { diff --git a/src/encoding/testutils.rs b/src/encoding/testutils.rs index 84dabba..017143c 100644 --- a/src/encoding/testutils.rs +++ b/src/encoding/testutils.rs @@ -1,8 +1,8 @@ // 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 for testing. +//! Macros and utilities for testing. #![macro_escape] @@ -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,294 @@ 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()); }) ) +/// 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. +// 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位以内に入る人数である。"; + +/// 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 = + "漢語,又稱中文、華語(東南亞)、國語(中華民國國語)、中國語(日本、韓國等),\ + 其他名稱有漢文(通常指文言文)、華文、唐文、唐話、中國話等,是屬漢藏語系的分析語,具有聲調。\ + 漢語的文字系統——漢字是一種意音文字,表意的同時也具一定的表音功能。\ + 漢語包含書面語以及口語兩部分,古代書面漢語稱為文言文,現代書面漢語一般指使用現代標準漢語語法,\ + 詞彙的中文通行文體。目前全球有六分之一人口使用漢語作為母語。現代漢語書面語高度統一,\ + 口語則有官話、粵語、吳語、湘語、贛語、客家語、閩語等七種主要漢語言\ + (也有人認為晉語和(或)徽語和(或)平話(廣西平話)也應為獨立漢語言,\ + 也有其他人認為閩語其實是一個語族,下轄閩南語、閩東語、閩中語以及莆仙語,\ + 國際標準化組織即持此觀點,部分資料將其中的一至六種也算成單獨的漢語言,\ + 這就是八至十三種漢語言的由來)。"; + +/// 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) + } + } +} + +/// Makes a common test suite for single-byte indices. +macro_rules! single_byte_tests( + () => ( + mod tests { + use super::{forward, backward}; + use test; + + #[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 as u32), 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)); + } + start += 0x80; + }) + } + } + ); +) + +/// Makes a common test suite for multi-byte indices. +macro_rules! multi_byte_tests( + (make shared tests and benches 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); } + } + } + + #[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; } + }) + } + ); + + ( + dups = $dups:expr + ) => ( + mod tests { + use super::{forward, backward}; + use test; + + multi_byte_tests!(make shared tests and benches with dups = $dups) + } + ); + + ( + remap = $remap_min:expr .. $remap_max:expr, + dups = $dups:expr + ) => ( + mod tests { + use super::{forward, backward, backward_remapped}; + use test; + + multi_byte_tests!(make shared tests and benches 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); + } + } + } + + #[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; } + }) + } + } + ); +) + +/// Makes a common test suite for multi-byte range indices. +macro_rules! multi_byte_range_tests( + ( + 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() { + 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); + } + } + + #[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; } + }) + } + } + ); +) + diff --git a/src/encoding/types.rs b/src/encoding/types.rs index d4e98ab..bd8efaa 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. /*! @@ -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`, @@ -113,7 +116,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); @@ -130,6 +133,7 @@ impl StringWriter for StrBuf { /// 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; @@ -177,11 +181,12 @@ 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) -> String { a.to_string().append(b) } } /// 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; @@ -213,16 +218,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) } @@ -239,33 +244,40 @@ 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; - let mut unprocessed = StrBuf::new(); + let mut unprocessed = String::new(); let mut ret = Vec::new(); loop { @@ -302,11 +314,12 @@ 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 { + #[stable] + 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); @@ -340,14 +353,17 @@ pub trait Encoding { } /// A type of the bare function in `EncoderTrap` values. +#[unstable] 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. +#[unstable] 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. +#[stable] pub enum DecoderTrap { /// Immediately fails on errors. /// Corresponds to WHATWG "fatal" error algorithm. @@ -360,13 +376,13 @@ 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 { /// 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 }, @@ -376,6 +392,7 @@ impl DecoderTrap { } } +#[stable] pub enum EncoderTrap { /// Immediately fails on errors. /// Corresponds to WHATWG "fatal" error algorithm. @@ -393,21 +410,20 @@ 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 { /// 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); } } @@ -419,8 +435,10 @@ impl EncoderTrap { EncodeReplace => reencode(encoder, "?", output, "Replace"), EncodeIgnore => true, EncodeNcrEscape => { - let mut escapes = StrBuf::new(); - for ch in input.chars() { escapes.push_str(format!("&\\#{:d};", ch as int)); } + let mut escapes = String::new(); + 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), @@ -428,12 +446,12 @@ 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) { + -> (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) @@ -445,3 +463,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); + } +} diff --git a/src/encoding/util.rs b/src/encoding/util.rs index b326a46..a64eaa4 100644 --- a/src/encoding/util.rs +++ b/src/encoding/util.rs @@ -1,15 +1,18 @@ // 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. -use std::str::CharRange; -use std::cast::transmute; +#![macro_escape] + +use std::{str, mem}; +use std::default::Default; +use types; /// Unchecked conversion to `char`. pub fn as_char(ch: T) -> char { - unsafe { 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. @@ -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,285 @@ impl<'r> StrCharIndex<'r> for &'r str { StrCharIndexIterator { index: 0, string: *self } } } + +/// A helper struct for the stateful decoder DSL. +pub struct StatefulDecoderHelper<'a, St> { + /// 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, + /// The last codec error. The caller will later collect this. + pub err: Option, +} + +impl<'a, St:Default> StatefulDecoderHelper<'a, St> { + /// 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 + } + } + + /// Resets back to the initial state. + /// This should be the last expr in the rules. + #[inline(always)] + pub fn reset(&self) -> St { + Default::default() + } + + /// 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) -> St { + self.output.write_char(unsafe {mem::transmute(c)}); + Default::default() + } + + /// 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 { + self.output.write_str(s); + 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(&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(&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() }); + Default::default() + } +} + +/// 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),+; + } + $(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),+; + })* + ) => ( + $(#[$decmeta])* + pub struct $dec { + st: $stmod::State + } + + mod $stmod { + #[deriving(Eq,Clone)] + pub enum State { + $inist, + $( + $ckst(() $(, $ckty)*), + )* + $( + $st(() $(, $ty)*), + )* + } + + impl ::std::default::Default for State { + #[inline(always)] fn default() -> State { $inist } + } + + pub mod internal { + pub type Context<'a> = ::util::StatefulDecoderHelper<'a, super::State>; + + $($item)* + } + + pub mod start { + use super::internal::*; + + #[inline(always)] + 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() { + None => super::$inist, + Some(c) => match c { $($($inilhs)|+ => { $($inirhs);+ })+ }, + } + } + + $( + #[inline(always)] + 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() { + None => super::$ckst(() $(, $ckarg)*), + Some(c) => match c { $($($cklhs)|+ => { $($ckrhs);+ })+ }, + } + } + )* + } + + pub mod transient { + use super::internal::*; + + #[inline(always)] + #[allow(dead_code)] + pub fn $inist(_: &mut Context) -> super::State { + super::$inist // do not recurse further + } + + $( + #[inline(always)] + #[allow(dead_code)] + pub fn $ckst(_: &mut Context $(, $ckarg: $ckty)*) -> super::State { + super::$ckst(() $(, $ckarg)*) // do not recurse further + } + )* + + $( + #[inline(always)] + pub fn $st($ctx: &mut Context $(, $arg: $ty)*) -> super::State { + match $inictx.read() { + None => 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, err: None + }; + let mut processed = 0; + let mut st = self.st; + + let st_ = match st { + $stmod::$inist => $stmod::$inist, + $( + $stmod::$ckst(() $(, $ckarg)*) => start::$ckst(&mut ctx $(, $ckarg)*), + )* + $( + $stmod::$st(() $(, $arg)*) => transient::$st(&mut ctx $(, $arg)*), + )* + }; + 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_ = match st { + $stmod::$inist => start::$inist(&mut ctx), + $( + $stmod::$ckst(() $(, $ckarg)*) => start::$ckst(&mut ctx $(, $ckarg)*), + )* + _ => unreachable!(), + }; + 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)); } + } + } + + self.st = st; + (processed, None) + } + + fn raw_finish(&mut self, output: &mut StringWriter) -> Option { + #![allow(unused_mut, unused_variable)] + 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() + } + } + ) +) + +/// 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(); + } + $(state $st($ctx $(, $arg: $ty)*) { + $(case $($lhs)|+ => $($rhs),+;)+ + final => $ctx.err("incomplete sequence"); + })* + ) + ) +) +